vemora 0.1.0-alpha.15

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 (254) hide show
  1. package/README.md +851 -0
  2. package/dist/cli.d.ts +16 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +682 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/ask.d.ts +14 -0
  7. package/dist/commands/ask.d.ts.map +1 -0
  8. package/dist/commands/ask.js +137 -0
  9. package/dist/commands/ask.js.map +1 -0
  10. package/dist/commands/audit.d.ts +17 -0
  11. package/dist/commands/audit.d.ts.map +1 -0
  12. package/dist/commands/audit.js +398 -0
  13. package/dist/commands/audit.js.map +1 -0
  14. package/dist/commands/brief.d.ts +16 -0
  15. package/dist/commands/brief.d.ts.map +1 -0
  16. package/dist/commands/brief.js +84 -0
  17. package/dist/commands/brief.js.map +1 -0
  18. package/dist/commands/chat.d.ts +7 -0
  19. package/dist/commands/chat.d.ts.map +1 -0
  20. package/dist/commands/chat.js +155 -0
  21. package/dist/commands/chat.js.map +1 -0
  22. package/dist/commands/context.d.ts +63 -0
  23. package/dist/commands/context.d.ts.map +1 -0
  24. package/dist/commands/context.js +794 -0
  25. package/dist/commands/context.js.map +1 -0
  26. package/dist/commands/dead-code.d.ts +15 -0
  27. package/dist/commands/dead-code.d.ts.map +1 -0
  28. package/dist/commands/dead-code.js +206 -0
  29. package/dist/commands/dead-code.js.map +1 -0
  30. package/dist/commands/deps.d.ts +20 -0
  31. package/dist/commands/deps.d.ts.map +1 -0
  32. package/dist/commands/deps.js +138 -0
  33. package/dist/commands/deps.js.map +1 -0
  34. package/dist/commands/focus.d.ts +8 -0
  35. package/dist/commands/focus.d.ts.map +1 -0
  36. package/dist/commands/focus.js +310 -0
  37. package/dist/commands/focus.js.map +1 -0
  38. package/dist/commands/index.d.ts +10 -0
  39. package/dist/commands/index.d.ts.map +1 -0
  40. package/dist/commands/index.js +366 -0
  41. package/dist/commands/index.js.map +1 -0
  42. package/dist/commands/init-agent.d.ts +23 -0
  43. package/dist/commands/init-agent.d.ts.map +1 -0
  44. package/dist/commands/init-agent.js +384 -0
  45. package/dist/commands/init-agent.js.map +1 -0
  46. package/dist/commands/init.d.ts +2 -0
  47. package/dist/commands/init.d.ts.map +1 -0
  48. package/dist/commands/init.js +122 -0
  49. package/dist/commands/init.js.map +1 -0
  50. package/dist/commands/knowledge.d.ts +14 -0
  51. package/dist/commands/knowledge.d.ts.map +1 -0
  52. package/dist/commands/knowledge.js +115 -0
  53. package/dist/commands/knowledge.js.map +1 -0
  54. package/dist/commands/plan.d.ts +24 -0
  55. package/dist/commands/plan.d.ts.map +1 -0
  56. package/dist/commands/plan.js +867 -0
  57. package/dist/commands/plan.js.map +1 -0
  58. package/dist/commands/query.d.ts +39 -0
  59. package/dist/commands/query.d.ts.map +1 -0
  60. package/dist/commands/query.js +392 -0
  61. package/dist/commands/query.js.map +1 -0
  62. package/dist/commands/remember.d.ts +11 -0
  63. package/dist/commands/remember.d.ts.map +1 -0
  64. package/dist/commands/remember.js +267 -0
  65. package/dist/commands/remember.js.map +1 -0
  66. package/dist/commands/report.d.ts +10 -0
  67. package/dist/commands/report.d.ts.map +1 -0
  68. package/dist/commands/report.js +243 -0
  69. package/dist/commands/report.js.map +1 -0
  70. package/dist/commands/status.d.ts +2 -0
  71. package/dist/commands/status.d.ts.map +1 -0
  72. package/dist/commands/status.js +127 -0
  73. package/dist/commands/status.js.map +1 -0
  74. package/dist/commands/summarize.d.ts +14 -0
  75. package/dist/commands/summarize.d.ts.map +1 -0
  76. package/dist/commands/summarize.js +170 -0
  77. package/dist/commands/summarize.js.map +1 -0
  78. package/dist/commands/triage.d.ts +33 -0
  79. package/dist/commands/triage.d.ts.map +1 -0
  80. package/dist/commands/triage.js +419 -0
  81. package/dist/commands/triage.js.map +1 -0
  82. package/dist/commands/usages.d.ts +14 -0
  83. package/dist/commands/usages.d.ts.map +1 -0
  84. package/dist/commands/usages.js +236 -0
  85. package/dist/commands/usages.js.map +1 -0
  86. package/dist/core/config.d.ts +35 -0
  87. package/dist/core/config.d.ts.map +1 -0
  88. package/dist/core/config.js +159 -0
  89. package/dist/core/config.js.map +1 -0
  90. package/dist/core/types.d.ts +287 -0
  91. package/dist/core/types.d.ts.map +1 -0
  92. package/dist/core/types.js +4 -0
  93. package/dist/core/types.js.map +1 -0
  94. package/dist/embeddings/factory.d.ts +9 -0
  95. package/dist/embeddings/factory.d.ts.map +1 -0
  96. package/dist/embeddings/factory.js +26 -0
  97. package/dist/embeddings/factory.js.map +1 -0
  98. package/dist/embeddings/noop.d.ts +17 -0
  99. package/dist/embeddings/noop.d.ts.map +1 -0
  100. package/dist/embeddings/noop.js +22 -0
  101. package/dist/embeddings/noop.js.map +1 -0
  102. package/dist/embeddings/ollama.d.ts +11 -0
  103. package/dist/embeddings/ollama.d.ts.map +1 -0
  104. package/dist/embeddings/ollama.js +49 -0
  105. package/dist/embeddings/ollama.js.map +1 -0
  106. package/dist/embeddings/openai.d.ts +10 -0
  107. package/dist/embeddings/openai.d.ts.map +1 -0
  108. package/dist/embeddings/openai.js +67 -0
  109. package/dist/embeddings/openai.js.map +1 -0
  110. package/dist/embeddings/provider.d.ts +19 -0
  111. package/dist/embeddings/provider.d.ts.map +1 -0
  112. package/dist/embeddings/provider.js +3 -0
  113. package/dist/embeddings/provider.js.map +1 -0
  114. package/dist/indexer/callgraph.d.ts +16 -0
  115. package/dist/indexer/callgraph.d.ts.map +1 -0
  116. package/dist/indexer/callgraph.js +154 -0
  117. package/dist/indexer/callgraph.js.map +1 -0
  118. package/dist/indexer/chunkBySlidingWindow.d.ts +6 -0
  119. package/dist/indexer/chunkBySlidingWindow.d.ts.map +1 -0
  120. package/dist/indexer/chunkBySlidingWindow.js +30 -0
  121. package/dist/indexer/chunkBySlidingWindow.js.map +1 -0
  122. package/dist/indexer/chunkBySymbols.d.ts +7 -0
  123. package/dist/indexer/chunkBySymbols.d.ts.map +1 -0
  124. package/dist/indexer/chunkBySymbols.js +57 -0
  125. package/dist/indexer/chunkBySymbols.js.map +1 -0
  126. package/dist/indexer/chunker.d.ts +15 -0
  127. package/dist/indexer/chunker.d.ts.map +1 -0
  128. package/dist/indexer/chunker.js +26 -0
  129. package/dist/indexer/chunker.js.map +1 -0
  130. package/dist/indexer/classHeader.d.ts +7 -0
  131. package/dist/indexer/classHeader.d.ts.map +1 -0
  132. package/dist/indexer/classHeader.js +37 -0
  133. package/dist/indexer/classHeader.js.map +1 -0
  134. package/dist/indexer/deps.d.ts +66 -0
  135. package/dist/indexer/deps.d.ts.map +1 -0
  136. package/dist/indexer/deps.js +412 -0
  137. package/dist/indexer/deps.js.map +1 -0
  138. package/dist/indexer/hasher.d.ts +17 -0
  139. package/dist/indexer/hasher.d.ts.map +1 -0
  140. package/dist/indexer/hasher.js +38 -0
  141. package/dist/indexer/hasher.js.map +1 -0
  142. package/dist/indexer/parser.d.ts +18 -0
  143. package/dist/indexer/parser.d.ts.map +1 -0
  144. package/dist/indexer/parser.js +355 -0
  145. package/dist/indexer/parser.js.map +1 -0
  146. package/dist/indexer/scanner.d.ts +18 -0
  147. package/dist/indexer/scanner.d.ts.map +1 -0
  148. package/dist/indexer/scanner.js +37 -0
  149. package/dist/indexer/scanner.js.map +1 -0
  150. package/dist/indexer/strategy.d.ts +11 -0
  151. package/dist/indexer/strategy.d.ts.map +1 -0
  152. package/dist/indexer/strategy.js +15 -0
  153. package/dist/indexer/strategy.js.map +1 -0
  154. package/dist/indexer/tests.d.ts +15 -0
  155. package/dist/indexer/tests.d.ts.map +1 -0
  156. package/dist/indexer/tests.js +68 -0
  157. package/dist/indexer/tests.js.map +1 -0
  158. package/dist/indexer/todos.d.ts +9 -0
  159. package/dist/indexer/todos.d.ts.map +1 -0
  160. package/dist/indexer/todos.js +29 -0
  161. package/dist/indexer/todos.js.map +1 -0
  162. package/dist/llm/anthropic.d.ts +8 -0
  163. package/dist/llm/anthropic.d.ts.map +1 -0
  164. package/dist/llm/anthropic.js +76 -0
  165. package/dist/llm/anthropic.js.map +1 -0
  166. package/dist/llm/claude-code.d.ts +37 -0
  167. package/dist/llm/claude-code.d.ts.map +1 -0
  168. package/dist/llm/claude-code.js +97 -0
  169. package/dist/llm/claude-code.js.map +1 -0
  170. package/dist/llm/factory.d.ts +7 -0
  171. package/dist/llm/factory.d.ts.map +1 -0
  172. package/dist/llm/factory.js +47 -0
  173. package/dist/llm/factory.js.map +1 -0
  174. package/dist/llm/ollama.d.ts +8 -0
  175. package/dist/llm/ollama.d.ts.map +1 -0
  176. package/dist/llm/ollama.js +83 -0
  177. package/dist/llm/ollama.js.map +1 -0
  178. package/dist/llm/openai.d.ts +8 -0
  179. package/dist/llm/openai.d.ts.map +1 -0
  180. package/dist/llm/openai.js +68 -0
  181. package/dist/llm/openai.js.map +1 -0
  182. package/dist/llm/provider.d.ts +35 -0
  183. package/dist/llm/provider.d.ts.map +1 -0
  184. package/dist/llm/provider.js +3 -0
  185. package/dist/llm/provider.js.map +1 -0
  186. package/dist/search/bm25.d.ts +3 -0
  187. package/dist/search/bm25.d.ts.map +1 -0
  188. package/dist/search/bm25.js +104 -0
  189. package/dist/search/bm25.js.map +1 -0
  190. package/dist/search/formatter.d.ts +43 -0
  191. package/dist/search/formatter.d.ts.map +1 -0
  192. package/dist/search/formatter.js +208 -0
  193. package/dist/search/formatter.js.map +1 -0
  194. package/dist/search/hybrid.d.ts +10 -0
  195. package/dist/search/hybrid.d.ts.map +1 -0
  196. package/dist/search/hybrid.js +53 -0
  197. package/dist/search/hybrid.js.map +1 -0
  198. package/dist/search/merge.d.ts +33 -0
  199. package/dist/search/merge.d.ts.map +1 -0
  200. package/dist/search/merge.js +158 -0
  201. package/dist/search/merge.js.map +1 -0
  202. package/dist/search/mmr.d.ts +23 -0
  203. package/dist/search/mmr.d.ts.map +1 -0
  204. package/dist/search/mmr.js +95 -0
  205. package/dist/search/mmr.js.map +1 -0
  206. package/dist/search/rerank.d.ts +12 -0
  207. package/dist/search/rerank.d.ts.map +1 -0
  208. package/dist/search/rerank.js +113 -0
  209. package/dist/search/rerank.js.map +1 -0
  210. package/dist/search/signature.d.ts +42 -0
  211. package/dist/search/signature.d.ts.map +1 -0
  212. package/dist/search/signature.js +112 -0
  213. package/dist/search/signature.js.map +1 -0
  214. package/dist/search/vector.d.ts +41 -0
  215. package/dist/search/vector.d.ts.map +1 -0
  216. package/dist/search/vector.js +185 -0
  217. package/dist/search/vector.js.map +1 -0
  218. package/dist/storage/cache.d.ts +30 -0
  219. package/dist/storage/cache.d.ts.map +1 -0
  220. package/dist/storage/cache.js +160 -0
  221. package/dist/storage/cache.js.map +1 -0
  222. package/dist/storage/knowledge.d.ts +23 -0
  223. package/dist/storage/knowledge.d.ts.map +1 -0
  224. package/dist/storage/knowledge.js +81 -0
  225. package/dist/storage/knowledge.js.map +1 -0
  226. package/dist/storage/planSession.d.ts +39 -0
  227. package/dist/storage/planSession.d.ts.map +1 -0
  228. package/dist/storage/planSession.js +78 -0
  229. package/dist/storage/planSession.js.map +1 -0
  230. package/dist/storage/repository.d.ts +27 -0
  231. package/dist/storage/repository.d.ts.map +1 -0
  232. package/dist/storage/repository.js +95 -0
  233. package/dist/storage/repository.js.map +1 -0
  234. package/dist/storage/session.d.ts +38 -0
  235. package/dist/storage/session.d.ts.map +1 -0
  236. package/dist/storage/session.js +100 -0
  237. package/dist/storage/session.js.map +1 -0
  238. package/dist/storage/summaries.d.ts +19 -0
  239. package/dist/storage/summaries.d.ts.map +1 -0
  240. package/dist/storage/summaries.js +66 -0
  241. package/dist/storage/summaries.js.map +1 -0
  242. package/dist/storage/usage.d.ts +39 -0
  243. package/dist/storage/usage.d.ts.map +1 -0
  244. package/dist/storage/usage.js +55 -0
  245. package/dist/storage/usage.js.map +1 -0
  246. package/dist/utils/git.d.ts +20 -0
  247. package/dist/utils/git.d.ts.map +1 -0
  248. package/dist/utils/git.js +49 -0
  249. package/dist/utils/git.js.map +1 -0
  250. package/dist/utils/tokenizer.d.ts +32 -0
  251. package/dist/utils/tokenizer.d.ts.map +1 -0
  252. package/dist/utils/tokenizer.js +66 -0
  253. package/dist/utils/tokenizer.js.map +1 -0
  254. package/package.json +71 -0
