@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,160 @@
1
+ /**
2
+ * RustModuleIndexer - plugin for indexing Rust modules
3
+ * Discovers .rs files in rust-engine/src/ directory
4
+ */
5
+
6
+ import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
7
+ import { resolve, relative, basename, join } from 'path';
8
+ import { createHash } from 'crypto';
9
+ import { Plugin, createSuccessResult } from '../Plugin.js';
10
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
11
+ import type { NodeRecord } from '@grafema/types';
12
+
13
+ // Test file patterns for Rust
14
+ const RUST_TEST_PATTERNS: RegExp[] = [
15
+ /[/\\]tests[/\\]/, // /tests/
16
+ /_test\.rs$/, // _test.rs
17
+ /[/\\]test\.rs$/, // test.rs in subdirectory
18
+ ];
19
+
20
+ export class RustModuleIndexer extends Plugin {
21
+ private testPatterns: RegExp[];
22
+
23
+ constructor() {
24
+ super();
25
+ this.testPatterns = RUST_TEST_PATTERNS;
26
+ }
27
+
28
+ get metadata(): PluginMetadata {
29
+ return {
30
+ name: 'RustModuleIndexer',
31
+ phase: 'INDEXING',
32
+ priority: 85, // After JSModuleIndexer (90)
33
+ creates: {
34
+ nodes: ['RUST_MODULE'],
35
+ edges: ['CONTAINS']
36
+ }
37
+ };
38
+ }
39
+
40
+ /**
41
+ * Check if file is a test file based on path patterns
42
+ */
43
+ private isTestFile(filePath: string): boolean {
44
+ return this.testPatterns.some(pattern => pattern.test(filePath));
45
+ }
46
+
47
+ /**
48
+ * Recursively find all .rs files in a directory
49
+ */
50
+ private findRustFiles(dir: string, files: string[] = []): string[] {
51
+ try {
52
+ const entries = readdirSync(dir);
53
+ for (const entry of entries) {
54
+ // Skip target directory
55
+ if (entry === 'target') continue;
56
+
57
+ const fullPath = join(dir, entry);
58
+ try {
59
+ const stat = statSync(fullPath);
60
+ if (stat.isDirectory()) {
61
+ this.findRustFiles(fullPath, files);
62
+ } else if (entry.endsWith('.rs')) {
63
+ files.push(fullPath);
64
+ }
65
+ } catch {
66
+ // Skip files we can't stat
67
+ }
68
+ }
69
+ } catch {
70
+ // Skip directories we can't read
71
+ }
72
+ return files;
73
+ }
74
+
75
+ /**
76
+ * Convert file path to Rust module name
77
+ * src/ffi/napi_bindings.rs -> ffi::napi_bindings
78
+ * src/lib.rs -> crate
79
+ * src/ffi/mod.rs -> ffi
80
+ */
81
+ private pathToModuleName(relativePath: string): string {
82
+ let name = relativePath
83
+ .replace(/\.rs$/, '')
84
+ .replace(/\//g, '::');
85
+
86
+ if (name.endsWith('::mod')) {
87
+ name = name.replace(/::mod$/, '');
88
+ }
89
+ if (name === 'lib') {
90
+ name = 'crate';
91
+ }
92
+ return name;
93
+ }
94
+
95
+ async execute(context: PluginContext): Promise<PluginResult> {
96
+ const { manifest, graph, onProgress } = context;
97
+ // Cast manifest to expected shape
98
+ const typedManifest = manifest as { projectPath: string } | undefined;
99
+ const { projectPath } = typedManifest!;
100
+
101
+ // Find rust-engine/src directory
102
+ const rustRoot = resolve(projectPath, 'rust-engine/src');
103
+
104
+ if (!existsSync(rustRoot)) {
105
+ console.log('[RustModuleIndexer] rust-engine/src not found, skipping');
106
+ return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true });
107
+ }
108
+
109
+ // Discover all .rs files recursively
110
+ const rsFiles = this.findRustFiles(rustRoot);
111
+
112
+ console.log(`[RustModuleIndexer] Found ${rsFiles.length} .rs files`);
113
+
114
+ let nodesCreated = 0;
115
+ const errors: Array<{ file: string; error: string }> = [];
116
+
117
+ for (const filePath of rsFiles) {
118
+ try {
119
+ const content = readFileSync(filePath, 'utf-8');
120
+ const hash = createHash('sha256').update(content).digest('hex');
121
+ const relativePath = relative(rustRoot, filePath);
122
+ const moduleName = this.pathToModuleName(relativePath);
123
+
124
+ const nodeId = `RUST_MODULE#${moduleName}#${filePath}`;
125
+
126
+ await graph.addNode({
127
+ id: nodeId,
128
+ type: 'RUST_MODULE',
129
+ name: moduleName,
130
+ file: filePath,
131
+ contentHash: hash,
132
+ isLib: basename(filePath) === 'lib.rs',
133
+ isMod: basename(filePath) === 'mod.rs',
134
+ isTest: this.isTestFile(filePath)
135
+ } as unknown as NodeRecord);
136
+
137
+ nodesCreated++;
138
+
139
+ if (onProgress && nodesCreated % 10 === 0) {
140
+ onProgress({
141
+ phase: 'indexing',
142
+ currentPlugin: 'RustModuleIndexer',
143
+ message: `Indexed ${nodesCreated}/${rsFiles.length} Rust modules`,
144
+ totalFiles: rsFiles.length,
145
+ processedFiles: nodesCreated
146
+ });
147
+ }
148
+ } catch (err) {
149
+ errors.push({ file: filePath, error: (err as Error).message });
150
+ }
151
+ }
152
+
153
+ if (errors.length > 0) {
154
+ console.warn(`[RustModuleIndexer] ${errors.length} errors during indexing`);
155
+ }
156
+
157
+ console.log(`[RustModuleIndexer] Indexed ${nodesCreated} Rust modules`);
158
+ return createSuccessResult({ nodes: nodesCreated, edges: 0 }, { errors: errors.length });
159
+ }
160
+ }
@@ -0,0 +1,230 @@
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
+
10
+ import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
11
+ import { join, basename } from 'path';
12
+ import type { NodeRecord } from '@grafema/types';
13
+
14
+ /**
15
+ * Context for ServiceDetector
16
+ */
17
+ interface DetectorContext {
18
+ projectPath: string;
19
+ graph: {
20
+ addNode(node: NodeRecord): Promise<void>;
21
+ };
22
+ }
23
+
24
+ /**
25
+ * Package.json structure (relevant fields)
26
+ */
27
+ interface PackageJson {
28
+ name?: string;
29
+ main?: string;
30
+ [key: string]: unknown;
31
+ }
32
+
33
+ /**
34
+ * Service info
35
+ */
36
+ interface ServiceInfo {
37
+ id: string;
38
+ name: string;
39
+ path: string;
40
+ packageJson: PackageJson | null;
41
+ entryPoint: string | null;
42
+ hasDockerfile: boolean;
43
+ }
44
+
45
+ export class ServiceDetector {
46
+ name: string;
47
+ phase: string;
48
+ priority: number;
49
+
50
+ constructor() {
51
+ this.name = 'ServiceDetector';
52
+ this.phase = 'INDEXING';
53
+ this.priority = 90; // Запускается перед JSModuleIndexer
54
+ }
55
+
56
+ /**
57
+ * Анализирует проект и создаёт SERVICE ноды
58
+ */
59
+ async analyze(context: DetectorContext): Promise<DetectorContext> {
60
+ const { projectPath, graph } = context;
61
+ const services: ServiceInfo[] = [];
62
+
63
+ console.log(`[${this.name}] Detecting services in: ${projectPath}`);
64
+
65
+ // Паттерн 1: Монорепо структура (apps/, packages/, services/)
66
+ const monorepoPatterns = ['apps', 'packages', 'services'];
67
+
68
+ for (const pattern of monorepoPatterns) {
69
+ const monorepoDir = join(projectPath, pattern);
70
+
71
+ if (existsSync(monorepoDir)) {
72
+ const detected = this.detectServicesInDir(monorepoDir, projectPath);
73
+ services.push(...detected);
74
+ }
75
+ }
76
+
77
+ // Паттерн 2: Корневой проект (если нет монорепо)
78
+ if (services.length === 0) {
79
+ const rootService = this.detectRootService(projectPath);
80
+ if (rootService) {
81
+ services.push(rootService);
82
+ }
83
+ }
84
+
85
+ // Создаём SERVICE ноды в графе
86
+ for (const service of services) {
87
+ await graph.addNode({
88
+ id: service.id,
89
+ type: 'SERVICE',
90
+ name: service.name,
91
+ file: service.path,
92
+ metadata: {
93
+ packageJson: service.packageJson,
94
+ entryPoint: service.entryPoint,
95
+ hasDockerfile: service.hasDockerfile
96
+ }
97
+ } as unknown as NodeRecord);
98
+ }
99
+
100
+ console.log(`[${this.name}] Detected ${services.length} services`);
101
+ services.forEach(s => console.log(` - ${s.name} (${s.path})`));
102
+
103
+ return context;
104
+ }
105
+
106
+ /**
107
+ * Обнаруживает сервисы в директории монорепо
108
+ */
109
+ private detectServicesInDir(dir: string, projectPath: string): ServiceInfo[] {
110
+ const services: ServiceInfo[] = [];
111
+
112
+ try {
113
+ const entries = readdirSync(dir);
114
+
115
+ for (const entry of entries) {
116
+ const fullPath = join(dir, entry);
117
+
118
+ // Пропускаем файлы и скрытые директории
119
+ if (!statSync(fullPath).isDirectory() || entry.startsWith('.')) {
120
+ continue;
121
+ }
122
+
123
+ // Проверяем признаки сервиса
124
+ const packageJsonPath = join(fullPath, 'package.json');
125
+ const hasPackageJson = existsSync(packageJsonPath);
126
+
127
+ if (hasPackageJson) {
128
+ const service = this.createServiceFromDir(fullPath, entry, projectPath);
129
+ if (service) {
130
+ services.push(service);
131
+ }
132
+ }
133
+ }
134
+ } catch (error) {
135
+ console.warn(`[${this.name}] Error scanning ${dir}:`, (error as Error).message);
136
+ }
137
+
138
+ return services;
139
+ }
140
+
141
+ /**
142
+ * Обнаруживает корневой сервис (не монорепо)
143
+ */
144
+ private detectRootService(projectPath: string): ServiceInfo | null {
145
+ const packageJsonPath = join(projectPath, 'package.json');
146
+
147
+ if (!existsSync(packageJsonPath)) {
148
+ return null;
149
+ }
150
+
151
+ const projectName = basename(projectPath);
152
+ return this.createServiceFromDir(projectPath, projectName, projectPath);
153
+ }
154
+
155
+ /**
156
+ * Создаёт объект сервиса из директории
157
+ */
158
+ private createServiceFromDir(
159
+ servicePath: string,
160
+ serviceName: string,
161
+ projectPath: string
162
+ ): ServiceInfo | null {
163
+ try {
164
+ const packageJsonPath = join(servicePath, 'package.json');
165
+ let packageJson: PackageJson | null = null;
166
+
167
+ if (existsSync(packageJsonPath)) {
168
+ const content = readFileSync(packageJsonPath, 'utf-8');
169
+ packageJson = JSON.parse(content) as PackageJson;
170
+ }
171
+
172
+ // Определяем entry point
173
+ const entryPoint = this.findEntryPoint(servicePath, packageJson);
174
+
175
+ // Проверяем наличие Dockerfile
176
+ const hasDockerfile = existsSync(join(servicePath, 'Dockerfile')) ||
177
+ existsSync(join(servicePath, 'dockerfile'));
178
+
179
+ // Генерируем ID сервиса
180
+ const relativePath = servicePath.replace(projectPath, '').replace(/^\//, '');
181
+ const serviceId = `SERVICE:${relativePath || serviceName}`;
182
+
183
+ return {
184
+ id: serviceId,
185
+ name: packageJson?.name || serviceName,
186
+ path: servicePath,
187
+ packageJson,
188
+ entryPoint,
189
+ hasDockerfile
190
+ };
191
+ } catch (error) {
192
+ console.warn(`[${this.name}] Error creating service from ${servicePath}:`, (error as Error).message);
193
+ return null;
194
+ }
195
+ }
196
+
197
+ /**
198
+ * Находит entry point сервиса
199
+ */
200
+ private findEntryPoint(servicePath: string, packageJson: PackageJson | null): string | null {
201
+ // 1. Из package.json main
202
+ if (packageJson?.main) {
203
+ return packageJson.main;
204
+ }
205
+
206
+ // 2. Стандартные entry points
207
+ const candidates = [
208
+ 'src/index.js',
209
+ 'src/index.ts',
210
+ 'src/server.js',
211
+ 'src/server.ts',
212
+ 'src/main.js',
213
+ 'src/main.ts',
214
+ 'index.js',
215
+ 'index.ts',
216
+ 'server.js',
217
+ 'server.ts',
218
+ 'app.js',
219
+ 'app.ts'
220
+ ];
221
+
222
+ for (const candidate of candidates) {
223
+ if (existsSync(join(servicePath, candidate))) {
224
+ return candidate;
225
+ }
226
+ }
227
+
228
+ return null;
229
+ }
230
+ }
@@ -0,0 +1,170 @@
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
+
14
+ import { Plugin, createSuccessResult } from '../Plugin.js';
15
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
16
+ import type { NodeRecord } from '@grafema/types';
17
+
18
+ /**
19
+ * Call resolver issue
20
+ */
21
+ interface CallResolverIssue {
22
+ type: string;
23
+ severity: string;
24
+ message: string;
25
+ callName: string;
26
+ nodeId: string;
27
+ file?: string;
28
+ line?: number;
29
+ }
30
+
31
+ /**
32
+ * Method call statistics
33
+ */
34
+ interface MethodCallStats {
35
+ total: number;
36
+ resolved: number;
37
+ external: number;
38
+ }
39
+
40
+ /**
41
+ * Validation summary
42
+ */
43
+ interface ValidationSummary {
44
+ totalCalls: number;
45
+ resolvedInternalCalls: number;
46
+ unresolvedInternalCalls: number;
47
+ externalMethodCalls: number;
48
+ issues: number;
49
+ }
50
+
51
+ /**
52
+ * Datalog violation result
53
+ */
54
+ interface DatalogViolation {
55
+ bindings: Array<{ name: string; value: string }>;
56
+ }
57
+
58
+ export class CallResolverValidator extends Plugin {
59
+ get metadata(): PluginMetadata {
60
+ return {
61
+ name: 'CallResolverValidator',
62
+ phase: 'VALIDATION',
63
+ priority: 90,
64
+ creates: {
65
+ nodes: [],
66
+ edges: []
67
+ }
68
+ };
69
+ }
70
+
71
+ async execute(context: PluginContext): Promise<PluginResult> {
72
+ const { graph } = context;
73
+
74
+ console.log('[CallResolverValidator] Starting call resolution validation using Datalog...');
75
+
76
+ // Check if graph supports checkGuarantee
77
+ if (!graph.checkGuarantee) {
78
+ console.log('[CallResolverValidator] Graph does not support checkGuarantee, skipping validation');
79
+ return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true });
80
+ }
81
+
82
+ // Datalog гарантия:
83
+ // CALL без "object" (т.е. CALL_SITE) должен иметь CALLS ребро
84
+ const violations = await graph.checkGuarantee(`
85
+ violation(X) :- node(X, "CALL"), \\+ attr(X, "object", _), \\+ edge(X, _, "CALLS").
86
+ `) as DatalogViolation[];
87
+
88
+ const issues: CallResolverIssue[] = [];
89
+
90
+ if (violations.length > 0) {
91
+ console.log(`[CallResolverValidator] Found ${violations.length} unresolved function calls`);
92
+
93
+ for (const v of violations) {
94
+ const nodeId = v.bindings.find(b => b.name === 'X')?.value;
95
+ if (nodeId) {
96
+ const node = await graph.getNode(nodeId);
97
+ if (node) {
98
+ issues.push({
99
+ type: 'UNRESOLVED_FUNCTION_CALL',
100
+ severity: 'WARNING',
101
+ message: `Call to "${node.name}" at ${node.file}:${node.line || '?'} does not resolve to a function definition`,
102
+ callName: node.name as string,
103
+ nodeId: nodeId,
104
+ file: node.file,
105
+ line: node.line as number | undefined
106
+ });
107
+ }
108
+ }
109
+ }
110
+ }
111
+
112
+ // Также проверим METHOD_CALL на известные внешние методы
113
+ // (это информационно, не ошибка)
114
+ const methodCallStats = await this.countMethodCalls(graph);
115
+
116
+ const summary: ValidationSummary = {
117
+ totalCalls: methodCallStats.total,
118
+ resolvedInternalCalls: methodCallStats.resolved,
119
+ unresolvedInternalCalls: issues.length,
120
+ externalMethodCalls: methodCallStats.external,
121
+ issues: issues.length
122
+ };
123
+
124
+ console.log('[CallResolverValidator] Summary:', summary);
125
+
126
+ if (issues.length > 0) {
127
+ console.log(`[CallResolverValidator] Unresolved calls:`);
128
+ for (const issue of issues.slice(0, 10)) { // Show first 10
129
+ console.log(` ⚠️ ${issue.message}`);
130
+ }
131
+ if (issues.length > 10) {
132
+ console.log(` ... and ${issues.length - 10} more`);
133
+ }
134
+ }
135
+
136
+ return createSuccessResult(
137
+ { nodes: 0, edges: 0 },
138
+ { summary, issues }
139
+ );
140
+ }
141
+
142
+ /**
143
+ * Подсчитывает статистику по вызовам
144
+ */
145
+ private async countMethodCalls(graph: PluginContext['graph']): Promise<MethodCallStats> {
146
+ const stats: MethodCallStats = {
147
+ total: 0,
148
+ resolved: 0,
149
+ external: 0
150
+ };
151
+
152
+ // Подсчитываем все CALL узлы
153
+ for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
154
+ stats.total++;
155
+
156
+ // Проверяем наличие "object" в метаданных (METHOD_CALL)
157
+ if ((node as NodeRecord & { object?: string }).object) {
158
+ stats.external++;
159
+ } else {
160
+ // CALL_SITE - проверяем есть ли CALLS ребро
161
+ const edges = await graph.getOutgoingEdges(node.id, ['CALLS']);
162
+ if (edges.length > 0) {
163
+ stats.resolved++;
164
+ }
165
+ }
166
+ }
167
+
168
+ return stats;
169
+ }
170
+ }