homegraph 0.9.10 → 1.1.1

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 (436) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +243 -193
  3. package/dist/bin/fatal-handler.d.ts +20 -0
  4. package/dist/bin/fatal-handler.d.ts.map +1 -0
  5. package/dist/bin/fatal-handler.js +118 -0
  6. package/dist/bin/fatal-handler.js.map +1 -0
  7. package/dist/bin/homegraph.d.ts +6 -6
  8. package/dist/bin/homegraph.js +532 -109
  9. package/dist/bin/homegraph.js.map +1 -1
  10. package/dist/bin/node-version-check.d.ts +4 -4
  11. package/dist/bin/node-version-check.js +12 -12
  12. package/dist/bin/uninstall.d.ts +1 -1
  13. package/dist/bin/uninstall.js +1 -1
  14. package/dist/context/index.d.ts.map +1 -1
  15. package/dist/context/index.js +8 -1
  16. package/dist/context/index.js.map +1 -1
  17. package/dist/db/index.d.ts +22 -1
  18. package/dist/db/index.d.ts.map +1 -1
  19. package/dist/db/index.js +48 -2
  20. package/dist/db/index.js.map +1 -1
  21. package/dist/db/migrations.d.ts +1 -1
  22. package/dist/db/migrations.d.ts.map +1 -1
  23. package/dist/db/migrations.js +26 -17
  24. package/dist/db/migrations.js.map +1 -1
  25. package/dist/db/queries.d.ts +21 -1
  26. package/dist/db/queries.d.ts.map +1 -1
  27. package/dist/db/queries.js +180 -137
  28. package/dist/db/queries.js.map +1 -1
  29. package/dist/db/schema.sql +152 -151
  30. package/dist/db/sqlite-adapter.d.ts +1 -1
  31. package/dist/db/sqlite-adapter.js +3 -3
  32. package/dist/directory.d.ts +87 -6
  33. package/dist/directory.d.ts.map +1 -1
  34. package/dist/directory.js +319 -57
  35. package/dist/directory.js.map +1 -1
  36. package/dist/errors.d.ts +15 -15
  37. package/dist/errors.js +20 -20
  38. package/dist/extraction/astro-extractor.d.ts +79 -0
  39. package/dist/extraction/astro-extractor.d.ts.map +1 -0
  40. package/dist/extraction/astro-extractor.js +320 -0
  41. package/dist/extraction/astro-extractor.js.map +1 -0
  42. package/dist/extraction/context.d.ts +1 -1
  43. package/dist/extraction/context.js +1 -1
  44. package/dist/extraction/extraction-version.d.ts +2 -2
  45. package/dist/extraction/extraction-version.d.ts.map +1 -1
  46. package/dist/extraction/extraction-version.js +2 -2
  47. package/dist/extraction/extraction-version.js.map +1 -1
  48. package/dist/extraction/function-ref.d.ts +118 -0
  49. package/dist/extraction/function-ref.d.ts.map +1 -0
  50. package/dist/extraction/function-ref.js +727 -0
  51. package/dist/extraction/function-ref.js.map +1 -0
  52. package/dist/extraction/generated-detection.d.ts.map +1 -1
  53. package/dist/extraction/generated-detection.js +3 -0
  54. package/dist/extraction/generated-detection.js.map +1 -1
  55. package/dist/extraction/grammars.d.ts +15 -5
  56. package/dist/extraction/grammars.d.ts.map +1 -1
  57. package/dist/extraction/grammars.js +44 -10
  58. package/dist/extraction/grammars.js.map +1 -1
  59. package/dist/extraction/index.d.ts +37 -0
  60. package/dist/extraction/index.d.ts.map +1 -1
  61. package/dist/extraction/index.js +562 -70
  62. package/dist/extraction/index.js.map +1 -1
  63. package/dist/extraction/languages/arkts-viewtree.d.ts +22 -0
  64. package/dist/extraction/languages/arkts-viewtree.d.ts.map +1 -0
  65. package/dist/extraction/languages/arkts-viewtree.js +133 -0
  66. package/dist/extraction/languages/arkts-viewtree.js.map +1 -0
  67. package/dist/extraction/languages/arkts.d.ts.map +1 -1
  68. package/dist/extraction/languages/arkts.js +211 -20
  69. package/dist/extraction/languages/arkts.js.map +1 -1
  70. package/dist/extraction/languages/c-cpp.d.ts +8 -0
  71. package/dist/extraction/languages/c-cpp.d.ts.map +1 -1
  72. package/dist/extraction/languages/c-cpp.js +104 -2
  73. package/dist/extraction/languages/c-cpp.js.map +1 -1
  74. package/dist/extraction/languages/csharp.d.ts.map +1 -1
  75. package/dist/extraction/languages/csharp.js +58 -3
  76. package/dist/extraction/languages/csharp.js.map +1 -1
  77. package/dist/extraction/languages/dart.d.ts.map +1 -1
  78. package/dist/extraction/languages/dart.js +183 -1
  79. package/dist/extraction/languages/dart.js.map +1 -1
  80. package/dist/extraction/languages/go.d.ts.map +1 -1
  81. package/dist/extraction/languages/go.js +37 -0
  82. package/dist/extraction/languages/go.js.map +1 -1
  83. package/dist/extraction/languages/index.d.ts.map +1 -1
  84. package/dist/extraction/languages/index.js +2 -0
  85. package/dist/extraction/languages/index.js.map +1 -1
  86. package/dist/extraction/languages/java.d.ts.map +1 -1
  87. package/dist/extraction/languages/java.js +241 -0
  88. package/dist/extraction/languages/java.js.map +1 -1
  89. package/dist/extraction/languages/javascript.d.ts.map +1 -1
  90. package/dist/extraction/languages/javascript.js +16 -0
  91. package/dist/extraction/languages/javascript.js.map +1 -1
  92. package/dist/extraction/languages/kotlin.d.ts.map +1 -1
  93. package/dist/extraction/languages/kotlin.js +94 -0
  94. package/dist/extraction/languages/kotlin.js.map +1 -1
  95. package/dist/extraction/languages/objc.d.ts.map +1 -1
  96. package/dist/extraction/languages/objc.js +42 -0
  97. package/dist/extraction/languages/objc.js.map +1 -1
  98. package/dist/extraction/languages/pascal.d.ts.map +1 -1
  99. package/dist/extraction/languages/pascal.js +11 -0
  100. package/dist/extraction/languages/pascal.js.map +1 -1
  101. package/dist/extraction/languages/php.d.ts.map +1 -1
  102. package/dist/extraction/languages/php.js +77 -1
  103. package/dist/extraction/languages/php.js.map +1 -1
  104. package/dist/extraction/languages/r.d.ts +3 -0
  105. package/dist/extraction/languages/r.d.ts.map +1 -0
  106. package/dist/extraction/languages/r.js +314 -0
  107. package/dist/extraction/languages/r.js.map +1 -0
  108. package/dist/extraction/languages/rust.d.ts.map +1 -1
  109. package/dist/extraction/languages/rust.js +29 -0
  110. package/dist/extraction/languages/rust.js.map +1 -1
  111. package/dist/extraction/languages/scala.d.ts.map +1 -1
  112. package/dist/extraction/languages/scala.js +44 -9
  113. package/dist/extraction/languages/scala.js.map +1 -1
  114. package/dist/extraction/languages/swift.d.ts.map +1 -1
  115. package/dist/extraction/languages/swift.js +61 -0
  116. package/dist/extraction/languages/swift.js.map +1 -1
  117. package/dist/extraction/languages/typescript.d.ts +13 -0
  118. package/dist/extraction/languages/typescript.d.ts.map +1 -1
  119. package/dist/extraction/languages/typescript.js +38 -0
  120. package/dist/extraction/languages/typescript.js.map +1 -1
  121. package/dist/extraction/liquid-extractor.d.ts.map +1 -1
  122. package/dist/extraction/liquid-extractor.js +4 -1
  123. package/dist/extraction/liquid-extractor.js.map +1 -1
  124. package/dist/extraction/parse-worker.js +4 -1
  125. package/dist/extraction/parse-worker.js.map +1 -1
  126. package/dist/extraction/svelte-extractor.d.ts.map +1 -1
  127. package/dist/extraction/svelte-extractor.js +6 -3
  128. package/dist/extraction/svelte-extractor.js.map +1 -1
  129. package/dist/extraction/tree-sitter-helpers.d.ts.map +1 -1
  130. package/dist/extraction/tree-sitter-helpers.js +59 -10
  131. package/dist/extraction/tree-sitter-helpers.js.map +1 -1
  132. package/dist/extraction/tree-sitter-types.d.ts +29 -0
  133. package/dist/extraction/tree-sitter-types.d.ts.map +1 -1
  134. package/dist/extraction/tree-sitter.d.ts +192 -0
  135. package/dist/extraction/tree-sitter.d.ts.map +1 -1
  136. package/dist/extraction/tree-sitter.js +1553 -45
  137. package/dist/extraction/tree-sitter.js.map +1 -1
  138. package/dist/extraction/vue-extractor.d.ts.map +1 -1
  139. package/dist/extraction/vue-extractor.js +6 -3
  140. package/dist/extraction/vue-extractor.js.map +1 -1
  141. package/dist/extraction/wasm/tree-sitter-c_sharp.wasm +0 -0
  142. package/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
  143. package/dist/extraction/wasm/tree-sitter-r.wasm +0 -0
  144. package/dist/graph/traversal.d.ts.map +1 -1
  145. package/dist/graph/traversal.js +11 -2
  146. package/dist/graph/traversal.js.map +1 -1
  147. package/dist/index.d.ts +64 -23
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +137 -41
  150. package/dist/index.js.map +1 -1
  151. package/dist/installer/config-writer.d.ts +1 -1
  152. package/dist/installer/config-writer.js +1 -1
  153. package/dist/installer/index.d.ts +4 -4
  154. package/dist/installer/index.d.ts.map +1 -1
  155. package/dist/installer/index.js +100 -73
  156. package/dist/installer/index.js.map +1 -1
  157. package/dist/installer/instructions-template.d.ts +34 -11
  158. package/dist/installer/instructions-template.d.ts.map +1 -1
  159. package/dist/installer/instructions-template.js +44 -12
  160. package/dist/installer/instructions-template.js.map +1 -1
  161. package/dist/installer/targets/antigravity.d.ts +6 -6
  162. package/dist/installer/targets/antigravity.js +14 -14
  163. package/dist/installer/targets/claude.d.ts +19 -13
  164. package/dist/installer/targets/claude.d.ts.map +1 -1
  165. package/dist/installer/targets/claude.js +97 -29
  166. package/dist/installer/targets/claude.js.map +1 -1
  167. package/dist/installer/targets/codebuddy.d.ts +17 -0
  168. package/dist/installer/targets/codebuddy.d.ts.map +1 -0
  169. package/dist/installer/targets/codebuddy.js +150 -0
  170. package/dist/installer/targets/codebuddy.js.map +1 -0
  171. package/dist/installer/targets/codex.js +5 -7
  172. package/dist/installer/targets/codex.js.map +1 -1
  173. package/dist/installer/targets/cursor.d.ts +1 -1
  174. package/dist/installer/targets/cursor.js +7 -7
  175. package/dist/installer/targets/deveco.d.ts +23 -0
  176. package/dist/installer/targets/deveco.d.ts.map +1 -0
  177. package/dist/installer/targets/deveco.js +217 -0
  178. package/dist/installer/targets/deveco.js.map +1 -0
  179. package/dist/installer/targets/gemini.js +5 -7
  180. package/dist/installer/targets/gemini.js.map +1 -1
  181. package/dist/installer/targets/hermes.js +15 -15
  182. package/dist/installer/targets/kiro.d.ts +1 -1
  183. package/dist/installer/targets/kiro.js +4 -4
  184. package/dist/installer/targets/opencode.d.ts +9 -1
  185. package/dist/installer/targets/opencode.d.ts.map +1 -1
  186. package/dist/installer/targets/opencode.js +92 -41
  187. package/dist/installer/targets/opencode.js.map +1 -1
  188. package/dist/installer/targets/registry.d.ts.map +1 -1
  189. package/dist/installer/targets/registry.js +4 -0
  190. package/dist/installer/targets/registry.js.map +1 -1
  191. package/dist/installer/targets/shared.d.ts +28 -4
  192. package/dist/installer/targets/shared.d.ts.map +1 -1
  193. package/dist/installer/targets/shared.js +32 -15
  194. package/dist/installer/targets/shared.js.map +1 -1
  195. package/dist/installer/targets/types.d.ts +9 -2
  196. package/dist/installer/targets/types.d.ts.map +1 -1
  197. package/dist/mcp/daemon-manager.d.ts +42 -0
  198. package/dist/mcp/daemon-manager.d.ts.map +1 -0
  199. package/dist/mcp/daemon-manager.js +129 -0
  200. package/dist/mcp/daemon-manager.js.map +1 -0
  201. package/dist/mcp/daemon-paths.d.ts +1 -1
  202. package/dist/mcp/daemon-paths.js +3 -3
  203. package/dist/mcp/daemon-registry.d.ts +47 -0
  204. package/dist/mcp/daemon-registry.d.ts.map +1 -0
  205. package/dist/mcp/daemon-registry.js +229 -0
  206. package/dist/mcp/daemon-registry.js.map +1 -0
  207. package/dist/mcp/daemon.d.ts.map +1 -1
  208. package/dist/mcp/daemon.js +27 -6
  209. package/dist/mcp/daemon.js.map +1 -1
  210. package/dist/mcp/dynamic-boundaries.d.ts +41 -0
  211. package/dist/mcp/dynamic-boundaries.d.ts.map +1 -0
  212. package/dist/mcp/dynamic-boundaries.js +359 -0
  213. package/dist/mcp/dynamic-boundaries.js.map +1 -0
  214. package/dist/mcp/engine.d.ts +4 -4
  215. package/dist/mcp/engine.d.ts.map +1 -1
  216. package/dist/mcp/engine.js +32 -24
  217. package/dist/mcp/engine.js.map +1 -1
  218. package/dist/mcp/index.d.ts +8 -7
  219. package/dist/mcp/index.d.ts.map +1 -1
  220. package/dist/mcp/index.js +39 -18
  221. package/dist/mcp/index.js.map +1 -1
  222. package/dist/mcp/liveness-watchdog.d.ts +18 -0
  223. package/dist/mcp/liveness-watchdog.d.ts.map +1 -0
  224. package/dist/mcp/liveness-watchdog.js +207 -0
  225. package/dist/mcp/liveness-watchdog.js.map +1 -0
  226. package/dist/mcp/proxy.d.ts +6 -0
  227. package/dist/mcp/proxy.d.ts.map +1 -1
  228. package/dist/mcp/proxy.js +75 -18
  229. package/dist/mcp/proxy.js.map +1 -1
  230. package/dist/mcp/server-instructions.d.ts +22 -7
  231. package/dist/mcp/server-instructions.d.ts.map +1 -1
  232. package/dist/mcp/server-instructions.js +91 -59
  233. package/dist/mcp/server-instructions.js.map +1 -1
  234. package/dist/mcp/session.d.ts +3 -1
  235. package/dist/mcp/session.d.ts.map +1 -1
  236. package/dist/mcp/session.js +43 -7
  237. package/dist/mcp/session.js.map +1 -1
  238. package/dist/mcp/stdin-teardown.d.ts +27 -0
  239. package/dist/mcp/stdin-teardown.d.ts.map +1 -0
  240. package/dist/mcp/stdin-teardown.js +49 -0
  241. package/dist/mcp/stdin-teardown.js.map +1 -0
  242. package/dist/mcp/tools.d.ts +137 -16
  243. package/dist/mcp/tools.d.ts.map +1 -1
  244. package/dist/mcp/tools.js +1271 -219
  245. package/dist/mcp/tools.js.map +1 -1
  246. package/dist/mcp/transport.d.ts +1 -1
  247. package/dist/mcp/transport.d.ts.map +1 -1
  248. package/dist/mcp/transport.js +20 -4
  249. package/dist/mcp/transport.js.map +1 -1
  250. package/dist/mcp/version.d.ts +1 -1
  251. package/dist/mcp/version.js +2 -2
  252. package/dist/project-config.d.ts +36 -0
  253. package/dist/project-config.d.ts.map +1 -0
  254. package/dist/project-config.js +235 -0
  255. package/dist/project-config.js.map +1 -0
  256. package/dist/reasoning/config.d.ts +45 -0
  257. package/dist/reasoning/config.d.ts.map +1 -0
  258. package/dist/reasoning/config.js +171 -0
  259. package/dist/reasoning/config.js.map +1 -0
  260. package/dist/reasoning/credentials.d.ts +5 -0
  261. package/dist/reasoning/credentials.d.ts.map +1 -0
  262. package/dist/reasoning/credentials.js +83 -0
  263. package/dist/reasoning/credentials.js.map +1 -0
  264. package/dist/reasoning/login.d.ts +21 -0
  265. package/dist/reasoning/login.d.ts.map +1 -0
  266. package/dist/reasoning/login.js +85 -0
  267. package/dist/reasoning/login.js.map +1 -0
  268. package/dist/reasoning/reasoner.d.ts +43 -0
  269. package/dist/reasoning/reasoner.d.ts.map +1 -0
  270. package/dist/reasoning/reasoner.js +308 -0
  271. package/dist/reasoning/reasoner.js.map +1 -0
  272. package/dist/resolution/c-fnptr-synthesizer.d.ts +33 -0
  273. package/dist/resolution/c-fnptr-synthesizer.d.ts.map +1 -0
  274. package/dist/resolution/c-fnptr-synthesizer.js +352 -0
  275. package/dist/resolution/c-fnptr-synthesizer.js.map +1 -0
  276. package/dist/resolution/callback-synthesizer.d.ts +6 -1
  277. package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
  278. package/dist/resolution/callback-synthesizer.js +1197 -1
  279. package/dist/resolution/callback-synthesizer.js.map +1 -1
  280. package/dist/resolution/frameworks/arkts-entry.d.ts +12 -0
  281. package/dist/resolution/frameworks/arkts-entry.d.ts.map +1 -0
  282. package/dist/resolution/frameworks/arkts-entry.js +214 -0
  283. package/dist/resolution/frameworks/arkts-entry.js.map +1 -0
  284. package/dist/resolution/frameworks/arkts-napi.d.ts +3 -0
  285. package/dist/resolution/frameworks/arkts-napi.d.ts.map +1 -0
  286. package/dist/resolution/frameworks/arkts-napi.js +166 -0
  287. package/dist/resolution/frameworks/arkts-napi.js.map +1 -0
  288. package/dist/resolution/frameworks/astro.d.ts +9 -0
  289. package/dist/resolution/frameworks/astro.d.ts.map +1 -0
  290. package/dist/resolution/frameworks/astro.js +169 -0
  291. package/dist/resolution/frameworks/astro.js.map +1 -0
  292. package/dist/resolution/frameworks/goframe.d.ts +41 -0
  293. package/dist/resolution/frameworks/goframe.d.ts.map +1 -0
  294. package/dist/resolution/frameworks/goframe.js +112 -0
  295. package/dist/resolution/frameworks/goframe.js.map +1 -0
  296. package/dist/resolution/frameworks/index.d.ts +3 -0
  297. package/dist/resolution/frameworks/index.d.ts.map +1 -1
  298. package/dist/resolution/frameworks/index.js +17 -1
  299. package/dist/resolution/frameworks/index.js.map +1 -1
  300. package/dist/resolution/frameworks/java.js +6 -1
  301. package/dist/resolution/frameworks/java.js.map +1 -1
  302. package/dist/resolution/frameworks/react.d.ts.map +1 -1
  303. package/dist/resolution/frameworks/react.js +32 -63
  304. package/dist/resolution/frameworks/react.js.map +1 -1
  305. package/dist/resolution/frameworks/svelte.js +6 -2
  306. package/dist/resolution/frameworks/svelte.js.map +1 -1
  307. package/dist/resolution/frameworks/vue.js +24 -27
  308. package/dist/resolution/frameworks/vue.js.map +1 -1
  309. package/dist/resolution/goframe-synthesizer.d.ts +28 -0
  310. package/dist/resolution/goframe-synthesizer.d.ts.map +1 -0
  311. package/dist/resolution/goframe-synthesizer.js +158 -0
  312. package/dist/resolution/goframe-synthesizer.js.map +1 -0
  313. package/dist/resolution/import-resolver.d.ts +10 -0
  314. package/dist/resolution/import-resolver.d.ts.map +1 -1
  315. package/dist/resolution/import-resolver.js +125 -2
  316. package/dist/resolution/import-resolver.js.map +1 -1
  317. package/dist/resolution/index.d.ts +37 -0
  318. package/dist/resolution/index.d.ts.map +1 -1
  319. package/dist/resolution/index.js +306 -3
  320. package/dist/resolution/index.js.map +1 -1
  321. package/dist/resolution/name-matcher.d.ts +41 -0
  322. package/dist/resolution/name-matcher.d.ts.map +1 -1
  323. package/dist/resolution/name-matcher.js +519 -14
  324. package/dist/resolution/name-matcher.js.map +1 -1
  325. package/dist/resolution/strip-comments.d.ts +1 -1
  326. package/dist/resolution/strip-comments.d.ts.map +1 -1
  327. package/dist/resolution/strip-comments.js +2 -0
  328. package/dist/resolution/strip-comments.js.map +1 -1
  329. package/dist/resolution/types.d.ts +20 -3
  330. package/dist/resolution/types.d.ts.map +1 -1
  331. package/dist/search/query-utils.d.ts +17 -1
  332. package/dist/search/query-utils.d.ts.map +1 -1
  333. package/dist/search/query-utils.js +79 -10
  334. package/dist/search/query-utils.js.map +1 -1
  335. package/dist/sync/git-hooks.d.ts +4 -4
  336. package/dist/sync/git-hooks.js +5 -5
  337. package/dist/sync/watcher.d.ts +69 -2
  338. package/dist/sync/watcher.d.ts.map +1 -1
  339. package/dist/sync/watcher.js +226 -21
  340. package/dist/sync/watcher.js.map +1 -1
  341. package/dist/sync/worktree.d.ts +3 -3
  342. package/dist/sync/worktree.js +5 -5
  343. package/dist/telemetry/index.d.ts +143 -0
  344. package/dist/telemetry/index.d.ts.map +1 -0
  345. package/dist/telemetry/index.js +541 -0
  346. package/dist/telemetry/index.js.map +1 -0
  347. package/dist/types.d.ts +18 -3
  348. package/dist/types.d.ts.map +1 -1
  349. package/dist/types.js +3 -1
  350. package/dist/types.js.map +1 -1
  351. package/dist/upgrade/index.d.ts.map +1 -1
  352. package/dist/upgrade/index.js +46 -10
  353. package/dist/upgrade/index.js.map +1 -1
  354. package/dist/utils.d.ts +46 -27
  355. package/dist/utils.d.ts.map +1 -1
  356. package/dist/utils.js +87 -53
  357. package/dist/utils.js.map +1 -1
  358. package/package.json +57 -57
  359. package/scripts/add-lang/bench.sh +60 -60
  360. package/scripts/add-lang/check-grammar.mjs +75 -75
  361. package/scripts/add-lang/dump-ast.mjs +103 -103
  362. package/scripts/add-lang/verify-extraction.mjs +70 -70
  363. package/scripts/agent-eval/ab-adoption.sh +91 -0
  364. package/scripts/agent-eval/ab-hook.sh +86 -0
  365. package/scripts/agent-eval/ab-impl.sh +78 -0
  366. package/scripts/agent-eval/ab-new-vs-baseline.sh +102 -0
  367. package/scripts/agent-eval/ab-sufficiency.sh +78 -0
  368. package/scripts/agent-eval/arms-F.sh +21 -21
  369. package/scripts/agent-eval/arms-matrix.sh +37 -37
  370. package/scripts/agent-eval/audit.sh +68 -68
  371. package/scripts/agent-eval/bench-readme.sh +28 -28
  372. package/scripts/agent-eval/bench-why-repo.sh +22 -22
  373. package/scripts/agent-eval/block-read-hook.sh +19 -19
  374. package/scripts/agent-eval/hook-settings.json +15 -15
  375. package/scripts/agent-eval/itrun.sh +120 -120
  376. package/scripts/agent-eval/offload-eval-3arm.sh +72 -0
  377. package/scripts/agent-eval/offload-eval-cost.mjs +133 -0
  378. package/scripts/agent-eval/offload-eval-effort.mjs +108 -0
  379. package/scripts/agent-eval/offload-eval-frontload-matrix.sh +25 -0
  380. package/scripts/agent-eval/offload-eval-frontload.sh +47 -0
  381. package/scripts/agent-eval/offload-eval-ground-truth.json +18 -0
  382. package/scripts/agent-eval/offload-eval-hook.mjs +84 -0
  383. package/scripts/agent-eval/offload-eval-judge.mjs +103 -0
  384. package/scripts/agent-eval/offload-eval-matrix.sh +20 -0
  385. package/scripts/agent-eval/offload-eval-metrics.mjs +94 -0
  386. package/scripts/agent-eval/offload-eval-refs1.sh +50 -0
  387. package/scripts/agent-eval/offload-eval-setup.sh +24 -0
  388. package/scripts/agent-eval/offload-eval-styles.sh +72 -0
  389. package/scripts/agent-eval/offload-eval-summarize.mjs +68 -0
  390. package/scripts/agent-eval/offload-eval.md +76 -0
  391. package/scripts/agent-eval/parse-arms.mjs +116 -116
  392. package/scripts/agent-eval/parse-bench-readme.mjs +84 -84
  393. package/scripts/agent-eval/parse-run.mjs +45 -45
  394. package/scripts/agent-eval/parse-session.mjs +93 -93
  395. package/scripts/agent-eval/probe-context.mjs +21 -21
  396. package/scripts/agent-eval/probe-explore.mjs +40 -40
  397. package/scripts/agent-eval/probe-node.mjs +20 -20
  398. package/scripts/agent-eval/probe-sweep.mjs +119 -119
  399. package/scripts/agent-eval/probe-trace.mjs +20 -20
  400. package/scripts/agent-eval/redirect-read-hook.sh +38 -0
  401. package/scripts/agent-eval/run-agent.sh +34 -34
  402. package/scripts/agent-eval/run-all.sh +69 -67
  403. package/scripts/agent-eval/run-arms.sh +56 -56
  404. package/scripts/agent-eval/seq-matrix.mjs +137 -137
  405. package/scripts/build-bundle.sh +118 -118
  406. package/scripts/extract-release-notes.mjs +130 -130
  407. package/scripts/local-install.sh +41 -41
  408. package/scripts/npm-sdk.js +75 -75
  409. package/scripts/npm-shim.js +246 -246
  410. package/scripts/pack-npm.sh +119 -119
  411. package/scripts/prepare-release.mjs +270 -270
  412. package/scripts/qa_eval/README.md +400 -0
  413. package/scripts/qa_eval/agent_runner.py +526 -0
  414. package/scripts/qa_eval/data/.gitignore +4 -0
  415. package/scripts/qa_eval/data/test-set.jsonl +22 -0
  416. package/scripts/qa_eval/eval_metrics.py +233 -0
  417. package/scripts/qa_eval/external_agent.py +577 -0
  418. package/scripts/qa_eval/llm_config.py +92 -0
  419. package/scripts/qa_eval/memory_monitor.py +132 -0
  420. package/scripts/qa_eval/my_answer_accuracy.py +187 -0
  421. package/scripts/qa_eval/requirements.txt +2 -0
  422. package/scripts/qa_eval/run_pipeline.py +702 -0
  423. package/scripts/qa_eval/stats_efficiency.py +279 -0
  424. package/scripts/qa_eval/stats_scores.py +207 -0
  425. package/dist/bin/codegraph.d.ts +0 -26
  426. package/dist/bin/codegraph.d.ts.map +0 -1
  427. package/dist/bin/codegraph.js +0 -1572
  428. package/dist/bin/codegraph.js.map +0 -1
  429. package/dist/extraction/arkanalyzer-extractor.d.ts +0 -6
  430. package/dist/extraction/arkanalyzer-extractor.d.ts.map +0 -1
  431. package/dist/extraction/arkanalyzer-extractor.js +0 -11
  432. package/dist/extraction/arkanalyzer-extractor.js.map +0 -1
  433. package/dist/extraction/arkanalyzer-project.d.ts +0 -20
  434. package/dist/extraction/arkanalyzer-project.d.ts.map +0 -1
  435. package/dist/extraction/arkanalyzer-project.js +0 -596
  436. package/dist/extraction/arkanalyzer-project.js.map +0 -1
