@optave/codegraph 3.13.0 → 3.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. package/README.md +35 -34
  2. package/dist/ast-analysis/engine.d.ts.map +1 -1
  3. package/dist/ast-analysis/engine.js +38 -40
  4. package/dist/ast-analysis/engine.js.map +1 -1
  5. package/dist/ast-analysis/rules/b2.d.ts +7 -0
  6. package/dist/ast-analysis/rules/b2.d.ts.map +1 -0
  7. package/dist/ast-analysis/rules/b2.js +240 -0
  8. package/dist/ast-analysis/rules/b2.js.map +1 -0
  9. package/dist/ast-analysis/rules/b3.d.ts +6 -0
  10. package/dist/ast-analysis/rules/b3.d.ts.map +1 -0
  11. package/dist/ast-analysis/rules/b3.js +105 -0
  12. package/dist/ast-analysis/rules/b3.js.map +1 -0
  13. package/dist/ast-analysis/rules/b4.d.ts +9 -0
  14. package/dist/ast-analysis/rules/b4.d.ts.map +1 -0
  15. package/dist/ast-analysis/rules/b4.js +361 -0
  16. package/dist/ast-analysis/rules/b4.js.map +1 -0
  17. package/dist/ast-analysis/rules/b5.d.ts +4 -0
  18. package/dist/ast-analysis/rules/b5.d.ts.map +1 -0
  19. package/dist/ast-analysis/rules/b5.js +52 -0
  20. package/dist/ast-analysis/rules/b5.js.map +1 -0
  21. package/dist/ast-analysis/rules/c.d.ts +4 -0
  22. package/dist/ast-analysis/rules/c.d.ts.map +1 -0
  23. package/dist/ast-analysis/rules/c.js +143 -0
  24. package/dist/ast-analysis/rules/c.js.map +1 -0
  25. package/dist/ast-analysis/rules/index.d.ts.map +1 -1
  26. package/dist/ast-analysis/rules/index.js +34 -0
  27. package/dist/ast-analysis/rules/index.js.map +1 -1
  28. package/dist/ast-analysis/rules/javascript.d.ts.map +1 -1
  29. package/dist/ast-analysis/rules/javascript.js +3 -0
  30. package/dist/ast-analysis/rules/javascript.js.map +1 -1
  31. package/dist/ast-analysis/shared.d.ts.map +1 -1
  32. package/dist/ast-analysis/shared.js +2 -0
  33. package/dist/ast-analysis/shared.js.map +1 -1
  34. package/dist/ast-analysis/visitor-utils.d.ts +1 -0
  35. package/dist/ast-analysis/visitor-utils.d.ts.map +1 -1
  36. package/dist/ast-analysis/visitor-utils.js +5 -0
  37. package/dist/ast-analysis/visitor-utils.js.map +1 -1
  38. package/dist/ast-analysis/visitor.d.ts.map +1 -1
  39. package/dist/ast-analysis/visitor.js +60 -47
  40. package/dist/ast-analysis/visitor.js.map +1 -1
  41. package/dist/ast-analysis/visitors/cfg-visitor.d.ts.map +1 -1
  42. package/dist/ast-analysis/visitors/cfg-visitor.js +126 -76
  43. package/dist/ast-analysis/visitors/cfg-visitor.js.map +1 -1
  44. package/dist/ast-analysis/visitors/complexity-visitor.d.ts.map +1 -1
  45. package/dist/ast-analysis/visitors/complexity-visitor.js +27 -15
  46. package/dist/ast-analysis/visitors/complexity-visitor.js.map +1 -1
  47. package/dist/ast-analysis/visitors/dataflow-visitor.d.ts.map +1 -1
  48. package/dist/ast-analysis/visitors/dataflow-visitor.js +54 -21
  49. package/dist/ast-analysis/visitors/dataflow-visitor.js.map +1 -1
  50. package/dist/cli/commands/config.d.ts.map +1 -1
  51. package/dist/cli/commands/config.js +137 -134
  52. package/dist/cli/commands/config.js.map +1 -1
  53. package/dist/cli/commands/roles.d.ts.map +1 -1
  54. package/dist/cli/commands/roles.js +6 -1
  55. package/dist/cli/commands/roles.js.map +1 -1
  56. package/dist/db/better-sqlite3.d.ts +2 -1
  57. package/dist/db/better-sqlite3.d.ts.map +1 -1
  58. package/dist/db/better-sqlite3.js.map +1 -1
  59. package/dist/db/connection.d.ts +7 -1
  60. package/dist/db/connection.d.ts.map +1 -1
  61. package/dist/db/connection.js +20 -5
  62. package/dist/db/connection.js.map +1 -1
  63. package/dist/db/index.d.ts +1 -1
  64. package/dist/db/index.d.ts.map +1 -1
  65. package/dist/db/index.js +1 -1
  66. package/dist/db/index.js.map +1 -1
  67. package/dist/db/migrations.d.ts.map +1 -1
  68. package/dist/db/migrations.js +68 -0
  69. package/dist/db/migrations.js.map +1 -1
  70. package/dist/db/repository/build-stmts.d.ts.map +1 -1
  71. package/dist/db/repository/build-stmts.js +18 -0
  72. package/dist/db/repository/build-stmts.js.map +1 -1
  73. package/dist/db/repository/dataflow.d.ts +5 -0
  74. package/dist/db/repository/dataflow.d.ts.map +1 -1
  75. package/dist/db/repository/dataflow.js +14 -0
  76. package/dist/db/repository/dataflow.js.map +1 -1
  77. package/dist/db/repository/index.d.ts +1 -1
  78. package/dist/db/repository/index.d.ts.map +1 -1
  79. package/dist/db/repository/index.js +1 -1
  80. package/dist/db/repository/index.js.map +1 -1
  81. package/dist/db/repository/native-repository.d.ts.map +1 -1
  82. package/dist/db/repository/native-repository.js +47 -34
  83. package/dist/db/repository/native-repository.js.map +1 -1
  84. package/dist/domain/analysis/context.d.ts +2 -2
  85. package/dist/domain/analysis/dependencies.d.ts +2 -2
  86. package/dist/domain/analysis/diff-impact.d.ts +2 -2
  87. package/dist/domain/analysis/fn-impact.d.ts +3 -1
  88. package/dist/domain/analysis/fn-impact.d.ts.map +1 -1
  89. package/dist/domain/analysis/fn-impact.js +4 -0
  90. package/dist/domain/analysis/fn-impact.js.map +1 -1
  91. package/dist/domain/analysis/implementations.d.ts +2 -2
  92. package/dist/domain/analysis/module-map.d.ts.map +1 -1
  93. package/dist/domain/analysis/module-map.js +32 -5
  94. package/dist/domain/analysis/module-map.js.map +1 -1
  95. package/dist/domain/analysis/roles.d.ts +7 -1
  96. package/dist/domain/analysis/roles.d.ts.map +1 -1
  97. package/dist/domain/analysis/roles.js +16 -0
  98. package/dist/domain/analysis/roles.js.map +1 -1
  99. package/dist/domain/analysis/symbol-lookup.d.ts +4 -4
  100. package/dist/domain/graph/builder/call-resolver.d.ts +17 -5
  101. package/dist/domain/graph/builder/call-resolver.d.ts.map +1 -1
  102. package/dist/domain/graph/builder/call-resolver.js +85 -220
  103. package/dist/domain/graph/builder/call-resolver.js.map +1 -1
  104. package/dist/domain/graph/builder/context.d.ts +1 -0
  105. package/dist/domain/graph/builder/context.d.ts.map +1 -1
  106. package/dist/domain/graph/builder/context.js.map +1 -1
  107. package/dist/domain/graph/builder/helpers.d.ts +16 -1
  108. package/dist/domain/graph/builder/helpers.d.ts.map +1 -1
  109. package/dist/domain/graph/builder/helpers.js +162 -72
  110. package/dist/domain/graph/builder/helpers.js.map +1 -1
  111. package/dist/domain/graph/builder/incremental.d.ts.map +1 -1
  112. package/dist/domain/graph/builder/incremental.js +166 -97
  113. package/dist/domain/graph/builder/incremental.js.map +1 -1
  114. package/dist/domain/graph/builder/pipeline.d.ts.map +1 -1
  115. package/dist/domain/graph/builder/pipeline.js +10 -4
  116. package/dist/domain/graph/builder/pipeline.js.map +1 -1
  117. package/dist/domain/graph/builder/stages/build-edges.d.ts.map +1 -1
  118. package/dist/domain/graph/builder/stages/build-edges.js +496 -250
  119. package/dist/domain/graph/builder/stages/build-edges.js.map +1 -1
  120. package/dist/domain/graph/builder/stages/collect-files.d.ts.map +1 -1
  121. package/dist/domain/graph/builder/stages/collect-files.js +10 -7
  122. package/dist/domain/graph/builder/stages/collect-files.js.map +1 -1
  123. package/dist/domain/graph/builder/stages/detect-changes.d.ts.map +1 -1
  124. package/dist/domain/graph/builder/stages/detect-changes.js +2 -1
  125. package/dist/domain/graph/builder/stages/detect-changes.js.map +1 -1
  126. package/dist/domain/graph/builder/stages/native-orchestrator.d.ts.map +1 -1
  127. package/dist/domain/graph/builder/stages/native-orchestrator.js +895 -545
  128. package/dist/domain/graph/builder/stages/native-orchestrator.js.map +1 -1
  129. package/dist/domain/graph/resolver/points-to.d.ts.map +1 -1
  130. package/dist/domain/graph/resolver/points-to.js +105 -57
  131. package/dist/domain/graph/resolver/points-to.js.map +1 -1
  132. package/dist/domain/graph/resolver/strategy.d.ts +61 -0
  133. package/dist/domain/graph/resolver/strategy.d.ts.map +1 -0
  134. package/dist/domain/graph/resolver/strategy.js +222 -0
  135. package/dist/domain/graph/resolver/strategy.js.map +1 -0
  136. package/dist/domain/graph/watcher.d.ts.map +1 -1
  137. package/dist/domain/graph/watcher.js +16 -9
  138. package/dist/domain/graph/watcher.js.map +1 -1
  139. package/dist/domain/parser.d.ts +12 -0
  140. package/dist/domain/parser.d.ts.map +1 -1
  141. package/dist/domain/parser.js +12 -2
  142. package/dist/domain/parser.js.map +1 -1
  143. package/dist/domain/queries.d.ts +1 -1
  144. package/dist/domain/queries.d.ts.map +1 -1
  145. package/dist/domain/queries.js +1 -1
  146. package/dist/domain/queries.js.map +1 -1
  147. package/dist/domain/wasm-worker-entry.js +3 -0
  148. package/dist/domain/wasm-worker-entry.js.map +1 -1
  149. package/dist/domain/wasm-worker-pool.d.ts.map +1 -1
  150. package/dist/domain/wasm-worker-pool.js +24 -5
  151. package/dist/domain/wasm-worker-pool.js.map +1 -1
  152. package/dist/domain/wasm-worker-protocol.d.ts +7 -0
  153. package/dist/domain/wasm-worker-protocol.d.ts.map +1 -1
  154. package/dist/extractors/dart.js +48 -3
  155. package/dist/extractors/dart.js.map +1 -1
  156. package/dist/extractors/groovy.js +62 -3
  157. package/dist/extractors/groovy.js.map +1 -1
  158. package/dist/extractors/helpers.d.ts +4 -2
  159. package/dist/extractors/helpers.d.ts.map +1 -1
  160. package/dist/extractors/helpers.js +5 -1
  161. package/dist/extractors/helpers.js.map +1 -1
  162. package/dist/extractors/java.js +77 -1
  163. package/dist/extractors/java.js.map +1 -1
  164. package/dist/extractors/javascript.d.ts.map +1 -1
  165. package/dist/extractors/javascript.js +549 -163
  166. package/dist/extractors/javascript.js.map +1 -1
  167. package/dist/extractors/kotlin.js +58 -3
  168. package/dist/extractors/kotlin.js.map +1 -1
  169. package/dist/extractors/objc.js +25 -2
  170. package/dist/extractors/objc.js.map +1 -1
  171. package/dist/extractors/scala.js +62 -2
  172. package/dist/extractors/scala.js.map +1 -1
  173. package/dist/extractors/swift.js +52 -3
  174. package/dist/extractors/swift.js.map +1 -1
  175. package/dist/features/audit.js +26 -23
  176. package/dist/features/audit.js.map +1 -1
  177. package/dist/features/boundaries.d.ts.map +1 -1
  178. package/dist/features/boundaries.js +12 -9
  179. package/dist/features/boundaries.js.map +1 -1
  180. package/dist/features/cfg.d.ts.map +1 -1
  181. package/dist/features/cfg.js +25 -18
  182. package/dist/features/cfg.js.map +1 -1
  183. package/dist/features/check.d.ts.map +1 -1
  184. package/dist/features/check.js +18 -5
  185. package/dist/features/check.js.map +1 -1
  186. package/dist/features/communities.d.ts +4 -2
  187. package/dist/features/communities.d.ts.map +1 -1
  188. package/dist/features/communities.js +6 -4
  189. package/dist/features/communities.js.map +1 -1
  190. package/dist/features/dataflow.d.ts +60 -0
  191. package/dist/features/dataflow.d.ts.map +1 -1
  192. package/dist/features/dataflow.js +530 -6
  193. package/dist/features/dataflow.js.map +1 -1
  194. package/dist/features/manifesto.d.ts.map +1 -1
  195. package/dist/features/manifesto.js +59 -72
  196. package/dist/features/manifesto.js.map +1 -1
  197. package/dist/features/sequence.d.ts.map +1 -1
  198. package/dist/features/sequence.js +27 -22
  199. package/dist/features/sequence.js.map +1 -1
  200. package/dist/features/snapshot.d.ts.map +1 -1
  201. package/dist/features/snapshot.js +36 -28
  202. package/dist/features/snapshot.js.map +1 -1
  203. package/dist/features/structure.d.ts.map +1 -1
  204. package/dist/features/structure.js +150 -62
  205. package/dist/features/structure.js.map +1 -1
  206. package/dist/features/triage.d.ts.map +1 -1
  207. package/dist/features/triage.js +18 -11
  208. package/dist/features/triage.js.map +1 -1
  209. package/dist/graph/algorithms/bfs.d.ts +1 -1
  210. package/dist/graph/algorithms/bfs.d.ts.map +1 -1
  211. package/dist/graph/algorithms/bfs.js +14 -13
  212. package/dist/graph/algorithms/bfs.js.map +1 -1
  213. package/dist/graph/algorithms/tarjan.d.ts.map +1 -1
  214. package/dist/graph/algorithms/tarjan.js +5 -0
  215. package/dist/graph/algorithms/tarjan.js.map +1 -1
  216. package/dist/graph/builders/dependency.js +28 -22
  217. package/dist/graph/builders/dependency.js.map +1 -1
  218. package/dist/graph/classifiers/roles.d.ts +10 -1
  219. package/dist/graph/classifiers/roles.d.ts.map +1 -1
  220. package/dist/graph/classifiers/roles.js +60 -6
  221. package/dist/graph/classifiers/roles.js.map +1 -1
  222. package/dist/infrastructure/config.d.ts +10 -0
  223. package/dist/infrastructure/config.d.ts.map +1 -1
  224. package/dist/infrastructure/config.js +31 -3
  225. package/dist/infrastructure/config.js.map +1 -1
  226. package/dist/infrastructure/registry.d.ts +0 -7
  227. package/dist/infrastructure/registry.d.ts.map +1 -1
  228. package/dist/infrastructure/registry.js +29 -13
  229. package/dist/infrastructure/registry.js.map +1 -1
  230. package/dist/infrastructure/update-check.d.ts.map +1 -1
  231. package/dist/infrastructure/update-check.js +49 -31
  232. package/dist/infrastructure/update-check.js.map +1 -1
  233. package/dist/mcp/server.d.ts +2 -10
  234. package/dist/mcp/server.d.ts.map +1 -1
  235. package/dist/mcp/server.js.map +1 -1
  236. package/dist/mcp/tools/ast-query.d.ts +1 -1
  237. package/dist/mcp/tools/ast-query.d.ts.map +1 -1
  238. package/dist/mcp/tools/audit.d.ts +1 -1
  239. package/dist/mcp/tools/audit.d.ts.map +1 -1
  240. package/dist/mcp/tools/batch-query.d.ts +1 -1
  241. package/dist/mcp/tools/batch-query.d.ts.map +1 -1
  242. package/dist/mcp/tools/branch-compare.d.ts +1 -1
  243. package/dist/mcp/tools/branch-compare.d.ts.map +1 -1
  244. package/dist/mcp/tools/brief.d.ts +1 -1
  245. package/dist/mcp/tools/brief.d.ts.map +1 -1
  246. package/dist/mcp/tools/cfg.d.ts +1 -1
  247. package/dist/mcp/tools/cfg.d.ts.map +1 -1
  248. package/dist/mcp/tools/check.d.ts +1 -1
  249. package/dist/mcp/tools/check.d.ts.map +1 -1
  250. package/dist/mcp/tools/co-changes.d.ts +1 -1
  251. package/dist/mcp/tools/co-changes.d.ts.map +1 -1
  252. package/dist/mcp/tools/code-owners.d.ts +1 -1
  253. package/dist/mcp/tools/code-owners.d.ts.map +1 -1
  254. package/dist/mcp/tools/communities.d.ts +1 -1
  255. package/dist/mcp/tools/communities.d.ts.map +1 -1
  256. package/dist/mcp/tools/complexity.d.ts +1 -1
  257. package/dist/mcp/tools/complexity.d.ts.map +1 -1
  258. package/dist/mcp/tools/context.d.ts +1 -1
  259. package/dist/mcp/tools/context.d.ts.map +1 -1
  260. package/dist/mcp/tools/dataflow.d.ts +1 -1
  261. package/dist/mcp/tools/dataflow.d.ts.map +1 -1
  262. package/dist/mcp/tools/diff-impact.d.ts +1 -1
  263. package/dist/mcp/tools/diff-impact.d.ts.map +1 -1
  264. package/dist/mcp/tools/execution-flow.d.ts +1 -1
  265. package/dist/mcp/tools/execution-flow.d.ts.map +1 -1
  266. package/dist/mcp/tools/export-graph.d.ts +1 -1
  267. package/dist/mcp/tools/export-graph.d.ts.map +1 -1
  268. package/dist/mcp/tools/file-deps.d.ts +1 -1
  269. package/dist/mcp/tools/file-deps.d.ts.map +1 -1
  270. package/dist/mcp/tools/file-exports.d.ts +1 -1
  271. package/dist/mcp/tools/file-exports.d.ts.map +1 -1
  272. package/dist/mcp/tools/find-cycles.d.ts +1 -1
  273. package/dist/mcp/tools/find-cycles.d.ts.map +1 -1
  274. package/dist/mcp/tools/fn-impact.d.ts +1 -1
  275. package/dist/mcp/tools/fn-impact.d.ts.map +1 -1
  276. package/dist/mcp/tools/impact-analysis.d.ts +1 -1
  277. package/dist/mcp/tools/impact-analysis.d.ts.map +1 -1
  278. package/dist/mcp/tools/implementations.d.ts +1 -1
  279. package/dist/mcp/tools/implementations.d.ts.map +1 -1
  280. package/dist/mcp/tools/index.d.ts +2 -5
  281. package/dist/mcp/tools/index.d.ts.map +1 -1
  282. package/dist/mcp/tools/index.js.map +1 -1
  283. package/dist/mcp/tools/interfaces.d.ts +1 -1
  284. package/dist/mcp/tools/interfaces.d.ts.map +1 -1
  285. package/dist/mcp/tools/list-functions.d.ts +1 -1
  286. package/dist/mcp/tools/list-functions.d.ts.map +1 -1
  287. package/dist/mcp/tools/list-repos.d.ts +1 -1
  288. package/dist/mcp/tools/list-repos.d.ts.map +1 -1
  289. package/dist/mcp/tools/module-map.d.ts +1 -1
  290. package/dist/mcp/tools/module-map.d.ts.map +1 -1
  291. package/dist/mcp/tools/node-roles.d.ts +1 -1
  292. package/dist/mcp/tools/node-roles.d.ts.map +1 -1
  293. package/dist/mcp/tools/path.d.ts +1 -1
  294. package/dist/mcp/tools/path.d.ts.map +1 -1
  295. package/dist/mcp/tools/query.d.ts +1 -1
  296. package/dist/mcp/tools/query.d.ts.map +1 -1
  297. package/dist/mcp/tools/semantic-search.d.ts +1 -1
  298. package/dist/mcp/tools/semantic-search.d.ts.map +1 -1
  299. package/dist/mcp/tools/sequence.d.ts +1 -1
  300. package/dist/mcp/tools/sequence.d.ts.map +1 -1
  301. package/dist/mcp/tools/structure.d.ts +1 -1
  302. package/dist/mcp/tools/structure.d.ts.map +1 -1
  303. package/dist/mcp/tools/symbol-children.d.ts +1 -1
  304. package/dist/mcp/tools/symbol-children.d.ts.map +1 -1
  305. package/dist/mcp/tools/triage.d.ts +1 -1
  306. package/dist/mcp/tools/triage.d.ts.map +1 -1
  307. package/dist/mcp/tools/where.d.ts +1 -1
  308. package/dist/mcp/tools/where.d.ts.map +1 -1
  309. package/dist/mcp/types.d.ts +19 -0
  310. package/dist/mcp/types.d.ts.map +1 -0
  311. package/dist/mcp/types.js +6 -0
  312. package/dist/mcp/types.js.map +1 -0
  313. package/dist/presentation/queries-cli/index.d.ts +1 -1
  314. package/dist/presentation/queries-cli/index.d.ts.map +1 -1
  315. package/dist/presentation/queries-cli/index.js +1 -1
  316. package/dist/presentation/queries-cli/index.js.map +1 -1
  317. package/dist/presentation/queries-cli/overview.d.ts +1 -0
  318. package/dist/presentation/queries-cli/overview.d.ts.map +1 -1
  319. package/dist/presentation/queries-cli/overview.js +20 -1
  320. package/dist/presentation/queries-cli/overview.js.map +1 -1
  321. package/dist/presentation/queries-cli.d.ts +1 -1
  322. package/dist/presentation/queries-cli.d.ts.map +1 -1
  323. package/dist/presentation/queries-cli.js +1 -1
  324. package/dist/presentation/queries-cli.js.map +1 -1
  325. package/dist/presentation/viewer.d.ts.map +1 -1
  326. package/dist/presentation/viewer.js +45 -32
  327. package/dist/presentation/viewer.js.map +1 -1
  328. package/dist/shared/constants.d.ts +21 -0
  329. package/dist/shared/constants.d.ts.map +1 -1
  330. package/dist/shared/constants.js +25 -0
  331. package/dist/shared/constants.js.map +1 -1
  332. package/dist/shared/normalize.d.ts.map +1 -1
  333. package/dist/shared/normalize.js +12 -22
  334. package/dist/shared/normalize.js.map +1 -1
  335. package/dist/shared/paginate.d.ts +4 -17
  336. package/dist/shared/paginate.d.ts.map +1 -1
  337. package/dist/shared/paginate.js.map +1 -1
  338. package/dist/types.d.ts +76 -1
  339. package/dist/types.d.ts.map +1 -1
  340. package/grammars/tree-sitter-erlang.wasm +0 -0
  341. package/package.json +7 -7
  342. package/src/ast-analysis/engine.ts +43 -63
  343. package/src/ast-analysis/rules/b2.ts +263 -0
  344. package/src/ast-analysis/rules/b3.ts +127 -0
  345. package/src/ast-analysis/rules/b4.ts +378 -0
  346. package/src/ast-analysis/rules/b5.ts +65 -0
  347. package/src/ast-analysis/rules/c.ts +157 -0
  348. package/src/ast-analysis/rules/index.ts +34 -0
  349. package/src/ast-analysis/rules/javascript.ts +3 -0
  350. package/src/ast-analysis/shared.ts +2 -0
  351. package/src/ast-analysis/visitor-utils.ts +5 -0
  352. package/src/ast-analysis/visitor.ts +82 -52
  353. package/src/ast-analysis/visitors/cfg-visitor.ts +198 -84
  354. package/src/ast-analysis/visitors/complexity-visitor.ts +44 -16
  355. package/src/ast-analysis/visitors/dataflow-visitor.ts +68 -29
  356. package/src/cli/commands/config.ts +184 -184
  357. package/src/cli/commands/roles.ts +6 -1
  358. package/src/db/better-sqlite3.ts +5 -4
  359. package/src/db/connection.ts +23 -5
  360. package/src/db/index.ts +1 -0
  361. package/src/db/migrations.ts +68 -0
  362. package/src/db/repository/build-stmts.ts +30 -0
  363. package/src/db/repository/dataflow.ts +16 -0
  364. package/src/db/repository/index.ts +1 -1
  365. package/src/db/repository/native-repository.ts +56 -40
  366. package/src/domain/analysis/fn-impact.ts +4 -0
  367. package/src/domain/analysis/module-map.ts +38 -6
  368. package/src/domain/analysis/roles.ts +23 -0
  369. package/src/domain/graph/builder/call-resolver.ts +112 -232
  370. package/src/domain/graph/builder/context.ts +1 -0
  371. package/src/domain/graph/builder/helpers.ts +190 -72
  372. package/src/domain/graph/builder/incremental.ts +249 -120
  373. package/src/domain/graph/builder/pipeline.ts +11 -5
  374. package/src/domain/graph/builder/stages/build-edges.ts +696 -296
  375. package/src/domain/graph/builder/stages/collect-files.ts +12 -6
  376. package/src/domain/graph/builder/stages/detect-changes.ts +3 -1
  377. package/src/domain/graph/builder/stages/native-orchestrator.ts +1102 -590
  378. package/src/domain/graph/resolver/points-to.ts +182 -59
  379. package/src/domain/graph/resolver/strategy.ts +265 -0
  380. package/src/domain/graph/watcher.ts +19 -9
  381. package/src/domain/parser.ts +12 -2
  382. package/src/domain/queries.ts +1 -1
  383. package/src/domain/wasm-worker-entry.ts +3 -0
  384. package/src/domain/wasm-worker-pool.ts +28 -4
  385. package/src/domain/wasm-worker-protocol.ts +4 -0
  386. package/src/extractors/dart.ts +48 -3
  387. package/src/extractors/groovy.ts +62 -2
  388. package/src/extractors/helpers.ts +5 -2
  389. package/src/extractors/java.ts +80 -1
  390. package/src/extractors/javascript.ts +566 -161
  391. package/src/extractors/kotlin.ts +57 -3
  392. package/src/extractors/objc.ts +25 -1
  393. package/src/extractors/scala.ts +63 -1
  394. package/src/extractors/swift.ts +46 -3
  395. package/src/features/audit.ts +43 -34
  396. package/src/features/boundaries.ts +17 -9
  397. package/src/features/cfg.ts +31 -22
  398. package/src/features/check.ts +21 -5
  399. package/src/features/communities.ts +28 -19
  400. package/src/features/dataflow.ts +755 -6
  401. package/src/features/manifesto.ts +76 -75
  402. package/src/features/sequence.ts +29 -23
  403. package/src/features/snapshot.ts +36 -25
  404. package/src/features/structure.ts +185 -55
  405. package/src/features/triage.ts +28 -15
  406. package/src/graph/algorithms/bfs.ts +13 -12
  407. package/src/graph/algorithms/tarjan.ts +5 -0
  408. package/src/graph/builders/dependency.ts +35 -23
  409. package/src/graph/classifiers/roles.ts +74 -7
  410. package/src/infrastructure/config.ts +32 -3
  411. package/src/infrastructure/registry.ts +44 -20
  412. package/src/infrastructure/update-check.ts +55 -33
  413. package/src/mcp/server.ts +2 -8
  414. package/src/mcp/tools/ast-query.ts +1 -1
  415. package/src/mcp/tools/audit.ts +1 -1
  416. package/src/mcp/tools/batch-query.ts +1 -1
  417. package/src/mcp/tools/branch-compare.ts +1 -1
  418. package/src/mcp/tools/brief.ts +1 -1
  419. package/src/mcp/tools/cfg.ts +1 -1
  420. package/src/mcp/tools/check.ts +1 -1
  421. package/src/mcp/tools/co-changes.ts +1 -1
  422. package/src/mcp/tools/code-owners.ts +1 -1
  423. package/src/mcp/tools/communities.ts +1 -1
  424. package/src/mcp/tools/complexity.ts +1 -1
  425. package/src/mcp/tools/context.ts +1 -1
  426. package/src/mcp/tools/dataflow.ts +1 -1
  427. package/src/mcp/tools/diff-impact.ts +1 -1
  428. package/src/mcp/tools/execution-flow.ts +1 -1
  429. package/src/mcp/tools/export-graph.ts +1 -1
  430. package/src/mcp/tools/file-deps.ts +1 -1
  431. package/src/mcp/tools/file-exports.ts +1 -1
  432. package/src/mcp/tools/find-cycles.ts +1 -1
  433. package/src/mcp/tools/fn-impact.ts +1 -1
  434. package/src/mcp/tools/impact-analysis.ts +1 -1
  435. package/src/mcp/tools/implementations.ts +1 -1
  436. package/src/mcp/tools/index.ts +2 -5
  437. package/src/mcp/tools/interfaces.ts +1 -1
  438. package/src/mcp/tools/list-functions.ts +1 -1
  439. package/src/mcp/tools/list-repos.ts +1 -1
  440. package/src/mcp/tools/module-map.ts +1 -1
  441. package/src/mcp/tools/node-roles.ts +1 -1
  442. package/src/mcp/tools/path.ts +1 -1
  443. package/src/mcp/tools/query.ts +1 -1
  444. package/src/mcp/tools/semantic-search.ts +1 -1
  445. package/src/mcp/tools/sequence.ts +1 -1
  446. package/src/mcp/tools/structure.ts +1 -1
  447. package/src/mcp/tools/symbol-children.ts +1 -1
  448. package/src/mcp/tools/triage.ts +1 -1
  449. package/src/mcp/tools/where.ts +1 -1
  450. package/src/mcp/types.ts +21 -0
  451. package/src/presentation/queries-cli/index.ts +1 -1
  452. package/src/presentation/queries-cli/overview.ts +35 -1
  453. package/src/presentation/queries-cli.ts +1 -0
  454. package/src/presentation/viewer.ts +98 -87
  455. package/src/shared/constants.ts +26 -0
  456. package/src/shared/normalize.ts +13 -22
  457. package/src/shared/paginate.ts +4 -18
  458. package/src/types.ts +86 -1
