@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,140 @@
1
+ /**
2
+ * RustModuleIndexer - plugin for indexing Rust modules
3
+ * Discovers .rs files in rust-engine/src/ directory
4
+ */
5
+ import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
6
+ import { resolve, relative, basename, join } from 'path';
7
+ import { createHash } from 'crypto';
8
+ import { Plugin, createSuccessResult } from '../Plugin.js';
9
+ // Test file patterns for Rust
10
+ const RUST_TEST_PATTERNS = [
11
+ /[/\\]tests[/\\]/, // /tests/
12
+ /_test\.rs$/, // _test.rs
13
+ /[/\\]test\.rs$/, // test.rs in subdirectory
14
+ ];
15
+ export class RustModuleIndexer extends Plugin {
16
+ testPatterns;
17
+ constructor() {
18
+ super();
19
+ this.testPatterns = RUST_TEST_PATTERNS;
20
+ }
21
+ get metadata() {
22
+ return {
23
+ name: 'RustModuleIndexer',
24
+ phase: 'INDEXING',
25
+ priority: 85, // After JSModuleIndexer (90)
26
+ creates: {
27
+ nodes: ['RUST_MODULE'],
28
+ edges: ['CONTAINS']
29
+ }
30
+ };
31
+ }
32
+ /**
33
+ * Check if file is a test file based on path patterns
34
+ */
35
+ isTestFile(filePath) {
36
+ return this.testPatterns.some(pattern => pattern.test(filePath));
37
+ }
38
+ /**
39
+ * Recursively find all .rs files in a directory
40
+ */
41
+ findRustFiles(dir, files = []) {
42
+ try {
43
+ const entries = readdirSync(dir);
44
+ for (const entry of entries) {
45
+ // Skip target directory
46
+ if (entry === 'target')
47
+ continue;
48
+ const fullPath = join(dir, entry);
49
+ try {
50
+ const stat = statSync(fullPath);
51
+ if (stat.isDirectory()) {
52
+ this.findRustFiles(fullPath, files);
53
+ }
54
+ else if (entry.endsWith('.rs')) {
55
+ files.push(fullPath);
56
+ }
57
+ }
58
+ catch {
59
+ // Skip files we can't stat
60
+ }
61
+ }
62
+ }
63
+ catch {
64
+ // Skip directories we can't read
65
+ }
66
+ return files;
67
+ }
68
+ /**
69
+ * Convert file path to Rust module name
70
+ * src/ffi/napi_bindings.rs -> ffi::napi_bindings
71
+ * src/lib.rs -> crate
72
+ * src/ffi/mod.rs -> ffi
73
+ */
74
+ pathToModuleName(relativePath) {
75
+ let name = relativePath
76
+ .replace(/\.rs$/, '')
77
+ .replace(/\//g, '::');
78
+ if (name.endsWith('::mod')) {
79
+ name = name.replace(/::mod$/, '');
80
+ }
81
+ if (name === 'lib') {
82
+ name = 'crate';
83
+ }
84
+ return name;
85
+ }
86
+ async execute(context) {
87
+ const { manifest, graph, onProgress } = context;
88
+ // Cast manifest to expected shape
89
+ const typedManifest = manifest;
90
+ const { projectPath } = typedManifest;
91
+ // Find rust-engine/src directory
92
+ const rustRoot = resolve(projectPath, 'rust-engine/src');
93
+ if (!existsSync(rustRoot)) {
94
+ console.log('[RustModuleIndexer] rust-engine/src not found, skipping');
95
+ return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true });
96
+ }
97
+ // Discover all .rs files recursively
98
+ const rsFiles = this.findRustFiles(rustRoot);
99
+ console.log(`[RustModuleIndexer] Found ${rsFiles.length} .rs files`);
100
+ let nodesCreated = 0;
101
+ const errors = [];
102
+ for (const filePath of rsFiles) {
103
+ try {
104
+ const content = readFileSync(filePath, 'utf-8');
105
+ const hash = createHash('sha256').update(content).digest('hex');
106
+ const relativePath = relative(rustRoot, filePath);
107
+ const moduleName = this.pathToModuleName(relativePath);
108
+ const nodeId = `RUST_MODULE#${moduleName}#${filePath}`;
109
+ await graph.addNode({
110
+ id: nodeId,
111
+ type: 'RUST_MODULE',
112
+ name: moduleName,
113
+ file: filePath,
114
+ contentHash: hash,
115
+ isLib: basename(filePath) === 'lib.rs',
116
+ isMod: basename(filePath) === 'mod.rs',
117
+ isTest: this.isTestFile(filePath)
118
+ });
119
+ nodesCreated++;
120
+ if (onProgress && nodesCreated % 10 === 0) {
121
+ onProgress({
122
+ phase: 'indexing',
123
+ currentPlugin: 'RustModuleIndexer',
124
+ message: `Indexed ${nodesCreated}/${rsFiles.length} Rust modules`,
125
+ totalFiles: rsFiles.length,
126
+ processedFiles: nodesCreated
127
+ });
128
+ }
129
+ }
130
+ catch (err) {
131
+ errors.push({ file: filePath, error: err.message });
132
+ }
133
+ }
134
+ if (errors.length > 0) {
135
+ console.warn(`[RustModuleIndexer] ${errors.length} errors during indexing`);
136
+ }
137
+ console.log(`[RustModuleIndexer] Indexed ${nodesCreated} Rust modules`);
138
+ return createSuccessResult({ nodes: nodesCreated, edges: 0 }, { errors: errors.length });
139
+ }
140
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * ServiceDetector - обнаруживает сервисы в монорепозитории
3
+ *
4
+ * Паттерны детекции:
5
+ * 1. Директории с package.json в apps/, packages/, services/
6
+ * 2. Директории с Dockerfile
7
+ * 3. Директории с server.js/index.js entry points
8
+ */
9
+ import type { NodeRecord } from '@grafema/types';
10
+ /**
11
+ * Context for ServiceDetector
12
+ */
13
+ interface DetectorContext {
14
+ projectPath: string;
15
+ graph: {
16
+ addNode(node: NodeRecord): Promise<void>;
17
+ };
18
+ }
19
+ export declare class ServiceDetector {
20
+ name: string;
21
+ phase: string;
22
+ priority: number;
23
+ constructor();
24
+ /**
25
+ * Анализирует проект и создаёт SERVICE ноды
26
+ */
27
+ analyze(context: DetectorContext): Promise<DetectorContext>;
28
+ /**
29
+ * Обнаруживает сервисы в директории монорепо
30
+ */
31
+ private detectServicesInDir;
32
+ /**
33
+ * Обнаруживает корневой сервис (не монорепо)
34
+ */
35
+ private detectRootService;
36
+ /**
37
+ * Создаёт объект сервиса из директории
38
+ */
39
+ private createServiceFromDir;
40
+ /**
41
+ * Находит entry point сервиса
42
+ */
43
+ private findEntryPoint;
44
+ }
45
+ export {};
46
+ //# sourceMappingURL=ServiceDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServiceDetector.d.ts","sourceRoot":"","sources":["../../../src/plugins/indexing/ServiceDetector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;GAEG;AACH,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QACL,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC1C,CAAC;CACH;AAuBD,qBAAa,eAAe;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;;IAQjB;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IA+CjE;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgC3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAuC5B;;OAEG;IACH,OAAO,CAAC,cAAc;CA8BvB"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * ServiceDetector - обнаруживает сервисы в монорепозитории
3
+ *
4
+ * Паттерны детекции:
5
+ * 1. Директории с package.json в apps/, packages/, services/
6
+ * 2. Директории с Dockerfile
7
+ * 3. Директории с server.js/index.js entry points
8
+ */
9
+ import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
10
+ import { join, basename } from 'path';
11
+ export class ServiceDetector {
12
+ name;
13
+ phase;
14
+ priority;
15
+ constructor() {
16
+ this.name = 'ServiceDetector';
17
+ this.phase = 'INDEXING';
18
+ this.priority = 90; // Запускается перед JSModuleIndexer
19
+ }
20
+ /**
21
+ * Анализирует проект и создаёт SERVICE ноды
22
+ */
23
+ async analyze(context) {
24
+ const { projectPath, graph } = context;
25
+ const services = [];
26
+ console.log(`[${this.name}] Detecting services in: ${projectPath}`);
27
+ // Паттерн 1: Монорепо структура (apps/, packages/, services/)
28
+ const monorepoPatterns = ['apps', 'packages', 'services'];
29
+ for (const pattern of monorepoPatterns) {
30
+ const monorepoDir = join(projectPath, pattern);
31
+ if (existsSync(monorepoDir)) {
32
+ const detected = this.detectServicesInDir(monorepoDir, projectPath);
33
+ services.push(...detected);
34
+ }
35
+ }
36
+ // Паттерн 2: Корневой проект (если нет монорепо)
37
+ if (services.length === 0) {
38
+ const rootService = this.detectRootService(projectPath);
39
+ if (rootService) {
40
+ services.push(rootService);
41
+ }
42
+ }
43
+ // Создаём SERVICE ноды в графе
44
+ for (const service of services) {
45
+ await graph.addNode({
46
+ id: service.id,
47
+ type: 'SERVICE',
48
+ name: service.name,
49
+ file: service.path,
50
+ metadata: {
51
+ packageJson: service.packageJson,
52
+ entryPoint: service.entryPoint,
53
+ hasDockerfile: service.hasDockerfile
54
+ }
55
+ });
56
+ }
57
+ console.log(`[${this.name}] Detected ${services.length} services`);
58
+ services.forEach(s => console.log(` - ${s.name} (${s.path})`));
59
+ return context;
60
+ }
61
+ /**
62
+ * Обнаруживает сервисы в директории монорепо
63
+ */
64
+ detectServicesInDir(dir, projectPath) {
65
+ const services = [];
66
+ try {
67
+ const entries = readdirSync(dir);
68
+ for (const entry of entries) {
69
+ const fullPath = join(dir, entry);
70
+ // Пропускаем файлы и скрытые директории
71
+ if (!statSync(fullPath).isDirectory() || entry.startsWith('.')) {
72
+ continue;
73
+ }
74
+ // Проверяем признаки сервиса
75
+ const packageJsonPath = join(fullPath, 'package.json');
76
+ const hasPackageJson = existsSync(packageJsonPath);
77
+ if (hasPackageJson) {
78
+ const service = this.createServiceFromDir(fullPath, entry, projectPath);
79
+ if (service) {
80
+ services.push(service);
81
+ }
82
+ }
83
+ }
84
+ }
85
+ catch (error) {
86
+ console.warn(`[${this.name}] Error scanning ${dir}:`, error.message);
87
+ }
88
+ return services;
89
+ }
90
+ /**
91
+ * Обнаруживает корневой сервис (не монорепо)
92
+ */
93
+ detectRootService(projectPath) {
94
+ const packageJsonPath = join(projectPath, 'package.json');
95
+ if (!existsSync(packageJsonPath)) {
96
+ return null;
97
+ }
98
+ const projectName = basename(projectPath);
99
+ return this.createServiceFromDir(projectPath, projectName, projectPath);
100
+ }
101
+ /**
102
+ * Создаёт объект сервиса из директории
103
+ */
104
+ createServiceFromDir(servicePath, serviceName, projectPath) {
105
+ try {
106
+ const packageJsonPath = join(servicePath, 'package.json');
107
+ let packageJson = null;
108
+ if (existsSync(packageJsonPath)) {
109
+ const content = readFileSync(packageJsonPath, 'utf-8');
110
+ packageJson = JSON.parse(content);
111
+ }
112
+ // Определяем entry point
113
+ const entryPoint = this.findEntryPoint(servicePath, packageJson);
114
+ // Проверяем наличие Dockerfile
115
+ const hasDockerfile = existsSync(join(servicePath, 'Dockerfile')) ||
116
+ existsSync(join(servicePath, 'dockerfile'));
117
+ // Генерируем ID сервиса
118
+ const relativePath = servicePath.replace(projectPath, '').replace(/^\//, '');
119
+ const serviceId = `SERVICE:${relativePath || serviceName}`;
120
+ return {
121
+ id: serviceId,
122
+ name: packageJson?.name || serviceName,
123
+ path: servicePath,
124
+ packageJson,
125
+ entryPoint,
126
+ hasDockerfile
127
+ };
128
+ }
129
+ catch (error) {
130
+ console.warn(`[${this.name}] Error creating service from ${servicePath}:`, error.message);
131
+ return null;
132
+ }
133
+ }
134
+ /**
135
+ * Находит entry point сервиса
136
+ */
137
+ findEntryPoint(servicePath, packageJson) {
138
+ // 1. Из package.json main
139
+ if (packageJson?.main) {
140
+ return packageJson.main;
141
+ }
142
+ // 2. Стандартные entry points
143
+ const candidates = [
144
+ 'src/index.js',
145
+ 'src/index.ts',
146
+ 'src/server.js',
147
+ 'src/server.ts',
148
+ 'src/main.js',
149
+ 'src/main.ts',
150
+ 'index.js',
151
+ 'index.ts',
152
+ 'server.js',
153
+ 'server.ts',
154
+ 'app.js',
155
+ 'app.ts'
156
+ ];
157
+ for (const candidate of candidates) {
158
+ if (existsSync(join(servicePath, candidate))) {
159
+ return candidate;
160
+ }
161
+ }
162
+ return null;
163
+ }
164
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * CallResolverValidator - проверяет что все вызовы функций ссылаются на определения
3
+ *
4
+ * Использует Datalog для декларативной проверки гарантии:
5
+ * "Все внутренние вызовы функций (CALL_SITE) должны иметь CALLS ребро к FUNCTION"
6
+ *
7
+ * ПРАВИЛО (Datalog):
8
+ * violation(X) :- node(X, "CALL"), \+ attr(X, "object", _), \+ edge(X, _, "CALLS").
9
+ *
10
+ * Это находит CALL узлы без "object" метаданных (т.е. CALL_SITE, не METHOD_CALL),
11
+ * которые не имеют CALLS ребра к определению функции.
12
+ */
13
+ import { Plugin } from '../Plugin.js';
14
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
15
+ export declare class CallResolverValidator extends Plugin {
16
+ get metadata(): PluginMetadata;
17
+ execute(context: PluginContext): Promise<PluginResult>;
18
+ /**
19
+ * Подсчитывает статистику по вызовам
20
+ */
21
+ private countMethodCalls;
22
+ }
23
+ //# sourceMappingURL=CallResolverValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CallResolverValidator.d.ts","sourceRoot":"","sources":["../../../src/plugins/validation/CallResolverValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,MAAM,EAAuB,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AA2ChF,qBAAa,qBAAsB,SAAQ,MAAM;IAC/C,IAAI,QAAQ,IAAI,cAAc,CAU7B;IAEK,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAuE5D;;OAEG;YACW,gBAAgB;CAyB/B"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * CallResolverValidator - проверяет что все вызовы функций ссылаются на определения
3
+ *
4
+ * Использует Datalog для декларативной проверки гарантии:
5
+ * "Все внутренние вызовы функций (CALL_SITE) должны иметь CALLS ребро к FUNCTION"
6
+ *
7
+ * ПРАВИЛО (Datalog):
8
+ * violation(X) :- node(X, "CALL"), \+ attr(X, "object", _), \+ edge(X, _, "CALLS").
9
+ *
10
+ * Это находит CALL узлы без "object" метаданных (т.е. CALL_SITE, не METHOD_CALL),
11
+ * которые не имеют CALLS ребра к определению функции.
12
+ */
13
+ import { Plugin, createSuccessResult } from '../Plugin.js';
14
+ export class CallResolverValidator extends Plugin {
15
+ get metadata() {
16
+ return {
17
+ name: 'CallResolverValidator',
18
+ phase: 'VALIDATION',
19
+ priority: 90,
20
+ creates: {
21
+ nodes: [],
22
+ edges: []
23
+ }
24
+ };
25
+ }
26
+ async execute(context) {
27
+ const { graph } = context;
28
+ console.log('[CallResolverValidator] Starting call resolution validation using Datalog...');
29
+ // Check if graph supports checkGuarantee
30
+ if (!graph.checkGuarantee) {
31
+ console.log('[CallResolverValidator] Graph does not support checkGuarantee, skipping validation');
32
+ return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true });
33
+ }
34
+ // Datalog гарантия:
35
+ // CALL без "object" (т.е. CALL_SITE) должен иметь CALLS ребро
36
+ const violations = await graph.checkGuarantee(`
37
+ violation(X) :- node(X, "CALL"), \\+ attr(X, "object", _), \\+ edge(X, _, "CALLS").
38
+ `);
39
+ const issues = [];
40
+ if (violations.length > 0) {
41
+ console.log(`[CallResolverValidator] Found ${violations.length} unresolved function calls`);
42
+ for (const v of violations) {
43
+ const nodeId = v.bindings.find(b => b.name === 'X')?.value;
44
+ if (nodeId) {
45
+ const node = await graph.getNode(nodeId);
46
+ if (node) {
47
+ issues.push({
48
+ type: 'UNRESOLVED_FUNCTION_CALL',
49
+ severity: 'WARNING',
50
+ message: `Call to "${node.name}" at ${node.file}:${node.line || '?'} does not resolve to a function definition`,
51
+ callName: node.name,
52
+ nodeId: nodeId,
53
+ file: node.file,
54
+ line: node.line
55
+ });
56
+ }
57
+ }
58
+ }
59
+ }
60
+ // Также проверим METHOD_CALL на известные внешние методы
61
+ // (это информационно, не ошибка)
62
+ const methodCallStats = await this.countMethodCalls(graph);
63
+ const summary = {
64
+ totalCalls: methodCallStats.total,
65
+ resolvedInternalCalls: methodCallStats.resolved,
66
+ unresolvedInternalCalls: issues.length,
67
+ externalMethodCalls: methodCallStats.external,
68
+ issues: issues.length
69
+ };
70
+ console.log('[CallResolverValidator] Summary:', summary);
71
+ if (issues.length > 0) {
72
+ console.log(`[CallResolverValidator] Unresolved calls:`);
73
+ for (const issue of issues.slice(0, 10)) { // Show first 10
74
+ console.log(` ⚠️ ${issue.message}`);
75
+ }
76
+ if (issues.length > 10) {
77
+ console.log(` ... and ${issues.length - 10} more`);
78
+ }
79
+ }
80
+ return createSuccessResult({ nodes: 0, edges: 0 }, { summary, issues });
81
+ }
82
+ /**
83
+ * Подсчитывает статистику по вызовам
84
+ */
85
+ async countMethodCalls(graph) {
86
+ const stats = {
87
+ total: 0,
88
+ resolved: 0,
89
+ external: 0
90
+ };
91
+ // Подсчитываем все CALL узлы
92
+ for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
93
+ stats.total++;
94
+ // Проверяем наличие "object" в метаданных (METHOD_CALL)
95
+ if (node.object) {
96
+ stats.external++;
97
+ }
98
+ else {
99
+ // CALL_SITE - проверяем есть ли CALLS ребро
100
+ const edges = await graph.getOutgoingEdges(node.id, ['CALLS']);
101
+ if (edges.length > 0) {
102
+ stats.resolved++;
103
+ }
104
+ }
105
+ }
106
+ return stats;
107
+ }
108
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * DataFlowValidator - проверяет что все переменные прослеживаются до листовых узлов
3
+ *
4
+ * ПРАВИЛО: Каждая переменная должна иметь путь до листового узла через ASSIGNED_FROM рёбра
5
+ *
6
+ * ЛИСТОВЫЕ УЗЛЫ:
7
+ * - LITERAL: примитивные значения
8
+ * - EXTERNAL_STDIO: console.log/error
9
+ * - EXTERNAL_DATABASE: database queries
10
+ * - EXTERNAL_NETWORK: HTTP requests
11
+ * - EXTERNAL_FILESYSTEM: fs.readFile
12
+ * - EVENT_LISTENER: события
13
+ */
14
+ import { Plugin } from '../Plugin.js';
15
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
16
+ export declare class DataFlowValidator extends Plugin {
17
+ get metadata(): PluginMetadata;
18
+ execute(context: PluginContext): Promise<PluginResult>;
19
+ /**
20
+ * Находит путь от переменной до листового узла
21
+ */
22
+ private findPathToLeaf;
23
+ }
24
+ //# sourceMappingURL=DataFlowValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataFlowValidator.d.ts","sourceRoot":"","sources":["../../../src/plugins/validation/DataFlowValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,EAAuB,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AA4ChF,qBAAa,iBAAkB,SAAQ,MAAM;IAC3C,IAAI,QAAQ,IAAI,cAAc,CAU7B;IAEK,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAkH5D;;OAEG;IACH,OAAO,CAAC,cAAc;CA2CvB"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * DataFlowValidator - проверяет что все переменные прослеживаются до листовых узлов
3
+ *
4
+ * ПРАВИЛО: Каждая переменная должна иметь путь до листового узла через ASSIGNED_FROM рёбра
5
+ *
6
+ * ЛИСТОВЫЕ УЗЛЫ:
7
+ * - LITERAL: примитивные значения
8
+ * - EXTERNAL_STDIO: console.log/error
9
+ * - EXTERNAL_DATABASE: database queries
10
+ * - EXTERNAL_NETWORK: HTTP requests
11
+ * - EXTERNAL_FILESYSTEM: fs.readFile
12
+ * - EVENT_LISTENER: события
13
+ */
14
+ import { Plugin, createSuccessResult } from '../Plugin.js';
15
+ export class DataFlowValidator extends Plugin {
16
+ get metadata() {
17
+ return {
18
+ name: 'DataFlowValidator',
19
+ phase: 'VALIDATION',
20
+ priority: 100,
21
+ creates: {
22
+ nodes: [],
23
+ edges: []
24
+ }
25
+ };
26
+ }
27
+ async execute(context) {
28
+ const { graph } = context;
29
+ console.log('[DataFlowValidator] Starting data flow validation...');
30
+ // Check if graph supports getAllEdges
31
+ if (!graph.getAllEdges) {
32
+ console.log('[DataFlowValidator] Graph does not support getAllEdges, skipping validation');
33
+ return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true });
34
+ }
35
+ // Получаем все переменные
36
+ const allNodes = await graph.getAllNodes();
37
+ const allEdges = await graph.getAllEdges();
38
+ const variables = allNodes.filter(n => n.type === 'VARIABLE_DECLARATION' || n.type === 'CONSTANT');
39
+ console.log(`[DataFlowValidator] Found ${variables.length} variables to validate`);
40
+ const issues = [];
41
+ const leafTypes = new Set([
42
+ 'LITERAL',
43
+ 'EXTERNAL_STDIO',
44
+ 'EXTERNAL_DATABASE',
45
+ 'EXTERNAL_NETWORK',
46
+ 'EXTERNAL_FILESYSTEM',
47
+ 'EVENT_LISTENER',
48
+ 'CLASS', // NewExpression - конструкторы классов
49
+ 'FUNCTION', // Arrow functions и function expressions
50
+ 'METHOD_CALL', // Вызовы методов (промежуточные узлы)
51
+ 'CALL_SITE' // Вызовы функций (промежуточные узлы)
52
+ ]);
53
+ for (const variable of variables) {
54
+ // Проверяем наличие ASSIGNED_FROM ребра
55
+ const assignment = allEdges.find(e => e.type === 'ASSIGNED_FROM' && e.src === variable.id);
56
+ if (!assignment) {
57
+ issues.push({
58
+ type: 'MISSING_ASSIGNMENT',
59
+ severity: 'WARNING',
60
+ message: `Variable "${variable.name}" (${variable.file}:${variable.line}) has no ASSIGNED_FROM edge`,
61
+ variable: variable.name,
62
+ file: variable.file,
63
+ line: variable.line
64
+ });
65
+ continue;
66
+ }
67
+ // Проверяем что источник существует
68
+ const source = allNodes.find(n => n.id === assignment.dst);
69
+ if (!source) {
70
+ issues.push({
71
+ type: 'BROKEN_REFERENCE',
72
+ severity: 'ERROR',
73
+ message: `Variable "${variable.name}" references non-existent node ${assignment.dst}`,
74
+ variable: variable.name,
75
+ file: variable.file,
76
+ line: variable.line
77
+ });
78
+ continue;
79
+ }
80
+ // Проверяем путь до листового узла
81
+ const path = this.findPathToLeaf(variable, allNodes, allEdges, leafTypes);
82
+ if (!path.found) {
83
+ issues.push({
84
+ type: 'NO_LEAF_NODE',
85
+ severity: 'WARNING',
86
+ message: `Variable "${variable.name}" (${variable.file}:${variable.line}) does not trace to a leaf node. Chain: ${path.chain.join(' -> ')}`,
87
+ variable: variable.name,
88
+ file: variable.file,
89
+ line: variable.line,
90
+ chain: path.chain
91
+ });
92
+ }
93
+ }
94
+ // Группируем issues по типу
95
+ const summary = {
96
+ total: variables.length,
97
+ validated: variables.length - issues.length,
98
+ issues: issues.length,
99
+ byType: {}
100
+ };
101
+ for (const issue of issues) {
102
+ if (!summary.byType[issue.type]) {
103
+ summary.byType[issue.type] = 0;
104
+ }
105
+ summary.byType[issue.type]++;
106
+ }
107
+ console.log('[DataFlowValidator] Summary:', summary);
108
+ // Выводим issues
109
+ if (issues.length > 0) {
110
+ console.log(`[DataFlowValidator] Found ${issues.length} issues:`);
111
+ for (const issue of issues) {
112
+ const level = issue.severity === 'ERROR' ? '❌' : '⚠️';
113
+ console.log(` ${level} [${issue.type}] ${issue.message}`);
114
+ }
115
+ }
116
+ return createSuccessResult({ nodes: 0, edges: 0 }, { summary, issues });
117
+ }
118
+ /**
119
+ * Находит путь от переменной до листового узла
120
+ */
121
+ findPathToLeaf(startNode, allNodes, allEdges, leafTypes, visited = new Set(), chain = []) {
122
+ // Защита от циклов
123
+ if (visited.has(startNode.id)) {
124
+ return { found: false, chain: [...chain, `${startNode.type}:${startNode.name} (CYCLE)`] };
125
+ }
126
+ visited.add(startNode.id);
127
+ chain.push(`${startNode.type}:${startNode.name}`);
128
+ // Проверяем что это листовой узел
129
+ if (leafTypes.has(startNode.type)) {
130
+ return { found: true, chain };
131
+ }
132
+ // Ищем ASSIGNED_FROM ребро
133
+ const assignment = allEdges.find(e => e.type === 'ASSIGNED_FROM' && e.src === startNode.id);
134
+ if (!assignment) {
135
+ // Для METHOD_CALL и CALL_SITE - это промежуточные узлы, но можем считать их leaf для первой версии
136
+ if (startNode.type === 'METHOD_CALL' || startNode.type === 'CALL_SITE') {
137
+ return { found: true, chain: [...chain, '(intermediate node)'] };
138
+ }
139
+ return { found: false, chain: [...chain, '(no assignment)'] };
140
+ }
141
+ // Продолжаем по цепочке
142
+ const nextNode = allNodes.find(n => n.id === assignment.dst);
143
+ if (!nextNode) {
144
+ return { found: false, chain: [...chain, '(broken reference)'] };
145
+ }
146
+ return this.findPathToLeaf(nextNode, allNodes, allEdges, leafTypes, visited, chain);
147
+ }
148
+ }