@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,673 @@
1
+ /**
2
+ * Orchestrator - управляет процессом анализа через фазы
3
+ * Полностью абстрактный - специфичная логика в плагинах
4
+ */
5
+
6
+ import { readFileSync, existsSync, unlinkSync } from 'fs';
7
+ import { join, dirname, resolve } from 'path';
8
+ import { fileURLToPath } from 'url';
9
+ import { spawn, execSync, ChildProcess } from 'child_process';
10
+ import { setTimeout as sleep } from 'timers/promises';
11
+ import { SimpleProjectDiscovery } from './plugins/discovery/SimpleProjectDiscovery.js';
12
+ import { Profiler } from './core/Profiler.js';
13
+ import { AnalysisQueue } from './core/AnalysisQueue.js';
14
+ import type { Plugin, PluginContext } from './plugins/Plugin.js';
15
+ import type { GraphBackend } from '@grafema/types';
16
+
17
+ /**
18
+ * Progress callback info
19
+ */
20
+ export interface ProgressInfo {
21
+ phase: string;
22
+ currentPlugin?: string;
23
+ message?: string;
24
+ totalFiles?: number;
25
+ processedFiles?: number;
26
+ servicesAnalyzed?: number;
27
+ }
28
+
29
+ /**
30
+ * Progress callback type
31
+ */
32
+ export type ProgressCallback = (info: ProgressInfo) => void;
33
+
34
+ /**
35
+ * Parallel analysis config
36
+ */
37
+ export interface ParallelConfig {
38
+ enabled: boolean;
39
+ socketPath?: string;
40
+ maxWorkers?: number;
41
+ }
42
+
43
+ /**
44
+ * Orchestrator options
45
+ */
46
+ export interface OrchestratorOptions {
47
+ graph?: GraphBackend;
48
+ plugins?: Plugin[];
49
+ workerCount?: number;
50
+ onProgress?: ProgressCallback;
51
+ forceAnalysis?: boolean;
52
+ serviceFilter?: string | null;
53
+ indexOnly?: boolean;
54
+ parallel?: ParallelConfig | null;
55
+ }
56
+
57
+ /**
58
+ * Service info from discovery
59
+ */
60
+ export interface ServiceInfo {
61
+ id: string;
62
+ name: string;
63
+ path?: string;
64
+ metadata?: {
65
+ entrypoint?: string;
66
+ [key: string]: unknown;
67
+ };
68
+ [key: string]: unknown;
69
+ }
70
+
71
+ /**
72
+ * Entrypoint info from discovery
73
+ */
74
+ export interface EntrypointInfo {
75
+ id: string;
76
+ name?: string;
77
+ file: string;
78
+ type?: string;
79
+ trigger?: string;
80
+ [key: string]: unknown;
81
+ }
82
+
83
+ /**
84
+ * Discovery manifest
85
+ */
86
+ export interface DiscoveryManifest {
87
+ services: ServiceInfo[];
88
+ entrypoints: EntrypointInfo[];
89
+ projectPath: string;
90
+ modules?: unknown[];
91
+ }
92
+
93
+ /**
94
+ * Indexing unit (service or entrypoint)
95
+ */
96
+ export interface IndexingUnit {
97
+ id: string;
98
+ name: string;
99
+ path: string;
100
+ type: 'service' | 'entrypoint';
101
+ entrypointType?: string;
102
+ trigger?: string;
103
+ [key: string]: unknown;
104
+ }
105
+
106
+ /**
107
+ * Unit manifest for indexing phase
108
+ */
109
+ interface UnitManifest {
110
+ projectPath: string;
111
+ service: {
112
+ id: string;
113
+ name: string;
114
+ path: string;
115
+ [key: string]: unknown;
116
+ };
117
+ modules: unknown[];
118
+ }
119
+
120
+ export class Orchestrator {
121
+ private graph: GraphBackend;
122
+ private config: OrchestratorOptions;
123
+ private plugins: Plugin[];
124
+ private workerCount: number;
125
+ private onProgress: ProgressCallback;
126
+ private forceAnalysis: boolean;
127
+ private serviceFilter: string | null;
128
+ private indexOnly: boolean;
129
+ private profiler: Profiler;
130
+ private parallelConfig: ParallelConfig | null;
131
+ private analysisQueue: AnalysisQueue | null;
132
+ private rfdbServerProcess: ChildProcess | null;
133
+ private _serverWasExternal: boolean;
134
+
135
+ constructor(options: OrchestratorOptions = {}) {
136
+ this.graph = options.graph!;
137
+ this.config = options;
138
+ this.plugins = options.plugins || [];
139
+ this.workerCount = options.workerCount || 10; // ГОРИЗОНТАЛЬНОЕ МАСШТАБИРОВАНИЕ
140
+ this.onProgress = options.onProgress || (() => {}); // Callback для прогресса
141
+ this.forceAnalysis = options.forceAnalysis || false; // Флаг для игнорирования кэша
142
+ this.serviceFilter = options.serviceFilter || null; // Фильтр для одного сервиса
143
+ this.indexOnly = options.indexOnly || false; // Только DISCOVERY + INDEXING (для coverage)
144
+ this.profiler = new Profiler('Orchestrator');
145
+
146
+ // Parallel/queue-based analysis config
147
+ this.parallelConfig = options.parallel || null;
148
+ this.analysisQueue = null;
149
+ this.rfdbServerProcess = null;
150
+ this._serverWasExternal = false;
151
+
152
+ // Auto-add default discovery if no discovery plugins provided
153
+ const hasDiscovery = this.plugins.some(p => p.metadata?.phase === 'DISCOVERY');
154
+ if (!hasDiscovery) {
155
+ this.plugins.unshift(new SimpleProjectDiscovery());
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Запустить анализ проекта
161
+ */
162
+ async run(projectPath: string): Promise<DiscoveryManifest> {
163
+ const totalStartTime = Date.now();
164
+
165
+ // Resolve to absolute path
166
+ const absoluteProjectPath = projectPath.startsWith('/') ? projectPath : resolve(projectPath);
167
+
168
+ this.onProgress({ phase: 'discovery', currentPlugin: 'Starting discovery...', message: 'Discovering services...', totalFiles: 0, processedFiles: 0 });
169
+
170
+ // PHASE 0: DISCOVERY - запуск плагинов фазы DISCOVERY
171
+ this.profiler.start('DISCOVERY');
172
+ const manifest = await this.discover(absoluteProjectPath);
173
+ this.profiler.end('DISCOVERY');
174
+
175
+ const epCount = manifest.entrypoints?.length || 0;
176
+ const svcCount = manifest.services?.length || 0;
177
+ this.onProgress({
178
+ phase: 'discovery',
179
+ currentPlugin: 'Discovery complete',
180
+ message: `Found ${svcCount} service(s), ${epCount} entrypoint(s)`,
181
+ totalFiles: 0,
182
+ processedFiles: 0
183
+ });
184
+ console.log(`[Orchestrator] Discovery: ${svcCount} services, ${epCount} entrypoints`);
185
+
186
+ // Build unified list of indexing units from services AND entrypoints
187
+ const indexingUnits = this.buildIndexingUnits(manifest);
188
+
189
+ // Filter if specified
190
+ let unitsToProcess: IndexingUnit[];
191
+ if (this.serviceFilter) {
192
+ unitsToProcess = indexingUnits.filter(u =>
193
+ u.name === this.serviceFilter ||
194
+ u.path === this.serviceFilter ||
195
+ u.name.includes(this.serviceFilter!) ||
196
+ u.path.includes(this.serviceFilter!)
197
+ );
198
+ console.log(`[Orchestrator] Filtering: ${this.serviceFilter} (found ${unitsToProcess.length} of ${indexingUnits.length})`);
199
+ } else {
200
+ unitsToProcess = indexingUnits;
201
+ }
202
+
203
+ console.log(`[Orchestrator] Processing ${unitsToProcess.length} indexing units (services + entrypoints)`);
204
+ console.log(`[Orchestrator] Strategy: Phase-by-phase with DFS dependency tree per entrypoint`);
205
+
206
+ // PHASE 1: INDEXING - каждый сервис строит своё дерево зависимостей от entrypoint
207
+ const indexingStart = Date.now();
208
+ this.profiler.start('INDEXING');
209
+ this.onProgress({
210
+ phase: 'indexing',
211
+ currentPlugin: 'Starting indexing...',
212
+ message: 'Building dependency trees...',
213
+ totalFiles: unitsToProcess.length,
214
+ processedFiles: 0
215
+ });
216
+
217
+ // Параллельная обработка units батчами
218
+ const BATCH_SIZE = this.workerCount;
219
+ let processedUnits = 0;
220
+
221
+ for (let batchStart = 0; batchStart < unitsToProcess.length; batchStart += BATCH_SIZE) {
222
+ const batch = unitsToProcess.slice(batchStart, batchStart + BATCH_SIZE);
223
+
224
+ this.onProgress({
225
+ phase: 'indexing',
226
+ currentPlugin: 'JSModuleIndexer',
227
+ message: `[${processedUnits + 1}-${processedUnits + batch.length}/${unitsToProcess.length}] Batch indexing...`,
228
+ totalFiles: unitsToProcess.length,
229
+ processedFiles: processedUnits
230
+ });
231
+
232
+ // Параллельно обрабатываем батч units
233
+ await Promise.all(batch.map(async (unit, idx) => {
234
+ const unitStart = Date.now();
235
+ const unitManifest: UnitManifest = {
236
+ projectPath: manifest.projectPath,
237
+ service: {
238
+ ...unit, // Pass all unit fields
239
+ id: unit.id,
240
+ name: unit.name,
241
+ path: unit.path
242
+ },
243
+ modules: []
244
+ };
245
+
246
+ await this.runPhase('INDEXING', { manifest: unitManifest, graph: this.graph, workerCount: 1 });
247
+ const unitTime = ((Date.now() - unitStart) / 1000).toFixed(2);
248
+ console.log(`[Orchestrator] ⏱️ INDEXING ${unit.name}: ${unitTime}s`);
249
+
250
+ this.onProgress({
251
+ phase: 'indexing',
252
+ currentPlugin: 'JSModuleIndexer',
253
+ message: `Indexed ${unit.name || unit.path} (${unitTime}s)`,
254
+ totalFiles: unitsToProcess.length,
255
+ processedFiles: processedUnits + idx + 1,
256
+ servicesAnalyzed: processedUnits + idx + 1
257
+ });
258
+ }));
259
+
260
+ processedUnits += batch.length;
261
+ }
262
+ this.profiler.end('INDEXING');
263
+ console.log(`[Orchestrator] ⏱️ INDEXING phase total: ${((Date.now() - indexingStart) / 1000).toFixed(2)}s`);
264
+
265
+ // Skip remaining phases if indexOnly mode (for coverage)
266
+ if (this.indexOnly) {
267
+ const totalTime = ((Date.now() - totalStartTime) / 1000).toFixed(2);
268
+ console.log(`[Orchestrator] ⏱️ indexOnly mode - skipping ANALYSIS/ENRICHMENT/VALIDATION`);
269
+ console.log(`[Orchestrator] ⏱️ Total time: ${totalTime}s for ${unitsToProcess.length} units`);
270
+ return manifest;
271
+ }
272
+
273
+ // PHASE 2: ANALYSIS - все units (параллельно батчами)
274
+ const analysisStart = Date.now();
275
+ this.profiler.start('ANALYSIS');
276
+ this.onProgress({
277
+ phase: 'analysis',
278
+ currentPlugin: 'Starting analysis...',
279
+ message: 'Analyzing all units...',
280
+ totalFiles: unitsToProcess.length,
281
+ processedFiles: 0
282
+ });
283
+
284
+ // Check if parallel analysis is enabled (new functionality under flag)
285
+ if (this.parallelConfig?.enabled) {
286
+ await this.runParallelAnalysis(manifest);
287
+ } else {
288
+ // BACKWARD COMPATIBLE: per-unit batch processing (как в JS baseline)
289
+ processedUnits = 0;
290
+
291
+ for (let batchStart = 0; batchStart < unitsToProcess.length; batchStart += BATCH_SIZE) {
292
+ const batch = unitsToProcess.slice(batchStart, batchStart + BATCH_SIZE);
293
+
294
+ this.onProgress({
295
+ phase: 'analysis',
296
+ currentPlugin: 'Analyzers',
297
+ message: `[${processedUnits + 1}-${processedUnits + batch.length}/${unitsToProcess.length}] Batch analyzing...`,
298
+ totalFiles: unitsToProcess.length,
299
+ processedFiles: processedUnits
300
+ });
301
+
302
+ // Параллельно анализируем батч units
303
+ await Promise.all(batch.map(async (unit, idx) => {
304
+ const unitStart = Date.now();
305
+ const unitManifest: UnitManifest = {
306
+ projectPath: manifest.projectPath,
307
+ service: {
308
+ ...unit,
309
+ id: unit.id,
310
+ name: unit.name,
311
+ path: unit.path
312
+ },
313
+ modules: []
314
+ };
315
+
316
+ await this.runPhase('ANALYSIS', { manifest: unitManifest, graph: this.graph, workerCount: 1 });
317
+ const unitTime = ((Date.now() - unitStart) / 1000).toFixed(2);
318
+ console.log(`[Orchestrator] ⏱️ ANALYSIS ${unit.name}: ${unitTime}s`);
319
+
320
+ this.onProgress({
321
+ phase: 'analysis',
322
+ currentPlugin: 'Analyzers',
323
+ message: `Analyzed ${unit.name || unit.path} (${unitTime}s)`,
324
+ totalFiles: unitsToProcess.length,
325
+ processedFiles: processedUnits + idx + 1,
326
+ servicesAnalyzed: processedUnits + idx + 1
327
+ });
328
+ }));
329
+
330
+ processedUnits += batch.length;
331
+ }
332
+ }
333
+
334
+ this.profiler.end('ANALYSIS');
335
+ console.log(`[Orchestrator] ⏱️ ANALYSIS phase total: ${((Date.now() - analysisStart) / 1000).toFixed(2)}s`);
336
+
337
+ // PHASE 3: ENRICHMENT - post-processing, граф traversal, вычисления (глобально)
338
+ const enrichmentStart = Date.now();
339
+ this.profiler.start('ENRICHMENT');
340
+ this.onProgress({ phase: 'enrichment', currentPlugin: 'Starting enrichment...', message: 'Enriching graph data...', totalFiles: 0, processedFiles: 0 });
341
+ await this.runPhase('ENRICHMENT', { manifest, graph: this.graph, workerCount: this.workerCount });
342
+ this.profiler.end('ENRICHMENT');
343
+ console.log(`[Orchestrator] ⏱️ ENRICHMENT phase: ${((Date.now() - enrichmentStart) / 1000).toFixed(2)}s`);
344
+
345
+ // PHASE 4: VALIDATION - проверка корректности графа (глобально)
346
+ const validationStart = Date.now();
347
+ this.profiler.start('VALIDATION');
348
+ this.onProgress({ phase: 'validation', currentPlugin: 'Starting validation...', message: 'Validating graph structure...', totalFiles: 0, processedFiles: 0 });
349
+ await this.runPhase('VALIDATION', { manifest, graph: this.graph, workerCount: this.workerCount });
350
+ this.profiler.end('VALIDATION');
351
+ console.log(`[Orchestrator] ⏱️ VALIDATION phase: ${((Date.now() - validationStart) / 1000).toFixed(2)}s`);
352
+
353
+ // Flush graph to ensure all edges are persisted and queryable
354
+ if (this.graph.flush) {
355
+ await this.graph.flush();
356
+ }
357
+
358
+ const totalTime = ((Date.now() - totalStartTime) / 1000).toFixed(2);
359
+ console.log(`[Orchestrator] ⏱️ Total time: ${totalTime}s for ${unitsToProcess.length} units`);
360
+
361
+ // Print profiling summary
362
+ this.profiler.printSummary();
363
+
364
+ return manifest;
365
+ }
366
+
367
+ /**
368
+ * Build unified list of indexing units from services and entrypoints
369
+ * Each unit has: id, name, path, type, and original data
370
+ */
371
+ buildIndexingUnits(manifest: DiscoveryManifest): IndexingUnit[] {
372
+ const units: IndexingUnit[] = [];
373
+ const seenPaths = new Set<string>();
374
+
375
+ // 1. Add services first (they have priority)
376
+ for (const service of manifest.services || []) {
377
+ const path = service.path || service.metadata?.entrypoint;
378
+ if (path && !seenPaths.has(path)) {
379
+ seenPaths.add(path);
380
+ units.push({
381
+ ...service, // Spread first to allow overrides
382
+ id: service.id,
383
+ name: service.name,
384
+ path: path,
385
+ type: 'service' as const,
386
+ });
387
+ }
388
+ }
389
+
390
+ // 2. Add entrypoints that aren't already covered by services
391
+ for (const ep of manifest.entrypoints || []) {
392
+ const path = ep.file;
393
+ if (path && !seenPaths.has(path)) {
394
+ seenPaths.add(path);
395
+ units.push({
396
+ ...ep, // Spread first to allow overrides
397
+ id: ep.id,
398
+ name: ep.name || ep.file.split('/').pop()!,
399
+ path: path,
400
+ type: 'entrypoint' as const,
401
+ entrypointType: ep.type,
402
+ trigger: ep.trigger,
403
+ });
404
+ }
405
+ }
406
+
407
+ console.log(`[Orchestrator] Built ${units.length} indexing units (${units.filter(u => u.type === 'service').length} services, ${units.filter(u => u.type === 'entrypoint').length} standalone entrypoints)`);
408
+ return units;
409
+ }
410
+
411
+ /**
412
+ * PHASE 0: Discovery - запуск плагинов DISCOVERY фазы
413
+ */
414
+ async discover(projectPath: string): Promise<DiscoveryManifest> {
415
+ const context = {
416
+ projectPath,
417
+ graph: this.graph,
418
+ config: this.config,
419
+ phase: 'DISCOVERY'
420
+ };
421
+
422
+ // Фильтруем плагины для фазы DISCOVERY
423
+ const discoveryPlugins = this.plugins.filter(p => p.metadata.phase === 'DISCOVERY');
424
+
425
+ // Сортируем по приоритету
426
+ discoveryPlugins.sort((a, b) =>
427
+ (b.metadata.priority || 0) - (a.metadata.priority || 0)
428
+ );
429
+
430
+ const allServices: ServiceInfo[] = [];
431
+ const allEntrypoints: EntrypointInfo[] = [];
432
+
433
+ // Выполняем каждый плагин
434
+ for (let i = 0; i < discoveryPlugins.length; i++) {
435
+ const plugin = discoveryPlugins[i];
436
+
437
+ this.onProgress({
438
+ phase: 'discovery',
439
+ currentPlugin: plugin.metadata.name,
440
+ message: `Running ${plugin.metadata.name}... (${i + 1}/${discoveryPlugins.length})`
441
+ });
442
+
443
+ const result = await plugin.execute(context as PluginContext);
444
+
445
+ if (result.success && result.metadata?.services) {
446
+ allServices.push(...(result.metadata.services as ServiceInfo[]));
447
+ }
448
+
449
+ // Collect entrypoints from new-style plugins
450
+ if (result.success && result.metadata?.entrypoints) {
451
+ allEntrypoints.push(...(result.metadata.entrypoints as EntrypointInfo[]));
452
+ }
453
+
454
+ this.onProgress({
455
+ phase: 'discovery',
456
+ currentPlugin: plugin.metadata.name,
457
+ message: `✓ ${plugin.metadata.name} complete`
458
+ });
459
+ }
460
+
461
+ return {
462
+ services: allServices,
463
+ entrypoints: allEntrypoints,
464
+ projectPath: projectPath
465
+ };
466
+ }
467
+
468
+ /**
469
+ * Запустить плагины для конкретной фазы
470
+ */
471
+ async runPhase(phaseName: string, context: Partial<PluginContext> & { graph: PluginContext['graph'] }): Promise<void> {
472
+ // Фильтруем плагины для данной фазы
473
+ const phasePlugins = this.plugins.filter(plugin =>
474
+ plugin.metadata.phase === phaseName
475
+ );
476
+
477
+ // Сортируем по priority (больше = раньше)
478
+ phasePlugins.sort((a, b) =>
479
+ (b.metadata.priority || 0) - (a.metadata.priority || 0)
480
+ );
481
+
482
+ // Выполняем плагины последовательно
483
+ for (let i = 0; i < phasePlugins.length; i++) {
484
+ const plugin = phasePlugins[i];
485
+ this.onProgress({
486
+ phase: phaseName.toLowerCase(),
487
+ currentPlugin: plugin.metadata.name,
488
+ message: `Running plugin ${i + 1}/${phasePlugins.length}: ${plugin.metadata.name}`
489
+ });
490
+ // Передаем onProgress и forceAnalysis в контекст для плагинов
491
+ const pluginContext: PluginContext = {
492
+ ...context,
493
+ onProgress: this.onProgress as unknown as PluginContext['onProgress'],
494
+ forceAnalysis: this.forceAnalysis
495
+ };
496
+ await plugin.execute(pluginContext);
497
+
498
+ // Send completion for this plugin
499
+ this.onProgress({
500
+ phase: phaseName.toLowerCase(),
501
+ currentPlugin: plugin.metadata.name,
502
+ message: `✓ ${plugin.metadata.name} complete`
503
+ });
504
+ }
505
+ }
506
+
507
+ /**
508
+ * Run queue-based parallel analysis using worker_threads and RFDB server
509
+ *
510
+ * Architecture:
511
+ * - Tasks are queued per-file with list of applicable plugins
512
+ * - Workers pick tasks, run plugins, write directly to RFDB
513
+ * - Barrier waits for all tasks before ENRICHMENT phase
514
+ */
515
+ async runParallelAnalysis(manifest: DiscoveryManifest): Promise<void> {
516
+ const socketPath = this.parallelConfig!.socketPath || '/tmp/rfdb.sock';
517
+ const maxWorkers = this.parallelConfig!.maxWorkers || null;
518
+
519
+ // Get the database path from the main graph backend
520
+ const mainDbPath = (this.graph as unknown as { dbPath?: string }).dbPath || join(manifest.projectPath, '.grafema', 'graph.rfdb');
521
+
522
+ console.log(`[Orchestrator] Starting queue-based parallel analysis...`);
523
+ console.log(`[Orchestrator] Using database: ${mainDbPath}`);
524
+
525
+ // Start RFDB server using the SAME database as main graph
526
+ await this.startRfdbServer(socketPath, mainDbPath);
527
+
528
+ // Get ANALYSIS plugins that should run in workers
529
+ const analysisPlugins = this.plugins
530
+ .filter(p => p.metadata?.phase === 'ANALYSIS')
531
+ .map(p => p.metadata.name);
532
+
533
+ console.log(`[Orchestrator] Analysis plugins: ${analysisPlugins.join(', ')}`);
534
+
535
+ // Create analysis queue
536
+ this.analysisQueue = new AnalysisQueue({
537
+ socketPath,
538
+ maxWorkers: maxWorkers || undefined,
539
+ plugins: analysisPlugins,
540
+ });
541
+
542
+ // Start workers
543
+ await this.analysisQueue.start();
544
+
545
+ // Get all MODULE nodes from graph and queue them
546
+ let moduleCount = 0;
547
+ for await (const node of this.graph.queryNodes({ type: 'MODULE' })) {
548
+ // Skip non-JS/TS files
549
+ if (!node.file?.match(/\.(js|jsx|ts|tsx|mjs|cjs)$/)) continue;
550
+
551
+ this.analysisQueue.addTask({
552
+ file: node.file,
553
+ moduleId: node.id,
554
+ moduleName: node.name as string,
555
+ plugins: analysisPlugins, // All plugins for now; workers filter by imports
556
+ });
557
+ moduleCount++;
558
+ }
559
+
560
+ console.log(`[Orchestrator] Queued ${moduleCount} modules for analysis...`);
561
+
562
+ // Subscribe to progress events
563
+ this.analysisQueue.on('taskCompleted', ({ file, stats, duration }: { file: string; stats?: { nodes?: number }; duration: number }) => {
564
+ this.onProgress({
565
+ phase: 'analysis',
566
+ currentPlugin: 'AnalysisQueue',
567
+ message: `${file.split('/').pop()} (${stats?.nodes || 0} nodes, ${duration}ms)`,
568
+ });
569
+ });
570
+
571
+ this.analysisQueue.on('taskFailed', ({ file, error }: { file: string; error: string }) => {
572
+ console.error(`[Orchestrator] Analysis failed for ${file}: ${error}`);
573
+ });
574
+
575
+ // Wait for all tasks to complete (barrier)
576
+ const stats = await this.analysisQueue.waitForCompletion();
577
+
578
+ console.log(`[Orchestrator] Queue complete: ${stats.nodesCreated} nodes, ${stats.edgesCreated} edges`);
579
+ console.log(`[Orchestrator] ${stats.tasksCompleted} succeeded, ${stats.tasksFailed} failed`);
580
+
581
+ // Stop workers and server
582
+ await this.analysisQueue.stop();
583
+ this.analysisQueue = null;
584
+ await this.stopRfdbServer();
585
+ }
586
+
587
+ /**
588
+ * Start RFDB server process (or connect to existing one)
589
+ * @param socketPath - Unix socket path for the server
590
+ * @param dbPath - Database path (should be same as main graph)
591
+ */
592
+ async startRfdbServer(socketPath: string, dbPath: string): Promise<void> {
593
+ // Check if server is already running (socket exists and is connectable)
594
+ if (existsSync(socketPath)) {
595
+ // Try to connect to existing server
596
+ try {
597
+ const { RFDBClient } = await import('@grafema/rfdb-client');
598
+ const testClient = new RFDBClient(socketPath);
599
+ await testClient.connect();
600
+ await testClient.ping();
601
+ await testClient.close();
602
+ console.log(`[Orchestrator] Using existing RFDB server at ${socketPath}`);
603
+ this.rfdbServerProcess = null; // Mark that we didn't start the server
604
+ this._serverWasExternal = true;
605
+ return;
606
+ } catch (e) {
607
+ // Socket exists but server not responding, remove stale socket
608
+ console.log(`[Orchestrator] Stale socket found, removing...`);
609
+ unlinkSync(socketPath);
610
+ }
611
+ }
612
+
613
+ // Check if server binary exists
614
+ const projectRoot = join(dirname(fileURLToPath(import.meta.url)), '../..');
615
+ const serverBinary = join(projectRoot, 'rust-engine/target/release/rfdb-server');
616
+ const debugBinary = join(projectRoot, 'rust-engine/target/debug/rfdb-server');
617
+
618
+ let binaryPath = existsSync(serverBinary) ? serverBinary : debugBinary;
619
+
620
+ if (!existsSync(binaryPath)) {
621
+ console.log(`[Orchestrator] RFDB server binary not found at ${binaryPath}, building...`);
622
+ execSync('cargo build --bin rfdb-server', {
623
+ cwd: join(projectRoot, 'rust-engine'),
624
+ stdio: 'inherit',
625
+ });
626
+ binaryPath = debugBinary;
627
+ }
628
+
629
+ console.log(`[Orchestrator] Starting RFDB server: ${binaryPath} with db: ${dbPath}`);
630
+ this.rfdbServerProcess = spawn(binaryPath, [dbPath, '--socket', socketPath], {
631
+ stdio: ['ignore', 'pipe', 'pipe'],
632
+ });
633
+ this._serverWasExternal = false;
634
+
635
+ this.rfdbServerProcess.stderr?.on('data', (data: Buffer) => {
636
+ const msg = data.toString().trim();
637
+ if (!msg.includes('FLUSH') && !msg.includes('WRITER')) {
638
+ console.log(`[rfdb-server] ${msg}`);
639
+ }
640
+ });
641
+
642
+ // Wait for server to start
643
+ let attempts = 0;
644
+ while (!existsSync(socketPath) && attempts < 30) {
645
+ await sleep(100);
646
+ attempts++;
647
+ }
648
+
649
+ if (!existsSync(socketPath)) {
650
+ throw new Error('RFDB server failed to start');
651
+ }
652
+
653
+ console.log(`[Orchestrator] RFDB server started on ${socketPath}`);
654
+ }
655
+
656
+ /**
657
+ * Stop RFDB server process (only if we started it)
658
+ */
659
+ async stopRfdbServer(): Promise<void> {
660
+ // Don't stop external server (started by MCP or another process)
661
+ if (this._serverWasExternal) {
662
+ console.log(`[Orchestrator] Leaving external RFDB server running`);
663
+ return;
664
+ }
665
+
666
+ if (this.rfdbServerProcess) {
667
+ this.rfdbServerProcess.kill('SIGTERM');
668
+ await sleep(200);
669
+ this.rfdbServerProcess = null;
670
+ console.log(`[Orchestrator] RFDB server stopped`);
671
+ }
672
+ }
673
+ }