@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.
- package/LICENSE +190 -0
- package/README.md +76 -0
- package/dist/Orchestrator.d.ts +142 -0
- package/dist/Orchestrator.d.ts.map +1 -0
- package/dist/Orchestrator.js +481 -0
- package/dist/api/GraphAPI.d.ts +87 -0
- package/dist/api/GraphAPI.d.ts.map +1 -0
- package/dist/api/GraphAPI.js +210 -0
- package/dist/api/GuaranteeAPI.d.ts +147 -0
- package/dist/api/GuaranteeAPI.d.ts.map +1 -0
- package/dist/api/GuaranteeAPI.js +288 -0
- package/dist/core/ASTWorker.d.ts +133 -0
- package/dist/core/ASTWorker.d.ts.map +1 -0
- package/dist/core/ASTWorker.js +352 -0
- package/dist/core/ASTWorkerPool.d.ts +85 -0
- package/dist/core/ASTWorkerPool.d.ts.map +1 -0
- package/dist/core/ASTWorkerPool.js +207 -0
- package/dist/core/AnalysisQueue.d.ts +104 -0
- package/dist/core/AnalysisQueue.d.ts.map +1 -0
- package/dist/core/AnalysisQueue.js +299 -0
- package/dist/core/AnalysisWorker.d.ts +14 -0
- package/dist/core/AnalysisWorker.d.ts.map +1 -0
- package/dist/core/AnalysisWorker.js +307 -0
- package/dist/core/GraphBackend.d.ts +156 -0
- package/dist/core/GraphBackend.d.ts.map +1 -0
- package/dist/core/GraphBackend.js +85 -0
- package/dist/core/GuaranteeManager.d.ts +230 -0
- package/dist/core/GuaranteeManager.d.ts.map +1 -0
- package/dist/core/GuaranteeManager.js +352 -0
- package/dist/core/ManifestStore.d.ts +71 -0
- package/dist/core/ManifestStore.d.ts.map +1 -0
- package/dist/core/ManifestStore.js +146 -0
- package/dist/core/NodeFactory.d.ts +160 -0
- package/dist/core/NodeFactory.d.ts.map +1 -0
- package/dist/core/NodeFactory.js +137 -0
- package/dist/core/NodeId.d.ts +88 -0
- package/dist/core/NodeId.d.ts.map +1 -0
- package/dist/core/NodeId.js +170 -0
- package/dist/core/ParallelAnalyzer.d.ts +120 -0
- package/dist/core/ParallelAnalyzer.d.ts.map +1 -0
- package/dist/core/ParallelAnalyzer.js +331 -0
- package/dist/core/PriorityQueue.d.ts +106 -0
- package/dist/core/PriorityQueue.d.ts.map +1 -0
- package/dist/core/PriorityQueue.js +168 -0
- package/dist/core/Profiler.d.ts +75 -0
- package/dist/core/Profiler.d.ts.map +1 -0
- package/dist/core/Profiler.js +149 -0
- package/dist/core/QueueWorker.d.ts +12 -0
- package/dist/core/QueueWorker.d.ts.map +1 -0
- package/dist/core/QueueWorker.js +567 -0
- package/dist/core/RFDBClient.d.ts +179 -0
- package/dist/core/RFDBClient.d.ts.map +1 -0
- package/dist/core/RFDBClient.js +429 -0
- package/dist/core/Task.d.ts +56 -0
- package/dist/core/Task.d.ts.map +1 -0
- package/dist/core/Task.js +85 -0
- package/dist/core/TaskTypes.d.ts +20 -0
- package/dist/core/TaskTypes.d.ts.map +1 -0
- package/dist/core/TaskTypes.js +10 -0
- package/dist/core/VersionManager.d.ts +166 -0
- package/dist/core/VersionManager.d.ts.map +1 -0
- package/dist/core/VersionManager.js +237 -0
- package/dist/core/WorkerPool.d.ts +82 -0
- package/dist/core/WorkerPool.d.ts.map +1 -0
- package/dist/core/WorkerPool.js +109 -0
- package/dist/core/nodes/CallSiteNode.d.ts +26 -0
- package/dist/core/nodes/CallSiteNode.d.ts.map +1 -0
- package/dist/core/nodes/CallSiteNode.js +44 -0
- package/dist/core/nodes/ClassNode.d.ts +25 -0
- package/dist/core/nodes/ClassNode.d.ts.map +1 -0
- package/dist/core/nodes/ClassNode.js +40 -0
- package/dist/core/nodes/ConstantNode.d.ts +24 -0
- package/dist/core/nodes/ConstantNode.d.ts.map +1 -0
- package/dist/core/nodes/ConstantNode.js +39 -0
- package/dist/core/nodes/DatabaseQueryNode.d.ts +22 -0
- package/dist/core/nodes/DatabaseQueryNode.d.ts.map +1 -0
- package/dist/core/nodes/DatabaseQueryNode.js +37 -0
- package/dist/core/nodes/EntrypointNode.d.ts +102 -0
- package/dist/core/nodes/EntrypointNode.d.ts.map +1 -0
- package/dist/core/nodes/EntrypointNode.js +119 -0
- package/dist/core/nodes/EventListenerNode.d.ts +25 -0
- package/dist/core/nodes/EventListenerNode.d.ts.map +1 -0
- package/dist/core/nodes/EventListenerNode.js +39 -0
- package/dist/core/nodes/ExportNode.d.ts +26 -0
- package/dist/core/nodes/ExportNode.d.ts.map +1 -0
- package/dist/core/nodes/ExportNode.js +40 -0
- package/dist/core/nodes/ExternalStdioNode.d.ts +17 -0
- package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -0
- package/dist/core/nodes/ExternalStdioNode.js +26 -0
- package/dist/core/nodes/FunctionNode.d.ts +27 -0
- package/dist/core/nodes/FunctionNode.d.ts.map +1 -0
- package/dist/core/nodes/FunctionNode.js +53 -0
- package/dist/core/nodes/GuaranteeNode.d.ts +76 -0
- package/dist/core/nodes/GuaranteeNode.d.ts.map +1 -0
- package/dist/core/nodes/GuaranteeNode.js +117 -0
- package/dist/core/nodes/HttpRequestNode.d.ts +24 -0
- package/dist/core/nodes/HttpRequestNode.d.ts.map +1 -0
- package/dist/core/nodes/HttpRequestNode.js +38 -0
- package/dist/core/nodes/ImportNode.d.ts +27 -0
- package/dist/core/nodes/ImportNode.d.ts.map +1 -0
- package/dist/core/nodes/ImportNode.js +43 -0
- package/dist/core/nodes/LiteralNode.d.ts +26 -0
- package/dist/core/nodes/LiteralNode.d.ts.map +1 -0
- package/dist/core/nodes/LiteralNode.js +40 -0
- package/dist/core/nodes/MethodCallNode.d.ts +29 -0
- package/dist/core/nodes/MethodCallNode.d.ts.map +1 -0
- package/dist/core/nodes/MethodCallNode.js +47 -0
- package/dist/core/nodes/MethodNode.d.ts +29 -0
- package/dist/core/nodes/MethodNode.d.ts.map +1 -0
- package/dist/core/nodes/MethodNode.js +44 -0
- package/dist/core/nodes/ModuleNode.d.ts +29 -0
- package/dist/core/nodes/ModuleNode.d.ts.map +1 -0
- package/dist/core/nodes/ModuleNode.js +49 -0
- package/dist/core/nodes/NodeKind.d.ts +91 -0
- package/dist/core/nodes/NodeKind.d.ts.map +1 -0
- package/dist/core/nodes/NodeKind.js +146 -0
- package/dist/core/nodes/ParameterNode.d.ts +26 -0
- package/dist/core/nodes/ParameterNode.d.ts.map +1 -0
- package/dist/core/nodes/ParameterNode.js +43 -0
- package/dist/core/nodes/ScopeNode.d.ts +32 -0
- package/dist/core/nodes/ScopeNode.d.ts.map +1 -0
- package/dist/core/nodes/ScopeNode.js +47 -0
- package/dist/core/nodes/ServiceNode.d.ts +44 -0
- package/dist/core/nodes/ServiceNode.d.ts.map +1 -0
- package/dist/core/nodes/ServiceNode.js +49 -0
- package/dist/core/nodes/VariableDeclarationNode.d.ts +22 -0
- package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -0
- package/dist/core/nodes/VariableDeclarationNode.js +38 -0
- package/dist/core/nodes/index.d.ts +25 -0
- package/dist/core/nodes/index.d.ts.map +1 -0
- package/dist/core/nodes/index.js +30 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/plugins/Plugin.d.ts +44 -0
- package/dist/plugins/Plugin.d.ts.map +1 -0
- package/dist/plugins/Plugin.js +46 -0
- package/dist/plugins/analysis/DatabaseAnalyzer.d.ts +23 -0
- package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/DatabaseAnalyzer.js +260 -0
- package/dist/plugins/analysis/ExpressAnalyzer.d.ts +19 -0
- package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/ExpressAnalyzer.js +306 -0
- package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts +17 -0
- package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/ExpressRouteAnalyzer.js +308 -0
- package/dist/plugins/analysis/FetchAnalyzer.d.ts +38 -0
- package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/FetchAnalyzer.js +344 -0
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +65 -0
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -0
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +472 -0
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts +84 -0
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/JSASTAnalyzer.js +1378 -0
- package/dist/plugins/analysis/ReactAnalyzer.d.ts +90 -0
- package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/ReactAnalyzer.js +1153 -0
- package/dist/plugins/analysis/RustAnalyzer.d.ts +13 -0
- package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/RustAnalyzer.js +259 -0
- package/dist/plugins/analysis/SQLiteAnalyzer.d.ts +21 -0
- package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/SQLiteAnalyzer.js +317 -0
- package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts +35 -0
- package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/ServiceLayerAnalyzer.js +303 -0
- package/dist/plugins/analysis/SocketIOAnalyzer.d.ts +33 -0
- package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/SocketIOAnalyzer.js +283 -0
- package/dist/plugins/analysis/SystemDbAnalyzer.d.ts +27 -0
- package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/SystemDbAnalyzer.js +211 -0
- package/dist/plugins/analysis/ast/ConditionParser.d.ts +85 -0
- package/dist/plugins/analysis/ast/ConditionParser.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/ConditionParser.js +277 -0
- package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts +15 -0
- package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/ExpressionEvaluator.js +91 -0
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts +77 -0
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/GraphBuilder.js +1077 -0
- package/dist/plugins/analysis/ast/OxcAdapter.d.ts +41 -0
- package/dist/plugins/analysis/ast/OxcAdapter.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/OxcAdapter.js +40 -0
- package/dist/plugins/analysis/ast/types.d.ts +346 -0
- package/dist/plugins/analysis/ast/types.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/types.js +4 -0
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +93 -0
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +24 -0
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +77 -0
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +377 -0
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +27 -0
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +232 -0
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +25 -0
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +172 -0
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts +29 -0
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +180 -0
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +14 -0
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +200 -0
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +45 -0
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +150 -0
- package/dist/plugins/analysis/ast/visitors/index.d.ts +17 -0
- package/dist/plugins/analysis/ast/visitors/index.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/index.js +13 -0
- package/dist/plugins/discovery/DiscoveryPlugin.d.ts +34 -0
- package/dist/plugins/discovery/DiscoveryPlugin.d.ts.map +1 -0
- package/dist/plugins/discovery/DiscoveryPlugin.js +26 -0
- package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts +26 -0
- package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -0
- package/dist/plugins/discovery/MonorepoServiceDiscovery.js +79 -0
- package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts +14 -0
- package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -0
- package/dist/plugins/discovery/SimpleProjectDiscovery.js +65 -0
- package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +19 -0
- package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +1 -0
- package/dist/plugins/discovery/ZonServiceDiscovery.js +204 -0
- package/dist/plugins/enrichment/AliasTracker.d.ts +40 -0
- package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -0
- package/dist/plugins/enrichment/AliasTracker.js +290 -0
- package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +30 -0
- package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -0
- package/dist/plugins/enrichment/HTTPConnectionEnricher.js +135 -0
- package/dist/plugins/enrichment/ImportExportLinker.d.ts +30 -0
- package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -0
- package/dist/plugins/enrichment/ImportExportLinker.js +176 -0
- package/dist/plugins/enrichment/InstanceOfResolver.d.ts +21 -0
- package/dist/plugins/enrichment/InstanceOfResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/InstanceOfResolver.js +117 -0
- package/dist/plugins/enrichment/MethodCallResolver.d.ts +41 -0
- package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/MethodCallResolver.js +252 -0
- package/dist/plugins/enrichment/MountPointResolver.d.ts +26 -0
- package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/MountPointResolver.js +189 -0
- package/dist/plugins/enrichment/PrefixEvaluator.d.ts +89 -0
- package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -0
- package/dist/plugins/enrichment/PrefixEvaluator.js +415 -0
- package/dist/plugins/enrichment/RustFFIEnricher.d.ts +25 -0
- package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -0
- package/dist/plugins/enrichment/RustFFIEnricher.js +170 -0
- package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +114 -0
- package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -0
- package/dist/plugins/enrichment/ValueDomainAnalyzer.js +464 -0
- package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts +27 -0
- package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -0
- package/dist/plugins/indexing/IncrementalModuleIndexer.js +238 -0
- package/dist/plugins/indexing/JSModuleIndexer.d.ts +33 -0
- package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -0
- package/dist/plugins/indexing/JSModuleIndexer.js +299 -0
- package/dist/plugins/indexing/RustModuleIndexer.d.ts +28 -0
- package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -0
- package/dist/plugins/indexing/RustModuleIndexer.js +140 -0
- package/dist/plugins/indexing/ServiceDetector.d.ts +46 -0
- package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -0
- package/dist/plugins/indexing/ServiceDetector.js +164 -0
- package/dist/plugins/validation/CallResolverValidator.d.ts +23 -0
- package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -0
- package/dist/plugins/validation/CallResolverValidator.js +108 -0
- package/dist/plugins/validation/DataFlowValidator.d.ts +24 -0
- package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -0
- package/dist/plugins/validation/DataFlowValidator.js +148 -0
- package/dist/plugins/validation/EvalBanValidator.d.ts +25 -0
- package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -0
- package/dist/plugins/validation/EvalBanValidator.js +123 -0
- package/dist/plugins/validation/GraphConnectivityValidator.d.ts +11 -0
- package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -0
- package/dist/plugins/validation/GraphConnectivityValidator.js +135 -0
- package/dist/plugins/validation/SQLInjectionValidator.d.ts +43 -0
- package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -0
- package/dist/plugins/validation/SQLInjectionValidator.js +251 -0
- package/dist/plugins/validation/ShadowingDetector.d.ts +26 -0
- package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -0
- package/dist/plugins/validation/ShadowingDetector.js +119 -0
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts +21 -0
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -0
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +151 -0
- package/dist/plugins/vcs/GitPlugin.d.ts +84 -0
- package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -0
- package/dist/plugins/vcs/GitPlugin.js +295 -0
- package/dist/plugins/vcs/VCSPlugin.d.ts +133 -0
- package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -0
- package/dist/plugins/vcs/VCSPlugin.js +82 -0
- package/dist/plugins/vcs/index.d.ts +10 -0
- package/dist/plugins/vcs/index.d.ts.map +1 -0
- package/dist/plugins/vcs/index.js +18 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts +258 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -0
- package/dist/storage/backends/RFDBServerBackend.js +565 -0
- package/dist/storage/backends/typeValidation.d.ts +47 -0
- package/dist/storage/backends/typeValidation.d.ts.map +1 -0
- package/dist/storage/backends/typeValidation.js +137 -0
- package/dist/validation/PathValidator.d.ts +81 -0
- package/dist/validation/PathValidator.d.ts.map +1 -0
- package/dist/validation/PathValidator.js +251 -0
- package/package.json +57 -0
- package/src/.rfguard/current-session.txt +1 -0
- package/src/Orchestrator.ts +673 -0
- package/src/api/GraphAPI.ts +305 -0
- package/src/api/GuaranteeAPI.ts +401 -0
- package/src/core/ASTWorker.ts +567 -0
- package/src/core/ASTWorkerPool.ts +299 -0
- package/src/core/AnalysisQueue.ts +447 -0
- package/src/core/AnalysisWorker.ts +410 -0
- package/src/core/GraphBackend.ts +265 -0
- package/src/core/GuaranteeManager.ts +581 -0
- package/src/core/ManifestStore.ts +196 -0
- package/src/core/NodeFactory.ts +274 -0
- package/src/core/NodeId.ts +257 -0
- package/src/core/ParallelAnalyzer.ts +476 -0
- package/src/core/PriorityQueue.ts +227 -0
- package/src/core/Profiler.ts +188 -0
- package/src/core/QueueWorker.ts +780 -0
- package/src/core/Task.ts +107 -0
- package/src/core/TaskTypes.ts +40 -0
- package/src/core/VersionManager.ts +404 -0
- package/src/core/WorkerPool.ts +180 -0
- package/src/core/nodes/CallSiteNode.ts +72 -0
- package/src/core/nodes/ClassNode.ts +69 -0
- package/src/core/nodes/ConstantNode.ts +63 -0
- package/src/core/nodes/DatabaseQueryNode.ts +60 -0
- package/src/core/nodes/EntrypointNode.ts +164 -0
- package/src/core/nodes/EventListenerNode.ts +64 -0
- package/src/core/nodes/ExportNode.ts +71 -0
- package/src/core/nodes/ExternalStdioNode.ts +36 -0
- package/src/core/nodes/FunctionNode.ts +78 -0
- package/src/core/nodes/GuaranteeNode.ts +162 -0
- package/src/core/nodes/HttpRequestNode.ts +63 -0
- package/src/core/nodes/ImportNode.ts +75 -0
- package/src/core/nodes/LiteralNode.ts +67 -0
- package/src/core/nodes/MethodCallNode.ts +79 -0
- package/src/core/nodes/MethodNode.ts +78 -0
- package/src/core/nodes/ModuleNode.ts +74 -0
- package/src/core/nodes/NodeKind.ts +171 -0
- package/src/core/nodes/ParameterNode.ts +73 -0
- package/src/core/nodes/ScopeNode.ts +80 -0
- package/src/core/nodes/ServiceNode.ts +86 -0
- package/src/core/nodes/VariableDeclarationNode.ts +60 -0
- package/src/core/nodes/index.ts +49 -0
- package/src/index.ts +93 -0
- package/src/plugins/Plugin.ts +74 -0
- package/src/plugins/analysis/DatabaseAnalyzer.ts +322 -0
- package/src/plugins/analysis/ExpressAnalyzer.ts +401 -0
- package/src/plugins/analysis/ExpressRouteAnalyzer.ts +414 -0
- package/src/plugins/analysis/FetchAnalyzer.ts +441 -0
- package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +686 -0
- package/src/plugins/analysis/JSASTAnalyzer.ts +1680 -0
- package/src/plugins/analysis/ReactAnalyzer.ts +1368 -0
- package/src/plugins/analysis/RustAnalyzer.ts +438 -0
- package/src/plugins/analysis/SQLiteAnalyzer.ts +388 -0
- package/src/plugins/analysis/ServiceLayerAnalyzer.ts +429 -0
- package/src/plugins/analysis/SocketIOAnalyzer.ts +395 -0
- package/src/plugins/analysis/SystemDbAnalyzer.ts +284 -0
- package/src/plugins/analysis/ast/ConditionParser.ts +333 -0
- package/src/plugins/analysis/ast/ExpressionEvaluator.ts +117 -0
- package/src/plugins/analysis/ast/GraphBuilder.ts +1371 -0
- package/src/plugins/analysis/ast/OxcAdapter.ts +63 -0
- package/src/plugins/analysis/ast/types.ts +400 -0
- package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +137 -0
- package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +528 -0
- package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +339 -0
- package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +273 -0
- package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +259 -0
- package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +235 -0
- package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +268 -0
- package/src/plugins/analysis/ast/visitors/index.ts +36 -0
- package/src/plugins/discovery/DiscoveryPlugin.ts +50 -0
- package/src/plugins/discovery/MonorepoServiceDiscovery.ts +117 -0
- package/src/plugins/discovery/SimpleProjectDiscovery.ts +102 -0
- package/src/plugins/enrichment/AliasTracker.ts +399 -0
- package/src/plugins/enrichment/HTTPConnectionEnricher.ts +192 -0
- package/src/plugins/enrichment/ImportExportLinker.ts +221 -0
- package/src/plugins/enrichment/InstanceOfResolver.ts +165 -0
- package/src/plugins/enrichment/MethodCallResolver.ts +333 -0
- package/src/plugins/enrichment/MountPointResolver.ts +264 -0
- package/src/plugins/enrichment/PrefixEvaluator.ts +527 -0
- package/src/plugins/enrichment/RustFFIEnricher.ts +218 -0
- package/src/plugins/enrichment/ValueDomainAnalyzer.ts +682 -0
- package/src/plugins/indexing/IncrementalModuleIndexer.ts +287 -0
- package/src/plugins/indexing/JSModuleIndexer.ts +374 -0
- package/src/plugins/indexing/RustModuleIndexer.ts +160 -0
- package/src/plugins/indexing/ServiceDetector.ts +230 -0
- package/src/plugins/validation/CallResolverValidator.ts +170 -0
- package/src/plugins/validation/DataFlowValidator.ts +233 -0
- package/src/plugins/validation/EvalBanValidator.ts +175 -0
- package/src/plugins/validation/GraphConnectivityValidator.ts +201 -0
- package/src/plugins/validation/SQLInjectionValidator.ts +363 -0
- package/src/plugins/validation/ShadowingDetector.ts +173 -0
- package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +203 -0
- package/src/plugins/vcs/GitPlugin.ts +344 -0
- package/src/plugins/vcs/VCSPlugin.ts +190 -0
- package/src/plugins/vcs/index.ts +32 -0
- package/src/storage/backends/RFDBServerBackend.ts +687 -0
- package/src/storage/backends/typeValidation.ts +151 -0
- package/src/validation/PathValidator.ts +342 -0
|
@@ -0,0 +1,687 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RFDBServerBackend - Graph backend using RFDB server via Unix socket
|
|
3
|
+
*
|
|
4
|
+
* Replaces ReginaFlowBackend's direct NAPI binding with socket-based
|
|
5
|
+
* communication to a shared RFDB server. This allows multiple processes
|
|
6
|
+
* (MCP server, analysis workers) to share the same graph database.
|
|
7
|
+
*
|
|
8
|
+
* Socket path defaults to `{dbPath}/../rfdb.sock` (e.g., .grafema/rfdb.sock),
|
|
9
|
+
* ensuring each project has its own socket and avoiding conflicts when
|
|
10
|
+
* multiple MCP instances run simultaneously.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* const backend = new RFDBServerBackend({
|
|
14
|
+
* dbPath: '/project/.grafema/graph.rfdb' // socket will be /project/.grafema/rfdb.sock
|
|
15
|
+
* });
|
|
16
|
+
* await backend.connect();
|
|
17
|
+
* await backend.addNodes([...]);
|
|
18
|
+
* await backend.flush();
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { RFDBClient } from '@grafema/rfdb-client';
|
|
22
|
+
import { existsSync, unlinkSync } from 'fs';
|
|
23
|
+
import { spawn, type ChildProcess } from 'child_process';
|
|
24
|
+
import { join, dirname } from 'path';
|
|
25
|
+
import { fileURLToPath } from 'url';
|
|
26
|
+
import { setTimeout as sleep } from 'timers/promises';
|
|
27
|
+
|
|
28
|
+
import type { WireNode, WireEdge } from '@grafema/types';
|
|
29
|
+
import type { NodeType, EdgeType } from '@grafema/types';
|
|
30
|
+
import type { AttrQuery, GraphStats, GraphExport } from '../../core/GraphBackend.js';
|
|
31
|
+
|
|
32
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
33
|
+
const __dirname = dirname(__filename);
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Options for RFDBServerBackend
|
|
37
|
+
*/
|
|
38
|
+
export interface RFDBServerBackendOptions {
|
|
39
|
+
socketPath?: string;
|
|
40
|
+
dbPath?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Node as returned from the backend
|
|
45
|
+
*/
|
|
46
|
+
export interface BackendNode {
|
|
47
|
+
id: string;
|
|
48
|
+
type: string;
|
|
49
|
+
nodeType: string;
|
|
50
|
+
name: string;
|
|
51
|
+
file: string;
|
|
52
|
+
exported: boolean;
|
|
53
|
+
[key: string]: unknown;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Edge as returned from the backend
|
|
58
|
+
*/
|
|
59
|
+
export interface BackendEdge {
|
|
60
|
+
src: string;
|
|
61
|
+
dst: string;
|
|
62
|
+
type: string;
|
|
63
|
+
edgeType: string;
|
|
64
|
+
[key: string]: unknown;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Input node format (flexible)
|
|
69
|
+
*/
|
|
70
|
+
export interface InputNode {
|
|
71
|
+
id: string;
|
|
72
|
+
type?: string;
|
|
73
|
+
nodeType?: string;
|
|
74
|
+
node_type?: string;
|
|
75
|
+
name?: string;
|
|
76
|
+
file?: string;
|
|
77
|
+
exported?: boolean;
|
|
78
|
+
[key: string]: unknown;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Input edge format (flexible)
|
|
83
|
+
*/
|
|
84
|
+
export interface InputEdge {
|
|
85
|
+
src: string;
|
|
86
|
+
dst: string;
|
|
87
|
+
type?: string;
|
|
88
|
+
edgeType?: string;
|
|
89
|
+
edge_type?: string;
|
|
90
|
+
[key: string]: unknown;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Query for finding nodes
|
|
95
|
+
*/
|
|
96
|
+
export interface NodeQuery {
|
|
97
|
+
nodeType?: NodeType;
|
|
98
|
+
type?: NodeType;
|
|
99
|
+
name?: string;
|
|
100
|
+
file?: string;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Backend statistics
|
|
105
|
+
*/
|
|
106
|
+
export interface BackendStats extends GraphStats {
|
|
107
|
+
nodesByType: Record<string, number>;
|
|
108
|
+
edgesByType: Record<string, number>;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export class RFDBServerBackend {
|
|
112
|
+
readonly socketPath: string;
|
|
113
|
+
readonly dbPath: string | undefined;
|
|
114
|
+
private client: RFDBClient | null;
|
|
115
|
+
private serverProcess: ChildProcess | null;
|
|
116
|
+
connected: boolean; // Public for compatibility
|
|
117
|
+
private edgeTypes: Set<string>;
|
|
118
|
+
private _cachedNodeCounts: Record<string, number> | undefined;
|
|
119
|
+
private _cachedEdgeCounts: Record<string, number> | undefined;
|
|
120
|
+
|
|
121
|
+
constructor(options: RFDBServerBackendOptions = {}) {
|
|
122
|
+
this.dbPath = options.dbPath;
|
|
123
|
+
// Default socket path: next to the database in .grafema folder
|
|
124
|
+
// This ensures each project has its own socket, avoiding conflicts
|
|
125
|
+
if (options.socketPath) {
|
|
126
|
+
this.socketPath = options.socketPath;
|
|
127
|
+
} else if (this.dbPath) {
|
|
128
|
+
this.socketPath = join(dirname(this.dbPath), 'rfdb.sock');
|
|
129
|
+
} else {
|
|
130
|
+
this.socketPath = '/tmp/rfdb.sock'; // fallback, not recommended
|
|
131
|
+
}
|
|
132
|
+
this.client = null;
|
|
133
|
+
this.serverProcess = null;
|
|
134
|
+
this.connected = false;
|
|
135
|
+
this.edgeTypes = new Set();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Connect to RFDB server, starting it if necessary
|
|
140
|
+
*/
|
|
141
|
+
async connect(): Promise<void> {
|
|
142
|
+
if (this.connected) return;
|
|
143
|
+
|
|
144
|
+
// Try to connect first
|
|
145
|
+
this.client = new RFDBClient(this.socketPath);
|
|
146
|
+
|
|
147
|
+
try {
|
|
148
|
+
await this.client.connect();
|
|
149
|
+
// Verify server is responsive
|
|
150
|
+
await this.client.ping();
|
|
151
|
+
this.connected = true;
|
|
152
|
+
console.log(`[RFDBServerBackend] Connected to existing RFDB server at ${this.socketPath}`);
|
|
153
|
+
return;
|
|
154
|
+
} catch {
|
|
155
|
+
// Server not running, need to start it
|
|
156
|
+
console.log(`[RFDBServerBackend] RFDB server not running, starting...`);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Start the server
|
|
160
|
+
await this._startServer();
|
|
161
|
+
|
|
162
|
+
// Connect again
|
|
163
|
+
this.client = new RFDBClient(this.socketPath);
|
|
164
|
+
await this.client.connect();
|
|
165
|
+
await this.client.ping();
|
|
166
|
+
this.connected = true;
|
|
167
|
+
console.log(`[RFDBServerBackend] Connected to RFDB server at ${this.socketPath}`);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Alias for connect()
|
|
172
|
+
*/
|
|
173
|
+
async initialize(): Promise<void> {
|
|
174
|
+
return this.connect();
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Start RFDB server process
|
|
179
|
+
*/
|
|
180
|
+
private async _startServer(): Promise<void> {
|
|
181
|
+
if (!this.dbPath) {
|
|
182
|
+
throw new Error('dbPath required to start RFDB server');
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Find server binary
|
|
186
|
+
const projectRoot = join(__dirname, '../../../../..');
|
|
187
|
+
const releaseBinary = join(projectRoot, 'rust-engine/target/release/rfdb-server');
|
|
188
|
+
const debugBinary = join(projectRoot, 'rust-engine/target/debug/rfdb-server');
|
|
189
|
+
|
|
190
|
+
let binaryPath = existsSync(releaseBinary) ? releaseBinary : debugBinary;
|
|
191
|
+
|
|
192
|
+
if (!existsSync(binaryPath)) {
|
|
193
|
+
console.log(`[RFDBServerBackend] Server binary not found, building...`);
|
|
194
|
+
const { execSync } = await import('child_process');
|
|
195
|
+
execSync('cargo build --bin rfdb-server', {
|
|
196
|
+
cwd: join(projectRoot, 'rust-engine'),
|
|
197
|
+
stdio: 'inherit',
|
|
198
|
+
});
|
|
199
|
+
binaryPath = debugBinary;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Remove stale socket
|
|
203
|
+
if (existsSync(this.socketPath)) {
|
|
204
|
+
unlinkSync(this.socketPath);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
console.log(`[RFDBServerBackend] Starting: ${binaryPath} ${this.dbPath} --socket ${this.socketPath}`);
|
|
208
|
+
|
|
209
|
+
this.serverProcess = spawn(binaryPath, [this.dbPath, '--socket', this.socketPath], {
|
|
210
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
211
|
+
detached: true, // Allow server to outlive this process
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
// Don't let server process prevent parent from exiting
|
|
215
|
+
this.serverProcess.unref();
|
|
216
|
+
|
|
217
|
+
this.serverProcess.stderr?.on('data', (data: Buffer) => {
|
|
218
|
+
const msg = data.toString().trim();
|
|
219
|
+
if (!msg.includes('FLUSH') && !msg.includes('WRITER')) {
|
|
220
|
+
console.log(`[rfdb-server] ${msg}`);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
this.serverProcess.on('error', (err: Error) => {
|
|
225
|
+
console.error(`[RFDBServerBackend] Server process error:`, err);
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
// Wait for socket to appear
|
|
229
|
+
let attempts = 0;
|
|
230
|
+
while (!existsSync(this.socketPath) && attempts < 50) {
|
|
231
|
+
await sleep(100);
|
|
232
|
+
attempts++;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (!existsSync(this.socketPath)) {
|
|
236
|
+
throw new Error(`RFDB server failed to start (socket not created after ${attempts * 100}ms)`);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
console.log(`[RFDBServerBackend] Server started on ${this.socketPath}`);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Close connection and stop server if we started it
|
|
244
|
+
*/
|
|
245
|
+
async close(): Promise<void> {
|
|
246
|
+
if (this.client) {
|
|
247
|
+
await this.client.close();
|
|
248
|
+
this.client = null;
|
|
249
|
+
}
|
|
250
|
+
this.connected = false;
|
|
251
|
+
|
|
252
|
+
// Kill server process if we started it
|
|
253
|
+
if (this.serverProcess) {
|
|
254
|
+
this.serverProcess.kill('SIGTERM');
|
|
255
|
+
this.serverProcess = null;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Clear the database
|
|
261
|
+
*/
|
|
262
|
+
async clear(): Promise<void> {
|
|
263
|
+
if (!this.client) throw new Error('Not connected');
|
|
264
|
+
await this.client.clear();
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Flush data to disk
|
|
269
|
+
*/
|
|
270
|
+
async flush(): Promise<void> {
|
|
271
|
+
if (!this.client) throw new Error('Not connected');
|
|
272
|
+
await this.client.flush();
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// ===========================================================================
|
|
276
|
+
// Node Operations
|
|
277
|
+
// ===========================================================================
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Add a single node
|
|
281
|
+
*/
|
|
282
|
+
async addNode(node: InputNode): Promise<void> {
|
|
283
|
+
return this.addNodes([node]);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Add multiple nodes
|
|
288
|
+
*/
|
|
289
|
+
async addNodes(nodes: InputNode[]): Promise<void> {
|
|
290
|
+
if (!this.client) throw new Error('Not connected');
|
|
291
|
+
if (!nodes.length) return;
|
|
292
|
+
|
|
293
|
+
const wireNodes: WireNode[] = nodes.map(n => {
|
|
294
|
+
// Extract metadata from node
|
|
295
|
+
const { id, type, nodeType, node_type, name, file, exported, ...rest } = n;
|
|
296
|
+
|
|
297
|
+
return {
|
|
298
|
+
id: String(id),
|
|
299
|
+
nodeType: (nodeType || node_type || type || 'UNKNOWN') as NodeType,
|
|
300
|
+
name: name || '',
|
|
301
|
+
file: file || '',
|
|
302
|
+
exported: exported || false,
|
|
303
|
+
metadata: JSON.stringify({ originalId: String(id), ...rest }),
|
|
304
|
+
};
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
await this.client.addNodes(wireNodes);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Add a single edge
|
|
312
|
+
*/
|
|
313
|
+
async addEdge(edge: InputEdge): Promise<void> {
|
|
314
|
+
return this.addEdges([edge]);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Add multiple edges
|
|
319
|
+
*/
|
|
320
|
+
async addEdges(edges: InputEdge[], skipValidation = false): Promise<void> {
|
|
321
|
+
if (!this.client) throw new Error('Not connected');
|
|
322
|
+
if (!edges.length) return;
|
|
323
|
+
|
|
324
|
+
// Track edge types
|
|
325
|
+
for (const e of edges) {
|
|
326
|
+
const edgeType = e.edgeType || e.edge_type || e.etype || e.type;
|
|
327
|
+
if (typeof edgeType === 'string') this.edgeTypes.add(edgeType);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
const wireEdges: WireEdge[] = edges.map(e => {
|
|
331
|
+
const { src, dst, type, edgeType, edge_type, etype, ...rest } = e;
|
|
332
|
+
|
|
333
|
+
return {
|
|
334
|
+
src: String(src),
|
|
335
|
+
dst: String(dst),
|
|
336
|
+
edgeType: (edgeType || edge_type || etype || type || 'UNKNOWN') as EdgeType,
|
|
337
|
+
// Store original string IDs in metadata for retrieval
|
|
338
|
+
metadata: JSON.stringify({ _origSrc: String(src), _origDst: String(dst), ...rest }),
|
|
339
|
+
};
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
await this.client.addEdges(wireEdges, skipValidation);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Get a node by ID
|
|
347
|
+
*/
|
|
348
|
+
async getNode(id: string): Promise<BackendNode | null> {
|
|
349
|
+
if (!this.client) throw new Error('Not connected');
|
|
350
|
+
const node = await this.client.getNode(String(id));
|
|
351
|
+
if (!node) return null;
|
|
352
|
+
|
|
353
|
+
return this._parseNode(node);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* Check if node exists
|
|
358
|
+
*/
|
|
359
|
+
async nodeExists(id: string): Promise<boolean> {
|
|
360
|
+
if (!this.client) throw new Error('Not connected');
|
|
361
|
+
return this.client.nodeExists(id);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Delete a node
|
|
366
|
+
*/
|
|
367
|
+
async deleteNode(id: string): Promise<void> {
|
|
368
|
+
if (!this.client) throw new Error('Not connected');
|
|
369
|
+
await this.client.deleteNode(id);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Find nodes by attributes
|
|
374
|
+
*/
|
|
375
|
+
async findByAttr(query: AttrQuery): Promise<string[]> {
|
|
376
|
+
if (!this.client) throw new Error('Not connected');
|
|
377
|
+
return this.client.findByAttr(query);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Parse a node from wire format to JS format
|
|
382
|
+
*/
|
|
383
|
+
private _parseNode(wireNode: WireNode): BackendNode {
|
|
384
|
+
const metadata: Record<string, unknown> = wireNode.metadata ? JSON.parse(wireNode.metadata) : {};
|
|
385
|
+
|
|
386
|
+
// Parse nested JSON strings
|
|
387
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
388
|
+
if (typeof value === 'string' && (value.startsWith('[') || value.startsWith('{'))) {
|
|
389
|
+
try {
|
|
390
|
+
metadata[key] = JSON.parse(value);
|
|
391
|
+
} catch {
|
|
392
|
+
// Not JSON, keep as string
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
const humanId = (metadata.originalId as string) || wireNode.id;
|
|
398
|
+
|
|
399
|
+
return {
|
|
400
|
+
id: humanId,
|
|
401
|
+
nodeType: wireNode.nodeType,
|
|
402
|
+
type: wireNode.nodeType,
|
|
403
|
+
name: wireNode.name,
|
|
404
|
+
file: wireNode.file,
|
|
405
|
+
exported: wireNode.exported,
|
|
406
|
+
...metadata,
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* Async generator for querying nodes
|
|
412
|
+
*/
|
|
413
|
+
async *queryNodes(query: NodeQuery): AsyncGenerator<BackendNode, void, unknown> {
|
|
414
|
+
if (!this.client) throw new Error('Not connected');
|
|
415
|
+
|
|
416
|
+
// Build query for server
|
|
417
|
+
const serverQuery: NodeQuery = {};
|
|
418
|
+
if (query.nodeType) serverQuery.nodeType = query.nodeType;
|
|
419
|
+
if (query.type) serverQuery.nodeType = query.type;
|
|
420
|
+
if (query.name) serverQuery.name = query.name;
|
|
421
|
+
if (query.file) serverQuery.file = query.file;
|
|
422
|
+
|
|
423
|
+
// Use findByType if only nodeType specified
|
|
424
|
+
if (serverQuery.nodeType && Object.keys(serverQuery).length === 1) {
|
|
425
|
+
const ids = await this.client.findByType(serverQuery.nodeType);
|
|
426
|
+
for (const id of ids) {
|
|
427
|
+
const node = await this.getNode(id);
|
|
428
|
+
if (node) yield node;
|
|
429
|
+
}
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// Otherwise use client's queryNodes
|
|
434
|
+
for await (const wireNode of this.client.queryNodes(serverQuery)) {
|
|
435
|
+
yield this._parseNode(wireNode);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* Get ALL nodes matching query (collects from queryNodes into array)
|
|
441
|
+
*/
|
|
442
|
+
async getAllNodes(query: NodeQuery = {}): Promise<BackendNode[]> {
|
|
443
|
+
const nodes: BackendNode[] = [];
|
|
444
|
+
for await (const node of this.queryNodes(query)) {
|
|
445
|
+
nodes.push(node);
|
|
446
|
+
}
|
|
447
|
+
return nodes;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// ===========================================================================
|
|
451
|
+
// Edge Operations
|
|
452
|
+
// ===========================================================================
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* Delete an edge
|
|
456
|
+
*/
|
|
457
|
+
async deleteEdge(src: string, dst: string, type: string): Promise<void> {
|
|
458
|
+
if (!this.client) throw new Error('Not connected');
|
|
459
|
+
await this.client.deleteEdge(src, dst, type as EdgeType);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* Get all edges
|
|
464
|
+
*/
|
|
465
|
+
async getAllEdges(): Promise<BackendEdge[]> {
|
|
466
|
+
return this.getAllEdgesAsync();
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* Get all edges (async version)
|
|
471
|
+
*/
|
|
472
|
+
async getAllEdgesAsync(): Promise<BackendEdge[]> {
|
|
473
|
+
if (!this.client) throw new Error('Not connected');
|
|
474
|
+
const edges = await this.client.getAllEdges();
|
|
475
|
+
return edges.map(e => {
|
|
476
|
+
const meta = JSON.parse(e.metadata || '{}');
|
|
477
|
+
// Use original string IDs if stored, otherwise use numeric IDs
|
|
478
|
+
const { _origSrc, _origDst, ...rest } = meta;
|
|
479
|
+
return {
|
|
480
|
+
src: _origSrc || e.src,
|
|
481
|
+
dst: _origDst || e.dst,
|
|
482
|
+
type: e.edgeType,
|
|
483
|
+
edgeType: e.edgeType,
|
|
484
|
+
...rest,
|
|
485
|
+
};
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
/**
|
|
490
|
+
* Get outgoing edges from a node
|
|
491
|
+
*/
|
|
492
|
+
async getOutgoingEdges(nodeId: string, edgeTypes: EdgeType[] | null = null): Promise<BackendEdge[]> {
|
|
493
|
+
if (!this.client) throw new Error('Not connected');
|
|
494
|
+
const edges = await this.client.getOutgoingEdges(nodeId, edgeTypes || undefined);
|
|
495
|
+
return edges.map(e => {
|
|
496
|
+
const meta = JSON.parse(e.metadata || '{}');
|
|
497
|
+
const { _origSrc, _origDst, ...rest } = meta;
|
|
498
|
+
return {
|
|
499
|
+
src: _origSrc || e.src,
|
|
500
|
+
dst: _origDst || e.dst,
|
|
501
|
+
type: e.edgeType,
|
|
502
|
+
edgeType: e.edgeType,
|
|
503
|
+
...rest,
|
|
504
|
+
};
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* Get incoming edges to a node
|
|
510
|
+
*/
|
|
511
|
+
async getIncomingEdges(nodeId: string, edgeTypes: EdgeType[] | null = null): Promise<BackendEdge[]> {
|
|
512
|
+
if (!this.client) throw new Error('Not connected');
|
|
513
|
+
const edges = await this.client.getIncomingEdges(nodeId, edgeTypes || undefined);
|
|
514
|
+
return edges.map(e => {
|
|
515
|
+
const meta = JSON.parse(e.metadata || '{}');
|
|
516
|
+
const { _origSrc, _origDst, ...rest } = meta;
|
|
517
|
+
return {
|
|
518
|
+
src: _origSrc || e.src,
|
|
519
|
+
dst: _origDst || e.dst,
|
|
520
|
+
type: e.edgeType,
|
|
521
|
+
edgeType: e.edgeType,
|
|
522
|
+
...rest,
|
|
523
|
+
};
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// ===========================================================================
|
|
528
|
+
// Graph Traversal
|
|
529
|
+
// ===========================================================================
|
|
530
|
+
|
|
531
|
+
/**
|
|
532
|
+
* BFS traversal
|
|
533
|
+
*/
|
|
534
|
+
async bfs(startIds: string[], maxDepth: number, edgeTypes: EdgeType[]): Promise<string[]> {
|
|
535
|
+
if (!this.client) throw new Error('Not connected');
|
|
536
|
+
return this.client.bfs(startIds, maxDepth, edgeTypes);
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
/**
|
|
540
|
+
* DFS traversal
|
|
541
|
+
*/
|
|
542
|
+
async dfs(startIds: string[], maxDepth: number, edgeTypes: EdgeType[] = []): Promise<string[]> {
|
|
543
|
+
if (!this.client) throw new Error('Not connected');
|
|
544
|
+
return this.client.dfs(startIds, maxDepth, edgeTypes);
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
// ===========================================================================
|
|
548
|
+
// Statistics
|
|
549
|
+
// ===========================================================================
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Get node count
|
|
553
|
+
*/
|
|
554
|
+
async nodeCount(): Promise<number> {
|
|
555
|
+
if (!this.client) throw new Error('Not connected');
|
|
556
|
+
return this.client.nodeCount();
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
/**
|
|
560
|
+
* Get edge count
|
|
561
|
+
*/
|
|
562
|
+
async edgeCount(): Promise<number> {
|
|
563
|
+
if (!this.client) throw new Error('Not connected');
|
|
564
|
+
return this.client.edgeCount();
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* Get statistics
|
|
569
|
+
*/
|
|
570
|
+
async getStats(): Promise<BackendStats> {
|
|
571
|
+
if (!this.client) throw new Error('Not connected');
|
|
572
|
+
const nodeCount = await this.client.nodeCount();
|
|
573
|
+
const edgeCount = await this.client.edgeCount();
|
|
574
|
+
const nodeCounts = await this.client.countNodesByType();
|
|
575
|
+
const edgeCounts = await this.client.countEdgesByType();
|
|
576
|
+
|
|
577
|
+
return {
|
|
578
|
+
nodeCount,
|
|
579
|
+
edgeCount,
|
|
580
|
+
nodesByType: nodeCounts,
|
|
581
|
+
edgesByType: edgeCounts,
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
* Count nodes by type (sync, returns cached value)
|
|
587
|
+
*/
|
|
588
|
+
async countNodesByType(_types: string[] | null = null): Promise<Record<string, number>> {
|
|
589
|
+
if (!this.client) throw new Error('Not connected');
|
|
590
|
+
return this.client.countNodesByType();
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
/**
|
|
594
|
+
* Count edges by type
|
|
595
|
+
*/
|
|
596
|
+
async countEdgesByType(_edgeTypes: string[] | null = null): Promise<Record<string, number>> {
|
|
597
|
+
if (!this.client) throw new Error('Not connected');
|
|
598
|
+
return this.client.countEdgesByType();
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
/**
|
|
602
|
+
* Refresh cached counts (call after analysis)
|
|
603
|
+
*/
|
|
604
|
+
async refreshCounts(): Promise<void> {
|
|
605
|
+
if (!this.client) throw new Error('Not connected');
|
|
606
|
+
this._cachedNodeCounts = await this.client.countNodesByType();
|
|
607
|
+
this._cachedEdgeCounts = await this.client.countEdgesByType();
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
// ===========================================================================
|
|
611
|
+
// Datalog Queries
|
|
612
|
+
// ===========================================================================
|
|
613
|
+
|
|
614
|
+
/**
|
|
615
|
+
* Check a guarantee (Datalog rule) and return violations
|
|
616
|
+
*/
|
|
617
|
+
async checkGuarantee(ruleSource: string): Promise<Array<{ bindings: Array<{ name: string; value: string }> }>> {
|
|
618
|
+
if (!this.client) throw new Error('Not connected');
|
|
619
|
+
const violations = await this.client.checkGuarantee(ruleSource);
|
|
620
|
+
// Convert bindings from {X: "value"} to [{name: "X", value: "value"}]
|
|
621
|
+
return violations.map(v => ({
|
|
622
|
+
bindings: Object.entries(v.bindings).map(([name, value]) => ({ name, value }))
|
|
623
|
+
}));
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
/**
|
|
627
|
+
* Load Datalog rules
|
|
628
|
+
*/
|
|
629
|
+
async datalogLoadRules(source: string): Promise<number> {
|
|
630
|
+
if (!this.client) throw new Error('Not connected');
|
|
631
|
+
return await this.client.datalogLoadRules(source);
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
/**
|
|
635
|
+
* Clear Datalog rules
|
|
636
|
+
*/
|
|
637
|
+
async datalogClearRules(): Promise<void> {
|
|
638
|
+
if (!this.client) throw new Error('Not connected');
|
|
639
|
+
await this.client.datalogClearRules();
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
/**
|
|
643
|
+
* Run a Datalog query
|
|
644
|
+
*/
|
|
645
|
+
async datalogQuery(query: string): Promise<Array<{ bindings: Array<{ name: string; value: string }> }>> {
|
|
646
|
+
if (!this.client) throw new Error('Not connected');
|
|
647
|
+
const results = await this.client.datalogQuery(query);
|
|
648
|
+
// Convert bindings from {X: "value"} to [{name: "X", value: "value"}]
|
|
649
|
+
return results.map(r => ({
|
|
650
|
+
bindings: Object.entries(r.bindings).map(([name, value]) => ({ name, value }))
|
|
651
|
+
}));
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
// ===========================================================================
|
|
655
|
+
// Export/Import
|
|
656
|
+
// ===========================================================================
|
|
657
|
+
|
|
658
|
+
/**
|
|
659
|
+
* Export graph (for tests)
|
|
660
|
+
*/
|
|
661
|
+
async export(): Promise<GraphExport> {
|
|
662
|
+
const nodes = await this.getAllNodes();
|
|
663
|
+
const edges = await this.getAllEdgesAsync();
|
|
664
|
+
return {
|
|
665
|
+
nodes: nodes as unknown as GraphExport['nodes'],
|
|
666
|
+
edges: edges as unknown as GraphExport['edges'],
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
/**
|
|
671
|
+
* Find nodes by predicate (for compatibility)
|
|
672
|
+
*/
|
|
673
|
+
async findNodes(predicate: (node: BackendNode) => boolean): Promise<BackendNode[]> {
|
|
674
|
+
const allNodes = await this.getAllNodes();
|
|
675
|
+
return allNodes.filter(predicate);
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
// ===========================================================================
|
|
679
|
+
// Graph property (for compatibility)
|
|
680
|
+
// ===========================================================================
|
|
681
|
+
|
|
682
|
+
get graph(): this {
|
|
683
|
+
return this;
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
export default RFDBServerBackend;
|