@@ -1,5 +1,5 @@
1
1
  import { effectiveOffset, MCP_DEFAULTS } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'cfg';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveOffset, MCP_DEFAULTS, MCP_MAX_LIMIT } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'check';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveLimit, effectiveOffset } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'co_changes';
5
5
 
@@ -1,4 +1,4 @@
1
- import type { McpToolContext } from '../server.js';
1
+ import type { McpToolContext } from '../types.js';
2
2
 
3
3
  export const name = 'code_owners';
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveLimit, effectiveOffset } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'communities';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveLimit, effectiveOffset } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'complexity';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveLimit, effectiveOffset } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'context';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveOffset, MCP_DEFAULTS } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'dataflow';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveLimit, effectiveOffset } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'diff_impact';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveLimit, effectiveOffset } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'execution_flow';
5
5
 
@@ -1,6 +1,6 @@
1
1
  import { findDbPath } from '../../db/index.js';
2
2
  import { effectiveOffset, MCP_DEFAULTS, MCP_MAX_LIMIT } from '../middleware.js';
3
- import type { McpToolContext } from '../server.js';
3
+ import type { McpToolContext } from '../types.js';
4
4
 
5
5
  export const name = 'export_graph';
6
6
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveLimit, effectiveOffset } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'file_deps';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveLimit, effectiveOffset } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'file_exports';
5
5
 
