seer-mcp 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 (371) hide show
  1. package/.vscode/settings.json +3 -0
  2. package/LICENSE +176 -0
  3. package/README.md +272 -0
  4. package/README_dev.md +199 -0
  5. package/dist/bundle/ci.d.ts +47 -0
  6. package/dist/bundle/ci.d.ts.map +1 -0
  7. package/dist/bundle/ci.js +113 -0
  8. package/dist/bundle/ci.js.map +1 -0
  9. package/dist/bundle/contract.d.ts +111 -0
  10. package/dist/bundle/contract.d.ts.map +1 -0
  11. package/dist/bundle/contract.js +352 -0
  12. package/dist/bundle/contract.js.map +1 -0
  13. package/dist/bundle/export.d.ts +36 -0
  14. package/dist/bundle/export.d.ts.map +1 -0
  15. package/dist/bundle/export.js +152 -0
  16. package/dist/bundle/export.js.map +1 -0
  17. package/dist/bundle/external.d.ts +66 -0
  18. package/dist/bundle/external.d.ts.map +1 -0
  19. package/dist/bundle/external.js +238 -0
  20. package/dist/bundle/external.js.map +1 -0
  21. package/dist/bundle/format.d.ts +94 -0
  22. package/dist/bundle/format.d.ts.map +1 -0
  23. package/dist/bundle/format.js +42 -0
  24. package/dist/bundle/format.js.map +1 -0
  25. package/dist/bundle/import.d.ts +49 -0
  26. package/dist/bundle/import.d.ts.map +1 -0
  27. package/dist/bundle/import.js +116 -0
  28. package/dist/bundle/import.js.map +1 -0
  29. package/dist/cli/index.d.ts +3 -0
  30. package/dist/cli/index.d.ts.map +1 -0
  31. package/dist/cli/index.js +1402 -0
  32. package/dist/cli/index.js.map +1 -0
  33. package/dist/cli/init.d.ts +48 -0
  34. package/dist/cli/init.d.ts.map +1 -0
  35. package/dist/cli/init.js +284 -0
  36. package/dist/cli/init.js.map +1 -0
  37. package/dist/db/schema.d.ts +3 -0
  38. package/dist/db/schema.d.ts.map +1 -0
  39. package/dist/db/schema.js +616 -0
  40. package/dist/db/schema.js.map +1 -0
  41. package/dist/db/store.d.ts +1011 -0
  42. package/dist/db/store.d.ts.map +1 -0
  43. package/dist/db/store.js +3888 -0
  44. package/dist/db/store.js.map +1 -0
  45. package/dist/graph/pagerank.d.ts +9 -0
  46. package/dist/graph/pagerank.d.ts.map +1 -0
  47. package/dist/graph/pagerank.js +47 -0
  48. package/dist/graph/pagerank.js.map +1 -0
  49. package/dist/indexer/architecture.d.ts +72 -0
  50. package/dist/indexer/architecture.d.ts.map +1 -0
  51. package/dist/indexer/architecture.js +112 -0
  52. package/dist/indexer/architecture.js.map +1 -0
  53. package/dist/indexer/behavior.d.ts +75 -0
  54. package/dist/indexer/behavior.d.ts.map +1 -0
  55. package/dist/indexer/behavior.js +395 -0
  56. package/dist/indexer/behavior.js.map +1 -0
  57. package/dist/indexer/boundaries.d.ts +60 -0
  58. package/dist/indexer/boundaries.d.ts.map +1 -0
  59. package/dist/indexer/boundaries.js +366 -0
  60. package/dist/indexer/boundaries.js.map +1 -0
  61. package/dist/indexer/churn.d.ts +15 -0
  62. package/dist/indexer/churn.d.ts.map +1 -0
  63. package/dist/indexer/churn.js +49 -0
  64. package/dist/indexer/churn.js.map +1 -0
  65. package/dist/indexer/classify.d.ts +9 -0
  66. package/dist/indexer/classify.d.ts.map +1 -0
  67. package/dist/indexer/classify.js +90 -0
  68. package/dist/indexer/classify.js.map +1 -0
  69. package/dist/indexer/context.d.ts +176 -0
  70. package/dist/indexer/context.d.ts.map +1 -0
  71. package/dist/indexer/context.js +193 -0
  72. package/dist/indexer/context.js.map +1 -0
  73. package/dist/indexer/continuity.d.ts +67 -0
  74. package/dist/indexer/continuity.d.ts.map +1 -0
  75. package/dist/indexer/continuity.js +288 -0
  76. package/dist/indexer/continuity.js.map +1 -0
  77. package/dist/indexer/detectchanges.d.ts +32 -0
  78. package/dist/indexer/detectchanges.d.ts.map +1 -0
  79. package/dist/indexer/detectchanges.js +74 -0
  80. package/dist/indexer/detectchanges.js.map +1 -0
  81. package/dist/indexer/discovery.d.ts +37 -0
  82. package/dist/indexer/discovery.d.ts.map +1 -0
  83. package/dist/indexer/discovery.js +136 -0
  84. package/dist/indexer/discovery.js.map +1 -0
  85. package/dist/indexer/externaldeps.d.ts +18 -0
  86. package/dist/indexer/externaldeps.d.ts.map +1 -0
  87. package/dist/indexer/externaldeps.js +288 -0
  88. package/dist/indexer/externaldeps.js.map +1 -0
  89. package/dist/indexer/freshness.d.ts +48 -0
  90. package/dist/indexer/freshness.d.ts.map +1 -0
  91. package/dist/indexer/freshness.js +128 -0
  92. package/dist/indexer/freshness.js.map +1 -0
  93. package/dist/indexer/git.d.ts +144 -0
  94. package/dist/indexer/git.d.ts.map +1 -0
  95. package/dist/indexer/git.js +444 -0
  96. package/dist/indexer/git.js.map +1 -0
  97. package/dist/indexer/index.d.ts +145 -0
  98. package/dist/indexer/index.d.ts.map +1 -0
  99. package/dist/indexer/index.js +930 -0
  100. package/dist/indexer/index.js.map +1 -0
  101. package/dist/indexer/modules.d.ts +62 -0
  102. package/dist/indexer/modules.d.ts.map +1 -0
  103. package/dist/indexer/modules.js +293 -0
  104. package/dist/indexer/modules.js.map +1 -0
  105. package/dist/indexer/preflight.d.ts +154 -0
  106. package/dist/indexer/preflight.d.ts.map +1 -0
  107. package/dist/indexer/preflight.js +399 -0
  108. package/dist/indexer/preflight.js.map +1 -0
  109. package/dist/indexer/protoScanner.d.ts +34 -0
  110. package/dist/indexer/protoScanner.d.ts.map +1 -0
  111. package/dist/indexer/protoScanner.js +133 -0
  112. package/dist/indexer/protoScanner.js.map +1 -0
  113. package/dist/indexer/risk.d.ts +115 -0
  114. package/dist/indexer/risk.d.ts.map +1 -0
  115. package/dist/indexer/risk.js +194 -0
  116. package/dist/indexer/risk.js.map +1 -0
  117. package/dist/indexer/serviceHostScanner.d.ts +25 -0
  118. package/dist/indexer/serviceHostScanner.d.ts.map +1 -0
  119. package/dist/indexer/serviceHostScanner.js +95 -0
  120. package/dist/indexer/serviceHostScanner.js.map +1 -0
  121. package/dist/indexer/serviceLinks.d.ts +105 -0
  122. package/dist/indexer/serviceLinks.d.ts.map +1 -0
  123. package/dist/indexer/serviceLinks.js +509 -0
  124. package/dist/indexer/serviceLinks.js.map +1 -0
  125. package/dist/indexer/shapehash.d.ts +98 -0
  126. package/dist/indexer/shapehash.d.ts.map +1 -0
  127. package/dist/indexer/shapehash.js +354 -0
  128. package/dist/indexer/shapehash.js.map +1 -0
  129. package/dist/indexer/skeleton.d.ts +15 -0
  130. package/dist/indexer/skeleton.d.ts.map +1 -0
  131. package/dist/indexer/skeleton.js +136 -0
  132. package/dist/indexer/skeleton.js.map +1 -0
  133. package/dist/indexer/symbolhistory.d.ts +41 -0
  134. package/dist/indexer/symbolhistory.d.ts.map +1 -0
  135. package/dist/indexer/symbolhistory.js +124 -0
  136. package/dist/indexer/symbolhistory.js.map +1 -0
  137. package/dist/indexer/watcher.d.ts +68 -0
  138. package/dist/indexer/watcher.d.ts.map +1 -0
  139. package/dist/indexer/watcher.js +179 -0
  140. package/dist/indexer/watcher.js.map +1 -0
  141. package/dist/mcp/server.d.ts +80 -0
  142. package/dist/mcp/server.d.ts.map +1 -0
  143. package/dist/mcp/server.js +1610 -0
  144. package/dist/mcp/server.js.map +1 -0
  145. package/dist/parser/index.d.ts +8 -0
  146. package/dist/parser/index.d.ts.map +1 -0
  147. package/dist/parser/index.js +33 -0
  148. package/dist/parser/index.js.map +1 -0
  149. package/dist/parser/languages/cpp.d.ts +3 -0
  150. package/dist/parser/languages/cpp.d.ts.map +1 -0
  151. package/dist/parser/languages/cpp.js +350 -0
  152. package/dist/parser/languages/cpp.js.map +1 -0
  153. package/dist/parser/languages/csharp.d.ts +3 -0
  154. package/dist/parser/languages/csharp.d.ts.map +1 -0
  155. package/dist/parser/languages/csharp.js +239 -0
  156. package/dist/parser/languages/csharp.js.map +1 -0
  157. package/dist/parser/languages/go.d.ts +3 -0
  158. package/dist/parser/languages/go.d.ts.map +1 -0
  159. package/dist/parser/languages/go.js +259 -0
  160. package/dist/parser/languages/go.js.map +1 -0
  161. package/dist/parser/languages/java.d.ts +3 -0
  162. package/dist/parser/languages/java.d.ts.map +1 -0
  163. package/dist/parser/languages/java.js +391 -0
  164. package/dist/parser/languages/java.js.map +1 -0
  165. package/dist/parser/languages/python.d.ts +3 -0
  166. package/dist/parser/languages/python.d.ts.map +1 -0
  167. package/dist/parser/languages/python.js +396 -0
  168. package/dist/parser/languages/python.js.map +1 -0
  169. package/dist/parser/languages/rust.d.ts +3 -0
  170. package/dist/parser/languages/rust.d.ts.map +1 -0
  171. package/dist/parser/languages/rust.js +159 -0
  172. package/dist/parser/languages/rust.js.map +1 -0
  173. package/dist/parser/languages/typescript.d.ts +3 -0
  174. package/dist/parser/languages/typescript.d.ts.map +1 -0
  175. package/dist/parser/languages/typescript.js +1442 -0
  176. package/dist/parser/languages/typescript.js.map +1 -0
  177. package/dist/parser/parserContext.d.ts +77 -0
  178. package/dist/parser/parserContext.d.ts.map +1 -0
  179. package/dist/parser/parserContext.js +354 -0
  180. package/dist/parser/parserContext.js.map +1 -0
  181. package/dist/parser/walker.d.ts +81 -0
  182. package/dist/parser/walker.d.ts.map +1 -0
  183. package/dist/parser/walker.js +217 -0
  184. package/dist/parser/walker.js.map +1 -0
  185. package/dist/parser/worker.d.ts +66 -0
  186. package/dist/parser/worker.d.ts.map +1 -0
  187. package/dist/parser/worker.js +129 -0
  188. package/dist/parser/worker.js.map +1 -0
  189. package/dist/parser/workerpool.d.ts +107 -0
  190. package/dist/parser/workerpool.d.ts.map +1 -0
  191. package/dist/parser/workerpool.js +383 -0
  192. package/dist/parser/workerpool.js.map +1 -0
  193. package/dist/scip/format.d.ts +87 -0
  194. package/dist/scip/format.d.ts.map +1 -0
  195. package/dist/scip/format.js +31 -0
  196. package/dist/scip/format.js.map +1 -0
  197. package/dist/scip/import.d.ts +37 -0
  198. package/dist/scip/import.d.ts.map +1 -0
  199. package/dist/scip/import.js +180 -0
  200. package/dist/scip/import.js.map +1 -0
  201. package/dist/types.d.ts +392 -0
  202. package/dist/types.d.ts.map +1 -0
  203. package/dist/types.js +4 -0
  204. package/dist/types.js.map +1 -0
  205. package/docs/architecture.md +105 -0
  206. package/docs/benchmarks/methodology.md +134 -0
  207. package/docs/benchmarks/raw-results.md +71 -0
  208. package/docs/benchmarks.md +74 -0
  209. package/docs/cli.md +148 -0
  210. package/docs/examples/behavior-tests.md +70 -0
  211. package/docs/examples/change-history.md +85 -0
  212. package/docs/examples/pre-edit-context.md +81 -0
  213. package/docs/examples/service-links.md +88 -0
  214. package/docs/examples.md +80 -0
  215. package/docs/faq.md +70 -0
  216. package/docs/internals.md +104 -0
  217. package/docs/languages.md +70 -0
  218. package/docs/limits.md +52 -0
  219. package/docs/mcp.md +199 -0
  220. package/docs/quickstart.md +119 -0
  221. package/docs/testing.md +123 -0
  222. package/docs/tools.md +115 -0
  223. package/package.json +52 -0
  224. package/research-codebase.md +578 -0
  225. package/seer-cli-docs.md +326 -0
  226. package/seer-master-guide.md +246 -0
  227. package/src/bundle/ci.ts +141 -0
  228. package/src/bundle/contract.ts +387 -0
  229. package/src/bundle/export.ts +175 -0
  230. package/src/bundle/external.ts +285 -0
  231. package/src/bundle/format.ts +92 -0
  232. package/src/bundle/import.ts +157 -0
  233. package/src/cli/index.ts +1249 -0
  234. package/src/cli/init.ts +389 -0
  235. package/src/db/schema.ts +614 -0
  236. package/src/db/store.ts +4306 -0
  237. package/src/graph/pagerank.ts +53 -0
  238. package/src/indexer/architecture.ts +148 -0
  239. package/src/indexer/behavior.ts +466 -0
  240. package/src/indexer/boundaries.ts +374 -0
  241. package/src/indexer/churn.ts +58 -0
  242. package/src/indexer/classify.ts +96 -0
  243. package/src/indexer/context.ts +340 -0
  244. package/src/indexer/continuity.ts +322 -0
  245. package/src/indexer/detectchanges.ts +94 -0
  246. package/src/indexer/discovery.ts +176 -0
  247. package/src/indexer/externaldeps.ts +243 -0
  248. package/src/indexer/freshness.ts +166 -0
  249. package/src/indexer/git.ts +453 -0
  250. package/src/indexer/index.ts +1092 -0
  251. package/src/indexer/modules.ts +358 -0
  252. package/src/indexer/preflight.ts +548 -0
  253. package/src/indexer/protoScanner.ts +147 -0
  254. package/src/indexer/risk.ts +304 -0
  255. package/src/indexer/serviceHostScanner.ts +92 -0
  256. package/src/indexer/serviceLinks.ts +543 -0
  257. package/src/indexer/shapehash.ts +370 -0
  258. package/src/indexer/skeleton.ts +169 -0
  259. package/src/indexer/symbolhistory.ts +172 -0
  260. package/src/indexer/watcher.ts +206 -0
  261. package/src/mcp/server.ts +1659 -0
  262. package/src/parser/index.ts +37 -0
  263. package/src/parser/languages/cpp.ts +361 -0
  264. package/src/parser/languages/csharp.ts +235 -0
  265. package/src/parser/languages/go.ts +259 -0
  266. package/src/parser/languages/java.ts +382 -0
  267. package/src/parser/languages/python.ts +370 -0
  268. package/src/parser/languages/rust.ts +164 -0
  269. package/src/parser/languages/typescript.ts +1435 -0
  270. package/src/parser/parserContext.ts +392 -0
  271. package/src/parser/walker.ts +306 -0
  272. package/src/parser/worker.ts +181 -0
  273. package/src/parser/workerpool.ts +448 -0
  274. package/src/scip/format.ts +83 -0
  275. package/src/scip/import.ts +216 -0
  276. package/src/types.ts +457 -0
  277. package/tests/benchmark-service-links.ts +244 -0
  278. package/tests/bug-regressions.ts +626 -0
  279. package/tests/filters.ts +264 -0
  280. package/tests/fixtures/Counter.tsx +38 -0
  281. package/tests/fixtures/caller.ts +7 -0
  282. package/tests/fixtures/collisions.ts +23 -0
  283. package/tests/fixtures/local_helper.ts +5 -0
  284. package/tests/fixtures/overloads.java +17 -0
  285. package/tests/fixtures/remote_helper.ts +4 -0
  286. package/tests/fixtures/sample.c +15 -0
  287. package/tests/fixtures/sample.cpp +47 -0
  288. package/tests/fixtures/sample.cs +62 -0
  289. package/tests/fixtures/sample.go +68 -0
  290. package/tests/fixtures/sample.h +30 -0
  291. package/tests/fixtures/sample.java +85 -0
  292. package/tests/fixtures/sample.py +46 -0
  293. package/tests/fixtures/sample.rs +78 -0
  294. package/tests/fixtures/sample.ts +76 -0
  295. package/tests/fixtures-service/HttpClients.cs +30 -0
  296. package/tests/fixtures-service/HttpClients.java +24 -0
  297. package/tests/fixtures-service/billing.ts +15 -0
  298. package/tests/fixtures-service/docker-compose.yml +15 -0
  299. package/tests/fixtures-service/gateway.ts +10 -0
  300. package/tests/fixtures-service/get_user.ts +11 -0
  301. package/tests/fixtures-service/graphql_client.ts +63 -0
  302. package/tests/fixtures-service/graphql_server.ts +30 -0
  303. package/tests/fixtures-service/grpc_client.go +30 -0
  304. package/tests/fixtures-service/http_clients.go +23 -0
  305. package/tests/fixtures-service/http_clients.py +38 -0
  306. package/tests/fixtures-service/http_clients.ts +49 -0
  307. package/tests/fixtures-service/k8s/payment-service.yaml +22 -0
  308. package/tests/fixtures-service/k8s_calls.ts +20 -0
  309. package/tests/fixtures-service/messaging.ts +87 -0
  310. package/tests/fixtures-service/trpc_client.ts +39 -0
  311. package/tests/fixtures-service/trpc_server.ts +39 -0
  312. package/tests/fixtures-service/user_service.proto +33 -0
  313. package/tests/fixtures-trackcd/Cargo.toml +11 -0
  314. package/tests/fixtures-trackcd/SpringController.java +36 -0
  315. package/tests/fixtures-trackcd/auth_service.ts +19 -0
  316. package/tests/fixtures-trackcd/complex_module.py +50 -0
  317. package/tests/fixtures-trackcd/express_app.js +30 -0
  318. package/tests/fixtures-trackcd/fastapi_app.py +49 -0
  319. package/tests/fixtures-trackcd/fastify_object_routes.js +32 -0
  320. package/tests/fixtures-trackcd/go.mod +8 -0
  321. package/tests/fixtures-trackcd/package.json +15 -0
  322. package/tests/fixtures-trackcd/requirements.txt +4 -0
  323. package/tests/fixtures-trackcd/tests/auth_service.test.ts +13 -0
  324. package/tests/fixtures-tracke/auth/AuthService.ts +23 -0
  325. package/tests/fixtures-tracke/auth/crypto.ts +7 -0
  326. package/tests/fixtures-tracke/billing/Billing.ts +20 -0
  327. package/tests/fixtures-tracke/billing/Invoice.ts +10 -0
  328. package/tests/fixtures-tracke/billing/server.ts +17 -0
  329. package/tests/fixtures-tracke/package.json +7 -0
  330. package/tests/fixtures-tracke/tests/auth.test.ts +23 -0
  331. package/tests/fixtures-tracke/tests/billing.test.ts +14 -0
  332. package/tests/fixtures-trackf/package.json +5 -0
  333. package/tests/fixtures-trackf/src/auth.ts +26 -0
  334. package/tests/fixtures-trackf/src/handlers.ts +35 -0
  335. package/tests/fixtures-tracki/billing/routes.ts +12 -0
  336. package/tests/fixtures-tracki/gateway/client.ts +13 -0
  337. package/tests/git-features.ts +267 -0
  338. package/tests/init.ts +141 -0
  339. package/tests/mcp-jit.ts +130 -0
  340. package/tests/mcp-smoke.ts +191 -0
  341. package/tests/mcp-trackcd.ts +169 -0
  342. package/tests/mcp-tracke.ts +229 -0
  343. package/tests/mcp-trackf.ts +330 -0
  344. package/tests/mcp-trackg.ts +219 -0
  345. package/tests/mcp-tracki.ts +174 -0
  346. package/tests/mcp-watcher.ts +126 -0
  347. package/tests/optspec.ts +194 -0
  348. package/tests/parallel-index.ts +333 -0
  349. package/tests/parallel-read.ts +125 -0
  350. package/tests/parallel-recovery.ts +241 -0
  351. package/tests/perf-callers.ts +145 -0
  352. package/tests/query-parity.ts +184 -0
  353. package/tests/query-perf.ts +55 -0
  354. package/tests/scale-parallel-parity.ts +225 -0
  355. package/tests/scale-test.ts +523 -0
  356. package/tests/smoke.ts +396 -0
  357. package/tests/trackcd.ts +325 -0
  358. package/tests/tracke-collisions.ts +255 -0
  359. package/tests/tracke.ts +314 -0
  360. package/tests/trackf-bugs.ts +406 -0
  361. package/tests/trackf.ts +390 -0
  362. package/tests/trackg.ts +1372 -0
  363. package/tests/tracki-boundaries.ts +202 -0
  364. package/tests/tracki-continuity.ts +253 -0
  365. package/tests/tracki-contract-diff.ts +249 -0
  366. package/tests/tracki-external-bundles.ts +341 -0
  367. package/tests/tracki-preflight.ts +251 -0
  368. package/tests/verify-roles.ts +51 -0
  369. package/tests/worker-parity.ts +286 -0
  370. package/tests/worker-pool.ts +262 -0
  371. package/tsconfig.json +20 -0