@@ -57,6 +57,7 @@ function rowToNode(row) {
57
57
  isAbstract: row.is_abstract === 1,
58
58
  decorators: row.decorators ? (0, utils_1.safeJsonParse)(row.decorators, undefined) : undefined,
59
59
  typeParameters: row.type_parameters ? (0, utils_1.safeJsonParse)(row.type_parameters, undefined) : undefined,
60
+ returnType: row.return_type ?? undefined,
60
61
  updatedAt: row.updated_at,
61
62
  };
62
63
  }
@@ -94,6 +95,11 @@ function rowToFileRecord(row) {
94
95
  */
95
96
  class QueryBuilder {
96
97
  db;
98
+ // Project-name tokens (go.mod / package.json / repo dir), normalized. A query
99
+ // word matching one is dropped from path-relevance scoring — it names the
100
+ // whole project, not a symbol, so it carries no discriminative signal (#720).
101
+ // Set once by the HomeGraph instance; empty by default (no down-weighting).
102
+ projectNameTokens = new Set();
97
103
  // Node cache for frequently accessed nodes (LRU-style, max 1000 entries)
98
104
  nodeCache = new Map();
99
105
  maxCacheSize = 1000;
@@ -102,6 +108,15 @@ class QueryBuilder {
102
108
  constructor(db) {
103
109
  this.db = db;
104
110
  }
111
+ /** Set the normalized project-name tokens used to down-weight non-discriminative
112
+ * query words in path scoring (#720). Called once when the project opens. */
113
+ setProjectNameTokens(tokens) {
114
+ this.projectNameTokens = tokens;
115
+ }
116
+ /** The normalized project-name tokens (#720); empty if none were derived. */
117
+ getProjectNameTokens() {
118
+ return this.projectNameTokens;
119
+ }
105
120
  // ===========================================================================
106
121
  // Node Operations
107
122
  // ===========================================================================
@@ -110,25 +125,25 @@ class QueryBuilder {
110
125
  */
111
126
  insertNode(node) {
112
127
  if (!this.stmts.insertNode) {
113
- this.stmts.insertNode = this.db.prepare(`
114
- INSERT OR REPLACE INTO nodes (
115
- id, kind, name, qualified_name, file_path, language,
116
- start_line, end_line, start_column, end_column,
117
- docstring, signature, visibility,
118
- is_exported, is_async, is_static, is_abstract,
119
- decorators, type_parameters, updated_at
120
- ) VALUES (
121
- @id, @kind, @name, @qualifiedName, @filePath, @language,
122
- @startLine, @endLine, @startColumn, @endColumn,
123
- @docstring, @signature, @visibility,
124
- @isExported, @isAsync, @isStatic, @isAbstract,
125
- @decorators, @typeParameters, @updatedAt
126
- )
128
+ this.stmts.insertNode = this.db.prepare(`
129
+ INSERT OR REPLACE INTO nodes (
130
+ id, kind, name, qualified_name, file_path, language,
131
+ start_line, end_line, start_column, end_column,
132
+ docstring, signature, visibility,
133
+ is_exported, is_async, is_static, is_abstract,
134
+ decorators, type_parameters, return_type, updated_at
135
+ ) VALUES (
136
+ @id, @kind, @name, @qualifiedName, @filePath, @language,
137
+ @startLine, @endLine, @startColumn, @endColumn,
138
+ @docstring, @signature, @visibility,
139
+ @isExported, @isAsync, @isStatic, @isAbstract,
140
+ @decorators, @typeParameters, @returnType, @updatedAt
141
+ )
127
142
  `);
128
143
  }
129
144
  // Validate required fields to prevent SQLite bind errors
130
145
  if (!node.id || !node.kind || !node.name || !node.filePath || !node.language) {
131
- console.error('[CodeGraph] Skipping node with missing required fields:', {
146
+ console.error('[HomeGraph] Skipping node with missing required fields:', {
132
147
  id: node.id,
133
148
  kind: node.kind,
134
149
  name: node.name,
@@ -162,6 +177,7 @@ class QueryBuilder {
162
177
  isAbstract: node.isAbstract ? 1 : 0,
163
178
  decorators: node.decorators ? JSON.stringify(node.decorators) : null,
164
179
  typeParameters: node.typeParameters ? JSON.stringify(node.typeParameters) : null,
180
+ returnType: node.returnType ?? null,
165
181
  updatedAt: node.updatedAt ?? Date.now(),
166
182
  });
167
183
  }
@@ -180,35 +196,36 @@ class QueryBuilder {
180
196
  */
181
197
  updateNode(node) {
182
198
  if (!this.stmts.updateNode) {
183
- this.stmts.updateNode = this.db.prepare(`
184
- UPDATE nodes SET
185
- kind = @kind,
186
- name = @name,
187
- qualified_name = @qualifiedName,
188
- file_path = @filePath,
189
- language = @language,
190
- start_line = @startLine,
191
- end_line = @endLine,
192
- start_column = @startColumn,
193
- end_column = @endColumn,
194
- docstring = @docstring,
195
- signature = @signature,
196
- visibility = @visibility,
197
- is_exported = @isExported,
198
- is_async = @isAsync,
199
- is_static = @isStatic,
200
- is_abstract = @isAbstract,
201
- decorators = @decorators,
202
- type_parameters = @typeParameters,
203
- updated_at = @updatedAt
204
- WHERE id = @id
199
+ this.stmts.updateNode = this.db.prepare(`
200
+ UPDATE nodes SET
201
+ kind = @kind,
202
+ name = @name,
203
+ qualified_name = @qualifiedName,
204
+ file_path = @filePath,
205
+ language = @language,
206
+ start_line = @startLine,
207
+ end_line = @endLine,
208
+ start_column = @startColumn,
209
+ end_column = @endColumn,
210
+ docstring = @docstring,
211
+ signature = @signature,
212
+ visibility = @visibility,
213
+ is_exported = @isExported,
214
+ is_async = @isAsync,
215
+ is_static = @isStatic,
216
+ is_abstract = @isAbstract,
217
+ decorators = @decorators,
218
+ type_parameters = @typeParameters,
219
+ return_type = @returnType,
220
+ updated_at = @updatedAt
221
+ WHERE id = @id
205
222
  `);
206
223
  }
207
224
  // Invalidate cache before update
208
225
  this.nodeCache.delete(node.id);
209
226
  // Validate required fields
210
227
  if (!node.id || !node.kind || !node.name || !node.filePath || !node.language) {
211
- console.error('[CodeGraph] Skipping node update with missing required fields:', node.id);
228
+ console.error('[HomeGraph] Skipping node update with missing required fields:', node.id);
212
229
  return;
213
230
  }
214
231
  this.stmts.updateNode.run({
@@ -231,6 +248,7 @@ class QueryBuilder {
231
248
  isAbstract: node.isAbstract ? 1 : 0,
232
249
  decorators: node.decorators ? JSON.stringify(node.decorators) : null,
233
250
  typeParameters: node.typeParameters ? JSON.stringify(node.typeParameters) : null,
251
+ returnType: node.returnType ?? null,
234
252
  updatedAt: node.updatedAt ?? Date.now(),
235
253
  });
236
254
  }
@@ -408,15 +426,15 @@ class QueryBuilder {
408
426
  // protobuf stub) outranks the real `server/etcdserver/server.go`
409
427
  // (470 edges) by 4×, and the boost would push the agent toward
410
428
  // generated code.
411
- this.stmts.getDominantFile = this.db.prepare(`
412
- SELECT n.file_path AS file_path, COUNT(*) AS edge_count
413
- FROM edges e
414
- JOIN nodes n ON e.source = n.id
415
- JOIN nodes m ON e.target = m.id
416
- WHERE n.file_path = m.file_path
417
- GROUP BY n.file_path
418
- ORDER BY edge_count DESC
419
- LIMIT 20
429
+ this.stmts.getDominantFile = this.db.prepare(`
430
+ SELECT n.file_path AS file_path, COUNT(*) AS edge_count
431
+ FROM edges e
432
+ JOIN nodes n ON e.source = n.id
433
+ JOIN nodes m ON e.target = m.id
434
+ WHERE n.file_path = m.file_path
435
+ GROUP BY n.file_path
436
+ ORDER BY edge_count DESC
437
+ LIMIT 20
420
438
  `);
421
439
  }
422
440
  const rows = this.stmts.getDominantFile.all();
@@ -434,7 +452,7 @@ class QueryBuilder {
434
452
  * `route` nodes (framework-emitted: Express/Gin/Flask/Rails/Drupal/etc.).
435
453
  * Used by handleContext on small repos to inline the project's routing
436
454
  * config when the agent's query is about request flow — eliminating the
437
- * "Glob + Read routes.rb" pattern that beats codegraph on tiny realworld
455
+ * "Glob + Read routes.rb" pattern that beats homegraph on tiny realworld
438
456
  * template repos.
439
457
  *
440
458
  * Excludes test/generated files from candidacy. Returns null if there
@@ -443,13 +461,13 @@ class QueryBuilder {
443
461
  */
444
462
  getTopRouteFile() {
445
463
  if (!this.stmts.getTopRouteFile) {
446
- this.stmts.getTopRouteFile = this.db.prepare(`
447
- SELECT file_path, COUNT(*) AS cnt
448
- FROM nodes
449
- WHERE kind = 'route'
450
- GROUP BY file_path
451
- ORDER BY cnt DESC
452
- LIMIT 20
464
+ this.stmts.getTopRouteFile = this.db.prepare(`
465
+ SELECT file_path, COUNT(*) AS cnt
466
+ FROM nodes
467
+ WHERE kind = 'route'
468
+ GROUP BY file_path
469
+ ORDER BY cnt DESC
470
+ LIMIT 20
453
471
  `);
454
472
  }
455
473
  const rows = this.stmts.getTopRouteFile.all();
@@ -480,21 +498,21 @@ class QueryBuilder {
480
498
  // Edge kind varies across framework resolvers: Spring/Rails/
481
499
  // Laravel/Drupal emit `references`, Express emits `calls`. Accept
482
500
  // both — the semantic is the same (route → its handler).
483
- this.stmts.getRoutingManifest = this.db.prepare(`
484
- SELECT
485
- r.name AS url,
486
- h.name AS handler,
487
- h.file_path AS handler_file,
488
- h.start_line AS handler_line,
489
- h.kind AS handler_kind
490
- FROM nodes r
491
- JOIN edges e ON e.source = r.id
492
- JOIN nodes h ON e.target = h.id
493
- WHERE r.kind = 'route'
494
- AND e.kind IN ('references', 'calls')
495
- AND h.kind IN ('function', 'method', 'class')
496
- ORDER BY r.file_path, r.start_line
497
- LIMIT ?
501
+ this.stmts.getRoutingManifest = this.db.prepare(`
502
+ SELECT
503
+ r.name AS url,
504
+ h.name AS handler,
505
+ h.file_path AS handler_file,
506
+ h.start_line AS handler_line,
507
+ h.kind AS handler_kind
508
+ FROM nodes r
509
+ JOIN edges e ON e.source = r.id
510
+ JOIN nodes h ON e.target = h.id
511
+ WHERE r.kind = 'route'
512
+ AND e.kind IN ('references', 'calls')
513
+ AND h.kind IN ('function', 'method', 'class')
514
+ ORDER BY r.file_path, r.start_line
515
+ LIMIT ?
498
516
  `);
499
517
  }
500
518
  const rows = this.stmts.getRoutingManifest.all(limit);
@@ -677,7 +695,7 @@ class QueryBuilder {
677
695
  ...r,
678
696
  score: r.score
679
697
  + (0, query_utils_1.kindBonus)(r.node.kind)
680
- + (0, query_utils_1.scorePathRelevance)(r.node.filePath, scoringQuery)
698
+ + (0, query_utils_1.scorePathRelevance)(r.node.filePath, scoringQuery, this.projectNameTokens)
681
699
  + (0, query_utils_1.nameMatchBonus)(r.node.name, scoringQuery),
682
700
  }));
683
701
  results.sort((a, b) => b.score - a.score);
@@ -820,11 +838,11 @@ class QueryBuilder {
820
838
  // Fetch 5x requested limit so post-hoc rescoring (kindBonus, pathRelevance,
821
839
  // nameMatchBonus) can promote results that BM25 alone undervalues.
822
840
  const ftsLimit = Math.max(limit * 5, 100);
823
- let sql = `
824
- SELECT nodes.*, bm25(nodes_fts, 0, 20, 5, 1, 2) as score
825
- FROM nodes_fts
826
- JOIN nodes ON nodes_fts.id = nodes.id
827
- WHERE nodes_fts MATCH ?
841
+ let sql = `
842
+ SELECT nodes.*, bm25(nodes_fts, 0, 20, 5, 1, 2) as score
843
+ FROM nodes_fts
844
+ JOIN nodes ON nodes_fts.id = nodes.id
845
+ WHERE nodes_fts MATCH ?
828
846
  `;
829
847
  const params = [ftsQuery];
830
848
  if (kinds && kinds.length > 0) {
@@ -855,21 +873,21 @@ class QueryBuilder {
855
873
  */
856
874
  searchNodesLike(query, options) {
857
875
  const { kinds, languages, limit = 100, offset = 0 } = options;
858
- let sql = `
859
- SELECT nodes.*,
860
- CASE
861
- WHEN name = ? THEN 1.0
862
- WHEN name LIKE ? THEN 0.9
863
- WHEN name LIKE ? THEN 0.8
864
- WHEN qualified_name LIKE ? THEN 0.7
865
- ELSE 0.5
866
- END as score
867
- FROM nodes
868
- WHERE (
869
- name LIKE ? OR
870
- qualified_name LIKE ? OR
871
- name LIKE ?
872
- )
876
+ let sql = `
877
+ SELECT nodes.*,
878
+ CASE
879
+ WHEN name = ? THEN 1.0
880
+ WHEN name LIKE ? THEN 0.9
881
+ WHEN name LIKE ? THEN 0.8
882
+ WHEN qualified_name LIKE ? THEN 0.7
883
+ ELSE 0.5
884
+ END as score
885
+ FROM nodes
886
+ WHERE (
887
+ name LIKE ? OR
888
+ qualified_name LIKE ? OR
889
+ name LIKE ?
890
+ )
873
891
  `;
874
892
  // Pattern variants for better matching
875
893
  const exactMatch = query;
@@ -943,10 +961,10 @@ class QueryBuilder {
943
961
  const allResults = [];
944
962
  const seenIds = new Set();
945
963
  for (const name of names) {
946
- let sql = `
947
- SELECT nodes.*, 1.0 as score
948
- FROM nodes
949
- WHERE name COLLATE NOCASE = ?
964
+ let sql = `
965
+ SELECT nodes.*, 1.0 as score
966
+ FROM nodes
967
+ WHERE name COLLATE NOCASE = ?
950
968
  `;
951
969
  const params = [name];
952
970
  if (kinds && kinds.length > 0) {
@@ -990,10 +1008,10 @@ class QueryBuilder {
990
1008
  */
991
1009
  findNodesByNameSubstring(substring, options = {}) {
992
1010
  const { kinds, languages, limit = 30, excludePrefix } = options;
993
- let sql = `
994
- SELECT nodes.*, 1.0 as score
995
- FROM nodes
996
- WHERE name LIKE ?
1011
+ let sql = `
1012
+ SELECT nodes.*, 1.0 as score
1013
+ FROM nodes
1014
+ WHERE name LIKE ?
997
1015
  `;
998
1016
  const params = [`%${substring}%`];
999
1017
  // Exclude prefix matches (handled by FTS-based prefix search in Step 2b)
@@ -1025,9 +1043,9 @@ class QueryBuilder {
1025
1043
  */
1026
1044
  insertEdge(edge) {
1027
1045
  if (!this.stmts.insertEdge) {
1028
- this.stmts.insertEdge = this.db.prepare(`
1029
- INSERT OR IGNORE INTO edges (source, target, kind, metadata, line, col, provenance)
1030
- VALUES (@source, @target, @kind, @metadata, @line, @col, @provenance)
1046
+ this.stmts.insertEdge = this.db.prepare(`
1047
+ INSERT OR IGNORE INTO edges (source, target, kind, metadata, line, col, provenance)
1048
+ VALUES (@source, @target, @kind, @metadata, @line, @col, @provenance)
1031
1049
  `);
1032
1050
  }
1033
1051
  this.stmts.insertEdge.run({
@@ -1143,12 +1161,12 @@ class QueryBuilder {
1143
1161
  * it. One indexed query (idx_nodes_file_path + idx_edges_target_kind).
1144
1162
  */
1145
1163
  getDependentFilePaths(filePath) {
1146
- const sql = `SELECT DISTINCT src.file_path AS fp
1147
- FROM edges e
1148
- JOIN nodes tgt ON tgt.id = e.target
1149
- JOIN nodes src ON src.id = e.source
1150
- WHERE tgt.file_path = ?
1151
- AND e.kind != 'contains'
1164
+ const sql = `SELECT DISTINCT src.file_path AS fp
1165
+ FROM edges e
1166
+ JOIN nodes tgt ON tgt.id = e.target
1167
+ JOIN nodes src ON src.id = e.source
1168
+ WHERE tgt.file_path = ?
1169
+ AND e.kind != 'contains'
1152
1170
  AND src.file_path != ?`;
1153
1171
  const rows = this.db.prepare(sql).all(filePath, filePath);
1154
1172
  return rows.map((r) => r.fp);
@@ -1160,26 +1178,51 @@ class QueryBuilder {
1160
1178
  * (all kinds except `contains`); same reason imports-only is insufficient.
1161
1179
  */
1162
1180
  getDependencyFilePaths(filePath) {
1163
- const sql = `SELECT DISTINCT tgt.file_path AS fp
1164
- FROM edges e
1165
- JOIN nodes src ON src.id = e.source
1166
- JOIN nodes tgt ON tgt.id = e.target
1167
- WHERE src.file_path = ?
1168
- AND e.kind != 'contains'
1181
+ const sql = `SELECT DISTINCT tgt.file_path AS fp
1182
+ FROM edges e
1183
+ JOIN nodes src ON src.id = e.source
1184
+ JOIN nodes tgt ON tgt.id = e.target
1185
+ WHERE src.file_path = ?
1186
+ AND e.kind != 'contains'
1169
1187
  AND tgt.file_path != ?`;
1170
1188
  const rows = this.db.prepare(sql).all(filePath, filePath);
1171
1189
  return rows.map((r) => r.fp);
1172
1190
  }
1191
+ /**
1192
+ * Cross-file edges whose TARGET is a node in `filePath` and whose SOURCE is a
1193
+ * node in a *different* file, paired with the target node's (name, kind) so a
1194
+ * caller can re-resolve the edge to the re-indexed target's new ID (node IDs
1195
+ * are `sha256(filePath:kind:name:line)`, so any line shift in the callee file
1196
+ * changes target IDs and a naive re-insert by old ID silently drops them).
1197
+ * Used by `storeExtractionResult` to preserve incoming edges across a file
1198
+ * re-index (issue #899). Same edge-kind rules as
1199
+ * {@link getDependentFilePaths}: all kinds except `contains`.
1200
+ */
1201
+ getCrossFileIncomingEdgesWithTarget(filePath) {
1202
+ const sql = `SELECT e.*, tgt.name AS target_name, tgt.kind AS target_kind
1203
+ FROM edges e
1204
+ JOIN nodes tgt ON tgt.id = e.target
1205
+ JOIN nodes src ON src.id = e.source
1206
+ WHERE tgt.file_path = ?
1207
+ AND e.kind != 'contains'
1208
+ AND src.file_path != ?`;
1209
+ const rows = this.db.prepare(sql).all(filePath, filePath);
1210
+ return rows.map(row => ({
1211
+ ...rowToEdge(row),
1212
+ targetName: row.target_name,
1213
+ targetKind: row.target_kind,
1214
+ }));
1215
+ }
1173
1216
  /**
1174
1217
  * Remove ArkTS RTA call edges persisted at batch scope (cross-file).
1175
1218
  * Per-file edges are removed by {@link deleteFile} during re-index.
1176
1219
  */
1177
1220
  deleteArkTSCrossFileCallEdges() {
1178
1221
  const result = this.db
1179
- .prepare(`DELETE FROM edges
1180
- WHERE kind = 'calls'
1181
- AND provenance = 'heuristic'
1182
- AND metadata LIKE '%"synthesizedBy":"arkanalyzer"%'
1222
+ .prepare(`DELETE FROM edges
1223
+ WHERE kind = 'calls'
1224
+ AND provenance = 'heuristic'
1225
+ AND metadata LIKE '%"synthesizedBy":"arkanalyzer"%'
1183
1226
  AND metadata LIKE '%"sourceFile"%'`)
1184
1227
  .run();
1185
1228
  return result.changes;
@@ -1192,17 +1235,17 @@ class QueryBuilder {
1192
1235
  */
1193
1236
  upsertFile(file) {
1194
1237
  if (!this.stmts.upsertFile) {
1195
- this.stmts.upsertFile = this.db.prepare(`
1196
- INSERT INTO files (path, content_hash, language, size, modified_at, indexed_at, node_count, errors)
1197
- VALUES (@path, @contentHash, @language, @size, @modifiedAt, @indexedAt, @nodeCount, @errors)
1198
- ON CONFLICT(path) DO UPDATE SET
1199
- content_hash = @contentHash,
1200
- language = @language,
1201
- size = @size,
1202
- modified_at = @modifiedAt,
1203
- indexed_at = @indexedAt,
1204
- node_count = @nodeCount,
1205
- errors = @errors
1238
+ this.stmts.upsertFile = this.db.prepare(`
1239
+ INSERT INTO files (path, content_hash, language, size, modified_at, indexed_at, node_count, errors)
1240
+ VALUES (@path, @contentHash, @language, @size, @modifiedAt, @indexedAt, @nodeCount, @errors)
1241
+ ON CONFLICT(path) DO UPDATE SET
1242
+ content_hash = @contentHash,
1243
+ language = @language,
1244
+ size = @size,
1245
+ modified_at = @modifiedAt,
1246
+ indexed_at = @indexedAt,
1247
+ node_count = @nodeCount,
1248
+ errors = @errors
1206
1249
  `);
1207
1250
  }
1208
1251
  this.stmts.upsertFile.run({
@@ -1276,9 +1319,9 @@ class QueryBuilder {
1276
1319
  */
1277
1320
  insertUnresolvedRef(ref) {
1278
1321
  if (!this.stmts.insertUnresolved) {
1279
- this.stmts.insertUnresolved = this.db.prepare(`
1280
- INSERT INTO unresolved_refs (from_node_id, reference_name, reference_kind, line, col, candidates, file_path, language)
1281
- VALUES (@fromNodeId, @referenceName, @referenceKind, @line, @col, @candidates, @filePath, @language)
1322
+ this.stmts.insertUnresolved = this.db.prepare(`
1323
+ INSERT INTO unresolved_refs (from_node_id, reference_name, reference_kind, line, col, candidates, file_path, language)
1324
+ VALUES (@fromNodeId, @referenceName, @referenceKind, @line, @col, @candidates, @filePath, @language)
1282
1325
  `);
1283
1326
  }
1284
1327
  this.stmts.insertUnresolved.run({
@@ -1480,11 +1523,11 @@ class QueryBuilder {
1480
1523
  */
1481
1524
  getStats() {
1482
1525
  // Single query for all three aggregate counts
1483
- const counts = this.db.prepare(`
1484
- SELECT
1485
- (SELECT COUNT(*) FROM nodes) AS node_count,
1486
- (SELECT COUNT(*) FROM edges) AS edge_count,
1487
- (SELECT COUNT(*) FROM files) AS file_count
1526
+ const counts = this.db.prepare(`
1527
+ SELECT
1528
+ (SELECT COUNT(*) FROM nodes) AS node_count,
1529
+ (SELECT COUNT(*) FROM edges) AS edge_count,
1530
+ (SELECT COUNT(*) FROM files) AS file_count
1488
1531
  `).get();
1489
1532
  const nodesByKind = {};
1490
1533
  const nodeKindRows = this.db