@grafema/core 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +76 -0
  3. package/dist/Orchestrator.d.ts +142 -0
  4. package/dist/Orchestrator.d.ts.map +1 -0
  5. package/dist/Orchestrator.js +481 -0
  6. package/dist/api/GraphAPI.d.ts +87 -0
  7. package/dist/api/GraphAPI.d.ts.map +1 -0
  8. package/dist/api/GraphAPI.js +210 -0
  9. package/dist/api/GuaranteeAPI.d.ts +147 -0
  10. package/dist/api/GuaranteeAPI.d.ts.map +1 -0
  11. package/dist/api/GuaranteeAPI.js +288 -0
  12. package/dist/core/ASTWorker.d.ts +133 -0
  13. package/dist/core/ASTWorker.d.ts.map +1 -0
  14. package/dist/core/ASTWorker.js +352 -0
  15. package/dist/core/ASTWorkerPool.d.ts +85 -0
  16. package/dist/core/ASTWorkerPool.d.ts.map +1 -0
  17. package/dist/core/ASTWorkerPool.js +207 -0
  18. package/dist/core/AnalysisQueue.d.ts +104 -0
  19. package/dist/core/AnalysisQueue.d.ts.map +1 -0
  20. package/dist/core/AnalysisQueue.js +299 -0
  21. package/dist/core/AnalysisWorker.d.ts +14 -0
  22. package/dist/core/AnalysisWorker.d.ts.map +1 -0
  23. package/dist/core/AnalysisWorker.js +307 -0
  24. package/dist/core/GraphBackend.d.ts +156 -0
  25. package/dist/core/GraphBackend.d.ts.map +1 -0
  26. package/dist/core/GraphBackend.js +85 -0
  27. package/dist/core/GuaranteeManager.d.ts +230 -0
  28. package/dist/core/GuaranteeManager.d.ts.map +1 -0
  29. package/dist/core/GuaranteeManager.js +352 -0
  30. package/dist/core/ManifestStore.d.ts +71 -0
  31. package/dist/core/ManifestStore.d.ts.map +1 -0
  32. package/dist/core/ManifestStore.js +146 -0
  33. package/dist/core/NodeFactory.d.ts +160 -0
  34. package/dist/core/NodeFactory.d.ts.map +1 -0
  35. package/dist/core/NodeFactory.js +137 -0
  36. package/dist/core/NodeId.d.ts +88 -0
  37. package/dist/core/NodeId.d.ts.map +1 -0
  38. package/dist/core/NodeId.js +170 -0
  39. package/dist/core/ParallelAnalyzer.d.ts +120 -0
  40. package/dist/core/ParallelAnalyzer.d.ts.map +1 -0
  41. package/dist/core/ParallelAnalyzer.js +331 -0
  42. package/dist/core/PriorityQueue.d.ts +106 -0
  43. package/dist/core/PriorityQueue.d.ts.map +1 -0
  44. package/dist/core/PriorityQueue.js +168 -0
  45. package/dist/core/Profiler.d.ts +75 -0
  46. package/dist/core/Profiler.d.ts.map +1 -0
  47. package/dist/core/Profiler.js +149 -0
  48. package/dist/core/QueueWorker.d.ts +12 -0
  49. package/dist/core/QueueWorker.d.ts.map +1 -0
  50. package/dist/core/QueueWorker.js +567 -0
  51. package/dist/core/RFDBClient.d.ts +179 -0
  52. package/dist/core/RFDBClient.d.ts.map +1 -0
  53. package/dist/core/RFDBClient.js +429 -0
  54. package/dist/core/Task.d.ts +56 -0
  55. package/dist/core/Task.d.ts.map +1 -0
  56. package/dist/core/Task.js +85 -0
  57. package/dist/core/TaskTypes.d.ts +20 -0
  58. package/dist/core/TaskTypes.d.ts.map +1 -0
  59. package/dist/core/TaskTypes.js +10 -0
  60. package/dist/core/VersionManager.d.ts +166 -0
  61. package/dist/core/VersionManager.d.ts.map +1 -0
  62. package/dist/core/VersionManager.js +237 -0
  63. package/dist/core/WorkerPool.d.ts +82 -0
  64. package/dist/core/WorkerPool.d.ts.map +1 -0
  65. package/dist/core/WorkerPool.js +109 -0
  66. package/dist/core/nodes/CallSiteNode.d.ts +26 -0
  67. package/dist/core/nodes/CallSiteNode.d.ts.map +1 -0
  68. package/dist/core/nodes/CallSiteNode.js +44 -0
  69. package/dist/core/nodes/ClassNode.d.ts +25 -0
  70. package/dist/core/nodes/ClassNode.d.ts.map +1 -0
  71. package/dist/core/nodes/ClassNode.js +40 -0
  72. package/dist/core/nodes/ConstantNode.d.ts +24 -0
  73. package/dist/core/nodes/ConstantNode.d.ts.map +1 -0
  74. package/dist/core/nodes/ConstantNode.js +39 -0
  75. package/dist/core/nodes/DatabaseQueryNode.d.ts +22 -0
  76. package/dist/core/nodes/DatabaseQueryNode.d.ts.map +1 -0
  77. package/dist/core/nodes/DatabaseQueryNode.js +37 -0
  78. package/dist/core/nodes/EntrypointNode.d.ts +102 -0
  79. package/dist/core/nodes/EntrypointNode.d.ts.map +1 -0
  80. package/dist/core/nodes/EntrypointNode.js +119 -0
  81. package/dist/core/nodes/EventListenerNode.d.ts +25 -0
  82. package/dist/core/nodes/EventListenerNode.d.ts.map +1 -0
  83. package/dist/core/nodes/EventListenerNode.js +39 -0
  84. package/dist/core/nodes/ExportNode.d.ts +26 -0
  85. package/dist/core/nodes/ExportNode.d.ts.map +1 -0
  86. package/dist/core/nodes/ExportNode.js +40 -0
  87. package/dist/core/nodes/ExternalStdioNode.d.ts +17 -0
  88. package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -0
  89. package/dist/core/nodes/ExternalStdioNode.js +26 -0
  90. package/dist/core/nodes/FunctionNode.d.ts +27 -0
  91. package/dist/core/nodes/FunctionNode.d.ts.map +1 -0
  92. package/dist/core/nodes/FunctionNode.js +53 -0
  93. package/dist/core/nodes/GuaranteeNode.d.ts +76 -0
  94. package/dist/core/nodes/GuaranteeNode.d.ts.map +1 -0
  95. package/dist/core/nodes/GuaranteeNode.js +117 -0
  96. package/dist/core/nodes/HttpRequestNode.d.ts +24 -0
  97. package/dist/core/nodes/HttpRequestNode.d.ts.map +1 -0
  98. package/dist/core/nodes/HttpRequestNode.js +38 -0
  99. package/dist/core/nodes/ImportNode.d.ts +27 -0
  100. package/dist/core/nodes/ImportNode.d.ts.map +1 -0
  101. package/dist/core/nodes/ImportNode.js +43 -0
  102. package/dist/core/nodes/LiteralNode.d.ts +26 -0
  103. package/dist/core/nodes/LiteralNode.d.ts.map +1 -0
  104. package/dist/core/nodes/LiteralNode.js +40 -0
  105. package/dist/core/nodes/MethodCallNode.d.ts +29 -0
  106. package/dist/core/nodes/MethodCallNode.d.ts.map +1 -0
  107. package/dist/core/nodes/MethodCallNode.js +47 -0
  108. package/dist/core/nodes/MethodNode.d.ts +29 -0
  109. package/dist/core/nodes/MethodNode.d.ts.map +1 -0
  110. package/dist/core/nodes/MethodNode.js +44 -0
  111. package/dist/core/nodes/ModuleNode.d.ts +29 -0
  112. package/dist/core/nodes/ModuleNode.d.ts.map +1 -0
  113. package/dist/core/nodes/ModuleNode.js +49 -0
  114. package/dist/core/nodes/NodeKind.d.ts +91 -0
  115. package/dist/core/nodes/NodeKind.d.ts.map +1 -0
  116. package/dist/core/nodes/NodeKind.js +146 -0
  117. package/dist/core/nodes/ParameterNode.d.ts +26 -0
  118. package/dist/core/nodes/ParameterNode.d.ts.map +1 -0
  119. package/dist/core/nodes/ParameterNode.js +43 -0
  120. package/dist/core/nodes/ScopeNode.d.ts +32 -0
  121. package/dist/core/nodes/ScopeNode.d.ts.map +1 -0
  122. package/dist/core/nodes/ScopeNode.js +47 -0
  123. package/dist/core/nodes/ServiceNode.d.ts +44 -0
  124. package/dist/core/nodes/ServiceNode.d.ts.map +1 -0
  125. package/dist/core/nodes/ServiceNode.js +49 -0
  126. package/dist/core/nodes/VariableDeclarationNode.d.ts +22 -0
  127. package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -0
  128. package/dist/core/nodes/VariableDeclarationNode.js +38 -0
  129. package/dist/core/nodes/index.d.ts +25 -0
  130. package/dist/core/nodes/index.d.ts.map +1 -0
  131. package/dist/core/nodes/index.js +30 -0
  132. package/dist/index.d.ts +57 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +63 -0
  135. package/dist/plugins/Plugin.d.ts +44 -0
  136. package/dist/plugins/Plugin.d.ts.map +1 -0
  137. package/dist/plugins/Plugin.js +46 -0
  138. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts +23 -0
  139. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -0
  140. package/dist/plugins/analysis/DatabaseAnalyzer.js +260 -0
  141. package/dist/plugins/analysis/ExpressAnalyzer.d.ts +19 -0
  142. package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -0
  143. package/dist/plugins/analysis/ExpressAnalyzer.js +306 -0
  144. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts +17 -0
  145. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -0
  146. package/dist/plugins/analysis/ExpressRouteAnalyzer.js +308 -0
  147. package/dist/plugins/analysis/FetchAnalyzer.d.ts +38 -0
  148. package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -0
  149. package/dist/plugins/analysis/FetchAnalyzer.js +344 -0
  150. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +65 -0
  151. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -0
  152. package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +472 -0
  153. package/dist/plugins/analysis/JSASTAnalyzer.d.ts +84 -0
  154. package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -0
  155. package/dist/plugins/analysis/JSASTAnalyzer.js +1378 -0
  156. package/dist/plugins/analysis/ReactAnalyzer.d.ts +90 -0
  157. package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -0
  158. package/dist/plugins/analysis/ReactAnalyzer.js +1153 -0
  159. package/dist/plugins/analysis/RustAnalyzer.d.ts +13 -0
  160. package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -0
  161. package/dist/plugins/analysis/RustAnalyzer.js +259 -0
  162. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts +21 -0
  163. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -0
  164. package/dist/plugins/analysis/SQLiteAnalyzer.js +317 -0
  165. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts +35 -0
  166. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -0
  167. package/dist/plugins/analysis/ServiceLayerAnalyzer.js +303 -0
  168. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts +33 -0
  169. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -0
  170. package/dist/plugins/analysis/SocketIOAnalyzer.js +283 -0
  171. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts +27 -0
  172. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -0
  173. package/dist/plugins/analysis/SystemDbAnalyzer.js +211 -0
  174. package/dist/plugins/analysis/ast/ConditionParser.d.ts +85 -0
  175. package/dist/plugins/analysis/ast/ConditionParser.d.ts.map +1 -0
  176. package/dist/plugins/analysis/ast/ConditionParser.js +277 -0
  177. package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts +15 -0
  178. package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts.map +1 -0
  179. package/dist/plugins/analysis/ast/ExpressionEvaluator.js +91 -0
  180. package/dist/plugins/analysis/ast/GraphBuilder.d.ts +77 -0
  181. package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -0
  182. package/dist/plugins/analysis/ast/GraphBuilder.js +1077 -0
  183. package/dist/plugins/analysis/ast/OxcAdapter.d.ts +41 -0
  184. package/dist/plugins/analysis/ast/OxcAdapter.d.ts.map +1 -0
  185. package/dist/plugins/analysis/ast/OxcAdapter.js +40 -0
  186. package/dist/plugins/analysis/ast/types.d.ts +346 -0
  187. package/dist/plugins/analysis/ast/types.d.ts.map +1 -0
  188. package/dist/plugins/analysis/ast/types.js +4 -0
  189. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +93 -0
  190. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -0
  191. package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +24 -0
  192. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +77 -0
  193. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -0
  194. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +377 -0
  195. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +27 -0
  196. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -0
  197. package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +232 -0
  198. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +25 -0
  199. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -0
  200. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +172 -0
  201. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts +29 -0
  202. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -0
  203. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +180 -0
  204. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +14 -0
  205. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -0
  206. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +200 -0
  207. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +45 -0
  208. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -0
  209. package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +150 -0
  210. package/dist/plugins/analysis/ast/visitors/index.d.ts +17 -0
  211. package/dist/plugins/analysis/ast/visitors/index.d.ts.map +1 -0
  212. package/dist/plugins/analysis/ast/visitors/index.js +13 -0
  213. package/dist/plugins/discovery/DiscoveryPlugin.d.ts +34 -0
  214. package/dist/plugins/discovery/DiscoveryPlugin.d.ts.map +1 -0
  215. package/dist/plugins/discovery/DiscoveryPlugin.js +26 -0
  216. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts +26 -0
  217. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -0
  218. package/dist/plugins/discovery/MonorepoServiceDiscovery.js +79 -0
  219. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts +14 -0
  220. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -0
  221. package/dist/plugins/discovery/SimpleProjectDiscovery.js +65 -0
  222. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +19 -0
  223. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +1 -0
  224. package/dist/plugins/discovery/ZonServiceDiscovery.js +204 -0
  225. package/dist/plugins/enrichment/AliasTracker.d.ts +40 -0
  226. package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -0
  227. package/dist/plugins/enrichment/AliasTracker.js +290 -0
  228. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +30 -0
  229. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -0
  230. package/dist/plugins/enrichment/HTTPConnectionEnricher.js +135 -0
  231. package/dist/plugins/enrichment/ImportExportLinker.d.ts +30 -0
  232. package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -0
  233. package/dist/plugins/enrichment/ImportExportLinker.js +176 -0
  234. package/dist/plugins/enrichment/InstanceOfResolver.d.ts +21 -0
  235. package/dist/plugins/enrichment/InstanceOfResolver.d.ts.map +1 -0
  236. package/dist/plugins/enrichment/InstanceOfResolver.js +117 -0
  237. package/dist/plugins/enrichment/MethodCallResolver.d.ts +41 -0
  238. package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -0
  239. package/dist/plugins/enrichment/MethodCallResolver.js +252 -0
  240. package/dist/plugins/enrichment/MountPointResolver.d.ts +26 -0
  241. package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -0
  242. package/dist/plugins/enrichment/MountPointResolver.js +189 -0
  243. package/dist/plugins/enrichment/PrefixEvaluator.d.ts +89 -0
  244. package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -0
  245. package/dist/plugins/enrichment/PrefixEvaluator.js +415 -0
  246. package/dist/plugins/enrichment/RustFFIEnricher.d.ts +25 -0
  247. package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -0
  248. package/dist/plugins/enrichment/RustFFIEnricher.js +170 -0
  249. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +114 -0
  250. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -0
  251. package/dist/plugins/enrichment/ValueDomainAnalyzer.js +464 -0
  252. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts +27 -0
  253. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -0
  254. package/dist/plugins/indexing/IncrementalModuleIndexer.js +238 -0
  255. package/dist/plugins/indexing/JSModuleIndexer.d.ts +33 -0
  256. package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -0
  257. package/dist/plugins/indexing/JSModuleIndexer.js +299 -0
  258. package/dist/plugins/indexing/RustModuleIndexer.d.ts +28 -0
  259. package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -0
  260. package/dist/plugins/indexing/RustModuleIndexer.js +140 -0
  261. package/dist/plugins/indexing/ServiceDetector.d.ts +46 -0
  262. package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -0
  263. package/dist/plugins/indexing/ServiceDetector.js +164 -0
  264. package/dist/plugins/validation/CallResolverValidator.d.ts +23 -0
  265. package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -0
  266. package/dist/plugins/validation/CallResolverValidator.js +108 -0
  267. package/dist/plugins/validation/DataFlowValidator.d.ts +24 -0
  268. package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -0
  269. package/dist/plugins/validation/DataFlowValidator.js +148 -0
  270. package/dist/plugins/validation/EvalBanValidator.d.ts +25 -0
  271. package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -0
  272. package/dist/plugins/validation/EvalBanValidator.js +123 -0
  273. package/dist/plugins/validation/GraphConnectivityValidator.d.ts +11 -0
  274. package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -0
  275. package/dist/plugins/validation/GraphConnectivityValidator.js +135 -0
  276. package/dist/plugins/validation/SQLInjectionValidator.d.ts +43 -0
  277. package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -0
  278. package/dist/plugins/validation/SQLInjectionValidator.js +251 -0
  279. package/dist/plugins/validation/ShadowingDetector.d.ts +26 -0
  280. package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -0
  281. package/dist/plugins/validation/ShadowingDetector.js +119 -0
  282. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts +21 -0
  283. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -0
  284. package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +151 -0
  285. package/dist/plugins/vcs/GitPlugin.d.ts +84 -0
  286. package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -0
  287. package/dist/plugins/vcs/GitPlugin.js +295 -0
  288. package/dist/plugins/vcs/VCSPlugin.d.ts +133 -0
  289. package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -0
  290. package/dist/plugins/vcs/VCSPlugin.js +82 -0
  291. package/dist/plugins/vcs/index.d.ts +10 -0
  292. package/dist/plugins/vcs/index.d.ts.map +1 -0
  293. package/dist/plugins/vcs/index.js +18 -0
  294. package/dist/storage/backends/RFDBServerBackend.d.ts +258 -0
  295. package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -0
  296. package/dist/storage/backends/RFDBServerBackend.js +565 -0
  297. package/dist/storage/backends/typeValidation.d.ts +47 -0
  298. package/dist/storage/backends/typeValidation.d.ts.map +1 -0
  299. package/dist/storage/backends/typeValidation.js +137 -0
  300. package/dist/validation/PathValidator.d.ts +81 -0
  301. package/dist/validation/PathValidator.d.ts.map +1 -0
  302. package/dist/validation/PathValidator.js +251 -0
  303. package/package.json +57 -0
  304. package/src/.rfguard/current-session.txt +1 -0
  305. package/src/Orchestrator.ts +673 -0
  306. package/src/api/GraphAPI.ts +305 -0
  307. package/src/api/GuaranteeAPI.ts +401 -0
  308. package/src/core/ASTWorker.ts +567 -0
  309. package/src/core/ASTWorkerPool.ts +299 -0
  310. package/src/core/AnalysisQueue.ts +447 -0
  311. package/src/core/AnalysisWorker.ts +410 -0
  312. package/src/core/GraphBackend.ts +265 -0
  313. package/src/core/GuaranteeManager.ts +581 -0
  314. package/src/core/ManifestStore.ts +196 -0
  315. package/src/core/NodeFactory.ts +274 -0
  316. package/src/core/NodeId.ts +257 -0
  317. package/src/core/ParallelAnalyzer.ts +476 -0
  318. package/src/core/PriorityQueue.ts +227 -0
  319. package/src/core/Profiler.ts +188 -0
  320. package/src/core/QueueWorker.ts +780 -0
  321. package/src/core/Task.ts +107 -0
  322. package/src/core/TaskTypes.ts +40 -0
  323. package/src/core/VersionManager.ts +404 -0
  324. package/src/core/WorkerPool.ts +180 -0
  325. package/src/core/nodes/CallSiteNode.ts +72 -0
  326. package/src/core/nodes/ClassNode.ts +69 -0
  327. package/src/core/nodes/ConstantNode.ts +63 -0
  328. package/src/core/nodes/DatabaseQueryNode.ts +60 -0
  329. package/src/core/nodes/EntrypointNode.ts +164 -0
  330. package/src/core/nodes/EventListenerNode.ts +64 -0
  331. package/src/core/nodes/ExportNode.ts +71 -0
  332. package/src/core/nodes/ExternalStdioNode.ts +36 -0
  333. package/src/core/nodes/FunctionNode.ts +78 -0
  334. package/src/core/nodes/GuaranteeNode.ts +162 -0
  335. package/src/core/nodes/HttpRequestNode.ts +63 -0
  336. package/src/core/nodes/ImportNode.ts +75 -0
  337. package/src/core/nodes/LiteralNode.ts +67 -0
  338. package/src/core/nodes/MethodCallNode.ts +79 -0
  339. package/src/core/nodes/MethodNode.ts +78 -0
  340. package/src/core/nodes/ModuleNode.ts +74 -0
  341. package/src/core/nodes/NodeKind.ts +171 -0
  342. package/src/core/nodes/ParameterNode.ts +73 -0
  343. package/src/core/nodes/ScopeNode.ts +80 -0
  344. package/src/core/nodes/ServiceNode.ts +86 -0
  345. package/src/core/nodes/VariableDeclarationNode.ts +60 -0
  346. package/src/core/nodes/index.ts +49 -0
  347. package/src/index.ts +93 -0
  348. package/src/plugins/Plugin.ts +74 -0
  349. package/src/plugins/analysis/DatabaseAnalyzer.ts +322 -0
  350. package/src/plugins/analysis/ExpressAnalyzer.ts +401 -0
  351. package/src/plugins/analysis/ExpressRouteAnalyzer.ts +414 -0
  352. package/src/plugins/analysis/FetchAnalyzer.ts +441 -0
  353. package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +686 -0
  354. package/src/plugins/analysis/JSASTAnalyzer.ts +1680 -0
  355. package/src/plugins/analysis/ReactAnalyzer.ts +1368 -0
  356. package/src/plugins/analysis/RustAnalyzer.ts +438 -0
  357. package/src/plugins/analysis/SQLiteAnalyzer.ts +388 -0
  358. package/src/plugins/analysis/ServiceLayerAnalyzer.ts +429 -0
  359. package/src/plugins/analysis/SocketIOAnalyzer.ts +395 -0
  360. package/src/plugins/analysis/SystemDbAnalyzer.ts +284 -0
  361. package/src/plugins/analysis/ast/ConditionParser.ts +333 -0
  362. package/src/plugins/analysis/ast/ExpressionEvaluator.ts +117 -0
  363. package/src/plugins/analysis/ast/GraphBuilder.ts +1371 -0
  364. package/src/plugins/analysis/ast/OxcAdapter.ts +63 -0
  365. package/src/plugins/analysis/ast/types.ts +400 -0
  366. package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +137 -0
  367. package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +528 -0
  368. package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +339 -0
  369. package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +273 -0
  370. package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +259 -0
  371. package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +235 -0
  372. package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +268 -0
  373. package/src/plugins/analysis/ast/visitors/index.ts +36 -0
  374. package/src/plugins/discovery/DiscoveryPlugin.ts +50 -0
  375. package/src/plugins/discovery/MonorepoServiceDiscovery.ts +117 -0
  376. package/src/plugins/discovery/SimpleProjectDiscovery.ts +102 -0
  377. package/src/plugins/enrichment/AliasTracker.ts +399 -0
  378. package/src/plugins/enrichment/HTTPConnectionEnricher.ts +192 -0
  379. package/src/plugins/enrichment/ImportExportLinker.ts +221 -0
  380. package/src/plugins/enrichment/InstanceOfResolver.ts +165 -0
  381. package/src/plugins/enrichment/MethodCallResolver.ts +333 -0
  382. package/src/plugins/enrichment/MountPointResolver.ts +264 -0
  383. package/src/plugins/enrichment/PrefixEvaluator.ts +527 -0
  384. package/src/plugins/enrichment/RustFFIEnricher.ts +218 -0
  385. package/src/plugins/enrichment/ValueDomainAnalyzer.ts +682 -0
  386. package/src/plugins/indexing/IncrementalModuleIndexer.ts +287 -0
  387. package/src/plugins/indexing/JSModuleIndexer.ts +374 -0
  388. package/src/plugins/indexing/RustModuleIndexer.ts +160 -0
  389. package/src/plugins/indexing/ServiceDetector.ts +230 -0
  390. package/src/plugins/validation/CallResolverValidator.ts +170 -0
  391. package/src/plugins/validation/DataFlowValidator.ts +233 -0
  392. package/src/plugins/validation/EvalBanValidator.ts +175 -0
  393. package/src/plugins/validation/GraphConnectivityValidator.ts +201 -0
  394. package/src/plugins/validation/SQLInjectionValidator.ts +363 -0
  395. package/src/plugins/validation/ShadowingDetector.ts +173 -0
  396. package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +203 -0
  397. package/src/plugins/vcs/GitPlugin.ts +344 -0
  398. package/src/plugins/vcs/VCSPlugin.ts +190 -0
  399. package/src/plugins/vcs/index.ts +32 -0
  400. package/src/storage/backends/RFDBServerBackend.ts +687 -0
  401. package/src/storage/backends/typeValidation.ts +151 -0
  402. package/src/validation/PathValidator.ts +342 -0
