@grafema/core 0.1.0-alpha.5 → 0.1.1-alpha

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 (391) hide show
  1. package/README.md +0 -1
  2. package/dist/Orchestrator.d.ts +24 -2
  3. package/dist/Orchestrator.d.ts.map +1 -1
  4. package/dist/Orchestrator.js +197 -24
  5. package/dist/config/ConfigLoader.d.ts +72 -0
  6. package/dist/config/ConfigLoader.d.ts.map +1 -0
  7. package/dist/config/ConfigLoader.js +187 -0
  8. package/dist/config/index.d.ts +6 -0
  9. package/dist/config/index.d.ts.map +1 -0
  10. package/dist/config/index.js +4 -0
  11. package/dist/core/ASTWorker.d.ts +11 -36
  12. package/dist/core/ASTWorker.d.ts.map +1 -1
  13. package/dist/core/ASTWorker.js +93 -99
  14. package/dist/core/CoverageAnalyzer.d.ts +65 -0
  15. package/dist/core/CoverageAnalyzer.d.ts.map +1 -0
  16. package/dist/core/CoverageAnalyzer.js +198 -0
  17. package/dist/core/FileNodeManager.d.ts +40 -0
  18. package/dist/core/FileNodeManager.d.ts.map +1 -0
  19. package/dist/core/FileNodeManager.js +84 -0
  20. package/dist/core/GraphFreshnessChecker.d.ts +33 -0
  21. package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
  22. package/dist/core/GraphFreshnessChecker.js +101 -0
  23. package/dist/core/HashUtils.d.ts +24 -0
  24. package/dist/core/HashUtils.d.ts.map +1 -0
  25. package/dist/core/HashUtils.js +45 -0
  26. package/dist/core/IncrementalReanalyzer.d.ts +36 -0
  27. package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
  28. package/dist/core/IncrementalReanalyzer.js +132 -0
  29. package/dist/core/NodeFactory.d.ts +225 -17
  30. package/dist/core/NodeFactory.d.ts.map +1 -1
  31. package/dist/core/NodeFactory.js +208 -18
  32. package/dist/core/ScopeTracker.d.ts +84 -0
  33. package/dist/core/ScopeTracker.d.ts.map +1 -0
  34. package/dist/core/ScopeTracker.js +116 -0
  35. package/dist/core/SemanticId.d.ts +90 -0
  36. package/dist/core/SemanticId.d.ts.map +1 -0
  37. package/dist/core/SemanticId.js +115 -0
  38. package/dist/core/VersionManager.d.ts.map +1 -1
  39. package/dist/core/VersionManager.js +3 -2
  40. package/dist/core/nodes/ArgumentExpressionNode.d.ts +43 -0
  41. package/dist/core/nodes/ArgumentExpressionNode.d.ts.map +1 -0
  42. package/dist/core/nodes/ArgumentExpressionNode.js +60 -0
  43. package/dist/core/nodes/ArrayLiteralNode.d.ts +27 -0
  44. package/dist/core/nodes/ArrayLiteralNode.d.ts.map +1 -0
  45. package/dist/core/nodes/ArrayLiteralNode.js +41 -0
  46. package/dist/core/nodes/CallSiteNode.d.ts +28 -0
  47. package/dist/core/nodes/CallSiteNode.d.ts.map +1 -1
  48. package/dist/core/nodes/CallSiteNode.js +46 -0
  49. package/dist/core/nodes/ClassNode.d.ts +33 -1
  50. package/dist/core/nodes/ClassNode.d.ts.map +1 -1
  51. package/dist/core/nodes/ClassNode.js +46 -2
  52. package/dist/core/nodes/DecoratorNode.d.ts +42 -0
  53. package/dist/core/nodes/DecoratorNode.d.ts.map +1 -0
  54. package/dist/core/nodes/DecoratorNode.js +62 -0
  55. package/dist/core/nodes/EnumNode.d.ts +42 -0
  56. package/dist/core/nodes/EnumNode.d.ts.map +1 -0
  57. package/dist/core/nodes/EnumNode.js +54 -0
  58. package/dist/core/nodes/ExportNode.d.ts +37 -1
  59. package/dist/core/nodes/ExportNode.d.ts.map +1 -1
  60. package/dist/core/nodes/ExportNode.js +48 -2
  61. package/dist/core/nodes/ExpressionNode.d.ts +97 -0
  62. package/dist/core/nodes/ExpressionNode.d.ts.map +1 -0
  63. package/dist/core/nodes/ExpressionNode.js +178 -0
  64. package/dist/core/nodes/ExternalModuleNode.d.ts +28 -0
  65. package/dist/core/nodes/ExternalModuleNode.d.ts.map +1 -0
  66. package/dist/core/nodes/ExternalModuleNode.js +41 -0
  67. package/dist/core/nodes/ExternalStdioNode.d.ts +13 -6
  68. package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -1
  69. package/dist/core/nodes/ExternalStdioNode.js +15 -8
  70. package/dist/core/nodes/FunctionNode.d.ts +36 -0
  71. package/dist/core/nodes/FunctionNode.d.ts.map +1 -1
  72. package/dist/core/nodes/FunctionNode.js +80 -1
  73. package/dist/core/nodes/ImportNode.d.ts +19 -5
  74. package/dist/core/nodes/ImportNode.d.ts.map +1 -1
  75. package/dist/core/nodes/ImportNode.js +23 -5
  76. package/dist/core/nodes/InterfaceNode.d.ts +46 -0
  77. package/dist/core/nodes/InterfaceNode.d.ts.map +1 -0
  78. package/dist/core/nodes/InterfaceNode.js +55 -0
  79. package/dist/core/nodes/IssueNode.d.ts +73 -0
  80. package/dist/core/nodes/IssueNode.d.ts.map +1 -0
  81. package/dist/core/nodes/IssueNode.js +129 -0
  82. package/dist/core/nodes/MethodCallNode.d.ts +30 -0
  83. package/dist/core/nodes/MethodCallNode.d.ts.map +1 -1
  84. package/dist/core/nodes/MethodCallNode.js +49 -0
  85. package/dist/core/nodes/MethodNode.d.ts +32 -0
  86. package/dist/core/nodes/MethodNode.d.ts.map +1 -1
  87. package/dist/core/nodes/MethodNode.js +48 -0
  88. package/dist/core/nodes/ModuleNode.d.ts +31 -0
  89. package/dist/core/nodes/ModuleNode.d.ts.map +1 -1
  90. package/dist/core/nodes/ModuleNode.js +37 -0
  91. package/dist/core/nodes/NetworkRequestNode.d.ts +54 -0
  92. package/dist/core/nodes/NetworkRequestNode.d.ts.map +1 -0
  93. package/dist/core/nodes/NetworkRequestNode.js +65 -0
  94. package/dist/core/nodes/ObjectLiteralNode.d.ts +27 -0
  95. package/dist/core/nodes/ObjectLiteralNode.d.ts.map +1 -0
  96. package/dist/core/nodes/ObjectLiteralNode.js +41 -0
  97. package/dist/core/nodes/ScopeNode.d.ts +31 -0
  98. package/dist/core/nodes/ScopeNode.d.ts.map +1 -1
  99. package/dist/core/nodes/ScopeNode.js +49 -0
  100. package/dist/core/nodes/TypeNode.d.ts +36 -0
  101. package/dist/core/nodes/TypeNode.d.ts.map +1 -0
  102. package/dist/core/nodes/TypeNode.js +53 -0
  103. package/dist/core/nodes/VariableDeclarationNode.d.ts +27 -0
  104. package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -1
  105. package/dist/core/nodes/VariableDeclarationNode.js +40 -0
  106. package/dist/core/nodes/index.d.ts +12 -1
  107. package/dist/core/nodes/index.d.ts.map +1 -1
  108. package/dist/core/nodes/index.js +14 -0
  109. package/dist/diagnostics/DiagnosticCollector.d.ts +98 -0
  110. package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
  111. package/dist/diagnostics/DiagnosticCollector.js +129 -0
  112. package/dist/diagnostics/DiagnosticReporter.d.ts +77 -0
  113. package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
  114. package/dist/diagnostics/DiagnosticReporter.js +159 -0
  115. package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
  116. package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
  117. package/dist/diagnostics/DiagnosticWriter.js +43 -0
  118. package/dist/diagnostics/index.d.ts +14 -0
  119. package/dist/diagnostics/index.d.ts.map +1 -0
  120. package/dist/diagnostics/index.js +11 -0
  121. package/dist/errors/GrafemaError.d.ts +118 -0
  122. package/dist/errors/GrafemaError.d.ts.map +1 -0
  123. package/dist/errors/GrafemaError.js +131 -0
  124. package/dist/index.d.ts +57 -1
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +54 -1
  127. package/dist/logging/Logger.d.ts +48 -0
  128. package/dist/logging/Logger.d.ts.map +1 -0
  129. package/dist/logging/Logger.js +134 -0
  130. package/dist/plugins/Plugin.d.ts +5 -1
  131. package/dist/plugins/Plugin.d.ts.map +1 -1
  132. package/dist/plugins/Plugin.js +33 -0
  133. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -1
  134. package/dist/plugins/analysis/DatabaseAnalyzer.js +13 -6
  135. package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -1
  136. package/dist/plugins/analysis/ExpressAnalyzer.js +27 -19
  137. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -1
  138. package/dist/plugins/analysis/ExpressRouteAnalyzer.js +21 -14
  139. package/dist/plugins/analysis/FetchAnalyzer.d.ts +1 -0
  140. package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -1
  141. package/dist/plugins/analysis/FetchAnalyzer.js +34 -14
  142. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +6 -3
  143. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -1
  144. package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +76 -80
  145. package/dist/plugins/analysis/JSASTAnalyzer.d.ts +180 -17
  146. package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -1
  147. package/dist/plugins/analysis/JSASTAnalyzer.js +1171 -471
  148. package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -1
  149. package/dist/plugins/analysis/ReactAnalyzer.js +56 -57
  150. package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -1
  151. package/dist/plugins/analysis/RustAnalyzer.js +15 -10
  152. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -1
  153. package/dist/plugins/analysis/SQLiteAnalyzer.js +9 -7
  154. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -1
  155. package/dist/plugins/analysis/ServiceLayerAnalyzer.js +21 -9
  156. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -1
  157. package/dist/plugins/analysis/SocketIOAnalyzer.js +27 -15
  158. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -1
  159. package/dist/plugins/analysis/SystemDbAnalyzer.js +15 -5
  160. package/dist/plugins/analysis/ast/GraphBuilder.d.ts +34 -4
  161. package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -1
  162. package/dist/plugins/analysis/ast/GraphBuilder.js +318 -298
  163. package/dist/plugins/analysis/ast/IdGenerator.d.ts +105 -0
  164. package/dist/plugins/analysis/ast/IdGenerator.d.ts.map +1 -0
  165. package/dist/plugins/analysis/ast/IdGenerator.js +116 -0
  166. package/dist/plugins/analysis/ast/types.d.ts +176 -5
  167. package/dist/plugins/analysis/ast/types.d.ts.map +1 -1
  168. package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts +33 -0
  169. package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts.map +1 -0
  170. package/dist/plugins/analysis/ast/utils/createParameterNodes.js +89 -0
  171. package/dist/plugins/analysis/ast/utils/index.d.ts +6 -0
  172. package/dist/plugins/analysis/ast/utils/index.d.ts.map +1 -0
  173. package/dist/plugins/analysis/ast/utils/index.js +5 -0
  174. package/dist/plugins/analysis/ast/utils/location.d.ts +87 -0
  175. package/dist/plugins/analysis/ast/utils/location.d.ts.map +1 -0
  176. package/dist/plugins/analysis/ast/utils/location.js +78 -0
  177. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +9 -4
  178. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -1
  179. package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +6 -5
  180. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +99 -9
  181. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -1
  182. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +663 -125
  183. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +4 -1
  184. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -1
  185. package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +72 -32
  186. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +4 -1
  187. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -1
  188. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +128 -63
  189. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -1
  190. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +11 -8
  191. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +12 -1
  192. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -1
  193. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +36 -14
  194. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +4 -1
  195. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -1
  196. package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +17 -13
  197. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -1
  198. package/dist/plugins/discovery/MonorepoServiceDiscovery.js +3 -2
  199. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -1
  200. package/dist/plugins/discovery/SimpleProjectDiscovery.js +5 -1
  201. package/dist/plugins/discovery/WorkspaceDiscovery.d.ts +22 -0
  202. package/dist/plugins/discovery/WorkspaceDiscovery.d.ts.map +1 -0
  203. package/dist/plugins/discovery/WorkspaceDiscovery.js +136 -0
  204. package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts +46 -0
  205. package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts.map +1 -0
  206. package/dist/plugins/discovery/resolveSourceEntrypoint.js +86 -0
  207. package/dist/plugins/discovery/workspaces/detector.d.ts +21 -0
  208. package/dist/plugins/discovery/workspaces/detector.d.ts.map +1 -0
  209. package/dist/plugins/discovery/workspaces/detector.js +49 -0
  210. package/dist/plugins/discovery/workspaces/globResolver.d.ts +35 -0
  211. package/dist/plugins/discovery/workspaces/globResolver.d.ts.map +1 -0
  212. package/dist/plugins/discovery/workspaces/globResolver.js +184 -0
  213. package/dist/plugins/discovery/workspaces/index.d.ts +9 -0
  214. package/dist/plugins/discovery/workspaces/index.d.ts.map +1 -0
  215. package/dist/plugins/discovery/workspaces/index.js +8 -0
  216. package/dist/plugins/discovery/workspaces/parsers.d.ts +38 -0
  217. package/dist/plugins/discovery/workspaces/parsers.d.ts.map +1 -0
  218. package/dist/plugins/discovery/workspaces/parsers.js +80 -0
  219. package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -1
  220. package/dist/plugins/enrichment/AliasTracker.js +14 -8
  221. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -1
  222. package/dist/plugins/enrichment/HTTPConnectionEnricher.js +14 -7
  223. package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -1
  224. package/dist/plugins/enrichment/ImportExportLinker.js +23 -6
  225. package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -1
  226. package/dist/plugins/enrichment/MethodCallResolver.js +18 -12
  227. package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -1
  228. package/dist/plugins/enrichment/MountPointResolver.js +8 -3
  229. package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -1
  230. package/dist/plugins/enrichment/PrefixEvaluator.js +16 -7
  231. package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -1
  232. package/dist/plugins/enrichment/RustFFIEnricher.js +6 -5
  233. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +17 -0
  234. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -1
  235. package/dist/plugins/enrichment/ValueDomainAnalyzer.js +129 -10
  236. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -1
  237. package/dist/plugins/indexing/IncrementalModuleIndexer.js +23 -14
  238. package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -1
  239. package/dist/plugins/indexing/JSModuleIndexer.js +63 -31
  240. package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -1
  241. package/dist/plugins/indexing/RustModuleIndexer.js +5 -4
  242. package/dist/plugins/indexing/ServiceDetector.d.ts +10 -0
  243. package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -1
  244. package/dist/plugins/indexing/ServiceDetector.js +28 -15
  245. package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -1
  246. package/dist/plugins/validation/CallResolverValidator.js +8 -7
  247. package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -1
  248. package/dist/plugins/validation/DataFlowValidator.js +17 -12
  249. package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -1
  250. package/dist/plugins/validation/EvalBanValidator.js +17 -16
  251. package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -1
  252. package/dist/plugins/validation/GraphConnectivityValidator.js +19 -23
  253. package/dist/plugins/validation/NodeCreationValidator.d.ts +85 -0
  254. package/dist/plugins/validation/NodeCreationValidator.d.ts.map +1 -0
  255. package/dist/plugins/validation/NodeCreationValidator.js +415 -0
  256. package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -1
  257. package/dist/plugins/validation/SQLInjectionValidator.js +59 -16
  258. package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -1
  259. package/dist/plugins/validation/ShadowingDetector.js +6 -5
  260. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -1
  261. package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +12 -11
  262. package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -1
  263. package/dist/plugins/vcs/GitPlugin.js +10 -12
  264. package/dist/plugins/vcs/VCSPlugin.d.ts +3 -2
  265. package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -1
  266. package/dist/plugins/vcs/VCSPlugin.js +5 -5
  267. package/dist/storage/backends/RFDBServerBackend.d.ts +10 -17
  268. package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -1
  269. package/dist/storage/backends/RFDBServerBackend.js +31 -10
  270. package/dist/validation/PathValidator.d.ts +1 -2
  271. package/dist/validation/PathValidator.d.ts.map +1 -1
  272. package/package.json +3 -3
  273. package/src/Orchestrator.ts +237 -24
  274. package/src/config/ConfigLoader.ts +263 -0
  275. package/src/config/index.ts +5 -0
  276. package/src/core/ASTWorker.ts +143 -139
  277. package/src/core/CoverageAnalyzer.ts +243 -0
  278. package/src/core/FileNodeManager.ts +100 -0
  279. package/src/core/GraphFreshnessChecker.ts +143 -0
  280. package/src/core/HashUtils.ts +48 -0
  281. package/src/core/IncrementalReanalyzer.ts +192 -0
  282. package/src/core/NodeFactory.ts +401 -18
  283. package/src/core/ScopeTracker.ts +154 -0
  284. package/src/core/SemanticId.ts +192 -0
  285. package/src/core/VersionManager.ts +3 -2
  286. package/src/core/nodes/ArgumentExpressionNode.ts +89 -0
  287. package/src/core/nodes/ArrayLiteralNode.ts +65 -0
  288. package/src/core/nodes/CallSiteNode.ts +58 -0
  289. package/src/core/nodes/ClassNode.ts +63 -2
  290. package/src/core/nodes/DecoratorNode.ts +91 -0
  291. package/src/core/nodes/EnumNode.ts +86 -0
  292. package/src/core/nodes/ExportNode.ts +70 -2
  293. package/src/core/nodes/ExpressionNode.ts +231 -0
  294. package/src/core/nodes/ExternalModuleNode.ts +56 -0
  295. package/src/core/nodes/ExternalStdioNode.ts +17 -9
  296. package/src/core/nodes/FunctionNode.ts +101 -1
  297. package/src/core/nodes/ImportNode.ts +32 -10
  298. package/src/core/nodes/InterfaceNode.ts +91 -0
  299. package/src/core/nodes/IssueNode.ts +177 -0
  300. package/src/core/nodes/MethodCallNode.ts +64 -0
  301. package/src/core/nodes/MethodNode.ts +63 -0
  302. package/src/core/nodes/ModuleNode.ts +50 -0
  303. package/src/core/nodes/NetworkRequestNode.ts +77 -0
  304. package/src/core/nodes/ObjectLiteralNode.ts +65 -0
  305. package/src/core/nodes/ScopeNode.ts +65 -0
  306. package/src/core/nodes/TypeNode.ts +78 -0
  307. package/src/core/nodes/VariableDeclarationNode.ts +52 -0
  308. package/src/core/nodes/index.ts +18 -1
  309. package/src/diagnostics/DiagnosticCollector.ts +163 -0
  310. package/src/diagnostics/DiagnosticReporter.ts +204 -0
  311. package/src/diagnostics/DiagnosticWriter.ts +50 -0
  312. package/src/diagnostics/index.ts +16 -0
  313. package/src/errors/GrafemaError.ts +174 -0
  314. package/src/index.ts +148 -1
  315. package/src/logging/Logger.ts +152 -0
  316. package/src/plugins/Plugin.ts +42 -0
  317. package/src/plugins/analysis/DatabaseAnalyzer.ts +14 -8
  318. package/src/plugins/analysis/ExpressAnalyzer.ts +29 -19
  319. package/src/plugins/analysis/ExpressRouteAnalyzer.ts +22 -21
  320. package/src/plugins/analysis/FetchAnalyzer.ts +39 -16
  321. package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +84 -101
  322. package/src/plugins/analysis/JSASTAnalyzer.ts +1483 -503
  323. package/src/plugins/analysis/ReactAnalyzer.ts +57 -57
  324. package/src/plugins/analysis/RustAnalyzer.ts +15 -10
  325. package/src/plugins/analysis/SQLiteAnalyzer.ts +10 -7
  326. package/src/plugins/analysis/ServiceLayerAnalyzer.ts +22 -16
  327. package/src/plugins/analysis/SocketIOAnalyzer.ts +31 -22
  328. package/src/plugins/analysis/SystemDbAnalyzer.ts +16 -11
  329. package/src/plugins/analysis/ast/GraphBuilder.ts +439 -327
  330. package/src/plugins/analysis/ast/IdGenerator.ts +177 -0
  331. package/src/plugins/analysis/ast/types.ts +209 -6
  332. package/src/plugins/analysis/ast/utils/createParameterNodes.ts +104 -0
  333. package/src/plugins/analysis/ast/utils/index.ts +12 -0
  334. package/src/plugins/analysis/ast/utils/location.ts +103 -0
  335. package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +11 -8
  336. package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +909 -83
  337. package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +97 -44
  338. package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +159 -93
  339. package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +12 -8
  340. package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +41 -14
  341. package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +37 -17
  342. package/src/plugins/discovery/MonorepoServiceDiscovery.ts +3 -2
  343. package/src/plugins/discovery/SimpleProjectDiscovery.ts +6 -1
  344. package/src/plugins/discovery/WorkspaceDiscovery.ts +177 -0
  345. package/src/plugins/discovery/resolveSourceEntrypoint.ts +103 -0
  346. package/src/plugins/discovery/workspaces/detector.ts +63 -0
  347. package/src/plugins/discovery/workspaces/globResolver.ts +229 -0
  348. package/src/plugins/discovery/workspaces/index.ts +23 -0
  349. package/src/plugins/discovery/workspaces/parsers.ts +99 -0
  350. package/src/plugins/enrichment/AliasTracker.ts +14 -8
  351. package/src/plugins/enrichment/HTTPConnectionEnricher.ts +14 -7
  352. package/src/plugins/enrichment/ImportExportLinker.ts +24 -6
  353. package/src/plugins/enrichment/MethodCallResolver.ts +18 -12
  354. package/src/plugins/enrichment/MountPointResolver.ts +8 -3
  355. package/src/plugins/enrichment/PrefixEvaluator.ts +16 -7
  356. package/src/plugins/enrichment/RustFFIEnricher.ts +6 -5
  357. package/src/plugins/enrichment/ValueDomainAnalyzer.ts +149 -12
  358. package/src/plugins/indexing/IncrementalModuleIndexer.ts +23 -14
  359. package/src/plugins/indexing/JSModuleIndexer.ts +74 -34
  360. package/src/plugins/indexing/RustModuleIndexer.ts +5 -4
  361. package/src/plugins/validation/CallResolverValidator.ts +8 -7
  362. package/src/plugins/validation/DataFlowValidator.ts +16 -12
  363. package/src/plugins/validation/EvalBanValidator.ts +17 -16
  364. package/src/plugins/validation/GraphConnectivityValidator.ts +19 -23
  365. package/src/plugins/validation/NodeCreationValidator.ts +554 -0
  366. package/src/plugins/validation/SQLInjectionValidator.ts +61 -15
  367. package/src/plugins/validation/ShadowingDetector.ts +6 -5
  368. package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +12 -11
  369. package/src/plugins/vcs/GitPlugin.ts +40 -12
  370. package/src/plugins/vcs/VCSPlugin.ts +7 -5
  371. package/src/storage/backends/RFDBServerBackend.ts +43 -29
  372. package/src/validation/PathValidator.ts +1 -1
  373. package/dist/core/AnalysisWorker.d.ts +0 -14
  374. package/dist/core/AnalysisWorker.d.ts.map +0 -1
  375. package/dist/core/AnalysisWorker.js +0 -307
  376. package/dist/core/ParallelAnalyzer.d.ts +0 -120
  377. package/dist/core/ParallelAnalyzer.d.ts.map +0 -1
  378. package/dist/core/ParallelAnalyzer.js +0 -331
  379. package/dist/core/QueueWorker.d.ts +0 -12
  380. package/dist/core/QueueWorker.d.ts.map +0 -1
  381. package/dist/core/QueueWorker.js +0 -567
  382. package/dist/core/RFDBClient.d.ts +0 -179
  383. package/dist/core/RFDBClient.d.ts.map +0 -1
  384. package/dist/core/RFDBClient.js +0 -429
  385. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +0 -19
  386. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +0 -1
  387. package/dist/plugins/discovery/ZonServiceDiscovery.js +0 -204
  388. package/src/core/AnalysisWorker.ts +0 -410
  389. package/src/core/ParallelAnalyzer.ts +0 -476
  390. package/src/core/QueueWorker.ts +0 -780
  391. package/src/plugins/indexing/ServiceDetector.ts +0 -230
