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,83 @@
1
+ /**
2
+ * Track-F SCIP import.
3
+ *
4
+ * Seer accepts SCIP-format precision indexes (https://github.com/sourcegraph/scip)
5
+ * as an ADDITIVE precision uplift over the tree-sitter baseline. A SCIP index
6
+ * carries precise definitions and references produced by a real type-aware
7
+ * indexer (rust-analyzer, scip-typescript, scip-java, etc.). Importing one
8
+ * lets Seer overlay precise edges where tree-sitter's syntactic heuristics
9
+ * were guessing.
10
+ *
11
+ * The import is source-labelled (`provenance = 'scip'`) so consumers can
12
+ * always see which signals came from SCIP vs which were tree-sitter's best
13
+ * effort. Tree-sitter rows are never deleted by a SCIP import; when a SCIP
14
+ * symbol overlaps an existing tree-sitter row at the same file/line/kind, the
15
+ * tree-sitter row is re-labeled `'scip-merge'` (precision confirmed) and
16
+ * SCIP edges target its existing id.
17
+ *
18
+ * Format support:
19
+ * - .scip : binary protobuf (the canonical SCIP format)
20
+ * - .scip.json : Seer's JSON envelope mirroring the protobuf shape. Many
21
+ * SCIP producers can dump JSON directly; the schema is also
22
+ * easy to hand-author for testing and migration scripts.
23
+ *
24
+ * The JSON envelope is the SUBSET of SCIP that Seer actually consumes — we
25
+ * don't carry hover-doc payloads or signature_documentation because Seer
26
+ * doesn't surface them. Adding more fields later is purely additive: a
27
+ * consumer that doesn't recognize a field ignores it.
28
+ */
29
+
30
+ export type ScipSymbolKind =
31
+ | 'function' | 'method' | 'constructor' | 'class'
32
+ | 'interface' | 'struct' | 'enum' | 'type' | 'variable';
33
+
34
+ export interface ScipSymbol {
35
+ /**
36
+ * Globally unique SCIP symbol id. Opaque string; the importer never parses
37
+ * it — it's just a primary key for cross-document references.
38
+ */
39
+ symbolId: string;
40
+ displayName: string;
41
+ /** Optional dotted qualified name (e.g. `auth.AuthService.login`). */
42
+ qualifiedName?: string;
43
+ kind: ScipSymbolKind;
44
+ /** Repo-relative file path. */
45
+ relativePath: string;
46
+ /** 0-indexed source range. */
47
+ range: { startLine: number; startCharacter: number; endLine: number; endCharacter: number };
48
+ signature?: string;
49
+ }
50
+
51
+ export interface ScipOccurrence {
52
+ /** SCIP symbol id being referenced. */
53
+ symbolId: string;
54
+ relativePath: string;
55
+ range: { startLine: number; startCharacter: number; endLine: number; endCharacter: number };
56
+ /**
57
+ * 'definition' for the canonical defining occurrence (one per symbol),
58
+ * 'reference' for every other use site.
59
+ */
60
+ role: 'definition' | 'reference';
61
+ }
62
+
63
+ export interface ScipDocument {
64
+ /**
65
+ * Repo-relative path the document covers. Symbol/occurrence rows can also
66
+ * carry their own relativePath, but the doc-level one is the default.
67
+ */
68
+ relativePath: string;
69
+ symbols: ScipSymbol[];
70
+ occurrences: ScipOccurrence[];
71
+ }
72
+
73
+ export interface ScipIndex {
74
+ /** Producer identifier — e.g. `scip-typescript 0.3.5`. */
75
+ tool?: string;
76
+ /** Absolute project root used by the producer (informational). */
77
+ projectRoot?: string;
78
+ /**
79
+ * Documents keyed by repo-relative path. The same shape SCIP uses, just
80
+ * flattened for ergonomic JSON authoring.
81
+ */
82
+ documents: ScipDocument[];
83
+ }
@@ -0,0 +1,216 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import crypto from 'crypto';
4
+ import { Store } from '../db/store.js';
5
+ import type { SymbolDef, SymbolKind } from '../types.js';
6
+ import { ScipIndex, ScipDocument, ScipSymbol, ScipOccurrence } from './format.js';
7
+
8
+ export interface ScipImportOptions {
9
+ /** Workspace root — used to resolve SCIP relativePaths to absolute paths. */
10
+ repoRoot: string;
11
+ /** Logger; defaults to no-op. */
12
+ log?: (msg: string) => void;
13
+ /**
14
+ * Skip ALL inserts for files that aren't already indexed by tree-sitter.
15
+ * Default true: SCIP precision is meant to enhance the existing index, not
16
+ * to introduce phantom symbols for files Seer can't see (e.g. a SCIP that
17
+ * covers `vendor/` we deliberately skipped). Set false to widen.
18
+ */
19
+ requireFileInIndex?: boolean;
20
+ }
21
+
22
+ export interface ScipImportResult {
23
+ path: string;
24
+ sha256: string;
25
+ tool: string | null;
26
+ documentsProcessed: number;
27
+ symbolsInserted: number;
28
+ symbolsMerged: number;
29
+ edgesInserted: number;
30
+ filesMissing: number;
31
+ elapsedMs: number;
32
+ }
33
+
34
+ /**
35
+ * Import a SCIP index into the Store, layering precise SCIP symbols and
36
+ * references over the existing tree-sitter graph. Tree-sitter rows are never
37
+ * deleted; SCIP symbols with the same file/line/kind/qualified-name as an
38
+ * existing row reuse its id (and the existing row is re-labeled 'scip-merge').
39
+ *
40
+ * The import is idempotent on the (path, sha256) pair: re-importing the exact
41
+ * same file is a no-op. Re-importing the same path with new content clears
42
+ * the SCIP-sourced rows for that path first.
43
+ */
44
+ export async function importScip(
45
+ scipPath: string, store: Store, options: ScipImportOptions,
46
+ ): Promise<ScipImportResult> {
47
+ const start = Date.now();
48
+ const log = options.log ?? (() => { /* */ });
49
+ const abs = path.resolve(scipPath);
50
+ if (!fs.existsSync(abs)) {
51
+ throw new Error(`SCIP index not found: ${abs}`);
52
+ }
53
+ const content = fs.readFileSync(abs);
54
+ const sha = crypto.createHash('sha256').update(content).digest('hex');
55
+
56
+ // Idempotency check — same path + sha = already imported, return a cheap
57
+ // no-op result.
58
+ if (store.hasScipImport(abs, sha)) {
59
+ log(`SCIP ${path.basename(abs)} already imported (sha ${sha.slice(0, 8)}); skipping`);
60
+ return {
61
+ path: abs, sha256: sha, tool: null,
62
+ documentsProcessed: 0, symbolsInserted: 0, symbolsMerged: 0, edgesInserted: 0,
63
+ filesMissing: 0, elapsedMs: Date.now() - start,
64
+ };
65
+ }
66
+
67
+ // Wipe SCIP rows from THIS exact path so re-imports don't accumulate.
68
+ // Other SCIP layers stay untouched — clearScipProvenance(path) is scoped
69
+ // to the path's scip_imports.id.
70
+ store.clearScipProvenance(abs);
71
+
72
+ // Currently we only parse the JSON envelope. Binary .scip support can be
73
+ // added later by piping through a protobuf decoder; the rest of the
74
+ // pipeline below stays unchanged because it works against the parsed
75
+ // ScipIndex shape.
76
+ let scip: ScipIndex;
77
+ try {
78
+ scip = JSON.parse(content.toString('utf-8')) as ScipIndex;
79
+ } catch (err) {
80
+ throw new Error(`Failed to parse SCIP JSON ${abs}: ${(err as Error).message}`);
81
+ }
82
+
83
+ // Map repo-relative paths → file_id by matching against the indexer's view.
84
+ const allFiles = store.listFiles();
85
+ const fileByRel = new Map<string, number>();
86
+ for (const f of allFiles) {
87
+ fileByRel.set(normalizePath(f.relPath), f.id);
88
+ }
89
+ const requireFileInIndex = options.requireFileInIndex ?? true;
90
+
91
+ let documentsProcessed = 0;
92
+ let symbolsInserted = 0;
93
+ let symbolsMerged = 0;
94
+ let edgesInserted = 0;
95
+ let filesMissing = 0;
96
+
97
+ // Record the import FIRST so we have an id to link every symbol/edge back
98
+ // to. Counts are zero now and patched up at the end — the row exists from
99
+ // the moment of insertion so scip_import_id foreign keys are always valid.
100
+ const scipImportId = store.recordScipImport(
101
+ abs, sha, scip.tool ?? null, scip.projectRoot ?? options.repoRoot,
102
+ 0, 0,
103
+ );
104
+
105
+ // Pass 1: insert SCIP symbols, keep a (scipSymbolId → storeSymbolId) map.
106
+ const idMap = new Map<string, number>();
107
+ // Track per-file definition occurrences so pass 2 can resolve references.
108
+ store.rawDb().exec('BEGIN');
109
+ try {
110
+ for (const doc of scip.documents) {
111
+ const rel = normalizePath(doc.relativePath);
112
+ const fileId = fileByRel.get(rel);
113
+ if (fileId == null) {
114
+ if (requireFileInIndex) {
115
+ filesMissing++;
116
+ continue;
117
+ }
118
+ }
119
+ documentsProcessed++;
120
+
121
+ const fid = fileId ?? -1;
122
+ if (fid < 0) continue;
123
+ for (const sym of doc.symbols) {
124
+ const def = scipSymbolToSymbolDef(sym);
125
+ const { id, merged } = store.insertOrMergeScipSymbol(fid, def, scipImportId);
126
+ idMap.set(sym.symbolId, id);
127
+ if (merged) symbolsMerged++;
128
+ else symbolsInserted++;
129
+ }
130
+ }
131
+
132
+ // Pass 2: insert reference edges. We need both ends in the idMap, so any
133
+ // reference whose target wasn't defined in this SCIP doc (cross-package
134
+ // refs) is skipped. For each reference occurrence inside a function/
135
+ // method's range we attribute the edge to that enclosing symbol — same
136
+ // strategy tree-sitter uses for call-edge resolution.
137
+ for (const doc of scip.documents) {
138
+ const rel = normalizePath(doc.relativePath);
139
+ const fileId = fileByRel.get(rel);
140
+ if (fileId == null) continue;
141
+
142
+ // Build a per-file ordered list of (definitionSymbolId, range) so we
143
+ // can attribute references to the smallest enclosing definition.
144
+ const localDefs: Array<{ id: number; symbolId: string; startLine: number; endLine: number }> = [];
145
+ for (const sym of doc.symbols) {
146
+ const storeId = idMap.get(sym.symbolId);
147
+ if (storeId == null) continue;
148
+ localDefs.push({
149
+ id: storeId,
150
+ symbolId: sym.symbolId,
151
+ startLine: sym.range.startLine,
152
+ endLine: sym.range.endLine,
153
+ });
154
+ }
155
+ // Sort by line range size ascending so the smallest enclosing def wins.
156
+ localDefs.sort((a, b) => (a.endLine - a.startLine) - (b.endLine - b.startLine));
157
+
158
+ for (const occ of doc.occurrences) {
159
+ if (occ.role !== 'reference') continue;
160
+ const targetId = idMap.get(occ.symbolId);
161
+ if (targetId == null) continue;
162
+ // Find smallest enclosing local definition.
163
+ let fromId: number | null = null;
164
+ for (const d of localDefs) {
165
+ if (occ.range.startLine >= d.startLine && occ.range.startLine <= d.endLine) {
166
+ fromId = d.id; break;
167
+ }
168
+ }
169
+ if (fromId == null) continue;
170
+ // Use the displayName of the target symbol so to_name stays consistent
171
+ // with tree-sitter's edge representation.
172
+ const targetSymbol = doc.symbols.find(s => s.symbolId === occ.symbolId);
173
+ const toName = targetSymbol?.displayName ?? occ.symbolId;
174
+ store.insertScipEdge(fromId, targetId, toName, 'call', occ.range.startLine, scipImportId);
175
+ edgesInserted++;
176
+ }
177
+ }
178
+ store.rawDb().exec('COMMIT');
179
+ } catch (err) {
180
+ store.rawDb().exec('ROLLBACK');
181
+ throw err;
182
+ }
183
+
184
+ // Patch the counts now that we know them — keeps the layer self-describing
185
+ // for the bundle manifest.
186
+ store.recordScipImport(
187
+ abs, sha, scip.tool ?? null, scip.projectRoot ?? options.repoRoot,
188
+ symbolsInserted + symbolsMerged, edgesInserted,
189
+ );
190
+
191
+ log(`SCIP ${path.basename(abs)}: ${documentsProcessed} docs, ${symbolsInserted} new, ${symbolsMerged} merged, ${edgesInserted} edges (${filesMissing} files missing)`);
192
+
193
+ return {
194
+ path: abs, sha256: sha, tool: scip.tool ?? null,
195
+ documentsProcessed, symbolsInserted, symbolsMerged, edgesInserted,
196
+ filesMissing, elapsedMs: Date.now() - start,
197
+ };
198
+ }
199
+
200
+ function scipSymbolToSymbolDef(sym: ScipSymbol): SymbolDef {
201
+ // SCIP doesn't carry symbol_role; assume 'definition'.
202
+ return {
203
+ name: sym.displayName,
204
+ qualifiedName: sym.qualifiedName,
205
+ kind: sym.kind as SymbolKind,
206
+ lineStart: sym.range.startLine,
207
+ lineEnd: sym.range.endLine,
208
+ colStart: sym.range.startCharacter,
209
+ colEnd: sym.range.endCharacter,
210
+ signature: sym.signature,
211
+ };
212
+ }
213
+
214
+ function normalizePath(p: string): string {
215
+ return p.replace(/\\/g, '/');
216
+ }