@@ -0,0 +1,412 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadTsPathAliases = loadTsPathAliases;
7
+ exports.extractFileImports = extractFileImports;
8
+ exports.updateDependencyGraph = updateDependencyGraph;
9
+ exports.computeImportedBy = computeImportedBy;
10
+ exports.getTransitiveImportedBy = getTransitiveImportedBy;
11
+ exports.getTransitiveDeps = getTransitiveDeps;
12
+ exports.detectCycles = detectCycles;
13
+ exports.graphStats = graphStats;
14
+ const fs_1 = __importDefault(require("fs"));
15
+ const path_1 = __importDefault(require("path"));
16
+ /**
17
+ * Reads tsconfig.json (or tsconfig.base.json / tsconfig.node.json) from
18
+ * `rootDir` and extracts `compilerOptions.paths` as a list of alias entries.
19
+ * Returns [] if no paths are found or the file cannot be parsed.
20
+ */
21
+ function loadTsPathAliases(rootDir) {
22
+ const candidates = [
23
+ "tsconfig.json",
24
+ "tsconfig.base.json",
25
+ "tsconfig.node.json",
26
+ ];
27
+ for (const name of candidates) {
28
+ const tsConfigPath = path_1.default.join(rootDir, name);
29
+ try {
30
+ const raw = fs_1.default.readFileSync(tsConfigPath, "utf-8");
31
+ // tsconfig allows // comments — strip them before JSON.parse
32
+ const stripped = raw
33
+ .replace(/\/\/[^\n]*/g, "")
34
+ .replace(/\/\*[\s\S]*?\*\//g, "");
35
+ const config = JSON.parse(stripped);
36
+ const opts = config.compilerOptions ?? {};
37
+ const baseUrl = opts.baseUrl ?? ".";
38
+ const paths = opts.paths ?? {};
39
+ if (Object.keys(paths).length === 0)
40
+ continue;
41
+ return Object.entries(paths).map(([pattern, targets]) => ({
42
+ prefix: pattern.replace(/\*$/, ""),
43
+ targets,
44
+ baseUrl,
45
+ }));
46
+ }
47
+ catch {
48
+ // file missing or invalid — try next candidate
49
+ }
50
+ }
51
+ return [];
52
+ }
53
+ /**
54
+ * Resolves a non-relative import source against the loaded tsconfig path
55
+ * aliases. Returns a project-relative path if matched, otherwise null.
56
+ */
57
+ function resolveAlias(source, aliases, allFiles) {
58
+ for (const { prefix, targets, baseUrl } of aliases) {
59
+ if (!source.startsWith(prefix))
60
+ continue;
61
+ const rest = source.slice(prefix.length);
62
+ for (const target of targets) {
63
+ const resolved = target.replace("*", rest);
64
+ const base = path_1.default.normalize(path_1.default.join(baseUrl, resolved));
65
+ // Reject paths that escape the project root (e.g. alias targets like "../../")
66
+ if (base.startsWith(".."))
67
+ continue;
68
+ const extCandidates = ["", ".ts", ".tsx", ".js", ".jsx"];
69
+ for (const ext of extCandidates) {
70
+ const candidate = path_1.default.normalize(base + ext);
71
+ if (allFiles.has(candidate))
72
+ return candidate;
73
+ }
74
+ for (const idx of ["index.ts", "index.tsx", "index.js"]) {
75
+ const candidate = path_1.default.join(base, idx);
76
+ if (allFiles.has(candidate))
77
+ return candidate;
78
+ }
79
+ }
80
+ }
81
+ return null;
82
+ }
83
+ // ─── Supported source extensions for import analysis ─────────────────────────
84
+ const JS_TS_EXTS = new Set([
85
+ "ts",
86
+ "tsx",
87
+ "js",
88
+ "jsx",
89
+ "mts",
90
+ "cts",
91
+ "mjs",
92
+ "cjs",
93
+ ]);
94
+ // ─── Regex patterns ───────────────────────────────────────────────────────────
95
+ /**
96
+ * Matches static import statements:
97
+ * import { A, B } from './path'
98
+ * import type { A } from './path'
99
+ * import A from './path'
100
+ * import * as A from './path'
101
+ * import './path' (side-effect)
102
+ */
103
+ const STATIC_IMPORT_RE = /^\s*import\s+(?:type\s+)?(?:(?:\{([^}]*)\}|(\w+)|\*\s+as\s+\w+)\s+from\s+)?['"]([^'"]+)['"]/gm;
104
+ /**
105
+ * Matches re-export statements:
106
+ * export { A, B } from './path'
107
+ * export * from './path'
108
+ * export * as NS from './path'
109
+ * export type { A } from './path'
110
+ */
111
+ const EXPORT_FROM_RE = /^\s*export\s+(?:type\s+)?(?:\{([^}]*)\}|\*(?:\s+as\s+\w+)?)\s+from\s+['"]([^'"]+)['"]/gm;
112
+ /**
113
+ * Matches combined default + named imports:
114
+ * import Default, { A, B } from './path'
115
+ * import Default, { type A, B } from './path'
116
+ *
117
+ * STATIC_IMPORT_RE cannot handle these because after matching the default
118
+ * identifier it expects `from` but finds `, {`.
119
+ */
120
+ const COMBINED_IMPORT_RE = /^\s*import\s+(\w+)\s*,\s*\{([^}]*)\}\s+from\s+['"]([^'"]+)['"]/gm;
121
+ /**
122
+ * Matches dynamic imports and require() calls:
123
+ * import('./path')
124
+ * require('./path')
125
+ */
126
+ const DYNAMIC_RE = /(?:import|require)\s*\(\s*['"]([^'"]+)['"]\s*\)/gm;
127
+ function extractRawImports(content) {
128
+ const results = [];
129
+ // Static imports
130
+ let m;
131
+ STATIC_IMPORT_RE.lastIndex = 0;
132
+ while ((m = STATIC_IMPORT_RE.exec(content)) !== null) {
133
+ const namedGroup = m[1]; // content inside { }
134
+ const defaultName = m[2]; // default import identifier
135
+ const source = m[3];
136
+ if (!source)
137
+ continue;
138
+ const symbols = [];
139
+ if (namedGroup)
140
+ symbols.push(...parseNamedImports(namedGroup));
141
+ // Store the reserved word "default" as a sentinel for default imports.
142
+ // The local alias (defaultName) is irrelevant for symbol resolution.
143
+ if (defaultName && /^\w+$/.test(defaultName))
144
+ symbols.push("default");
145
+ results.push({ source, symbols });
146
+ }
147
+ // Re-exports
148
+ EXPORT_FROM_RE.lastIndex = 0;
149
+ while ((m = EXPORT_FROM_RE.exec(content)) !== null) {
150
+ const namedGroup = m[1];
151
+ const source = m[2];
152
+ if (!source)
153
+ continue;
154
+ const symbols = namedGroup ? parseNamedImports(namedGroup) : [];
155
+ results.push({ source, symbols });
156
+ }
157
+ // Combined: import Default, { Named } from './path'
158
+ COMBINED_IMPORT_RE.lastIndex = 0;
159
+ while ((m = COMBINED_IMPORT_RE.exec(content)) !== null) {
160
+ const source = m[3];
161
+ if (!source)
162
+ continue;
163
+ const symbols = ["default", ...parseNamedImports(m[2])];
164
+ results.push({ source, symbols });
165
+ }
166
+ // Dynamic imports / require
167
+ DYNAMIC_RE.lastIndex = 0;
168
+ while ((m = DYNAMIC_RE.exec(content)) !== null) {
169
+ const source = m[1];
170
+ if (source)
171
+ results.push({ source, symbols: [] });
172
+ }
173
+ return results;
174
+ }
175
+ /**
176
+ * Parses the content inside `{ A, B as C, type D }` → ['A', 'D']
177
+ * Returns original (pre-alias) names only.
178
+ */
179
+ function parseNamedImports(raw) {
180
+ return raw
181
+ .split(",")
182
+ .map((s) => s
183
+ .trim()
184
+ .replace(/^type\s+/, "")
185
+ .split(/\s+as\s+/)[0]
186
+ .trim())
187
+ .filter((s) => s.length > 0 && /^\w+$/.test(s));
188
+ }
189
+ // ─── Path resolution ──────────────────────────────────────────────────────────
190
+ /** Returns true for relative imports (./foo, ../bar) — i.e. intra-project */
191
+ function isRelative(source) {
192
+ return source.startsWith("./") || source.startsWith("../");
193
+ }
194
+ /**
195
+ * Resolves a relative import source to an actual file path that exists in
196
+ * the project index. Handles:
197
+ * - Missing extensions (TypeScript allows `import './foo'` → `./foo.ts`)
198
+ * - Directory imports (import './foo' → './foo/index.ts')
199
+ * - .js ↔ .ts aliasing (import './foo.js' → './foo.ts' in TS projects)
200
+ */
201
+ function resolveImport(source, importerDir, // directory of the importing file (relative to root)
202
+ allFiles) {
203
+ // Compute the base path relative to project root
204
+ const base = path_1.default.normalize(path_1.default.join(importerDir, source));
205
+ // Candidate extensions to try (in priority order)
206
+ const extCandidates = ["", ".ts", ".tsx", ".js", ".jsx", ".mts", ".cts"];
207
+ // If source already has an extension (e.g. .js in "import './foo.js'"),
208
+ // also try swapping it to .ts (common in TypeScript projects)
209
+ const sourceExt = path_1.default.extname(source);
210
+ if (sourceExt === ".js")
211
+ extCandidates.unshift(base.slice(0, -3) + ".ts");
212
+ if (sourceExt === ".mjs")
213
+ extCandidates.unshift(base.slice(0, -4) + ".mts");
214
+ for (const ext of extCandidates) {
215
+ const candidate = typeof ext === "string" && ext.startsWith("/")
216
+ ? ext // already absolute-looking resolved path
217
+ : base + ext;
218
+ const norm = path_1.default.normalize(candidate);
219
+ if (allFiles.has(norm))
220
+ return norm;
221
+ }
222
+ // Try as directory index
223
+ const indexCandidates = ["index.ts", "index.tsx", "index.js", "index.jsx"];
224
+ for (const idx of indexCandidates) {
225
+ const candidate = path_1.default.join(base, idx);
226
+ if (allFiles.has(candidate))
227
+ return candidate;
228
+ }
229
+ return null;
230
+ }
231
+ // ─── Public API ───────────────────────────────────────────────────────────────
232
+ /**
233
+ * Extracts all intra-project imports from a single file's content.
234
+ * Returns resolved ImportEntry[] (only files that exist in the index).
235
+ *
236
+ * @param relativePath - path of this file relative to project root
237
+ * @param content - file content
238
+ * @param allFiles - set of all relative paths in the project index
239
+ */
240
+ function extractFileImports(relativePath, content, allFiles, aliases = []) {
241
+ const ext = path_1.default.extname(relativePath).slice(1).toLowerCase();
242
+ if (!JS_TS_EXTS.has(ext))
243
+ return []; // only JS/TS files have parseable imports
244
+ const importerDir = path_1.default.dirname(relativePath);
245
+ const raw = extractRawImports(content);
246
+ // Deduplicate by resolved file path, merging symbols
247
+ const resolved = new Map();
248
+ for (const { source, symbols } of raw) {
249
+ let resolvedPath = null;
250
+ if (isRelative(source)) {
251
+ resolvedPath = resolveImport(source, importerDir, allFiles);
252
+ }
253
+ else if (aliases.length > 0) {
254
+ resolvedPath = resolveAlias(source, aliases, allFiles);
255
+ }
256
+ if (!resolvedPath || resolvedPath === relativePath)
257
+ continue; // skip self-imports
258
+ const existing = resolved.get(resolvedPath) ?? new Set();
259
+ for (const s of symbols)
260
+ existing.add(s);
261
+ resolved.set(resolvedPath, existing);
262
+ }
263
+ return Array.from(resolved.entries()).map(([file, syms]) => ({
264
+ file,
265
+ symbols: Array.from(syms).sort(),
266
+ }));
267
+ }
268
+ /**
269
+ * Incrementally updates the dependency graph.
270
+ *
271
+ * - Changed/new files: re-extract imports from content
272
+ * - Unchanged files: carry forward existing deps entries
273
+ * - Deleted files: remove from graph
274
+ */
275
+ function updateDependencyGraph(prevGraph, changedFiles, // relativePath → content (new/changed files)
276
+ deletedFiles, allFiles, aliases = []) {
277
+ const graph = {};
278
+ // Carry forward unchanged entries
279
+ for (const [file, deps] of Object.entries(prevGraph)) {
280
+ if (!deletedFiles.has(file) && !changedFiles.has(file)) {
281
+ graph[file] = deps;
282
+ }
283
+ }
284
+ // Re-process changed/new files
285
+ for (const [relativePath, content] of changedFiles) {
286
+ const imports = extractFileImports(relativePath, content, allFiles, aliases);
287
+ if (imports.length > 0) {
288
+ graph[relativePath] = { imports };
289
+ }
290
+ }
291
+ return graph;
292
+ }
293
+ /**
294
+ * Computes the reverse graph: for each file, which files import it.
295
+ * Derived at query time — not stored in the index.
296
+ */
297
+ function computeImportedBy(graph) {
298
+ const importedBy = new Map();
299
+ for (const [file, { imports }] of Object.entries(graph)) {
300
+ for (const imp of imports) {
301
+ const list = importedBy.get(imp.file) ?? [];
302
+ list.push(file);
303
+ importedBy.set(imp.file, list);
304
+ }
305
+ }
306
+ return importedBy;
307
+ }
308
+ /**
309
+ * Returns all files that (transitively) import `startFile`, up to `depth` hops
310
+ * in the reverse dependency graph (following importedBy edges inward).
311
+ */
312
+ function getTransitiveImportedBy(startFile, importedByMap, depth = 1) {
313
+ const visited = new Map(); // file → distance
314
+ const queue = [[startFile, 0]];
315
+ let head = 0;
316
+ while (head < queue.length) {
317
+ const [file, dist] = queue[head++];
318
+ if (dist >= depth)
319
+ continue;
320
+ for (const importer of importedByMap.get(file) ?? []) {
321
+ if (!visited.has(importer)) {
322
+ visited.set(importer, dist + 1);
323
+ queue.push([importer, dist + 1]);
324
+ }
325
+ }
326
+ }
327
+ return visited;
328
+ }
329
+ /**
330
+ * Returns all files reachable from `startFile` up to `depth` hops
331
+ * in the dependency graph (following imports outward).
332
+ */
333
+ function getTransitiveDeps(startFile, graph, depth = 1) {
334
+ const visited = new Map(); // file → distance
335
+ const queue = [[startFile, 0]];
336
+ let head = 0;
337
+ while (head < queue.length) {
338
+ const [file, dist] = queue[head++];
339
+ if (dist > depth)
340
+ break;
341
+ for (const imp of graph[file]?.imports ?? []) {
342
+ if (!visited.has(imp.file)) {
343
+ visited.set(imp.file, dist + 1);
344
+ queue.push([imp.file, dist + 1]);
345
+ }
346
+ }
347
+ }
348
+ return visited;
349
+ }
350
+ /**
351
+ * Detects circular dependencies using DFS with a recursion stack (gray-set).
352
+ * Returns up to 5 unique cycles, each as an ordered list of file paths
353
+ * (first element === last element to make the loop explicit).
354
+ */
355
+ function detectCycles(graph) {
356
+ const WHITE = 0, GRAY = 1, BLACK = 2;
357
+ const color = new Map();
358
+ const cycles = [];
359
+ function dfs(node, stack) {
360
+ color.set(node, GRAY);
361
+ stack.push(node);
362
+ for (const imp of graph[node]?.imports ?? []) {
363
+ const c = color.get(imp.file) ?? WHITE;
364
+ if (c === GRAY) {
365
+ const idx = stack.indexOf(imp.file);
366
+ if (idx !== -1)
367
+ cycles.push([...stack.slice(idx), imp.file]);
368
+ }
369
+ else if (c === WHITE) {
370
+ dfs(imp.file, stack);
371
+ }
372
+ if (cycles.length >= 5)
373
+ break; // cap early
374
+ }
375
+ stack.pop();
376
+ color.set(node, BLACK);
377
+ }
378
+ for (const file of Object.keys(graph)) {
379
+ if ((color.get(file) ?? WHITE) === WHITE)
380
+ dfs(file, []);
381
+ if (cycles.length >= 5)
382
+ break;
383
+ }
384
+ // Deduplicate: same cycle can be discovered starting from different nodes
385
+ const seen = new Set();
386
+ return cycles.filter((cycle) => {
387
+ const key = [...cycle].sort().join("|");
388
+ if (seen.has(key))
389
+ return false;
390
+ seen.add(key);
391
+ return true;
392
+ });
393
+ }
394
+ /**
395
+ * Stats about the dependency graph for display in `vemora status`.
396
+ */
397
+ function graphStats(graph) {
398
+ const importedByCount = new Map();
399
+ let totalEdges = 0;
400
+ for (const { imports } of Object.values(graph)) {
401
+ totalEdges += imports.length;
402
+ for (const imp of imports) {
403
+ importedByCount.set(imp.file, (importedByCount.get(imp.file) ?? 0) + 1);
404
+ }
405
+ }
406
+ const mostImported = Array.from(importedByCount.entries())
407
+ .sort((a, b) => b[1] - a[1])
408
+ .slice(0, 5)
409
+ .map(([file, count]) => ({ file, count }));
410
+ return { totalFiles: Object.keys(graph).length, totalEdges, mostImported };
411
+ }
412
+ //# sourceMappingURL=deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/indexer/deps.ts"],"names":[],"mappings":";;;;;AAuBA,8CAiCC;AA+ND,gDAiCC;AASD,sDAyBC;AAMD,8CAcC;AAMD,0DAsBC;AAMD,8CAsBC;AAOD,oCAuCC;AAKD,gCAqBC;AA9eD,4CAAoB;AACpB,gDAAwB;AAiBxB;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,OAAe;IAC/C,MAAM,UAAU,GAAG;QACjB,eAAe;QACf,oBAAoB;QACpB,oBAAoB;KACrB,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACnD,6DAA6D;YAC7D,MAAM,QAAQ,GAAG,GAAG;iBACjB,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;iBAC1B,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAW,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC;YAC5C,MAAM,KAAK,GAA6B,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAEzD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAE9C,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxD,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;gBAClC,OAAO;gBACP,OAAO;aACR,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;QACjD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CACnB,MAAc,EACd,OAAsB,EACtB,QAAqB;IAErB,KAAK,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,cAAI,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;YAE1D,+EAA+E;YAC/E,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,SAAS;YAEpC,MAAM,aAAa,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACzD,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;gBAChC,MAAM,SAAS,GAAG,cAAI,CAAC,SAAS,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;gBAC7C,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;oBAAE,OAAO,SAAS,CAAC;YAChD,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;gBACxD,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBACvC,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;oBAAE,OAAO,SAAS,CAAC;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC,CAAC;AAEH,iFAAiF;AAEjF;;;;;;;GAOG;AACH,MAAM,gBAAgB,GACpB,+FAA+F,CAAC;AAElG;;;;;;GAMG;AACH,MAAM,cAAc,GAClB,yFAAyF,CAAC;AAE5F;;;;;;;GAOG;AACH,MAAM,kBAAkB,GACtB,kEAAkE,CAAC;AAErE;;;;GAIG;AACH,MAAM,UAAU,GAAG,mDAAmD,CAAC;AASvE,SAAS,iBAAiB,CAAC,OAAe;IACxC,MAAM,OAAO,GAAgB,EAAE,CAAC;IAEhC,iBAAiB;IACjB,IAAI,CAAyB,CAAC;IAC9B,gBAAgB,CAAC,SAAS,GAAG,CAAC,CAAC;IAC/B,OAAO,CAAC,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACrD,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB;QAC9C,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B;QACtD,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,UAAU;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;QAC/D,uEAAuE;QACvE,qEAAqE;QACrE,IAAI,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEtE,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,aAAa;IACb,cAAc,CAAC,SAAS,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnD,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,oDAAoD;IACpD,kBAAkB,CAAC,SAAS,GAAG,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,4BAA4B;IAC5B,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC;IACzB,OAAO,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,GAAW;IACpC,OAAO,GAAG;SACP,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,CAAC;SACE,IAAI,EAAE;SACN,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SACpB,IAAI,EAAE,CACV;SACA,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,iFAAiF;AAEjF,6EAA6E;AAC7E,SAAS,UAAU,CAAC,MAAc;IAChC,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CACpB,MAAc,EACd,WAAmB,EAAE,qDAAqD;AAC1E,QAAqB;IAErB,iDAAiD;IACjD,MAAM,IAAI,GAAG,cAAI,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAE5D,kDAAkD;IAClD,MAAM,aAAa,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACzE,wEAAwE;IACxE,8DAA8D;IAC9D,MAAM,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,SAAS,KAAK,KAAK;QAAE,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1E,IAAI,SAAS,KAAK,MAAM;QAAE,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;IAE5E,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,SAAS,GACb,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;YAC5C,CAAC,CAAC,GAAG,CAAC,yCAAyC;YAC/C,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;QACjB,MAAM,IAAI,GAAG,cAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACtC,CAAC;IAED,yBAAyB;IACzB,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAC3E,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACvC,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAChD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iFAAiF;AAEjF;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAChC,YAAoB,EACpB,OAAe,EACf,QAAqB,EACrB,UAAyB,EAAE;IAE3B,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC,CAAC,0CAA0C;IAE/E,MAAM,WAAW,GAAG,cAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAEvC,qDAAqD;IACrD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEhD,KAAK,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC;QACtC,IAAI,YAAY,GAAkB,IAAI,CAAC;QACvC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,YAAY,GAAG,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,YAAY,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,YAAY,IAAI,YAAY,KAAK,YAAY;YAAE,SAAS,CAAC,oBAAoB;QAElF,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QACjE,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI;QACJ,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;KACjC,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,qBAAqB,CACnC,SAA0B,EAC1B,YAAiC,EAAE,6CAA6C;AAChF,YAAyB,EACzB,QAAqB,EACrB,UAAyB,EAAE;IAE3B,MAAM,KAAK,GAAoB,EAAE,CAAC;IAElC,kCAAkC;IAClC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,YAAY,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,kBAAkB,CAAC,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAC/B,KAAsB;IAEtB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE/C,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CACrC,SAAiB,EACjB,aAAoC,EACpC,KAAK,GAAG,CAAC;IAET,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,kBAAkB;IAC7D,MAAM,KAAK,GAA4B,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACnC,IAAI,IAAI,IAAI,KAAK;YAAE,SAAS;QAE5B,KAAK,MAAM,QAAQ,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACrD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;gBAChC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAC/B,SAAiB,EACjB,KAAsB,EACtB,KAAK,GAAG,CAAC;IAET,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,kBAAkB;IAC7D,MAAM,KAAK,GAA4B,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACnC,IAAI,IAAI,GAAG,KAAK;YAAE,MAAM;QAExB,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;gBAChC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,KAAsB;IACjD,MAAM,KAAK,GAAG,CAAC,EACb,IAAI,GAAG,CAAC,EACR,KAAK,GAAG,CAAC,CAAC;IACZ,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,SAAS,GAAG,CAAC,IAAY,EAAE,KAAe;QACxC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjB,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;YACvC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACpC,IAAI,GAAG,KAAK,CAAC,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/D,CAAC;iBAAM,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;gBACvB,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACvB,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;gBAAE,MAAM,CAAC,YAAY;QAC7C,CAAC;QAED,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK;YAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;YAAE,MAAM;IAChC,CAAC;IAED,0EAA0E;IAC1E,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,KAAsB;IAK/C,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClD,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;SACvD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Computes the SHA-256 hash of a file's content.
3
+ * Used for change detection during incremental indexing.
4
+ */
5
+ export declare function hashFile(filePath: string): string;
6
+ /**
7
+ * Same hash as hashFile but computed from already-read content.
8
+ * Use this when the file has already been read to avoid a redundant I/O call.
9
+ */
10
+ export declare function hashBuffer(content: Buffer | string): string;
11
+ /**
12
+ * Computes a short content-based hash for a chunk.
13
+ * Using content (not path+line) means embeddings are reusable across branches
14
+ * when the actual code hasn't changed, even if surrounding lines shifted.
15
+ */
16
+ export declare function hashContent(content: string): string;
17
+ //# sourceMappingURL=hasher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasher.d.ts","sourceRoot":"","sources":["../../src/indexer/hasher.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMnD"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.hashFile = hashFile;
7
+ exports.hashBuffer = hashBuffer;
8
+ exports.hashContent = hashContent;
9
+ const crypto_1 = __importDefault(require("crypto"));
10
+ const fs_1 = __importDefault(require("fs"));
11
+ /**
12
+ * Computes the SHA-256 hash of a file's content.
13
+ * Used for change detection during incremental indexing.
14
+ */
15
+ function hashFile(filePath) {
16
+ const content = fs_1.default.readFileSync(filePath);
17
+ return crypto_1.default.createHash("sha256").update(content).digest("hex");
18
+ }
19
+ /**
20
+ * Same hash as hashFile but computed from already-read content.
21
+ * Use this when the file has already been read to avoid a redundant I/O call.
22
+ */
23
+ function hashBuffer(content) {
24
+ return crypto_1.default.createHash("sha256").update(content).digest("hex");
25
+ }
26
+ /**
27
+ * Computes a short content-based hash for a chunk.
28
+ * Using content (not path+line) means embeddings are reusable across branches
29
+ * when the actual code hasn't changed, even if surrounding lines shifted.
30
+ */
31
+ function hashContent(content) {
32
+ return crypto_1.default
33
+ .createHash("sha256")
34
+ .update(content, "utf-8")
35
+ .digest("hex")
36
+ .slice(0, 16);
37
+ }
38
+ //# sourceMappingURL=hasher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasher.js","sourceRoot":"","sources":["../../src/indexer/hasher.ts"],"names":[],"mappings":";;;;;AAOA,4BAGC;AAMD,gCAEC;AAOD,kCAMC;AA/BD,oDAA4B;AAC5B,4CAAoB;AAEpB;;;GAGG;AACH,SAAgB,QAAQ,CAAC,QAAgB;IACvC,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,SAAgB,UAAU,CAAC,OAAwB;IACjD,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,SAAgB,WAAW,CAAC,OAAe;IACzC,OAAO,gBAAM;SACV,UAAU,CAAC,QAAQ,CAAC;SACpB,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;SACxB,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { SymbolIndex } from "../core/types";
2
+ export interface ParsedSymbol {
3
+ name: string;
4
+ type: "function" | "class" | "method" | "interface" | "type" | "constant" | "variable";
5
+ startLine: number;
6
+ endLine: number;
7
+ exported: boolean;
8
+ /** True when the symbol is the default export of its file */
9
+ isDefault?: boolean;
10
+ parent?: string;
11
+ }
12
+ /**
13
+ * Parses a source file and returns all top-level symbols found.
14
+ * Uses tree-sitter for TS/JS files when available; falls back to regex.
15
+ */
16
+ export declare function parseSymbols(filePath: string, content: string): ParsedSymbol[];
17
+ export declare function buildSymbolIndex(filePath: string, symbols: ParsedSymbol[]): SymbolIndex;
18
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/indexer/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAyCjD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EACA,UAAU,GACV,OAAO,GACP,QAAQ,GACR,WAAW,GACX,MAAM,GACN,UAAU,GACV,UAAU,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,YAAY,EAAE,CAehB;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,YAAY,EAAE,GACtB,WAAW,CAcb"}