@grafema/core 0.1.0-alpha.5 → 0.2.0-beta

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 (530) hide show
  1. package/README.md +0 -1
  2. package/dist/Orchestrator.d.ts +31 -2
  3. package/dist/Orchestrator.d.ts.map +1 -1
  4. package/dist/Orchestrator.js +222 -27
  5. package/dist/config/ConfigLoader.d.ts +90 -0
  6. package/dist/config/ConfigLoader.d.ts.map +1 -0
  7. package/dist/config/ConfigLoader.js +249 -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/FileExplainer.d.ts +101 -0
  18. package/dist/core/FileExplainer.d.ts.map +1 -0
  19. package/dist/core/FileExplainer.js +139 -0
  20. package/dist/core/FileNodeManager.d.ts +40 -0
  21. package/dist/core/FileNodeManager.d.ts.map +1 -0
  22. package/dist/core/FileNodeManager.js +84 -0
  23. package/dist/core/GraphFreshnessChecker.d.ts +33 -0
  24. package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
  25. package/dist/core/GraphFreshnessChecker.js +101 -0
  26. package/dist/core/HashUtils.d.ts +24 -0
  27. package/dist/core/HashUtils.d.ts.map +1 -0
  28. package/dist/core/HashUtils.js +45 -0
  29. package/dist/core/IncrementalReanalyzer.d.ts +36 -0
  30. package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
  31. package/dist/core/IncrementalReanalyzer.js +132 -0
  32. package/dist/core/NodeFactory.d.ts +266 -19
  33. package/dist/core/NodeFactory.d.ts.map +1 -1
  34. package/dist/core/NodeFactory.js +256 -21
  35. package/dist/core/ScopeTracker.d.ts +84 -0
  36. package/dist/core/ScopeTracker.d.ts.map +1 -0
  37. package/dist/core/ScopeTracker.js +116 -0
  38. package/dist/core/SemanticId.d.ts +90 -0
  39. package/dist/core/SemanticId.d.ts.map +1 -0
  40. package/dist/core/SemanticId.js +115 -0
  41. package/dist/core/VersionManager.d.ts.map +1 -1
  42. package/dist/core/VersionManager.js +3 -2
  43. package/dist/core/nodes/ArgumentExpressionNode.d.ts +43 -0
  44. package/dist/core/nodes/ArgumentExpressionNode.d.ts.map +1 -0
  45. package/dist/core/nodes/ArgumentExpressionNode.js +60 -0
  46. package/dist/core/nodes/ArrayLiteralNode.d.ts +27 -0
  47. package/dist/core/nodes/ArrayLiteralNode.d.ts.map +1 -0
  48. package/dist/core/nodes/ArrayLiteralNode.js +43 -0
  49. package/dist/core/nodes/BranchNode.d.ts +41 -0
  50. package/dist/core/nodes/BranchNode.d.ts.map +1 -0
  51. package/dist/core/nodes/BranchNode.js +82 -0
  52. package/dist/core/nodes/CallSiteNode.d.ts +30 -2
  53. package/dist/core/nodes/CallSiteNode.d.ts.map +1 -1
  54. package/dist/core/nodes/CallSiteNode.js +54 -4
  55. package/dist/core/nodes/CaseNode.d.ts +43 -0
  56. package/dist/core/nodes/CaseNode.d.ts.map +1 -0
  57. package/dist/core/nodes/CaseNode.js +81 -0
  58. package/dist/core/nodes/ClassNode.d.ts +34 -2
  59. package/dist/core/nodes/ClassNode.d.ts.map +1 -1
  60. package/dist/core/nodes/ClassNode.js +52 -4
  61. package/dist/core/nodes/ConstantNode.d.ts +2 -2
  62. package/dist/core/nodes/ConstantNode.d.ts.map +1 -1
  63. package/dist/core/nodes/ConstantNode.js +6 -4
  64. package/dist/core/nodes/ConstructorCallNode.d.ts +51 -0
  65. package/dist/core/nodes/ConstructorCallNode.d.ts.map +1 -0
  66. package/dist/core/nodes/ConstructorCallNode.js +171 -0
  67. package/dist/core/nodes/DatabaseQueryNode.d.ts +3 -2
  68. package/dist/core/nodes/DatabaseQueryNode.d.ts.map +1 -1
  69. package/dist/core/nodes/DatabaseQueryNode.js +5 -2
  70. package/dist/core/nodes/DecoratorNode.d.ts +42 -0
  71. package/dist/core/nodes/DecoratorNode.d.ts.map +1 -0
  72. package/dist/core/nodes/DecoratorNode.js +64 -0
  73. package/dist/core/nodes/EnumNode.d.ts +42 -0
  74. package/dist/core/nodes/EnumNode.d.ts.map +1 -0
  75. package/dist/core/nodes/EnumNode.js +56 -0
  76. package/dist/core/nodes/EventListenerNode.d.ts +4 -4
  77. package/dist/core/nodes/EventListenerNode.d.ts.map +1 -1
  78. package/dist/core/nodes/EventListenerNode.js +7 -4
  79. package/dist/core/nodes/ExportNode.d.ts +38 -2
  80. package/dist/core/nodes/ExportNode.d.ts.map +1 -1
  81. package/dist/core/nodes/ExportNode.js +54 -4
  82. package/dist/core/nodes/ExpressionNode.d.ts +97 -0
  83. package/dist/core/nodes/ExpressionNode.d.ts.map +1 -0
  84. package/dist/core/nodes/ExpressionNode.js +180 -0
  85. package/dist/core/nodes/ExternalModuleNode.d.ts +32 -0
  86. package/dist/core/nodes/ExternalModuleNode.d.ts.map +1 -0
  87. package/dist/core/nodes/ExternalModuleNode.js +49 -0
  88. package/dist/core/nodes/ExternalStdioNode.d.ts +13 -6
  89. package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -1
  90. package/dist/core/nodes/ExternalStdioNode.js +15 -8
  91. package/dist/core/nodes/FunctionNode.d.ts +36 -0
  92. package/dist/core/nodes/FunctionNode.d.ts.map +1 -1
  93. package/dist/core/nodes/FunctionNode.js +80 -1
  94. package/dist/core/nodes/HttpRequestNode.d.ts +4 -4
  95. package/dist/core/nodes/HttpRequestNode.d.ts.map +1 -1
  96. package/dist/core/nodes/HttpRequestNode.js +7 -4
  97. package/dist/core/nodes/ImportNode.d.ts +28 -6
  98. package/dist/core/nodes/ImportNode.d.ts.map +1 -1
  99. package/dist/core/nodes/ImportNode.js +43 -8
  100. package/dist/core/nodes/InterfaceNode.d.ts +46 -0
  101. package/dist/core/nodes/InterfaceNode.d.ts.map +1 -0
  102. package/dist/core/nodes/InterfaceNode.js +57 -0
  103. package/dist/core/nodes/IssueNode.d.ts +73 -0
  104. package/dist/core/nodes/IssueNode.d.ts.map +1 -0
  105. package/dist/core/nodes/IssueNode.js +129 -0
  106. package/dist/core/nodes/LiteralNode.d.ts +2 -2
  107. package/dist/core/nodes/LiteralNode.d.ts.map +1 -1
  108. package/dist/core/nodes/LiteralNode.js +6 -4
  109. package/dist/core/nodes/MethodCallNode.d.ts +32 -2
  110. package/dist/core/nodes/MethodCallNode.d.ts.map +1 -1
  111. package/dist/core/nodes/MethodCallNode.js +57 -4
  112. package/dist/core/nodes/MethodNode.d.ts +34 -2
  113. package/dist/core/nodes/MethodNode.d.ts.map +1 -1
  114. package/dist/core/nodes/MethodNode.js +55 -3
  115. package/dist/core/nodes/ModuleNode.d.ts +31 -0
  116. package/dist/core/nodes/ModuleNode.d.ts.map +1 -1
  117. package/dist/core/nodes/ModuleNode.js +37 -0
  118. package/dist/core/nodes/NetworkRequestNode.d.ts +54 -0
  119. package/dist/core/nodes/NetworkRequestNode.d.ts.map +1 -0
  120. package/dist/core/nodes/NetworkRequestNode.js +65 -0
  121. package/dist/core/nodes/ObjectLiteralNode.d.ts +27 -0
  122. package/dist/core/nodes/ObjectLiteralNode.d.ts.map +1 -0
  123. package/dist/core/nodes/ObjectLiteralNode.js +43 -0
  124. package/dist/core/nodes/ParameterNode.d.ts +2 -2
  125. package/dist/core/nodes/ParameterNode.d.ts.map +1 -1
  126. package/dist/core/nodes/ParameterNode.js +5 -3
  127. package/dist/core/nodes/ScopeNode.d.ts +31 -0
  128. package/dist/core/nodes/ScopeNode.d.ts.map +1 -1
  129. package/dist/core/nodes/ScopeNode.js +49 -0
  130. package/dist/core/nodes/TypeNode.d.ts +36 -0
  131. package/dist/core/nodes/TypeNode.d.ts.map +1 -0
  132. package/dist/core/nodes/TypeNode.js +55 -0
  133. package/dist/core/nodes/VariableDeclarationNode.d.ts +29 -2
  134. package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -1
  135. package/dist/core/nodes/VariableDeclarationNode.js +48 -4
  136. package/dist/core/nodes/index.d.ts +15 -1
  137. package/dist/core/nodes/index.d.ts.map +1 -1
  138. package/dist/core/nodes/index.js +17 -0
  139. package/dist/data/builtins/BuiltinRegistry.d.ts +78 -0
  140. package/dist/data/builtins/BuiltinRegistry.d.ts.map +1 -0
  141. package/dist/data/builtins/BuiltinRegistry.js +110 -0
  142. package/dist/data/builtins/definitions.d.ts +28 -0
  143. package/dist/data/builtins/definitions.d.ts.map +1 -0
  144. package/dist/data/builtins/definitions.js +250 -0
  145. package/dist/data/builtins/index.d.ts +10 -0
  146. package/dist/data/builtins/index.d.ts.map +1 -0
  147. package/dist/data/builtins/index.js +8 -0
  148. package/dist/data/builtins/jsGlobals.d.ts +18 -0
  149. package/dist/data/builtins/jsGlobals.d.ts.map +1 -0
  150. package/dist/data/builtins/jsGlobals.js +26 -0
  151. package/dist/data/builtins/types.d.ts +34 -0
  152. package/dist/data/builtins/types.d.ts.map +1 -0
  153. package/dist/data/builtins/types.js +7 -0
  154. package/dist/data/globals/definitions.d.ts +27 -0
  155. package/dist/data/globals/definitions.d.ts.map +1 -0
  156. package/dist/data/globals/definitions.js +117 -0
  157. package/dist/data/globals/index.d.ts +36 -0
  158. package/dist/data/globals/index.d.ts.map +1 -0
  159. package/dist/data/globals/index.js +52 -0
  160. package/dist/diagnostics/DiagnosticCollector.d.ts +98 -0
  161. package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
  162. package/dist/diagnostics/DiagnosticCollector.js +129 -0
  163. package/dist/diagnostics/DiagnosticReporter.d.ts +100 -0
  164. package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
  165. package/dist/diagnostics/DiagnosticReporter.js +247 -0
  166. package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
  167. package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
  168. package/dist/diagnostics/DiagnosticWriter.js +43 -0
  169. package/dist/diagnostics/index.d.ts +14 -0
  170. package/dist/diagnostics/index.d.ts.map +1 -0
  171. package/dist/diagnostics/index.js +11 -0
  172. package/dist/errors/GrafemaError.d.ts +161 -0
  173. package/dist/errors/GrafemaError.d.ts.map +1 -0
  174. package/dist/errors/GrafemaError.js +181 -0
  175. package/dist/index.d.ts +73 -1
  176. package/dist/index.d.ts.map +1 -1
  177. package/dist/index.js +70 -1
  178. package/dist/logging/Logger.d.ts +48 -0
  179. package/dist/logging/Logger.d.ts.map +1 -0
  180. package/dist/logging/Logger.js +134 -0
  181. package/dist/plugins/Plugin.d.ts +5 -1
  182. package/dist/plugins/Plugin.d.ts.map +1 -1
  183. package/dist/plugins/Plugin.js +33 -0
  184. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -1
  185. package/dist/plugins/analysis/DatabaseAnalyzer.js +14 -6
  186. package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -1
  187. package/dist/plugins/analysis/ExpressAnalyzer.js +29 -19
  188. package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts +148 -0
  189. package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts.map +1 -0
  190. package/dist/plugins/analysis/ExpressResponseAnalyzer.js +495 -0
  191. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -1
  192. package/dist/plugins/analysis/ExpressRouteAnalyzer.js +71 -29
  193. package/dist/plugins/analysis/FetchAnalyzer.d.ts +41 -0
  194. package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -1
  195. package/dist/plugins/analysis/FetchAnalyzer.js +187 -19
  196. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +6 -3
  197. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -1
  198. package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +76 -80
  199. package/dist/plugins/analysis/JSASTAnalyzer.d.ts +313 -19
  200. package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -1
  201. package/dist/plugins/analysis/JSASTAnalyzer.js +3430 -503
  202. package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -1
  203. package/dist/plugins/analysis/ReactAnalyzer.js +56 -57
  204. package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -1
  205. package/dist/plugins/analysis/RustAnalyzer.js +16 -11
  206. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -1
  207. package/dist/plugins/analysis/SQLiteAnalyzer.js +11 -7
  208. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -1
  209. package/dist/plugins/analysis/ServiceLayerAnalyzer.js +21 -9
  210. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts +9 -0
  211. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -1
  212. package/dist/plugins/analysis/SocketIOAnalyzer.js +117 -21
  213. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -1
  214. package/dist/plugins/analysis/SystemDbAnalyzer.js +15 -5
  215. package/dist/plugins/analysis/ast/GraphBuilder.d.ts +207 -4
  216. package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -1
  217. package/dist/plugins/analysis/ast/GraphBuilder.js +1527 -316
  218. package/dist/plugins/analysis/ast/IdGenerator.d.ts +105 -0
  219. package/dist/plugins/analysis/ast/IdGenerator.d.ts.map +1 -0
  220. package/dist/plugins/analysis/ast/IdGenerator.js +116 -0
  221. package/dist/plugins/analysis/ast/types.d.ts +470 -5
  222. package/dist/plugins/analysis/ast/types.d.ts.map +1 -1
  223. package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts +33 -0
  224. package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts.map +1 -0
  225. package/dist/plugins/analysis/ast/utils/createParameterNodes.js +89 -0
  226. package/dist/plugins/analysis/ast/utils/index.d.ts +6 -0
  227. package/dist/plugins/analysis/ast/utils/index.d.ts.map +1 -0
  228. package/dist/plugins/analysis/ast/utils/index.js +5 -0
  229. package/dist/plugins/analysis/ast/utils/location.d.ts +87 -0
  230. package/dist/plugins/analysis/ast/utils/location.d.ts.map +1 -0
  231. package/dist/plugins/analysis/ast/utils/location.js +78 -0
  232. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +14 -5
  233. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -1
  234. package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +6 -5
  235. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +100 -9
  236. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -1
  237. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +674 -125
  238. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +4 -1
  239. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -1
  240. package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +72 -32
  241. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +14 -1
  242. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -1
  243. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +190 -63
  244. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts +4 -0
  245. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -1
  246. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +112 -8
  247. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +12 -1
  248. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -1
  249. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +36 -14
  250. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +20 -2
  251. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -1
  252. package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +243 -45
  253. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -1
  254. package/dist/plugins/discovery/MonorepoServiceDiscovery.js +3 -2
  255. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -1
  256. package/dist/plugins/discovery/SimpleProjectDiscovery.js +5 -1
  257. package/dist/plugins/discovery/WorkspaceDiscovery.d.ts +22 -0
  258. package/dist/plugins/discovery/WorkspaceDiscovery.d.ts.map +1 -0
  259. package/dist/plugins/discovery/WorkspaceDiscovery.js +141 -0
  260. package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts +46 -0
  261. package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts.map +1 -0
  262. package/dist/plugins/discovery/resolveSourceEntrypoint.js +86 -0
  263. package/dist/plugins/discovery/workspaces/detector.d.ts +21 -0
  264. package/dist/plugins/discovery/workspaces/detector.d.ts.map +1 -0
  265. package/dist/plugins/discovery/workspaces/detector.js +49 -0
  266. package/dist/plugins/discovery/workspaces/globResolver.d.ts +35 -0
  267. package/dist/plugins/discovery/workspaces/globResolver.d.ts.map +1 -0
  268. package/dist/plugins/discovery/workspaces/globResolver.js +184 -0
  269. package/dist/plugins/discovery/workspaces/index.d.ts +9 -0
  270. package/dist/plugins/discovery/workspaces/index.d.ts.map +1 -0
  271. package/dist/plugins/discovery/workspaces/index.js +8 -0
  272. package/dist/plugins/discovery/workspaces/parsers.d.ts +38 -0
  273. package/dist/plugins/discovery/workspaces/parsers.d.ts.map +1 -0
  274. package/dist/plugins/discovery/workspaces/parsers.js +80 -0
  275. package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -1
  276. package/dist/plugins/enrichment/AliasTracker.js +29 -8
  277. package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts +32 -0
  278. package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts.map +1 -0
  279. package/dist/plugins/enrichment/ArgumentParameterLinker.js +175 -0
  280. package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts +51 -0
  281. package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts.map +1 -0
  282. package/dist/plugins/enrichment/ClosureCaptureEnricher.js +205 -0
  283. package/dist/plugins/enrichment/ExternalCallResolver.d.ts +42 -0
  284. package/dist/plugins/enrichment/ExternalCallResolver.d.ts.map +1 -0
  285. package/dist/plugins/enrichment/ExternalCallResolver.js +213 -0
  286. package/dist/plugins/enrichment/FunctionCallResolver.d.ts +58 -0
  287. package/dist/plugins/enrichment/FunctionCallResolver.d.ts.map +1 -0
  288. package/dist/plugins/enrichment/FunctionCallResolver.js +340 -0
  289. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +16 -3
  290. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -1
  291. package/dist/plugins/enrichment/HTTPConnectionEnricher.js +78 -27
  292. package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -1
  293. package/dist/plugins/enrichment/ImportExportLinker.js +23 -6
  294. package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -1
  295. package/dist/plugins/enrichment/MethodCallResolver.js +33 -13
  296. package/dist/plugins/enrichment/MountPointResolver.d.ts +14 -12
  297. package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -1
  298. package/dist/plugins/enrichment/MountPointResolver.js +173 -147
  299. package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts +44 -0
  300. package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts.map +1 -0
  301. package/dist/plugins/enrichment/NodejsBuiltinsResolver.js +271 -0
  302. package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -1
  303. package/dist/plugins/enrichment/PrefixEvaluator.js +16 -7
  304. package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -1
  305. package/dist/plugins/enrichment/RustFFIEnricher.js +6 -5
  306. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +22 -27
  307. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -1
  308. package/dist/plugins/enrichment/ValueDomainAnalyzer.js +185 -143
  309. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -1
  310. package/dist/plugins/indexing/IncrementalModuleIndexer.js +23 -14
  311. package/dist/plugins/indexing/JSModuleIndexer.d.ts +15 -0
  312. package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -1
  313. package/dist/plugins/indexing/JSModuleIndexer.js +121 -31
  314. package/dist/plugins/indexing/RustModuleIndexer.d.ts +1 -1
  315. package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -1
  316. package/dist/plugins/indexing/RustModuleIndexer.js +8 -7
  317. package/dist/plugins/indexing/ServiceDetector.d.ts +10 -0
  318. package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -1
  319. package/dist/plugins/indexing/ServiceDetector.js +28 -15
  320. package/dist/plugins/validation/BrokenImportValidator.d.ts +31 -0
  321. package/dist/plugins/validation/BrokenImportValidator.d.ts.map +1 -0
  322. package/dist/plugins/validation/BrokenImportValidator.js +249 -0
  323. package/dist/plugins/validation/CallResolverValidator.d.ts +21 -10
  324. package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -1
  325. package/dist/plugins/validation/CallResolverValidator.js +103 -77
  326. package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -1
  327. package/dist/plugins/validation/DataFlowValidator.js +62 -49
  328. package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -1
  329. package/dist/plugins/validation/EvalBanValidator.js +17 -16
  330. package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -1
  331. package/dist/plugins/validation/GraphConnectivityValidator.js +44 -24
  332. package/dist/plugins/validation/NodeCreationValidator.d.ts +85 -0
  333. package/dist/plugins/validation/NodeCreationValidator.d.ts.map +1 -0
  334. package/dist/plugins/validation/NodeCreationValidator.js +415 -0
  335. package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -1
  336. package/dist/plugins/validation/SQLInjectionValidator.js +61 -19
  337. package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -1
  338. package/dist/plugins/validation/ShadowingDetector.js +6 -5
  339. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -1
  340. package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +12 -11
  341. package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -1
  342. package/dist/plugins/vcs/GitPlugin.js +10 -12
  343. package/dist/plugins/vcs/VCSPlugin.d.ts +3 -2
  344. package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -1
  345. package/dist/plugins/vcs/VCSPlugin.js +5 -5
  346. package/dist/queries/findCallsInFunction.d.ts +52 -0
  347. package/dist/queries/findCallsInFunction.d.ts.map +1 -0
  348. package/dist/queries/findCallsInFunction.js +135 -0
  349. package/dist/queries/findContainingFunction.d.ts +45 -0
  350. package/dist/queries/findContainingFunction.d.ts.map +1 -0
  351. package/dist/queries/findContainingFunction.js +54 -0
  352. package/dist/queries/index.d.ts +14 -0
  353. package/dist/queries/index.d.ts.map +1 -0
  354. package/dist/queries/index.js +11 -0
  355. package/dist/queries/traceValues.d.ts +70 -0
  356. package/dist/queries/traceValues.d.ts.map +1 -0
  357. package/dist/queries/traceValues.js +299 -0
  358. package/dist/queries/types.d.ts +163 -0
  359. package/dist/queries/types.d.ts.map +1 -0
  360. package/dist/queries/types.js +9 -0
  361. package/dist/schema/GraphSchemaExtractor.d.ts +53 -0
  362. package/dist/schema/GraphSchemaExtractor.d.ts.map +1 -0
  363. package/dist/schema/GraphSchemaExtractor.js +124 -0
  364. package/dist/schema/InterfaceSchemaExtractor.d.ts +73 -0
  365. package/dist/schema/InterfaceSchemaExtractor.d.ts.map +1 -0
  366. package/dist/schema/InterfaceSchemaExtractor.js +112 -0
  367. package/dist/schema/index.d.ts +5 -0
  368. package/dist/schema/index.d.ts.map +1 -0
  369. package/dist/schema/index.js +2 -0
  370. package/dist/storage/backends/RFDBServerBackend.d.ts +21 -34
  371. package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -1
  372. package/dist/storage/backends/RFDBServerBackend.js +72 -62
  373. package/dist/storage/backends/typeValidation.d.ts.map +1 -1
  374. package/dist/storage/backends/typeValidation.js +1 -0
  375. package/dist/validation/PathValidator.d.ts +1 -2
  376. package/dist/validation/PathValidator.d.ts.map +1 -1
  377. package/package.json +3 -3
  378. package/src/Orchestrator.ts +272 -27
  379. package/src/config/ConfigLoader.ts +354 -0
  380. package/src/config/index.ts +5 -0
  381. package/src/core/ASTWorker.ts +143 -139
  382. package/src/core/CoverageAnalyzer.ts +243 -0
  383. package/src/core/FileExplainer.ts +179 -0
  384. package/src/core/FileNodeManager.ts +100 -0
  385. package/src/core/GraphFreshnessChecker.ts +143 -0
  386. package/src/core/HashUtils.ts +48 -0
  387. package/src/core/IncrementalReanalyzer.ts +192 -0
  388. package/src/core/NodeFactory.ts +470 -23
  389. package/src/core/ScopeTracker.ts +154 -0
  390. package/src/core/SemanticId.ts +192 -0
  391. package/src/core/VersionManager.ts +3 -2
  392. package/src/core/nodes/ArgumentExpressionNode.ts +89 -0
  393. package/src/core/nodes/ArrayLiteralNode.ts +66 -0
  394. package/src/core/nodes/BranchNode.ts +113 -0
  395. package/src/core/nodes/CallSiteNode.ts +64 -4
  396. package/src/core/nodes/CaseNode.ts +123 -0
  397. package/src/core/nodes/ClassNode.ts +67 -4
  398. package/src/core/nodes/ConstantNode.ts +5 -4
  399. package/src/core/nodes/ConstructorCallNode.ts +217 -0
  400. package/src/core/nodes/DatabaseQueryNode.ts +5 -1
  401. package/src/core/nodes/DecoratorNode.ts +92 -0
  402. package/src/core/nodes/EnumNode.ts +87 -0
  403. package/src/core/nodes/EventListenerNode.ts +7 -4
  404. package/src/core/nodes/ExportNode.ts +74 -4
  405. package/src/core/nodes/ExpressionNode.ts +232 -0
  406. package/src/core/nodes/ExternalModuleNode.ts +65 -0
  407. package/src/core/nodes/ExternalStdioNode.ts +17 -9
  408. package/src/core/nodes/FunctionNode.ts +101 -1
  409. package/src/core/nodes/HttpRequestNode.ts +7 -4
  410. package/src/core/nodes/ImportNode.ts +62 -13
  411. package/src/core/nodes/InterfaceNode.ts +92 -0
  412. package/src/core/nodes/IssueNode.ts +177 -0
  413. package/src/core/nodes/LiteralNode.ts +5 -4
  414. package/src/core/nodes/MethodCallNode.ts +70 -4
  415. package/src/core/nodes/MethodNode.ts +68 -3
  416. package/src/core/nodes/ModuleNode.ts +50 -0
  417. package/src/core/nodes/NetworkRequestNode.ts +77 -0
  418. package/src/core/nodes/ObjectLiteralNode.ts +66 -0
  419. package/src/core/nodes/ParameterNode.ts +4 -3
  420. package/src/core/nodes/ScopeNode.ts +65 -0
  421. package/src/core/nodes/TypeNode.ts +79 -0
  422. package/src/core/nodes/VariableDeclarationNode.ts +58 -4
  423. package/src/core/nodes/index.ts +21 -1
  424. package/src/data/builtins/BuiltinRegistry.ts +124 -0
  425. package/src/data/builtins/definitions.ts +267 -0
  426. package/src/data/builtins/index.ts +10 -0
  427. package/src/data/builtins/jsGlobals.ts +28 -0
  428. package/src/data/builtins/types.ts +36 -0
  429. package/src/data/globals/definitions.ts +156 -0
  430. package/src/data/globals/index.ts +66 -0
  431. package/src/diagnostics/DiagnosticCollector.ts +163 -0
  432. package/src/diagnostics/DiagnosticReporter.ts +324 -0
  433. package/src/diagnostics/DiagnosticWriter.ts +50 -0
  434. package/src/diagnostics/index.ts +16 -0
  435. package/src/errors/GrafemaError.ts +239 -0
  436. package/src/index.ts +193 -1
  437. package/src/logging/Logger.ts +152 -0
  438. package/src/plugins/Plugin.ts +42 -0
  439. package/src/plugins/analysis/DatabaseAnalyzer.ts +16 -8
  440. package/src/plugins/analysis/ExpressAnalyzer.ts +33 -19
  441. package/src/plugins/analysis/ExpressResponseAnalyzer.ts +636 -0
  442. package/src/plugins/analysis/ExpressRouteAnalyzer.ts +76 -36
  443. package/src/plugins/analysis/FetchAnalyzer.ts +232 -21
  444. package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +84 -101
  445. package/src/plugins/analysis/JSASTAnalyzer.ts +4265 -587
  446. package/src/plugins/analysis/ReactAnalyzer.ts +57 -57
  447. package/src/plugins/analysis/RustAnalyzer.ts +16 -11
  448. package/src/plugins/analysis/SQLiteAnalyzer.ts +13 -7
  449. package/src/plugins/analysis/ServiceLayerAnalyzer.ts +22 -16
  450. package/src/plugins/analysis/SocketIOAnalyzer.ts +151 -28
  451. package/src/plugins/analysis/SystemDbAnalyzer.ts +16 -11
  452. package/src/plugins/analysis/ast/GraphBuilder.ts +1947 -327
  453. package/src/plugins/analysis/ast/IdGenerator.ts +177 -0
  454. package/src/plugins/analysis/ast/types.ts +596 -6
  455. package/src/plugins/analysis/ast/utils/createParameterNodes.ts +104 -0
  456. package/src/plugins/analysis/ast/utils/index.ts +12 -0
  457. package/src/plugins/analysis/ast/utils/location.ts +103 -0
  458. package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +19 -8
  459. package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +924 -83
  460. package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +97 -44
  461. package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +234 -93
  462. package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +124 -9
  463. package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +41 -14
  464. package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +294 -49
  465. package/src/plugins/discovery/MonorepoServiceDiscovery.ts +3 -2
  466. package/src/plugins/discovery/SimpleProjectDiscovery.ts +6 -1
  467. package/src/plugins/discovery/WorkspaceDiscovery.ts +184 -0
  468. package/src/plugins/discovery/resolveSourceEntrypoint.ts +103 -0
  469. package/src/plugins/discovery/workspaces/detector.ts +63 -0
  470. package/src/plugins/discovery/workspaces/globResolver.ts +229 -0
  471. package/src/plugins/discovery/workspaces/index.ts +23 -0
  472. package/src/plugins/discovery/workspaces/parsers.ts +99 -0
  473. package/src/plugins/enrichment/AliasTracker.ts +35 -8
  474. package/src/plugins/enrichment/ArgumentParameterLinker.ts +240 -0
  475. package/src/plugins/enrichment/ClosureCaptureEnricher.ts +267 -0
  476. package/src/plugins/enrichment/ExternalCallResolver.ts +262 -0
  477. package/src/plugins/enrichment/FunctionCallResolver.ts +456 -0
  478. package/src/plugins/enrichment/HTTPConnectionEnricher.ts +84 -27
  479. package/src/plugins/enrichment/ImportExportLinker.ts +24 -6
  480. package/src/plugins/enrichment/MethodCallResolver.ts +39 -13
  481. package/src/plugins/enrichment/MountPointResolver.ts +208 -195
  482. package/src/plugins/enrichment/NodejsBuiltinsResolver.ts +365 -0
  483. package/src/plugins/enrichment/PrefixEvaluator.ts +16 -7
  484. package/src/plugins/enrichment/RustFFIEnricher.ts +6 -5
  485. package/src/plugins/enrichment/ValueDomainAnalyzer.ts +209 -189
  486. package/src/plugins/indexing/IncrementalModuleIndexer.ts +23 -14
  487. package/src/plugins/indexing/JSModuleIndexer.ts +140 -34
  488. package/src/plugins/indexing/RustModuleIndexer.ts +8 -7
  489. package/src/plugins/validation/BrokenImportValidator.ts +325 -0
  490. package/src/plugins/validation/CallResolverValidator.ts +131 -110
  491. package/src/plugins/validation/DataFlowValidator.ts +88 -67
  492. package/src/plugins/validation/EvalBanValidator.ts +17 -16
  493. package/src/plugins/validation/GraphConnectivityValidator.ts +58 -24
  494. package/src/plugins/validation/NodeCreationValidator.ts +554 -0
  495. package/src/plugins/validation/SQLInjectionValidator.ts +63 -20
  496. package/src/plugins/validation/ShadowingDetector.ts +6 -5
  497. package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +12 -11
  498. package/src/plugins/vcs/GitPlugin.ts +40 -12
  499. package/src/plugins/vcs/VCSPlugin.ts +7 -5
  500. package/src/queries/README.md +46 -0
  501. package/src/queries/findCallsInFunction.ts +206 -0
  502. package/src/queries/findContainingFunction.ts +83 -0
  503. package/src/queries/index.ts +23 -0
  504. package/src/queries/traceValues.ts +398 -0
  505. package/src/queries/types.ts +187 -0
  506. package/src/schema/GraphSchemaExtractor.ts +177 -0
  507. package/src/schema/InterfaceSchemaExtractor.ts +173 -0
  508. package/src/schema/index.ts +5 -0
  509. package/src/storage/backends/RFDBServerBackend.ts +100 -98
  510. package/src/storage/backends/typeValidation.ts +1 -0
  511. package/src/validation/PathValidator.ts +1 -1
  512. package/dist/core/AnalysisWorker.d.ts +0 -14
  513. package/dist/core/AnalysisWorker.d.ts.map +0 -1
  514. package/dist/core/AnalysisWorker.js +0 -307
  515. package/dist/core/ParallelAnalyzer.d.ts +0 -120
  516. package/dist/core/ParallelAnalyzer.d.ts.map +0 -1
  517. package/dist/core/ParallelAnalyzer.js +0 -331
  518. package/dist/core/QueueWorker.d.ts +0 -12
  519. package/dist/core/QueueWorker.d.ts.map +0 -1
  520. package/dist/core/QueueWorker.js +0 -567
  521. package/dist/core/RFDBClient.d.ts +0 -179
  522. package/dist/core/RFDBClient.d.ts.map +0 -1
  523. package/dist/core/RFDBClient.js +0 -429
  524. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +0 -19
  525. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +0 -1
  526. package/dist/plugins/discovery/ZonServiceDiscovery.js +0 -204
  527. package/src/core/AnalysisWorker.ts +0 -410
  528. package/src/core/ParallelAnalyzer.ts +0 -476
  529. package/src/core/QueueWorker.ts +0 -780
  530. package/src/plugins/indexing/ServiceDetector.ts +0 -230