@@ -1,6 +1,6 @@
1
1
  import { findDbPath } from '../../db/index.js';
2
2
  import { findCycles } from '../../domain/graph/cycles.js';
3
- import type { McpToolContext } from '../server.js';
3
+ import type { McpToolContext } from '../types.js';
4
4
 
5
5
  export const name = 'find_cycles';
6
6
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveLimit, effectiveOffset } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'fn_impact';
5
5
 
@@ -1,4 +1,4 @@
1
- import type { McpToolContext } from '../server.js';
1
+ import type { McpToolContext } from '../types.js';
2
2
 
3
3
  export const name = 'impact_analysis';
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveLimit, effectiveOffset } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'implementations';
5
5
 
@@ -2,12 +2,9 @@
2
2
  * Barrel module — registers all MCP tool handlers.
3
3
  */
4
4
 
5
- import type { McpToolContext } from '../server.js';
5
+ import type { McpToolHandler } from '../types.js';
6
6
 
7
- export interface McpToolHandler {
8
- name: string;
9
- handler(args: any, ctx: McpToolContext): Promise<unknown>;
10
- }
7
+ export type { McpToolContext, McpToolHandler } from '../types.js';
11
8
 
12
9
  import * as astQuery from './ast-query.js';
13
10
  import * as audit from './audit.js';
