homegraph 0.9.9

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 (549) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +709 -0
  3. package/dist/bin/codegraph.d.ts +26 -0
  4. package/dist/bin/codegraph.d.ts.map +1 -0
  5. package/dist/bin/codegraph.js +1572 -0
  6. package/dist/bin/codegraph.js.map +1 -0
  7. package/dist/bin/homegraph.d.ts +26 -0
  8. package/dist/bin/homegraph.d.ts.map +1 -0
  9. package/dist/bin/homegraph.js +1572 -0
  10. package/dist/bin/homegraph.js.map +1 -0
  11. package/dist/bin/node-version-check.d.ts +37 -0
  12. package/dist/bin/node-version-check.d.ts.map +1 -0
  13. package/dist/bin/node-version-check.js +79 -0
  14. package/dist/bin/node-version-check.js.map +1 -0
  15. package/dist/bin/uninstall.d.ts +14 -0
  16. package/dist/bin/uninstall.d.ts.map +1 -0
  17. package/dist/bin/uninstall.js +36 -0
  18. package/dist/bin/uninstall.js.map +1 -0
  19. package/dist/context/formatter.d.ts +30 -0
  20. package/dist/context/formatter.d.ts.map +1 -0
  21. package/dist/context/formatter.js +263 -0
  22. package/dist/context/formatter.js.map +1 -0
  23. package/dist/context/index.d.ts +119 -0
  24. package/dist/context/index.d.ts.map +1 -0
  25. package/dist/context/index.js +1289 -0
  26. package/dist/context/index.js.map +1 -0
  27. package/dist/context/markers.d.ts +19 -0
  28. package/dist/context/markers.d.ts.map +1 -0
  29. package/dist/context/markers.js +22 -0
  30. package/dist/context/markers.js.map +1 -0
  31. package/dist/db/index.d.ts +101 -0
  32. package/dist/db/index.d.ts.map +1 -0
  33. package/dist/db/index.js +250 -0
  34. package/dist/db/index.js.map +1 -0
  35. package/dist/db/migrations.d.ts +44 -0
  36. package/dist/db/migrations.d.ts.map +1 -0
  37. package/dist/db/migrations.js +131 -0
  38. package/dist/db/migrations.js.map +1 -0
  39. package/dist/db/queries.d.ts +386 -0
  40. package/dist/db/queries.d.ts.map +1 -0
  41. package/dist/db/queries.js +1562 -0
  42. package/dist/db/queries.js.map +1 -0
  43. package/dist/db/schema.sql +151 -0
  44. package/dist/db/sqlite-adapter.d.ts +53 -0
  45. package/dist/db/sqlite-adapter.d.ts.map +1 -0
  46. package/dist/db/sqlite-adapter.js +117 -0
  47. package/dist/db/sqlite-adapter.js.map +1 -0
  48. package/dist/directory.d.ts +57 -0
  49. package/dist/directory.d.ts.map +1 -0
  50. package/dist/directory.js +253 -0
  51. package/dist/directory.js.map +1 -0
  52. package/dist/errors.d.ts +136 -0
  53. package/dist/errors.d.ts.map +1 -0
  54. package/dist/errors.js +219 -0
  55. package/dist/errors.js.map +1 -0
  56. package/dist/extraction/arkanalyzer-extractor.d.ts +6 -0
  57. package/dist/extraction/arkanalyzer-extractor.d.ts.map +1 -0
  58. package/dist/extraction/arkanalyzer-extractor.js +11 -0
  59. package/dist/extraction/arkanalyzer-extractor.js.map +1 -0
  60. package/dist/extraction/arkanalyzer-project.d.ts +20 -0
  61. package/dist/extraction/arkanalyzer-project.d.ts.map +1 -0
  62. package/dist/extraction/arkanalyzer-project.js +596 -0
  63. package/dist/extraction/arkanalyzer-project.js.map +1 -0
  64. package/dist/extraction/context.d.ts +12 -0
  65. package/dist/extraction/context.d.ts.map +1 -0
  66. package/dist/extraction/context.js +29 -0
  67. package/dist/extraction/context.js.map +1 -0
  68. package/dist/extraction/dfm-extractor.d.ts +31 -0
  69. package/dist/extraction/dfm-extractor.d.ts.map +1 -0
  70. package/dist/extraction/dfm-extractor.js +151 -0
  71. package/dist/extraction/dfm-extractor.js.map +1 -0
  72. package/dist/extraction/extraction-version.d.ts +25 -0
  73. package/dist/extraction/extraction-version.d.ts.map +1 -0
  74. package/dist/extraction/extraction-version.js +28 -0
  75. package/dist/extraction/extraction-version.js.map +1 -0
  76. package/dist/extraction/generated-detection.d.ts +30 -0
  77. package/dist/extraction/generated-detection.d.ts.map +1 -0
  78. package/dist/extraction/generated-detection.js +80 -0
  79. package/dist/extraction/generated-detection.js.map +1 -0
  80. package/dist/extraction/grammars.d.ts +108 -0
  81. package/dist/extraction/grammars.d.ts.map +1 -0
  82. package/dist/extraction/grammars.js +465 -0
  83. package/dist/extraction/grammars.js.map +1 -0
  84. package/dist/extraction/index.d.ts +138 -0
  85. package/dist/extraction/index.d.ts.map +1 -0
  86. package/dist/extraction/index.js +1396 -0
  87. package/dist/extraction/index.js.map +1 -0
  88. package/dist/extraction/languages/arkts.d.ts +18 -0
  89. package/dist/extraction/languages/arkts.d.ts.map +1 -0
  90. package/dist/extraction/languages/arkts.js +878 -0
  91. package/dist/extraction/languages/arkts.js.map +1 -0
  92. package/dist/extraction/languages/c-cpp.d.ts +4 -0
  93. package/dist/extraction/languages/c-cpp.d.ts.map +1 -0
  94. package/dist/extraction/languages/c-cpp.js +173 -0
  95. package/dist/extraction/languages/c-cpp.js.map +1 -0
  96. package/dist/extraction/languages/csharp.d.ts +25 -0
  97. package/dist/extraction/languages/csharp.d.ts.map +1 -0
  98. package/dist/extraction/languages/csharp.js +120 -0
  99. package/dist/extraction/languages/csharp.js.map +1 -0
  100. package/dist/extraction/languages/dart.d.ts +3 -0
  101. package/dist/extraction/languages/dart.d.ts.map +1 -0
  102. package/dist/extraction/languages/dart.js +192 -0
  103. package/dist/extraction/languages/dart.js.map +1 -0
  104. package/dist/extraction/languages/go.d.ts +3 -0
  105. package/dist/extraction/languages/go.d.ts.map +1 -0
  106. package/dist/extraction/languages/go.js +74 -0
  107. package/dist/extraction/languages/go.js.map +1 -0
  108. package/dist/extraction/languages/index.d.ts +10 -0
  109. package/dist/extraction/languages/index.d.ts.map +1 -0
  110. package/dist/extraction/languages/index.js +51 -0
  111. package/dist/extraction/languages/index.js.map +1 -0
  112. package/dist/extraction/languages/java.d.ts +3 -0
  113. package/dist/extraction/languages/java.d.ts.map +1 -0
  114. package/dist/extraction/languages/java.js +74 -0
  115. package/dist/extraction/languages/java.js.map +1 -0
  116. package/dist/extraction/languages/javascript.d.ts +3 -0
  117. package/dist/extraction/languages/javascript.d.ts.map +1 -0
  118. package/dist/extraction/languages/javascript.js +90 -0
  119. package/dist/extraction/languages/javascript.js.map +1 -0
  120. package/dist/extraction/languages/kotlin.d.ts +3 -0
  121. package/dist/extraction/languages/kotlin.d.ts.map +1 -0
  122. package/dist/extraction/languages/kotlin.js +285 -0
  123. package/dist/extraction/languages/kotlin.js.map +1 -0
  124. package/dist/extraction/languages/lua.d.ts +3 -0
  125. package/dist/extraction/languages/lua.d.ts.map +1 -0
  126. package/dist/extraction/languages/lua.js +150 -0
  127. package/dist/extraction/languages/lua.js.map +1 -0
  128. package/dist/extraction/languages/luau.d.ts +3 -0
  129. package/dist/extraction/languages/luau.d.ts.map +1 -0
  130. package/dist/extraction/languages/luau.js +37 -0
  131. package/dist/extraction/languages/luau.js.map +1 -0
  132. package/dist/extraction/languages/objc.d.ts +3 -0
  133. package/dist/extraction/languages/objc.d.ts.map +1 -0
  134. package/dist/extraction/languages/objc.js +133 -0
  135. package/dist/extraction/languages/objc.js.map +1 -0
  136. package/dist/extraction/languages/pascal.d.ts +3 -0
  137. package/dist/extraction/languages/pascal.d.ts.map +1 -0
  138. package/dist/extraction/languages/pascal.js +66 -0
  139. package/dist/extraction/languages/pascal.js.map +1 -0
  140. package/dist/extraction/languages/php.d.ts +3 -0
  141. package/dist/extraction/languages/php.d.ts.map +1 -0
  142. package/dist/extraction/languages/php.js +120 -0
  143. package/dist/extraction/languages/php.js.map +1 -0
  144. package/dist/extraction/languages/python.d.ts +3 -0
  145. package/dist/extraction/languages/python.d.ts.map +1 -0
  146. package/dist/extraction/languages/python.js +56 -0
  147. package/dist/extraction/languages/python.js.map +1 -0
  148. package/dist/extraction/languages/ruby.d.ts +3 -0
  149. package/dist/extraction/languages/ruby.d.ts.map +1 -0
  150. package/dist/extraction/languages/ruby.js +149 -0
  151. package/dist/extraction/languages/ruby.js.map +1 -0
  152. package/dist/extraction/languages/rust.d.ts +3 -0
  153. package/dist/extraction/languages/rust.d.ts.map +1 -0
  154. package/dist/extraction/languages/rust.js +113 -0
  155. package/dist/extraction/languages/rust.js.map +1 -0
  156. package/dist/extraction/languages/scala.d.ts +3 -0
  157. package/dist/extraction/languages/scala.d.ts.map +1 -0
  158. package/dist/extraction/languages/scala.js +174 -0
  159. package/dist/extraction/languages/scala.js.map +1 -0
  160. package/dist/extraction/languages/swift.d.ts +3 -0
  161. package/dist/extraction/languages/swift.d.ts.map +1 -0
  162. package/dist/extraction/languages/swift.js +91 -0
  163. package/dist/extraction/languages/swift.js.map +1 -0
  164. package/dist/extraction/languages/typescript.d.ts +3 -0
  165. package/dist/extraction/languages/typescript.d.ts.map +1 -0
  166. package/dist/extraction/languages/typescript.js +129 -0
  167. package/dist/extraction/languages/typescript.js.map +1 -0
  168. package/dist/extraction/liquid-extractor.d.ts +59 -0
  169. package/dist/extraction/liquid-extractor.d.ts.map +1 -0
  170. package/dist/extraction/liquid-extractor.js +354 -0
  171. package/dist/extraction/liquid-extractor.js.map +1 -0
  172. package/dist/extraction/mybatis-extractor.d.ts +48 -0
  173. package/dist/extraction/mybatis-extractor.d.ts.map +1 -0
  174. package/dist/extraction/mybatis-extractor.js +198 -0
  175. package/dist/extraction/mybatis-extractor.js.map +1 -0
  176. package/dist/extraction/parse-worker.d.ts +8 -0
  177. package/dist/extraction/parse-worker.d.ts.map +1 -0
  178. package/dist/extraction/parse-worker.js +94 -0
  179. package/dist/extraction/parse-worker.js.map +1 -0
  180. package/dist/extraction/razor-extractor.d.ts +42 -0
  181. package/dist/extraction/razor-extractor.d.ts.map +1 -0
  182. package/dist/extraction/razor-extractor.js +285 -0
  183. package/dist/extraction/razor-extractor.js.map +1 -0
  184. package/dist/extraction/svelte-extractor.d.ts +56 -0
  185. package/dist/extraction/svelte-extractor.d.ts.map +1 -0
  186. package/dist/extraction/svelte-extractor.js +272 -0
  187. package/dist/extraction/svelte-extractor.js.map +1 -0
  188. package/dist/extraction/tree-sitter-helpers.d.ts +28 -0
  189. package/dist/extraction/tree-sitter-helpers.d.ts.map +1 -0
  190. package/dist/extraction/tree-sitter-helpers.js +103 -0
  191. package/dist/extraction/tree-sitter-helpers.js.map +1 -0
  192. package/dist/extraction/tree-sitter-types.d.ts +210 -0
  193. package/dist/extraction/tree-sitter-types.d.ts.map +1 -0
  194. package/dist/extraction/tree-sitter-types.js +10 -0
  195. package/dist/extraction/tree-sitter-types.js.map +1 -0
  196. package/dist/extraction/tree-sitter.d.ts +455 -0
  197. package/dist/extraction/tree-sitter.d.ts.map +1 -0
  198. package/dist/extraction/tree-sitter.js +4089 -0
  199. package/dist/extraction/tree-sitter.js.map +1 -0
  200. package/dist/extraction/vue-extractor.d.ts +51 -0
  201. package/dist/extraction/vue-extractor.d.ts.map +1 -0
  202. package/dist/extraction/vue-extractor.js +251 -0
  203. package/dist/extraction/vue-extractor.js.map +1 -0
  204. package/dist/extraction/wasm/tree-sitter-c_sharp.wasm +0 -0
  205. package/dist/extraction/wasm/tree-sitter-lua.wasm +0 -0
  206. package/dist/extraction/wasm/tree-sitter-luau.wasm +0 -0
  207. package/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
  208. package/dist/extraction/wasm/tree-sitter-scala.wasm +0 -0
  209. package/dist/extraction/wasm-runtime-flags.d.ts +38 -0
  210. package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -0
  211. package/dist/extraction/wasm-runtime-flags.js +106 -0
  212. package/dist/extraction/wasm-runtime-flags.js.map +1 -0
  213. package/dist/graph/index.d.ts +8 -0
  214. package/dist/graph/index.d.ts.map +1 -0
  215. package/dist/graph/index.js +13 -0
  216. package/dist/graph/index.js.map +1 -0
  217. package/dist/graph/queries.d.ts +106 -0
  218. package/dist/graph/queries.d.ts.map +1 -0
  219. package/dist/graph/queries.js +339 -0
  220. package/dist/graph/queries.js.map +1 -0
  221. package/dist/graph/traversal.d.ts +127 -0
  222. package/dist/graph/traversal.d.ts.map +1 -0
  223. package/dist/graph/traversal.js +531 -0
  224. package/dist/graph/traversal.js.map +1 -0
  225. package/dist/index.d.ts +522 -0
  226. package/dist/index.d.ts.map +1 -0
  227. package/dist/index.js +947 -0
  228. package/dist/index.js.map +1 -0
  229. package/dist/installer/config-writer.d.ts +28 -0
  230. package/dist/installer/config-writer.d.ts.map +1 -0
  231. package/dist/installer/config-writer.js +91 -0
  232. package/dist/installer/config-writer.js.map +1 -0
  233. package/dist/installer/index.d.ts +100 -0
  234. package/dist/installer/index.d.ts.map +1 -0
  235. package/dist/installer/index.js +497 -0
  236. package/dist/installer/index.js.map +1 -0
  237. package/dist/installer/instructions-template.d.ts +18 -0
  238. package/dist/installer/instructions-template.d.ts.map +1 -0
  239. package/dist/installer/instructions-template.js +21 -0
  240. package/dist/installer/instructions-template.js.map +1 -0
  241. package/dist/installer/targets/antigravity.d.ts +57 -0
  242. package/dist/installer/targets/antigravity.d.ts.map +1 -0
  243. package/dist/installer/targets/antigravity.js +308 -0
  244. package/dist/installer/targets/antigravity.js.map +1 -0
  245. package/dist/installer/targets/claude.d.ts +56 -0
  246. package/dist/installer/targets/claude.d.ts.map +1 -0
  247. package/dist/installer/targets/claude.js +388 -0
  248. package/dist/installer/targets/claude.js.map +1 -0
  249. package/dist/installer/targets/codex.d.ts +18 -0
  250. package/dist/installer/targets/codex.d.ts.map +1 -0
  251. package/dist/installer/targets/codex.js +187 -0
  252. package/dist/installer/targets/codex.js.map +1 -0
  253. package/dist/installer/targets/cursor.d.ts +35 -0
  254. package/dist/installer/targets/cursor.d.ts.map +1 -0
  255. package/dist/installer/targets/cursor.js +254 -0
  256. package/dist/installer/targets/cursor.js.map +1 -0
  257. package/dist/installer/targets/gemini.d.ts +26 -0
  258. package/dist/installer/targets/gemini.d.ts.map +1 -0
  259. package/dist/installer/targets/gemini.js +167 -0
  260. package/dist/installer/targets/gemini.js.map +1 -0
  261. package/dist/installer/targets/hermes.d.ts +18 -0
  262. package/dist/installer/targets/hermes.d.ts.map +1 -0
  263. package/dist/installer/targets/hermes.js +359 -0
  264. package/dist/installer/targets/hermes.js.map +1 -0
  265. package/dist/installer/targets/kiro.d.ts +27 -0
  266. package/dist/installer/targets/kiro.d.ts.map +1 -0
  267. package/dist/installer/targets/kiro.js +178 -0
  268. package/dist/installer/targets/kiro.js.map +1 -0
  269. package/dist/installer/targets/opencode.d.ts +30 -0
  270. package/dist/installer/targets/opencode.d.ts.map +1 -0
  271. package/dist/installer/targets/opencode.js +237 -0
  272. package/dist/installer/targets/opencode.js.map +1 -0
  273. package/dist/installer/targets/registry.d.ts +35 -0
  274. package/dist/installer/targets/registry.d.ts.map +1 -0
  275. package/dist/installer/targets/registry.js +91 -0
  276. package/dist/installer/targets/registry.js.map +1 -0
  277. package/dist/installer/targets/shared.d.ts +77 -0
  278. package/dist/installer/targets/shared.d.ts.map +1 -0
  279. package/dist/installer/targets/shared.js +247 -0
  280. package/dist/installer/targets/shared.js.map +1 -0
  281. package/dist/installer/targets/toml.d.ts +52 -0
  282. package/dist/installer/targets/toml.d.ts.map +1 -0
  283. package/dist/installer/targets/toml.js +147 -0
  284. package/dist/installer/targets/toml.js.map +1 -0
  285. package/dist/installer/targets/types.d.ts +101 -0
  286. package/dist/installer/targets/types.d.ts.map +1 -0
  287. package/dist/installer/targets/types.js +16 -0
  288. package/dist/installer/targets/types.js.map +1 -0
  289. package/dist/mcp/daemon-paths.d.ts +46 -0
  290. package/dist/mcp/daemon-paths.d.ts.map +1 -0
  291. package/dist/mcp/daemon-paths.js +125 -0
  292. package/dist/mcp/daemon-paths.js.map +1 -0
  293. package/dist/mcp/daemon.d.ts +220 -0
  294. package/dist/mcp/daemon.d.ts.map +1 -0
  295. package/dist/mcp/daemon.js +616 -0
  296. package/dist/mcp/daemon.js.map +1 -0
  297. package/dist/mcp/engine.d.ts +105 -0
  298. package/dist/mcp/engine.d.ts.map +1 -0
  299. package/dist/mcp/engine.js +270 -0
  300. package/dist/mcp/engine.js.map +1 -0
  301. package/dist/mcp/index.d.ts +112 -0
  302. package/dist/mcp/index.d.ts.map +1 -0
  303. package/dist/mcp/index.js +478 -0
  304. package/dist/mcp/index.js.map +1 -0
  305. package/dist/mcp/ppid-watchdog.d.ts +44 -0
  306. package/dist/mcp/ppid-watchdog.d.ts.map +1 -0
  307. package/dist/mcp/ppid-watchdog.js +27 -0
  308. package/dist/mcp/ppid-watchdog.js.map +1 -0
  309. package/dist/mcp/proxy.d.ts +81 -0
  310. package/dist/mcp/proxy.d.ts.map +1 -0
  311. package/dist/mcp/proxy.js +584 -0
  312. package/dist/mcp/proxy.js.map +1 -0
  313. package/dist/mcp/server-instructions.d.ts +19 -0
  314. package/dist/mcp/server-instructions.d.ts.map +1 -0
  315. package/dist/mcp/server-instructions.js +74 -0
  316. package/dist/mcp/server-instructions.js.map +1 -0
  317. package/dist/mcp/session.d.ts +77 -0
  318. package/dist/mcp/session.d.ts.map +1 -0
  319. package/dist/mcp/session.js +294 -0
  320. package/dist/mcp/session.js.map +1 -0
  321. package/dist/mcp/tools.d.ts +413 -0
  322. package/dist/mcp/tools.d.ts.map +1 -0
  323. package/dist/mcp/tools.js +3049 -0
  324. package/dist/mcp/tools.js.map +1 -0
  325. package/dist/mcp/transport.d.ts +188 -0
  326. package/dist/mcp/transport.d.ts.map +1 -0
  327. package/dist/mcp/transport.js +343 -0
  328. package/dist/mcp/transport.js.map +1 -0
  329. package/dist/mcp/version.d.ts +19 -0
  330. package/dist/mcp/version.d.ts.map +1 -0
  331. package/dist/mcp/version.js +71 -0
  332. package/dist/mcp/version.js.map +1 -0
  333. package/dist/resolution/callback-synthesizer.d.ts +10 -0
  334. package/dist/resolution/callback-synthesizer.d.ts.map +1 -0
  335. package/dist/resolution/callback-synthesizer.js +1818 -0
  336. package/dist/resolution/callback-synthesizer.js.map +1 -0
  337. package/dist/resolution/frameworks/cargo-workspace.d.ts +18 -0
  338. package/dist/resolution/frameworks/cargo-workspace.d.ts.map +1 -0
  339. package/dist/resolution/frameworks/cargo-workspace.js +225 -0
  340. package/dist/resolution/frameworks/cargo-workspace.js.map +1 -0
  341. package/dist/resolution/frameworks/csharp.d.ts +8 -0
  342. package/dist/resolution/frameworks/csharp.d.ts.map +1 -0
  343. package/dist/resolution/frameworks/csharp.js +241 -0
  344. package/dist/resolution/frameworks/csharp.js.map +1 -0
  345. package/dist/resolution/frameworks/drupal.d.ts +51 -0
  346. package/dist/resolution/frameworks/drupal.d.ts.map +1 -0
  347. package/dist/resolution/frameworks/drupal.js +367 -0
  348. package/dist/resolution/frameworks/drupal.js.map +1 -0
  349. package/dist/resolution/frameworks/expo-modules.d.ts +3 -0
  350. package/dist/resolution/frameworks/expo-modules.d.ts.map +1 -0
  351. package/dist/resolution/frameworks/expo-modules.js +148 -0
  352. package/dist/resolution/frameworks/expo-modules.js.map +1 -0
  353. package/dist/resolution/frameworks/express.d.ts +8 -0
  354. package/dist/resolution/frameworks/express.d.ts.map +1 -0
  355. package/dist/resolution/frameworks/express.js +308 -0
  356. package/dist/resolution/frameworks/express.js.map +1 -0
  357. package/dist/resolution/frameworks/fabric.d.ts +3 -0
  358. package/dist/resolution/frameworks/fabric.d.ts.map +1 -0
  359. package/dist/resolution/frameworks/fabric.js +354 -0
  360. package/dist/resolution/frameworks/fabric.js.map +1 -0
  361. package/dist/resolution/frameworks/go.d.ts +8 -0
  362. package/dist/resolution/frameworks/go.d.ts.map +1 -0
  363. package/dist/resolution/frameworks/go.js +161 -0
  364. package/dist/resolution/frameworks/go.js.map +1 -0
  365. package/dist/resolution/frameworks/index.d.ts +48 -0
  366. package/dist/resolution/frameworks/index.d.ts.map +1 -0
  367. package/dist/resolution/frameworks/index.js +161 -0
  368. package/dist/resolution/frameworks/index.js.map +1 -0
  369. package/dist/resolution/frameworks/java.d.ts +8 -0
  370. package/dist/resolution/frameworks/java.d.ts.map +1 -0
  371. package/dist/resolution/frameworks/java.js +504 -0
  372. package/dist/resolution/frameworks/java.js.map +1 -0
  373. package/dist/resolution/frameworks/laravel.d.ts +13 -0
  374. package/dist/resolution/frameworks/laravel.d.ts.map +1 -0
  375. package/dist/resolution/frameworks/laravel.js +257 -0
  376. package/dist/resolution/frameworks/laravel.js.map +1 -0
  377. package/dist/resolution/frameworks/nestjs.d.ts +26 -0
  378. package/dist/resolution/frameworks/nestjs.d.ts.map +1 -0
  379. package/dist/resolution/frameworks/nestjs.js +698 -0
  380. package/dist/resolution/frameworks/nestjs.js.map +1 -0
  381. package/dist/resolution/frameworks/play.d.ts +19 -0
  382. package/dist/resolution/frameworks/play.d.ts.map +1 -0
  383. package/dist/resolution/frameworks/play.js +111 -0
  384. package/dist/resolution/frameworks/play.js.map +1 -0
  385. package/dist/resolution/frameworks/python.d.ts +10 -0
  386. package/dist/resolution/frameworks/python.d.ts.map +1 -0
  387. package/dist/resolution/frameworks/python.js +400 -0
  388. package/dist/resolution/frameworks/python.js.map +1 -0
  389. package/dist/resolution/frameworks/react-native.d.ts +3 -0
  390. package/dist/resolution/frameworks/react-native.d.ts.map +1 -0
  391. package/dist/resolution/frameworks/react-native.js +410 -0
  392. package/dist/resolution/frameworks/react-native.js.map +1 -0
  393. package/dist/resolution/frameworks/react.d.ts +8 -0
  394. package/dist/resolution/frameworks/react.d.ts.map +1 -0
  395. package/dist/resolution/frameworks/react.js +365 -0
  396. package/dist/resolution/frameworks/react.js.map +1 -0
  397. package/dist/resolution/frameworks/ruby.d.ts +8 -0
  398. package/dist/resolution/frameworks/ruby.d.ts.map +1 -0
  399. package/dist/resolution/frameworks/ruby.js +302 -0
  400. package/dist/resolution/frameworks/ruby.js.map +1 -0
  401. package/dist/resolution/frameworks/rust.d.ts +8 -0
  402. package/dist/resolution/frameworks/rust.d.ts.map +1 -0
  403. package/dist/resolution/frameworks/rust.js +304 -0
  404. package/dist/resolution/frameworks/rust.js.map +1 -0
  405. package/dist/resolution/frameworks/svelte.d.ts +9 -0
  406. package/dist/resolution/frameworks/svelte.d.ts.map +1 -0
  407. package/dist/resolution/frameworks/svelte.js +249 -0
  408. package/dist/resolution/frameworks/svelte.js.map +1 -0
  409. package/dist/resolution/frameworks/swift-objc.d.ts +37 -0
  410. package/dist/resolution/frameworks/swift-objc.d.ts.map +1 -0
  411. package/dist/resolution/frameworks/swift-objc.js +252 -0
  412. package/dist/resolution/frameworks/swift-objc.js.map +1 -0
  413. package/dist/resolution/frameworks/swift.d.ts +10 -0
  414. package/dist/resolution/frameworks/swift.d.ts.map +1 -0
  415. package/dist/resolution/frameworks/swift.js +400 -0
  416. package/dist/resolution/frameworks/swift.js.map +1 -0
  417. package/dist/resolution/frameworks/vue.d.ts +9 -0
  418. package/dist/resolution/frameworks/vue.d.ts.map +1 -0
  419. package/dist/resolution/frameworks/vue.js +306 -0
  420. package/dist/resolution/frameworks/vue.js.map +1 -0
  421. package/dist/resolution/go-module.d.ts +26 -0
  422. package/dist/resolution/go-module.d.ts.map +1 -0
  423. package/dist/resolution/go-module.js +78 -0
  424. package/dist/resolution/go-module.js.map +1 -0
  425. package/dist/resolution/import-resolver.d.ts +68 -0
  426. package/dist/resolution/import-resolver.d.ts.map +1 -0
  427. package/dist/resolution/import-resolver.js +1726 -0
  428. package/dist/resolution/import-resolver.js.map +1 -0
  429. package/dist/resolution/index.d.ts +159 -0
  430. package/dist/resolution/index.d.ts.map +1 -0
  431. package/dist/resolution/index.js +1025 -0
  432. package/dist/resolution/index.js.map +1 -0
  433. package/dist/resolution/lru-cache.d.ts +24 -0
  434. package/dist/resolution/lru-cache.d.ts.map +1 -0
  435. package/dist/resolution/lru-cache.js +62 -0
  436. package/dist/resolution/lru-cache.js.map +1 -0
  437. package/dist/resolution/name-matcher.d.ts +52 -0
  438. package/dist/resolution/name-matcher.d.ts.map +1 -0
  439. package/dist/resolution/name-matcher.js +707 -0
  440. package/dist/resolution/name-matcher.js.map +1 -0
  441. package/dist/resolution/path-aliases.d.ts +68 -0
  442. package/dist/resolution/path-aliases.d.ts.map +1 -0
  443. package/dist/resolution/path-aliases.js +238 -0
  444. package/dist/resolution/path-aliases.js.map +1 -0
  445. package/dist/resolution/strip-comments.d.ts +27 -0
  446. package/dist/resolution/strip-comments.d.ts.map +1 -0
  447. package/dist/resolution/strip-comments.js +441 -0
  448. package/dist/resolution/strip-comments.js.map +1 -0
  449. package/dist/resolution/swift-objc-bridge.d.ts +134 -0
  450. package/dist/resolution/swift-objc-bridge.d.ts.map +1 -0
  451. package/dist/resolution/swift-objc-bridge.js +256 -0
  452. package/dist/resolution/swift-objc-bridge.js.map +1 -0
  453. package/dist/resolution/types.d.ts +216 -0
  454. package/dist/resolution/types.d.ts.map +1 -0
  455. package/dist/resolution/types.js +8 -0
  456. package/dist/resolution/types.js.map +1 -0
  457. package/dist/resolution/workspace-packages.d.ts +48 -0
  458. package/dist/resolution/workspace-packages.d.ts.map +1 -0
  459. package/dist/resolution/workspace-packages.js +208 -0
  460. package/dist/resolution/workspace-packages.js.map +1 -0
  461. package/dist/search/query-parser.d.ts +57 -0
  462. package/dist/search/query-parser.d.ts.map +1 -0
  463. package/dist/search/query-parser.js +177 -0
  464. package/dist/search/query-parser.js.map +1 -0
  465. package/dist/search/query-utils.d.ts +71 -0
  466. package/dist/search/query-utils.d.ts.map +1 -0
  467. package/dist/search/query-utils.js +380 -0
  468. package/dist/search/query-utils.js.map +1 -0
  469. package/dist/sync/git-hooks.d.ts +45 -0
  470. package/dist/sync/git-hooks.d.ts.map +1 -0
  471. package/dist/sync/git-hooks.js +225 -0
  472. package/dist/sync/git-hooks.js.map +1 -0
  473. package/dist/sync/index.d.ts +19 -0
  474. package/dist/sync/index.d.ts.map +1 -0
  475. package/dist/sync/index.js +35 -0
  476. package/dist/sync/index.js.map +1 -0
  477. package/dist/sync/watch-policy.d.ts +48 -0
  478. package/dist/sync/watch-policy.d.ts.map +1 -0
  479. package/dist/sync/watch-policy.js +124 -0
  480. package/dist/sync/watch-policy.js.map +1 -0
  481. package/dist/sync/watcher.d.ts +283 -0
  482. package/dist/sync/watcher.d.ts.map +1 -0
  483. package/dist/sync/watcher.js +606 -0
  484. package/dist/sync/watcher.js.map +1 -0
  485. package/dist/sync/worktree.d.ts +54 -0
  486. package/dist/sync/worktree.d.ts.map +1 -0
  487. package/dist/sync/worktree.js +137 -0
  488. package/dist/sync/worktree.js.map +1 -0
  489. package/dist/types.d.ts +377 -0
  490. package/dist/types.d.ts.map +1 -0
  491. package/dist/types.js +80 -0
  492. package/dist/types.js.map +1 -0
  493. package/dist/ui/glyphs.d.ts +42 -0
  494. package/dist/ui/glyphs.d.ts.map +1 -0
  495. package/dist/ui/glyphs.js +78 -0
  496. package/dist/ui/glyphs.js.map +1 -0
  497. package/dist/ui/shimmer-progress.d.ts +11 -0
  498. package/dist/ui/shimmer-progress.d.ts.map +1 -0
  499. package/dist/ui/shimmer-progress.js +90 -0
  500. package/dist/ui/shimmer-progress.js.map +1 -0
  501. package/dist/ui/shimmer-worker.d.ts +2 -0
  502. package/dist/ui/shimmer-worker.d.ts.map +1 -0
  503. package/dist/ui/shimmer-worker.js +118 -0
  504. package/dist/ui/shimmer-worker.js.map +1 -0
  505. package/dist/ui/types.d.ts +17 -0
  506. package/dist/ui/types.d.ts.map +1 -0
  507. package/dist/ui/types.js +3 -0
  508. package/dist/ui/types.js.map +1 -0
  509. package/dist/upgrade/index.d.ts +132 -0
  510. package/dist/upgrade/index.d.ts.map +1 -0
  511. package/dist/upgrade/index.js +462 -0
  512. package/dist/upgrade/index.js.map +1 -0
  513. package/dist/utils.d.ts +205 -0
  514. package/dist/utils.d.ts.map +1 -0
  515. package/dist/utils.js +549 -0
  516. package/dist/utils.js.map +1 -0
  517. package/package.json +57 -0
  518. package/scripts/add-lang/bench.sh +60 -0
  519. package/scripts/add-lang/check-grammar.mjs +75 -0
  520. package/scripts/add-lang/dump-ast.mjs +103 -0
  521. package/scripts/add-lang/verify-extraction.mjs +70 -0
  522. package/scripts/agent-eval/arms-F.sh +21 -0
  523. package/scripts/agent-eval/arms-matrix.sh +37 -0
  524. package/scripts/agent-eval/audit.sh +68 -0
  525. package/scripts/agent-eval/bench-readme.sh +28 -0
  526. package/scripts/agent-eval/bench-why-repo.sh +22 -0
  527. package/scripts/agent-eval/block-read-hook.sh +19 -0
  528. package/scripts/agent-eval/hook-settings.json +15 -0
  529. package/scripts/agent-eval/itrun.sh +120 -0
  530. package/scripts/agent-eval/parse-arms.mjs +116 -0
  531. package/scripts/agent-eval/parse-bench-readme.mjs +84 -0
  532. package/scripts/agent-eval/parse-run.mjs +45 -0
  533. package/scripts/agent-eval/parse-session.mjs +93 -0
  534. package/scripts/agent-eval/probe-context.mjs +21 -0
  535. package/scripts/agent-eval/probe-explore.mjs +40 -0
  536. package/scripts/agent-eval/probe-node.mjs +20 -0
  537. package/scripts/agent-eval/probe-sweep.mjs +119 -0
  538. package/scripts/agent-eval/probe-trace.mjs +20 -0
  539. package/scripts/agent-eval/run-agent.sh +34 -0
  540. package/scripts/agent-eval/run-all.sh +67 -0
  541. package/scripts/agent-eval/run-arms.sh +56 -0
  542. package/scripts/agent-eval/seq-matrix.mjs +137 -0
  543. package/scripts/build-bundle.sh +118 -0
  544. package/scripts/extract-release-notes.mjs +130 -0
  545. package/scripts/local-install.sh +41 -0
  546. package/scripts/npm-sdk.js +75 -0
  547. package/scripts/npm-shim.js +246 -0
  548. package/scripts/pack-npm.sh +119 -0
  549. package/scripts/prepare-release.mjs +270 -0