@@ -0,0 +1,444 @@
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.isGitRepo = isGitRepo;
7
+ exports.gitHeadSha = gitHeadSha;
8
+ exports.gitRemoteUrl = gitRemoteUrl;
9
+ exports.collectFileChurn = collectFileChurn;
10
+ exports.commitsForFile = commitsForFile;
11
+ exports.parseFollowLog = parseFollowLog;
12
+ exports.fileDiffHunks = fileDiffHunks;
13
+ exports.fileDiffInfo = fileDiffInfo;
14
+ exports.commitNumstat = commitNumstat;
15
+ exports.gitChangedFiles = gitChangedFiles;
16
+ exports.fileDiffHunksSync = fileDiffHunksSync;
17
+ exports.extractPrNumber = extractPrNumber;
18
+ exports.githubPrUrl = githubPrUrl;
19
+ const path_1 = __importDefault(require("path"));
20
+ const fs_1 = __importDefault(require("fs"));
21
+ const child_process_1 = require("child_process");
22
+ /**
23
+ * Thin async wrapper around `git` so the rest of the indexer doesn't deal
24
+ * with child_process directly. All commands run with `cwd = repoRoot`.
25
+ *
26
+ * Errors are surfaced as `null` returns (not throws) so a non-git workspace
27
+ * silently no-ops. Callers should check the return value.
28
+ */
29
+ function isGitRepo(repoRoot) {
30
+ try {
31
+ const r = (0, child_process_1.spawnSync)('git', ['-C', repoRoot, 'rev-parse', '--is-inside-work-tree'], { encoding: 'utf8' });
32
+ return r.status === 0 && r.stdout.trim() === 'true';
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ function gitHeadSha(repoRoot) {
39
+ try {
40
+ const r = (0, child_process_1.spawnSync)('git', ['-C', repoRoot, 'rev-parse', 'HEAD'], { encoding: 'utf8' });
41
+ if (r.status !== 0)
42
+ return null;
43
+ return r.stdout.trim() || null;
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ function gitRemoteUrl(repoRoot, remote = 'origin') {
50
+ try {
51
+ const r = (0, child_process_1.spawnSync)('git', ['-C', repoRoot, 'config', '--get', `remote.${remote}.url`], { encoding: 'utf8' });
52
+ if (r.status !== 0)
53
+ return null;
54
+ return r.stdout.trim() || null;
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ }
60
+ /**
61
+ * Collect file-level churn stats by streaming `git log` once and bucketing
62
+ * per file. Uses `--follow` per-file would be ~slow on big repos, so we use
63
+ * a single `git log --name-only` pass and aggregate in JS. The trade-off is
64
+ * that renames lose their pre-rename history; callers documenting that fact
65
+ * matches the master guide's "honest about rename limits" stance.
66
+ */
67
+ async function collectFileChurn(repoRoot, filesAbs) {
68
+ const result = new Map();
69
+ if (!isGitRepo(repoRoot))
70
+ return result;
71
+ // Build a quick lookup: relPath (forward slashes, normalized) → absPath.
72
+ // `git log` reports paths relative to repo root, so we have to translate
73
+ // back to absolute paths the indexer keyed off.
74
+ const absSet = new Set();
75
+ for (const a of filesAbs)
76
+ absSet.add(normalize(a));
77
+ return new Promise((resolve, reject) => {
78
+ const proc = (0, child_process_1.spawn)('git', ['-C', repoRoot, 'log', '--name-only', '--pretty=format:__COMMIT__%H%x09%an%x09%aI', '--no-merges'], { stdio: ['ignore', 'pipe', 'pipe'] });
79
+ let buf = '';
80
+ let currentSha = null;
81
+ let currentAuthor = null;
82
+ let currentDateSec = null;
83
+ const perFile = new Map();
84
+ const handleLine = (line) => {
85
+ if (line.startsWith('__COMMIT__')) {
86
+ const parts = line.slice('__COMMIT__'.length).split('\t');
87
+ currentSha = parts[0] || null;
88
+ currentAuthor = parts[1] || null;
89
+ currentDateSec = parts[2] ? Math.floor(Date.parse(parts[2]) / 1000) : null;
90
+ return;
91
+ }
92
+ if (!line.trim())
93
+ return;
94
+ const rel = normalize(line);
95
+ // Resolve to absolute. Path may use forward slashes; we compare against
96
+ // absSet directly. Also fall back to repoRoot-joined.
97
+ const cand1 = normalize(path_1.default.resolve(repoRoot, rel));
98
+ let key = null;
99
+ if (absSet.has(cand1))
100
+ key = cand1;
101
+ else if (absSet.has(rel))
102
+ key = rel;
103
+ if (!key)
104
+ return;
105
+ let entry = perFile.get(key);
106
+ if (!entry) {
107
+ entry = { count: 0, lastSha: null, lastAt: null, authors: new Map() };
108
+ perFile.set(key, entry);
109
+ }
110
+ entry.count++;
111
+ if (entry.lastSha === null) {
112
+ entry.lastSha = currentSha;
113
+ entry.lastAt = currentDateSec;
114
+ }
115
+ if (currentAuthor) {
116
+ entry.authors.set(currentAuthor, (entry.authors.get(currentAuthor) ?? 0) + 1);
117
+ }
118
+ };
119
+ proc.stdout.on('data', (chunk) => {
120
+ buf += chunk.toString('utf8');
121
+ let nl;
122
+ while ((nl = buf.indexOf('\n')) >= 0) {
123
+ const line = buf.slice(0, nl);
124
+ buf = buf.slice(nl + 1);
125
+ handleLine(line);
126
+ }
127
+ });
128
+ proc.stderr.on('data', () => { });
129
+ proc.on('error', reject);
130
+ proc.on('close', () => {
131
+ if (buf.length > 0)
132
+ handleLine(buf);
133
+ for (const [key, e] of perFile) {
134
+ const sortedAuthors = Array.from(e.authors.entries()).sort((a, b) => b[1] - a[1]);
135
+ result.set(key, {
136
+ commitCount: e.count,
137
+ lastCommitSha: e.lastSha,
138
+ lastCommitAt: e.lastAt,
139
+ topAuthor: sortedAuthors[0]?.[0] ?? null,
140
+ secondAuthor: sortedAuthors[1]?.[0] ?? null,
141
+ });
142
+ }
143
+ resolve(result);
144
+ });
145
+ });
146
+ }
147
+ /**
148
+ * `git log` commits that touched a single file, newest first. Each commit
149
+ * includes its author info and full message. Used by the symbol-history pass.
150
+ *
151
+ * `--name-status` is added on top of `--follow` so we get a per-commit path —
152
+ * critical for the rename case: the historical commits touched the OLD path,
153
+ * but our usual `git show <sha> -- <currentPath>` would look at the wrong
154
+ * path and return empty hunks. With pathAtCommit threaded through to
155
+ * fileDiffInfo(), pre-rename history is preserved.
156
+ *
157
+ * Parser shape: we ask git for a per-commit header line prefixed `__C__`
158
+ * (sha, author, email, ISO date — all NUL-free fields tab-separated), then
159
+ * the commit body (terminated by a unique end marker `__BODY_END__`), then
160
+ * the name-status lines that git appends after each commit. The name-status
161
+ * block has one path entry per commit relative to this file's --follow chain:
162
+ * either `M\tpath`, `A\tpath`, `D\tpath`, or `R<score>\toldPath\tnewPath`.
163
+ *
164
+ * Using a custom body terminator (instead of git's default blank-line
165
+ * separator) lets us handle commit messages that themselves contain blank
166
+ * lines or `__C__` literals without re-introducing the old `__C__ff8` bug.
167
+ */
168
+ async function commitsForFile(repoRoot, filePath, options = {}) {
169
+ if (!isGitRepo(repoRoot))
170
+ return [];
171
+ const rel = path_1.default.relative(repoRoot, filePath);
172
+ const args = ['-C', repoRoot, 'log',
173
+ '--pretty=format:__C__%H%x09%an%x09%ae%x09%aI%n%B%n__BODY_END__',
174
+ '--no-merges',
175
+ '--follow',
176
+ '--name-status',
177
+ ];
178
+ if (options.limit)
179
+ args.push(`-n${options.limit}`);
180
+ if (options.since)
181
+ args.push(`--since=${new Date(options.since * 1000).toISOString()}`);
182
+ args.push('--', rel);
183
+ return new Promise((resolve) => {
184
+ const proc = (0, child_process_1.spawn)('git', args, { stdio: ['ignore', 'pipe', 'pipe'] });
185
+ let buf = '';
186
+ proc.stdout.on('data', (c) => { buf += c.toString('utf8'); });
187
+ proc.stderr.on('data', () => { });
188
+ proc.on('error', () => resolve([]));
189
+ proc.on('close', () => {
190
+ resolve(parseFollowLog(buf));
191
+ });
192
+ });
193
+ }
194
+ /**
195
+ * Walk the line stream from `git log --follow --name-status` (with the
196
+ * `__C__` header / `__BODY_END__` body terminator format above) and emit
197
+ * one CommitMeta per `__C__` header. Exposed only for tests; the live
198
+ * pipeline goes through commitsForFile().
199
+ */
200
+ function parseFollowLog(buf) {
201
+ const out = [];
202
+ // Normalize CRLF that Windows git may inject in some setups so the line
203
+ // walker doesn't end up with trailing \r in messages or paths.
204
+ const lines = buf.replace(/\r\n/g, '\n').split('\n');
205
+ let i = 0;
206
+ while (i < lines.length) {
207
+ const line = lines[i];
208
+ if (!line.startsWith('__C__')) {
209
+ i++;
210
+ continue;
211
+ }
212
+ const headerParts = line.slice('__C__'.length).split('\t');
213
+ if (headerParts.length < 4) {
214
+ i++;
215
+ continue;
216
+ }
217
+ const [sha, author, email, dateStr] = headerParts;
218
+ const committedAt = Math.floor(Date.parse(dateStr) / 1000);
219
+ if (!sha || isNaN(committedAt)) {
220
+ i++;
221
+ continue;
222
+ }
223
+ // Collect message body until __BODY_END__.
224
+ i++;
225
+ const msgLines = [];
226
+ while (i < lines.length && lines[i] !== '__BODY_END__') {
227
+ msgLines.push(lines[i]);
228
+ i++;
229
+ }
230
+ // Skip the __BODY_END__ line itself.
231
+ if (i < lines.length)
232
+ i++;
233
+ // Collect name-status lines until the next __C__ header or EOF. Blank
234
+ // lines (which git emits between commit body and name-status) are
235
+ // skipped; we never have to interpret them.
236
+ let pathAtCommit = null;
237
+ while (i < lines.length && !lines[i].startsWith('__C__')) {
238
+ const nl = lines[i];
239
+ if (nl.length === 0) {
240
+ i++;
241
+ continue;
242
+ }
243
+ const fields = nl.split('\t');
244
+ if (fields.length >= 2) {
245
+ const code = fields[0];
246
+ if (code.startsWith('R') || code.startsWith('C')) {
247
+ // Rename/copy: code, oldPath, newPath. The NEW path is what this
248
+ // commit produced (and the path subsequent commits see).
249
+ if (fields.length >= 3)
250
+ pathAtCommit = fields[2];
251
+ }
252
+ else {
253
+ pathAtCommit = fields[1];
254
+ }
255
+ }
256
+ i++;
257
+ }
258
+ const message = msgLines.join('\n').trimEnd();
259
+ out.push({
260
+ sha,
261
+ authorName: author || null,
262
+ authorEmail: email || null,
263
+ committedAt,
264
+ message,
265
+ pathAtCommit,
266
+ });
267
+ }
268
+ return out;
269
+ }
270
+ /**
271
+ * Diff hunks for a file changed by a single commit. `git show -U0 <sha>`
272
+ * handles the root commit transparently (no parent → diff against the empty
273
+ * tree), so the caller doesn't need to pass parentSha. `parentSha` is kept
274
+ * for compatibility but ignored.
275
+ */
276
+ async function fileDiffHunks(repoRoot, _parentSha, sha, filePath) {
277
+ const info = await fileDiffInfo(repoRoot, sha, filePath);
278
+ return info.hunks;
279
+ }
280
+ /** Like fileDiffHunks but returns extra metadata used for "this commit
281
+ * created the file → match every symbol" heuristic.
282
+ *
283
+ * `filePath` may be either an absolute path or a repo-relative one. When the
284
+ * file was renamed across history, callers should pass the PATH-AT-COMMIT
285
+ * (resolved from `git log --follow --name-status`) so `git show` looks at
286
+ * the right side of the rename — passing the current path would return
287
+ * empty hunks for pre-rename commits and silently lose history.
288
+ */
289
+ async function fileDiffInfo(repoRoot, sha, filePath) {
290
+ if (!isGitRepo(repoRoot))
291
+ return { hunks: [], isFileAddition: false };
292
+ const rel = path_1.default.isAbsolute(filePath) ? path_1.default.relative(repoRoot, filePath) : filePath;
293
+ const args = ['-C', repoRoot, 'show', '--format=', '-U0', sha, '--', rel];
294
+ return new Promise(resolve => {
295
+ const proc = (0, child_process_1.spawn)('git', args, { stdio: ['ignore', 'pipe', 'pipe'] });
296
+ let buf = '';
297
+ proc.stdout.on('data', (c) => { buf += c.toString('utf8'); });
298
+ proc.stderr.on('data', () => { });
299
+ proc.on('error', () => resolve({ hunks: [], isFileAddition: false }));
300
+ proc.on('close', () => {
301
+ const out = [];
302
+ const re = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/gm;
303
+ let m;
304
+ while ((m = re.exec(buf)) !== null) {
305
+ out.push({
306
+ oldStart: parseInt(m[1], 10),
307
+ oldLines: m[2] ? parseInt(m[2], 10) : 1,
308
+ newStart: parseInt(m[3], 10),
309
+ newLines: m[4] ? parseInt(m[4], 10) : 1,
310
+ });
311
+ }
312
+ const isFileAddition = /^--- \/dev\/null$/m.test(buf) || /^new file mode/m.test(buf);
313
+ resolve({ hunks: out, isFileAddition });
314
+ });
315
+ });
316
+ }
317
+ /**
318
+ * Diff numstat for one commit: returns added/removed line counts per file
319
+ * (or aggregated when filePath is given).
320
+ */
321
+ async function commitNumstat(repoRoot, sha, filePath) {
322
+ if (!isGitRepo(repoRoot))
323
+ return { added: 0, removed: 0 };
324
+ const args = ['-C', repoRoot, 'show', '--numstat', '--format=', sha];
325
+ if (filePath)
326
+ args.push('--', path_1.default.relative(repoRoot, filePath));
327
+ return new Promise(resolve => {
328
+ const proc = (0, child_process_1.spawn)('git', args, { stdio: ['ignore', 'pipe', 'pipe'] });
329
+ let buf = '';
330
+ proc.stdout.on('data', (c) => { buf += c.toString('utf8'); });
331
+ proc.on('error', () => resolve({ added: 0, removed: 0 }));
332
+ proc.on('close', () => {
333
+ let added = 0, removed = 0;
334
+ for (const line of buf.split('\n')) {
335
+ const parts = line.trim().split(/\s+/);
336
+ if (parts.length < 3)
337
+ continue;
338
+ const a = parseInt(parts[0], 10);
339
+ const r = parseInt(parts[1], 10);
340
+ if (!isNaN(a))
341
+ added += a;
342
+ if (!isNaN(r))
343
+ removed += r;
344
+ }
345
+ resolve({ added, removed });
346
+ });
347
+ });
348
+ }
349
+ /**
350
+ * git diff name-only between two refs. Defaults to HEAD vs the working
351
+ * tree (uncommitted changes) — used by `detect_changes`. Returns absolute
352
+ * paths (after path.resolve(repoRoot, rel)).
353
+ */
354
+ function gitChangedFiles(repoRoot, fromRef, toRef) {
355
+ if (!isGitRepo(repoRoot))
356
+ return [];
357
+ const args = ['-C', repoRoot, 'diff', '--name-only'];
358
+ if (fromRef && toRef)
359
+ args.push(`${fromRef}..${toRef}`);
360
+ else if (fromRef)
361
+ args.push(fromRef);
362
+ // No refs → working-tree diff against HEAD.
363
+ const r = (0, child_process_1.spawnSync)('git', args, { encoding: 'utf8' });
364
+ if (r.status !== 0)
365
+ return [];
366
+ return r.stdout.split('\n').filter(Boolean).map(rel => path_1.default.resolve(repoRoot, rel));
367
+ }
368
+ /**
369
+ * git diff -U0 hunks for one file between two refs (or working tree if refs
370
+ * omitted). Returns parsed hunk headers (line ranges in the new file) so
371
+ * `detect_changes` can compute which symbols overlap.
372
+ */
373
+ function fileDiffHunksSync(repoRoot, filePath, fromRef, toRef) {
374
+ if (!isGitRepo(repoRoot))
375
+ return [];
376
+ if (!fs_1.default.existsSync(filePath))
377
+ return [];
378
+ const rel = path_1.default.relative(repoRoot, filePath);
379
+ const args = ['-C', repoRoot, 'diff', '-U0'];
380
+ if (fromRef && toRef)
381
+ args.push(`${fromRef}..${toRef}`);
382
+ else if (fromRef)
383
+ args.push(fromRef);
384
+ args.push('--', rel);
385
+ const r = (0, child_process_1.spawnSync)('git', args, { encoding: 'utf8' });
386
+ if (r.status !== 0)
387
+ return [];
388
+ const out = [];
389
+ const re = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/gm;
390
+ let m;
391
+ while ((m = re.exec(r.stdout)) !== null) {
392
+ out.push({
393
+ oldStart: parseInt(m[1], 10),
394
+ oldLines: m[2] ? parseInt(m[2], 10) : 1,
395
+ newStart: parseInt(m[3], 10),
396
+ newLines: m[4] ? parseInt(m[4], 10) : 1,
397
+ });
398
+ }
399
+ return out;
400
+ }
401
+ function normalize(p) {
402
+ const n = p.replace(/\\/g, '/');
403
+ return process.platform === 'win32' ? n.toLowerCase() : n;
404
+ }
405
+ /**
406
+ * Extract GitHub-style PR numbers from a commit message. We accept the
407
+ * common conventions:
408
+ * "Merge pull request #1234 from ..."
409
+ * "Fix something (#1234)"
410
+ * "#1234"
411
+ * "PR #1234"
412
+ *
413
+ * Returns the first matched PR number, or null.
414
+ */
415
+ function extractPrNumber(message) {
416
+ if (!message)
417
+ return null;
418
+ const merge = message.match(/Merge pull request #(\d+)/i);
419
+ if (merge)
420
+ return parseInt(merge[1], 10);
421
+ // Trailing or inline `#1234` but not part of a hex-ish word
422
+ const m = message.match(/(?:^|[\s(])#(\d{1,7})\b/);
423
+ if (m)
424
+ return parseInt(m[1], 10);
425
+ return null;
426
+ }
427
+ /**
428
+ * If `remoteUrl` is a GitHub URL (HTTPS or SSH), return the matching
429
+ * `https://github.com/<owner>/<repo>/pull/<n>` URL for a PR number.
430
+ * Returns null for non-GitHub remotes so we don't fabricate links to
431
+ * GitLab/Bitbucket/etc.
432
+ */
433
+ function githubPrUrl(remoteUrl, prNumber) {
434
+ if (!remoteUrl || !prNumber)
435
+ return null;
436
+ // git@github.com:owner/repo.git
437
+ let m = remoteUrl.match(/^git@github\.com:([^/]+)\/([^/.]+)(?:\.git)?$/);
438
+ if (!m)
439
+ m = remoteUrl.match(/^https?:\/\/github\.com\/([^/]+)\/([^/.]+?)(?:\.git)?\/?$/);
440
+ if (!m)
441
+ return null;
442
+ return `https://github.com/${m[1]}/${m[2]}/pull/${prNumber}`;
443
+ }
444
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/indexer/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import { DiscoveryMode } from './discovery.js';
2
+ import { Store } from '../db/store.js';
3
+ export interface IndexOptions {
4
+ verbose?: boolean;
5
+ reset?: boolean;
6
+ /**
7
+ * When true, suppress all progress / post-processing chatter to stdout.
8
+ * `verbose` still wins if both are set. Useful for the scale-test runner
9
+ * which prints its own one-line-per-codebase summary.
10
+ */
11
+ quiet?: boolean;
12
+ /**
13
+ * Skip files larger than this many bytes. Default is 0 (no cap) — we'd
14
+ * rather index everything than create silent holes in the graph by
15
+ * skipping hand-crafted files just because they're large. The combination
16
+ * of `setTimeoutMicros(10s)` per parse + automatic WASM-runtime reset on
17
+ * failure means a pathological file degrades to "this file is missing"
18
+ * instead of "the indexer crashed."
19
+ *
20
+ * Setting a positive cap is purely an optimization for indexing speed in
21
+ * codebases where you know certain files are huge generated boilerplate
22
+ * (Vulkan headers, protobuf output, etc.) — those usually live in a
23
+ * `thirdparty/` or `Generated/` dir which we already skip by default.
24
+ */
25
+ maxFileBytes?: number;
26
+ /**
27
+ * Max number of concurrent file reads issued by the async prefetcher.
28
+ * Defaults to 8. Each in-flight read holds an open file descriptor and the
29
+ * file's bytes in memory until the parser consumes it; the byte cap below
30
+ * is the real safety net, this just protects against FD exhaustion.
31
+ */
32
+ ioConcurrency?: number;
33
+ /**
34
+ * Hard upper bound on total bytes held in the prefetch buffer at any time.
35
+ * Defaults to 64 MiB. If a single file is larger than the cap it is still
36
+ * read (we always allow at least one in-flight read so progress never
37
+ * stalls) — the cap only governs how many *additional* prefetches we may
38
+ * launch while bytes are outstanding.
39
+ */
40
+ ioPrefetchBytes?: number;
41
+ /**
42
+ * Include vendored directories (`vendor/`, `vendored/`, `thirdparty/`, …)
43
+ * in discovery and indexing. By default these are skipped at discovery
44
+ * time AND tagged as `role='vendor'` if they leak through, so they don't
45
+ * dominate ranking. The flag exists for "I really do want to query into
46
+ * vendored code" workflows.
47
+ */
48
+ includeVendor?: boolean;
49
+ /**
50
+ * Include generated files (`*.pb.*`, `*.generated.*`, `*.gen.*`, …) in
51
+ * discovery and indexing. Off by default for the same reason as
52
+ * `includeVendor`.
53
+ */
54
+ includeGenerated?: boolean;
55
+ /**
56
+ * Discovery aggressiveness. `'full'` indexes everything we can parse
57
+ * (implicitly includes vendor + generated), `'standard'` (default) keeps
58
+ * vendor/generated out by default, and `'fast'` adds docs/examples/static
59
+ * skips on top of standard. See `DiscoveryMode` for the rationale.
60
+ */
61
+ mode?: DiscoveryMode;
62
+ /**
63
+ * Parse files in a pool of worker_threads instead of inline. Each worker
64
+ * owns its own WASM heap so heavy parsing parallelizes across CPU cores.
65
+ * DB writes still happen on the main thread in the same insertion order
66
+ * as the serial path — symbol IDs stay deterministic.
67
+ *
68
+ * Default: on for normal/large workspaces, serial for tiny workspaces where
69
+ * worker startup/teardown costs more than it saves. Set
70
+ * `SEER_PARALLEL_PARSE=0` or pass `parallel:false` to force the serial
71
+ * fallback. Pass `parallel:true` to force workers even below the tiny-repo
72
+ * threshold (the parity tests do this). Scale parity verified the worker
73
+ * path against representative large repos with row-identical DB output.
74
+ */
75
+ parallel?: boolean;
76
+ /**
77
+ * Worker thread count when `parallel` is on. Defaults to
78
+ * `min(8, max(1, availableParallelism()-1))`.
79
+ */
80
+ jobs?: number;
81
+ }
82
+ export interface IndexResult {
83
+ filesDiscovered: number;
84
+ filesIndexed: number;
85
+ /**
86
+ * Files whose content hash matched the existing index row — we kept their
87
+ * symbols/edges/imports and skipped reparsing entirely. This is the single
88
+ * biggest win on a re-index: parse cost goes to ~0 for unchanged files.
89
+ */
90
+ filesReusedFromCache: number;
91
+ filesSkipped: number;
92
+ filesSkippedTooLarge: number;
93
+ filesParseError: number;
94
+ wasmResets: number;
95
+ symbols: number;
96
+ edges: number;
97
+ resolvedEdges: number;
98
+ resolvedImports: number;
99
+ edgeResolution: {
100
+ sameFile: number;
101
+ imported: number;
102
+ global: number;
103
+ };
104
+ /**
105
+ * True when the post-pass actually recomputed PageRank this run. False when
106
+ * the resolved edge graph was unchanged (every file came from cache, nothing
107
+ * was pruned, no new edge or import resolutions happened) — in that case
108
+ * every stored PageRank value is still correct and we kept it as-is. This
109
+ * is the "Lazy PageRank" optimization; the predicate lives at the bottom of
110
+ * `indexDirectory()`.
111
+ */
112
+ pagerankRecomputed: boolean;
113
+ /** Routes whose handler symbol id was filled in this run. */
114
+ routesResolved?: number;
115
+ /** Config-key rows whose enclosing symbol id was filled in this run. */
116
+ configKeysResolved?: number;
117
+ /** Tests edges synthesized this run. */
118
+ testEdgesAdded?: number;
119
+ /** External dependency rows in the DB after this run. */
120
+ externalDependencies?: number;
121
+ /** Number of modules in the clustering after this run (0 if not built). */
122
+ modules?: number;
123
+ /** True when module clustering was recomputed this run. */
124
+ modulesRecomputed?: boolean;
125
+ /** Number of new shape hashes computed this run (Track-F SimHash pass). */
126
+ shapeHashesAdded?: number;
127
+ /** v8 Track-G — service_links rows produced by the resolver this run. */
128
+ serviceLinks?: number;
129
+ /** v8 Track-G — service_link counts grouped by match_kind. */
130
+ serviceLinksByKind?: Record<string, number>;
131
+ elapsedMs: number;
132
+ }
133
+ export declare class Indexer {
134
+ private store;
135
+ constructor(store: Store);
136
+ indexDirectory(repoRoot: string, options?: IndexOptions): Promise<IndexResult>;
137
+ /**
138
+ * Post-parse pipeline shared by the serial and parallel branches: prune
139
+ * stale files, resolve imports/edges/routes/config-keys, synthesize test
140
+ * edges, refresh external dependencies, lazily recompute PageRank, and
141
+ * assemble the `IndexResult`.
142
+ */
143
+ private finishIndex;
144
+ }
145
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiC,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAI9E,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAWvC,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;;;;;;;;OAYG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAsBD,MAAM,WAAW,WAAW;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF;;;;;;;OAOG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wCAAwC;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC;CACnB;AAkED,qBAAa,OAAO;IACN,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,KAAK;IAE1B,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC;IAolBvB;;;;;OAKG;YACW,WAAW;CAwO1B"}