@@ -1,5 +1,5 @@
1
1
  import { effectiveLimit, effectiveOffset } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'interfaces';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveLimit, effectiveOffset } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'list_functions';
5
5
 
@@ -1,4 +1,4 @@
1
- import type { McpToolContext } from '../server.js';
1
+ import type { McpToolContext } from '../types.js';
2
2
 
3
3
  export const name = 'list_repos';
4
4
 
@@ -1,4 +1,4 @@
1
- import type { McpToolContext } from '../server.js';
1
+ import type { McpToolContext } from '../types.js';
2
2
 
3
3
  export const name = 'module_map';
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveLimit, effectiveOffset } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'node_roles';
5
5
 
@@ -1,4 +1,4 @@
1
- import type { McpToolContext } from '../server.js';
1
+ import type { McpToolContext } from '../types.js';
2
2
 
3
3
  export const name = 'path';
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveOffset, MCP_DEFAULTS } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'query';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveOffset, MCP_DEFAULTS } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'semantic_search';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveOffset, MCP_DEFAULTS } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'sequence';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveLimit, effectiveOffset } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'structure';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveOffset, MCP_DEFAULTS } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'symbol_children';
5
5
 
@@ -1,6 +1,6 @@
1
1
  import type { Role } from '../../types.js';
2
2
  import { effectiveLimit, effectiveOffset, MCP_DEFAULTS, MCP_MAX_LIMIT } from '../middleware.js';
