@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,233 @@
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
+
15
+ import { Plugin, createSuccessResult } from '../Plugin.js';
16
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
17
+ import type { NodeRecord } from '@grafema/types';
18
+
19
+ /**
20
+ * Edge structure
21
+ */
22
+ interface EdgeRecord {
23
+ type: string;
24
+ src: string;
25
+ dst: string;
26
+ [key: string]: unknown;
27
+ }
28
+
29
+ /**
30
+ * Data flow issue
31
+ */
32
+ interface DataFlowIssue {
33
+ type: string;
34
+ severity: string;
35
+ message: string;
36
+ variable: string;
37
+ file?: string;
38
+ line?: number;
39
+ chain?: string[];
40
+ }
41
+
42
+ /**
43
+ * Path finding result
44
+ */
45
+ interface PathResult {
46
+ found: boolean;
47
+ chain: string[];
48
+ }
49
+
50
+ /**
51
+ * Validation summary
52
+ */
53
+ interface ValidationSummary {
54
+ total: number;
55
+ validated: number;
56
+ issues: number;
57
+ byType: Record<string, number>;
58
+ }
59
+
60
+ export class DataFlowValidator extends Plugin {
61
+ get metadata(): PluginMetadata {
62
+ return {
63
+ name: 'DataFlowValidator',
64
+ phase: 'VALIDATION',
65
+ priority: 100,
66
+ creates: {
67
+ nodes: [],
68
+ edges: []
69
+ }
70
+ };
71
+ }
72
+
73
+ async execute(context: PluginContext): Promise<PluginResult> {
74
+ const { graph } = context;
75
+
76
+ console.log('[DataFlowValidator] Starting data flow validation...');
77
+
78
+ // Check if graph supports getAllEdges
79
+ if (!graph.getAllEdges) {
80
+ console.log('[DataFlowValidator] Graph does not support getAllEdges, skipping validation');
81
+ return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true });
82
+ }
83
+
84
+ // Получаем все переменные
85
+ const allNodes = await graph.getAllNodes();
86
+ const allEdges = await graph.getAllEdges() as EdgeRecord[];
87
+
88
+ const variables = allNodes.filter(n =>
89
+ n.type === 'VARIABLE_DECLARATION' || n.type === 'CONSTANT'
90
+ );
91
+
92
+ console.log(`[DataFlowValidator] Found ${variables.length} variables to validate`);
93
+
94
+ const issues: DataFlowIssue[] = [];
95
+ const leafTypes = new Set([
96
+ 'LITERAL',
97
+ 'EXTERNAL_STDIO',
98
+ 'EXTERNAL_DATABASE',
99
+ 'EXTERNAL_NETWORK',
100
+ 'EXTERNAL_FILESYSTEM',
101
+ 'EVENT_LISTENER',
102
+ 'CLASS', // NewExpression - конструкторы классов
103
+ 'FUNCTION', // Arrow functions и function expressions
104
+ 'METHOD_CALL', // Вызовы методов (промежуточные узлы)
105
+ 'CALL_SITE' // Вызовы функций (промежуточные узлы)
106
+ ]);
107
+
108
+ for (const variable of variables) {
109
+ // Проверяем наличие ASSIGNED_FROM ребра
110
+ const assignment = allEdges.find(e =>
111
+ e.type === 'ASSIGNED_FROM' && e.src === variable.id
112
+ );
113
+
114
+ if (!assignment) {
115
+ issues.push({
116
+ type: 'MISSING_ASSIGNMENT',
117
+ severity: 'WARNING',
118
+ message: `Variable "${variable.name}" (${variable.file}:${variable.line}) has no ASSIGNED_FROM edge`,
119
+ variable: variable.name as string,
120
+ file: variable.file,
121
+ line: variable.line as number | undefined
122
+ });
123
+ continue;
124
+ }
125
+
126
+ // Проверяем что источник существует
127
+ const source = allNodes.find(n => n.id === assignment.dst);
128
+ if (!source) {
129
+ issues.push({
130
+ type: 'BROKEN_REFERENCE',
131
+ severity: 'ERROR',
132
+ message: `Variable "${variable.name}" references non-existent node ${assignment.dst}`,
133
+ variable: variable.name as string,
134
+ file: variable.file,
135
+ line: variable.line as number | undefined
136
+ });
137
+ continue;
138
+ }
139
+
140
+ // Проверяем путь до листового узла
141
+ const path = this.findPathToLeaf(variable, allNodes, allEdges, leafTypes);
142
+ if (!path.found) {
143
+ issues.push({
144
+ type: 'NO_LEAF_NODE',
145
+ severity: 'WARNING',
146
+ message: `Variable "${variable.name}" (${variable.file}:${variable.line}) does not trace to a leaf node. Chain: ${path.chain.join(' -> ')}`,
147
+ variable: variable.name as string,
148
+ file: variable.file,
149
+ line: variable.line as number | undefined,
150
+ chain: path.chain
151
+ });
152
+ }
153
+ }
154
+
155
+ // Группируем issues по типу
156
+ const summary: ValidationSummary = {
157
+ total: variables.length,
158
+ validated: variables.length - issues.length,
159
+ issues: issues.length,
160
+ byType: {}
161
+ };
162
+
163
+ for (const issue of issues) {
164
+ if (!summary.byType[issue.type]) {
165
+ summary.byType[issue.type] = 0;
166
+ }
167
+ summary.byType[issue.type]++;
168
+ }
169
+
170
+ console.log('[DataFlowValidator] Summary:', summary);
171
+
172
+ // Выводим issues
173
+ if (issues.length > 0) {
174
+ console.log(`[DataFlowValidator] Found ${issues.length} issues:`);
175
+ for (const issue of issues) {
176
+ const level = issue.severity === 'ERROR' ? '❌' : '⚠️';
177
+ console.log(` ${level} [${issue.type}] ${issue.message}`);
178
+ }
179
+ }
180
+
181
+ return createSuccessResult(
182
+ { nodes: 0, edges: 0 },
183
+ { summary, issues }
184
+ );
185
+ }
186
+
187
+ /**
188
+ * Находит путь от переменной до листового узла
189
+ */
190
+ private findPathToLeaf(
191
+ startNode: NodeRecord,
192
+ allNodes: NodeRecord[],
193
+ allEdges: EdgeRecord[],
194
+ leafTypes: Set<string>,
195
+ visited: Set<string> = new Set(),
196
+ chain: string[] = []
197
+ ): PathResult {
198
+ // Защита от циклов
199
+ if (visited.has(startNode.id)) {
200
+ return { found: false, chain: [...chain, `${startNode.type}:${startNode.name} (CYCLE)`] };
201
+ }
202
+
203
+ visited.add(startNode.id);
204
+ chain.push(`${startNode.type}:${startNode.name}`);
205
+
206
+ // Проверяем что это листовой узел
207
+ if (leafTypes.has(startNode.type)) {
208
+ return { found: true, chain };
209
+ }
210
+
211
+ // Ищем ASSIGNED_FROM ребро
212
+ const assignment = allEdges.find(e =>
213
+ e.type === 'ASSIGNED_FROM' && e.src === startNode.id
214
+ );
215
+
216
+ if (!assignment) {
217
+ // Для METHOD_CALL и CALL_SITE - это промежуточные узлы, но можем считать их leaf для первой версии
218
+ if (startNode.type === 'METHOD_CALL' || startNode.type === 'CALL_SITE') {
219
+ return { found: true, chain: [...chain, '(intermediate node)'] };
220
+ }
221
+
222
+ return { found: false, chain: [...chain, '(no assignment)'] };
223
+ }
224
+
225
+ // Продолжаем по цепочке
226
+ const nextNode = allNodes.find(n => n.id === assignment.dst);
227
+ if (!nextNode) {
228
+ return { found: false, chain: [...chain, '(broken reference)'] };
229
+ }
230
+
231
+ return this.findPathToLeaf(nextNode, allNodes, allEdges, leafTypes, visited, chain);
232
+ }
233
+ }
@@ -0,0 +1,175 @@
1
+ /**
2
+ * EvalBanValidator - запрещает использование eval и Function
3
+ *
4
+ * Security инвариант: код не должен использовать динамическое выполнение.
5
+ *
6
+ * Детектирует:
7
+ * - eval("code") - прямой вызов eval
8
+ * - new Function("code") - конструктор Function
9
+ * - Function("code") - вызов Function без new
10
+ * - window.eval("code") - eval через window
11
+ * - globalThis.eval("code") - eval через globalThis
12
+ * - Aliased eval: const e = eval; e("code") - через AliasTracker
13
+ *
14
+ * ПРАВИЛА (Datalog):
15
+ * violation(X) :- node(X, "CALL"), attr(X, "name", "eval").
16
+ * violation(X) :- node(X, "CALL"), attr(X, "name", "Function").
17
+ * violation(X) :- node(X, "CALL"), attr(X, "method", "eval").
18
+ */
19
+
20
+ import { Plugin, createSuccessResult } from '../Plugin.js';
21
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
22
+ import type { BaseNodeRecord } from '@grafema/types';
23
+
24
+ /**
25
+ * Eval ban issue
26
+ */
27
+ interface EvalBanIssue {
28
+ type: string;
29
+ severity: string;
30
+ message: string;
31
+ nodeId: string;
32
+ file?: string;
33
+ line?: number;
34
+ object?: string;
35
+ }
36
+
37
+ /**
38
+ * Extended node with call properties
39
+ */
40
+ interface CallNode extends BaseNodeRecord {
41
+ method?: string;
42
+ object?: string;
43
+ }
44
+
45
+ /**
46
+ * Validation summary
47
+ */
48
+ interface ValidationSummary {
49
+ evalCalls: number;
50
+ functionCalls: number;
51
+ methodEvalCalls: number;
52
+ aliasedEvalCalls: number;
53
+ totalViolations: number;
54
+ timeSeconds: string;
55
+ }
56
+
57
+ export class EvalBanValidator extends Plugin {
58
+ get metadata(): PluginMetadata {
59
+ return {
60
+ name: 'EvalBanValidator',
61
+ phase: 'VALIDATION',
62
+ priority: 95, // Высокий приоритет - security check
63
+ creates: {
64
+ nodes: [],
65
+ edges: []
66
+ }
67
+ };
68
+ }
69
+
70
+ async execute(context: PluginContext): Promise<PluginResult> {
71
+ const { graph } = context;
72
+
73
+ console.log('[EvalBanValidator] Checking for eval/Function usage...');
74
+ const startTime = Date.now();
75
+
76
+ const issues: EvalBanIssue[] = [];
77
+
78
+ // ОПТИМИЗАЦИЯ: вместо Datalog (медленный full scan), используем прямые graph queries
79
+ // Datalog зависает на больших графах из-за отсутствия индексов
80
+
81
+ // 1. Прямой вызов eval("code") - ищем все CALL ноды с name="eval"
82
+ console.log('[EvalBanValidator] Searching for eval() calls...');
83
+ const evalStart = Date.now();
84
+ let evalCount = 0;
85
+
86
+ for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
87
+ if (node.name === 'eval') {
88
+ evalCount++;
89
+ issues.push({
90
+ type: 'EVAL_USAGE',
91
+ severity: 'ERROR',
92
+ message: `Direct eval() call at ${node.file}:${node.line || '?'} - dynamic code execution is forbidden`,
93
+ nodeId: node.id,
94
+ file: node.file,
95
+ line: node.line as number | undefined
96
+ });
97
+ }
98
+ }
99
+ console.log(`[EvalBanValidator] eval() search took ${Date.now() - evalStart}ms, found ${evalCount} violations`);
100
+
101
+ // 2. Вызов Function("code") или new Function("code")
102
+ console.log('[EvalBanValidator] Searching for Function() calls...');
103
+ const funcStart = Date.now();
104
+ let funcCount = 0;
105
+
106
+ for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
107
+ if (node.name === 'Function') {
108
+ funcCount++;
109
+ issues.push({
110
+ type: 'FUNCTION_CONSTRUCTOR',
111
+ severity: 'ERROR',
112
+ message: `Function() constructor at ${node.file}:${node.line || '?'} - dynamic code execution is forbidden`,
113
+ nodeId: node.id,
114
+ file: node.file,
115
+ line: node.line as number | undefined
116
+ });
117
+ }
118
+ }
119
+ console.log(`[EvalBanValidator] Function() search took ${Date.now() - funcStart}ms, found ${funcCount} violations`);
120
+
121
+ // 3. Method call: window.eval, globalThis.eval, this.eval
122
+ // Note: METHOD_CALL was merged into CALL - method calls have 'method' attribute
123
+ console.log('[EvalBanValidator] Searching for method eval() calls...');
124
+ const methodStart = Date.now();
125
+ let methodCount = 0;
126
+
127
+ for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
128
+ const callNode = node as CallNode;
129
+ // Method calls have 'method' attribute (e.g., window.eval())
130
+ if (callNode.method === 'eval' && callNode.object) {
131
+ methodCount++;
132
+ const objectName = callNode.object;
133
+ issues.push({
134
+ type: 'EVAL_METHOD',
135
+ severity: 'ERROR',
136
+ message: `${objectName}.eval() call at ${node.file}:${node.line || '?'} - dynamic code execution is forbidden`,
137
+ nodeId: node.id,
138
+ file: node.file,
139
+ line: node.line as number | undefined,
140
+ object: objectName
141
+ });
142
+ }
143
+ }
144
+ console.log(`[EvalBanValidator] method eval() search took ${Date.now() - methodStart}ms, found ${methodCount} violations`);
145
+
146
+ // 4. Aliased eval - SKIP for now (complex Datalog query causes OOM)
147
+ console.log('[EvalBanValidator] Skipping aliased eval detection (requires optimized implementation)');
148
+
149
+ const totalTime = ((Date.now() - startTime) / 1000).toFixed(1);
150
+ const summary: ValidationSummary = {
151
+ evalCalls: evalCount,
152
+ functionCalls: funcCount,
153
+ methodEvalCalls: methodCount,
154
+ aliasedEvalCalls: 0, // Skipped for now
155
+ totalViolations: issues.length,
156
+ timeSeconds: totalTime
157
+ };
158
+
159
+ console.log('[EvalBanValidator] Summary:', summary);
160
+
161
+ if (issues.length > 0) {
162
+ console.log('[EvalBanValidator] ❌ Security violations found:');
163
+ for (const issue of issues) {
164
+ console.log(` 🚫 ${issue.message}`);
165
+ }
166
+ } else {
167
+ console.log('[EvalBanValidator] ✅ No eval/Function usage detected');
168
+ }
169
+
170
+ return createSuccessResult(
171
+ { nodes: 0, edges: 0 }, // created - validator doesn't create nodes/edges
172
+ { summary, issues } // metadata
173
+ );
174
+ }
175
+ }
@@ -0,0 +1,201 @@
1
+ /**
2
+ * GraphConnectivityValidator - проверяет что все узлы связаны с корневыми узлами
3
+ * Находит "островки" - узлы которые не имеют путей до SERVICE/MODULE
4
+ */
5
+
6
+ import { Plugin, createSuccessResult } from '../Plugin.js';
7
+ import type { PluginContext, PluginMetadata, PluginResult } from '../Plugin.js';
8
+ import type { NodeRecord } from '@grafema/types';
9
+
10
+ /**
11
+ * Edge structure
12
+ */
13
+ interface EdgeRecord {
14
+ src: string;
15
+ dst: string;
16
+ [key: string]: unknown;
17
+ }
18
+
19
+ /**
20
+ * Unreachable node info for manifest
21
+ */
22
+ interface UnreachableNodeInfo {
23
+ id: string;
24
+ type: string;
25
+ name?: string;
26
+ }
27
+
28
+ /**
29
+ * Validation result in manifest
30
+ */
31
+ interface ValidationResult {
32
+ unreachableNodes?: UnreachableNodeInfo[];
33
+ hasErrors: boolean;
34
+ totalNodes: number;
35
+ reachableNodes: number;
36
+ unreachableCount?: number;
37
+ unreachableByType?: Record<string, number>;
38
+ }
39
+
40
+ /**
41
+ * Extended manifest with validation field
42
+ */
43
+ interface ManifestWithValidation {
44
+ validation?: ValidationResult;
45
+ [key: string]: unknown;
46
+ }
47
+
48
+ export class GraphConnectivityValidator extends Plugin {
49
+ get metadata(): PluginMetadata {
50
+ return {
51
+ name: 'GraphConnectivityValidator',
52
+ phase: 'VALIDATION',
53
+ priority: 100,
54
+ creates: {
55
+ nodes: [],
56
+ edges: []
57
+ }
58
+ };
59
+ }
60
+
61
+ async execute(context: PluginContext): Promise<PluginResult> {
62
+ const { graph, manifest } = context;
63
+ const manifestWithValidation = manifest as ManifestWithValidation;
64
+
65
+ console.log('[GraphConnectivityValidator] Starting connectivity validation...');
66
+
67
+ // Получаем все узлы
68
+ const allNodes = await graph.getAllNodes();
69
+ console.log(`[GraphConnectivityValidator] Total nodes: ${allNodes.length}`);
70
+
71
+ // Находим корневые узлы (SERVICE, MODULE)
72
+ const rootTypes = ['SERVICE', 'MODULE', 'PROJECT'];
73
+ const rootNodes = allNodes.filter(n => rootTypes.includes(n.type));
74
+ console.log(`[GraphConnectivityValidator] Root nodes: ${rootNodes.length}`);
75
+
76
+ if (rootNodes.length === 0) {
77
+ console.warn('[GraphConnectivityValidator] No root nodes found!');
78
+ return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true, reason: 'No root nodes' });
79
+ }
80
+
81
+ // Check if graph supports getAllEdges
82
+ if (!graph.getAllEdges) {
83
+ console.log('[GraphConnectivityValidator] Graph does not support getAllEdges, skipping validation');
84
+ return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true, reason: 'No getAllEdges support' });
85
+ }
86
+
87
+ // Собираем все ребра
88
+ const allEdges = await graph.getAllEdges();
89
+ console.log(`[GraphConnectivityValidator] Total edges: ${allEdges.length}`);
90
+
91
+ // Строим карты смежности (обе направления)
92
+ const adjacencyOut = new Map<string, string[]>(); // nodeId -> [targetIds]
93
+ const adjacencyIn = new Map<string, string[]>(); // nodeId -> [sourceIds]
94
+
95
+ for (const edge of allEdges) {
96
+ // Outgoing edges
97
+ if (!adjacencyOut.has(edge.src)) {
98
+ adjacencyOut.set(edge.src, []);
99
+ }
100
+ adjacencyOut.get(edge.src)!.push(edge.dst);
101
+
102
+ // Incoming edges
103
+ if (!adjacencyIn.has(edge.dst)) {
104
+ adjacencyIn.set(edge.dst, []);
105
+ }
106
+ adjacencyIn.get(edge.dst)!.push(edge.src);
107
+ }
108
+
109
+ // BFS от корневых узлов для поиска достижимых узлов
110
+ const reachable = new Set<string>();
111
+ const queue: string[] = [...rootNodes.map(n => n.id)];
112
+
113
+ while (queue.length > 0) {
114
+ const nodeId = queue.shift()!;
115
+
116
+ if (reachable.has(nodeId)) continue;
117
+ reachable.add(nodeId);
118
+
119
+ // Добавляем все связанные узлы (в обоих направлениях)
120
+ const outgoing = adjacencyOut.get(nodeId) || [];
121
+ const incoming = adjacencyIn.get(nodeId) || [];
122
+
123
+ for (const targetId of [...outgoing, ...incoming]) {
124
+ if (!reachable.has(targetId)) {
125
+ queue.push(targetId);
126
+ }
127
+ }
128
+ }
129
+
130
+ // Находим недостижимые узлы
131
+ const unreachable = allNodes.filter(n => !reachable.has(n.id));
132
+
133
+ if (unreachable.length > 0) {
134
+ // ЯРКОЕ ПРЕДУПРЕЖДЕНИЕ В КОНСОЛИ
135
+ console.error('\n' + '='.repeat(80));
136
+ console.error('⚠️ GRAPH VALIDATION ERROR: DISCONNECTED NODES FOUND');
137
+ console.error('='.repeat(80));
138
+ console.error(`Found ${unreachable.length} unreachable nodes (${((unreachable.length / allNodes.length) * 100).toFixed(1)}% of total)`);
139
+ console.error(`These nodes are not connected to the main graph (SERVICE/MODULE/PROJECT level)`);
140
+ console.error('');
141
+
142
+ // Группируем по типам для читаемости
143
+ const byType: Record<string, NodeRecord[]> = {};
144
+ for (const node of unreachable) {
145
+ if (!byType[node.type]) byType[node.type] = [];
146
+ byType[node.type].push(node);
147
+ }
148
+
149
+ for (const [type, nodes] of Object.entries(byType)) {
150
+ console.error(` ${type}: ${nodes.length} nodes`);
151
+ // Показываем первые 5 для каждого типа
152
+ for (const node of nodes.slice(0, 5)) {
153
+ console.error(` - ${node.name || node.id}`);
154
+
155
+ // Показываем связи этого узла
156
+ const out = adjacencyOut.get(node.id) || [];
157
+ const incoming = adjacencyIn.get(node.id) || [];
158
+ if (out.length > 0 || incoming.length > 0) {
159
+ console.error(` Edges: ${incoming.length} incoming, ${out.length} outgoing`);
160
+ }
161
+ }
162
+ if (nodes.length > 5) {
163
+ console.error(` ... and ${nodes.length - 5} more`);
164
+ }
165
+ }
166
+
167
+ console.error('');
168
+ console.error('💡 ACTION REQUIRED: Fix analysis plugins to ensure all nodes are connected');
169
+ console.error(' Anonymous functions, callbacks, and method calls should be linked to parent nodes');
170
+ console.error('='.repeat(80) + '\n');
171
+
172
+ // Сохраняем информацию в manifest для дальнейшего использования
173
+ if (!manifestWithValidation.validation) manifestWithValidation.validation = {} as ValidationResult;
174
+ manifestWithValidation.validation.unreachableNodes = unreachable.map(n => ({
175
+ id: n.id,
176
+ type: n.type,
177
+ name: n.name
178
+ }));
179
+ manifestWithValidation.validation.hasErrors = true;
180
+ manifestWithValidation.validation.totalNodes = allNodes.length;
181
+ manifestWithValidation.validation.reachableNodes = reachable.size;
182
+ manifestWithValidation.validation.unreachableCount = unreachable.length;
183
+ manifestWithValidation.validation.unreachableByType = Object.fromEntries(
184
+ Object.entries(byType).map(([type, nodes]) => [type, nodes.length])
185
+ );
186
+ } else {
187
+ console.log('[GraphConnectivityValidator] ✅ All nodes are reachable from root nodes');
188
+ if (!manifestWithValidation.validation) manifestWithValidation.validation = {} as ValidationResult;
189
+ manifestWithValidation.validation.hasErrors = false;
190
+ manifestWithValidation.validation.totalNodes = allNodes.length;
191
+ manifestWithValidation.validation.reachableNodes = reachable.size;
192
+ }
193
+
194
+ console.log(`[GraphConnectivityValidator] Validation complete: ${reachable.size}/${allNodes.length} nodes reachable`);
195
+
196
+ return createSuccessResult(
197
+ { nodes: 0, edges: 0 },
198
+ { totalNodes: allNodes.length, reachableNodes: reachable.size }
199
+ );
200
+ }
201
+ }