@@ -104,18 +104,21 @@ export class SQLInjectionValidator extends Plugin {
104
104
  phase: 'VALIDATION',
105
105
  priority: 90, // After ValueDomainAnalyzer (65)
106
106
  creates: {
107
- nodes: [],
108
- edges: []
107
+ nodes: ['issue:security'],
108
+ edges: ['AFFECTS']
109
109
  }
110
110
  };
111
111
  }
112
112
 
113
113
  async execute(context: PluginContext): Promise<PluginResult> {
114
114
  const { graph } = context;
115
+ const logger = this.log(context);
115
116
 
116
- console.log('[SQLInjectionValidator] Checking for SQL injection vulnerabilities...');
117
+ logger.info('Starting SQL injection vulnerability check');
117
118
 
118
119
  const issues: SQLInjectionIssue[] = [];
120
+ let issueNodeCount = 0;
121
+ let affectsEdgeCount = 0;
119
122
 
120
123
  // 1. Find all CALL nodes that look like SQL queries
121
124
  const sqlCalls: CallNode[] = [];
@@ -127,13 +130,13 @@ export class SQLInjectionValidator extends Plugin {
127
130
  }
128
131
  }
129
132
 
130
- console.log(`[SQLInjectionValidator] Found ${sqlCalls.length} potential SQL calls`);
133
+ logger.debug('SQL calls collected', { count: sqlCalls.length });
131
134
 