3
- import type { McpToolContext } from '../server.js';
3
+ import type { McpToolContext } from '../types.js';
4
4
 
5
5
  export const name = 'triage';
6
6
 
@@ -1,5 +1,5 @@
1
1
  import { effectiveLimit, effectiveOffset } from '../middleware.js';
2
- import type { McpToolContext } from '../server.js';
2
+ import type { McpToolContext } from '../types.js';
3
3
 
4
4
  export const name = 'where';
5
5
 
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shared MCP types used by server.ts and all tool modules.
3
+ * Extracted here to break the circular dependency between server.ts and tools/index.ts.
4
+ */
5
+
6
+ import type Database from 'better-sqlite3';
7
+ import type { findDbPath } from '../db/index.js';
8
+
9
+ export interface McpToolContext {
10
+ dbPath: string | undefined;
11
+ getQueries(): Promise<any>;
12
+ getDatabase(): typeof Database;
13
+ findDbPath: typeof findDbPath;
14
+ allowedRepos: string[] | undefined;
15
+ MCP_MAX_LIMIT: number;
16
+ }
17
+
18
+ export interface McpToolHandler {
19
+ name: string;
20
+ handler(args: any, ctx: McpToolContext): Promise<unknown>;
21
+ }
@@ -9,5 +9,5 @@ export {
9
9
  queryName,
10
10
  where,
11
11
  } from './inspect.js';
