@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,395 @@
1
+ /**
2
+ * SocketIOAnalyzer - детектит Socket.IO operations
3
+ *
4
+ * Паттерны Server:
5
+ * - io.emit(event, data)
6
+ * - io.to(room).emit(event, data)
7
+ * - io.of(namespace).emit(event, data)
8
+ * - socket.on(event, handler)
9
+ * - socket.join(room)
10
+ * - socket.broadcast.emit(event, data)
11
+ *
12
+ * Паттерны Client:
13
+ * - socket.emit(event, data)
14
+ * - socket.on(event, handler)
15
+ * - socket.off(event, handler)
16
+ */
17
+
18
+ import { readFileSync } from 'fs';
19
+ import { parse, ParserPlugin } from '@babel/parser';
20
+ import traverseModule from '@babel/traverse';
21
+ import type { CallExpression, Identifier, MemberExpression, Node } from '@babel/types';
22
+ import type { NodePath } from '@babel/traverse';
23
+ import { Plugin, createSuccessResult, createErrorResult } from '../Plugin.js';
24
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
25
+ import type { NodeRecord } from '@grafema/types';
26
+
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
+ const traverse = (traverseModule as any).default || traverseModule;
29
+
30
+ /**
31
+ * Socket emit node
32
+ */
33
+ interface SocketEmitNode {
34
+ id: string;
35
+ type: 'socketio:emit';
36
+ event: string;
37
+ room: string | null;
38
+ namespace: string | null;
39
+ broadcast: boolean;
40
+ objectName: string;
41
+ file: string;
42
+ line: number;
43
+ column: number;
44
+ }
45
+
46
+ /**
47
+ * Socket listener node
48
+ */
49
+ interface SocketListenerNode {
50
+ id: string;
51
+ type: 'socketio:on';
52
+ event: string;
53
+ objectName: string;
54
+ handlerName: string;
55
+ handlerLine: number;
56
+ file: string;
57
+ line: number;
58
+ }
59
+
60
+ /**
61
+ * Socket room node
62
+ */
63
+ interface SocketRoomNode {
64
+ id: string;
65
+ type: 'socketio:room';
66
+ room: string;
67
+ objectName: string;
68
+ file: string;
69
+ line: number;
70
+ }
71
+
72
+ /**
73
+ * Analysis result
74
+ */
75
+ interface AnalysisResult {
76
+ emits: number;
77
+ listeners: number;
78
+ rooms: number;
79
+ }
80
+
81
+ export class SocketIOAnalyzer extends Plugin {
82
+ get metadata(): PluginMetadata {
83
+ return {
84
+ name: 'SocketIOAnalyzer',
85
+ phase: 'ANALYSIS',
86
+ priority: 75, // После JSASTAnalyzer (80)
87
+ creates: {
88
+ nodes: ['socketio:emit', 'socketio:on', 'socketio:room'],
89
+ edges: ['CONTAINS', 'EMITS_EVENT', 'LISTENS_TO', 'JOINS_ROOM']
90
+ },
91
+ dependencies: ['JSModuleIndexer', 'JSASTAnalyzer']
92
+ };
93
+ }
94
+
95
+ async execute(context: PluginContext): Promise<PluginResult> {
96
+ try {
97
+ const { graph } = context;
98
+
99
+ // Получаем все модули
100
+ const modules = await this.getModules(graph);
101
+ console.log(`[SocketIOAnalyzer] Processing ${modules.length} modules...`);
102
+
103
+ let emitsCount = 0;
104
+ let listenersCount = 0;
105
+ let roomsCount = 0;
106
+ const startTime = Date.now();
107
+
108
+ for (let i = 0; i < modules.length; i++) {
109
+ const module = modules[i];
110
+ const result = await this.analyzeModule(module, graph);
111
+ emitsCount += result.emits;
112
+ listenersCount += result.listeners;
113
+ roomsCount += result.rooms;
114
+
115
+ // Progress every 20 modules
116
+ if ((i + 1) % 20 === 0 || i === modules.length - 1) {
117
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
118
+ const avgTime = ((Date.now() - startTime) / (i + 1)).toFixed(0);
119
+ console.log(
120
+ `[SocketIOAnalyzer] Progress: ${i + 1}/${modules.length} (${elapsed}s, avg ${avgTime}ms/module)`
121
+ );
122
+ }
123
+ }
124
+
125
+ console.log(
126
+ `[SocketIOAnalyzer] Found ${emitsCount} emits, ${listenersCount} listeners, ${roomsCount} rooms`
127
+ );
128
+
129
+ return createSuccessResult(
130
+ {
131
+ nodes: emitsCount + listenersCount + roomsCount,
132
+ edges: 0
133
+ },
134
+ { emitsCount, listenersCount, roomsCount }
135
+ );
136
+ } catch (error) {
137
+ console.error('[SocketIOAnalyzer] Error:', error);
138
+ return createErrorResult(error as Error);
139
+ }
140
+ }
141
+
142
+ private async analyzeModule(
143
+ module: NodeRecord,
144
+ graph: PluginContext['graph']
145
+ ): Promise<AnalysisResult> {
146
+ try {
147
+ const code = readFileSync(module.file!, 'utf-8');
148
+
149
+ const ast = parse(code, {
150
+ sourceType: 'module',
151
+ plugins: [
152
+ 'jsx',
153
+ 'typescript',
154
+ 'classProperties',
155
+ 'decorators-legacy',
156
+ 'asyncGenerators',
157
+ 'dynamicImport',
158
+ 'optionalChaining',
159
+ 'nullishCoalescingOperator'
160
+ ] as ParserPlugin[]
161
+ });
162
+
163
+ const emits: SocketEmitNode[] = [];
164
+ const listeners: SocketListenerNode[] = [];
165
+ const rooms: SocketRoomNode[] = [];
166
+
167
+ // Детект Socket.IO паттернов
168
+ traverse(ast, {
169
+ CallExpression: (path: NodePath<CallExpression>) => {
170
+ const node = path.node;
171
+ const callee = node.callee;
172
+
173
+ // Pattern: socket.emit(event, data) или io.emit(event, data)
174
+ if (
175
+ callee.type === 'MemberExpression' &&
176
+ (callee.property as Identifier).type === 'Identifier' &&
177
+ (callee.property as Identifier).name === 'emit'
178
+ ) {
179
+ const objectName = this.getObjectName(callee.object);
180
+ const event = this.extractStringArg(node.arguments[0]);
181
+ const line = node.loc!.start.line;
182
+ const column = node.loc!.start.column;
183
+
184
+ // io.to('room').emit() - room-based emit
185
+ let room: string | null = null;
186
+ if (
187
+ callee.object.type === 'CallExpression' &&
188
+ (callee.object.callee as MemberExpression).type === 'MemberExpression' &&
189
+ ((callee.object.callee as MemberExpression).property as Identifier).name === 'to'
190
+ ) {
191
+ room = this.extractStringArg(callee.object.arguments[0]);
192
+ }
193
+
194
+ // io.of('/namespace').emit() - namespace emit
195
+ let namespace: string | null = null;
196
+ if (
197
+ callee.object.type === 'CallExpression' &&
198
+ (callee.object.callee as MemberExpression).type === 'MemberExpression' &&
199
+ ((callee.object.callee as MemberExpression).property as Identifier).name === 'of'
200
+ ) {
201
+ namespace = this.extractStringArg(callee.object.arguments[0]);
202
+ }
203
+
204
+ // socket.broadcast.emit() - broadcast to all except sender
205
+ let broadcast = false;
206
+ if (
207
+ callee.object.type === 'MemberExpression' &&
208
+ ((callee.object as MemberExpression).property as Identifier).name === 'broadcast'
209
+ ) {
210
+ broadcast = true;
211
+ }
212
+
213
+ emits.push({
214
+ id: `socketio:emit#${event}#${module.file}#${line}`,
215
+ type: 'socketio:emit',
216
+ event: event,
217
+ room: room,
218
+ namespace: namespace,
219
+ broadcast: broadcast,
220
+ objectName: objectName,
221
+ file: module.file!,
222
+ line: line,
223
+ column: column
224
+ });
225
+ }
226
+
227
+ // Pattern: socket.on(event, handler) или io.on(event, handler)
228
+ if (
229
+ callee.type === 'MemberExpression' &&
230
+ (callee.property as Identifier).type === 'Identifier' &&
231
+ (callee.property as Identifier).name === 'on'
232
+ ) {
233
+ const objectName = this.getObjectName(callee.object);
234
+ const event = this.extractStringArg(node.arguments[0]);
235
+ const line = node.loc!.start.line;
236
+ const handler = node.arguments[1];
237
+
238
+ // Извлекаем имя handler функции
239
+ let handlerName = 'anonymous';
240
+ let handlerLine = line;
241
+ if (handler) {
242
+ if (
243
+ handler.type === 'FunctionExpression' ||
244
+ handler.type === 'ArrowFunctionExpression'
245
+ ) {
246
+ handlerName = `anonymous:${handler.loc!.start.line}`;
247
+ handlerLine = handler.loc!.start.line;
248
+ } else if (handler.type === 'Identifier') {
249
+ handlerName = (handler as Identifier).name;
250
+ }
251
+ }
252
+
253
+ listeners.push({
254
+ id: `socketio:on#${event}#${module.file}#${line}`,
255
+ type: 'socketio:on',
256
+ event: event,
257
+ objectName: objectName,
258
+ handlerName: handlerName,
259
+ handlerLine: handlerLine,
260
+ file: module.file!,
261
+ line: line
262
+ });
263
+ }
264
+
265
+ // Pattern: socket.join(room)
266
+ if (
267
+ callee.type === 'MemberExpression' &&
268
+ (callee.property as Identifier).type === 'Identifier' &&
269
+ (callee.property as Identifier).name === 'join'
270
+ ) {
271
+ const objectName = this.getObjectName(callee.object);
272
+ const roomName = this.extractStringArg(node.arguments[0]);
273
+ const line = node.loc!.start.line;
274
+
275
+ if (objectName === 'socket') {
276
+ rooms.push({
277
+ id: `socketio:room#${roomName}#${module.file}#${line}`,
278
+ type: 'socketio:room',
279
+ room: roomName,
280
+ objectName: objectName,
281
+ file: module.file!,
282
+ line: line
283
+ });
284
+ }
285
+ }
286
+ }
287
+ });
288
+
289
+ // Создаём ноды в графе
290
+ for (const emit of emits) {
291
+ await graph.addNode(emit as unknown as NodeRecord);
292
+
293
+ // Создаём ребро от модуля к event
294
+ await graph.addEdge({
295
+ type: 'CONTAINS',
296
+ src: module.id,
297
+ dst: emit.id
298
+ });
299
+ }
300
+
301
+ for (const listener of listeners) {
302
+ await graph.addNode(listener as unknown as NodeRecord);
303
+
304
+ // Создаём ребро от модуля к listener
305
+ await graph.addEdge({
306
+ type: 'CONTAINS',
307
+ src: module.id,
308
+ dst: listener.id
309
+ });
310
+
311
+ // Ищем FUNCTION node для handler и создаём ребро LISTENS_TO
312
+ const handlerFunctionId = `FUNCTION#${listener.handlerName}#${listener.file}#${listener.handlerLine}`;
313
+ const handlerFunction = await graph.getNode(handlerFunctionId);
314
+
315
+ if (handlerFunction) {
316
+ await graph.addEdge({
317
+ type: 'LISTENS_TO',
318
+ src: listener.id,
319
+ dst: handlerFunctionId
320
+ });
321
+ }
322
+ }
323
+
324
+ for (const room of rooms) {
325
+ await graph.addNode(room as unknown as NodeRecord);
326
+
327
+ // Создаём ребро от модуля к room
328
+ await graph.addEdge({
329
+ type: 'CONTAINS',
330
+ src: module.id,
331
+ dst: room.id
332
+ });
333
+ }
334
+
335
+ return {
336
+ emits: emits.length,
337
+ listeners: listeners.length,
338
+ rooms: rooms.length
339
+ };
340
+ } catch (error) {
341
+ console.error(
342
+ `[SocketIOAnalyzer] Error analyzing ${module.file}:`,
343
+ (error as Error).message
344
+ );
345
+ return { emits: 0, listeners: 0, rooms: 0 };
346
+ }
347
+ }
348
+
349
+ /**
350
+ * Извлекает имя объекта из MemberExpression
351
+ * Например: socket.emit → 'socket', io.to('room').emit → 'io'
352
+ */
353
+ private getObjectName(node: Node): string {
354
+ if (node.type === 'Identifier') {
355
+ return (node as Identifier).name;
356
+ } else if (node.type === 'MemberExpression') {
357
+ return this.getObjectName((node as MemberExpression).object);
358
+ } else if (node.type === 'CallExpression') {
359
+ return this.getObjectName((node as CallExpression).callee);
360
+ }
361
+ return 'unknown';
362
+ }
363
+
364
+ /**
365
+ * Извлекает строковое значение из аргумента
366
+ */
367
+ private extractStringArg(arg: Node | undefined): string {
368
+ if (!arg) return 'unknown';
369
+
370
+ if (arg.type === 'StringLiteral') {
371
+ return (arg as { value: string }).value;
372
+ } else if (arg.type === 'TemplateLiteral') {
373
+ const tl = arg as { quasis: Array<{ value: { raw: string } }>; expressions: unknown[] };
374
+ if (tl.quasis.length === 1) {
375
+ // Простой template literal без интерполяции
376
+ return tl.quasis[0].value.raw;
377
+ } else {
378
+ // Template literal с переменными - возвращаем паттерн
379
+ const parts = tl.quasis.map(q => q.value.raw);
380
+ const expressions = tl.expressions.map(() => '${...}');
381
+
382
+ let result = '';
383
+ for (let i = 0; i < parts.length; i++) {
384
+ result += parts[i];
385
+ if (i < expressions.length) {
386
+ result += expressions[i];
387
+ }
388
+ }
389
+ return result;
390
+ }
391
+ }
392
+
393
+ return 'dynamic';
394
+ }
395
+ }
@@ -0,0 +1,284 @@
1
+ /**
2
+ * SystemDbAnalyzer - специализированный плагин для анализа system_db API
3
+ *
4
+ * Понимает семантику system_db и добавляет ноды для сайд-эффектов:
5
+ * - system_db.use(view, server) -> регистрирует VIEW через get_view()
6
+ * - system_db.subscribe(servers) -> проверяет все зарегистрированные VIEW'ы
7
+ * - local.use(view) -> регистрирует VIEW в get_hosts()
8
+ *
9
+ * Добавляет специальные ноды:
10
+ * - SYSTEM_DB_VIEW_REGISTRATION - регистрация VIEW'а
11
+ * - SYSTEM_DB_SUBSCRIPTION - подписка на сервер
12
+ */
13
+
14
+ import { readFileSync } from 'fs';
15
+ import { parse, ParserPlugin } from '@babel/parser';
16
+ import traverseModule from '@babel/traverse';
17
+ import type { CallExpression, Identifier, MemberExpression, Node } from '@babel/types';
18
+ import type { NodePath } from '@babel/traverse';
19
+ import { Plugin, createSuccessResult, createErrorResult } from '../Plugin.js';
20
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
21
+ import type { NodeRecord } from '@grafema/types';
22
+
23
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
+ const traverse = (traverseModule as any).default || traverseModule;
25
+
26
+ /**
27
+ * View registration info
28
+ */
29
+ interface ViewRegistration {
30
+ type: 'system_db.use' | 'local.use' | 'get_view';
31
+ viewName: string;
32
+ serverName: string;
33
+ line: number;
34
+ column: number;
35
+ }
36
+
37
+ /**
38
+ * Subscription info
39
+ */
40
+ interface Subscription {
41
+ type: 'system_db.subscribe';
42
+ servers: string[];
43
+ line: number;
44
+ column: number;
45
+ }
46
+
47
+ export class SystemDbAnalyzer extends Plugin {
48
+ get metadata(): PluginMetadata {
49
+ return {
50
+ name: 'SystemDbAnalyzer',
51
+ phase: 'ANALYSIS',
52
+ priority: 85, // Run after JSASTAnalyzer
53
+ creates: {
54
+ nodes: ['SYSTEM_DB_VIEW_REGISTRATION', 'SYSTEM_DB_SUBSCRIPTION'],
55
+ edges: ['REGISTERS_VIEW', 'CHECKS_VIEWS']
56
+ }
57
+ };
58
+ }
59
+
60
+ async execute(context: PluginContext): Promise<PluginResult> {
61
+ try {
62
+ const { graph } = context;
63
+
64
+ let nodesCreated = 0;
65
+ let edgesCreated = 0;
66
+
67
+ // Get all MODULE nodes
68
+ const modules = await this.getModules(graph);
69
+
70
+ console.log(
71
+ `[SystemDbAnalyzer] Analyzing ${modules.length} modules for system_db patterns...\n`
72
+ );
73
+
74
+ for (const module of modules) {
75
+ if (!module.file) continue;
76
+
77
+ try {
78
+ const code = readFileSync(module.file, 'utf-8');
79
+ const ast = parse(code, {
80
+ sourceType: 'module',
81
+ plugins: ['jsx', 'typescript'] as ParserPlugin[],
82
+ errorRecovery: true
83
+ });
84
+
85
+ const registrations: ViewRegistration[] = [];
86
+ const subscriptions: Subscription[] = [];
87
+
88
+ traverse(ast, {
89
+ CallExpression: (path: NodePath<CallExpression>) => {
90
+ const { node } = path;
91
+
92
+ // system_db.use(...)
93
+ if (
94
+ node.callee.type === 'MemberExpression' &&
95
+ (node.callee.object as Identifier).name === 'system_db' &&
96
+ (node.callee.property as Identifier).name === 'use'
97
+ ) {
98
+ const viewName = this.extractLiteral(node.arguments[0]);
99
+ const serverName = this.extractLiteral(node.arguments[1]);
100
+
101
+ if (viewName) {
102
+ registrations.push({
103
+ type: 'system_db.use',
104
+ viewName,
105
+ serverName: serverName || 'default',
106
+ line: node.loc?.start.line || 0,
107
+ column: node.loc?.start.column || 0
108
+ });
109
+ }
110
+ }
111
+
112
+ // system_db.subscribe(...)
113
+ if (
114
+ node.callee.type === 'MemberExpression' &&
115
+ (node.callee.object as Identifier).name === 'system_db' &&
116
+ (node.callee.property as Identifier).name === 'subscribe'
117
+ ) {
118
+ const servers = this.extractServerList(node.arguments[0]);
119
+
120
+ subscriptions.push({
121
+ type: 'system_db.subscribe',
122
+ servers,
123
+ line: node.loc?.start.line || 0,
124
+ column: node.loc?.start.column || 0
125
+ });
126
+ }
127
+
128
+ // local.use('view_name') - косвенная регистрация через get_hosts()
129
+ if (
130
+ node.callee.type === 'MemberExpression' &&
131
+ (node.callee.object as Identifier).name === 'local' &&
132
+ (node.callee.property as Identifier).name === 'use'
133
+ ) {
134
+ const viewName = this.extractLiteral(node.arguments[0]);
135
+
136
+ if (viewName) {
137
+ registrations.push({
138
+ type: 'local.use',
139
+ viewName,
140
+ serverName: 'inferred_from_hosts',
141
+ line: node.loc?.start.line || 0,
142
+ column: node.loc?.start.column || 0
143
+ });
144
+ }
145
+ }
146
+
147
+ // get_view(name, server) - внутренний API
148
+ if (
149
+ node.callee.type === 'Identifier' &&
150
+ (node.callee as Identifier).name === 'get_view'
151
+ ) {
152
+ const viewName = this.extractLiteral(node.arguments[0]);
153
+ const serverName = this.extractLiteral(node.arguments[1]);
154
+
155
+ if (viewName) {
156
+ registrations.push({
157
+ type: 'get_view',
158
+ viewName,
159
+ serverName: serverName || 'default',
160
+ line: node.loc?.start.line || 0,
161
+ column: node.loc?.start.column || 0
162
+ });
163
+ }
164
+ }
165
+ }
166
+ });
167
+
168
+ // Create SYSTEM_DB_VIEW_REGISTRATION nodes
169
+ for (const reg of registrations) {
170
+ const nodeId = `${module.file}:SYSTEM_DB_VIEW_REGISTRATION:${reg.viewName}:${reg.line}`;
171
+
172
+ console.log(
173
+ ` 📌 Found: ${reg.type}('${reg.viewName}', '${reg.serverName}') at ${module.file!.split('/').pop()}:${reg.line}`
174
+ );
175
+
176
+ await graph.addNode({
177
+ id: nodeId,
178
+ type: 'SYSTEM_DB_VIEW_REGISTRATION',
179
+ name: `${reg.type}('${reg.viewName}', '${reg.serverName}')`,
180
+ file: module.file,
181
+ line: reg.line,
182
+ column: reg.column,
183
+ viewName: reg.viewName,
184
+ serverName: reg.serverName,
185
+ callType: reg.type
186
+ } as unknown as NodeRecord);
187
+ nodesCreated++;
188
+
189
+ // Link MODULE -> REGISTERS_VIEW -> REGISTRATION
190
+ await graph.addEdge({
191
+ type: 'REGISTERS_VIEW',
192
+ src: module.id,
193
+ dst: nodeId
194
+ });
195
+ edgesCreated++;
196
+ }
197
+
198
+ // Create SYSTEM_DB_SUBSCRIPTION nodes
199
+ for (const sub of subscriptions) {
200
+ const nodeId = `${module.file}:SYSTEM_DB_SUBSCRIPTION:${sub.line}`;
201
+
202
+ await graph.addNode({
203
+ id: nodeId,
204
+ type: 'SYSTEM_DB_SUBSCRIPTION',
205
+ name: `subscribe([${sub.servers.join(', ')}])`,
206
+ file: module.file,
207
+ line: sub.line,
208
+ column: sub.column,
209
+ servers: sub.servers
210
+ } as unknown as NodeRecord);
211
+ nodesCreated++;
212
+
213
+ // Link MODULE -> CHECKS_VIEWS -> SUBSCRIPTION
214
+ await graph.addEdge({
215
+ type: 'CHECKS_VIEWS',
216
+ src: module.id,
217
+ dst: nodeId
218
+ });
219
+ edgesCreated++;
220
+ }
221
+ } catch (err) {
222
+ // Skip files that can't be parsed
223
+ if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {
224
+ console.error(` ⚠️ Failed to analyze ${module.file}: ${(err as Error).message}`);
225
+ }
226
+ }
227
+ }
228
+
229
+ console.log(
230
+ `[SystemDbAnalyzer] Created ${nodesCreated} system_db nodes, ${edgesCreated} edges\n`
231
+ );
232
+
233
+ return createSuccessResult(
234
+ { nodes: nodesCreated, edges: edgesCreated },
235
+ { modulesAnalyzed: modules.length }
236
+ );
237
+ } catch (error) {
238
+ console.error(`[SystemDbAnalyzer] Error:`, error);
239
+ return createErrorResult(error as Error);
240
+ }
241
+ }
242
+
243
+ /**
244
+ * Extract literal value from AST node
245
+ */
246
+ private extractLiteral(node: Node | undefined): string | null {
247
+ if (!node) return null;
248
+
249
+ if (node.type === 'StringLiteral') {
250
+ return (node as { value: string }).value;
251
+ }
252
+
253
+ if (node.type === 'TemplateLiteral') {
254
+ const tl = node as { quasis: Array<{ value: { cooked: string | null } }> };
255
+ if (tl.quasis.length === 1) {
256
+ return tl.quasis[0].value.cooked;
257
+ }
258
+ }
259
+
260
+ return null;
261
+ }
262
+
263
+ /**
264
+ * Extract server list from subscribe() argument
265
+ */
266
+ private extractServerList(node: Node | undefined): string[] {
267
+ if (!node) return ['default'];
268
+
269
+ // String literal: subscribe('lum-unblocker')
270
+ if (node.type === 'StringLiteral') {
271
+ return [(node as { value: string }).value];
272
+ }
273
+
274
+ // Array: subscribe(['lum', 'lum-views'])
275
+ if (node.type === 'ArrayExpression') {
276
+ const arr = node as { elements: Array<Node | null> };
277
+ return arr.elements
278
+ .map(el => (el ? this.extractLiteral(el) : null))
279
+ .filter((s): s is string => s !== null);
280
+ }
281
+
282
+ return ['unknown'];
283
+ }
284
+ }