132
135
  // 2. For each SQL call, analyze the query argument
133
136
  for (const call of sqlCalls) {
134
137
  const result = await this.analyzeQueryCall(call, graph);
135
138
  if (result.isVulnerable) {
136
- issues.push({
139
+ const issue: SQLInjectionIssue = {
137
140
  type: 'SQL_INJECTION',
138
141
  severity: 'ERROR',
139
142
  message: `Potential SQL injection at ${call.file}:${call.line || '?'} - ${result.reason}`,
@@ -142,37 +145,79 @@ export class SQLInjectionValidator extends Plugin {
142
145
  line: call.line as number | undefined,
143
146
  reason: result.reason!,
144
147
  nondeterministicSources: result.sources
145
- });
148
+ };
149
+ issues.push(issue);
150
+
151
+ // Persist issue to graph if reportIssue is available
152
+ if (context.reportIssue) {
153
+ await context.reportIssue({
154
+ category: 'security',
155
+ severity: 'error',
156
+ message: issue.message,
157
+ file: call.file || '',
158
+ line: call.line || 0,
159
+ column: call.column || 0,
160
+ targetNodeId: call.id,
161
+ context: {
162
+ type: 'SQL_INJECTION',
163
+ reason: result.reason,
164
+ nondeterministicSources: result.sources
165
+ }
166
+ });
167
+ issueNodeCount++;
168
+ affectsEdgeCount++;
169
+ }
146
170
  }
147
171
  }
148
172
 
149
173
  // 3. Also check via graph pattern - CALL nodes that have ARGUMENT -> PARAMETER paths
150
- const patternViolations = await this.checkViaGraphPattern(graph, sqlCalls);
174
+ const patternViolations = await this.checkViaGraphPattern(graph, logger, sqlCalls);
151
175
  for (const violation of patternViolations) {
152
176
  // Avoid duplicates
153
177
  if (!issues.find(i => i.nodeId === violation.nodeId)) {
154
178
  issues.push(violation);
179
+
180
+ // Persist issue to graph if reportIssue is available
181
+ if (context.reportIssue) {
182
+ await context.reportIssue({
183
+ category: 'security',
184
+ severity: 'error',
185
+ message: violation.message,
186
+ file: violation.file || '',
187
+ line: violation.line || 0,
188
+ targetNodeId: violation.nodeId,
189
+ context: {
190
+ type: 'SQL_INJECTION',
191
+ reason: violation.reason,
192
+ nondeterministicSources: violation.nondeterministicSources
193
+ }
194
+ });
195
+ issueNodeCount++;
196
+ affectsEdgeCount++;
197
+ }
155
198
  }
156
199
  }
157
200
 
158
201
  const summary = {
159
202
  sqlCallsChecked: sqlCalls.length,
160
- vulnerabilitiesFound: issues.length
203
+ vulnerabilitiesFound: issues.length,
204
+ issueNodesCreated: issueNodeCount,
205
+ affectsEdgesCreated: affectsEdgeCount
161
206
  };
162
207
 
163
- console.log('[SQLInjectionValidator] Summary:', summary);
208
+ logger.info('Validation complete', summary);
164
209
 
165
210
  if (issues.length > 0) {
166
- console.log('[SQLInjectionValidator] ❌ SQL injection vulnerabilities found:');
211
+ logger.warn('SQL injection vulnerabilities found', { count: issues.length });
167
212
  for (const issue of issues) {
168
- console.log(` 🚫 ${issue.message}`);
213
+ logger.warn(issue.message);
169
214
  }
170
215
  } else {
171
- console.log('[SQLInjectionValidator] ✅ No SQL injection vulnerabilities detected');
216
+ logger.info('No SQL injection vulnerabilities detected');
172
217
  }
173
218
 
174
219
  return createSuccessResult(
175
- { nodes: 0, edges: 0 },
220
+ { nodes: issueNodeCount, edges: affectsEdgeCount },
176
221
  { summary, issues }
177
222
  );
178
223
  }
