@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,196 @@
1
+ /**
2
+ * ManifestStore - simple persistent processing state storage
3
+ *
4
+ * Format: StableID|Phase|Status|Timestamp
5
+ * Operations: grep for search, sed for update
6
+ */
7
+
8
+ import { existsSync, readFileSync, writeFileSync, appendFileSync } from 'fs';
9
+ import { execSync } from 'child_process';
10
+
11
+ /**
12
+ * Processing status type
13
+ */
14
+ export type ProcessingStatus = 'done' | 'in_progress' | 'pending' | 'crashed';
15
+
16
+ /**
17
+ * Phase statistics
18
+ */
19
+ export interface PhaseStats {
20
+ done: number;
21
+ in_progress: number;
22
+ pending: number;
23
+ crashed?: number;
24
+ }
25
+
26
+ /**
27
+ * All phases statistics
28
+ */
29
+ export interface ManifestStats {
30
+ [phase: string]: PhaseStats;
31
+ }
32
+
33
+ export class ManifestStore {
34
+ private filePath: string;
35
+
36
+ constructor(filePath: string) {
37
+ this.filePath = filePath;
38
+
39
+ // Create file if doesn't exist
40
+ if (!existsSync(filePath)) {
41
+ writeFileSync(filePath, '# StableID|Phase|Status|Timestamp\n', 'utf-8');
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Check if file is processed in phase
47
+ * @param key - Full key like "PHASE|Plugin|Hash" or stableId
48
+ * @param phase - For backward compat, ignored if key contains |
49
+ */
50
+ isDone(key: string, phase?: string): boolean {
51
+ try {
52
+ // If key already contains pipe, use as-is, else build pattern
53
+ const searchKey = key.includes('|') ? key : `${key}|${phase}`;
54
+ const pattern = `^${searchKey}\\|done`;
55
+ execSync(`grep -q "${pattern}" "${this.filePath}"`, { encoding: 'utf-8' });
56
+ return true;
57
+ } catch {
58
+ return false;
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Mark file as processed in phase
64
+ * @param key - Full key like "PHASE|Plugin|Hash" or stableId
65
+ * @param phase - For backward compat, ignored if key contains |
66
+ */
67
+ markDone(key: string, phase?: string): void {
68
+ const timestamp = Math.floor(Date.now() / 1000);
69
+ const fullKey = key.includes('|') ? key : `${key}|${phase}`;
70
+ const line = `${fullKey}|done|${timestamp}\n`;
71
+
72
+ // Atomic append
73
+ appendFileSync(this.filePath, line, 'utf-8');
74
+ }
75
+
76
+ /**
77
+ * Mark file as in progress
78
+ * @param key - Full key like "PHASE|Plugin|Hash" or stableId
79
+ * @param phase - For backward compat, ignored if key contains |
80
+ */
81
+ markInProgress(key: string, phase?: string): void {
82
+ const timestamp = Math.floor(Date.now() / 1000);
83
+ const fullKey = key.includes('|') ? key : `${key}|${phase}`;
84
+ const line = `${fullKey}|in_progress|${timestamp}\n`;
85
+
86
+ appendFileSync(this.filePath, line, 'utf-8');
87
+ }
88
+
89
+ /**
90
+ * Get status of file in phase
91
+ * @param key - Full key like "PHASE|Plugin|Hash" or stableId
92
+ * @param phase - For backward compat, ignored if key contains |
93
+ */
94
+ getStatus(key: string, phase?: string): ProcessingStatus {
95
+ try {
96
+ const searchKey = key.includes('|') ? key : `${key}|${phase}`;
97
+ const pattern = `^${searchKey}\\|`;
98
+ const result = execSync(
99
+ `grep "${pattern}" "${this.filePath}" | tail -1`,
100
+ { encoding: 'utf-8' }
101
+ ).trim();
102
+
103
+ if (!result) return 'pending';
104
+
105
+ const parts = result.split('|');
106
+ // Status is after the key parts
107
+ const statusIndex = key.includes('|') ? key.split('|').length : 2;
108
+ return parts[statusIndex] as ProcessingStatus;
109
+ } catch {
110
+ return 'pending';
111
+ }
112
+ }
113
+
114
+ /**
115
+ * Get all files for phase with specific status
116
+ */
117
+ getByStatus(phase: string, status: ProcessingStatus): string[] {
118
+ try {
119
+ const pattern = `\\|${phase}\\|${status}\\|`;
120
+ const result = execSync(
121
+ `grep "${pattern}" "${this.filePath}" | cut -d'|' -f1`,
122
+ { encoding: 'utf-8' }
123
+ ).trim();
124
+
125
+ return result ? result.split('\n') : [];
126
+ } catch {
127
+ return [];
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Get statistics by phases
133
+ */
134
+ getStats(): ManifestStats {
135
+ const content = readFileSync(this.filePath, 'utf-8');
136
+ const lines = content.split('\n').filter(l => l && !l.startsWith('#'));
137
+
138
+ const stats: ManifestStats = {};
139
+
140
+ for (const line of lines) {
141
+ const parts = line.split('|');
142
+ const phase = parts[1];
143
+ const status = parts[2] as ProcessingStatus;
144
+
145
+ if (!phase || !status) continue;
146
+
147
+ if (!stats[phase]) {
148
+ stats[phase] = { done: 0, in_progress: 0, pending: 0 };
149
+ }
150
+
151
+ if (status in stats[phase]) {
152
+ (stats[phase] as unknown as Record<string, number>)[status]++;
153
+ }
154
+ }
155
+
156
+ return stats;
157
+ }
158
+
159
+ /**
160
+ * Clean up stale in_progress (crashed processes)
161
+ * @param olderThanSeconds - older than N seconds considered dead
162
+ */
163
+ cleanupStaleProgress(olderThanSeconds: number = 300): void {
164
+ const now = Math.floor(Date.now() / 1000);
165
+ const content = readFileSync(this.filePath, 'utf-8');
166
+ const lines = content.split('\n');
167
+
168
+ const cleaned = lines.map(line => {
169
+ if (!line || line.startsWith('#')) return line;
170
+
171
+ const parts = line.split('|');
172
+ const status = parts[2];
173
+ const timestamp = parts[3];
174
+
175
+ if (status === 'in_progress' && timestamp) {
176
+ const age = now - parseInt(timestamp);
177
+ if (age > olderThanSeconds) {
178
+ // Mark as crashed (process died)
179
+ parts[2] = 'crashed';
180
+ return parts.join('|');
181
+ }
182
+ }
183
+
184
+ return line;
185
+ });
186
+
187
+ writeFileSync(this.filePath, cleaned.join('\n'), 'utf-8');
188
+ }
189
+
190
+ /**
191
+ * Clear entire manifest (for testing)
192
+ */
193
+ clear(): void {
194
+ writeFileSync(this.filePath, '# StableID|Phase|Status|Timestamp\n', 'utf-8');
195
+ }
196
+ }
@@ -0,0 +1,274 @@
1
+ /**
2
+ * NodeFactory - centralized graph node creation
3
+ *
4
+ * Single point for creating all node types with:
5
+ * - Required field validation
6
+ * - Standard field set for each type
7
+ * - Automatic ID generation
8
+ *
9
+ * Delegates creation to node contracts from ./nodes/
10
+ */
11
+
12
+ import { createHash } from 'crypto';
13
+ import { basename, relative } from 'path';
14
+
15
+ import {
16
+ ServiceNode,
17
+ EntrypointNode,
18
+ ModuleNode,
19
+ FunctionNode,
20
+ ScopeNode,
21
+ CallSiteNode,
22
+ MethodCallNode,
23
+ VariableDeclarationNode,
24
+ ConstantNode,
25
+ LiteralNode,
26
+ ExternalStdioNode,
27
+ EventListenerNode,
28
+ HttpRequestNode,
29
+ DatabaseQueryNode,
30
+ type EntrypointType,
31
+ type EntrypointTrigger,
32
+ } from './nodes/index.js';
33
+
34
+ import type { BaseNodeRecord } from '@grafema/types';
35
+
36
+ interface ServiceOptions {
37
+ version?: string;
38
+ entrypoint?: string;
39
+ discoveryMethod?: string;
40
+ description?: string;
41
+ dependencies?: string[];
42
+ serviceType?: string;
43
+ testFiles?: string[];
44
+ metadata?: {
45
+ type?: string;
46
+ testFiles?: string[];
47
+ };
48
+ }
49
+
50
+ interface EntrypointOptions {
51
+ id?: string;
52
+ name?: string;
53
+ trigger?: EntrypointTrigger;
54
+ source?: string;
55
+ serviceId?: string;
56
+ }
57
+
58
+ interface ModuleOptions {
59
+ contentHash?: string;
60
+ isTest?: boolean;
61
+ }
62
+
63
+ interface FunctionOptions {
64
+ async?: boolean;
65
+ generator?: boolean;
66
+ exported?: boolean;
67
+ arrowFunction?: boolean;
68
+ parentScopeId?: string;
69
+ isClassMethod?: boolean;
70
+ className?: string;
71
+ params?: string[];
72
+ counter?: number;
73
+ }
74
+
75
+ interface ScopeOptions {
76
+ name?: string;
77
+ conditional?: boolean;
78
+ parentScopeId?: string;
79
+ parentFunctionId?: string;
80
+ capturesFrom?: string[];
81
+ counter?: number;
82
+ }
83
+
84
+ interface CallSiteOptions {
85
+ parentScopeId?: string;
86
+ counter?: number;
87
+ }
88
+
89
+ interface MethodCallOptions {
90
+ parentScopeId?: string;
91
+ args?: unknown[];
92
+ counter?: number;
93
+ }
94
+
95
+ interface VariableOptions {
96
+ parentScopeId?: string;
97
+ counter?: number;
98
+ }
99
+
100
+ interface ConstantOptions {
101
+ value?: unknown;
102
+ parentScopeId?: string;
103
+ counter?: number;
104
+ }
105
+
106
+ interface LiteralOptions {
107
+ parentCallId?: string;
108
+ argIndex?: number;
109
+ counter?: number;
110
+ }
111
+
112
+ interface EventListenerOptions {
113
+ column?: number;
114
+ parentScopeId?: string;
115
+ callbackArg?: string;
116
+ counter?: number;
117
+ }
118
+
119
+ interface HttpRequestOptions {
120
+ column?: number;
121
+ parentScopeId?: string;
122
+ counter?: number;
123
+ }
124
+
125
+ interface DatabaseQueryOptions {
126
+ parentScopeId?: string;
127
+ }
128
+
129
+ // Validator type for node classes
130
+ interface NodeValidator {
131
+ validate(node: BaseNodeRecord): string[];
132
+ }
133
+
134
+ export class NodeFactory {
135
+ /**
136
+ * Create SERVICE node
137
+ */
138
+ static createService(name: string, projectPath: string, options: ServiceOptions = {}) {
139
+ return ServiceNode.create(name, projectPath, options);
140
+ }
141
+
142
+ /**
143
+ * Create ENTRYPOINT node
144
+ */
145
+ static createEntrypoint(file: string, entrypointType: EntrypointType, options: EntrypointOptions = {}) {
146
+ return EntrypointNode.create(file, entrypointType, options);
147
+ }
148
+
149
+ /**
150
+ * Create MODULE node
151
+ */
152
+ static createModule(filePath: string, projectPath: string, options: ModuleOptions = {}) {
153
+ if (!filePath) throw new Error('NodeFactory.createModule: filePath is required');
154
+ if (!projectPath) throw new Error('NodeFactory.createModule: projectPath is required');
155
+
156
+ const contentHash = options.contentHash || this._hashFile(filePath);
157
+ const relativePath = relative(projectPath, filePath) || basename(filePath);
158
+
159
+ return ModuleNode.create(filePath, relativePath, contentHash, options);
160
+ }
161
+
162
+ /**
163
+ * Create FUNCTION node
164
+ */
165
+ static createFunction(name: string, file: string, line: number, column: number, options: FunctionOptions = {}) {
166
+ return FunctionNode.create(name, file, line, column, options);
167
+ }
168
+
169
+ /**
170
+ * Create SCOPE node
171
+ */
172
+ static createScope(scopeType: string, file: string, line: number, options: ScopeOptions = {}) {
173
+ return ScopeNode.create(scopeType, file, line, options);
174
+ }
175
+
176
+ /**
177
+ * Create CALL_SITE node
178
+ */
179
+ static createCallSite(targetName: string, file: string, line: number, column: number, options: CallSiteOptions = {}) {
180
+ return CallSiteNode.create(targetName, file, line, column, options);
181
+ }
182
+
183
+ /**
184
+ * Create METHOD_CALL node
185
+ */
186
+ static createMethodCall(objectName: string | undefined, methodName: string, file: string, line: number, column: number, options: MethodCallOptions = {}) {
187
+ return MethodCallNode.create(objectName, methodName, file, line, column, options);
188
+ }
189
+
190
+ /**
191
+ * Create VARIABLE_DECLARATION node
192
+ */
193
+ static createVariableDeclaration(name: string, file: string, line: number, column: number, options: VariableOptions = {}) {
194
+ return VariableDeclarationNode.create(name, file, line, column, options);
195
+ }
196
+
197
+ /**
198
+ * Create CONSTANT node
199
+ */
200
+ static createConstant(name: string, file: string, line: number, column: number, options: ConstantOptions = {}) {
201
+ return ConstantNode.create(name, file, line, column, options);
202
+ }
203
+
204
+ /**
205
+ * Create LITERAL node
206
+ */
207
+ static createLiteral(value: unknown, file: string, line: number, column: number, options: LiteralOptions = {}) {
208
+ return LiteralNode.create(value, file, line, column, options);
209
+ }
210
+
211
+ /**
212
+ * Create EXTERNAL_STDIO node (singleton)
213
+ */
214
+ static createExternalStdio() {
215
+ return ExternalStdioNode.create();
216
+ }
217
+
218
+ /**
219
+ * Create EVENT_LISTENER node
220
+ */
221
+ static createEventListener(eventName: string, objectName: string | undefined, file: string, line: number, options: EventListenerOptions = {}) {
222
+ return EventListenerNode.create(eventName, objectName, file, line, options);
223
+ }
224
+
225
+ /**
226
+ * Create HTTP_REQUEST node
227
+ */
228
+ static createHttpRequest(url: string | undefined, method: string | undefined, file: string, line: number, options: HttpRequestOptions = {}) {
229
+ return HttpRequestNode.create(url, method, file, line, options);
230
+ }
231
+
232
+ /**
233
+ * Create DATABASE_QUERY node
234
+ */
235
+ static createDatabaseQuery(query: string | undefined, operation: string | undefined, file: string, line: number, options: DatabaseQueryOptions = {}) {
236
+ return DatabaseQueryNode.create(query, operation, file, line, options);
237
+ }
238
+
239
+ /**
240
+ * Validate node by its type
241
+ */
242
+ static validate(node: BaseNodeRecord): string[] {
243
+ const validators: Record<string, NodeValidator> = {
244
+ 'SERVICE': ServiceNode,
245
+ 'ENTRYPOINT': EntrypointNode,
246
+ 'MODULE': ModuleNode,
247
+ 'FUNCTION': FunctionNode,
248
+ 'SCOPE': ScopeNode,
249
+ 'CALL_SITE': CallSiteNode,
250
+ 'METHOD_CALL': MethodCallNode,
251
+ 'VARIABLE_DECLARATION': VariableDeclarationNode,
252
+ 'CONSTANT': ConstantNode,
253
+ 'LITERAL': LiteralNode,
254
+ 'EXTERNAL_STDIO': ExternalStdioNode,
255
+ 'EVENT_LISTENER': EventListenerNode,
256
+ 'HTTP_REQUEST': HttpRequestNode,
257
+ 'DATABASE_QUERY': DatabaseQueryNode
258
+ };
259
+
260
+ const validator = validators[node.type];
261
+ if (!validator) {
262
+ return [`Unknown node type: ${node.type}`];
263
+ }
264
+
265
+ return validator.validate(node);
266
+ }
267
+
268
+ /**
269
+ * Helper: hash file path for stable ID
270
+ */
271
+ static _hashFile(filePath: string): string {
272
+ return createHash('md5').update(filePath).digest('hex').substring(0, 12);
273
+ }
274
+ }
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Deterministic Node ID generation scheme for the graph
3
+ *
4
+ * Format: TYPE|SCOPE|FILE|IDENTIFIER|LINE:COL
5
+ *
6
+ * Components:
7
+ * - TYPE: node type (MODULE, FUNCTION, CLASS, METHOD, VARIABLE, etc.)
8
+ * - SCOPE: context/scope (path to parent or project)
9
+ * - FILE: relative file path from project root
10
+ * - IDENTIFIER: entity name (for MODULE can be empty)
11
+ * - LINE:COL: position in file (for uniqueness of anonymous functions)
12
+ *
13
+ * Examples:
14
+ * MODULE|/project|src/index.js||0:0
15
+ * FUNCTION|/project|src/index.js|handleRequest|42:5
16
+ * CLASS|/project|src/User.js|User|10:0
17
+ * METHOD|User|src/User.js|login|25:2
18
+ * VARIABLE|handleRequest|src/index.js|userId|45:10
19
+ * EXTERNAL_MODULE|/project||express|0:0
20
+ */
21
+
22
+ import { createHash } from 'crypto';
23
+
24
+ /**
25
+ * Parameters for computing Node ID
26
+ */
27
+ export interface NodeIdParams {
28
+ type: string;
29
+ scope?: string;
30
+ file?: string;
31
+ identifier?: string;
32
+ line?: number;
33
+ column?: number;
34
+ }
35
+
36
+ /**
37
+ * Parsed Node ID components
38
+ */
39
+ export interface ParsedNodeId {
40
+ type: string;
41
+ scope: string;
42
+ file: string;
43
+ identifier: string;
44
+ line: number;
45
+ column: number;
46
+ }
47
+
48
+ /**
49
+ * Compute deterministic Node ID
50
+ */
51
+ export function computeNodeId({
52
+ type,
53
+ scope = '',
54
+ file = '',
55
+ identifier = '',
56
+ line = 0,
57
+ column = 0
58
+ }: NodeIdParams): string {
59
+ // Normalize: remove empty values
60
+ const parts = [
61
+ type,
62
+ scope || '',
63
+ file || '',
64
+ identifier || '',
65
+ `${line}:${column}`
66
+ ];
67
+
68
+ return parts.join('|');
69
+ }
70
+
71
+ /**
72
+ * Compute u128 numeric ID from string (for Rust backend)
73
+ * Uses SHA-256 hash and takes first 16 bytes
74
+ */
75
+ export function computeNumericId(stringId: string): bigint {
76
+ const hash = createHash('sha256').update(stringId).digest();
77
+
78
+ // Take first 16 bytes (128 bits) and convert to BigInt
79
+ let numericId = 0n;
80
+ for (let i = 0; i < 16; i++) {
81
+ numericId = (numericId << 8n) | BigInt(hash[i]);
82
+ }
83
+
84
+ return numericId;
85
+ }
86
+
87
+ /**
88
+ * Parse Node ID back into components
89
+ */
90
+ export function parseNodeId(nodeId: string): ParsedNodeId {
91
+ const parts = nodeId.split('|');
92
+
93
+ if (parts.length !== 5) {
94
+ throw new Error(`Invalid Node ID format: ${nodeId}`);
95
+ }
96
+
97
+ const [lineStr, columnStr] = parts[4].split(':');
98
+
99
+ return {
100
+ type: parts[0],
101
+ scope: parts[1],
102
+ file: parts[2],
103
+ identifier: parts[3],
104
+ line: Number(lineStr),
105
+ column: Number(columnStr)
106
+ };
107
+ }
108
+
109
+ /**
110
+ * Helper for creating MODULE ID
111
+ */
112
+ export function createModuleId(filePath: string, projectPath: string = '/project'): string {
113
+ return computeNodeId({
114
+ type: 'MODULE',
115
+ scope: projectPath,
116
+ file: filePath,
117
+ identifier: '',
118
+ line: 0,
119
+ column: 0
120
+ });
121
+ }
122
+
123
+ /**
124
+ * Helper for creating FUNCTION ID
125
+ */
126
+ export function createFunctionId(
127
+ filePath: string,
128
+ functionName: string,
129
+ line: number,
130
+ column: number,
131
+ scope: string = '/project'
132
+ ): string {
133
+ return computeNodeId({
134
+ type: 'FUNCTION',
135
+ scope,
136
+ file: filePath,
137
+ identifier: functionName,
138
+ line,
139
+ column
140
+ });
141
+ }
142
+
143
+ /**
144
+ * Helper for creating CLASS ID
145
+ */
146
+ export function createClassId(
147
+ filePath: string,
148
+ className: string,
149
+ line: number,
150
+ column: number,
151
+ scope: string = '/project'
152
+ ): string {
153
+ return computeNodeId({
154
+ type: 'CLASS',
155
+ scope,
156
+ file: filePath,
157
+ identifier: className,
158
+ line,
159
+ column
160
+ });
161
+ }
162
+
163
+ /**
164
+ * Helper for creating METHOD ID
165
+ */
166
+ export function createMethodId(
167
+ filePath: string,
168
+ className: string,
169
+ methodName: string,
170
+ line: number,
171
+ column: number
172
+ ): string {
173
+ return computeNodeId({
174
+ type: 'METHOD',
175
+ scope: className, // Scope = parent class
176
+ file: filePath,
177
+ identifier: methodName,
178
+ line,
179
+ column
180
+ });
181
+ }
182
+
183
+ /**
184
+ * Helper for creating VARIABLE ID
185
+ */
186
+ export function createVariableId(
187
+ filePath: string,
188
+ varName: string,
189
+ line: number,
190
+ column: number,
191
+ scope: string
192
+ ): string {
193
+ return computeNodeId({
194
+ type: 'VARIABLE',
195
+ scope, // Scope = containing function/class
196
+ file: filePath,
197
+ identifier: varName,
198
+ line,
199
+ column
200
+ });
201
+ }
202
+
203
+ /**
204
+ * Helper for creating EXTERNAL_MODULE ID
205
+ */
206
+ export function createExternalModuleId(
207
+ moduleName: string,
208
+ projectPath: string = '/project'
209
+ ): string {
210
+ return computeNodeId({
211
+ type: 'EXTERNAL_MODULE',
212
+ scope: projectPath,
213
+ file: '',
214
+ identifier: moduleName,
215
+ line: 0,
216
+ column: 0
217
+ });
218
+ }
219
+
220
+ /**
221
+ * Helper for creating IMPORT ID
222
+ */
223
+ export function createImportId(
224
+ filePath: string,
225
+ source: string,
226
+ localName: string,
227
+ line: number,
228
+ scope: string = '/project'
229
+ ): string {
230
+ return computeNodeId({
231
+ type: 'IMPORT',
232
+ scope,
233
+ file: filePath,
234
+ identifier: `${source}:${localName}`,
235
+ line,
236
+ column: 0
237
+ });
238
+ }
239
+
240
+ /**
241
+ * Helper for creating EXPORT ID
242
+ */
243
+ export function createExportId(
244
+ filePath: string,
245
+ exportName: string,
246
+ line: number,
247
+ scope: string = '/project'
248
+ ): string {
249
+ return computeNodeId({
250
+ type: 'EXPORT',
251
+ scope,
252
+ file: filePath,
253
+ identifier: exportName,
254
+ line,
255
+ column: 0
256
+ });
257
+ }