@@ -0,0 +1,177 @@
1
+ /**
2
+ * GraphSchemaExtractor - Extracts graph node/edge type schemas
3
+ *
4
+ * Usage:
5
+ * const extractor = new GraphSchemaExtractor(backend);
6
+ * const schema = await extractor.extract();
7
+ *
8
+ * When to use:
9
+ * - Export graph schema for contract tracking
10
+ * - Track node/edge type changes via checksum
11
+ * - Generate graph documentation
12
+ */
13
+
14
+ import { createHash } from 'crypto';
15
+ import { NODE_TYPE, NAMESPACED_TYPE, EDGE_TYPE } from '@grafema/types';
16
+ import type { RFDBServerBackend } from '../storage/backends/RFDBServerBackend.js';
17
+
18
+ // ============================================================================
19
+ // Types
20
+ // ============================================================================
21
+
22
+ export interface NodeTypeSchema {
23
+ category: 'base' | 'namespaced';
24
+ namespace?: string;
25
+ count: number;
26
+ }
27
+
28
+ export interface EdgeTypeSchema {
29
+ count: number;
30
+ }
31
+
32
+ export interface GraphSchema {
33
+ $schema: 'grafema-graph-v1';
34
+ extractedAt: string;
35
+ nodeTypes: Record<string, NodeTypeSchema>;
36
+ edgeTypes: Record<string, EdgeTypeSchema>;
37
+ statistics: {
38
+ totalNodes: number;
39
+ totalEdges: number;
40
+ nodeTypeCount: number;
41
+ edgeTypeCount: number;
42
+ };
43
+ checksum: string;
44
+ }
45
+
46
+ // ============================================================================
47
+ // Extractor
48
+ // ============================================================================
49
+
50
+ export interface GraphExtractOptions {
51
+ /** Include all defined types, not just used ones (default: false) */
52
+ includeAll?: boolean;
53
+ }
54
+
55
+ export class GraphSchemaExtractor {
56
+ constructor(private backend: RFDBServerBackend) {}
57
+
58
+ /**
59
+ * Extract graph schema from current database
60
+ *
61
+ * @param options.includeAll - If true, include all defined types even with count=0
62
+ */
63
+ async extract(options?: GraphExtractOptions): Promise<GraphSchema> {
64
+ const includeAll = options?.includeAll ?? false;
65
+ // Get actual counts from graph
66
+ const nodeCounts = await this.backend.countNodesByType();
67
+ const edgeCounts = await this.backend.countEdgesByType();
68
+
69
+ // Build node types from definitions + counts
70
+ const nodeTypes: Record<string, NodeTypeSchema> = {};
71
+
72
+ // Base node types
73
+ for (const [_key, value] of Object.entries(NODE_TYPE)) {
74
+ nodeTypes[value] = {
75
+ category: 'base',
76
+ count: nodeCounts[value] || 0,
77
+ };
78
+ }
79
+
80
+ // Namespaced node types
81
+ for (const [_key, value] of Object.entries(NAMESPACED_TYPE)) {
82
+ const namespace = value.split(':')[0];
83
+ nodeTypes[value] = {
84
+ category: 'namespaced',
85
+ namespace,
86
+ count: nodeCounts[value] || 0,
87
+ };
88
+ }
89
+
90
+ // Add any additional types found in the graph but not in definitions
91
+ for (const [type, count] of Object.entries(nodeCounts)) {
92
+ if (!nodeTypes[type]) {
93
+ const namespace = type.includes(':') ? type.split(':')[0] : undefined;
94
+ nodeTypes[type] = {
95
+ category: namespace ? 'namespaced' : 'base',
96
+ namespace,
97
+ count,
98
+ };
99
+ }
100
+ }
101
+
102
+ // Build edge types from definitions + counts
103
+ const edgeTypes: Record<string, EdgeTypeSchema> = {};
104
+
105
+ for (const [_key, value] of Object.entries(EDGE_TYPE)) {
106
+ edgeTypes[value] = {
107
+ count: edgeCounts[value] || 0,
108
+ };
109
+ }
110
+
111
+ // Add any additional edge types found in the graph
112
+ for (const [type, count] of Object.entries(edgeCounts)) {
113
+ if (!edgeTypes[type]) {
114
+ edgeTypes[type] = { count };
115
+ }
116
+ }
117
+
118
+ // Calculate totals
119
+ const totalNodes = Object.values(nodeCounts).reduce((sum, n) => sum + n, 0);
120
+ const totalEdges = Object.values(edgeCounts).reduce((sum, n) => sum + n, 0);
121
+
122
+ // Filter out types with count=0 unless includeAll is true
123
+ const filteredNodeTypes: Record<string, NodeTypeSchema> = {};
124
+ for (const [type, info] of Object.entries(nodeTypes)) {
125
+ if (includeAll || info.count > 0) {
126
+ filteredNodeTypes[type] = info;
127
+ }
128
+ }
129
+
130
+ const filteredEdgeTypes: Record<string, EdgeTypeSchema> = {};
131
+ for (const [type, info] of Object.entries(edgeTypes)) {
132
+ if (includeAll || info.count > 0) {
133
+ filteredEdgeTypes[type] = info;
134
+ }
135
+ }
136
+
137
+ // Sort for deterministic output
138
+ const sortedNodeTypes = this.sortObject(filteredNodeTypes);
139
+ const sortedEdgeTypes = this.sortObject(filteredEdgeTypes);
140
+
141
+ // Compute checksum from normalized content (based on filtered types)
142
+ const checksumContent = {
143
+ nodeTypes: Object.keys(sortedNodeTypes).sort(),
144
+ edgeTypes: Object.keys(sortedEdgeTypes).sort(),
145
+ };
146
+
147
+ const checksum = createHash('sha256')
148
+ .update(JSON.stringify(checksumContent))
149
+ .digest('hex');
150
+
151
+ return {
152
+ $schema: 'grafema-graph-v1',
153
+ extractedAt: new Date().toISOString(),
154
+ nodeTypes: sortedNodeTypes,
155
+ edgeTypes: sortedEdgeTypes,
156
+ statistics: {
157
+ totalNodes,
158
+ totalEdges,
159
+ nodeTypeCount: Object.keys(sortedNodeTypes).length,
160
+ edgeTypeCount: Object.keys(sortedEdgeTypes).length,
161
+ },
162
+ checksum: `sha256:${checksum}`,
163
+ };
164
+ }
165
+
166
+ /**
167
+ * Sort object keys alphabetically for deterministic output
168
+ */
169
+ private sortObject<T>(obj: Record<string, T>): Record<string, T> {
170
+ const sorted: Record<string, T> = {};
171
+ const keys = Object.keys(obj).sort();
172
+ for (const key of keys) {
173
+ sorted[key] = obj[key];
174
+ }
175
+ return sorted;
176
+ }
177
+ }
@@ -0,0 +1,173 @@
1
+ /**
2
+ * InterfaceSchemaExtractor - Extracts interface schemas from graph
3
+ *
4
+ * Usage:
5
+ * const extractor = new InterfaceSchemaExtractor(backend);
6
+ * const schema = await extractor.extract('ConfigSchema');
7
+ *
8
+ * When to use:
9
+ * - Export interface contracts for documentation
10
+ * - Track interface changes via checksum
11
+ * - Generate API documentation from graph
12
+ */
13
+
14
+ import { createHash } from 'crypto';
15
+ import type { RFDBServerBackend } from '../storage/backends/RFDBServerBackend.js';
16
+
17
+ // ============================================================================
18
+ // Types
19
+ // ============================================================================
20
+
21
+ export interface PropertySchema {
22
+ type: string;
23
+ required: boolean;
24
+ readonly: boolean;
25
+ }
26
+
27
+ export interface InterfaceSchema {
28
+ $schema: 'grafema-interface-v1';
29
+ name: string;
30
+ source: {
31
+ file: string;
32
+ line: number;
33
+ column: number;
34
+ };
35
+ typeParameters?: string[];
36
+ properties: Record<string, PropertySchema>;
37
+ extends: string[];
38
+ checksum: string;
39
+ }
40
+
41
+ export interface ExtractOptions {
42
+ /** Specific file path if multiple interfaces have same name */
43
+ file?: string;
44
+ }
45
+
46
+ export interface InterfaceNodeRecord {
47
+ id: string;
48
+ type: 'INTERFACE';
49
+ name: string;
50
+ file: string;
51
+ line: number;
52
+ column: number;
53
+ extends: string[];
54
+ properties: Array<{
55
+ name: string;
56
+ type?: string;
57
+ optional?: boolean;
58
+ readonly?: boolean;
59
+ }>;
60
+ typeParameters?: string[];
61
+ }
62
+
63
+ // ============================================================================
64
+ // Extractor
65
+ // ============================================================================
66
+
67
+ export class InterfaceSchemaExtractor {
68
+ constructor(private backend: RFDBServerBackend) {}
69
+
70
+ /**
71
+ * Extract schema for interface by name
72
+ *
73
+ * @param interfaceName - Name of the interface (e.g., 'ConfigSchema')
74
+ * @param options - Optional filters
75
+ * @returns InterfaceSchema or null if not found
76
+ * @throws Error if multiple interfaces match and no file specified
77
+ */
78
+ async extract(interfaceName: string, options?: ExtractOptions): Promise<InterfaceSchema | null> {
79
+ const interfaces = await this.findInterfaces(interfaceName);
80
+
81
+ if (interfaces.length === 0) {
82
+ return null;
83
+ }
84
+
85
+ // Filter by file if specified
86
+ let match: InterfaceNodeRecord;
87
+ if (options?.file) {
88
+ const fileFilter = options.file;
89
+ const filtered = interfaces.filter(i => i.file === fileFilter || i.file.endsWith(fileFilter));
90
+ if (filtered.length === 0) {
91
+ return null;
92
+ }
93
+ match = filtered[0];
94
+ } else if (interfaces.length > 1) {
95
+ const locations = interfaces.map(i => ` - ${i.file}:${i.line}`).join('\n');
96
+ throw new Error(
97
+ `Multiple interfaces named "${interfaceName}" found:\n${locations}\n` +
98
+ `Use --file option to specify which one.`
99
+ );
100
+ } else {
101
+ match = interfaces[0];
102
+ }
103
+
104
+ return this.buildSchema(match);
105
+ }
106
+
107
+ /**
108
+ * Find all interfaces with given name
109
+ */
110
+ async findInterfaces(name: string): Promise<InterfaceNodeRecord[]> {
111
+ const result: InterfaceNodeRecord[] = [];
112
+
113
+ for await (const node of this.backend.queryNodes({ nodeType: 'INTERFACE' })) {
114
+ if (node.name === name) {
115
+ result.push(node as unknown as InterfaceNodeRecord);
116
+ }
117
+ }
118
+
119
+ return result;
120
+ }
121
+
122
+ /**
123
+ * Build InterfaceSchema from node record
124
+ */
125
+ private buildSchema(node: InterfaceNodeRecord): InterfaceSchema {
126
+ // Sort properties alphabetically for deterministic output
127
+ const sortedProperties = [...(node.properties || [])].sort((a, b) =>
128
+ a.name.localeCompare(b.name)
129
+ );
130
+
131
+ const properties: Record<string, PropertySchema> = {};
132
+ for (const prop of sortedProperties) {
133
+ properties[prop.name] = {
134
+ type: prop.type || 'unknown',
135
+ required: !prop.optional,
136
+ readonly: prop.readonly || false
137
+ };
138
+ }
139
+
140
+ // Compute checksum from normalized content
141
+ const checksumContent = {
142
+ name: node.name,
143
+ properties: sortedProperties.map(p => ({
144
+ name: p.name,
145
+ type: p.type,
146
+ optional: p.optional,
147
+ readonly: p.readonly
148
+ })),
149
+ extends: [...(node.extends || [])].sort(),
150
+ typeParameters: node.typeParameters
151
+ };
152
+
153
+ const checksum = createHash('sha256')
154
+ .update(JSON.stringify(checksumContent))
155
+ .digest('hex');
156
+
157
+ return {
158
+ $schema: 'grafema-interface-v1',
159
+ name: node.name,
160
+ source: {
161
+ file: node.file,
162
+ line: node.line,
163
+ column: node.column
164
+ },
165
+ ...(node.typeParameters && node.typeParameters.length > 0 && {
166
+ typeParameters: node.typeParameters
167
+ }),
168
+ properties,
169
+ extends: node.extends || [],
170
+ checksum: `sha256:${checksum}`
171
+ };
172
+ }
173
+ }
@@ -0,0 +1,5 @@
1
+ export { InterfaceSchemaExtractor } from './InterfaceSchemaExtractor.js';
2
+ export type { InterfaceSchema, PropertySchema, ExtractOptions } from './InterfaceSchemaExtractor.js';
3
+
4
+ export { GraphSchemaExtractor } from './GraphSchemaExtractor.js';
5
+ export type { GraphSchema, NodeTypeSchema, EdgeTypeSchema, GraphExtractOptions } from './GraphSchemaExtractor.js';
@@ -23,10 +23,12 @@ import { existsSync, unlinkSync } from 'fs';
23
23
  import { spawn, type ChildProcess } from 'child_process';