@@ -0,0 +1,1025 @@
1
+ "use strict";
2
+ /**
3
+ * Reference Resolution Orchestrator
4
+ *
5
+ * Coordinates all reference resolution strategies.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
41
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
42
+ };
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.ReferenceResolver = void 0;
45
+ exports.createResolver = createResolver;
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ const name_matcher_1 = require("./name-matcher");
49
+ const import_resolver_1 = require("./import-resolver");
50
+ const frameworks_1 = require("./frameworks");
51
+ const callback_synthesizer_1 = require("./callback-synthesizer");
52
+ const path_aliases_1 = require("./path-aliases");
53
+ const go_module_1 = require("./go-module");
54
+ const workspace_packages_1 = require("./workspace-packages");
55
+ const errors_1 = require("../errors");
56
+ const lru_cache_1 = require("./lru-cache");
57
+ /**
58
+ * Cache size limits. Each per-resolver cache is bounded so memory
59
+ * stays flat on large codebases (20k+ files). Sizes were chosen to
60
+ * cover the working set for typical resolution batches without
61
+ * exceeding a few hundred MB worst-case. Override via the env var
62
+ * `HOMEGRAPH_RESOLVER_CACHE_SIZE` (single integer applied to all
63
+ * caches) when tuning for very large or very small projects.
64
+ */
65
+ const DEFAULT_CACHE_LIMIT = 5_000;
66
+ function resolveCacheLimit() {
67
+ const raw = process.env.HOMEGRAPH_RESOLVER_CACHE_SIZE;
68
+ if (!raw)
69
+ return DEFAULT_CACHE_LIMIT;
70
+ const parsed = Number.parseInt(raw, 10);
71
+ if (Number.isFinite(parsed) && parsed > 0)
72
+ return parsed;
73
+ return DEFAULT_CACHE_LIMIT;
74
+ }
75
+ // Re-export types
76
+ __exportStar(require("./types"), exports);
77
+ // Pre-built Sets for O(1) built-in lookups (allocated once, shared across all instances)
78
+ const JS_BUILT_INS = new Set([
79
+ 'console', 'window', 'document', 'global', 'process',
80
+ 'Promise', 'Array', 'Object', 'String', 'Number', 'Boolean',
81
+ 'Date', 'Math', 'JSON', 'RegExp', 'Error', 'Map', 'Set',
82
+ 'setTimeout', 'setInterval', 'clearTimeout', 'clearInterval',
83
+ 'fetch', 'require', 'module', 'exports', '__dirname', '__filename',
84
+ ]);
85
+ const REACT_HOOKS = new Set([
86
+ 'useState', 'useEffect', 'useContext', 'useReducer', 'useCallback',
87
+ 'useMemo', 'useRef', 'useLayoutEffect', 'useImperativeHandle', 'useDebugValue',
88
+ ]);
89
+ const PYTHON_BUILT_INS = new Set([
90
+ 'print', 'len', 'range', 'str', 'int', 'float', 'list', 'dict', 'set', 'tuple',
91
+ 'open', 'input', 'type', 'isinstance', 'hasattr', 'getattr', 'setattr',
92
+ 'super', 'self', 'cls', 'None', 'True', 'False',
93
+ ]);
94
+ const PYTHON_BUILT_IN_TYPES = new Set([
95
+ 'list', 'dict', 'set', 'tuple', 'str', 'int', 'float', 'bool',
96
+ 'bytes', 'bytearray', 'frozenset', 'object', 'super',
97
+ ]);
98
+ const PYTHON_BUILT_IN_METHODS = new Set([
99
+ 'append', 'extend', 'insert', 'remove', 'pop', 'clear', 'sort', 'reverse', 'copy',
100
+ 'update', 'keys', 'values', 'items', 'get',
101
+ 'add', 'discard', 'union', 'intersection', 'difference',
102
+ 'split', 'join', 'strip', 'lstrip', 'rstrip', 'replace', 'lower', 'upper',
103
+ 'startswith', 'endswith', 'find', 'index', 'count', 'encode', 'decode',
104
+ 'format', 'isdigit', 'isalpha', 'isalnum',
105
+ 'read', 'write', 'readline', 'readlines', 'close', 'flush', 'seek',
106
+ ]);
107
+ const GO_STDLIB_PACKAGES = new Set([
108
+ 'fmt', 'os', 'io', 'net', 'http', 'log', 'math', 'sort', 'sync',
109
+ 'time', 'path', 'bytes', 'strings', 'strconv', 'errors', 'context',
110
+ 'json', 'xml', 'csv', 'html', 'template', 'regexp', 'reflect',
111
+ 'runtime', 'testing', 'flag', 'bufio', 'crypto', 'encoding',
112
+ 'filepath', 'hash', 'mime', 'rand', 'signal', 'sql', 'syscall',
113
+ 'unicode', 'unsafe', 'atomic', 'binary', 'debug', 'exec', 'heap',
114
+ 'ring', 'scanner', 'tar', 'zip', 'gzip', 'zlib', 'tls', 'url',
115
+ 'user', 'pprof', 'trace', 'ast', 'build', 'parser', 'printer',
116
+ 'token', 'types', 'cgo', 'plugin', 'race', 'ioutil',
117
+ // Kubernetes-common stdlib aliases
118
+ 'utilruntime', 'utilwait', 'utilnet',
119
+ ]);
120
+ const GO_BUILT_INS = new Set([
121
+ 'make', 'new', 'len', 'cap', 'append', 'copy', 'delete', 'close',
122
+ 'panic', 'recover', 'print', 'println', 'complex', 'real', 'imag',
123
+ 'error', 'nil', 'true', 'false', 'iota',
124
+ 'int', 'int8', 'int16', 'int32', 'int64',
125
+ 'uint', 'uint8', 'uint16', 'uint32', 'uint64', 'uintptr',
126
+ 'float32', 'float64', 'complex64', 'complex128',
127
+ 'string', 'bool', 'byte', 'rune', 'any',
128
+ ]);
129
+ const PASCAL_UNIT_PREFIXES = [
130
+ 'System.', 'Winapi.', 'Vcl.', 'Fmx.', 'Data.', 'Datasnap.',
131
+ 'Soap.', 'Xml.', 'Web.', 'REST.', 'FireDAC.', 'IBX.',
132
+ 'IdHTTP', 'IdTCP', 'IdSSL',
133
+ ];
134
+ const PASCAL_BUILT_INS = new Set([
135
+ 'System', 'SysUtils', 'Classes', 'Types', 'Variants', 'StrUtils',
136
+ 'Math', 'DateUtils', 'IOUtils', 'Generics.Collections', 'Generics.Defaults',
137
+ 'Rtti', 'TypInfo', 'SyncObjs', 'RegularExpressions',
138
+ 'SysInit', 'Windows', 'Messages', 'Graphics', 'Controls', 'Forms',
139
+ 'Dialogs', 'StdCtrls', 'ExtCtrls', 'ComCtrls', 'Menus', 'ActnList',
140
+ 'WriteLn', 'Write', 'ReadLn', 'Read', 'Inc', 'Dec', 'Ord', 'Chr',
141
+ 'Length', 'SetLength', 'High', 'Low', 'Assigned', 'FreeAndNil',
142
+ 'Format', 'IntToStr', 'StrToInt', 'FloatToStr', 'StrToFloat',
143
+ 'Trim', 'UpperCase', 'LowerCase', 'Pos', 'Copy', 'Delete', 'Insert',
144
+ 'Now', 'Date', 'Time', 'DateToStr', 'StrToDate',
145
+ 'Raise', 'Exit', 'Break', 'Continue', 'Abort',
146
+ 'True', 'False', 'nil', 'Self', 'Result',
147
+ 'Create', 'Destroy', 'Free',
148
+ 'TObject', 'TComponent', 'TPersistent', 'TInterfacedObject',
149
+ 'TList', 'TStringList', 'TStrings', 'TStream', 'TMemoryStream', 'TFileStream',
150
+ 'Exception', 'EAbort', 'EConvertError', 'EAccessViolation',
151
+ 'IInterface', 'IUnknown',
152
+ ]);
153
+ const C_BUILT_INS = new Set([
154
+ // Standard C library functions
155
+ 'printf', 'fprintf', 'sprintf', 'snprintf', 'scanf', 'fscanf', 'sscanf',
156
+ 'malloc', 'calloc', 'realloc', 'free',
157
+ 'memcpy', 'memmove', 'memset', 'memcmp', 'memchr',
158
+ 'strlen', 'strcpy', 'strncpy', 'strcat', 'strncat', 'strcmp', 'strncmp',
159
+ 'strstr', 'strchr', 'strrchr', 'strtok', 'strdup',
160
+ 'fopen', 'fclose', 'fread', 'fwrite', 'fgets', 'fputs', 'fputc', 'fgetc',
161
+ 'feof', 'ferror', 'fflush', 'fseek', 'ftell', 'rewind',
162
+ 'exit', 'abort', 'atexit', 'atoi', 'atol', 'atof', 'strtol', 'strtoul', 'strtod',
163
+ 'qsort', 'bsearch',
164
+ 'abs', 'labs', 'rand', 'srand',
165
+ 'sin', 'cos', 'tan', 'sqrt', 'pow', 'log', 'log10', 'exp', 'ceil', 'floor', 'fabs',
166
+ 'time', 'clock', 'difftime', 'mktime', 'localtime', 'gmtime', 'strftime', 'asctime',
167
+ 'assert', 'errno',
168
+ 'perror', 'remove', 'rename', 'tmpfile', 'tmpnam',
169
+ 'getenv', 'system',
170
+ 'signal', 'raise',
171
+ 'setjmp', 'longjmp',
172
+ 'va_start', 'va_end', 'va_arg', 'va_copy',
173
+ 'NULL', 'EOF', 'BUFSIZ', 'FILENAME_MAX', 'RAND_MAX', 'EXIT_SUCCESS', 'EXIT_FAILURE',
174
+ 'size_t', 'ptrdiff_t', 'wchar_t', 'intptr_t', 'uintptr_t',
175
+ 'int8_t', 'int16_t', 'int32_t', 'int64_t',
176
+ 'uint8_t', 'uint16_t', 'uint32_t', 'uint64_t',
177
+ 'FILE',
178
+ // POSIX additions commonly seen
179
+ 'stat', 'lstat', 'fstat', 'open', 'close', 'read', 'write', 'pipe',
180
+ 'fork', 'exec', 'waitpid', 'getpid', 'getppid', 'kill', 'sleep', 'usleep',
181
+ 'pthread_create', 'pthread_join', 'pthread_mutex_lock', 'pthread_mutex_unlock',
182
+ 'dlopen', 'dlsym', 'dlclose',
183
+ ]);
184
+ const CPP_BUILT_INS = new Set([
185
+ // iostream objects (often used without std:: prefix via using)
186
+ 'cout', 'cin', 'cerr', 'clog', 'endl', 'flush', 'ws',
187
+ 'std', // the namespace itself when used as std::something
188
+ // Common C++ keywords that leak as references
189
+ 'nullptr', 'true', 'false', 'this', 'sizeof', 'alignof', 'typeid',
190
+ 'static_cast', 'dynamic_cast', 'reinterpret_cast', 'const_cast',
191
+ 'make_unique', 'make_shared', 'make_pair',
192
+ 'move', 'forward', 'swap',
193
+ ]);
194
+ /**
195
+ * Reference Resolver
196
+ *
197
+ * Orchestrates reference resolution using multiple strategies.
198
+ */
199
+ class ReferenceResolver {
200
+ projectRoot;
201
+ queries;
202
+ context;
203
+ frameworks = [];
204
+ // Per-`.razor`/`.cshtml`-file `@using` namespace set (own directives + folder
205
+ // `_Imports.razor`, cascading to the project root). Used to disambiguate a
206
+ // markup type ref to the right C# namespace.
207
+ razorUsingsCache = new Map();
208
+ // All per-resolver caches are LRU-bounded. Previously these were
209
+ // unbounded Maps that grew with every distinct lookup and OOM'd on
210
+ // codebases with 20k+ files (see issue: unbounded cache growth).
211
+ nodeCache; // per-file node cache
212
+ fileCache; // per-file content cache
213
+ importMappingCache;
214
+ reExportCache;
215
+ nameCache; // name → nodes cache
216
+ lowerNameCache; // lower(name) → nodes cache
217
+ qualifiedNameCache; // qualified_name → nodes cache
218
+ knownNames = null; // all known symbol names for fast pre-filtering
219
+ knownFiles = null;
220
+ cachesWarmed = false;
221
+ // tsconfig/jsconfig path-alias map. `undefined` = not yet computed,
222
+ // `null` = computed and absent. Treated as immutable for the
223
+ // resolver's lifetime; callers re-create the resolver if config changes.
224
+ projectAliases = undefined;
225
+ // go.mod module path. Same lazy/immutable convention as projectAliases.
226
+ goModule = undefined;
227
+ // Monorepo workspace member packages. Same lazy/immutable convention.
228
+ workspacePackages = undefined;
229
+ constructor(projectRoot, queries) {
230
+ this.projectRoot = projectRoot;
231
+ this.queries = queries;
232
+ const limit = resolveCacheLimit();
233
+ // The content cache is heavier (full file text), so we give it a
234
+ // smaller budget than the metadata caches.
235
+ const contentLimit = Math.max(64, Math.floor(limit / 5));
236
+ this.nodeCache = new lru_cache_1.LRUCache(limit);
237
+ this.fileCache = new lru_cache_1.LRUCache(contentLimit);
238
+ this.importMappingCache = new lru_cache_1.LRUCache(limit);
239
+ this.reExportCache = new lru_cache_1.LRUCache(limit);
240
+ this.nameCache = new lru_cache_1.LRUCache(limit);
241
+ this.lowerNameCache = new lru_cache_1.LRUCache(limit);
242
+ this.qualifiedNameCache = new lru_cache_1.LRUCache(limit);
243
+ this.context = this.createContext();
244
+ }
245
+ /**
246
+ * Initialize the resolver (detect frameworks, etc.)
247
+ */
248
+ initialize() {
249
+ this.frameworks = (0, frameworks_1.detectFrameworks)(this.context);
250
+ this.clearCaches();
251
+ }
252
+ /**
253
+ * Run each framework resolver's cross-file finalization pass and persist
254
+ * the returned node updates. Idempotent — safe to call after every indexAll
255
+ * and every incremental sync. Returns the number of nodes updated.
256
+ *
257
+ * Caches are cleared before/after so the post-extract pass sees fresh DB
258
+ * state and downstream queries see the updated names.
259
+ */
260
+ runPostExtract() {
261
+ let updated = 0;
262
+ this.clearCaches();
263
+ for (const fw of this.frameworks) {
264
+ if (!fw.postExtract)
265
+ continue;
266
+ try {
267
+ const nodes = fw.postExtract(this.context);
268
+ for (const node of nodes) {
269
+ this.queries.updateNode(node);
270
+ updated++;
271
+ }
272
+ }
273
+ catch (err) {
274
+ (0, errors_1.logDebug)(`Framework '${fw.name}' postExtract failed`, {
275
+ error: err instanceof Error ? err.message : String(err),
276
+ });
277
+ }
278
+ }
279
+ if (updated > 0)
280
+ this.clearCaches();
281
+ return updated;
282
+ }
283
+ /**
284
+ * Pre-build lightweight caches for resolution.
285
+ * Node lookups are now handled by indexed SQLite queries instead of
286
+ * loading all nodes into memory (which caused OOM on large codebases).
287
+ * We cache the set of known symbol names for fast pre-filtering.
288
+ */
289
+ warmCaches() {
290
+ if (this.cachesWarmed)
291
+ return;
292
+ // Only cache the set of known file paths (lightweight string set)
293
+ this.knownFiles = new Set(this.queries.getAllFilePaths());
294
+ // Cache all distinct symbol names for fast pre-filtering (just strings, not full nodes)
295
+ this.knownNames = new Set(this.queries.getAllNodeNames());
296
+ this.cachesWarmed = true;
297
+ }
298
+ /**
299
+ * Clear internal caches
300
+ */
301
+ clearCaches() {
302
+ this.nodeCache.clear();
303
+ this.fileCache.clear();
304
+ this.importMappingCache.clear();
305
+ this.reExportCache.clear();
306
+ this.nameCache.clear();
307
+ this.lowerNameCache.clear();
308
+ this.qualifiedNameCache.clear();
309
+ this.knownNames = null;
310
+ this.knownFiles = null;
311
+ this.cachesWarmed = false;
312
+ }
313
+ /**
314
+ * Create the resolution context
315
+ */
316
+ createContext() {
317
+ return {
318
+ getNodesInFile: (filePath) => {
319
+ if (!this.nodeCache.has(filePath)) {
320
+ this.nodeCache.set(filePath, this.queries.getNodesByFile(filePath));
321
+ }
322
+ return this.nodeCache.get(filePath);
323
+ },
324
+ getNodesByName: (name) => {
325
+ const cached = this.nameCache.get(name);
326
+ if (cached !== undefined)
327
+ return cached;
328
+ const result = this.queries.getNodesByName(name);
329
+ this.nameCache.set(name, result);
330
+ return result;
331
+ },
332
+ getNodesByQualifiedName: (qualifiedName) => {
333
+ const cached = this.qualifiedNameCache.get(qualifiedName);
334
+ if (cached !== undefined)
335
+ return cached;
336
+ const result = this.queries.getNodesByQualifiedNameExact(qualifiedName);
337
+ this.qualifiedNameCache.set(qualifiedName, result);
338
+ return result;
339
+ },
340
+ getNodesByKind: (kind) => {
341
+ return this.queries.getNodesByKind(kind);
342
+ },
343
+ fileExists: (filePath) => {
344
+ // Check pre-built known files set first (O(1))
345
+ if (this.knownFiles) {
346
+ const normalized = filePath.replace(/\\/g, '/');
347
+ if (this.knownFiles.has(filePath) || this.knownFiles.has(normalized)) {
348
+ return true;
349
+ }
350
+ }
351
+ // Fall back to filesystem for files not yet indexed
352
+ const fullPath = path.join(this.projectRoot, filePath);
353
+ try {
354
+ return fs.existsSync(fullPath);
355
+ }
356
+ catch (error) {
357
+ (0, errors_1.logDebug)('Error checking file existence', { filePath, error: String(error) });
358
+ return false;
359
+ }
360
+ },
361
+ readFile: (filePath) => {
362
+ if (this.fileCache.has(filePath)) {
363
+ return this.fileCache.get(filePath);
364
+ }
365
+ const fullPath = path.join(this.projectRoot, filePath);
366
+ try {
367
+ const content = fs.readFileSync(fullPath, 'utf-8');
368
+ this.fileCache.set(filePath, content);
369
+ return content;
370
+ }
371
+ catch (error) {
372
+ (0, errors_1.logDebug)('Failed to read file for resolution', { filePath, error: String(error) });
373
+ this.fileCache.set(filePath, null);
374
+ return null;
375
+ }
376
+ },
377
+ getProjectRoot: () => this.projectRoot,
378
+ getAllFiles: () => {
379
+ return this.queries.getAllFilePaths();
380
+ },
381
+ listDirectories: (relativePath) => {
382
+ const target = relativePath === '.' || relativePath === ''
383
+ ? this.projectRoot
384
+ : path.join(this.projectRoot, relativePath);
385
+ try {
386
+ return fs
387
+ .readdirSync(target, { withFileTypes: true })
388
+ .filter((entry) => entry.isDirectory())
389
+ .map((entry) => entry.name);
390
+ }
391
+ catch (error) {
392
+ (0, errors_1.logDebug)('Failed to list directory for resolution', {
393
+ relativePath,
394
+ error: String(error),
395
+ });
396
+ return [];
397
+ }
398
+ },
399
+ getNodesByLowerName: (lowerName) => {
400
+ const cached = this.lowerNameCache.get(lowerName);
401
+ if (cached !== undefined)
402
+ return cached;
403
+ const result = this.queries.getNodesByLowerName(lowerName);
404
+ this.lowerNameCache.set(lowerName, result);
405
+ return result;
406
+ },
407
+ getImportMappings: (filePath, language) => {
408
+ const cacheKey = filePath;
409
+ const cached = this.importMappingCache.get(cacheKey);
410
+ if (cached)
411
+ return cached;
412
+ const content = this.context.readFile(filePath);
413
+ if (!content) {
414
+ this.importMappingCache.set(cacheKey, []);
415
+ return [];
416
+ }
417
+ const mappings = (0, import_resolver_1.extractImportMappings)(filePath, content, language);
418
+ this.importMappingCache.set(cacheKey, mappings);
419
+ return mappings;
420
+ },
421
+ getProjectAliases: () => {
422
+ if (this.projectAliases === undefined) {
423
+ this.projectAliases = (0, path_aliases_1.loadProjectAliases)(this.projectRoot);
424
+ }
425
+ return this.projectAliases;
426
+ },
427
+ getGoModule: () => {
428
+ if (this.goModule === undefined) {
429
+ this.goModule = (0, go_module_1.loadGoModule)(this.projectRoot);
430
+ }
431
+ return this.goModule;
432
+ },
433
+ getWorkspacePackages: () => {
434
+ if (this.workspacePackages === undefined) {
435
+ this.workspacePackages = (0, workspace_packages_1.loadWorkspacePackages)(this.projectRoot);
436
+ }
437
+ return this.workspacePackages;
438
+ },
439
+ getReExports: (filePath, language) => {
440
+ const cached = this.reExportCache.get(filePath);
441
+ if (cached)
442
+ return cached;
443
+ const content = this.context.readFile(filePath);
444
+ if (!content) {
445
+ this.reExportCache.set(filePath, []);
446
+ return [];
447
+ }
448
+ // Re-exports are a JS/TS-only construct, and what matters is the
449
+ // BARREL file's own language — not the consuming reference's. A
450
+ // `.svelte`/`.vue` consumer threads its own language down the
451
+ // re-export chase, which would make extractReExports() bail on a
452
+ // `.ts` index barrel and silently break the chain (#629). Re-key
453
+ // the parse on the barrel's extension so the chase works no matter
454
+ // what kind of file imports through it.
455
+ const isJsFamily = /\.(?:d\.ts|[cm]?tsx?|[cm]?jsx?)$/i.test(filePath);
456
+ const reExports = (0, import_resolver_1.extractReExports)(content, isJsFamily ? 'typescript' : language);
457
+ this.reExportCache.set(filePath, reExports);
458
+ return reExports;
459
+ },
460
+ getCppIncludeDirs: () => {
461
+ return (0, import_resolver_1.loadCppIncludeDirs)(this.projectRoot);
462
+ },
463
+ };
464
+ }
465
+ /**
466
+ * Resolve all unresolved references
467
+ */
468
+ resolveAll(unresolvedRefs, onProgress) {
469
+ // Pre-load all nodes into memory for fast lookups
470
+ this.warmCaches();
471
+ const resolved = [];
472
+ const unresolved = [];
473
+ const byMethod = {};
474
+ // Convert to our internal format, using denormalized fields when available
475
+ const refs = unresolvedRefs.map((ref) => ({
476
+ fromNodeId: ref.fromNodeId,
477
+ referenceName: ref.referenceName,
478
+ referenceKind: ref.referenceKind,
479
+ line: ref.line,
480
+ column: ref.column,
481
+ filePath: ref.filePath || this.getFilePathFromNodeId(ref.fromNodeId),
482
+ language: ref.language || this.getLanguageFromNodeId(ref.fromNodeId),
483
+ }));
484
+ const total = refs.length;
485
+ let lastReportedPercent = -1;
486
+ for (let i = 0; i < refs.length; i++) {
487
+ const ref = refs[i]; // Array index is guaranteed to be in bounds
488
+ const result = this.resolveOne(ref);
489
+ if (result) {
490
+ resolved.push(result);
491
+ byMethod[result.resolvedBy] = (byMethod[result.resolvedBy] || 0) + 1;
492
+ }
493
+ else {
494
+ unresolved.push(ref);
495
+ }
496
+ // Report progress every 1% to avoid too many updates
497
+ if (onProgress) {
498
+ const currentPercent = Math.floor((i / total) * 100);
499
+ if (currentPercent > lastReportedPercent) {
500
+ lastReportedPercent = currentPercent;
501
+ onProgress(i + 1, total);
502
+ }
503
+ }
504
+ }
505
+ // Final progress report
506
+ if (onProgress && total > 0) {
507
+ onProgress(total, total);
508
+ }
509
+ return {
510
+ resolved,
511
+ unresolved,
512
+ stats: {
513
+ total: refs.length,
514
+ resolved: resolved.length,
515
+ unresolved: unresolved.length,
516
+ byMethod,
517
+ },
518
+ };
519
+ }
520
+ /**
521
+ * Check if a reference name has any possible match in the codebase.
522
+ * Uses the pre-built knownNames set to skip expensive resolution
523
+ * for names that definitely don't exist as symbols.
524
+ */
525
+ hasAnyPossibleMatch(name) {
526
+ if (!this.knownNames)
527
+ return true; // no pre-filter available
528
+ // Direct name match
529
+ if (this.knownNames.has(name))
530
+ return true;
531
+ // For qualified names like "obj.method" or "Class::method", check the parts
532
+ const dotIdx = name.indexOf('.');
533
+ if (dotIdx > 0) {
534
+ const receiver = name.substring(0, dotIdx);
535
+ const member = name.substring(dotIdx + 1);
536
+ if (this.knownNames.has(receiver) || this.knownNames.has(member))
537
+ return true;
538
+ // Also check capitalized receiver (instance-method resolution)
539
+ const capitalized = receiver.charAt(0).toUpperCase() + receiver.slice(1);
540
+ if (this.knownNames.has(capitalized))
541
+ return true;
542
+ // JVM FQN: `com.example.foo.Bar` — the only useful segment is the
543
+ // last one (`Bar`); the earlier check finds `example.foo.Bar` which
544
+ // never matches a node name.
545
+ const lastDot = name.lastIndexOf('.');
546
+ if (lastDot > dotIdx) {
547
+ const tail = name.substring(lastDot + 1);
548
+ if (tail && this.knownNames.has(tail))
549
+ return true;
550
+ }
551
+ }
552
+ const colonIdx = name.indexOf('::');
553
+ if (colonIdx > 0) {
554
+ const receiver = name.substring(0, colonIdx);
555
+ const member = name.substring(colonIdx + 2);
556
+ if (this.knownNames.has(receiver) || this.knownNames.has(member))
557
+ return true;
558
+ // Multi-segment path `a::b::c` (a Rust/C++ module call like
559
+ // `database::profiles::find`) — the only segment that names a symbol is
560
+ // the last (`c`); `member` above is `b::c`, which never matches a node
561
+ // name, so without this the pre-filter drops the ref before the Rust path
562
+ // resolver ever sees it. Mirror the dotted-name leaf check above.
563
+ const lastColon = name.lastIndexOf('::');
564
+ if (lastColon > colonIdx) {
565
+ const tail = name.substring(lastColon + 2);
566
+ if (tail && this.knownNames.has(tail))
567
+ return true;
568
+ }
569
+ }
570
+ // For path-like references (e.g., "snippets/drawer-menu.liquid"), check the filename
571
+ const slashIdx = name.lastIndexOf('/');
572
+ if (slashIdx > 0) {
573
+ const fileName = name.substring(slashIdx + 1);
574
+ if (this.knownNames.has(fileName))
575
+ return true;
576
+ }
577
+ return false;
578
+ }
579
+ /**
580
+ * Does `ref.referenceName` match an import declared in its containing
581
+ * file? Used as a pre-filter escape so re-export chain resolution
582
+ * still gets a chance when the name has no project-wide declaration.
583
+ */
584
+ matchesAnyImport(ref) {
585
+ const imports = this.context.getImportMappings(ref.filePath, ref.language);
586
+ if (imports.length === 0)
587
+ return false;
588
+ for (const imp of imports) {
589
+ if (imp.localName === ref.referenceName ||
590
+ ref.referenceName.startsWith(imp.localName + '.')) {
591
+ return true;
592
+ }
593
+ }
594
+ return false;
595
+ }
596
+ /**
597
+ * Resolve a single reference
598
+ */
599
+ resolveOne(ref) {
600
+ // Skip built-in/external references
601
+ if (this.isBuiltInOrExternal(ref)) {
602
+ return null;
603
+ }
604
+ // Fast pre-filter: skip if no symbol with this name exists anywhere
605
+ // AND the name doesn't match a local import. The import escape is
606
+ // necessary because re-export rename chains (`import { login }
607
+ // from './barrel'` where the barrel has `export { signIn as login }
608
+ // from './auth'`) intentionally call a name that has no
609
+ // declaration anywhere — only the renamed upstream symbol does.
610
+ if (!this.hasAnyPossibleMatch(ref.referenceName) &&
611
+ !this.matchesAnyImport(ref) &&
612
+ !this.frameworks.some((f) => f.claimsReference?.(ref.referenceName))) {
613
+ return null;
614
+ }
615
+ // JVM FQN imports skip framework/name-matcher: `import com.example.Bar`
616
+ // resolves directly through the qualifiedName index, which is unambiguous
617
+ // even when several `Bar` classes exist in different packages.
618
+ const jvmImport = (0, import_resolver_1.resolveJvmImport)(ref, this.context);
619
+ if (jvmImport)
620
+ return jvmImport;
621
+ // Razor/Blazor: a markup or `@code` type ref resolves through the file's
622
+ // `@using` namespaces (incl. folder `_Imports.razor`). This precisely
623
+ // disambiguates a simple name that exists in several namespaces — e.g.
624
+ // `CatalogBrand` resolving to `BlazorShared.Models::CatalogBrand` (the DTO,
625
+ // which the `.razor` `@using`s) rather than the same-named domain entity.
626
+ if (ref.language === 'razor') {
627
+ const razorResult = this.resolveRazorUsing(ref);
628
+ if (razorResult)
629
+ return razorResult;
630
+ }
631
+ const candidates = [];
632
+ // Strategy 1: Try framework-specific resolution. Cross-language bridges
633
+ // are deliberately preserved (Drupal `routing.yml` → PHP controller, RN
634
+ // JS → native `calls`) — `gateFrameworkLanguage` only drops a type/import
635
+ // edge between two KNOWN families (see its doc), never a `calls` bridge or
636
+ // a config↔code edge.
637
+ for (const framework of this.frameworks) {
638
+ const result = this.gateFrameworkLanguage(framework.resolve(ref, this.context), ref);
639
+ if (result) {
640
+ if (result.confidence >= 0.9)
641
+ return result; // High confidence, return immediately
642
+ candidates.push(result);
643
+ }
644
+ }
645
+ // Strategy 2: Try import-based resolution
646
+ const importResult = this.gateLanguage((0, import_resolver_1.resolveViaImport)(ref, this.context), ref);
647
+ if (importResult) {
648
+ if (importResult.confidence >= 0.9)
649
+ return importResult;
650
+ candidates.push(importResult);
651
+ }
652
+ // Strategy 3: Try name matching
653
+ const nameResult = this.gateLanguage((0, name_matcher_1.matchReference)(ref, this.context), ref);
654
+ if (nameResult) {
655
+ candidates.push(nameResult);
656
+ }
657
+ if (candidates.length === 0)
658
+ return null;
659
+ // Return highest confidence candidate
660
+ return candidates.reduce((best, curr) => curr.confidence > best.confidence ? curr : best);
661
+ }
662
+ /**
663
+ * Create edges from resolved references
664
+ */
665
+ createEdges(resolved) {
666
+ return resolved.map((ref) => {
667
+ let kind = ref.original.referenceKind;
668
+ // Promote "extends" to "implements" when a class/struct targets an interface
669
+ if (kind === 'extends') {
670
+ const targetNode = this.queries.getNodeById(ref.targetNodeId);
671
+ if (targetNode && (targetNode.kind === 'interface' || targetNode.kind === 'protocol')) {
672
+ const sourceNode = this.queries.getNodeById(ref.original.fromNodeId);
673
+ if (sourceNode && sourceNode.kind !== 'interface' && sourceNode.kind !== 'protocol') {
674
+ kind = 'implements';
675
+ }
676
+ }
677
+ }
678
+ // Promote "calls" to "instantiates" when the resolved target is a
679
+ // class/struct. Languages without a `new` keyword (Python, Ruby)
680
+ // express instantiation as `Foo()` — extraction can't tell that
681
+ // apart from a function call without symbol info, but resolution
682
+ // can: if `Foo` resolves to a class, the call IS an instantiation.
683
+ if (kind === 'calls') {
684
+ const targetNode = this.queries.getNodeById(ref.targetNodeId);
685
+ if (targetNode && (targetNode.kind === 'class' || targetNode.kind === 'struct')) {
686
+ kind = 'instantiates';
687
+ }
688
+ }
689
+ return {
690
+ source: ref.original.fromNodeId,
691
+ target: ref.targetNodeId,
692
+ kind,
693
+ line: ref.original.line,
694
+ column: ref.original.column,
695
+ metadata: {
696
+ confidence: ref.confidence,
697
+ resolvedBy: ref.resolvedBy,
698
+ },
699
+ };
700
+ });
701
+ }
702
+ /**
703
+ * Resolve and persist edges to database
704
+ */
705
+ resolveAndPersist(unresolvedRefs, onProgress) {
706
+ const result = this.resolveAll(unresolvedRefs, onProgress);
707
+ // Create edges from resolved references
708
+ const edges = this.createEdges(result.resolved);
709
+ // Insert edges into database
710
+ if (edges.length > 0) {
711
+ this.queries.insertEdges(edges);
712
+ }
713
+ // Clean up resolved refs from unresolved_refs table so metrics are accurate
714
+ if (result.resolved.length > 0) {
715
+ this.queries.deleteSpecificResolvedReferences(result.resolved.map((r) => ({
716
+ fromNodeId: r.original.fromNodeId,
717
+ referenceName: r.original.referenceName,
718
+ referenceKind: r.original.referenceKind,
719
+ })));
720
+ }
721
+ return result;
722
+ }
723
+ /**
724
+ * Resolve and persist in batches to keep memory bounded.
725
+ * Processes unresolved references in chunks, persisting edges and cleaning
726
+ * up resolved refs after each batch to avoid accumulating large arrays.
727
+ */
728
+ async resolveAndPersistBatched(onProgress, batchSize = 5000) {
729
+ this.warmCaches();
730
+ const total = this.queries.getUnresolvedReferencesCount();
731
+ let processed = 0;
732
+ const aggregateStats = {
733
+ total: 0,
734
+ resolved: 0,
735
+ unresolved: 0,
736
+ byMethod: {},
737
+ };
738
+ // Process in batches. We always read from offset 0 because resolved refs
739
+ // are deleted after each batch, shifting the remaining rows forward.
740
+ while (true) {
741
+ const batch = this.queries.getUnresolvedReferencesBatch(0, batchSize);
742
+ if (batch.length === 0)
743
+ break;
744
+ const result = this.resolveAll(batch);
745
+ // Persist edges immediately
746
+ const edges = this.createEdges(result.resolved);
747
+ if (edges.length > 0) {
748
+ this.queries.insertEdges(edges);
749
+ }
750
+ // Clean up resolved refs so they don't appear in the next batch
751
+ if (result.resolved.length > 0) {
752
+ this.queries.deleteSpecificResolvedReferences(result.resolved.map((r) => ({
753
+ fromNodeId: r.original.fromNodeId,
754
+ referenceName: r.original.referenceName,
755
+ referenceKind: r.original.referenceKind,
756
+ })));
757
+ }
758
+ // Delete unresolvable refs from this batch to avoid re-processing them
759
+ if (result.unresolved.length > 0) {
760
+ this.queries.deleteSpecificResolvedReferences(result.unresolved.map((r) => ({
761
+ fromNodeId: r.fromNodeId,
762
+ referenceName: r.referenceName,
763
+ referenceKind: r.referenceKind,
764
+ })));
765
+ }
766
+ // Aggregate stats
767
+ aggregateStats.total += result.stats.total;
768
+ aggregateStats.resolved += result.stats.resolved;
769
+ aggregateStats.unresolved += result.stats.unresolved;
770
+ for (const [method, count] of Object.entries(result.stats.byMethod)) {
771
+ aggregateStats.byMethod[method] = (aggregateStats.byMethod[method] || 0) + count;
772
+ }
773
+ processed += batch.length;
774
+ onProgress?.(processed, total);
775
+ // Yield so progress UI can render between batches
776
+ await new Promise(resolve => setImmediate(resolve));
777
+ // If nothing was resolved or removed in this batch, we'd loop forever
778
+ // on the same rows. Break to avoid infinite loop.
779
+ if (result.resolved.length === 0 && result.unresolved.length === batch.length) {
780
+ break;
781
+ }
782
+ }
783
+ // Dynamic-edge synthesis: now that all base `calls` edges are persisted,
784
+ // synthesize observer/callback dispatch edges (dispatcher → registered
785
+ // callbacks) that static parsing leaves out. Best-effort — never fail the
786
+ // index on it. See docs/design/callback-edge-synthesis.md.
787
+ try {
788
+ aggregateStats.byMethod['callback-synthesis'] = (0, callback_synthesizer_1.synthesizeCallbackEdges)(this.queries, this.context);
789
+ }
790
+ catch {
791
+ // synthesis is additive and optional; ignore failures
792
+ }
793
+ return {
794
+ resolved: [],
795
+ unresolved: [],
796
+ stats: aggregateStats,
797
+ };
798
+ }
799
+ /**
800
+ * Get detected frameworks
801
+ */
802
+ getDetectedFrameworks() {
803
+ return this.frameworks.map((f) => f.name);
804
+ }
805
+ /**
806
+ * Check if reference is to a built-in or external symbol
807
+ */
808
+ isBuiltInOrExternal(ref) {
809
+ const name = ref.referenceName;
810
+ const isJsTs = ref.language === 'typescript' || ref.language === 'javascript'
811
+ || ref.language === 'tsx' || ref.language === 'jsx';
812
+ // JavaScript/TypeScript built-ins
813
+ if (isJsTs && JS_BUILT_INS.has(name)) {
814
+ return true;
815
+ }
816
+ // Common JS/TS library calls (console.log, Math.floor, JSON.parse)
817
+ if (isJsTs && (name.startsWith('console.') || name.startsWith('Math.') || name.startsWith('JSON.'))) {
818
+ return true;
819
+ }
820
+ // React hooks from React itself
821
+ if (isJsTs && REACT_HOOKS.has(name)) {
822
+ return true;
823
+ }
824
+ // Python built-ins (bare calls only — dotted calls like console.print are method calls)
825
+ if (ref.language === 'python' && PYTHON_BUILT_INS.has(name)) {
826
+ return true;
827
+ }
828
+ // Python built-in method calls (e.g., list.extend, dict.update)
829
+ if (ref.language === 'python') {
830
+ const dotIdx = name.indexOf('.');
831
+ if (dotIdx > 0) {
832
+ const receiver = name.substring(0, dotIdx);
833
+ const method = name.substring(dotIdx + 1);
834
+ // Filter calls on built-in types (list.append, dict.update, etc.)
835
+ if (PYTHON_BUILT_IN_TYPES.has(receiver)) {
836
+ return true;
837
+ }
838
+ // Filter built-in methods on non-class receivers
839
+ // (e.g., items.append where items is a local list variable)
840
+ // But allow if the capitalized receiver matches a known codebase class
841
+ if (PYTHON_BUILT_IN_METHODS.has(method)) {
842
+ const capitalized = receiver.charAt(0).toUpperCase() + receiver.slice(1);
843
+ if (!this.knownNames?.has(capitalized)) {
844
+ return true;
845
+ }
846
+ }
847
+ }
848
+ // A bare name colliding with a builtin method (index, get, update, count…)
849
+ // is only a builtin when NOTHING in the codebase declares it. A declared
850
+ // symbol with that exact name — e.g. a Flask/FastAPI view `def index()` or
851
+ // `def get()` — is a real reference target. Mirrors the knownNames guard on
852
+ // the dotted branch above; without it, every handler named after a builtin
853
+ // method silently loses its route→handler edge.
854
+ if (PYTHON_BUILT_IN_METHODS.has(name) && !this.knownNames?.has(name)) {
855
+ return true;
856
+ }
857
+ }
858
+ // Go standard library packages — refs like "fmt.Println", "http.ListenAndServe", etc.
859
+ if (ref.language === 'go') {
860
+ const dotIdx = name.indexOf('.');
861
+ if (dotIdx > 0) {
862
+ const pkg = name.substring(0, dotIdx);
863
+ if (GO_STDLIB_PACKAGES.has(pkg)) {
864
+ return true;
865
+ }
866
+ }
867
+ if (GO_BUILT_INS.has(name)) {
868
+ return true;
869
+ }
870
+ }
871
+ // Pascal/Delphi built-ins and standard library units
872
+ if (ref.language === 'pascal') {
873
+ if (PASCAL_UNIT_PREFIXES.some((p) => name.startsWith(p))) {
874
+ return true;
875
+ }
876
+ if (PASCAL_BUILT_INS.has(name)) {
877
+ return true;
878
+ }
879
+ }
880
+ // C/C++ standard library symbols (printf, malloc, std::vector, etc.).
881
+ // Names that collide with user-defined symbols are NOT filtered —
882
+ // C and C++ projects routinely shadow stdlib names (custom allocators
883
+ // define `malloc`/`free`, stream wrappers define `read`/`write`/`open`,
884
+ // containers define `move`/`swap`, logging libs wrap `printf`). Killing
885
+ // those resolutions makes the graph wrong, not cleaner. We only filter
886
+ // when there's no user node with this name — then name-matching would
887
+ // produce zero edges anyway and the filter just short-circuits work.
888
+ if (ref.language === 'c' || ref.language === 'cpp') {
889
+ // C++ std:: namespace prefix — safe to filter unconditionally,
890
+ // since `std::foo` is never a user-defined qualified name in
891
+ // tree-sitter output.
892
+ if (name.startsWith('std::'))
893
+ return true;
894
+ if (C_BUILT_INS.has(name) || CPP_BUILT_INS.has(name)) {
895
+ return !this.hasAnyPossibleMatch(name);
896
+ }
897
+ }
898
+ return false;
899
+ }
900
+ /**
901
+ * Get file path from node ID
902
+ */
903
+ getFilePathFromNodeId(nodeId) {
904
+ const node = this.queries.getNodeById(nodeId);
905
+ return node?.filePath || '';
906
+ }
907
+ /**
908
+ * Get language from node ID
909
+ */
910
+ getLanguageFromNodeId(nodeId) {
911
+ const node = this.queries.getNodeById(nodeId);
912
+ return node?.language || 'unknown';
913
+ }
914
+ /**
915
+ * Drop an import/name-strategy resolution that crosses a language family.
916
+ * Two regimes (mirrors `applyLanguageGate`'s candidate filter):
917
+ * - `references` (type usage): STRICT — a `Type.member` static read names a
918
+ * same-family type, never a coincidentally same-named symbol in another
919
+ * language. Drops any non-same-family target.
920
+ * - `imports` (import binding / `#include`): both-known — a C++ `#include
921
+ * "X.h"` must not resolve to a same-named ObjC header on another platform
922
+ * (basename collision), but a singleton-family / SFC language (`vue` →
923
+ * `.ts`) importing across is left alone.
924
+ * Applies to the import (strategy 2) + name-match (strategy 3) results.
925
+ */
926
+ /**
927
+ * Collect the `@using` namespaces in scope for a `.razor`/`.cshtml` file: its
928
+ * own `@using` directives plus every `_Imports.razor` from the file's folder up
929
+ * to the project root (Razor `_Imports` cascade). Cached per file.
930
+ */
931
+ getRazorUsings(filePath) {
932
+ const cached = this.razorUsingsCache.get(filePath);
933
+ if (cached)
934
+ return cached;
935
+ const usings = new Set();
936
+ const addFrom = (src) => {
937
+ if (!src)
938
+ return;
939
+ for (const m of src.matchAll(/^\s*@using\s+(?:static\s+)?([A-Za-z_][\w.]*)/gm))
940
+ usings.add(m[1]);
941
+ };
942
+ addFrom(this.context.readFile(filePath));
943
+ let dir = filePath.includes('/') ? filePath.slice(0, filePath.lastIndexOf('/')) : '';
944
+ // Walk up to the project root, reading each level's _Imports.razor.
945
+ for (;;) {
946
+ addFrom(this.context.readFile(dir ? `${dir}/_Imports.razor` : '_Imports.razor'));
947
+ if (!dir)
948
+ break;
949
+ const slash = dir.lastIndexOf('/');
950
+ dir = slash >= 0 ? dir.slice(0, slash) : '';
951
+ }
952
+ const arr = [...usings];
953
+ this.razorUsingsCache.set(filePath, arr);
954
+ return arr;
955
+ }
956
+ /**
957
+ * Resolve a Razor/Blazor simple type ref through the file's `@using`
958
+ * namespaces: `CatalogBrand` + `@using BlazorShared.Models` → the node whose
959
+ * qualified name is `BlazorShared.Models::CatalogBrand`. Only resolves when the
960
+ * `@using` set yields exactly ONE type (otherwise it stays ambiguous and falls
961
+ * through to name-matching).
962
+ */
963
+ resolveRazorUsing(ref) {
964
+ if (ref.referenceName.includes('.') || ref.referenceName.includes('::'))
965
+ return null;
966
+ const usings = this.getRazorUsings(ref.filePath);
967
+ if (usings.length === 0)
968
+ return null;
969
+ const found = new Map();
970
+ for (const ns of usings) {
971
+ for (const cand of this.context.getNodesByQualifiedName(`${ns}::${ref.referenceName}`)) {
972
+ found.set(cand.id, cand);
973
+ }
974
+ }
975
+ if (found.size !== 1)
976
+ return null;
977
+ const target = found.values().next().value;
978
+ return { original: ref, targetNodeId: target.id, confidence: 0.9, resolvedBy: 'import' };
979
+ }
980
+ gateLanguage(result, ref) {
981
+ if (!result)
982
+ return result;
983
+ const tgt = this.getLanguageFromNodeId(result.targetNodeId);
984
+ if (!tgt || !ref.language)
985
+ return result;
986
+ if (ref.referenceKind === 'references' && !(0, name_matcher_1.sameLanguageFamily)(tgt, ref.language))
987
+ return null;
988
+ if (ref.referenceKind === 'imports' && (0, name_matcher_1.crossesKnownFamily)(tgt, ref.language))
989
+ return null;
990
+ return result;
991
+ }
992
+ /**
993
+ * Drop a FRAMEWORK-strategy resolution that crosses two *known* language
994
+ * families for a type-usage (`references`) or import-binding (`imports`)
995
+ * edge. The framework strategy is intentionally ungated for cross-language
996
+ * bridges, but those legitimate bridges are either `calls` edges (RN/Expo
997
+ * JS → native) or config↔code edges whose config side (`yaml`/`blade`/…) is
998
+ * not a known programming-language family. A `references`/`imports` edge
999
+ * between two *known* families is always a coincidental name collision — the
1000
+ * React/Svelte/Vue PascalCase component resolvers name-match `getNodesByName`
1001
+ * without a language check, so a TS `<TestRunner>` ref happily matched a
1002
+ * Kotlin `class TestRunner`. Gating only the both-known-cross-family case
1003
+ * lets config bridges and `calls` bridges through untouched.
1004
+ */
1005
+ gateFrameworkLanguage(result, ref) {
1006
+ if (!result)
1007
+ return result;
1008
+ if (ref.referenceKind !== 'references' && ref.referenceKind !== 'imports')
1009
+ return result;
1010
+ const tgt = this.getLanguageFromNodeId(result.targetNodeId);
1011
+ if (tgt && ref.language && (0, name_matcher_1.crossesKnownFamily)(tgt, ref.language))
1012
+ return null;
1013
+ return result;
1014
+ }
1015
+ }
1016
+ exports.ReferenceResolver = ReferenceResolver;
1017
+ /**
1018
+ * Create a reference resolver instance
1019
+ */
1020
+ function createResolver(projectRoot, queries) {
1021
+ const resolver = new ReferenceResolver(projectRoot, queries);
1022
+ resolver.initialize();
1023
+ return resolver;
1024
+ }
1025
+ //# sourceMappingURL=index.js.map