@@ -307,6 +352,7 @@ export class SQLInjectionValidator extends Plugin {
307
352
  */
308
353
  private async checkViaGraphPattern(
309
354
  graph: PluginContext['graph'],
355
+ logger: ReturnType<typeof this.log>,
310
356
  excludeCalls: CallNode[] = []
311
357
  ): Promise<SQLInjectionIssue[]> {
312
358
  const issues: SQLInjectionIssue[] = [];
@@ -316,7 +362,7 @@ export class SQLInjectionValidator extends Plugin {
316
362
  try {
317
363
  // Check if graph supports checkGuarantee
318
364
  if (!graph.checkGuarantee) {
319
- console.log('[SQLInjectionValidator] Graph does not support checkGuarantee, skipping pattern-based check');
365
+ logger.debug('Graph does not support checkGuarantee, skipping pattern-based check');
320
366
  return issues;
321
367
  }
322
368
 
@@ -353,7 +399,7 @@ export class SQLInjectionValidator extends Plugin {
353
399
  }
354
400
  } catch (err) {
355
401
  // Datalog query might fail if backend doesn't support it
356
- console.log('[SQLInjectionValidator] Datalog check skipped:', (err as Error).message);
402
+ logger.debug('Datalog check skipped', { error: (err as Error).message });
357
403
  }
358
404
 
359
405
  return issues;
@@ -70,8 +70,9 @@ export class ShadowingDetector extends Plugin {
70
70
 
71
71
  async execute(context: PluginContext): Promise<PluginResult> {
72
72
  const { graph } = context;
73
+ const logger = this.log(context);
73
74
 
74
- console.log('[ShadowingDetector] Checking for variable shadowing...');
75
+ logger.info('Starting variable shadowing detection');
75
76
 
76
77
  const issues: ShadowingIssue[] = [];
77
78
 
@@ -154,15 +155,15 @@ export class ShadowingDetector extends Plugin {
154
155
  totalIssues: issues.length
155
156
  };
156
157
 
157
- console.log('[ShadowingDetector] Summary:', summary);
158
+ logger.info('Detection complete', { ...summary });
158
159
 
159
160
  if (issues.length > 0) {
160
- console.log('[ShadowingDetector] Shadowing issues found:');
161
+ logger.warn('Shadowing issues found', { count: issues.length });
161
162
  for (const issue of issues) {
162
- console.log(` ${issue.type === 'CROSS_FILE_SHADOW' ? '📁' : '🔒'} ${issue.message}`);
163
+ logger.warn(issue.message, { type: issue.type });
163
164
  }
164
165
  } else {
165
- console.log('[ShadowingDetector] No shadowing issues detected');
166
+ logger.info('No shadowing issues detected');
166
167
  }
167
168
 
168
169
  return createSuccessResult(
@@ -58,14 +58,15 @@ export class TypeScriptDeadCodeValidator extends Plugin {
58
58
 
59
59
  async execute(context: PluginContext): Promise<PluginResult> {
60
60
  const { graph } = context;
61
+ const logger = this.log(context);
61
62
 
62
- console.log('[TypeScriptDeadCodeValidator] Checking for dead TypeScript code...');
63
+ logger.info('Starting TypeScript dead code analysis');
63
64
  const startTime = Date.now();
64
65
 
65
66
  const issues: DeadCodeIssue[] = [];
66
67
 
67
68
  // Collect all interfaces
68
- console.log('[TypeScriptDeadCodeValidator] Collecting interfaces...');
69
+ logger.debug('Collecting interfaces');
69
70
  const interfaces: Map<string, { id: string; name: string; file?: string; line?: number; properties?: unknown[] }> = new Map();
70
71
 
71
72
  for await (const node of graph.queryNodes({ nodeType: 'INTERFACE' })) {
@@ -80,10 +81,10 @@ export class TypeScriptDeadCodeValidator extends Plugin {
80
81
  properties: (node as { properties?: unknown[] }).properties
81
82
  });
82
83
  }
83
- console.log(`[TypeScriptDeadCodeValidator] Found ${interfaces.size} interfaces`);
84
+ logger.debug('Interfaces collected', { count: interfaces.size });
84
85
 
85
86
  // Find interfaces with IMPLEMENTS or EXTENDS edges
86
- console.log('[TypeScriptDeadCodeValidator] Checking implementations...');
87
+ logger.debug('Checking implementations');
87
88
  const implementedInterfaces: Map<string, number> = new Map();
88
89
 
89
90
  // Get all edges and filter by type (no queryEdges in GraphBackend yet)
@@ -168,31 +169,31 @@ export class TypeScriptDeadCodeValidator extends Plugin {
168
169
  timeSeconds: totalTime
169
170
  };
170
171
 
171
- console.log('[TypeScriptDeadCodeValidator] Summary:', summary);
172
+ logger.info('Analysis complete', { ...summary });
172
173
 
173
174
  // Report issues
174
175
  const warnings = issues.filter(i => i.severity === 'WARNING');
175
176
  const infos = issues.filter(i => i.severity === 'INFO');
176
177
 
177
178
  if (warnings.length > 0) {
178
- console.log(`[TypeScriptDeadCodeValidator] ⚠️ ${warnings.length} warning(s):`);
179
+ logger.warn('Warnings found', { count: warnings.length });
179
180
  for (const issue of warnings) {
180
- console.log(` ⚠️ ${issue.message}`);
181
+ logger.warn(issue.message);
181
182
  }
182
183
  }
183
184
 
184
185
  if (infos.length > 0) {
185
- console.log(`[TypeScriptDeadCodeValidator] ℹ️ ${infos.length} info(s):`);
186
+ logger.info('Info messages', { count: infos.length });
186
187
  for (const issue of infos.slice(0, 5)) { // Limit to first 5
187
- console.log(` ℹ️ ${issue.message}`);
188
+ logger.info(issue.message);
188
189
  }
189
190
  if (infos.length > 5) {
190
- console.log(` ... and ${infos.length - 5} more`);
191
+ logger.debug(`... and ${infos.length - 5} more`);
191
192
  }
192
193
  }
193
194
 
194
195
  if (issues.length === 0) {
195
- console.log('[TypeScriptDeadCodeValidator] ✅ No dead TypeScript code detected');
196
+ logger.info('No dead TypeScript code detected');
196
197
  }
197
198
 
198
199
  return createSuccessResult(
@@ -7,6 +7,7 @@
7
7
 
8
8
  import { VCSPlugin, FileStatus } from './VCSPlugin.js';
9
9
  import type { VCSConfig, VCSPluginMetadata, ChangedFile, FileDiff, DiffHunk } from './VCSPlugin.js';
10
+ import { FileAccessError } from '../../errors/GrafemaError.js';
10
11
  import { exec } from 'child_process';
11
12
  import { promisify } from 'util';
12
13
  import { join } from 'path';
@@ -113,8 +114,12 @@ export class GitPlugin extends VCSPlugin {
113
114
 
114
115
  return files;
115
116
  } catch (error) {
116
- console.error('[GitPlugin] Failed to get changed files:', (error as Error).message);
117
- return [];
117
+ throw new FileAccessError(
118
+ `Failed to get changed files: ${(error as Error).message}`,
119
+ 'ERR_GIT_ACCESS_DENIED',
120
+ { plugin: 'GitPlugin' },
121
+ 'Check that git is installed and this is a valid git repository'
122
+ );
118
123
  }
119
124
  }
120
125
 
@@ -152,8 +157,12 @@ export class GitPlugin extends VCSPlugin {
152
157
  // Парсим unified diff
153
158
  return this._parseUnifiedDiff(filePath, stdout);
154
159
  } catch (error) {
155
- console.error(`[GitPlugin] Failed to get diff for ${filePath}:`, (error as Error).message);
156
- return { path: filePath, hunks: [] };
160
+ throw new FileAccessError(
161
+ `Failed to get diff for ${filePath}: ${(error as Error).message}`,
162
+ 'ERR_GIT_ACCESS_DENIED',
163
+ { plugin: 'GitPlugin', filePath },
164
+ 'Ensure the file is tracked by git and the working directory is accessible'
165
+ );
157
166
  }
158
167
  }
159
168
 
@@ -164,8 +173,13 @@ export class GitPlugin extends VCSPlugin {
164
173
  try {
165
174
  const { stdout } = await this._exec('git rev-parse --abbrev-ref HEAD');
166
175
  return stdout.trim();
167
- } catch {
168
- return 'unknown';
176
+ } catch (error) {
177
+ throw new FileAccessError(
178
+ `Failed to get current branch: ${(error as Error).message}`,
179
+ 'ERR_GIT_ACCESS_DENIED',
180
+ { plugin: 'GitPlugin' },
181
+ 'Ensure this is a valid git repository with at least one commit'
182
+ );
169
183
  }
170
184
  }
171
185
 
@@ -176,8 +190,13 @@ export class GitPlugin extends VCSPlugin {
176
190
  try {
177
191
  const { stdout } = await this._exec('git rev-parse HEAD');
178
192
  return stdout.trim();
179
- } catch {
180
- return null;
193
+ } catch (error) {
194
+ throw new FileAccessError(
195
+ `Failed to get last commit hash: ${(error as Error).message}`,
196
+ 'ERR_GIT_NOT_FOUND',
197
+ { plugin: 'GitPlugin' },
198
+ 'Ensure this is a valid git repository with at least one commit'
199
+ );
181
200
  }
182
201
  }
183
202
 
@@ -309,8 +328,12 @@ export class GitPlugin extends VCSPlugin {
309
328
  const { stdout } = await this._exec('git ls-files');
310
329
  return stdout.trim().split('\n').filter(line => line.length > 0);
311
330
  } catch (error) {
312
- console.error('[GitPlugin] Failed to get tracked files:', (error as Error).message);
313
- return [];
331
+ throw new FileAccessError(
332
+ `Failed to get tracked files: ${(error as Error).message}`,
333
+ 'ERR_GIT_ACCESS_DENIED',
334
+ { plugin: 'GitPlugin' },
335
+ 'Check that git is installed and this is a valid git repository'
336
+ );
314
337
  }
315
338
  }
316
339
 
@@ -329,8 +352,13 @@ export class GitPlugin extends VCSPlugin {
329
352
  timestamp: parseInt(lines[3]) * 1000,
330
353
  message: lines[4]
331
354
  };
332
- } catch {
333
- return null;
355
+ } catch (error) {
356
+ throw new FileAccessError(
357
+ `Failed to get last commit info: ${(error as Error).message}`,
358
+ 'ERR_GIT_NOT_FOUND',
359
+ { plugin: 'GitPlugin' },
360
+ 'Ensure this is a valid git repository with at least one commit'
361
+ );
334
362
  }
335
363
  }
336
364
 
@@ -12,6 +12,8 @@
12
12
  * - Perforce
13
13
  */
14
14
 
15
+ import type { Logger } from '../../logging/Logger.js';
16
+
15
17
  /**
16
18
  * VCS Plugin configuration
17
19
  */
@@ -154,13 +156,13 @@ export class VCSPluginFactory {
154
156
  /**
155
157
  * Автоматически определить и создать подходящий VCS плагин
156
158
  */
157
- static async detect(config: VCSConfig = {}): Promise<VCSPlugin | null> {
159
+ static async detect(config: VCSConfig = {}, logger?: Logger): Promise<VCSPlugin | null> {
158
160
  for (const PluginClass of this.availablePlugins) {
159
161
  const plugin = new PluginClass(config);
160
162
 
161
163
  try {
162
164
  if (await plugin.isAvailable()) {
163
- console.log(`[VCS] Detected ${plugin.metadata.name}`);
165
+ logger?.info('VCS detected', { name: plugin.metadata.name });
164
166
  return plugin;
165
167
  }
166
168
  } catch {
@@ -168,20 +170,20 @@ export class VCSPluginFactory {
168
170
  }
169
171
  }
170
172
 
171
- console.warn('[VCS] No VCS system detected');
173
+ logger?.warn('No VCS system detected');
172
174
  return null;
173
175
  }
174
176
 
175
177
  /**
176
178
  * Создать плагин по имени
177
179
  */
178
- static create(name: string, config: VCSConfig = {}): VCSPlugin | null {
180
+ static create(name: string, config: VCSConfig = {}, logger?: Logger): VCSPlugin | null {
179
181
  const PluginClass = this.availablePlugins.find(
180
182
  Plugin => new Plugin(config).metadata.name === name
181
183
  );
182
184
 
183
185
  if (!PluginClass) {
184
- console.error(`[VCS] Plugin "${name}" not found`);
186
+ logger?.error('VCS plugin not found', { name });
185
187
  return null;
186
188
  }
187
189
 
@@ -27,6 +27,7 @@ import { setTimeout as sleep } from 'timers/promises';
27
27
 
28
28
  import type { WireNode, WireEdge } from '@grafema/types';
29
29
  import type { NodeType, EdgeType } from '@grafema/types';
30
+ import type { BaseNodeRecord } from '@grafema/types';
30
31
  import type { AttrQuery, GraphStats, GraphExport } from '../../core/GraphBackend.js';
31
32
 
32
33
  const __filename = fileURLToPath(import.meta.url);
@@ -40,19 +41,6 @@ export interface RFDBServerBackendOptions {
40
41
  dbPath?: string;
41
42
  }
42
43
 
43
- /**
44
- * Node as returned from the backend
45
- */
46
- export interface BackendNode {
47
- id: string;
48
- type: string;
49
- nodeType: string;
50
- name: string;
51
- file: string;
52
- exported: boolean;
53
- [key: string]: unknown;
54
- }
55
-
56
44
  /**
57
45
  * Edge as returned from the backend
58
46
  */
@@ -283,20 +271,26 @@ export class RFDBServerBackend {
283
271
  }
284
272
 
285
273
  /**
286
- * Close connection and stop server if we started it
274
+ * Close client connection. Server continues running to serve other clients.
287
275
  */
288
276
  async close(): Promise<void> {
277
+ // Request server flush before disconnecting
289
278
  if (this.client) {
279
+ try {
280
+ await this.client.flush();
281
+ } catch {
282
+ // Ignore flush errors on close - best effort
283
+ }
290
284
  await this.client.close();
291
285
  this.client = null;
292
286
  }
293
287
  this.connected = false;
294
288
 
295
- // Kill server process if we started it
296
- if (this.serverProcess) {
297
- this.serverProcess.kill('SIGTERM');
298
- this.serverProcess = null;
299
- }
289
+ // NOTE: We intentionally do NOT kill the server process.
290
+ // The server continues running to serve other clients (MCP, other CLI invocations).
291
+ // This is by design for multi-client architecture.
292
+ // Server lifecycle is managed separately (system process, or manual grafema server stop).
293
+ this.serverProcess = null;
300
294
  }
301
295
 
302
296
  /**
@@ -371,14 +365,22 @@ export class RFDBServerBackend {
371
365
  }
372
366
 
373
367
  const wireEdges: WireEdge[] = edges.map(e => {
374
- const { src, dst, type, edgeType, edge_type, etype, ...rest } = e;
368
+ const { src, dst, type, edgeType, edge_type, etype, metadata, ...rest } = e;
369
+
370
+ // Flatten metadata: spread both edge-level properties and nested metadata
371
+ const flatMetadata = {
372
+ _origSrc: String(src),
373
+ _origDst: String(dst),
374
+ ...rest,
375
+ ...(typeof metadata === 'object' && metadata !== null ? metadata : {})
376
+ };
375
377
 
376
378
  return {
377
379
  src: String(src),
378
380
  dst: String(dst),
379
381
  edgeType: (edgeType || edge_type || etype || type || 'UNKNOWN') as EdgeType,
380
- // Store original string IDs in metadata for retrieval
381
- metadata: JSON.stringify({ _origSrc: String(src), _origDst: String(dst), ...rest }),
382
+ // Store flattened metadata for retrieval
383
+ metadata: JSON.stringify(flatMetadata),
382
384
  };
383
385
  });
384
386
 
@@ -388,7 +390,7 @@ export class RFDBServerBackend {
388
390
  /**
389
391
  * Get a node by ID
390
392
  */
391
- async getNode(id: string): Promise<BackendNode | null> {
393
+ async getNode(id: string): Promise<BaseNodeRecord | null> {
392
394
  if (!this.client) throw new Error('Not connected');
393
395
  const node = await this.client.getNode(String(id));
394
396
  if (!node) return null;
@@ -423,7 +425,7 @@ export class RFDBServerBackend {
423
425
  /**
424
426
  * Parse a node from wire format to JS format
425
427
  */
426
- private _parseNode(wireNode: WireNode): BackendNode {
428
+ private _parseNode(wireNode: WireNode): BaseNodeRecord {
427
429
  const metadata: Record<string, unknown> = wireNode.metadata ? JSON.parse(wireNode.metadata) : {};
428
430
 
429
431
  // Parse nested JSON strings
@@ -441,7 +443,6 @@ export class RFDBServerBackend {
441
443
 
442
444
  return {
443
445
  id: humanId,
444
- nodeType: wireNode.nodeType,
445
446
  type: wireNode.nodeType,
446
447
  name: wireNode.name,
447
448
  file: wireNode.file,
@@ -453,7 +454,7 @@ export class RFDBServerBackend {
453
454
  /**
454
455
  * Async generator for querying nodes
455
456
  */
456
- async *queryNodes(query: NodeQuery): AsyncGenerator<BackendNode, void, unknown> {
457
+ async *queryNodes(query: NodeQuery): AsyncGenerator<BaseNodeRecord, void, unknown> {
457
458
  if (!this.client) throw new Error('Not connected');
458
459
 
459
460
  // Build query for server
@@ -482,8 +483,8 @@ export class RFDBServerBackend {
482
483
  /**
483
484
  * Get ALL nodes matching query (collects from queryNodes into array)
484
485
  */
485
- async getAllNodes(query: NodeQuery = {}): Promise<BackendNode[]> {
486
- const nodes: BackendNode[] = [];
486
+ async getAllNodes(query: NodeQuery = {}): Promise<BaseNodeRecord[]> {
487
+ const nodes: BaseNodeRecord[] = [];
487
488
  for await (const node of this.queryNodes(query)) {
488
489
  nodes.push(node);
489
490
  }
@@ -587,6 +588,19 @@ export class RFDBServerBackend {
587
588
  return this.client.dfs(startIds, maxDepth, edgeTypes);
588
589
  }
589
590
 
591
+ /**
592
+ * Reachability query - find all nodes reachable from start nodes
593
+ */
594
+ async reachability(
595
+ startIds: string[],
596
+ maxDepth: number,
597
+ edgeTypes: EdgeType[] = [],
598
+ backward: boolean = false
599
+ ): Promise<string[]> {
600
+ if (!this.client) throw new Error('Not connected');
601
+ return this.client.reachability(startIds, maxDepth, edgeTypes, backward);
602
+ }
603
+
590
604
  // ===========================================================================
591
605
  // Statistics
592
606
  // ===========================================================================
@@ -713,7 +727,7 @@ export class RFDBServerBackend {
713
727
  /**
714
728
  * Find nodes by predicate (for compatibility)
715
729
  */
716
- async findNodes(predicate: (node: BackendNode) => boolean): Promise<BackendNode[]> {
730
+ async findNodes(predicate: (node: BaseNodeRecord) => boolean): Promise<BaseNodeRecord[]> {
717
731
  const allNodes = await this.getAllNodes();
718
732
  return allNodes.filter(predicate);
719
733
  }
@@ -50,7 +50,7 @@ export interface PathValidationResult {
50
50
  /**
51
51
  * Endpoint diff info
52
52
  */
53
- interface EndpointDiff {
53
+ export interface EndpointDiff {
54
54
  type: string;
55
55
  name: string;
56
56
  reason: string;
@@ -1,14 +0,0 @@
1
- /**
2
- * AnalysisWorker - worker thread for parallel AST analysis
3
- *
4
- * Each worker:
5
- * 1. Connects to RFDB server
6
- * 2. Receives file paths to analyze
7
- * 3. Parses AST and writes nodes/edges directly to RFDB
8
- *
9
- * Communication:
10
- * Main -> Worker: { type: 'analyze', file, moduleId, moduleName }
11
- * Worker -> Main: { type: 'done', file, stats } | { type: 'error', file, error }
12
- */
13
- export {};
14
- //# sourceMappingURL=AnalysisWorker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AnalysisWorker.d.ts","sourceRoot":"","sources":["../../src/core/AnalysisWorker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}