@@ -0,0 +1,687 @@
1
+ /**
2
+ * RFDBServerBackend - Graph backend using RFDB server via Unix socket
3
+ *
4
+ * Replaces ReginaFlowBackend's direct NAPI binding with socket-based
5
+ * communication to a shared RFDB server. This allows multiple processes
6
+ * (MCP server, analysis workers) to share the same graph database.
7
+ *
8
+ * Socket path defaults to `{dbPath}/../rfdb.sock` (e.g., .grafema/rfdb.sock),
9
+ * ensuring each project has its own socket and avoiding conflicts when
10
+ * multiple MCP instances run simultaneously.
11
+ *
12
+ * Usage:
13
+ * const backend = new RFDBServerBackend({
14
+ * dbPath: '/project/.grafema/graph.rfdb' // socket will be /project/.grafema/rfdb.sock
15
+ * });
16
+ * await backend.connect();
17
+ * await backend.addNodes([...]);
18
+ * await backend.flush();
19
+ */
20
+
21
+ import { RFDBClient } from '@grafema/rfdb-client';
22
+ import { existsSync, unlinkSync } from 'fs';
23
+ import { spawn, type ChildProcess } from 'child_process';
24
+ import { join, dirname } from 'path';
25
+ import { fileURLToPath } from 'url';
26
+ import { setTimeout as sleep } from 'timers/promises';
27
+
28
+ import type { WireNode, WireEdge } from '@grafema/types';
29
+ import type { NodeType, EdgeType } from '@grafema/types';
30
+ import type { AttrQuery, GraphStats, GraphExport } from '../../core/GraphBackend.js';
31
+
32
+ const __filename = fileURLToPath(import.meta.url);
33
+ const __dirname = dirname(__filename);
34
+
35
+ /**
36
+ * Options for RFDBServerBackend
37
+ */
38
+ export interface RFDBServerBackendOptions {
39
+ socketPath?: string;
40
+ dbPath?: string;
41
+ }
42
+
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
+ /**
68
+ * Input node format (flexible)
69
+ */
70
+ export interface InputNode {
71
+ id: string;
72
+ type?: string;
73
+ nodeType?: string;
74
+ node_type?: string;
75
+ name?: string;
76
+ file?: string;
77
+ exported?: boolean;
78
+ [key: string]: unknown;
79
+ }
80
+
81
+ /**
82
+ * Input edge format (flexible)
83
+ */
84
+ export interface InputEdge {
85
+ src: string;
86
+ dst: string;
87
+ type?: string;
88
+ edgeType?: string;
89
+ edge_type?: string;
90
+ [key: string]: unknown;
91
+ }
92
+
93
+ /**
94
+ * Query for finding nodes
95
+ */
96
+ export interface NodeQuery {
97
+ nodeType?: NodeType;
98
+ type?: NodeType;
99
+ name?: string;
100
+ file?: string;
101
+ }
102
+
103
+ /**
104
+ * Backend statistics
105
+ */
106
+ export interface BackendStats extends GraphStats {
107
+ nodesByType: Record<string, number>;
108
+ edgesByType: Record<string, number>;
109
+ }
110
+
111
+ export class RFDBServerBackend {
112
+ readonly socketPath: string;
113
+ readonly dbPath: string | undefined;
114
+ private client: RFDBClient | null;
115
+ private serverProcess: ChildProcess | null;
116
+ connected: boolean; // Public for compatibility
117
+ private edgeTypes: Set<string>;
118
+ private _cachedNodeCounts: Record<string, number> | undefined;
119
+ private _cachedEdgeCounts: Record<string, number> | undefined;
120
+
121
+ constructor(options: RFDBServerBackendOptions = {}) {
122
+ this.dbPath = options.dbPath;
123
+ // Default socket path: next to the database in .grafema folder
124
+ // This ensures each project has its own socket, avoiding conflicts
125
+ if (options.socketPath) {
126
+ this.socketPath = options.socketPath;
127
+ } else if (this.dbPath) {
128
+ this.socketPath = join(dirname(this.dbPath), 'rfdb.sock');
129
+ } else {
130
+ this.socketPath = '/tmp/rfdb.sock'; // fallback, not recommended
131
+ }
132
+ this.client = null;
133
+ this.serverProcess = null;
134
+ this.connected = false;
135
+ this.edgeTypes = new Set();
136
+ }
137
+
138
+ /**
139
+ * Connect to RFDB server, starting it if necessary
140
+ */
141
+ async connect(): Promise<void> {
142
+ if (this.connected) return;
143
+
144
+ // Try to connect first
145
+ this.client = new RFDBClient(this.socketPath);
146
+
147
+ try {
148
+ await this.client.connect();
149
+ // Verify server is responsive
150
+ await this.client.ping();
151
+ this.connected = true;
152
+ console.log(`[RFDBServerBackend] Connected to existing RFDB server at ${this.socketPath}`);
153
+ return;
154
+ } catch {
155
+ // Server not running, need to start it
156
+ console.log(`[RFDBServerBackend] RFDB server not running, starting...`);
157
+ }
158
+
159
+ // Start the server
160
+ await this._startServer();
161
+
162
+ // Connect again
163
+ this.client = new RFDBClient(this.socketPath);
164
+ await this.client.connect();
165
+ await this.client.ping();
166
+ this.connected = true;
167
+ console.log(`[RFDBServerBackend] Connected to RFDB server at ${this.socketPath}`);
168
+ }
169
+
170
+ /**
171
+ * Alias for connect()
172
+ */
173
+ async initialize(): Promise<void> {
174
+ return this.connect();
175
+ }
176
+
177
+ /**
178
+ * Start RFDB server process
179
+ */
180
+ private async _startServer(): Promise<void> {
181
+ if (!this.dbPath) {
182
+ throw new Error('dbPath required to start RFDB server');
183
+ }
184
+
185
+ // Find server binary
186
+ const projectRoot = join(__dirname, '../../../../..');
187
+ const releaseBinary = join(projectRoot, 'rust-engine/target/release/rfdb-server');
188
+ const debugBinary = join(projectRoot, 'rust-engine/target/debug/rfdb-server');
189
+
190
+ let binaryPath = existsSync(releaseBinary) ? releaseBinary : debugBinary;
191
+
192
+ if (!existsSync(binaryPath)) {
193
+ console.log(`[RFDBServerBackend] Server binary not found, building...`);
194
+ const { execSync } = await import('child_process');
195
+ execSync('cargo build --bin rfdb-server', {
196
+ cwd: join(projectRoot, 'rust-engine'),
197
+ stdio: 'inherit',
198
+ });
199
+ binaryPath = debugBinary;
200
+ }
201
+
202
+ // Remove stale socket
203
+ if (existsSync(this.socketPath)) {
204
+ unlinkSync(this.socketPath);
205
+ }
206
+
207
+ console.log(`[RFDBServerBackend] Starting: ${binaryPath} ${this.dbPath} --socket ${this.socketPath}`);
208
+
209
+ this.serverProcess = spawn(binaryPath, [this.dbPath, '--socket', this.socketPath], {
210
+ stdio: ['ignore', 'pipe', 'pipe'],
211
+ detached: true, // Allow server to outlive this process
212
+ });
213
+
214
+ // Don't let server process prevent parent from exiting
215
+ this.serverProcess.unref();
216
+
217
+ this.serverProcess.stderr?.on('data', (data: Buffer) => {
218
+ const msg = data.toString().trim();
219
+ if (!msg.includes('FLUSH') && !msg.includes('WRITER')) {
220
+ console.log(`[rfdb-server] ${msg}`);
221
+ }
222
+ });
223
+
224
+ this.serverProcess.on('error', (err: Error) => {
225
+ console.error(`[RFDBServerBackend] Server process error:`, err);
226
+ });
227
+
228
+ // Wait for socket to appear
229
+ let attempts = 0;
230
+ while (!existsSync(this.socketPath) && attempts < 50) {
231
+ await sleep(100);
232
+ attempts++;
233
+ }
234
+
235
+ if (!existsSync(this.socketPath)) {
236
+ throw new Error(`RFDB server failed to start (socket not created after ${attempts * 100}ms)`);
237
+ }
238
+
239
+ console.log(`[RFDBServerBackend] Server started on ${this.socketPath}`);
240
+ }
241
+
242
+ /**
243
+ * Close connection and stop server if we started it
244
+ */
245
+ async close(): Promise<void> {
246
+ if (this.client) {
247
+ await this.client.close();
248
+ this.client = null;
249
+ }
250
+ this.connected = false;
251
+
252
+ // Kill server process if we started it
253
+ if (this.serverProcess) {
254
+ this.serverProcess.kill('SIGTERM');
255
+ this.serverProcess = null;
256
+ }
257
+ }
258
+
259
+ /**
260
+ * Clear the database
261
+ */
262
+ async clear(): Promise<void> {
263
+ if (!this.client) throw new Error('Not connected');
264
+ await this.client.clear();
265
+ }
266
+
267
+ /**
268
+ * Flush data to disk
269
+ */
270
+ async flush(): Promise<void> {
271
+ if (!this.client) throw new Error('Not connected');
272
+ await this.client.flush();
273
+ }
274
+
275
+ // ===========================================================================
276
+ // Node Operations
277
+ // ===========================================================================
278
+
279
+ /**
280
+ * Add a single node
281
+ */
282
+ async addNode(node: InputNode): Promise<void> {
283
+ return this.addNodes([node]);
284
+ }
285
+
286
+ /**
287
+ * Add multiple nodes
288
+ */
289
+ async addNodes(nodes: InputNode[]): Promise<void> {
290
+ if (!this.client) throw new Error('Not connected');
291
+ if (!nodes.length) return;
292
+
293
+ const wireNodes: WireNode[] = nodes.map(n => {
294
+ // Extract metadata from node
295
+ const { id, type, nodeType, node_type, name, file, exported, ...rest } = n;
296
+
297
+ return {
298
+ id: String(id),
299
+ nodeType: (nodeType || node_type || type || 'UNKNOWN') as NodeType,
300
+ name: name || '',
301
+ file: file || '',
302
+ exported: exported || false,
303
+ metadata: JSON.stringify({ originalId: String(id), ...rest }),
304
+ };
305
+ });
306
+
307
+ await this.client.addNodes(wireNodes);
308
+ }
309
+
310
+ /**
311
+ * Add a single edge
312
+ */
313
+ async addEdge(edge: InputEdge): Promise<void> {
314
+ return this.addEdges([edge]);
315
+ }
316
+
317
+ /**
318
+ * Add multiple edges
319
+ */
320
+ async addEdges(edges: InputEdge[], skipValidation = false): Promise<void> {
321
+ if (!this.client) throw new Error('Not connected');
322
+ if (!edges.length) return;
323
+
324
+ // Track edge types
325
+ for (const e of edges) {
326
+ const edgeType = e.edgeType || e.edge_type || e.etype || e.type;
327
+ if (typeof edgeType === 'string') this.edgeTypes.add(edgeType);
328
+ }
329
+
330
+ const wireEdges: WireEdge[] = edges.map(e => {
331
+ const { src, dst, type, edgeType, edge_type, etype, ...rest } = e;
332
+
333
+ return {
334
+ src: String(src),
335
+ dst: String(dst),
336
+ edgeType: (edgeType || edge_type || etype || type || 'UNKNOWN') as EdgeType,
337
+ // Store original string IDs in metadata for retrieval
338
+ metadata: JSON.stringify({ _origSrc: String(src), _origDst: String(dst), ...rest }),
339
+ };
340
+ });
341
+
342
+ await this.client.addEdges(wireEdges, skipValidation);
343
+ }
344
+
345
+ /**
346
+ * Get a node by ID
347
+ */
348
+ async getNode(id: string): Promise<BackendNode | null> {
349
+ if (!this.client) throw new Error('Not connected');
350
+ const node = await this.client.getNode(String(id));
351
+ if (!node) return null;
352
+
353
+ return this._parseNode(node);
354
+ }
355
+
356
+ /**
357
+ * Check if node exists
358
+ */
359
+ async nodeExists(id: string): Promise<boolean> {
360
+ if (!this.client) throw new Error('Not connected');
361
+ return this.client.nodeExists(id);
362
+ }
363
+
364
+ /**
365
+ * Delete a node
366
+ */
367
+ async deleteNode(id: string): Promise<void> {
368
+ if (!this.client) throw new Error('Not connected');
369
+ await this.client.deleteNode(id);
370
+ }
371
+
372
+ /**
373
+ * Find nodes by attributes
374
+ */
375
+ async findByAttr(query: AttrQuery): Promise<string[]> {
376
+ if (!this.client) throw new Error('Not connected');
377
+ return this.client.findByAttr(query);
378
+ }
379
+
380
+ /**
381
+ * Parse a node from wire format to JS format
382
+ */
383
+ private _parseNode(wireNode: WireNode): BackendNode {
384
+ const metadata: Record<string, unknown> = wireNode.metadata ? JSON.parse(wireNode.metadata) : {};
385
+
386
+ // Parse nested JSON strings
387
+ for (const [key, value] of Object.entries(metadata)) {
388
+ if (typeof value === 'string' && (value.startsWith('[') || value.startsWith('{'))) {
389
+ try {
390
+ metadata[key] = JSON.parse(value);
391
+ } catch {
392
+ // Not JSON, keep as string
393
+ }
394
+ }
395
+ }
396
+
397
+ const humanId = (metadata.originalId as string) || wireNode.id;
398
+
399
+ return {
400
+ id: humanId,
401
+ nodeType: wireNode.nodeType,
402
+ type: wireNode.nodeType,
403
+ name: wireNode.name,
404
+ file: wireNode.file,
405
+ exported: wireNode.exported,
406
+ ...metadata,
407
+ };
408
+ }
409
+
410
+ /**
411
+ * Async generator for querying nodes
412
+ */
413
+ async *queryNodes(query: NodeQuery): AsyncGenerator<BackendNode, void, unknown> {
414
+ if (!this.client) throw new Error('Not connected');
415
+
416
+ // Build query for server
417
+ const serverQuery: NodeQuery = {};
418
+ if (query.nodeType) serverQuery.nodeType = query.nodeType;
419
+ if (query.type) serverQuery.nodeType = query.type;
420
+ if (query.name) serverQuery.name = query.name;
421
+ if (query.file) serverQuery.file = query.file;
422
+
423
+ // Use findByType if only nodeType specified
424
+ if (serverQuery.nodeType && Object.keys(serverQuery).length === 1) {
425
+ const ids = await this.client.findByType(serverQuery.nodeType);
426
+ for (const id of ids) {
427
+ const node = await this.getNode(id);
428
+ if (node) yield node;
429
+ }
430
+ return;
431
+ }
432
+
433
+ // Otherwise use client's queryNodes
434
+ for await (const wireNode of this.client.queryNodes(serverQuery)) {
435
+ yield this._parseNode(wireNode);
436
+ }
437
+ }
438
+
439
+ /**
440
+ * Get ALL nodes matching query (collects from queryNodes into array)
441
+ */
442
+ async getAllNodes(query: NodeQuery = {}): Promise<BackendNode[]> {
443
+ const nodes: BackendNode[] = [];
444
+ for await (const node of this.queryNodes(query)) {
445
+ nodes.push(node);
446
+ }
447
+ return nodes;
448
+ }
449
+
450
+ // ===========================================================================
451
+ // Edge Operations
452
+ // ===========================================================================
453
+
454
+ /**
455
+ * Delete an edge
456
+ */
457
+ async deleteEdge(src: string, dst: string, type: string): Promise<void> {
458
+ if (!this.client) throw new Error('Not connected');
459
+ await this.client.deleteEdge(src, dst, type as EdgeType);
460
+ }
461
+
462
+ /**
463
+ * Get all edges
464
+ */
465
+ async getAllEdges(): Promise<BackendEdge[]> {
466
+ return this.getAllEdgesAsync();
467
+ }
468
+
469
+ /**
470
+ * Get all edges (async version)
471
+ */
472
+ async getAllEdgesAsync(): Promise<BackendEdge[]> {
473
+ if (!this.client) throw new Error('Not connected');
474
+ const edges = await this.client.getAllEdges();
475
+ return edges.map(e => {
476
+ const meta = JSON.parse(e.metadata || '{}');
477
+ // Use original string IDs if stored, otherwise use numeric IDs
478
+ const { _origSrc, _origDst, ...rest } = meta;
479
+ return {
480
+ src: _origSrc || e.src,
481
+ dst: _origDst || e.dst,
482
+ type: e.edgeType,
483
+ edgeType: e.edgeType,
484
+ ...rest,
485
+ };
486
+ });
487
+ }
488
+
489
+ /**
490
+ * Get outgoing edges from a node
491
+ */
492
+ async getOutgoingEdges(nodeId: string, edgeTypes: EdgeType[] | null = null): Promise<BackendEdge[]> {
493
+ if (!this.client) throw new Error('Not connected');
494
+ const edges = await this.client.getOutgoingEdges(nodeId, edgeTypes || undefined);
495
+ return edges.map(e => {
496
+ const meta = JSON.parse(e.metadata || '{}');
497
+ const { _origSrc, _origDst, ...rest } = meta;
498
+ return {
499
+ src: _origSrc || e.src,
500
+ dst: _origDst || e.dst,
501
+ type: e.edgeType,
502
+ edgeType: e.edgeType,
503
+ ...rest,
504
+ };
505
+ });
506
+ }
507
+
508
+ /**
509
+ * Get incoming edges to a node
510
+ */
511
+ async getIncomingEdges(nodeId: string, edgeTypes: EdgeType[] | null = null): Promise<BackendEdge[]> {
512
+ if (!this.client) throw new Error('Not connected');
513
+ const edges = await this.client.getIncomingEdges(nodeId, edgeTypes || undefined);
514
+ return edges.map(e => {
515
+ const meta = JSON.parse(e.metadata || '{}');
516
+ const { _origSrc, _origDst, ...rest } = meta;
517
+ return {
518
+ src: _origSrc || e.src,
519
+ dst: _origDst || e.dst,
520
+ type: e.edgeType,
521
+ edgeType: e.edgeType,
522
+ ...rest,
523
+ };
524
+ });
525
+ }
526
+
527
+ // ===========================================================================
528
+ // Graph Traversal
529
+ // ===========================================================================
530
+
531
+ /**
532
+ * BFS traversal
533
+ */
534
+ async bfs(startIds: string[], maxDepth: number, edgeTypes: EdgeType[]): Promise<string[]> {
535
+ if (!this.client) throw new Error('Not connected');
536
+ return this.client.bfs(startIds, maxDepth, edgeTypes);
537
+ }
538
+
539
+ /**
540
+ * DFS traversal
541
+ */
542
+ async dfs(startIds: string[], maxDepth: number, edgeTypes: EdgeType[] = []): Promise<string[]> {
543
+ if (!this.client) throw new Error('Not connected');
544
+ return this.client.dfs(startIds, maxDepth, edgeTypes);
545
+ }
546
+
547
+ // ===========================================================================
548
+ // Statistics
549
+ // ===========================================================================
550
+
551
+ /**
552
+ * Get node count
553
+ */
554
+ async nodeCount(): Promise<number> {
555
+ if (!this.client) throw new Error('Not connected');
556
+ return this.client.nodeCount();
557
+ }
558
+
559
+ /**
560
+ * Get edge count
561
+ */
562
+ async edgeCount(): Promise<number> {
563
+ if (!this.client) throw new Error('Not connected');
564
+ return this.client.edgeCount();
565
+ }
566
+
567
+ /**
568
+ * Get statistics
569
+ */
570
+ async getStats(): Promise<BackendStats> {
571
+ if (!this.client) throw new Error('Not connected');
572
+ const nodeCount = await this.client.nodeCount();
573
+ const edgeCount = await this.client.edgeCount();
574
+ const nodeCounts = await this.client.countNodesByType();
575
+ const edgeCounts = await this.client.countEdgesByType();
576
+
577
+ return {
578
+ nodeCount,
579
+ edgeCount,
580
+ nodesByType: nodeCounts,
581
+ edgesByType: edgeCounts,
582
+ };
583
+ }
584
+
585
+ /**
586
+ * Count nodes by type (sync, returns cached value)
587
+ */
588
+ async countNodesByType(_types: string[] | null = null): Promise<Record<string, number>> {
589
+ if (!this.client) throw new Error('Not connected');
590
+ return this.client.countNodesByType();
591
+ }
592
+
593
+ /**
594
+ * Count edges by type
595
+ */
596
+ async countEdgesByType(_edgeTypes: string[] | null = null): Promise<Record<string, number>> {
597
+ if (!this.client) throw new Error('Not connected');
598
+ return this.client.countEdgesByType();
599
+ }
600
+
601
+ /**
602
+ * Refresh cached counts (call after analysis)
603
+ */
604
+ async refreshCounts(): Promise<void> {
605
+ if (!this.client) throw new Error('Not connected');
606
+ this._cachedNodeCounts = await this.client.countNodesByType();
607
+ this._cachedEdgeCounts = await this.client.countEdgesByType();
608
+ }
609
+
610
+ // ===========================================================================
611
+ // Datalog Queries
612
+ // ===========================================================================
613
+
614
+ /**
615
+ * Check a guarantee (Datalog rule) and return violations
616
+ */
617
+ async checkGuarantee(ruleSource: string): Promise<Array<{ bindings: Array<{ name: string; value: string }> }>> {
618
+ if (!this.client) throw new Error('Not connected');
619
+ const violations = await this.client.checkGuarantee(ruleSource);
620
+ // Convert bindings from {X: "value"} to [{name: "X", value: "value"}]
621
+ return violations.map(v => ({
622
+ bindings: Object.entries(v.bindings).map(([name, value]) => ({ name, value }))
623
+ }));
624
+ }
625
+
626
+ /**
627
+ * Load Datalog rules
628
+ */
629
+ async datalogLoadRules(source: string): Promise<number> {
630
+ if (!this.client) throw new Error('Not connected');
631
+ return await this.client.datalogLoadRules(source);
632
+ }
633
+
634
+ /**
635
+ * Clear Datalog rules
636
+ */
637
+ async datalogClearRules(): Promise<void> {
638
+ if (!this.client) throw new Error('Not connected');
639
+ await this.client.datalogClearRules();
640
+ }
641
+
642
+ /**
643
+ * Run a Datalog query
644
+ */
645
+ async datalogQuery(query: string): Promise<Array<{ bindings: Array<{ name: string; value: string }> }>> {
646
+ if (!this.client) throw new Error('Not connected');
647
+ const results = await this.client.datalogQuery(query);
648
+ // Convert bindings from {X: "value"} to [{name: "X", value: "value"}]
649
+ return results.map(r => ({
650
+ bindings: Object.entries(r.bindings).map(([name, value]) => ({ name, value }))
651
+ }));
652
+ }
653
+
654
+ // ===========================================================================
655
+ // Export/Import
656
+ // ===========================================================================
657
+
658
+ /**
659
+ * Export graph (for tests)
660
+ */
661
+ async export(): Promise<GraphExport> {
662
+ const nodes = await this.getAllNodes();
663
+ const edges = await this.getAllEdgesAsync();
664
+ return {
665
+ nodes: nodes as unknown as GraphExport['nodes'],
666
+ edges: edges as unknown as GraphExport['edges'],
667
+ };
668
+ }
669
+
670
+ /**
671
+ * Find nodes by predicate (for compatibility)
672
+ */
673
+ async findNodes(predicate: (node: BackendNode) => boolean): Promise<BackendNode[]> {
674
+ const allNodes = await this.getAllNodes();
675
+ return allNodes.filter(predicate);
676
+ }
677
+
678
+ // ===========================================================================
679
+ // Graph property (for compatibility)
680
+ // ===========================================================================
681
+
682
+ get graph(): this {
683
+ return this;
684
+ }
685
+ }
686
+
687
+ export default RFDBServerBackend;