@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,305 @@
1
+ /**
2
+ * Clean Graph API for visualization
3
+ * Reads everything directly from RFDB (no caches)
4
+ */
5
+
6
+ import { createServer, Server, IncomingMessage, ServerResponse } from 'http';
7
+ import { parse as parseUrl } from 'url';
8
+
9
+ // Node type constants
10
+ const NODE_TYPES = {
11
+ SERVICE: 2,
12
+ FUNCTION: 3,
13
+ CLASS: 4,
14
+ MODULE: 8,
15
+ } as const;
16
+
17
+ // Edge type constants
18
+ const EDGE_TYPES = {
19
+ CONTAINS: 1,
20
+ DEPENDS_ON: 2,
21
+ CALLS: 3,
22
+ IMPORTS: 8,
23
+ } as const;
24
+
25
+ /**
26
+ * Native node from engine
27
+ */
28
+ interface NativeNode {
29
+ id: bigint;
30
+ kind: number;
31
+ exported: boolean;
32
+ version: number;
33
+ name_offset?: number;
34
+ }
35
+
36
+ /**
37
+ * Native edge from engine
38
+ */
39
+ interface NativeEdge {
40
+ src: bigint;
41
+ dst: bigint;
42
+ etype: number;
43
+ version: number;
44
+ }
45
+
46
+ /**
47
+ * Engine interface
48
+ */
49
+ interface GraphEngine {
50
+ findByType(type: number): bigint[];
51
+ getNode(id: bigint): NativeNode | null;
52
+ nodeExists(id: bigint): boolean;
53
+ getOutgoingEdges(id: bigint, types: number[] | null): NativeEdge[];
54
+ }
55
+
56
+ /**
57
+ * Backend interface
58
+ */
59
+ interface GraphBackend {
60
+ engine: GraphEngine;
61
+ _bigIntToId(id: bigint): string;
62
+ _idToBigInt(id: string): bigint;
63
+ _numberToNodeType(kind: number): string;
64
+ _numberToEdgeType(etype: number): string;
65
+ }
66
+
67
+ /**
68
+ * Formatted node for API response
69
+ */
70
+ interface FormattedNode {
71
+ id: string;
72
+ type: string;
73
+ name: string;
74
+ exported: boolean;
75
+ version: number;
76
+ }
77
+
78
+ /**
79
+ * Formatted edge for API response
80
+ */
81
+ interface FormattedEdge {
82
+ src: string;
83
+ dst: string;
84
+ type: string;
85
+ version: number;
86
+ }
87
+
88
+ export class GraphAPI {
89
+ private backend: GraphBackend;
90
+ private port: number;
91
+ private server: Server | null;
92
+
93
+ constructor(backend: GraphBackend, port: number = 3000) {
94
+ this.backend = backend;
95
+ this.port = port;
96
+ this.server = null;
97
+ }
98
+
99
+ /**
100
+ * Start API server
101
+ */
102
+ start(): this {
103
+ this.server = createServer((req, res) => {
104
+ this.handleRequest(req, res);
105
+ });
106
+
107
+ this.server.listen(this.port, () => {
108
+ console.log(`\n🚀 Graph API Server started`);
109
+ console.log(`📊 http://localhost:${this.port}`);
110
+ console.log(`\nEndpoints:`);
111
+ console.log(` GET /api/services - List all services`);
112
+ console.log(` GET /api/node/:id - Get node by ID`);
113
+ console.log(` GET /api/node/:id/children - Get node children (via CONTAINS edges)`);
114
+ console.log(` GET /api/node/:id/edges - Get all edges from node`);
115
+ console.log(`\nPress Ctrl+C to stop\n`);
116
+ });
117
+
118
+ return this;
119
+ }
120
+
121
+ /**
122
+ * Stop server
123
+ */
124
+ stop(): void {
125
+ if (this.server) {
126
+ this.server.close();
127
+ console.log('Graph API Server stopped');
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Handle HTTP request
133
+ */
134
+ async handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {
135
+ const { pathname } = parseUrl(req.url || '', true);
136
+
137
+ // CORS headers
138
+ res.setHeader('Access-Control-Allow-Origin', '*');
139
+ res.setHeader('Content-Type', 'application/json');
140
+
141
+ try {
142
+ // GET /api/services
143
+ if (pathname === '/api/services') {
144
+ await this.handleGetServices(req, res);
145
+ return;
146
+ }
147
+
148
+ // GET /api/node/:id
149
+ const nodeMatch = pathname?.match(/^\/api\/node\/([^\/]+)$/);
150
+ if (nodeMatch) {
151
+ await this.handleGetNode(req, res, decodeURIComponent(nodeMatch[1]));
152
+ return;
153
+ }
154
+
155
+ // GET /api/node/:id/children
156
+ const childrenMatch = pathname?.match(/^\/api\/node\/([^\/]+)\/children$/);
157
+ if (childrenMatch) {
158
+ await this.handleGetChildren(req, res, decodeURIComponent(childrenMatch[1]));
159
+ return;
160
+ }
161
+
162
+ // GET /api/node/:id/edges
163
+ const edgesMatch = pathname?.match(/^\/api\/node\/([^\/]+)\/edges$/);
164
+ if (edgesMatch) {
165
+ await this.handleGetEdges(req, res, decodeURIComponent(edgesMatch[1]));
166
+ return;
167
+ }
168
+
169
+ // 404
170
+ res.writeHead(404);
171
+ res.end(JSON.stringify({ error: 'Endpoint not found' }));
172
+ } catch (error) {
173
+ console.error('API error:', error);
174
+ res.writeHead(500);
175
+ res.end(JSON.stringify({ error: (error as Error).message }));
176
+ }
177
+ }
178
+
179
+ /**
180
+ * GET /api/services
181
+ * Returns all SERVICE nodes
182
+ */
183
+ async handleGetServices(req: IncomingMessage, res: ServerResponse): Promise<void> {
184
+ // Find all SERVICE nodes from RFDB
185
+ const serviceIds = this.backend.engine.findByType(NODE_TYPES.SERVICE);
186
+
187
+ const services = serviceIds.map(id => {
188
+ const node = this.backend.engine.getNode(id);
189
+ if (!node) return null;
190
+
191
+ return {
192
+ id: this.backend._bigIntToId(node.id),
193
+ type: 'SERVICE',
194
+ name: this.getNodeName(node),
195
+ exported: node.exported,
196
+ version: node.version,
197
+ };
198
+ }).filter(Boolean) as FormattedNode[];
199
+
200
+ res.writeHead(200);
201
+ res.end(JSON.stringify(services));
202
+ }
203
+
204
+ /**
205
+ * GET /api/node/:id
206
+ * Returns single node by ID
207
+ */
208
+ async handleGetNode(req: IncomingMessage, res: ServerResponse, nodeId: string): Promise<void> {
209
+ const node = this.backend.engine.getNode(this.backend._idToBigInt(nodeId));
210
+
211
+ if (!node) {
212
+ res.writeHead(404);
213
+ res.end(JSON.stringify({ error: 'Node not found' }));
214
+ return;
215
+ }
216
+
217
+ res.writeHead(200);
218
+ res.end(JSON.stringify({
219
+ id: this.backend._bigIntToId(node.id),
220
+ type: this.backend._numberToNodeType(node.kind),
221
+ name: this.getNodeName(node),
222
+ exported: node.exported,
223
+ version: node.version,
224
+ }));
225
+ }
226
+
227
+ /**
228
+ * GET /api/node/:id/children
229
+ * Returns children via CONTAINS edges
230
+ */
231
+ async handleGetChildren(req: IncomingMessage, res: ServerResponse, nodeId: string): Promise<void> {
232
+ const nodeIdBigInt = this.backend._idToBigInt(nodeId);
233
+
234
+ // Check node exists
235
+ if (!this.backend.engine.nodeExists(nodeIdBigInt)) {
236
+ res.writeHead(404);
237
+ res.end(JSON.stringify({ error: 'Node not found' }));
238
+ return;
239
+ }
240
+
241
+ // Get outgoing CONTAINS edges
242
+ const edges = this.backend.engine.getOutgoingEdges(nodeIdBigInt, [EDGE_TYPES.CONTAINS]);
243
+
244
+ const children = edges.map(edge => {
245
+ const childNode = this.backend.engine.getNode(edge.dst);
246
+ if (!childNode) return null;
247
+
248
+ return {
249
+ id: this.backend._bigIntToId(childNode.id),
250
+ type: this.backend._numberToNodeType(childNode.kind),
251
+ name: this.getNodeName(childNode),
252
+ exported: childNode.exported,
253
+ version: childNode.version,
254
+ };
255
+ }).filter(Boolean) as FormattedNode[];
256
+
257
+ res.writeHead(200);
258
+ res.end(JSON.stringify({
259
+ nodeId,
260
+ childCount: children.length,
261
+ children
262
+ }));
263
+ }
264
+
265
+ /**
266
+ * GET /api/node/:id/edges
267
+ * Returns all outgoing edges from node
268
+ */
269
+ async handleGetEdges(req: IncomingMessage, res: ServerResponse, nodeId: string): Promise<void> {
270
+ const nodeIdBigInt = this.backend._idToBigInt(nodeId);
271
+
272
+ // Check node exists
273
+ if (!this.backend.engine.nodeExists(nodeIdBigInt)) {
274
+ res.writeHead(404);
275
+ res.end(JSON.stringify({ error: 'Node not found' }));
276
+ return;
277
+ }
278
+
279
+ // Get all outgoing edges
280
+ const edges = this.backend.engine.getOutgoingEdges(nodeIdBigInt, null);
281
+
282
+ const formattedEdges: FormattedEdge[] = edges.map(edge => ({
283
+ src: this.backend._bigIntToId(edge.src),
284
+ dst: this.backend._bigIntToId(edge.dst),
285
+ type: this.backend._numberToEdgeType(edge.etype),
286
+ version: edge.version,
287
+ }));
288
+
289
+ res.writeHead(200);
290
+ res.end(JSON.stringify({
291
+ nodeId,
292
+ edgeCount: formattedEdges.length,
293
+ edges: formattedEdges
294
+ }));
295
+ }
296
+
297
+ /**
298
+ * Get node name from name_offset (TODO: implement string table lookup)
299
+ */
300
+ private getNodeName(node: NativeNode): string {
301
+ // TODO: Lookup in string table
302
+ // For now return placeholder
303
+ return `Node_${node.id.toString().substring(0, 8)}`;
304
+ }
305
+ }
@@ -0,0 +1,401 @@
1
+ /**
2
+ * GuaranteeAPI - CRUD API for contract-based guarantees
3
+ *
4
+ * Contract-based guarantees use JSON schema validation instead of Datalog rules.
5
+ * They have namespaced types: guarantee:queue, guarantee:api, guarantee:permission
6
+ *
7
+ * This API complements GuaranteeManager which handles Datalog-based GUARANTEE nodes.
8
+ */
9
+
10
+ import type { ValidateFunction, ErrorObject } from 'ajv';
11
+ import { GuaranteeNode, type GuaranteeNodeRecord, type GuaranteePriority, type GuaranteeStatus, type GuaranteeType } from '../core/nodes/GuaranteeNode.js';
12
+
13
+ // Schema validator interface
14
+ interface SchemaValidator {
15
+ compile(schema: Record<string, unknown>): ValidateFunction;
16
+ }
17
+
18
+ // Lazy-loaded Ajv instance to avoid import issues
19
+ let ajvInstance: SchemaValidator | null = null;
20
+
21
+ async function getAjv(): Promise<SchemaValidator> {
22
+ if (!ajvInstance) {
23
+ const AjvModule = await import('ajv');
24
+ // Handle both ESM default export and CJS module.exports
25
+ const AjvClass = AjvModule.default || AjvModule;
26
+ // Use Function constructor pattern to avoid TS2351
27
+ const createAjv = AjvClass as unknown as new (opts: { allErrors: boolean }) => SchemaValidator;
28
+ ajvInstance = new createAjv({ allErrors: true });
29
+ }
30
+ return ajvInstance;
31
+ }
32
+
33
+ /**
34
+ * Graph interface for GuaranteeAPI
35
+ */
36
+ export interface GuaranteeGraphBackend {
37
+ addNode(node: Record<string, unknown>): Promise<void>;
38
+ getNode(id: string): Promise<Record<string, unknown> | null>;
39
+ deleteNode(id: string): Promise<void>;
40
+ queryNodes(filter: { type: string }): AsyncIterable<Record<string, unknown>>;
41
+ addEdge(edge: { type: string; src: string; dst: string }): Promise<void>;
42
+ deleteEdge(src: string, dst: string, type: string): Promise<void>;
43
+ getOutgoingEdges(nodeId: string, types: string[]): Promise<Array<{ src: string; dst: string; type: string }>>;
44
+ getIncomingEdges(nodeId: string, types: string[]): Promise<Array<{ src: string; dst: string; type: string }>>;
45
+ }
46
+
47
+ /**
48
+ * Input for creating a guarantee
49
+ */
50
+ export interface CreateGuaranteeInput {
51
+ type: 'guarantee:queue' | 'guarantee:api' | 'guarantee:permission';
52
+ name: string;
53
+ priority?: GuaranteePriority;
54
+ status?: GuaranteeStatus;
55
+ owner?: string;
56
+ schema?: Record<string, unknown>;
57
+ condition?: string;
58
+ description?: string;
59
+ governs?: string[]; // Node IDs that this guarantee governs
60
+ }
61
+
62
+ /**
63
+ * Input for updating a guarantee
64
+ */
65
+ export interface UpdateGuaranteeInput {
66
+ priority?: GuaranteePriority;
67
+ status?: GuaranteeStatus;
68
+ owner?: string;
69
+ schema?: Record<string, unknown>;
70
+ condition?: string;
71
+ description?: string;
72
+ }
73
+
74
+ /**
75
+ * Filter for finding guarantees
76
+ */
77
+ export interface GuaranteeFilter {
78
+ type?: GuaranteeType | GuaranteeType[];
79
+ priority?: GuaranteePriority | GuaranteePriority[];
80
+ status?: GuaranteeStatus | GuaranteeStatus[];
81
+ owner?: string;
82
+ }
83
+
84
+ /**
85
+ * Result of checking a guarantee
86
+ */
87
+ export interface CheckGuaranteeResult {
88
+ id: string;
89
+ name: string;
90
+ passed: boolean;
91
+ errors: string[];
92
+ validatedCount: number;
93
+ }
94
+
95
+ /**
96
+ * GuaranteeAPI - CRUD operations for contract-based guarantees
97
+ */
98
+ export class GuaranteeAPI {
99
+ private graph: GuaranteeGraphBackend;
100
+ private schemaCache: Map<string, ValidateFunction>;
101
+
102
+ constructor(graph: GuaranteeGraphBackend) {
103
+ this.graph = graph;
104
+ this.schemaCache = new Map();
105
+ }
106
+
107
+ /**
108
+ * Create a new contract-based guarantee
109
+ */
110
+ async createGuarantee(input: CreateGuaranteeInput): Promise<GuaranteeNodeRecord> {
111
+ // Parse type to get namespace
112
+ const parsed = GuaranteeNode.parseId(`${input.type}#${input.name}`);
113
+ if (!parsed) {
114
+ throw new Error(`Invalid guarantee type: ${input.type}`);
115
+ }
116
+
117
+ // Create the guarantee node
118
+ const node = GuaranteeNode.create(parsed.namespace, input.name, {
119
+ priority: input.priority,
120
+ status: input.status,
121
+ owner: input.owner,
122
+ schema: input.schema,
123
+ condition: input.condition,
124
+ description: input.description,
125
+ });
126
+
127
+ // Validate before saving
128
+ const errors = GuaranteeNode.validate(node);
129
+ if (errors.length > 0) {
130
+ throw new Error(`Invalid guarantee: ${errors.join(', ')}`);
131
+ }
132
+
133
+ // Save to graph
134
+ await this.graph.addNode(node as unknown as Record<string, unknown>);
135
+
136
+ // Create GOVERNS edges if specified
137
+ if (input.governs && input.governs.length > 0) {
138
+ for (const targetId of input.governs) {
139
+ await this.addGoverns(node.id, targetId);
140
+ }
141
+ }
142
+
143
+ return node;
144
+ }
145
+
146
+ /**
147
+ * Get a guarantee by ID
148
+ */
149
+ async getGuarantee(id: string): Promise<GuaranteeNodeRecord | null> {
150
+ const node = await this.graph.getNode(id);
151
+ if (!node) return null;
152
+
153
+ // Verify it's a guarantee type
154
+ if (!GuaranteeNode.isGuaranteeType(node.type as string)) {
155
+ return null;
156
+ }
157
+
158
+ return node as unknown as GuaranteeNodeRecord;
159
+ }
160
+
161
+ /**
162
+ * Find guarantees matching filter
163
+ */
164
+ async findGuarantees(filter: GuaranteeFilter = {}): Promise<GuaranteeNodeRecord[]> {
165
+ const guarantees: GuaranteeNodeRecord[] = [];
166
+ const types = this.normalizeTypeFilter(filter.type);
167
+
168
+ for (const type of types) {
169
+ for await (const node of this.graph.queryNodes({ type })) {
170
+ const g = node as unknown as GuaranteeNodeRecord;
171
+
172
+ // Apply additional filters
173
+ if (filter.priority) {
174
+ const priorities = Array.isArray(filter.priority) ? filter.priority : [filter.priority];
175
+ if (!priorities.includes(g.priority)) continue;
176
+ }
177
+
178
+ if (filter.status) {
179
+ const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];
180
+ if (!statuses.includes(g.status)) continue;
181
+ }
182
+
183
+ if (filter.owner && g.owner !== filter.owner) continue;
184
+
185
+ guarantees.push(g);
186
+ }
187
+ }
188
+
189
+ return guarantees;
190
+ }
191
+
192
+ /**
193
+ * Update a guarantee
194
+ */
195
+ async updateGuarantee(id: string, updates: UpdateGuaranteeInput): Promise<GuaranteeNodeRecord> {
196
+ const existing = await this.getGuarantee(id);
197
+ if (!existing) {
198
+ throw new Error(`Guarantee not found: ${id}`);
199
+ }
200
+
201
+ // Apply updates
202
+ const updated: GuaranteeNodeRecord = {
203
+ ...existing,
204
+ ...updates,
205
+ updatedAt: Date.now(),
206
+ };
207
+
208
+ // Validate
209
+ const errors = GuaranteeNode.validate(updated);
210
+ if (errors.length > 0) {
211
+ throw new Error(`Invalid guarantee after update: ${errors.join(', ')}`);
212
+ }
213
+
214
+ // Delete old and add new (upsert)
215
+ await this.graph.deleteNode(id);
216
+ await this.graph.addNode(updated as unknown as Record<string, unknown>);
217
+
218
+ return updated;
219
+ }
220
+
221
+ /**
222
+ * Delete a guarantee
223
+ */
224
+ async deleteGuarantee(id: string): Promise<boolean> {
225
+ const existing = await this.getGuarantee(id);
226
+ if (!existing) {
227
+ return false;
228
+ }
229
+
230
+ // Delete GOVERNS edges
231
+ const edges = await this.graph.getOutgoingEdges(id, ['GOVERNS']);
232
+ for (const edge of edges) {
233
+ await this.graph.deleteEdge(edge.src, edge.dst, 'GOVERNS');
234
+ }
235
+
236
+ // Delete the node
237
+ await this.graph.deleteNode(id);
238
+ return true;
239
+ }
240
+
241
+ /**
242
+ * Add GOVERNS edge from guarantee to a node
243
+ */
244
+ async addGoverns(guaranteeId: string, nodeId: string): Promise<void> {
245
+ // Verify guarantee exists
246
+ const guarantee = await this.getGuarantee(guaranteeId);
247
+ if (!guarantee) {
248
+ throw new Error(`Guarantee not found: ${guaranteeId}`);
249
+ }
250
+
251
+ // Verify target node exists
252
+ const targetNode = await this.graph.getNode(nodeId);
253
+ if (!targetNode) {
254
+ throw new Error(`Target node not found: ${nodeId}`);
255
+ }
256
+
257
+ // Create GOVERNS edge
258
+ await this.graph.addEdge({
259
+ type: 'GOVERNS',
260
+ src: guaranteeId,
261
+ dst: nodeId,
262
+ });
263
+ }
264
+
265
+ /**
266
+ * Remove GOVERNS edge
267
+ */
268
+ async removeGoverns(guaranteeId: string, nodeId: string): Promise<void> {
269
+ await this.graph.deleteEdge(guaranteeId, nodeId, 'GOVERNS');
270
+ }
271
+
272
+ /**
273
+ * Get nodes governed by a guarantee
274
+ */
275
+ async getGoverned(guaranteeId: string): Promise<string[]> {
276
+ const edges = await this.graph.getOutgoingEdges(guaranteeId, ['GOVERNS']);
277
+ return edges.map(e => e.dst);
278
+ }
279
+
280
+ /**
281
+ * Get guarantees governing a node
282
+ */
283
+ async getGoverningGuarantees(nodeId: string): Promise<GuaranteeNodeRecord[]> {
284
+ const edges = await this.graph.getIncomingEdges(nodeId, ['GOVERNS']);
285
+ const guarantees: GuaranteeNodeRecord[] = [];
286
+
287
+ for (const edge of edges) {
288
+ const g = await this.getGuarantee(edge.src);
289
+ if (g) guarantees.push(g);
290
+ }
291
+
292
+ return guarantees;
293
+ }
294
+
295
+ /**
296
+ * Check a guarantee using JSON schema validation
297
+ * Returns validation results for governed nodes
298
+ */
299
+ async checkGuarantee(id: string): Promise<CheckGuaranteeResult> {
300
+ const guarantee = await this.getGuarantee(id);
301
+ if (!guarantee) {
302
+ throw new Error(`Guarantee not found: ${id}`);
303
+ }
304
+
305
+ const result: CheckGuaranteeResult = {
306
+ id,
307
+ name: guarantee.name,
308
+ passed: true,
309
+ errors: [],
310
+ validatedCount: 0,
311
+ };
312
+
313
+ // If no schema defined, consider it passing
314
+ if (!guarantee.schema) {
315
+ return result;
316
+ }
317
+
318
+ // Get or compile schema validator
319
+ let validate: ValidateFunction | undefined = this.schemaCache.get(id);
320
+ if (!validate) {
321
+ try {
322
+ const ajv = await getAjv();
323
+ validate = ajv.compile(guarantee.schema);
324
+ this.schemaCache.set(id, validate);
325
+ } catch (e) {
326
+ result.passed = false;
327
+ result.errors.push(`Invalid schema: ${(e as Error).message}`);
328
+ return result;
329
+ }
330
+ }
331
+
332
+ // Get governed nodes and validate them
333
+ const governedIds = await this.getGoverned(id);
334
+ // At this point validate is guaranteed to be defined (we returned if compile failed)
335
+ const validator: ValidateFunction = validate;
336
+ for (const nodeId of governedIds) {
337
+ const node = await this.graph.getNode(nodeId);
338
+ if (!node) continue;
339
+
340
+ result.validatedCount++;
341
+ const valid = validator(node);
342
+ if (!valid) {
343
+ result.passed = false;
344
+ const errors = validator.errors as ErrorObject[] | null | undefined;
345
+ if (errors) {
346
+ for (const err of errors) {
347
+ result.errors.push(`${nodeId}: ${err.instancePath} ${err.message}`);
348
+ }
349
+ }
350
+ }
351
+ }
352
+
353
+ return result;
354
+ }
355
+
356
+ /**
357
+ * Check all guarantees
358
+ */
359
+ async checkAllGuarantees(): Promise<{
360
+ total: number;
361
+ passed: number;
362
+ failed: number;
363
+ results: CheckGuaranteeResult[];
364
+ }> {
365
+ const guarantees = await this.findGuarantees();
366
+ const results: CheckGuaranteeResult[] = [];
367
+ let passed = 0;
368
+ let failed = 0;
369
+
370
+ for (const g of guarantees) {
371
+ const result = await this.checkGuarantee(g.id);
372
+ results.push(result);
373
+ if (result.passed) passed++;
374
+ else failed++;
375
+ }
376
+
377
+ return {
378
+ total: guarantees.length,
379
+ passed,
380
+ failed,
381
+ results,
382
+ };
383
+ }
384
+
385
+ /**
386
+ * Normalize type filter to array of types
387
+ */
388
+ private normalizeTypeFilter(type?: GuaranteeType | GuaranteeType[]): GuaranteeType[] {
389
+ if (!type) {
390
+ return GuaranteeNode.getTypes();
391
+ }
392
+ return Array.isArray(type) ? type : [type];
393
+ }
394
+
395
+ /**
396
+ * Clear schema cache (useful after schema updates)
397
+ */
398
+ clearSchemaCache(): void {
399
+ this.schemaCache.clear();
400
+ }
401
+ }