@grafema/core 0.1.0-alpha.5 → 0.1.1-alpha
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/README.md +0 -1
- package/dist/Orchestrator.d.ts +24 -2
- package/dist/Orchestrator.d.ts.map +1 -1
- package/dist/Orchestrator.js +197 -24
- package/dist/config/ConfigLoader.d.ts +72 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +187 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/core/ASTWorker.d.ts +11 -36
- package/dist/core/ASTWorker.d.ts.map +1 -1
- package/dist/core/ASTWorker.js +93 -99
- package/dist/core/CoverageAnalyzer.d.ts +65 -0
- package/dist/core/CoverageAnalyzer.d.ts.map +1 -0
- package/dist/core/CoverageAnalyzer.js +198 -0
- package/dist/core/FileNodeManager.d.ts +40 -0
- package/dist/core/FileNodeManager.d.ts.map +1 -0
- package/dist/core/FileNodeManager.js +84 -0
- package/dist/core/GraphFreshnessChecker.d.ts +33 -0
- package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
- package/dist/core/GraphFreshnessChecker.js +101 -0
- package/dist/core/HashUtils.d.ts +24 -0
- package/dist/core/HashUtils.d.ts.map +1 -0
- package/dist/core/HashUtils.js +45 -0
- package/dist/core/IncrementalReanalyzer.d.ts +36 -0
- package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
- package/dist/core/IncrementalReanalyzer.js +132 -0
- package/dist/core/NodeFactory.d.ts +225 -17
- package/dist/core/NodeFactory.d.ts.map +1 -1
- package/dist/core/NodeFactory.js +208 -18
- package/dist/core/ScopeTracker.d.ts +84 -0
- package/dist/core/ScopeTracker.d.ts.map +1 -0
- package/dist/core/ScopeTracker.js +116 -0
- package/dist/core/SemanticId.d.ts +90 -0
- package/dist/core/SemanticId.d.ts.map +1 -0
- package/dist/core/SemanticId.js +115 -0
- package/dist/core/VersionManager.d.ts.map +1 -1
- package/dist/core/VersionManager.js +3 -2
- package/dist/core/nodes/ArgumentExpressionNode.d.ts +43 -0
- package/dist/core/nodes/ArgumentExpressionNode.d.ts.map +1 -0
- package/dist/core/nodes/ArgumentExpressionNode.js +60 -0
- package/dist/core/nodes/ArrayLiteralNode.d.ts +27 -0
- package/dist/core/nodes/ArrayLiteralNode.d.ts.map +1 -0
- package/dist/core/nodes/ArrayLiteralNode.js +41 -0
- package/dist/core/nodes/CallSiteNode.d.ts +28 -0
- package/dist/core/nodes/CallSiteNode.d.ts.map +1 -1
- package/dist/core/nodes/CallSiteNode.js +46 -0
- package/dist/core/nodes/ClassNode.d.ts +33 -1
- package/dist/core/nodes/ClassNode.d.ts.map +1 -1
- package/dist/core/nodes/ClassNode.js +46 -2
- package/dist/core/nodes/DecoratorNode.d.ts +42 -0
- package/dist/core/nodes/DecoratorNode.d.ts.map +1 -0
- package/dist/core/nodes/DecoratorNode.js +62 -0
- package/dist/core/nodes/EnumNode.d.ts +42 -0
- package/dist/core/nodes/EnumNode.d.ts.map +1 -0
- package/dist/core/nodes/EnumNode.js +54 -0
- package/dist/core/nodes/ExportNode.d.ts +37 -1
- package/dist/core/nodes/ExportNode.d.ts.map +1 -1
- package/dist/core/nodes/ExportNode.js +48 -2
- package/dist/core/nodes/ExpressionNode.d.ts +97 -0
- package/dist/core/nodes/ExpressionNode.d.ts.map +1 -0
- package/dist/core/nodes/ExpressionNode.js +178 -0
- package/dist/core/nodes/ExternalModuleNode.d.ts +28 -0
- package/dist/core/nodes/ExternalModuleNode.d.ts.map +1 -0
- package/dist/core/nodes/ExternalModuleNode.js +41 -0
- package/dist/core/nodes/ExternalStdioNode.d.ts +13 -6
- package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -1
- package/dist/core/nodes/ExternalStdioNode.js +15 -8
- package/dist/core/nodes/FunctionNode.d.ts +36 -0
- package/dist/core/nodes/FunctionNode.d.ts.map +1 -1
- package/dist/core/nodes/FunctionNode.js +80 -1
- package/dist/core/nodes/ImportNode.d.ts +19 -5
- package/dist/core/nodes/ImportNode.d.ts.map +1 -1
- package/dist/core/nodes/ImportNode.js +23 -5
- package/dist/core/nodes/InterfaceNode.d.ts +46 -0
- package/dist/core/nodes/InterfaceNode.d.ts.map +1 -0
- package/dist/core/nodes/InterfaceNode.js +55 -0
- package/dist/core/nodes/IssueNode.d.ts +73 -0
- package/dist/core/nodes/IssueNode.d.ts.map +1 -0
- package/dist/core/nodes/IssueNode.js +129 -0
- package/dist/core/nodes/MethodCallNode.d.ts +30 -0
- package/dist/core/nodes/MethodCallNode.d.ts.map +1 -1
- package/dist/core/nodes/MethodCallNode.js +49 -0
- package/dist/core/nodes/MethodNode.d.ts +32 -0
- package/dist/core/nodes/MethodNode.d.ts.map +1 -1
- package/dist/core/nodes/MethodNode.js +48 -0
- package/dist/core/nodes/ModuleNode.d.ts +31 -0
- package/dist/core/nodes/ModuleNode.d.ts.map +1 -1
- package/dist/core/nodes/ModuleNode.js +37 -0
- package/dist/core/nodes/NetworkRequestNode.d.ts +54 -0
- package/dist/core/nodes/NetworkRequestNode.d.ts.map +1 -0
- package/dist/core/nodes/NetworkRequestNode.js +65 -0
- package/dist/core/nodes/ObjectLiteralNode.d.ts +27 -0
- package/dist/core/nodes/ObjectLiteralNode.d.ts.map +1 -0
- package/dist/core/nodes/ObjectLiteralNode.js +41 -0
- package/dist/core/nodes/ScopeNode.d.ts +31 -0
- package/dist/core/nodes/ScopeNode.d.ts.map +1 -1
- package/dist/core/nodes/ScopeNode.js +49 -0
- package/dist/core/nodes/TypeNode.d.ts +36 -0
- package/dist/core/nodes/TypeNode.d.ts.map +1 -0
- package/dist/core/nodes/TypeNode.js +53 -0
- package/dist/core/nodes/VariableDeclarationNode.d.ts +27 -0
- package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -1
- package/dist/core/nodes/VariableDeclarationNode.js +40 -0
- package/dist/core/nodes/index.d.ts +12 -1
- package/dist/core/nodes/index.d.ts.map +1 -1
- package/dist/core/nodes/index.js +14 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts +98 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticCollector.js +129 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts +77 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticReporter.js +159 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticWriter.js +43 -0
- package/dist/diagnostics/index.d.ts +14 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +11 -0
- package/dist/errors/GrafemaError.d.ts +118 -0
- package/dist/errors/GrafemaError.d.ts.map +1 -0
- package/dist/errors/GrafemaError.js +131 -0
- package/dist/index.d.ts +57 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -1
- package/dist/logging/Logger.d.ts +48 -0
- package/dist/logging/Logger.d.ts.map +1 -0
- package/dist/logging/Logger.js +134 -0
- package/dist/plugins/Plugin.d.ts +5 -1
- package/dist/plugins/Plugin.d.ts.map +1 -1
- package/dist/plugins/Plugin.js +33 -0
- package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/DatabaseAnalyzer.js +13 -6
- package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ExpressAnalyzer.js +27 -19
- package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ExpressRouteAnalyzer.js +21 -14
- package/dist/plugins/analysis/FetchAnalyzer.d.ts +1 -0
- package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/FetchAnalyzer.js +34 -14
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +6 -3
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -1
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +76 -80
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts +180 -17
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/JSASTAnalyzer.js +1171 -471
- package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ReactAnalyzer.js +56 -57
- package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/RustAnalyzer.js +15 -10
- package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/SQLiteAnalyzer.js +9 -7
- package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ServiceLayerAnalyzer.js +21 -9
- package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/SocketIOAnalyzer.js +27 -15
- package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/SystemDbAnalyzer.js +15 -5
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts +34 -4
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/GraphBuilder.js +318 -298
- package/dist/plugins/analysis/ast/IdGenerator.d.ts +105 -0
- package/dist/plugins/analysis/ast/IdGenerator.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/IdGenerator.js +116 -0
- package/dist/plugins/analysis/ast/types.d.ts +176 -5
- package/dist/plugins/analysis/ast/types.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts +33 -0
- package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/utils/createParameterNodes.js +89 -0
- package/dist/plugins/analysis/ast/utils/index.d.ts +6 -0
- package/dist/plugins/analysis/ast/utils/index.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/utils/index.js +5 -0
- package/dist/plugins/analysis/ast/utils/location.d.ts +87 -0
- package/dist/plugins/analysis/ast/utils/location.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/utils/location.js +78 -0
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +9 -4
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +6 -5
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +99 -9
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +663 -125
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +4 -1
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +72 -32
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +4 -1
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +128 -63
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +11 -8
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +12 -1
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +36 -14
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +4 -1
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +17 -13
- package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -1
- package/dist/plugins/discovery/MonorepoServiceDiscovery.js +3 -2
- package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -1
- package/dist/plugins/discovery/SimpleProjectDiscovery.js +5 -1
- package/dist/plugins/discovery/WorkspaceDiscovery.d.ts +22 -0
- package/dist/plugins/discovery/WorkspaceDiscovery.d.ts.map +1 -0
- package/dist/plugins/discovery/WorkspaceDiscovery.js +136 -0
- package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts +46 -0
- package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts.map +1 -0
- package/dist/plugins/discovery/resolveSourceEntrypoint.js +86 -0
- package/dist/plugins/discovery/workspaces/detector.d.ts +21 -0
- package/dist/plugins/discovery/workspaces/detector.d.ts.map +1 -0
- package/dist/plugins/discovery/workspaces/detector.js +49 -0
- package/dist/plugins/discovery/workspaces/globResolver.d.ts +35 -0
- package/dist/plugins/discovery/workspaces/globResolver.d.ts.map +1 -0
- package/dist/plugins/discovery/workspaces/globResolver.js +184 -0
- package/dist/plugins/discovery/workspaces/index.d.ts +9 -0
- package/dist/plugins/discovery/workspaces/index.d.ts.map +1 -0
- package/dist/plugins/discovery/workspaces/index.js +8 -0
- package/dist/plugins/discovery/workspaces/parsers.d.ts +38 -0
- package/dist/plugins/discovery/workspaces/parsers.d.ts.map +1 -0
- package/dist/plugins/discovery/workspaces/parsers.js +80 -0
- package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -1
- package/dist/plugins/enrichment/AliasTracker.js +14 -8
- package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -1
- package/dist/plugins/enrichment/HTTPConnectionEnricher.js +14 -7
- package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -1
- package/dist/plugins/enrichment/ImportExportLinker.js +23 -6
- package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -1
- package/dist/plugins/enrichment/MethodCallResolver.js +18 -12
- package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -1
- package/dist/plugins/enrichment/MountPointResolver.js +8 -3
- package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -1
- package/dist/plugins/enrichment/PrefixEvaluator.js +16 -7
- package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -1
- package/dist/plugins/enrichment/RustFFIEnricher.js +6 -5
- package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +17 -0
- package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -1
- package/dist/plugins/enrichment/ValueDomainAnalyzer.js +129 -10
- package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -1
- package/dist/plugins/indexing/IncrementalModuleIndexer.js +23 -14
- package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -1
- package/dist/plugins/indexing/JSModuleIndexer.js +63 -31
- package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -1
- package/dist/plugins/indexing/RustModuleIndexer.js +5 -4
- package/dist/plugins/indexing/ServiceDetector.d.ts +10 -0
- package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -1
- package/dist/plugins/indexing/ServiceDetector.js +28 -15
- package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -1
- package/dist/plugins/validation/CallResolverValidator.js +8 -7
- package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -1
- package/dist/plugins/validation/DataFlowValidator.js +17 -12
- package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -1
- package/dist/plugins/validation/EvalBanValidator.js +17 -16
- package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -1
- package/dist/plugins/validation/GraphConnectivityValidator.js +19 -23
- package/dist/plugins/validation/NodeCreationValidator.d.ts +85 -0
- package/dist/plugins/validation/NodeCreationValidator.d.ts.map +1 -0
- package/dist/plugins/validation/NodeCreationValidator.js +415 -0
- package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -1
- package/dist/plugins/validation/SQLInjectionValidator.js +59 -16
- package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -1
- package/dist/plugins/validation/ShadowingDetector.js +6 -5
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -1
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +12 -11
- package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -1
- package/dist/plugins/vcs/GitPlugin.js +10 -12
- package/dist/plugins/vcs/VCSPlugin.d.ts +3 -2
- package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -1
- package/dist/plugins/vcs/VCSPlugin.js +5 -5
- package/dist/storage/backends/RFDBServerBackend.d.ts +10 -17
- package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -1
- package/dist/storage/backends/RFDBServerBackend.js +31 -10
- package/dist/validation/PathValidator.d.ts +1 -2
- package/dist/validation/PathValidator.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/Orchestrator.ts +237 -24
- package/src/config/ConfigLoader.ts +263 -0
- package/src/config/index.ts +5 -0
- package/src/core/ASTWorker.ts +143 -139
- package/src/core/CoverageAnalyzer.ts +243 -0
- package/src/core/FileNodeManager.ts +100 -0
- package/src/core/GraphFreshnessChecker.ts +143 -0
- package/src/core/HashUtils.ts +48 -0
- package/src/core/IncrementalReanalyzer.ts +192 -0
- package/src/core/NodeFactory.ts +401 -18
- package/src/core/ScopeTracker.ts +154 -0
- package/src/core/SemanticId.ts +192 -0
- package/src/core/VersionManager.ts +3 -2
- package/src/core/nodes/ArgumentExpressionNode.ts +89 -0
- package/src/core/nodes/ArrayLiteralNode.ts +65 -0
- package/src/core/nodes/CallSiteNode.ts +58 -0
- package/src/core/nodes/ClassNode.ts +63 -2
- package/src/core/nodes/DecoratorNode.ts +91 -0
- package/src/core/nodes/EnumNode.ts +86 -0
- package/src/core/nodes/ExportNode.ts +70 -2
- package/src/core/nodes/ExpressionNode.ts +231 -0
- package/src/core/nodes/ExternalModuleNode.ts +56 -0
- package/src/core/nodes/ExternalStdioNode.ts +17 -9
- package/src/core/nodes/FunctionNode.ts +101 -1
- package/src/core/nodes/ImportNode.ts +32 -10
- package/src/core/nodes/InterfaceNode.ts +91 -0
- package/src/core/nodes/IssueNode.ts +177 -0
- package/src/core/nodes/MethodCallNode.ts +64 -0
- package/src/core/nodes/MethodNode.ts +63 -0
- package/src/core/nodes/ModuleNode.ts +50 -0
- package/src/core/nodes/NetworkRequestNode.ts +77 -0
- package/src/core/nodes/ObjectLiteralNode.ts +65 -0
- package/src/core/nodes/ScopeNode.ts +65 -0
- package/src/core/nodes/TypeNode.ts +78 -0
- package/src/core/nodes/VariableDeclarationNode.ts +52 -0
- package/src/core/nodes/index.ts +18 -1
- package/src/diagnostics/DiagnosticCollector.ts +163 -0
- package/src/diagnostics/DiagnosticReporter.ts +204 -0
- package/src/diagnostics/DiagnosticWriter.ts +50 -0
- package/src/diagnostics/index.ts +16 -0
- package/src/errors/GrafemaError.ts +174 -0
- package/src/index.ts +148 -1
- package/src/logging/Logger.ts +152 -0
- package/src/plugins/Plugin.ts +42 -0
- package/src/plugins/analysis/DatabaseAnalyzer.ts +14 -8
- package/src/plugins/analysis/ExpressAnalyzer.ts +29 -19
- package/src/plugins/analysis/ExpressRouteAnalyzer.ts +22 -21
- package/src/plugins/analysis/FetchAnalyzer.ts +39 -16
- package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +84 -101
- package/src/plugins/analysis/JSASTAnalyzer.ts +1483 -503
- package/src/plugins/analysis/ReactAnalyzer.ts +57 -57
- package/src/plugins/analysis/RustAnalyzer.ts +15 -10
- package/src/plugins/analysis/SQLiteAnalyzer.ts +10 -7
- package/src/plugins/analysis/ServiceLayerAnalyzer.ts +22 -16
- package/src/plugins/analysis/SocketIOAnalyzer.ts +31 -22
- package/src/plugins/analysis/SystemDbAnalyzer.ts +16 -11
- package/src/plugins/analysis/ast/GraphBuilder.ts +439 -327
- package/src/plugins/analysis/ast/IdGenerator.ts +177 -0
- package/src/plugins/analysis/ast/types.ts +209 -6
- package/src/plugins/analysis/ast/utils/createParameterNodes.ts +104 -0
- package/src/plugins/analysis/ast/utils/index.ts +12 -0
- package/src/plugins/analysis/ast/utils/location.ts +103 -0
- package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +11 -8
- package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +909 -83
- package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +97 -44
- package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +159 -93
- package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +12 -8
- package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +41 -14
- package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +37 -17
- package/src/plugins/discovery/MonorepoServiceDiscovery.ts +3 -2
- package/src/plugins/discovery/SimpleProjectDiscovery.ts +6 -1
- package/src/plugins/discovery/WorkspaceDiscovery.ts +177 -0
- package/src/plugins/discovery/resolveSourceEntrypoint.ts +103 -0
- package/src/plugins/discovery/workspaces/detector.ts +63 -0
- package/src/plugins/discovery/workspaces/globResolver.ts +229 -0
- package/src/plugins/discovery/workspaces/index.ts +23 -0
- package/src/plugins/discovery/workspaces/parsers.ts +99 -0
- package/src/plugins/enrichment/AliasTracker.ts +14 -8
- package/src/plugins/enrichment/HTTPConnectionEnricher.ts +14 -7
- package/src/plugins/enrichment/ImportExportLinker.ts +24 -6
- package/src/plugins/enrichment/MethodCallResolver.ts +18 -12
- package/src/plugins/enrichment/MountPointResolver.ts +8 -3
- package/src/plugins/enrichment/PrefixEvaluator.ts +16 -7
- package/src/plugins/enrichment/RustFFIEnricher.ts +6 -5
- package/src/plugins/enrichment/ValueDomainAnalyzer.ts +149 -12
- package/src/plugins/indexing/IncrementalModuleIndexer.ts +23 -14
- package/src/plugins/indexing/JSModuleIndexer.ts +74 -34
- package/src/plugins/indexing/RustModuleIndexer.ts +5 -4
- package/src/plugins/validation/CallResolverValidator.ts +8 -7
- package/src/plugins/validation/DataFlowValidator.ts +16 -12
- package/src/plugins/validation/EvalBanValidator.ts +17 -16
- package/src/plugins/validation/GraphConnectivityValidator.ts +19 -23
- package/src/plugins/validation/NodeCreationValidator.ts +554 -0
- package/src/plugins/validation/SQLInjectionValidator.ts +61 -15
- package/src/plugins/validation/ShadowingDetector.ts +6 -5
- package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +12 -11
- package/src/plugins/vcs/GitPlugin.ts +40 -12
- package/src/plugins/vcs/VCSPlugin.ts +7 -5
- package/src/storage/backends/RFDBServerBackend.ts +43 -29
- package/src/validation/PathValidator.ts +1 -1
- package/dist/core/AnalysisWorker.d.ts +0 -14
- package/dist/core/AnalysisWorker.d.ts.map +0 -1
- package/dist/core/AnalysisWorker.js +0 -307
- package/dist/core/ParallelAnalyzer.d.ts +0 -120
- package/dist/core/ParallelAnalyzer.d.ts.map +0 -1
- package/dist/core/ParallelAnalyzer.js +0 -331
- package/dist/core/QueueWorker.d.ts +0 -12
- package/dist/core/QueueWorker.d.ts.map +0 -1
- package/dist/core/QueueWorker.js +0 -567
- package/dist/core/RFDBClient.d.ts +0 -179
- package/dist/core/RFDBClient.d.ts.map +0 -1
- package/dist/core/RFDBClient.js +0 -429
- package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +0 -19
- package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +0 -1
- package/dist/plugins/discovery/ZonServiceDiscovery.js +0 -204
- package/src/core/AnalysisWorker.ts +0 -410
- package/src/core/ParallelAnalyzer.ts +0 -476
- package/src/core/QueueWorker.ts +0 -780
- package/src/plugins/indexing/ServiceDetector.ts +0 -230
|
@@ -104,18 +104,21 @@ export class SQLInjectionValidator extends Plugin {
|
|
|
104
104
|
phase: 'VALIDATION',
|
|
105
105
|
priority: 90, // After ValueDomainAnalyzer (65)
|
|
106
106
|
creates: {
|
|
107
|
-
nodes: [],
|
|
108
|
-
edges: []
|
|
107
|
+
nodes: ['issue:security'],
|
|
108
|
+
edges: ['AFFECTS']
|
|
109
109
|
}
|
|
110
110
|
};
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
async execute(context: PluginContext): Promise<PluginResult> {
|
|
114
114
|
const { graph } = context;
|
|
115
|
+
const logger = this.log(context);
|
|
115
116
|
|
|
116
|
-
|
|
117
|
+
logger.info('Starting SQL injection vulnerability check');
|
|
117
118
|
|
|
118
119
|
const issues: SQLInjectionIssue[] = [];
|
|
120
|
+
let issueNodeCount = 0;
|
|
121
|
+
let affectsEdgeCount = 0;
|
|
119
122
|
|
|
120
123
|
// 1. Find all CALL nodes that look like SQL queries
|
|
121
124
|
const sqlCalls: CallNode[] = [];
|
|
@@ -127,13 +130,13 @@ export class SQLInjectionValidator extends Plugin {
|
|
|
127
130
|
}
|
|
128
131
|
}
|
|
129
132
|
|
|
130
|
-
|
|
133
|
+
logger.debug('SQL calls collected', { count: sqlCalls.length });
|
|
131
134
|
|
|
132
135
|
// 2. For each SQL call, analyze the query argument
|
|
133
136
|
for (const call of sqlCalls) {
|
|
134
137
|
const result = await this.analyzeQueryCall(call, graph);
|
|
135
138
|
if (result.isVulnerable) {
|
|
136
|
-
|
|
139
|
+
const issue: SQLInjectionIssue = {
|
|
137
140
|
type: 'SQL_INJECTION',
|
|
138
141
|
severity: 'ERROR',
|
|
139
142
|
message: `Potential SQL injection at ${call.file}:${call.line || '?'} - ${result.reason}`,
|
|
@@ -142,37 +145,79 @@ export class SQLInjectionValidator extends Plugin {
|
|
|
142
145
|
line: call.line as number | undefined,
|
|
143
146
|
reason: result.reason!,
|
|
144
147
|
nondeterministicSources: result.sources
|
|
145
|
-
}
|
|
148
|
+
};
|
|
149
|
+
issues.push(issue);
|
|
150
|
+
|
|
151
|
+
// Persist issue to graph if reportIssue is available
|
|
152
|
+
if (context.reportIssue) {
|
|
153
|
+
await context.reportIssue({
|
|
154
|
+
category: 'security',
|
|
155
|
+
severity: 'error',
|
|
156
|
+
message: issue.message,
|
|
157
|
+
file: call.file || '',
|
|
158
|
+
line: call.line || 0,
|
|
159
|
+
column: call.column || 0,
|
|
160
|
+
targetNodeId: call.id,
|
|
161
|
+
context: {
|
|
162
|
+
type: 'SQL_INJECTION',
|
|
163
|
+
reason: result.reason,
|
|
164
|
+
nondeterministicSources: result.sources
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
issueNodeCount++;
|
|
168
|
+
affectsEdgeCount++;
|
|
169
|
+
}
|
|
146
170
|
}
|
|
147
171
|
}
|
|
148
172
|
|
|
149
173
|
// 3. Also check via graph pattern - CALL nodes that have ARGUMENT -> PARAMETER paths
|
|
150
|
-
const patternViolations = await this.checkViaGraphPattern(graph, sqlCalls);
|
|
174
|
+
const patternViolations = await this.checkViaGraphPattern(graph, logger, sqlCalls);
|
|
151
175
|
for (const violation of patternViolations) {
|
|
152
176
|
// Avoid duplicates
|
|
153
177
|
if (!issues.find(i => i.nodeId === violation.nodeId)) {
|
|
154
178
|
issues.push(violation);
|
|
179
|
+
|
|
180
|
+
// Persist issue to graph if reportIssue is available
|
|
181
|
+
if (context.reportIssue) {
|
|
182
|
+
await context.reportIssue({
|
|
183
|
+
category: 'security',
|
|
184
|
+
severity: 'error',
|
|
185
|
+
message: violation.message,
|
|
186
|
+
file: violation.file || '',
|
|
187
|
+
line: violation.line || 0,
|
|
188
|
+
targetNodeId: violation.nodeId,
|
|
189
|
+
context: {
|
|
190
|
+
type: 'SQL_INJECTION',
|
|
191
|
+
reason: violation.reason,
|
|
192
|
+
nondeterministicSources: violation.nondeterministicSources
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
issueNodeCount++;
|
|
196
|
+
affectsEdgeCount++;
|
|
197
|
+
}
|
|
155
198
|
}
|
|
156
199
|
}
|
|
157
200
|
|
|
158
201
|
const summary = {
|
|
159
202
|
sqlCallsChecked: sqlCalls.length,
|
|
160
|
-
vulnerabilitiesFound: issues.length
|
|
203
|
+
vulnerabilitiesFound: issues.length,
|
|
204
|
+
issueNodesCreated: issueNodeCount,
|
|
205
|
+
affectsEdgesCreated: affectsEdgeCount
|
|
161
206
|
};
|
|
162
207
|
|
|
163
|
-
|
|
208
|
+
logger.info('Validation complete', summary);
|
|
164
209
|
|
|
165
210
|
if (issues.length > 0) {
|
|
166
|
-
|
|
211
|
+
logger.warn('SQL injection vulnerabilities found', { count: issues.length });
|
|
167
212
|
for (const issue of issues) {
|
|
168
|
-
|
|
213
|
+
logger.warn(issue.message);
|
|
169
214
|
}
|
|
170
215
|
} else {
|
|
171
|
-
|
|
216
|
+
logger.info('No SQL injection vulnerabilities detected');
|
|
172
217
|
}
|
|
173
218
|
|
|
174
219
|
return createSuccessResult(
|
|
175
|
-
{ nodes:
|
|
220
|
+
{ nodes: issueNodeCount, edges: affectsEdgeCount },
|
|
176
221
|
{ summary, issues }
|
|
177
222
|
);
|
|
178
223
|
}
|
|
@@ -307,6 +352,7 @@ export class SQLInjectionValidator extends Plugin {
|
|
|
307
352
|
*/
|
|
308
353
|
private async checkViaGraphPattern(
|
|
309
354
|
graph: PluginContext['graph'],
|
|
355
|
+
logger: ReturnType<typeof this.log>,
|
|
310
356
|
excludeCalls: CallNode[] = []
|
|
311
357
|
): Promise<SQLInjectionIssue[]> {
|
|
312
358
|
const issues: SQLInjectionIssue[] = [];
|
|
@@ -316,7 +362,7 @@ export class SQLInjectionValidator extends Plugin {
|
|
|
316
362
|
try {
|
|
317
363
|
// Check if graph supports checkGuarantee
|
|
318
364
|
if (!graph.checkGuarantee) {
|
|
319
|
-
|
|
365
|
+
logger.debug('Graph does not support checkGuarantee, skipping pattern-based check');
|
|
320
366
|
return issues;
|
|
321
367
|
}
|
|
322
368
|
|
|
@@ -353,7 +399,7 @@ export class SQLInjectionValidator extends Plugin {
|
|
|
353
399
|
}
|
|
354
400
|
} catch (err) {
|
|
355
401
|
// Datalog query might fail if backend doesn't support it
|
|
356
|
-
|
|
402
|
+
logger.debug('Datalog check skipped', { error: (err as Error).message });
|
|
357
403
|
}
|
|
358
404
|
|
|
359
405
|
return issues;
|
|
@@ -70,8 +70,9 @@ export class ShadowingDetector extends Plugin {
|
|
|
70
70
|
|
|
71
71
|
async execute(context: PluginContext): Promise<PluginResult> {
|
|
72
72
|
const { graph } = context;
|
|
73
|
+
const logger = this.log(context);
|
|
73
74
|
|
|
74
|
-
|
|
75
|
+
logger.info('Starting variable shadowing detection');
|
|
75
76
|
|
|
76
77
|
const issues: ShadowingIssue[] = [];
|
|
77
78
|
|
|
@@ -154,15 +155,15 @@ export class ShadowingDetector extends Plugin {
|
|
|
154
155
|
totalIssues: issues.length
|
|
155
156
|
};
|
|
156
157
|
|
|
157
|
-
|
|
158
|
+
logger.info('Detection complete', { ...summary });
|
|
158
159
|
|
|
159
160
|
if (issues.length > 0) {
|
|
160
|
-
|
|
161
|
+
logger.warn('Shadowing issues found', { count: issues.length });
|
|
161
162
|
for (const issue of issues) {
|
|
162
|
-
|
|
163
|
+
logger.warn(issue.message, { type: issue.type });
|
|
163
164
|
}
|
|
164
165
|
} else {
|
|
165
|
-
|
|
166
|
+
logger.info('No shadowing issues detected');
|
|
166
167
|
}
|
|
167
168
|
|
|
168
169
|
return createSuccessResult(
|
|
@@ -58,14 +58,15 @@ export class TypeScriptDeadCodeValidator extends Plugin {
|
|
|
58
58
|
|
|
59
59
|
async execute(context: PluginContext): Promise<PluginResult> {
|
|
60
60
|
const { graph } = context;
|
|
61
|
+
const logger = this.log(context);
|
|
61
62
|
|
|
62
|
-
|
|
63
|
+
logger.info('Starting TypeScript dead code analysis');
|
|
63
64
|
const startTime = Date.now();
|
|
64
65
|
|
|
65
66
|
const issues: DeadCodeIssue[] = [];
|
|
66
67
|
|
|
67
68
|
// Collect all interfaces
|
|
68
|
-
|
|
69
|
+
logger.debug('Collecting interfaces');
|
|
69
70
|
const interfaces: Map<string, { id: string; name: string; file?: string; line?: number; properties?: unknown[] }> = new Map();
|
|
70
71
|
|
|
71
72
|
for await (const node of graph.queryNodes({ nodeType: 'INTERFACE' })) {
|
|
@@ -80,10 +81,10 @@ export class TypeScriptDeadCodeValidator extends Plugin {
|
|
|
80
81
|
properties: (node as { properties?: unknown[] }).properties
|
|
81
82
|
});
|
|
82
83
|
}
|
|
83
|
-
|
|
84
|
+
logger.debug('Interfaces collected', { count: interfaces.size });
|
|
84
85
|
|
|
85
86
|
// Find interfaces with IMPLEMENTS or EXTENDS edges
|
|
86
|
-
|
|
87
|
+
logger.debug('Checking implementations');
|
|
87
88
|
const implementedInterfaces: Map<string, number> = new Map();
|
|
88
89
|
|
|
89
90
|
// Get all edges and filter by type (no queryEdges in GraphBackend yet)
|
|
@@ -168,31 +169,31 @@ export class TypeScriptDeadCodeValidator extends Plugin {
|
|
|
168
169
|
timeSeconds: totalTime
|
|
169
170
|
};
|
|
170
171
|
|
|
171
|
-
|
|
172
|
+
logger.info('Analysis complete', { ...summary });
|
|
172
173
|
|
|
173
174
|
// Report issues
|
|
174
175
|
const warnings = issues.filter(i => i.severity === 'WARNING');
|
|
175
176
|
const infos = issues.filter(i => i.severity === 'INFO');
|
|
176
177
|
|
|
177
178
|
if (warnings.length > 0) {
|
|
178
|
-
|
|
179
|
+
logger.warn('Warnings found', { count: warnings.length });
|
|
179
180
|
for (const issue of warnings) {
|
|
180
|
-
|
|
181
|
+
logger.warn(issue.message);
|
|
181
182
|
}
|
|
182
183
|
}
|
|
183
184
|
|
|
184
185
|
if (infos.length > 0) {
|
|
185
|
-
|
|
186
|
+
logger.info('Info messages', { count: infos.length });
|
|
186
187
|
for (const issue of infos.slice(0, 5)) { // Limit to first 5
|
|
187
|
-
|
|
188
|
+
logger.info(issue.message);
|
|
188
189
|
}
|
|
189
190
|
if (infos.length > 5) {
|
|
190
|
-
|
|
191
|
+
logger.debug(`... and ${infos.length - 5} more`);
|
|
191
192
|
}
|
|
192
193
|
}
|
|
193
194
|
|
|
194
195
|
if (issues.length === 0) {
|
|
195
|
-
|
|
196
|
+
logger.info('No dead TypeScript code detected');
|
|
196
197
|
}
|
|
197
198
|
|
|
198
199
|
return createSuccessResult(
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import { VCSPlugin, FileStatus } from './VCSPlugin.js';
|
|
9
9
|
import type { VCSConfig, VCSPluginMetadata, ChangedFile, FileDiff, DiffHunk } from './VCSPlugin.js';
|
|
10
|
+
import { FileAccessError } from '../../errors/GrafemaError.js';
|
|
10
11
|
import { exec } from 'child_process';
|
|
11
12
|
import { promisify } from 'util';
|
|
12
13
|
import { join } from 'path';
|
|
@@ -113,8 +114,12 @@ export class GitPlugin extends VCSPlugin {
|
|
|
113
114
|
|
|
114
115
|
return files;
|
|
115
116
|
} catch (error) {
|
|
116
|
-
|
|
117
|
-
|
|
117
|
+
throw new FileAccessError(
|
|
118
|
+
`Failed to get changed files: ${(error as Error).message}`,
|
|
119
|
+
'ERR_GIT_ACCESS_DENIED',
|
|
120
|
+
{ plugin: 'GitPlugin' },
|
|
121
|
+
'Check that git is installed and this is a valid git repository'
|
|
122
|
+
);
|
|
118
123
|
}
|
|
119
124
|
}
|
|
120
125
|
|
|
@@ -152,8 +157,12 @@ export class GitPlugin extends VCSPlugin {
|
|
|
152
157
|
// Парсим unified diff
|
|
153
158
|
return this._parseUnifiedDiff(filePath, stdout);
|
|
154
159
|
} catch (error) {
|
|
155
|
-
|
|
156
|
-
|
|
160
|
+
throw new FileAccessError(
|
|
161
|
+
`Failed to get diff for ${filePath}: ${(error as Error).message}`,
|
|
162
|
+
'ERR_GIT_ACCESS_DENIED',
|
|
163
|
+
{ plugin: 'GitPlugin', filePath },
|
|
164
|
+
'Ensure the file is tracked by git and the working directory is accessible'
|
|
165
|
+
);
|
|
157
166
|
}
|
|
158
167
|
}
|
|
159
168
|
|
|
@@ -164,8 +173,13 @@ export class GitPlugin extends VCSPlugin {
|
|
|
164
173
|
try {
|
|
165
174
|
const { stdout } = await this._exec('git rev-parse --abbrev-ref HEAD');
|
|
166
175
|
return stdout.trim();
|
|
167
|
-
} catch {
|
|
168
|
-
|
|
176
|
+
} catch (error) {
|
|
177
|
+
throw new FileAccessError(
|
|
178
|
+
`Failed to get current branch: ${(error as Error).message}`,
|
|
179
|
+
'ERR_GIT_ACCESS_DENIED',
|
|
180
|
+
{ plugin: 'GitPlugin' },
|
|
181
|
+
'Ensure this is a valid git repository with at least one commit'
|
|
182
|
+
);
|
|
169
183
|
}
|
|
170
184
|
}
|
|
171
185
|
|
|
@@ -176,8 +190,13 @@ export class GitPlugin extends VCSPlugin {
|
|
|
176
190
|
try {
|
|
177
191
|
const { stdout } = await this._exec('git rev-parse HEAD');
|
|
178
192
|
return stdout.trim();
|
|
179
|
-
} catch {
|
|
180
|
-
|
|
193
|
+
} catch (error) {
|
|
194
|
+
throw new FileAccessError(
|
|
195
|
+
`Failed to get last commit hash: ${(error as Error).message}`,
|
|
196
|
+
'ERR_GIT_NOT_FOUND',
|
|
197
|
+
{ plugin: 'GitPlugin' },
|
|
198
|
+
'Ensure this is a valid git repository with at least one commit'
|
|
199
|
+
);
|
|
181
200
|
}
|
|
182
201
|
}
|
|
183
202
|
|
|
@@ -309,8 +328,12 @@ export class GitPlugin extends VCSPlugin {
|
|
|
309
328
|
const { stdout } = await this._exec('git ls-files');
|
|
310
329
|
return stdout.trim().split('\n').filter(line => line.length > 0);
|
|
311
330
|
} catch (error) {
|
|
312
|
-
|
|
313
|
-
|
|
331
|
+
throw new FileAccessError(
|
|
332
|
+
`Failed to get tracked files: ${(error as Error).message}`,
|
|
333
|
+
'ERR_GIT_ACCESS_DENIED',
|
|
334
|
+
{ plugin: 'GitPlugin' },
|
|
335
|
+
'Check that git is installed and this is a valid git repository'
|
|
336
|
+
);
|
|
314
337
|
}
|
|
315
338
|
}
|
|
316
339
|
|
|
@@ -329,8 +352,13 @@ export class GitPlugin extends VCSPlugin {
|
|
|
329
352
|
timestamp: parseInt(lines[3]) * 1000,
|
|
330
353
|
message: lines[4]
|
|
331
354
|
};
|
|
332
|
-
} catch {
|
|
333
|
-
|
|
355
|
+
} catch (error) {
|
|
356
|
+
throw new FileAccessError(
|
|
357
|
+
`Failed to get last commit info: ${(error as Error).message}`,
|
|
358
|
+
'ERR_GIT_NOT_FOUND',
|
|
359
|
+
{ plugin: 'GitPlugin' },
|
|
360
|
+
'Ensure this is a valid git repository with at least one commit'
|
|
361
|
+
);
|
|
334
362
|
}
|
|
335
363
|
}
|
|
336
364
|
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
* - Perforce
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
+
import type { Logger } from '../../logging/Logger.js';
|
|
16
|
+
|
|
15
17
|
/**
|
|
16
18
|
* VCS Plugin configuration
|
|
17
19
|
*/
|
|
@@ -154,13 +156,13 @@ export class VCSPluginFactory {
|
|
|
154
156
|
/**
|
|
155
157
|
* Автоматически определить и создать подходящий VCS плагин
|
|
156
158
|
*/
|
|
157
|
-
static async detect(config: VCSConfig = {}): Promise<VCSPlugin | null> {
|
|
159
|
+
static async detect(config: VCSConfig = {}, logger?: Logger): Promise<VCSPlugin | null> {
|
|
158
160
|
for (const PluginClass of this.availablePlugins) {
|
|
159
161
|
const plugin = new PluginClass(config);
|
|
160
162
|
|
|
161
163
|
try {
|
|
162
164
|
if (await plugin.isAvailable()) {
|
|
163
|
-
|
|
165
|
+
logger?.info('VCS detected', { name: plugin.metadata.name });
|
|
164
166
|
return plugin;
|
|
165
167
|
}
|
|
166
168
|
} catch {
|
|
@@ -168,20 +170,20 @@ export class VCSPluginFactory {
|
|
|
168
170
|
}
|
|
169
171
|
}
|
|
170
172
|
|
|
171
|
-
|
|
173
|
+
logger?.warn('No VCS system detected');
|
|
172
174
|
return null;
|
|
173
175
|
}
|
|
174
176
|
|
|
175
177
|
/**
|
|
176
178
|
* Создать плагин по имени
|
|
177
179
|
*/
|
|
178
|
-
static create(name: string, config: VCSConfig = {}): VCSPlugin | null {
|
|
180
|
+
static create(name: string, config: VCSConfig = {}, logger?: Logger): VCSPlugin | null {
|
|
179
181
|
const PluginClass = this.availablePlugins.find(
|
|
180
182
|
Plugin => new Plugin(config).metadata.name === name
|
|
181
183
|
);
|
|
182
184
|
|
|
183
185
|
if (!PluginClass) {
|
|
184
|
-
|
|
186
|
+
logger?.error('VCS plugin not found', { name });
|
|
185
187
|
return null;
|
|
186
188
|
}
|
|
187
189
|
|
|
@@ -27,6 +27,7 @@ import { setTimeout as sleep } from 'timers/promises';
|
|
|
27
27
|
|
|
28
28
|
import type { WireNode, WireEdge } from '@grafema/types';
|
|
29
29
|
import type { NodeType, EdgeType } from '@grafema/types';
|
|
30
|
+
import type { BaseNodeRecord } from '@grafema/types';
|
|
30
31
|
import type { AttrQuery, GraphStats, GraphExport } from '../../core/GraphBackend.js';
|
|
31
32
|
|
|
32
33
|
const __filename = fileURLToPath(import.meta.url);
|
|
@@ -40,19 +41,6 @@ export interface RFDBServerBackendOptions {
|
|
|
40
41
|
dbPath?: string;
|
|
41
42
|
}
|
|
42
43
|
|
|
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
44
|
/**
|
|
57
45
|
* Edge as returned from the backend
|
|
58
46
|
*/
|
|
@@ -283,20 +271,26 @@ export class RFDBServerBackend {
|
|
|
283
271
|
}
|
|
284
272
|
|
|
285
273
|
/**
|
|
286
|
-
* Close connection
|
|
274
|
+
* Close client connection. Server continues running to serve other clients.
|
|
287
275
|
*/
|
|
288
276
|
async close(): Promise<void> {
|
|
277
|
+
// Request server flush before disconnecting
|
|
289
278
|
if (this.client) {
|
|
279
|
+
try {
|
|
280
|
+
await this.client.flush();
|
|
281
|
+
} catch {
|
|
282
|
+
// Ignore flush errors on close - best effort
|
|
283
|
+
}
|
|
290
284
|
await this.client.close();
|
|
291
285
|
this.client = null;
|
|
292
286
|
}
|
|
293
287
|
this.connected = false;
|
|
294
288
|
|
|
295
|
-
//
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
289
|
+
// NOTE: We intentionally do NOT kill the server process.
|
|
290
|
+
// The server continues running to serve other clients (MCP, other CLI invocations).
|
|
291
|
+
// This is by design for multi-client architecture.
|
|
292
|
+
// Server lifecycle is managed separately (system process, or manual grafema server stop).
|
|
293
|
+
this.serverProcess = null;
|
|
300
294
|
}
|
|
301
295
|
|
|
302
296
|
/**
|
|
@@ -371,14 +365,22 @@ export class RFDBServerBackend {
|
|
|
371
365
|
}
|
|
372
366
|
|
|
373
367
|
const wireEdges: WireEdge[] = edges.map(e => {
|
|
374
|
-
const { src, dst, type, edgeType, edge_type, etype, ...rest } = e;
|
|
368
|
+
const { src, dst, type, edgeType, edge_type, etype, metadata, ...rest } = e;
|
|
369
|
+
|
|
370
|
+
// Flatten metadata: spread both edge-level properties and nested metadata
|
|
371
|
+
const flatMetadata = {
|
|
372
|
+
_origSrc: String(src),
|
|
373
|
+
_origDst: String(dst),
|
|
374
|
+
...rest,
|
|
375
|
+
...(typeof metadata === 'object' && metadata !== null ? metadata : {})
|
|
376
|
+
};
|
|
375
377
|
|
|
376
378
|
return {
|
|
377
379
|
src: String(src),
|
|
378
380
|
dst: String(dst),
|
|
379
381
|
edgeType: (edgeType || edge_type || etype || type || 'UNKNOWN') as EdgeType,
|
|
380
|
-
// Store
|
|
381
|
-
metadata: JSON.stringify(
|
|
382
|
+
// Store flattened metadata for retrieval
|
|
383
|
+
metadata: JSON.stringify(flatMetadata),
|
|
382
384
|
};
|
|
383
385
|
});
|
|
384
386
|
|
|
@@ -388,7 +390,7 @@ export class RFDBServerBackend {
|
|
|
388
390
|
/**
|
|
389
391
|
* Get a node by ID
|
|
390
392
|
*/
|
|
391
|
-
async getNode(id: string): Promise<
|
|
393
|
+
async getNode(id: string): Promise<BaseNodeRecord | null> {
|
|
392
394
|
if (!this.client) throw new Error('Not connected');
|
|
393
395
|
const node = await this.client.getNode(String(id));
|
|
394
396
|
if (!node) return null;
|
|
@@ -423,7 +425,7 @@ export class RFDBServerBackend {
|
|
|
423
425
|
/**
|
|
424
426
|
* Parse a node from wire format to JS format
|
|
425
427
|
*/
|
|
426
|
-
private _parseNode(wireNode: WireNode):
|
|
428
|
+
private _parseNode(wireNode: WireNode): BaseNodeRecord {
|
|
427
429
|
const metadata: Record<string, unknown> = wireNode.metadata ? JSON.parse(wireNode.metadata) : {};
|
|
428
430
|
|
|
429
431
|
// Parse nested JSON strings
|
|
@@ -441,7 +443,6 @@ export class RFDBServerBackend {
|
|
|
441
443
|
|
|
442
444
|
return {
|
|
443
445
|
id: humanId,
|
|
444
|
-
nodeType: wireNode.nodeType,
|
|
445
446
|
type: wireNode.nodeType,
|
|
446
447
|
name: wireNode.name,
|
|
447
448
|
file: wireNode.file,
|
|
@@ -453,7 +454,7 @@ export class RFDBServerBackend {
|
|
|
453
454
|
/**
|
|
454
455
|
* Async generator for querying nodes
|
|
455
456
|
*/
|
|
456
|
-
async *queryNodes(query: NodeQuery): AsyncGenerator<
|
|
457
|
+
async *queryNodes(query: NodeQuery): AsyncGenerator<BaseNodeRecord, void, unknown> {
|
|
457
458
|
if (!this.client) throw new Error('Not connected');
|
|
458
459
|
|
|
459
460
|
// Build query for server
|
|
@@ -482,8 +483,8 @@ export class RFDBServerBackend {
|
|
|
482
483
|
/**
|
|
483
484
|
* Get ALL nodes matching query (collects from queryNodes into array)
|
|
484
485
|
*/
|
|
485
|
-
async getAllNodes(query: NodeQuery = {}): Promise<
|
|
486
|
-
const nodes:
|
|
486
|
+
async getAllNodes(query: NodeQuery = {}): Promise<BaseNodeRecord[]> {
|
|
487
|
+
const nodes: BaseNodeRecord[] = [];
|
|
487
488
|
for await (const node of this.queryNodes(query)) {
|
|
488
489
|
nodes.push(node);
|
|
489
490
|
}
|
|
@@ -587,6 +588,19 @@ export class RFDBServerBackend {
|
|
|
587
588
|
return this.client.dfs(startIds, maxDepth, edgeTypes);
|
|
588
589
|
}
|
|
589
590
|
|
|
591
|
+
/**
|
|
592
|
+
* Reachability query - find all nodes reachable from start nodes
|
|
593
|
+
*/
|
|
594
|
+
async reachability(
|
|
595
|
+
startIds: string[],
|
|
596
|
+
maxDepth: number,
|
|
597
|
+
edgeTypes: EdgeType[] = [],
|
|
598
|
+
backward: boolean = false
|
|
599
|
+
): Promise<string[]> {
|
|
600
|
+
if (!this.client) throw new Error('Not connected');
|
|
601
|
+
return this.client.reachability(startIds, maxDepth, edgeTypes, backward);
|
|
602
|
+
}
|
|
603
|
+
|
|
590
604
|
// ===========================================================================
|
|
591
605
|
// Statistics
|
|
592
606
|
// ===========================================================================
|
|
@@ -713,7 +727,7 @@ export class RFDBServerBackend {
|
|
|
713
727
|
/**
|
|
714
728
|
* Find nodes by predicate (for compatibility)
|
|
715
729
|
*/
|
|
716
|
-
async findNodes(predicate: (node:
|
|
730
|
+
async findNodes(predicate: (node: BaseNodeRecord) => boolean): Promise<BaseNodeRecord[]> {
|
|
717
731
|
const allNodes = await this.getAllNodes();
|
|
718
732
|
return allNodes.filter(predicate);
|
|
719
733
|
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AnalysisWorker - worker thread for parallel AST analysis
|
|
3
|
-
*
|
|
4
|
-
* Each worker:
|
|
5
|
-
* 1. Connects to RFDB server
|
|
6
|
-
* 2. Receives file paths to analyze
|
|
7
|
-
* 3. Parses AST and writes nodes/edges directly to RFDB
|
|
8
|
-
*
|
|
9
|
-
* Communication:
|
|
10
|
-
* Main -> Worker: { type: 'analyze', file, moduleId, moduleName }
|
|
11
|
-
* Worker -> Main: { type: 'done', file, stats } | { type: 'error', file, error }
|
|
12
|
-
*/
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=AnalysisWorker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AnalysisWorker.d.ts","sourceRoot":"","sources":["../../src/core/AnalysisWorker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|