12
- export { moduleMap, roles, stats } from './overview.js';
12
+ export { dynamicCalls, moduleMap, roles, stats } from './overview.js';
13
13
  export { symbolPath } from './path.js';
@@ -1,5 +1,11 @@
1
1
  import path from 'node:path';
2
- import { kindIcon, moduleMapData, rolesData, statsData } from '../../domain/queries.js';
2
+ import {
3
+ dynamicCallsData,
4
+ kindIcon,
5
+ moduleMapData,
6
+ rolesData,
7
+ statsData,
8
+ } from '../../domain/queries.js';
3
9
  import { debug } from '../../infrastructure/logger.js';
4
10
  import { outputResult } from '../../infrastructure/result-formatter.js';
5
11
  import { toErrorMessage } from '../../shared/errors.js';
@@ -317,6 +323,34 @@ function printRoleGroup(role: string, symbols: RoleSymbol[]): void {
317
323
  console.log();
318
324
  }
319
325
 
326
+ export function dynamicCalls(customDbPath: string, opts: OutputOpts = {}): void {
327
+ const rows = dynamicCallsData(customDbPath);
328
+ if (opts.json || opts.ndjson) {
329
+ outputResult(
330
+ { dynamic_calls: rows } as unknown as Record<string, unknown>,
331
+ 'dynamic_calls',
332
+ opts,
333
+ );
334
+ return;
335
+ }
336
+ if (rows.length === 0) {
337
+ console.log(
338
+ 'No flagged dynamic calls found. Run "codegraph build" first, or add JavaScript files with eval/computed-key patterns.',
339
+ );
340
+ return;
341
+ }
342
+ console.log('\nFlagged dynamic calls (confidence=0.0 sink edges):\n');
343
+ const total = rows.reduce((s, r) => s + r.count, 0);
344
+ for (const { dynamic_kind, count } of rows) {
345
+ const bar = '█'.repeat(Math.min(30, Math.round((count / total) * 30)));
346
+ console.log(` ${dynamic_kind.padEnd(20)} ${String(count).padStart(5)} ${bar}`);
347
+ }
348
+ console.log(`\n Total flagged: ${total}\n`);
349
+ console.log(
350
+ ' Kinds: eval — undecidable; computed-key — obj[var](); unresolved-dynamic — other\n',
351
+ );
352
+ }
353
+
320
354
  export function roles(customDbPath: string, opts: OutputOpts = {}): void {
321
355
  const data = rolesData(customDbPath, opts) as RolesData;
322
356
  if (outputResult(data as unknown as Record<string, unknown>, 'symbols', opts)) return;
@@ -12,6 +12,7 @@ export {
12
12
  children,
13
13
  context,
14
14
  diffImpact,
15
+ dynamicCalls,
15
16
  explain,
16
17
  fileDeps,
17
18
  fileExports,
@@ -150,80 +150,10 @@ export function buildLayoutOptions(cfg: PlotConfig): LayoutOptions {
150
150
  return opts;
151
151
  }
152
152
 
153
- // ─── HTML Renderer ───────────────────────────────────────────────────
154
-
155
- export interface ViewerNode {
156
- id: number | string;
157
- label: string;
158
- kind: string;
159
- file: string;
160
- line: number;
161
- role: string | null;
162
- fanIn: number;
163
- fanOut: number;
164
- cognitive: number | null;
165
- cyclomatic: number | null;
166
- maintainabilityIndex: number | null;
167
- community: number | null;
168
- directory: string | null;
169
- risk: string[];
170
- }
171
-
172
- export interface ViewerEdge {
173
- id: number | string;
174
- from: number | string;
175
- to: number | string;
176
- }
177
-
178
- export interface ViewerData {
179
- nodes: ViewerNode[];
180
- edges: ViewerEdge[];
181
- seedNodeIds: (number | string)[];
182
- }
183
-
184
- interface ResolvedPlotConfig {
185
- layoutOpts: LayoutOptions;
186
- title: string;
187
- layoutAlgorithm: string;
188
- layoutDirection: string;
189
- physicsEnabled: boolean;
190
- sizeBy: string;
191
- clusterBy: string;
192
- effectiveColorBy: string;
193
- effectiveRisk: boolean;
194
- }
153
+ // ─── HTML Section Renderers ──────────────────────────────────────────
195
154
 
196
- function resolvePlotConfig(cfg: PlotConfig): ResolvedPlotConfig {
197
- return {
198
- layoutOpts: buildLayoutOptions(cfg),
199
- title: cfg.title || 'Codegraph',
200
- layoutAlgorithm: cfg.layout?.algorithm || 'hierarchical',
201
- layoutDirection: cfg.layout?.direction || 'LR',
202
- physicsEnabled: cfg.physics?.enabled !== false,
203
- sizeBy: cfg.sizeBy || 'uniform',
204
- clusterBy: cfg.clusterBy || 'none',
205
- effectiveColorBy:
206
- cfg.overlays?.complexity && cfg.colorBy === 'kind' ? 'complexity' : cfg.colorBy || 'kind',
207
- effectiveRisk: cfg.overlays?.risk || false,
208
- };
209
- }
210
-
211
- export function renderPlotHTML(data: ViewerData, cfg: PlotConfig): string {
212
- const {
213
- layoutOpts,
214
- title,
215
- layoutAlgorithm,
216
- layoutDirection,
217
- physicsEnabled,
218
- sizeBy,
219
- clusterBy,
220
- effectiveColorBy,
221
- effectiveRisk,
222
- } = resolvePlotConfig(cfg);
223
-
224
- return `<!DOCTYPE html>
225
- <html lang="en">
226
- <head>
155
+ function renderViewerHead(title: string): string {
156
+ return `<head>
227
157
  <meta charset="UTF-8">
228
158
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
229
159
  <title>${escapeHtml(title)}</title>
@@ -257,9 +187,13 @@ export function renderPlotHTML(data: ViewerData, cfg: PlotConfig): string {
257
187
  #legend div { display: flex; align-items: center; gap: 6px; margin: 2px 0; }
258
188
  #legend span.swatch { width: 14px; height: 14px; border-radius: 3px; display: inline-block; flex-shrink: 0; }
259
189
  </style>
260
- </head>
261
- <body>
262
- <div id="controls">
190
+ </head>`;
191
+ }
192
+
193
+ function renderViewerControls(resolved: ResolvedPlotConfig): string {
194
+ const { layoutAlgorithm, physicsEnabled, effectiveColorBy, sizeBy, clusterBy, effectiveRisk } =
195
+ resolved;
196
+ return `<div id="controls">
263
197
  <label>Layout:
264
198
  <select id="layoutSelect">
265
199
  <option value="hierarchical"${layoutAlgorithm === 'hierarchical' ? ' selected' : ''}>Hierarchical</option>
@@ -293,16 +227,16 @@ export function renderPlotHTML(data: ViewerData, cfg: PlotConfig): string {
293
227
  </select>
294
228
  </label>
295
229
  <label>Risk: <input type="checkbox" id="riskToggle"${effectiveRisk ? ' checked' : ''}></label>
296
- </div>
297
- <div id="main">
298
- <div id="graph"></div>
299
- <div id="detail">
300
- <span id="detailClose">&times;</span>
301
- <div id="detailContent"></div>
302
- </div>
303
- </div>
304
- <div id="legend"></div>
305
- <script>
230
+ </div>`;
231
+ }
232
+
233
+ function renderViewerScript(
234
+ data: ViewerData,
235
+ cfg: PlotConfig,
236
+ resolved: ResolvedPlotConfig,
237
+ ): string {
238
+ const { layoutOpts, layoutDirection, clusterBy, effectiveColorBy } = resolved;
239
+ return `<script>
306
240
  /* ── Data ──────────────────────────────────────────────────────────── */
307
241
  var allNodes = ${JSON.stringify(data.nodes)};
308
242
  var allEdges = ${JSON.stringify(data.edges)};
@@ -698,7 +632,84 @@ document.getElementById('detailClose').addEventListener('click', hideDetail);
698
632
  refreshNodeAppearance();
699
633
  updateLegend(${JSON.stringify(effectiveColorBy)});
700
634
  ${clusterBy !== 'none' ? `applyClusterBy(${JSON.stringify(clusterBy)});` : ''}
701
- </script>
635
+ </script>`;
636
+ }
637
+
638
+ // ─── HTML Renderer ───────────────────────────────────────────────────
639
+
640
+ export interface ViewerNode {
641
+ id: number | string;
642
+ label: string;
643
+ kind: string;
644
+ file: string;
645
+ line: number;
646
+ role: string | null;
647
+ fanIn: number;
648
+ fanOut: number;
649
+ cognitive: number | null;
650
+ cyclomatic: number | null;
651
+ maintainabilityIndex: number | null;
652
+ community: number | null;
653
+ directory: string | null;
654
+ risk: string[];
655
+ }
656
+
657
+ export interface ViewerEdge {
658
+ id: number | string;
659
+ from: number | string;
660
+ to: number | string;
661
+ }
662
+
663
+ export interface ViewerData {
664
+ nodes: ViewerNode[];
665
+ edges: ViewerEdge[];
666
+ seedNodeIds: (number | string)[];
667
+ }
668
+
669
+ interface ResolvedPlotConfig {
670
+ layoutOpts: LayoutOptions;
671
+ title: string;
672
+ layoutAlgorithm: string;
673
+ layoutDirection: string;
674
+ physicsEnabled: boolean;
675
+ sizeBy: string;
676
+ clusterBy: string;
677
+ effectiveColorBy: string;
678
+ effectiveRisk: boolean;
679
+ }
680
+
681
+ function resolvePlotConfig(cfg: PlotConfig): ResolvedPlotConfig {
682
+ return {
683
+ layoutOpts: buildLayoutOptions(cfg),
684
+ title: cfg.title || 'Codegraph',
685
+ layoutAlgorithm: cfg.layout?.algorithm || 'hierarchical',
686
+ layoutDirection: cfg.layout?.direction || 'LR',
687
+ physicsEnabled: cfg.physics?.enabled !== false,
688
+ sizeBy: cfg.sizeBy || 'uniform',
689
+ clusterBy: cfg.clusterBy || 'none',
690
+ effectiveColorBy:
691
+ cfg.overlays?.complexity && cfg.colorBy === 'kind' ? 'complexity' : cfg.colorBy || 'kind',
692
+ effectiveRisk: cfg.overlays?.risk || false,
693
+ };
694
+ }
695
+
696
+ export function renderPlotHTML(data: ViewerData, cfg: PlotConfig): string {
697
+ const resolved = resolvePlotConfig(cfg);
698
+ const { title } = resolved;
699
+ return `<!DOCTYPE html>
700
+ <html lang="en">
701
+ ${renderViewerHead(title)}
702
+ <body>
703
+ ${renderViewerControls(resolved)}
704
+ <div id="main">
705
+ <div id="graph"></div>
706
+ <div id="detail">
707
+ <span id="detailClose">&times;</span>
708
+ <div id="detailContent"></div>
709
+ </div>
710
+ </div>
711
+ <div id="legend"></div>
712
+ ${renderViewerScript(data, cfg, resolved)}
702
713
  </body>
703
714
  </html>`;
704
715
  }
@@ -34,8 +34,34 @@ export const IGNORE_DIRS: ArrayCompatSet<string> = withArrayCompat(
34
34
  ]),
35
35
  );
36
36
 
37
+ /**
38
+ * Merge the global IGNORE_DIRS set with a per-repo additional list from config.
39
+ * Returns a new Set — does not mutate IGNORE_DIRS.
40
+ */
41
+ export function buildIgnoreSet(additionalDirs?: string[]): ReadonlySet<string> {
42
+ if (!additionalDirs || additionalDirs.length === 0) return IGNORE_DIRS;
43
+ return new Set([...IGNORE_DIRS, ...additionalDirs]);
44
+ }
45
+
37
46
  export const EXTENSIONS: ArrayCompatSet<string> = withArrayCompat(new Set(SUPPORTED_EXTENSIONS));
38
47
 
48
+ /**
49
+ * Minimum confidence assigned to resolved `ts-native` call edges.
50
+ *
51
+ * The native engine's proximity heuristic returns 0.3 for cross-module calls
52
+ * where no import-path evidence is available. For ts-native edges the engine
53
+ * performed actual name-based symbol lookup, which is stronger evidence than
54
+ * pure file-proximity. Clamping to 0.5 (same-parent-directory level) avoids
55
+ * unfairly dragging down the call-confidence metric. Sink edges
56
+ * (confidence = 0.0) are intentionally excluded and must remain at 0.0 so
57
+ * they stay below DEFAULT_MIN_CONFIDENCE and never surface in normal queries.
58
+ *
59
+ * Used in `build-edges.ts` (in-memory + `applyEdgeTechniquesAfterNativeInsert`)
60
+ * and `native-orchestrator.ts` (`backfillEdgeTechniquesAfterNativeOrchestrator`).
61
+ * Centralised here so all three insertion paths apply the same value.
62
+ */
63
+ export const TS_NATIVE_CONFIDENCE_FLOOR = 0.5;
64
+
39
65
  export function shouldIgnore(dirName: string): boolean {
40
66
  return IGNORE_DIRS.has(dirName) || dirName.startsWith('.');
41
67
  }
@@ -29,29 +29,20 @@ export function toSymbolRef(row: { name: string; kind: string; file: string; lin
29
29
  return { name: row.name, kind: row.kind, file: row.file, line: row.line };
30
30
  }
31
31
 
32
+ const KIND_ICONS: Readonly<Record<string, string>> = {
33
+ function: 'f',
34
+ class: '*',
35
+ method: 'o',
36
+ file: '#',
37
+ interface: 'I',
38
+ type: 'T',
39
+ parameter: 'p',
40
+ property: '.',
41
+ constant: 'C',
42
+ };
43
+
32
44
  export function kindIcon(kind: string): string {
33
- switch (kind) {
34
- case 'function':
35
- return 'f';
36
- case 'class':
37
- return '*';
38
- case 'method':
39
- return 'o';
40
- case 'file':
41
- return '#';
42
- case 'interface':
43
- return 'I';
44
- case 'type':
45
- return 'T';
46
- case 'parameter':
47
- return 'p';
48
- case 'property':
49
- return '.';
50
- case 'constant':
51
- return 'C';
52
- default:
53
- return '-';
54
- }
45
+ return KIND_ICONS[kind] ?? '-';
55
46
  }
56
47
 
57
48
  export interface NormalizedSymbol {