@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,107 @@
1
+ /**
2
+ * Task - базовая единица работы в очереди
3
+ */
4
+
5
+ import type { TaskData, TaskType } from './TaskTypes.js';
6
+
7
+ export type TaskStatus = 'pending' | 'running' | 'completed' | 'failed';
8
+
9
+ export interface TaskOptions {
10
+ id: string;
11
+ type: TaskType;
12
+ priority?: number;
13
+ data: TaskData;
14
+ dependencies?: string[];
15
+ }
16
+
17
+ export class Task {
18
+ readonly id: string;
19
+ readonly type: TaskType;
20
+ readonly priority: number;
21
+ readonly data: TaskData;
22
+ readonly dependencies: string[];
23
+
24
+ status: TaskStatus;
25
+ result: unknown;
26
+ error: Error | null;
27
+ startedAt: number | null;
28
+ completedAt: number | null;
29
+ retries: number;
30
+ maxRetries: number;
31
+
32
+ constructor({ id, type, priority = 50, data, dependencies = [] }: TaskOptions) {
33
+ this.id = id;
34
+ this.type = type;
35
+ this.priority = priority;
36
+ this.data = data;
37
+ this.dependencies = dependencies;
38
+
39
+ this.status = 'pending';
40
+ this.result = null;
41
+ this.error = null;
42
+ this.startedAt = null;
43
+ this.completedAt = null;
44
+ this.retries = 0;
45
+ this.maxRetries = 3;
46
+ }
47
+
48
+ /**
49
+ * Может ли задача выполняться (все зависимости готовы)
50
+ */
51
+ canExecute(completedTasks: Set<string>): boolean {
52
+ return this.dependencies.every(depId => completedTasks.has(depId));
53
+ }
54
+
55
+ /**
56
+ * Начать выполнение
57
+ */
58
+ start(): void {
59
+ this.status = 'running';
60
+ this.startedAt = Date.now();
61
+ }
62
+
63
+ /**
64
+ * Завершить успешно
65
+ */
66
+ complete(result: unknown): void {
67
+ this.status = 'completed';
68
+ this.result = result;
69
+ this.completedAt = Date.now();
70
+ }
71
+
72
+ /**
73
+ * Завершить с ошибкой
74
+ */
75
+ fail(error: Error): void {
76
+ this.status = 'failed';
77
+ this.error = error;
78
+ this.completedAt = Date.now();
79
+ }
80
+
81
+ /**
82
+ * Можно ли повторить
83
+ */
84
+ canRetry(): boolean {
85
+ return this.retries < this.maxRetries;
86
+ }
87
+
88
+ /**
89
+ * Повторить задачу
90
+ */
91
+ retry(): void {
92
+ this.retries++;
93
+ this.status = 'pending';
94
+ this.error = null;
95
+ this.startedAt = null;
96
+ this.completedAt = null;
97
+ }
98
+
99
+ /**
100
+ * Продолжительность выполнения (мс)
101
+ */
102
+ get duration(): number {
103
+ if (!this.startedAt) return 0;
104
+ const end = this.completedAt || Date.now();
105
+ return end - this.startedAt;
106
+ }
107
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Task Types - конкретные типы данных для задач
3
+ *
4
+ * Extensibility: добавляйте новые типы в TaskData union
5
+ */
6
+
7
+ import type { ModuleNode } from '../plugins/analysis/ast/types.js';
8
+
9
+ // === TASK TYPE LITERALS ===
10
+ export type TaskType = 'ANALYZE_MODULE';
11
+ // При добавлении нового типа: 'ANALYZE_MODULE' | 'NEW_TYPE';
12
+
13
+ // === TASK DATA BY TYPE ===
14
+
15
+ /**
16
+ * Данные для ANALYZE_MODULE задачи
17
+ */
18
+ export interface AnalyzeModuleData {
19
+ module: ModuleNode;
20
+ }
21
+
22
+ // При добавлении нового типа:
23
+ // export interface NewTypeData {
24
+ // ...
25
+ // }
26
+
27
+ // === UNION TYPE ===
28
+
29
+ /**
30
+ * Union всех возможных TaskData
31
+ * Расширяется при добавлении новых типов задач
32
+ */
33
+ export type TaskData = AnalyzeModuleData;
34
+ // При добавлении: AnalyzeModuleData | NewTypeData;
35
+
36
+ // === TYPE GUARDS ===
37
+
38
+ export function isAnalyzeModuleData(data: TaskData): data is AnalyzeModuleData {
39
+ return 'module' in data && data.module !== null && typeof data.module === 'object';
40
+ }
@@ -0,0 +1,404 @@
1
+ /**
2
+ * VersionManager - управление версиями нод для incremental analysis
3
+ *
4
+ * КОНЦЕПЦИЯ:
5
+ * - Храним несколько версий кода одновременно (main, __local, branch names)
6
+ * - Используем stable IDs для сравнения версий
7
+ * - Поддерживаем fine-grained merge (только изменённые ноды)
8
+ *
9
+ * ВЕРСИИ:
10
+ * - "main" - committed код из git HEAD
11
+ * - "__local" - uncommitted изменения (working directory)
12
+ * - "branch-name" - другие ветки (будущее)
13
+ */
14
+
15
+ import { createHash } from 'crypto';
16
+
17
+ /**
18
+ * Version constants
19
+ */
20
+ export interface VersionConstants {
21
+ MAIN: 'main';
22
+ LOCAL: '__local';
23
+ }
24
+
25
+ /**
26
+ * Node types for stable ID generation
27
+ */
28
+ export type StableIdNodeType =
29
+ | 'FUNCTION'
30
+ | 'CLASS'
31
+ | 'INTERFACE'
32
+ | 'TYPE_ALIAS'
33
+ | 'VARIABLE_DECLARATION'
34
+ | 'MODULE'
35
+ | 'SERVICE'
36
+ | 'CALL_SITE'
37
+ | 'SCOPE'
38
+ | 'EXPRESSION'
39
+ | 'STATEMENT'
40
+ | 'DATABASE_QUERY'
41
+ | 'HTTP_REQUEST'
42
+ | 'FILESYSTEM'
43
+ | 'NETWORK'
44
+ | 'ENDPOINT';
45
+
46
+ /**
47
+ * Node for stable ID generation
48
+ */
49
+ export interface VersionedNode {
50
+ type: string;
51
+ name?: string;
52
+ file?: string;
53
+ line?: number;
54
+ column?: number;
55
+ // Content fields for external nodes
56
+ query?: string;
57
+ url?: string;
58
+ path?: string;
59
+ endpoint?: string;
60
+ // Additional fields for structural comparison
61
+ params?: unknown[];
62
+ returnType?: string;
63
+ async?: boolean;
64
+ exported?: boolean;
65
+ bodyHash?: string;
66
+ methods?: unknown[];
67
+ properties?: unknown[];
68
+ extends?: string;
69
+ implements?: string[];
70
+ kind?: string;
71
+ value?: unknown;
72
+ contentHash?: string;
73
+ imports?: unknown[];
74
+ exports?: unknown[];
75
+ arguments?: unknown[];
76
+ callee?: string;
77
+ operation?: string;
78
+ collection?: string;
79
+ method?: string;
80
+ handler?: string;
81
+ // Version-aware fields
82
+ id?: string;
83
+ version?: string;
84
+ _stableId?: string;
85
+ _replaces?: string;
86
+ updatedAt?: number;
87
+ }
88
+
89
+ /**
90
+ * REPLACES edge structure
91
+ */
92
+ export interface ReplacesEdge {
93
+ type: 'REPLACES';
94
+ fromId: string;
95
+ toId: string;
96
+ version: string;
97
+ }
98
+
99
+ /**
100
+ * Enrichment options
101
+ */
102
+ export interface EnrichOptions {
103
+ replacesId?: string;
104
+ }
105
+
106
+ /**
107
+ * Modified node info
108
+ */
109
+ export interface ModifiedNodeInfo {
110
+ old: VersionedNode;
111
+ new: VersionedNode;
112
+ stableId: string;
113
+ }
114
+
115
+ /**
116
+ * Changes summary
117
+ */
118
+ export interface ChangesSummary {
119
+ addedCount: number;
120
+ modifiedCount: number;
121
+ unchangedCount: number;
122
+ deletedCount: number;
123
+ totalChanges: number;
124
+ }
125
+
126
+ /**
127
+ * Classification result
128
+ */
129
+ export interface ClassifyChangesResult {
130
+ added: VersionedNode[];
131
+ modified: ModifiedNodeInfo[];
132
+ unchanged: VersionedNode[];
133
+ deleted: VersionedNode[];
134
+ summary: ChangesSummary;
135
+ }
136
+
137
+ /**
138
+ * Type-specific comparison keys
139
+ */
140
+ interface TypeSpecificKeys {
141
+ [nodeType: string]: string[];
142
+ }
143
+
144
+ export class VersionManager {
145
+ readonly versions: VersionConstants;
146
+
147
+ constructor() {
148
+ this.versions = {
149
+ MAIN: 'main',
150
+ LOCAL: '__local'
151
+ };
152
+ }
153
+
154
+ /**
155
+ * Генерировать stable ID для ноды (без версии)
156
+ *
157
+ * Stable ID остаётся одинаковым для одной и той же сущности
158
+ * в разных версиях кода
159
+ */
160
+ generateStableId(node: VersionedNode): string {
161
+ const { type, name, file, line, column } = node;
162
+
163
+ // Для FUNCTION, CLASS - используем type:name:file
164
+ if (['FUNCTION', 'CLASS', 'INTERFACE', 'TYPE_ALIAS'].includes(type)) {
165
+ return `${type}:${name}:${file}`;
166
+ }
167
+
168
+ // Для VARIABLE_DECLARATION - добавляем line для различения локальных переменных
169
+ if (type === 'VARIABLE_DECLARATION') {
170
+ return `${type}:${name}:${file}:${line || 0}`;
171
+ }
172
+
173
+ // Для MODULE - только file
174
+ if (type === 'MODULE') {
175
+ return `MODULE:${file}`;
176
+ }
177
+
178
+ // Для SERVICE - используем имя или file
179
+ if (type === 'SERVICE') {
180
+ return `SERVICE:${name || file}`;
181
+ }
182
+
183
+ // Для вложенных нод (CALL_SITE, SCOPE, EXPRESSION) - используем file:line:column
184
+ if (['CALL_SITE', 'SCOPE', 'EXPRESSION', 'STATEMENT'].includes(type)) {
185
+ return `${type}:${file}:${line || 0}:${column || 0}`;
186
+ }
187
+
188
+ // Для EXTERNAL нод (DATABASE_QUERY, HTTP_REQUEST) - используем содержимое
189
+ if (['DATABASE_QUERY', 'HTTP_REQUEST', 'FILESYSTEM', 'NETWORK'].includes(type)) {
190
+ // Используем хеш содержимого для уникальности
191
+ const content = node.query || node.url || node.path || node.endpoint || '';
192
+ const hash = createHash('sha256').update(content).digest('hex').substring(0, 16);
193
+ return `${type}:${hash}`;
194
+ }
195
+
196
+ // По умолчанию - используем все доступные поля
197
+ const parts = [type, name, file, line, column].filter(p => p !== undefined && p !== null);
198
+ return parts.join(':');
199
+ }
200
+
201
+ /**
202
+ * Генерировать versioned ID для ноды
203
+ */
204
+ generateVersionedId(node: VersionedNode, version: string): string {
205
+ const stableId = this.generateStableId(node);
206
+ return `${stableId}:${version}`;
207
+ }
208
+
209
+ /**
210
+ * Извлечь stable ID из versioned ID
211
+ */
212
+ extractStableId(versionedId: string): string {
213
+ const lastColonIndex = versionedId.lastIndexOf(':');
214
+ return versionedId.substring(0, lastColonIndex);
215
+ }
216
+
217
+ /**
218
+ * Извлечь версию из versioned ID
219
+ */
220
+ extractVersion(versionedId: string): string {
221
+ const lastColonIndex = versionedId.lastIndexOf(':');
222
+ return versionedId.substring(lastColonIndex + 1);
223
+ }
224
+
225
+ /**
226
+ * Проверить, имеет ли нода структурные изменения
227
+ */
228
+ hasStructuralChanges(oldNode: VersionedNode, newNode: VersionedNode): boolean {
229
+ // Список ключевых полей для сравнения (зависит от типа ноды)
230
+ const keysToCompare = this._getComparisonKeys(oldNode.type);
231
+
232
+ for (const key of keysToCompare) {
233
+ const oldValue = (oldNode as unknown as Record<string, unknown>)[key];
234
+ const newValue = (newNode as unknown as Record<string, unknown>)[key];
235
+
236
+ // Глубокое сравнение для массивов и объектов
237
+ if (JSON.stringify(oldValue) !== JSON.stringify(newValue)) {
238
+ return true;
239
+ }
240
+ }
241
+
242
+ return false;
243
+ }
244
+
245
+ /**
246
+ * Получить ключи для сравнения в зависимости от типа ноды
247
+ */
248
+ private _getComparisonKeys(nodeType: string): string[] {
249
+ const commonKeys = ['name', 'line', 'column'];
250
+
251
+ const typeSpecificKeys: TypeSpecificKeys = {
252
+ FUNCTION: ['params', 'returnType', 'async', 'exported', 'bodyHash'],
253
+ CLASS: ['methods', 'properties', 'extends', 'implements', 'exported'],
254
+ VARIABLE_DECLARATION: ['kind', 'value', 'exported'],
255
+ MODULE: ['contentHash', 'imports', 'exports'],
256
+ CALL_SITE: ['arguments', 'callee'],
257
+ DATABASE_QUERY: ['query', 'operation', 'collection'],
258
+ HTTP_REQUEST: ['method', 'url', 'endpoint'],
259
+ ENDPOINT: ['path', 'method', 'handler']
260
+ };
261
+
262
+ return [...commonKeys, ...(typeSpecificKeys[nodeType] || [])];
263
+ }
264
+
265
+ /**
266
+ * Вычислить хеш тела функции для сравнения
267
+ */
268
+ calculateBodyHash(bodySource: string | null | undefined): string | null {
269
+ if (!bodySource) return null;
270
+
271
+ // Нормализуем код: убираем пробелы и комментарии для сравнения
272
+ const normalized = bodySource
273
+ .replace(/\/\*[\s\S]*?\*\//g, '') // Блочные комментарии
274
+ .replace(/\/\/.*/g, '') // Строчные комментарии
275
+ .replace(/\s+/g, ' ') // Множественные пробелы -> один пробел
276
+ .trim();
277
+
278
+ return createHash('sha256').update(normalized, 'utf-8').digest('hex');
279
+ }
280
+
281
+ /**
282
+ * Создать REPLACES ребро между версиями
283
+ */
284
+ createReplacesEdge(localNodeId: string, mainNodeId: string): ReplacesEdge {
285
+ return {
286
+ type: 'REPLACES',
287
+ fromId: localNodeId,
288
+ toId: mainNodeId,
289
+ version: '__local' // Edge тоже имеет версию
290
+ };
291
+ }
292
+
293
+ /**
294
+ * Дополнить ноду полями для version-aware анализа
295
+ */
296
+ enrichNodeWithVersion(
297
+ node: VersionedNode,
298
+ version: string,
299
+ options: EnrichOptions = {}
300
+ ): VersionedNode {
301
+ const stableId = this.generateStableId(node);
302
+ const versionedId = this.generateVersionedId(node, version);
303
+
304
+ const enriched: VersionedNode = {
305
+ ...node,
306
+ id: versionedId,
307
+ version: version,
308
+ _stableId: stableId
309
+ };
310
+
311
+ // Добавляем _replaces если это замена main версии
312
+ if (options.replacesId) {
313
+ enriched._replaces = options.replacesId;
314
+ }
315
+
316
+ // Добавляем timestamp
317
+ if (!enriched.updatedAt) {
318
+ enriched.updatedAt = Date.now();
319
+ }
320
+
321
+ return enriched;
322
+ }
323
+
324
+ /**
325
+ * Классифицировать изменения между версиями
326
+ */
327
+ classifyChanges(mainNodes: VersionedNode[], localNodes: VersionedNode[]): ClassifyChangesResult {
328
+ // Создаём Map по stable ID
329
+ const mainMap = new Map<string, VersionedNode>();
330
+ for (const node of mainNodes) {
331
+ const stableId = this.generateStableId(node);
332
+ mainMap.set(stableId, node);
333
+ }
334
+
335
+ const localMap = new Map<string, VersionedNode>();
336
+ for (const node of localNodes) {
337
+ const stableId = this.generateStableId(node);
338
+ localMap.set(stableId, node);
339
+ }
340
+
341
+ // Классификация
342
+ const added: VersionedNode[] = [];
343
+ const modified: ModifiedNodeInfo[] = [];
344
+ const unchanged: VersionedNode[] = [];
345
+ const deleted: VersionedNode[] = [];
346
+
347
+ // Проверяем локальные ноды
348
+ for (const [stableId, localNode] of localMap) {
349
+ if (!mainMap.has(stableId)) {
350
+ // Нода добавлена
351
+ added.push(localNode);
352
+ } else {
353
+ const mainNode = mainMap.get(stableId)!;
354
+ if (this.hasStructuralChanges(mainNode, localNode)) {
355
+ // Нода изменена
356
+ modified.push({ old: mainNode, new: localNode, stableId });
357
+ } else {
358
+ // Нода не изменилась
359
+ unchanged.push(localNode);
360
+ }
361
+ }
362
+ }
363
+
364
+ // Проверяем удалённые ноды (есть в main, нет в local)
365
+ for (const [stableId, mainNode] of mainMap) {
366
+ if (!localMap.has(stableId)) {
367
+ deleted.push(mainNode);
368
+ }
369
+ }
370
+
371
+ return {
372
+ added, // Новые ноды
373
+ modified, // Изменённые ноды
374
+ unchanged, // Неизменённые ноды
375
+ deleted, // Удалённые ноды
376
+ summary: {
377
+ addedCount: added.length,
378
+ modifiedCount: modified.length,
379
+ unchangedCount: unchanged.length,
380
+ deletedCount: deleted.length,
381
+ totalChanges: added.length + modified.length + deleted.length
382
+ }
383
+ };
384
+ }
385
+
386
+ /**
387
+ * Проверить, является ли версия локальной (uncommitted)
388
+ */
389
+ isLocalVersion(version: string): boolean {
390
+ return version === this.versions.LOCAL;
391
+ }
392
+
393
+ /**
394
+ * Проверить, является ли версия основной (committed)
395
+ */
396
+ isMainVersion(version: string): boolean {
397
+ return version === this.versions.MAIN;
398
+ }
399
+ }
400
+
401
+ /**
402
+ * Singleton instance
403
+ */
404
+ export const versionManager = new VersionManager();