24
24
  import { join, dirname } from 'path';
25
25
  import { fileURLToPath } from 'url';
26
+ import { createRequire } from 'module';
26
27
  import { setTimeout as sleep } from 'timers/promises';
27
28
 
28
29
  import type { WireNode, WireEdge } from '@grafema/types';
29
30
  import type { NodeType, EdgeType } from '@grafema/types';
31
+ import type { BaseNodeRecord, EdgeRecord } from '@grafema/types';
30
32
  import type { AttrQuery, GraphStats, GraphExport } from '../../core/GraphBackend.js';
31
33
 
32
34
  const __filename = fileURLToPath(import.meta.url);
@@ -40,30 +42,6 @@ export interface RFDBServerBackendOptions {
40
42
  dbPath?: string;
41
43
  }
42
44
 
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
- /**
57
- * Edge as returned from the backend
58
- */
59
- export interface BackendEdge {
60
- src: string;
61
- dst: string;
62
- type: string;
63
- edgeType: string;
64
- [key: string]: unknown;
65
- }
66
-
67
45
  /**
68
46
  * Input node format (flexible)
69
47
  */
@@ -176,13 +154,29 @@ export class RFDBServerBackend {
176
154
 
177
155
  /**
178
156
  * Find RFDB server binary in order of preference:
179
- * 1. @grafema/rfdb npm package
180
- * 2. rust-engine/target/release (monorepo development)
181
- * 3. rust-engine/target/debug
157
+ * 1. packages/rfdb-server/target/release (monorepo development - prioritized for dev)
158
+ * 2. packages/rfdb-server/target/debug
159
+ * 3. @grafema/rfdb npm package (fallback for production)
182
160
  */
183
161
  private _findServerBinary(): string | null {
184
- // 1. Check @grafema/rfdb npm package
162
+ // 1. Check packages/rfdb-server in monorepo (prioritized for development)
163
+ const projectRoot = join(__dirname, '../../../../..');
164
+ const releaseBinary = join(projectRoot, 'packages/rfdb-server/target/release/rfdb-server');
165
+ if (existsSync(releaseBinary)) {
166
+ console.log(`[RFDBServerBackend] Found release binary: ${releaseBinary}`);
167
+ return releaseBinary;
168
+ }
169
+
170
+ // 2. Check debug build
171
+ const debugBinary = join(projectRoot, 'packages/rfdb-server/target/debug/rfdb-server');
172
+ if (existsSync(debugBinary)) {
173
+ console.log(`[RFDBServerBackend] Found debug binary: ${debugBinary}`);
174
+ return debugBinary;
175
+ }
176
+
177
+ // 3. Check @grafema/rfdb npm package (fallback)
185
178
  try {
179
+ const require = createRequire(import.meta.url);
186
180
  const rfdbPkg = require.resolve('@grafema/rfdb');
187
181
  const rfdbDir = dirname(rfdbPkg);
188
182
  const platform = process.platform;
@@ -206,21 +200,6 @@ export class RFDBServerBackend {
206
200
  // @grafema/rfdb not installed
207
201
  }
208
202
 
209
- // 2. Check rust-engine in monorepo
210
- const projectRoot = join(__dirname, '../../../../..');
211
- const releaseBinary = join(projectRoot, 'rust-engine/target/release/rfdb-server');
212
- if (existsSync(releaseBinary)) {
213
- console.log(`[RFDBServerBackend] Found release binary: ${releaseBinary}`);
214
- return releaseBinary;
215
- }
216
-
217
- // 3. Check debug build
218
- const debugBinary = join(projectRoot, 'rust-engine/target/debug/rfdb-server');
219
- if (existsSync(debugBinary)) {
220
- console.log(`[RFDBServerBackend] Found debug binary: ${debugBinary}`);
221
- return debugBinary;
222
- }
223
-
224
203
  return null;
225
204
  }
226
205
 
@@ -283,20 +262,26 @@ export class RFDBServerBackend {
283
262
  }
284
263
 
285
264
  /**
286
- * Close connection and stop server if we started it
265
+ * Close client connection. Server continues running to serve other clients.
287
266
  */
288
267
  async close(): Promise<void> {
268
+ // Request server flush before disconnecting
289
269
  if (this.client) {
270
+ try {
271
+ await this.client.flush();
272
+ } catch {
273
+ // Ignore flush errors on close - best effort
274
+ }
290
275
  await this.client.close();
291
276
  this.client = null;
292
277
  }
293
278
  this.connected = false;
294
279
 
295
- // Kill server process if we started it
296
- if (this.serverProcess) {
297
- this.serverProcess.kill('SIGTERM');
298
- this.serverProcess = null;
299
- }
280
+ // NOTE: We intentionally do NOT kill the server process.
281
+ // The server continues running to serve other clients (MCP, other CLI invocations).
282
+ // This is by design for multi-client architecture.
283
+ // Server lifecycle is managed separately (system process, or manual grafema server stop).
284
+ this.serverProcess = null;
300
285
  }
301
286
 
302
287
  /**
@@ -371,14 +356,22 @@ export class RFDBServerBackend {
371
356
  }
372
357
 
373
358
  const wireEdges: WireEdge[] = edges.map(e => {
374
- const { src, dst, type, edgeType, edge_type, etype, ...rest } = e;
359
+ const { src, dst, type, edgeType, edge_type, etype, metadata, ...rest } = e;
360
+
361
+ // Flatten metadata: spread both edge-level properties and nested metadata
362
+ const flatMetadata = {
363
+ _origSrc: String(src),
364
+ _origDst: String(dst),
365
+ ...rest,
366
+ ...(typeof metadata === 'object' && metadata !== null ? metadata : {})
367
+ };
375
368
 
376
369
  return {
377
370
  src: String(src),
378
371
  dst: String(dst),
379
372
  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 }),
373
+ // Store flattened metadata for retrieval
374
+ metadata: JSON.stringify(flatMetadata),
382
375
  };
383
376
  });
384
377
 
@@ -388,7 +381,7 @@ export class RFDBServerBackend {
388
381
  /**
389
382
  * Get a node by ID
390
383
  */
391
- async getNode(id: string): Promise<BackendNode | null> {
384
+ async getNode(id: string): Promise<BaseNodeRecord | null> {
392
385
  if (!this.client) throw new Error('Not connected');
393
386
  const node = await this.client.getNode(String(id));
394
387
  if (!node) return null;
@@ -423,7 +416,7 @@ export class RFDBServerBackend {
423
416
  /**
424
417
  * Parse a node from wire format to JS format
425
418
  */
426
- private _parseNode(wireNode: WireNode): BackendNode {
419
+ private _parseNode(wireNode: WireNode): BaseNodeRecord {
427
420
  const metadata: Record<string, unknown> = wireNode.metadata ? JSON.parse(wireNode.metadata) : {};
428
421
 
429
422
  // Parse nested JSON strings
@@ -439,21 +432,48 @@ export class RFDBServerBackend {
439
432
 
440
433
  const humanId = (metadata.originalId as string) || wireNode.id;
441
434
 
435
+ // Exclude standard fields from metadata to prevent overwriting wireNode values
436
+ // REG-325: Metadata spread was overwriting name with LITERAL node data
437
+ const {
438
+ id: _id,
439
+ type: _type,
440
+ name: _name,
441
+ file: _file,
442
+ exported: _exported,
443
+ nodeType: _nodeType,
444
+ originalId: _originalId, // Already extracted above
445
+ ...safeMetadata
446
+ } = metadata;
447
+
442
448
  return {
443
449
  id: humanId,
444
- nodeType: wireNode.nodeType,
445
450
  type: wireNode.nodeType,
446
451
  name: wireNode.name,
447
452
  file: wireNode.file,
448
453
  exported: wireNode.exported,
449
- ...metadata,
454
+ ...safeMetadata,
455
+ };
456
+ }
457
+
458
+ /**
459
+ * Parse an edge from wire format to EdgeRecord
460
+ */
461
+ private _parseEdge(wireEdge: WireEdge): EdgeRecord {
462
+ const meta: Record<string, unknown> = wireEdge.metadata ? JSON.parse(wireEdge.metadata) : {};
463
+ // Use original string IDs if stored, otherwise use wire IDs
464
+ const { _origSrc, _origDst, ...rest } = meta;
465
+ return {
466
+ src: (_origSrc as string) || wireEdge.src,
467
+ dst: (_origDst as string) || wireEdge.dst,
468
+ type: wireEdge.edgeType,
469
+ metadata: Object.keys(rest).length > 0 ? rest : undefined,
450
470
  };
451
471
  }
452
472
 
453
473
  /**
454
474
  * Async generator for querying nodes
455
475
  */
456
- async *queryNodes(query: NodeQuery): AsyncGenerator<BackendNode, void, unknown> {
476
+ async *queryNodes(query: NodeQuery): AsyncGenerator<BaseNodeRecord, void, unknown> {
457
477
  if (!this.client) throw new Error('Not connected');
458
478
 
459
479
  // Build query for server
@@ -482,8 +502,8 @@ export class RFDBServerBackend {
482
502
  /**
483
503
  * Get ALL nodes matching query (collects from queryNodes into array)
484
504
  */
485
- async getAllNodes(query: NodeQuery = {}): Promise<BackendNode[]> {
486
- const nodes: BackendNode[] = [];
505
+ async getAllNodes(query: NodeQuery = {}): Promise<BaseNodeRecord[]> {
506
+ const nodes: BaseNodeRecord[] = [];
487
507
  for await (const node of this.queryNodes(query)) {
488
508
  nodes.push(node);
489
509
  }
@@ -505,66 +525,35 @@ export class RFDBServerBackend {
505
525
  /**
506
526
  * Get all edges
507
527
  */
508
- async getAllEdges(): Promise<BackendEdge[]> {
528
+ async getAllEdges(): Promise<EdgeRecord[]> {
509
529
  return this.getAllEdgesAsync();
510
530
  }
511
531
 
512
532
  /**
513
533
  * Get all edges (async version)
514
534
  */
515
- async getAllEdgesAsync(): Promise<BackendEdge[]> {
535
+ async getAllEdgesAsync(): Promise<EdgeRecord[]> {
516
536
  if (!this.client) throw new Error('Not connected');
517
537
  const edges = await this.client.getAllEdges();
518
- return edges.map(e => {
519
- const meta = JSON.parse(e.metadata || '{}');
520
- // Use original string IDs if stored, otherwise use numeric IDs
521
- const { _origSrc, _origDst, ...rest } = meta;
522
- return {
523
- src: _origSrc || e.src,
524
- dst: _origDst || e.dst,
525
- type: e.edgeType,
526
- edgeType: e.edgeType,
527
- ...rest,
528
- };
529
- });
538
+ return edges.map(e => this._parseEdge(e));
530
539
  }
531
540
 
532
541
  /**
533
542
  * Get outgoing edges from a node
534
543
  */
535
- async getOutgoingEdges(nodeId: string, edgeTypes: EdgeType[] | null = null): Promise<BackendEdge[]> {
544
+ async getOutgoingEdges(nodeId: string, edgeTypes: EdgeType[] | null = null): Promise<EdgeRecord[]> {
536
545
  if (!this.client) throw new Error('Not connected');
537
546
  const edges = await this.client.getOutgoingEdges(nodeId, edgeTypes || undefined);
538
- return edges.map(e => {
539
- const meta = JSON.parse(e.metadata || '{}');
540
- const { _origSrc, _origDst, ...rest } = meta;
541
- return {
542
- src: _origSrc || e.src,
543
- dst: _origDst || e.dst,
544
- type: e.edgeType,
545
- edgeType: e.edgeType,
546
- ...rest,
547
- };
548
- });
547
+ return edges.map(e => this._parseEdge(e));
549
548
  }
550
549
 
551
550
  /**
552
551
  * Get incoming edges to a node
553
552
  */
554
- async getIncomingEdges(nodeId: string, edgeTypes: EdgeType[] | null = null): Promise<BackendEdge[]> {
553
+ async getIncomingEdges(nodeId: string, edgeTypes: EdgeType[] | null = null): Promise<EdgeRecord[]> {
555
554
  if (!this.client) throw new Error('Not connected');
556
555
  const edges = await this.client.getIncomingEdges(nodeId, edgeTypes || undefined);
557
- return edges.map(e => {
558
- const meta = JSON.parse(e.metadata || '{}');
559
- const { _origSrc, _origDst, ...rest } = meta;
560
- return {
561
- src: _origSrc || e.src,
562
- dst: _origDst || e.dst,
563
- type: e.edgeType,
564
- edgeType: e.edgeType,
565
- ...rest,
566
- };
567
- });
556
+ return edges.map(e => this._parseEdge(e));
568
557
  }
569
558
 
570
559
  // ===========================================================================
@@ -587,6 +576,19 @@ export class RFDBServerBackend {
587
576
  return this.client.dfs(startIds, maxDepth, edgeTypes);
588
577
  }
589
578
 
579
+ /**
580
+ * Reachability query - find all nodes reachable from start nodes
581
+ */
582
+ async reachability(
583
+ startIds: string[],
584
+ maxDepth: number,
585
+ edgeTypes: EdgeType[] = [],
586
+ backward: boolean = false
587
+ ): Promise<string[]> {
588
+ if (!this.client) throw new Error('Not connected');
589
+ return this.client.reachability(startIds, maxDepth, edgeTypes, backward);
590
+ }
591
+
590
592
  // ===========================================================================
591
593
  // Statistics
592
594
  // ===========================================================================
@@ -713,7 +715,7 @@ export class RFDBServerBackend {
713
715
  /**
714
716
  * Find nodes by predicate (for compatibility)
715
717
  */
716
- async findNodes(predicate: (node: BackendNode) => boolean): Promise<BackendNode[]> {
718
+ async findNodes(predicate: (node: BaseNodeRecord) => boolean): Promise<BaseNodeRecord[]> {
717
719
  const allNodes = await this.getAllNodes();
718
720
  return allNodes.filter(predicate);
719
721
  }
@@ -45,6 +45,7 @@ const KNOWN_EDGE_TYPES = new Set<string>([
45
45
  'INTERACTS_WITH', 'CALLS_API', 'LISTENS_TO', 'JOINS_ROOM', 'EMITS_EVENT',
46
46
  'RETURNS', 'RECEIVES_ARGUMENT', 'READS_FROM', 'THROWS', 'REGISTERS_VIEW',
47
47
  'GOVERNS', 'VIOLATES', 'HAS_PARAMETER', 'DERIVES_FROM',
48
+ 'RESOLVES_TO', // Promise resolve() data flow
48
49
  ]);
49
50
 
50
51
  // Store initial edge types for reset