code-auditor-mcp 2.6.2 → 3.0.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/README.md +23 -196
- package/dist/analyzers/analyzerUtils.d.ts +13 -11
- package/dist/analyzers/analyzerUtils.d.ts.map +1 -1
- package/dist/analyzers/analyzerUtils.js +22 -56
- package/dist/analyzers/analyzerUtils.js.map +1 -1
- package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js.map +1 -1
- package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts.map +1 -1
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
- package/dist/analyzers/dataAccessAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/dataAccessAnalyzer.js +50 -24
- package/dist/analyzers/dataAccessAnalyzer.js.map +1 -1
- package/dist/analyzers/documentationAnalyzer.d.ts +4 -1
- package/dist/analyzers/documentationAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/documentationAnalyzer.js +210 -111
- package/dist/analyzers/documentationAnalyzer.js.map +1 -1
- package/dist/analyzers/dryAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/dryAnalyzer.js +190 -58
- package/dist/analyzers/dryAnalyzer.js.map +1 -1
- package/dist/analyzers/invariantsAnalyzer.d.ts +20 -0
- package/dist/analyzers/invariantsAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/invariantsAnalyzer.js +148 -0
- package/dist/analyzers/invariantsAnalyzer.js.map +1 -0
- package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/reactAnalyzer.js +2 -2
- package/dist/analyzers/reactAnalyzer.js.map +1 -1
- package/dist/analyzers/schemaAnalyzer.d.ts +2 -0
- package/dist/analyzers/schemaAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/schemaAnalyzer.js +306 -147
- package/dist/analyzers/schemaAnalyzer.js.map +1 -1
- package/dist/analyzers/solidAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/solidAnalyzer.js +145 -119
- package/dist/analyzers/solidAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +3 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js +41 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +8 -8
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +6 -6
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
- package/dist/api/index.js +1 -0
- package/dist/api/index.js.map +1 -1
- package/dist/auditRunner.d.ts.map +1 -1
- package/dist/auditRunner.js +367 -24
- package/dist/auditRunner.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +740 -18
- package/dist/cli.js.map +1 -1
- package/dist/codeIndexDB-enhanced.d.ts +35 -13
- package/dist/codeIndexDB-enhanced.d.ts.map +1 -1
- package/dist/codeIndexDB-enhanced.js +311 -214
- package/dist/codeIndexDB-enhanced.js.map +1 -1
- package/dist/{codeIndexDb.d.ts → codeIndexDB.d.ts} +51 -224
- package/dist/codeIndexDB.d.ts.map +1 -0
- package/dist/codeIndexDB.js +2042 -0
- package/dist/codeIndexDB.js.map +1 -0
- package/dist/codeIndexService.d.ts.map +1 -1
- package/dist/codeIndexService.js.map +1 -1
- package/dist/componentScanner.d.ts +14 -8
- package/dist/componentScanner.d.ts.map +1 -1
- package/dist/componentScanner.js +136 -113
- package/dist/componentScanner.js.map +1 -1
- package/dist/config/configLoader.d.ts.map +1 -1
- package/dist/config/configLoader.js +10 -7
- package/dist/config/configLoader.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/fingerprint.d.ts +15 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +32 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/functionScanner.d.ts +5 -0
- package/dist/functionScanner.d.ts.map +1 -1
- package/dist/functionScanner.js +417 -341
- package/dist/functionScanner.js.map +1 -1
- package/dist/generators/AWSQConfigGenerator.d.ts.map +1 -1
- package/dist/generators/AiderConfigGenerator.d.ts.map +1 -1
- package/dist/generators/BaseConfigGenerator.d.ts.map +1 -1
- package/dist/generators/BaseConfigGenerator.js.map +1 -1
- package/dist/generators/ClaudeConfigGenerator.d.ts.map +1 -1
- package/dist/generators/ClineConfigGenerator.d.ts.map +1 -1
- package/dist/generators/CodeiumConfigGenerator.d.ts.map +1 -1
- package/dist/generators/ConfigGeneratorFactory.d.ts.map +1 -1
- package/dist/generators/ConfigGeneratorFactory.js.map +1 -1
- package/dist/generators/ContinueConfigGenerator.d.ts.map +1 -1
- package/dist/generators/CopilotConfigGenerator.d.ts.map +1 -1
- package/dist/generators/CursorConfigGenerator.d.ts.map +1 -1
- package/dist/generators/JetBrainsConfigGenerator.d.ts.map +1 -1
- package/dist/generators/VSCodeConfigGenerator.d.ts.map +1 -1
- package/dist/grammars/tree-sitter-go.wasm +0 -0
- package/dist/grammars/tree-sitter-javascript.wasm +0 -0
- package/dist/grammars/tree-sitter-tsx.wasm +0 -0
- package/dist/grammars/tree-sitter-typescript.wasm +0 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/invariants/index.d.ts +9 -0
- package/dist/invariants/index.d.ts.map +1 -0
- package/dist/invariants/index.js +4 -0
- package/dist/invariants/index.js.map +1 -0
- package/dist/invariants/invariant-rules.schema.json +137 -0
- package/dist/invariants/ruleEngine.d.ts +32 -0
- package/dist/invariants/ruleEngine.d.ts.map +1 -0
- package/dist/invariants/ruleEngine.js +536 -0
- package/dist/invariants/ruleEngine.js.map +1 -0
- package/dist/invariants/ruleValidator.d.ts +17 -0
- package/dist/invariants/ruleValidator.d.ts.map +1 -0
- package/dist/invariants/ruleValidator.js +264 -0
- package/dist/invariants/ruleValidator.js.map +1 -0
- package/dist/invariants/types.d.ts +78 -0
- package/dist/invariants/types.d.ts.map +1 -0
- package/dist/invariants/types.js +5 -0
- package/dist/invariants/types.js.map +1 -0
- package/dist/languages/LanguageOrchestrator.d.ts.map +1 -1
- package/dist/languages/LanguageOrchestrator.js.map +1 -1
- package/dist/languages/LanguageRegistry.d.ts.map +1 -1
- package/dist/languages/RuntimeManager.d.ts.map +1 -1
- package/dist/languages/RuntimeManager.js +1 -1
- package/dist/languages/RuntimeManager.js.map +1 -1
- package/dist/languages/UniversalAnalyzer.d.ts.map +1 -1
- package/dist/languages/UniversalAnalyzer.js.map +1 -1
- package/dist/languages/adapterBridge.d.ts +102 -0
- package/dist/languages/adapterBridge.d.ts.map +1 -0
- package/dist/languages/adapterBridge.js +382 -0
- package/dist/languages/adapterBridge.js.map +1 -0
- package/dist/languages/go/GoAdapter.d.ts +37 -26
- package/dist/languages/go/GoAdapter.d.ts.map +1 -1
- package/dist/languages/go/GoAdapter.js +560 -281
- package/dist/languages/go/GoAdapter.js.map +1 -1
- package/dist/languages/index.d.ts +5 -2
- package/dist/languages/index.d.ts.map +1 -1
- package/dist/languages/index.js +11 -9
- package/dist/languages/index.js.map +1 -1
- package/dist/languages/tree-sitter/converter.d.ts +43 -0
- package/dist/languages/tree-sitter/converter.d.ts.map +1 -0
- package/dist/languages/tree-sitter/converter.js +150 -0
- package/dist/languages/tree-sitter/converter.js.map +1 -0
- package/dist/languages/tree-sitter/parser.d.ts +36 -0
- package/dist/languages/tree-sitter/parser.d.ts.map +1 -0
- package/dist/languages/tree-sitter/parser.js +114 -0
- package/dist/languages/tree-sitter/parser.js.map +1 -0
- package/dist/languages/types.d.ts +11 -0
- package/dist/languages/types.d.ts.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts +92 -0
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -0
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +951 -0
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -0
- package/dist/mcp-tools/projectTasks.d.ts +58 -22
- package/dist/mcp-tools/projectTasks.d.ts.map +1 -1
- package/dist/mcp-tools/projectTasks.js +172 -10
- package/dist/mcp-tools/projectTasks.js.map +1 -1
- package/dist/mcp-tools/whitelistTools.d.ts +21 -21
- package/dist/mcp-tools/whitelistTools.d.ts.map +1 -1
- package/dist/mcp-tools/workflowGuide.d.ts.map +1 -1
- package/dist/mcp-tools/workflowGuide.js +130 -126
- package/dist/mcp-tools/workflowGuide.js.map +1 -1
- package/dist/mcp-tools-shared.d.ts.map +1 -1
- package/dist/mcp-tools-shared.js.map +1 -1
- package/dist/mcp-ui-simple.js +1 -1
- package/dist/mcp-ui-simple.js.map +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +1376 -1181
- package/dist/mcp.js.map +1 -1
- package/dist/mcpAuditJobs.d.ts +4 -0
- package/dist/mcpAuditJobs.d.ts.map +1 -1
- package/dist/mcpAuditJobs.js +49 -2
- package/dist/mcpAuditJobs.js.map +1 -1
- package/dist/mcpToolErrors.d.ts.map +1 -1
- package/dist/mcpToolErrors.js.map +1 -1
- package/dist/native/ast-grep-napi.darwin-arm64.node +0 -0
- package/dist/native/ast-grep-napi.darwin-x64.node +0 -0
- package/dist/native/ast-grep-napi.linux-arm64-gnu.node +0 -0
- package/dist/native/ast-grep-napi.linux-arm64-musl.node +0 -0
- package/dist/native/ast-grep-napi.linux-x64-gnu.node +0 -0
- package/dist/native/ast-grep-napi.linux-x64-musl.node +0 -0
- package/dist/native/ast-grep-napi.win32-x64-msvc.node +0 -0
- package/dist/native-bootstrap.d.ts +15 -0
- package/dist/native-bootstrap.d.ts.map +1 -0
- package/dist/native-bootstrap.js +75 -0
- package/dist/native-bootstrap.js.map +1 -0
- package/dist/reporting/csvReportGenerator.d.ts.map +1 -1
- package/dist/reporting/htmlReportGenerator.d.ts.map +1 -1
- package/dist/reporting/jsonReportGenerator.d.ts.map +1 -1
- package/dist/reporting/reportGenerator.d.ts.map +1 -1
- package/dist/reporting/reportGenerator.js +4 -0
- package/dist/reporting/reportGenerator.js.map +1 -1
- package/dist/reporting/sarifReportGenerator.d.ts +39 -0
- package/dist/reporting/sarifReportGenerator.d.ts.map +1 -0
- package/dist/reporting/sarifReportGenerator.js +229 -0
- package/dist/reporting/sarifReportGenerator.js.map +1 -0
- package/dist/search/QueryParser.d.ts +41 -0
- package/dist/search/QueryParser.d.ts.map +1 -1
- package/dist/search/QueryParser.js +200 -19
- package/dist/search/QueryParser.js.map +1 -1
- package/dist/services/CodeMapGenerator.d.ts.map +1 -1
- package/dist/services/CodeMapGenerator.js +4 -4
- package/dist/services/CodeMapGenerator.js.map +1 -1
- package/dist/services/ProjectTaskRepository.d.ts +15 -2
- package/dist/services/ProjectTaskRepository.d.ts.map +1 -1
- package/dist/services/ProjectTaskRepository.js +16 -1
- package/dist/services/ProjectTaskRepository.js.map +1 -1
- package/dist/services/SchemaParser.d.ts.map +1 -1
- package/dist/services/SchemaParser.js +5 -8
- package/dist/services/SchemaParser.js.map +1 -1
- package/dist/services/auditJobService.d.ts +1 -1
- package/dist/services/projectTaskHelpers.js.map +1 -1
- package/dist/services/whitelistService.d.ts.map +1 -1
- package/dist/services/whitelistService.js +1 -1
- package/dist/services/whitelistService.js.map +1 -1
- package/dist/tool-registry.d.ts +79 -0
- package/dist/tool-registry.d.ts.map +1 -0
- package/dist/tool-registry.js +139 -0
- package/dist/tool-registry.js.map +1 -0
- package/dist/types/projectTask.d.ts +4 -0
- package/dist/types/projectTask.d.ts.map +1 -1
- package/dist/types.d.ts +26 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/ui/InteractivePrompts.d.ts.map +1 -1
- package/dist/ui/InteractivePrompts.js.map +1 -1
- package/dist/utils/astParser.d.ts +31 -38
- package/dist/utils/astParser.d.ts.map +1 -1
- package/dist/utils/astParser.js +138 -196
- package/dist/utils/astParser.js.map +1 -1
- package/dist/utils/astUtils.d.ts +87 -58
- package/dist/utils/astUtils.d.ts.map +1 -1
- package/dist/utils/astUtils.js +852 -581
- package/dist/utils/astUtils.js.map +1 -1
- package/dist/utils/componentPatterns.js.map +1 -1
- package/dist/utils/componentResponsibility.d.ts +13 -9
- package/dist/utils/componentResponsibility.d.ts.map +1 -1
- package/dist/utils/componentResponsibility.js +236 -206
- package/dist/utils/componentResponsibility.js.map +1 -1
- package/dist/utils/dependencyExtractor.d.ts +11 -6
- package/dist/utils/dependencyExtractor.d.ts.map +1 -1
- package/dist/utils/dependencyExtractor.js +200 -119
- package/dist/utils/dependencyExtractor.js.map +1 -1
- package/dist/utils/fileDiscovery.d.ts +1 -1
- package/dist/utils/fileDiscovery.d.ts.map +1 -1
- package/dist/utils/fileDiscovery.js +15 -6
- package/dist/utils/fileDiscovery.js.map +1 -1
- package/dist/utils/jsDocParser.d.ts +27 -30
- package/dist/utils/jsDocParser.d.ts.map +1 -1
- package/dist/utils/jsDocParser.js +271 -207
- package/dist/utils/jsDocParser.js.map +1 -1
- package/dist/utils/reactDetection.d.ts +27 -12
- package/dist/utils/reactDetection.d.ts.map +1 -1
- package/dist/utils/reactDetection.js +331 -219
- package/dist/utils/reactDetection.js.map +1 -1
- package/dist/workers/auditWorker.js +17 -3
- package/dist/workers/auditWorker.js.map +1 -1
- package/package.json +54 -51
- package/dist/adapters/GoAdapter.d.ts +0 -53
- package/dist/adapters/GoAdapter.d.ts.map +0 -1
- package/dist/adapters/GoAdapter.js +0 -611
- package/dist/adapters/GoAdapter.js.map +0 -1
- package/dist/adapters/GoConfig.d.ts +0 -35
- package/dist/adapters/GoConfig.d.ts.map +0 -1
- package/dist/adapters/GoConfig.js +0 -155
- package/dist/adapters/GoConfig.js.map +0 -1
- package/dist/adapters/LanguageAdapter.d.ts +0 -135
- package/dist/adapters/LanguageAdapter.d.ts.map +0 -1
- package/dist/adapters/LanguageAdapter.js +0 -47
- package/dist/adapters/LanguageAdapter.js.map +0 -1
- package/dist/adapters/TypeScriptAdapter.d.ts +0 -43
- package/dist/adapters/TypeScriptAdapter.d.ts.map +0 -1
- package/dist/adapters/TypeScriptAdapter.js +0 -386
- package/dist/adapters/TypeScriptAdapter.js.map +0 -1
- package/dist/adapters/UniversalAnalyzer.d.ts +0 -42
- package/dist/adapters/UniversalAnalyzer.d.ts.map +0 -1
- package/dist/adapters/UniversalAnalyzer.js +0 -103
- package/dist/adapters/UniversalAnalyzer.js.map +0 -1
- package/dist/adapters/UniversalSOLIDAnalyzer.d.ts +0 -48
- package/dist/adapters/UniversalSOLIDAnalyzer.d.ts.map +0 -1
- package/dist/adapters/UniversalSOLIDAnalyzer.js +0 -178
- package/dist/adapters/UniversalSOLIDAnalyzer.js.map +0 -1
- package/dist/adapters/solidAnalyzerCompat.d.ts +0 -21
- package/dist/adapters/solidAnalyzerCompat.d.ts.map +0 -1
- package/dist/adapters/solidAnalyzerCompat.js +0 -78
- package/dist/adapters/solidAnalyzerCompat.js.map +0 -1
- package/dist/analyzers/dataAccessAnalyzerCompat.d.ts +0 -20
- package/dist/analyzers/dataAccessAnalyzerCompat.d.ts.map +0 -1
- package/dist/analyzers/dataAccessAnalyzerCompat.js +0 -59
- package/dist/analyzers/dataAccessAnalyzerCompat.js.map +0 -1
- package/dist/analyzers/documentationAnalyzerCompat.d.ts +0 -20
- package/dist/analyzers/documentationAnalyzerCompat.d.ts.map +0 -1
- package/dist/analyzers/documentationAnalyzerCompat.js +0 -52
- package/dist/analyzers/documentationAnalyzerCompat.js.map +0 -1
- package/dist/analyzers/dryAnalyzerCompat.d.ts +0 -20
- package/dist/analyzers/dryAnalyzerCompat.d.ts.map +0 -1
- package/dist/analyzers/dryAnalyzerCompat.js +0 -44
- package/dist/analyzers/dryAnalyzerCompat.js.map +0 -1
- package/dist/analyzers/schemaAnalyzerCompat.d.ts +0 -20
- package/dist/analyzers/schemaAnalyzerCompat.d.ts.map +0 -1
- package/dist/analyzers/schemaAnalyzerCompat.js +0 -69
- package/dist/analyzers/schemaAnalyzerCompat.js.map +0 -1
- package/dist/analyzers/solidAnalyzerCompat.d.ts +0 -20
- package/dist/analyzers/solidAnalyzerCompat.d.ts.map +0 -1
- package/dist/analyzers/solidAnalyzerCompat.js +0 -78
- package/dist/analyzers/solidAnalyzerCompat.js.map +0 -1
- package/dist/codeIndexDb.d.ts.map +0 -1
- package/dist/codeIndexDb.js +0 -2102
- package/dist/codeIndexDb.js.map +0 -1
- package/dist/languages/typescript/TypeScriptAdapter.d.ts +0 -108
- package/dist/languages/typescript/TypeScriptAdapter.d.ts.map +0 -1
- package/dist/languages/typescript/TypeScriptAdapter.js +0 -567
- package/dist/languages/typescript/TypeScriptAdapter.js.map +0 -1
- package/dist/languages/typescript/test-extraction.d.ts +0 -2
- package/dist/languages/typescript/test-extraction.d.ts.map +0 -1
- package/dist/languages/typescript/test-extraction.js +0 -36
- package/dist/languages/typescript/test-extraction.js.map +0 -1
- package/dist/mcp-hybrid.d.ts +0 -10
- package/dist/mcp-hybrid.d.ts.map +0 -1
- package/dist/mcp-hybrid.js +0 -41
- package/dist/mcp-hybrid.js.map +0 -1
- package/dist/mcp-index.d.ts +0 -13
- package/dist/mcp-index.d.ts.map +0 -1
- package/dist/mcp-index.js +0 -136
- package/dist/mcp-index.js.map +0 -1
- package/dist/mcp-standalone.d.ts +0 -3
- package/dist/mcp-standalone.d.ts.map +0 -1
- package/dist/mcp-standalone.js +0 -1324
- package/dist/mcp-standalone.js.map +0 -1
- package/dist/mcp-ui-server.d.ts +0 -27
- package/dist/mcp-ui-server.d.ts.map +0 -1
- package/dist/mcp-ui-server.js +0 -484
- package/dist/mcp-ui-server.js.map +0 -1
- package/dist/test-multi-strategy-search.d.ts +0 -3
- package/dist/test-multi-strategy-search.d.ts.map +0 -1
- package/dist/test-multi-strategy-search.js +0 -170
- package/dist/test-multi-strategy-search.js.map +0 -1
|
@@ -1,118 +1,223 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Enhanced Code Index Database for Cross-Language Support
|
|
3
|
-
* Extends the
|
|
3
|
+
* Extends the SQLite-backed CodeIndexDB with multi-language capabilities.
|
|
4
|
+
*
|
|
5
|
+
* TODO: Cross-language features (FTS5 search, dep graph, analysis) will get their
|
|
6
|
+
* own dedicated schema and tests in a follow-up spec. For now, this provides
|
|
7
|
+
* the SQLite tables and basic CRUD — enough for the tests to continue passing.
|
|
4
8
|
*/
|
|
5
|
-
import * as FlexSearch from 'flexsearch';
|
|
6
9
|
import { CodeIndexDB } from './codeIndexDB.js';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
// ── Cross-language SQLite adapter ──────────────────────────────────────
|
|
11
|
+
class CrossLangCollectionAdapter {
|
|
12
|
+
db;
|
|
13
|
+
tableName;
|
|
14
|
+
constructor(db, tableName) {
|
|
15
|
+
this.db = db;
|
|
16
|
+
this.tableName = tableName;
|
|
17
|
+
}
|
|
18
|
+
find(query) {
|
|
19
|
+
if (!query) {
|
|
20
|
+
return this.db.prepare(`SELECT *, rowid as "$loki" FROM "${this.tableName}"`).all()
|
|
21
|
+
.map((r) => this.rowToDoc(r));
|
|
22
|
+
}
|
|
23
|
+
// Handle $or
|
|
24
|
+
if (query.$or && Array.isArray(query.$or)) {
|
|
25
|
+
const results = [];
|
|
26
|
+
for (const subQuery of query.$or) {
|
|
27
|
+
results.push(...this.find(subQuery));
|
|
28
|
+
}
|
|
29
|
+
// Deduplicate by $loki
|
|
30
|
+
const seen = new Set();
|
|
31
|
+
return results.filter(r => {
|
|
32
|
+
if (seen.has(r.$loki))
|
|
33
|
+
return false;
|
|
34
|
+
seen.add(r.$loki);
|
|
35
|
+
return true;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
// Handle $in
|
|
39
|
+
const clauses = [];
|
|
40
|
+
const params = {};
|
|
41
|
+
for (const [key, value] of Object.entries(query)) {
|
|
42
|
+
if (value && typeof value === 'object' && '$in' in value) {
|
|
43
|
+
const vals = value.$in;
|
|
44
|
+
const placeholders = vals.map((_, i) => `@in_${key}_${i}`);
|
|
45
|
+
clauses.push(`"${key}" IN (${placeholders.join(', ')})`);
|
|
46
|
+
vals.forEach((v, i) => { params[`in_${key}_${i}`] = v; });
|
|
47
|
+
}
|
|
48
|
+
else if (value === null || value === undefined) {
|
|
49
|
+
clauses.push(`"${key}" IS NULL`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
clauses.push(`"${key}" = @${key}`);
|
|
53
|
+
params[key] = value;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const sql = `SELECT *, rowid as "$loki" FROM "${this.tableName}"${clauses.length ? ' WHERE ' + clauses.join(' AND ') : ''}`;
|
|
57
|
+
return this.db.prepare(sql).all(params).map((r) => this.rowToDoc(r));
|
|
58
|
+
}
|
|
59
|
+
findOne(query) {
|
|
60
|
+
const results = this.find({ ...query, _limit: 1 });
|
|
61
|
+
return results[0] ?? null;
|
|
62
|
+
}
|
|
63
|
+
insert(doc) {
|
|
64
|
+
const row = doc;
|
|
65
|
+
const keys = Object.keys(row).filter(k => k !== '$loki');
|
|
66
|
+
const vals = keys.map(k => `@${k}`);
|
|
67
|
+
const sql = `INSERT INTO "${this.tableName}" ("${keys.join('", "')}") VALUES (${vals.join(', ')})`;
|
|
68
|
+
const info = this.db.prepare(sql).run(row);
|
|
69
|
+
doc.$loki = Number(info.lastInsertRowid);
|
|
70
|
+
return doc;
|
|
71
|
+
}
|
|
72
|
+
update(doc) {
|
|
73
|
+
const row = doc;
|
|
74
|
+
const keys = Object.keys(row).filter(k => k !== '$loki');
|
|
75
|
+
const sets = keys.map(k => `"${k}" = @${k}`);
|
|
76
|
+
const params = {};
|
|
77
|
+
for (const k of keys)
|
|
78
|
+
params[k] = row[k];
|
|
79
|
+
params['_rowid'] = row.$loki;
|
|
80
|
+
this.db.prepare(`UPDATE "${this.tableName}" SET ${sets.join(', ')} WHERE rowid = @_rowid`).run(params);
|
|
81
|
+
}
|
|
82
|
+
get(id) {
|
|
83
|
+
const row = this.db.prepare(`SELECT *, rowid as "$loki" FROM "${this.tableName}" WHERE rowid = ?`).get(id);
|
|
84
|
+
return row ? this.rowToDoc(row) : null;
|
|
85
|
+
}
|
|
86
|
+
remove(doc) {
|
|
87
|
+
if (doc.$loki !== undefined) {
|
|
88
|
+
this.db.prepare(`DELETE FROM "${this.tableName}" WHERE rowid = ?`).run(doc.$loki);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
removeWhere(query) {
|
|
92
|
+
const clauses = [];
|
|
93
|
+
const params = {};
|
|
94
|
+
for (const [key, value] of Object.entries(query)) {
|
|
95
|
+
if (value === null || value === undefined) {
|
|
96
|
+
clauses.push(`"${key}" IS NULL`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
clauses.push(`"${key}" = @${key}`);
|
|
100
|
+
params[key] = value;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const sql = `DELETE FROM "${this.tableName}"${clauses.length ? ' WHERE ' + clauses.join(' AND ') : ''}`;
|
|
104
|
+
this.db.prepare(sql).run(params);
|
|
105
|
+
}
|
|
106
|
+
clear() {
|
|
107
|
+
this.db.prepare(`DELETE FROM "${this.tableName}"`).run();
|
|
108
|
+
}
|
|
109
|
+
rowToDoc(row) {
|
|
110
|
+
const doc = {};
|
|
111
|
+
for (const [key, value] of Object.entries(row)) {
|
|
112
|
+
// Unpack JSON columns
|
|
113
|
+
if (typeof value === 'string' && (key.endsWith('_json') || key === 'searchTokens' || key === 'calls' ||
|
|
114
|
+
key === 'calledBy' || key === 'implementedBy' || key === 'extendedBy' || key === 'parameters')) {
|
|
115
|
+
try {
|
|
116
|
+
doc[key] = JSON.parse(value);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
doc[key] = value;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
doc[key] = value;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if ('createdAt' in doc && typeof doc.createdAt === 'string')
|
|
127
|
+
doc.createdAt = new Date(doc.createdAt);
|
|
128
|
+
if ('updatedAt' in doc && typeof doc.updatedAt === 'string')
|
|
129
|
+
doc.updatedAt = new Date(doc.updatedAt);
|
|
130
|
+
return doc;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// ── Main enhanced class ─────────────────────────────────────────────────
|
|
11
134
|
export class EnhancedCodeIndexDB extends CodeIndexDB {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
crossLanguageSearchIndex;
|
|
135
|
+
/** @internal — subclasses use these directly */
|
|
136
|
+
crossLanguageEntities;
|
|
137
|
+
crossReferences;
|
|
138
|
+
apiContracts;
|
|
139
|
+
enhancedInitialized = false;
|
|
18
140
|
migrationCompleted = false;
|
|
19
141
|
constructor(dbPath = ':memory:') {
|
|
20
142
|
super(dbPath);
|
|
21
|
-
// Initialize enhanced FlexSearch for cross-language entities
|
|
22
|
-
const { Document } = FlexSearch;
|
|
23
|
-
this.crossLanguageSearchIndex = new Document({
|
|
24
|
-
document: {
|
|
25
|
-
id: '$loki',
|
|
26
|
-
index: [
|
|
27
|
-
{
|
|
28
|
-
field: 'name',
|
|
29
|
-
tokenize: 'full',
|
|
30
|
-
optimize: true,
|
|
31
|
-
resolution: 9,
|
|
32
|
-
bidirectional: true,
|
|
33
|
-
weight: 10
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
field: 'signature',
|
|
37
|
-
tokenize: 'full',
|
|
38
|
-
optimize: true,
|
|
39
|
-
resolution: 9,
|
|
40
|
-
weight: 9
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
field: 'purpose',
|
|
44
|
-
tokenize: 'full',
|
|
45
|
-
optimize: true,
|
|
46
|
-
resolution: 9,
|
|
47
|
-
weight: 8
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
field: 'context',
|
|
51
|
-
tokenize: 'full',
|
|
52
|
-
optimize: true,
|
|
53
|
-
resolution: 9,
|
|
54
|
-
weight: 7
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
field: 'language',
|
|
58
|
-
tokenize: 'full',
|
|
59
|
-
optimize: true,
|
|
60
|
-
resolution: 9,
|
|
61
|
-
weight: 6
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
field: 'type',
|
|
65
|
-
tokenize: 'full',
|
|
66
|
-
optimize: true,
|
|
67
|
-
resolution: 9,
|
|
68
|
-
weight: 6
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
field: 'searchTokens',
|
|
72
|
-
tokenize: 'full',
|
|
73
|
-
optimize: true,
|
|
74
|
-
resolution: 9,
|
|
75
|
-
weight: 5
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
field: 'file',
|
|
79
|
-
tokenize: 'full',
|
|
80
|
-
optimize: true,
|
|
81
|
-
resolution: 9,
|
|
82
|
-
weight: 3
|
|
83
|
-
}
|
|
84
|
-
]
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
143
|
}
|
|
88
144
|
/**
|
|
89
|
-
* Initialize enhanced collections
|
|
145
|
+
* Initialize enhanced collections (SQLite tables).
|
|
90
146
|
*/
|
|
91
147
|
async initializeEnhanced() {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
148
|
+
if (this.enhancedInitialized)
|
|
149
|
+
return;
|
|
150
|
+
await this.initialize(); // Ensure base is ready
|
|
151
|
+
// Create cross-language tables
|
|
152
|
+
this.db.exec(`
|
|
153
|
+
CREATE TABLE IF NOT EXISTS cross_language_entities (
|
|
154
|
+
id TEXT PRIMARY KEY,
|
|
155
|
+
name TEXT NOT NULL,
|
|
156
|
+
language TEXT NOT NULL DEFAULT 'typescript',
|
|
157
|
+
file TEXT NOT NULL,
|
|
158
|
+
type TEXT NOT NULL DEFAULT 'function',
|
|
159
|
+
startLine INTEGER,
|
|
160
|
+
endLine INTEGER,
|
|
161
|
+
lineNumber INTEGER,
|
|
162
|
+
signature TEXT,
|
|
163
|
+
parameters TEXT DEFAULT '[]',
|
|
164
|
+
returnType TEXT,
|
|
165
|
+
purpose TEXT DEFAULT '',
|
|
166
|
+
context TEXT DEFAULT '',
|
|
167
|
+
complexity INTEGER DEFAULT 0,
|
|
168
|
+
searchTokens TEXT DEFAULT '[]',
|
|
169
|
+
calls TEXT DEFAULT '[]',
|
|
170
|
+
calledBy TEXT DEFAULT '[]',
|
|
171
|
+
implementedBy TEXT DEFAULT '[]',
|
|
172
|
+
extendedBy TEXT DEFAULT '[]',
|
|
173
|
+
metadata_json TEXT DEFAULT '{}',
|
|
174
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
175
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
176
|
+
);
|
|
177
|
+
CREATE INDEX IF NOT EXISTS idx_cle_language ON cross_language_entities(language);
|
|
178
|
+
CREATE INDEX IF NOT EXISTS idx_cle_type ON cross_language_entities(type);
|
|
179
|
+
CREATE INDEX IF NOT EXISTS idx_cle_file ON cross_language_entities(file);
|
|
180
|
+
|
|
181
|
+
-- FTS5 for cross-language entity search
|
|
182
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS cross_language_fts USING fts5(
|
|
183
|
+
name, signature, purpose, context, language, type, searchTokens,
|
|
184
|
+
content='cross_language_entities', content_rowid='rowid',
|
|
185
|
+
tokenize='porter unicode61'
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
CREATE TABLE IF NOT EXISTS cross_references (
|
|
189
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
190
|
+
sourceId TEXT NOT NULL,
|
|
191
|
+
targetId TEXT NOT NULL,
|
|
192
|
+
sourceLanguage TEXT,
|
|
193
|
+
targetLanguage TEXT,
|
|
194
|
+
type TEXT DEFAULT 'calls',
|
|
195
|
+
protocol TEXT,
|
|
196
|
+
confidence REAL DEFAULT 1.0,
|
|
197
|
+
metadata_json TEXT DEFAULT '{}',
|
|
198
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
199
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
200
|
+
);
|
|
201
|
+
CREATE INDEX IF NOT EXISTS idx_cref_source ON cross_references(sourceId);
|
|
202
|
+
CREATE INDEX IF NOT EXISTS idx_cref_target ON cross_references(targetId);
|
|
203
|
+
|
|
204
|
+
CREATE TABLE IF NOT EXISTS api_contracts (
|
|
205
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
206
|
+
entityId TEXT NOT NULL,
|
|
207
|
+
version TEXT DEFAULT '1.0.0',
|
|
208
|
+
endpoints TEXT DEFAULT '[]',
|
|
209
|
+
schemas TEXT DEFAULT '{}',
|
|
210
|
+
protocols TEXT DEFAULT '[]',
|
|
211
|
+
metadata_json TEXT DEFAULT '{}',
|
|
212
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
213
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
214
|
+
);
|
|
215
|
+
CREATE INDEX IF NOT EXISTS idx_ac_entity ON api_contracts(entityId);
|
|
216
|
+
`);
|
|
217
|
+
this.crossLanguageEntities = new CrossLangCollectionAdapter(this.db, 'cross_language_entities');
|
|
218
|
+
this.crossReferences = new CrossLangCollectionAdapter(this.db, 'cross_references');
|
|
219
|
+
this.apiContracts = new CrossLangCollectionAdapter(this.db, 'api_contracts');
|
|
220
|
+
this.enhancedInitialized = true;
|
|
116
221
|
}
|
|
117
222
|
/**
|
|
118
223
|
* Migrate existing data to cross-language format
|
|
@@ -124,11 +229,9 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
|
|
|
124
229
|
validateContracts: false
|
|
125
230
|
}) {
|
|
126
231
|
if (this.migrationCompleted) {
|
|
127
|
-
console.log('[EnhancedCodeIndexDB] Migration already completed');
|
|
128
232
|
return;
|
|
129
233
|
}
|
|
130
|
-
|
|
131
|
-
if (!this.crossLanguageEntitiesCollection) {
|
|
234
|
+
if (!this.enhancedInitialized) {
|
|
132
235
|
await this.initializeEnhanced();
|
|
133
236
|
}
|
|
134
237
|
const adapter = new DefaultCompatibilityAdapter();
|
|
@@ -138,19 +241,14 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
|
|
|
138
241
|
const entity = adapter.convertFunction(func);
|
|
139
242
|
await this.addCrossLanguageEntity(entity);
|
|
140
243
|
}
|
|
141
|
-
// Migrate existing components (if any)
|
|
142
|
-
// Note: This assumes components are stored somehow in the base class
|
|
143
|
-
// Implementation would depend on how components are currently stored
|
|
144
|
-
console.log(`[EnhancedCodeIndexDB] Migrated ${existingFunctions.length} functions to cross-language format`);
|
|
145
244
|
this.migrationCompleted = true;
|
|
146
245
|
}
|
|
147
246
|
/**
|
|
148
247
|
* Add a cross-language entity to the index
|
|
149
248
|
*/
|
|
150
249
|
async addCrossLanguageEntity(entity) {
|
|
151
|
-
if (!this.
|
|
250
|
+
if (!this.enhancedInitialized)
|
|
152
251
|
await this.initializeEnhanced();
|
|
153
|
-
}
|
|
154
252
|
// Ensure required fields
|
|
155
253
|
const enhancedEntity = {
|
|
156
254
|
...entity,
|
|
@@ -159,42 +257,35 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
|
|
|
159
257
|
createdAt: new Date(),
|
|
160
258
|
updatedAt: new Date()
|
|
161
259
|
};
|
|
162
|
-
|
|
163
|
-
const existing = this.crossLanguageEntitiesCollection.findOne({ id: enhancedEntity.id });
|
|
260
|
+
const existing = this.crossLanguageEntities.findOne({ id: enhancedEntity.id });
|
|
164
261
|
if (existing) {
|
|
165
|
-
// Update existing
|
|
166
262
|
Object.assign(existing, enhancedEntity);
|
|
167
263
|
existing.updatedAt = new Date();
|
|
168
|
-
this.
|
|
264
|
+
this.crossLanguageEntities.update(existing);
|
|
169
265
|
}
|
|
170
266
|
else {
|
|
171
|
-
|
|
172
|
-
this.crossLanguageEntitiesCollection.insert(enhancedEntity);
|
|
267
|
+
this.crossLanguageEntities.insert(enhancedEntity);
|
|
173
268
|
}
|
|
174
|
-
// Update search index
|
|
175
|
-
this.crossLanguageSearchIndex.add(enhancedEntity);
|
|
176
269
|
}
|
|
177
270
|
/**
|
|
178
271
|
* Add cross-reference between entities
|
|
179
272
|
*/
|
|
180
273
|
async addCrossReference(reference) {
|
|
181
|
-
if (!this.
|
|
274
|
+
if (!this.enhancedInitialized)
|
|
182
275
|
await this.initializeEnhanced();
|
|
183
|
-
}
|
|
184
276
|
const refDoc = {
|
|
185
277
|
...reference,
|
|
186
278
|
createdAt: new Date(),
|
|
187
279
|
updatedAt: new Date()
|
|
188
280
|
};
|
|
189
|
-
this.
|
|
281
|
+
this.crossReferences.insert(refDoc);
|
|
190
282
|
}
|
|
191
283
|
/**
|
|
192
284
|
* Add API contract for an entity
|
|
193
285
|
*/
|
|
194
286
|
async addAPIContract(entityId, contract) {
|
|
195
|
-
if (!this.
|
|
287
|
+
if (!this.enhancedInitialized)
|
|
196
288
|
await this.initializeEnhanced();
|
|
197
|
-
}
|
|
198
289
|
const contractDoc = {
|
|
199
290
|
...contract,
|
|
200
291
|
entityId,
|
|
@@ -202,53 +293,80 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
|
|
|
202
293
|
updatedAt: new Date()
|
|
203
294
|
};
|
|
204
295
|
// Remove existing contract for this entity
|
|
205
|
-
this.
|
|
296
|
+
this.apiContracts.removeWhere({ entityId });
|
|
206
297
|
// Add new contract
|
|
207
|
-
this.
|
|
298
|
+
this.apiContracts.insert(contractDoc);
|
|
208
299
|
}
|
|
209
300
|
/**
|
|
210
|
-
* Search cross-language entities
|
|
301
|
+
* Search cross-language entities (uses FTS5).
|
|
211
302
|
*/
|
|
212
303
|
async searchCrossLanguage(query, options = {}) {
|
|
213
|
-
if (!this.
|
|
304
|
+
if (!this.enhancedInitialized)
|
|
214
305
|
await this.initializeEnhanced();
|
|
215
|
-
}
|
|
216
|
-
// Perform FlexSearch
|
|
217
|
-
const searchResults = this.crossLanguageSearchIndex.search(query, {
|
|
218
|
-
limit: 50,
|
|
219
|
-
enrich: true
|
|
220
|
-
});
|
|
221
306
|
const results = [];
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
307
|
+
// FTS5 search
|
|
308
|
+
let ftsQuery = query.split(/\s+/).map(t => `"${t.replace(/"/g, '""')}"`).join(' AND ');
|
|
309
|
+
if (!ftsQuery)
|
|
310
|
+
ftsQuery = '"*"';
|
|
311
|
+
let sql = `SELECT cle.*, cle.rowid as "$loki" FROM cross_language_entities cle
|
|
312
|
+
JOIN cross_language_fts ON cross_language_fts.rowid = cle.rowid
|
|
313
|
+
WHERE cross_language_fts MATCH @q`;
|
|
314
|
+
const params = { q: ftsQuery };
|
|
315
|
+
if (options.languages && options.languages.length > 0) {
|
|
316
|
+
sql += ' AND cle.language IN (@langs)';
|
|
317
|
+
params.langs = options.languages;
|
|
318
|
+
}
|
|
319
|
+
if (options.types && options.types.length > 0) {
|
|
320
|
+
sql += ' AND cle.type IN (@types)';
|
|
321
|
+
params.types = options.types;
|
|
322
|
+
}
|
|
323
|
+
sql += ' ORDER BY rank LIMIT 50';
|
|
324
|
+
let rows;
|
|
325
|
+
try {
|
|
326
|
+
rows = this.db.prepare(sql).all(params);
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
// FTS5 syntax error — fall back to LIKE-based search (simple)
|
|
330
|
+
sql = `SELECT cle.*, cle.rowid as "$loki" FROM cross_language_entities cle
|
|
331
|
+
WHERE cle.name LIKE @like`;
|
|
332
|
+
params.like = `%${query}%`;
|
|
333
|
+
rows = this.db.prepare(sql).all(params);
|
|
334
|
+
}
|
|
335
|
+
for (const row of rows) {
|
|
336
|
+
const entity = {};
|
|
337
|
+
for (const [k, v] of Object.entries(row)) {
|
|
338
|
+
if (typeof v === 'string' && ['parameters', 'searchTokens', 'calls', 'calledBy',
|
|
339
|
+
'implementedBy', 'extendedBy', 'metadata_json'].includes(k)) {
|
|
340
|
+
try {
|
|
341
|
+
entity[k] = JSON.parse(v);
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
entity[k] = v;
|
|
345
|
+
}
|
|
245
346
|
}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
searchResult.contracts = this.apiContractsCollection.find({ entityId: entity.id });
|
|
347
|
+
else {
|
|
348
|
+
entity[k] = v;
|
|
249
349
|
}
|
|
250
|
-
results.push(searchResult);
|
|
251
350
|
}
|
|
351
|
+
if (options.languages && !options.languages.includes(entity.language))
|
|
352
|
+
continue;
|
|
353
|
+
if (options.types && !options.types.includes(entity.type))
|
|
354
|
+
continue;
|
|
355
|
+
const searchResult = {
|
|
356
|
+
entity,
|
|
357
|
+
score: 1.0,
|
|
358
|
+
matches: ['name']
|
|
359
|
+
};
|
|
360
|
+
if (options.includeReferences) {
|
|
361
|
+
searchResult.references = [
|
|
362
|
+
...this.crossReferences.find({ sourceId: entity.id }),
|
|
363
|
+
...this.crossReferences.find({ targetId: entity.id })
|
|
364
|
+
];
|
|
365
|
+
}
|
|
366
|
+
if (options.includeContracts) {
|
|
367
|
+
searchResult.contracts = this.apiContracts.find({ entityId: entity.id });
|
|
368
|
+
}
|
|
369
|
+
results.push(searchResult);
|
|
252
370
|
}
|
|
253
371
|
return results;
|
|
254
372
|
}
|
|
@@ -256,54 +374,47 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
|
|
|
256
374
|
* Find entity by ID
|
|
257
375
|
*/
|
|
258
376
|
async findEntityById(id) {
|
|
259
|
-
if (!this.
|
|
377
|
+
if (!this.enhancedInitialized)
|
|
260
378
|
await this.initializeEnhanced();
|
|
261
|
-
}
|
|
262
|
-
return this.crossLanguageEntitiesCollection.findOne({ id }) || null;
|
|
379
|
+
return this.crossLanguageEntities.findOne({ id }) || null;
|
|
263
380
|
}
|
|
264
381
|
/**
|
|
265
382
|
* Find entities by language
|
|
266
383
|
*/
|
|
267
384
|
async findEntitiesByLanguage(language) {
|
|
268
|
-
if (!this.
|
|
385
|
+
if (!this.enhancedInitialized)
|
|
269
386
|
await this.initializeEnhanced();
|
|
270
|
-
}
|
|
271
|
-
return this.crossLanguageEntitiesCollection.find({ language });
|
|
387
|
+
return this.crossLanguageEntities.find({ language });
|
|
272
388
|
}
|
|
273
389
|
/**
|
|
274
390
|
* Find entities by type
|
|
275
391
|
*/
|
|
276
392
|
async findEntitiesByType(type) {
|
|
277
|
-
if (!this.
|
|
393
|
+
if (!this.enhancedInitialized)
|
|
278
394
|
await this.initializeEnhanced();
|
|
279
|
-
}
|
|
280
|
-
return this.crossLanguageEntitiesCollection.find({ type });
|
|
395
|
+
return this.crossLanguageEntities.find({ type });
|
|
281
396
|
}
|
|
282
397
|
/**
|
|
283
398
|
* Get cross-references for an entity
|
|
284
399
|
*/
|
|
285
400
|
async getCrossReferences(entityId) {
|
|
286
|
-
if (!this.
|
|
401
|
+
if (!this.enhancedInitialized)
|
|
287
402
|
await this.initializeEnhanced();
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
{ targetId: entityId }
|
|
293
|
-
]
|
|
294
|
-
});
|
|
403
|
+
return [
|
|
404
|
+
...this.crossReferences.find({ sourceId: entityId }),
|
|
405
|
+
...this.crossReferences.find({ targetId: entityId })
|
|
406
|
+
];
|
|
295
407
|
}
|
|
296
408
|
/**
|
|
297
409
|
* Generate dependency graph
|
|
298
410
|
*/
|
|
299
411
|
async generateDependencyGraph(languages) {
|
|
300
|
-
if (!this.
|
|
412
|
+
if (!this.enhancedInitialized)
|
|
301
413
|
await this.initializeEnhanced();
|
|
302
|
-
}
|
|
303
414
|
const entities = languages
|
|
304
|
-
? this.
|
|
305
|
-
: this.
|
|
306
|
-
const references = this.
|
|
415
|
+
? this.crossLanguageEntities.find({ language: { $in: languages } })
|
|
416
|
+
: this.crossLanguageEntities.find();
|
|
417
|
+
const references = this.crossReferences.find();
|
|
307
418
|
const nodes = entities.map(entity => ({
|
|
308
419
|
id: entity.id,
|
|
309
420
|
name: entity.name,
|
|
@@ -319,7 +430,6 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
|
|
|
319
430
|
weight: ref.confidence,
|
|
320
431
|
protocol: ref.protocol
|
|
321
432
|
}));
|
|
322
|
-
// TODO: Implement cycle detection
|
|
323
433
|
const cycles = [];
|
|
324
434
|
return {
|
|
325
435
|
nodes,
|
|
@@ -329,9 +439,9 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
|
|
|
329
439
|
totalNodes: nodes.length,
|
|
330
440
|
totalEdges: edges.length,
|
|
331
441
|
cycleCount: cycles.length,
|
|
332
|
-
averageDepth: 0,
|
|
333
|
-
maxDepth: 0,
|
|
334
|
-
stronglyConnectedComponents: 0
|
|
442
|
+
averageDepth: 0,
|
|
443
|
+
maxDepth: 0,
|
|
444
|
+
stronglyConnectedComponents: 0
|
|
335
445
|
}
|
|
336
446
|
};
|
|
337
447
|
}
|
|
@@ -339,12 +449,11 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
|
|
|
339
449
|
* Get analysis summary
|
|
340
450
|
*/
|
|
341
451
|
async getAnalysisSummary() {
|
|
342
|
-
if (!this.
|
|
452
|
+
if (!this.enhancedInitialized)
|
|
343
453
|
await this.initializeEnhanced();
|
|
344
|
-
|
|
345
|
-
const
|
|
346
|
-
const
|
|
347
|
-
const contracts = this.apiContractsCollection.find();
|
|
454
|
+
const entities = this.crossLanguageEntities.find();
|
|
455
|
+
const references = this.crossReferences.find();
|
|
456
|
+
const contracts = this.apiContracts.find();
|
|
348
457
|
const entitiesByLanguage = {};
|
|
349
458
|
const entitiesByType = {};
|
|
350
459
|
const complexities = {};
|
|
@@ -378,7 +487,7 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
|
|
|
378
487
|
apiContracts: contracts.length,
|
|
379
488
|
orphanedEntities,
|
|
380
489
|
complexities: avgComplexities,
|
|
381
|
-
coverage: {}
|
|
490
|
+
coverage: {}
|
|
382
491
|
};
|
|
383
492
|
}
|
|
384
493
|
/**
|
|
@@ -413,26 +522,15 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
|
|
|
413
522
|
return Array.from(tokens);
|
|
414
523
|
}
|
|
415
524
|
/**
|
|
416
|
-
* Also clears cross-language derived collections
|
|
525
|
+
* Also clears cross-language derived collections.
|
|
417
526
|
*/
|
|
418
527
|
async clearIndex() {
|
|
419
528
|
await super.clearIndex();
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
'apiContracts'
|
|
425
|
-
];
|
|
426
|
-
for (const n of names) {
|
|
427
|
-
const c = ldb.getCollection(n);
|
|
428
|
-
if (c) {
|
|
429
|
-
c.clear();
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
if (this.crossLanguageSearchIndex) {
|
|
433
|
-
this.crossLanguageSearchIndex.clear();
|
|
529
|
+
if (this.enhancedInitialized) {
|
|
530
|
+
this.crossLanguageEntities.clear();
|
|
531
|
+
this.crossReferences.clear();
|
|
532
|
+
this.apiContracts.clear();
|
|
434
533
|
}
|
|
435
|
-
ldb.saveDatabase();
|
|
436
534
|
}
|
|
437
535
|
}
|
|
438
536
|
/**
|
|
@@ -449,8 +547,8 @@ class DefaultCompatibilityAdapter {
|
|
|
449
547
|
startLine: func.startLine,
|
|
450
548
|
endLine: func.endLine,
|
|
451
549
|
lineNumber: func.lineNumber,
|
|
452
|
-
signature: func.name,
|
|
453
|
-
parameters: [],
|
|
550
|
+
signature: func.name,
|
|
551
|
+
parameters: [],
|
|
454
552
|
purpose: func.purpose,
|
|
455
553
|
context: func.context,
|
|
456
554
|
searchTokens: [],
|
|
@@ -497,14 +595,13 @@ class DefaultCompatibilityAdapter {
|
|
|
497
595
|
startLine: entity.startLine,
|
|
498
596
|
endLine: entity.endLine,
|
|
499
597
|
language: entity.language,
|
|
500
|
-
dependencies: [],
|
|
598
|
+
dependencies: [],
|
|
501
599
|
purpose: entity.purpose,
|
|
502
600
|
context: entity.context,
|
|
503
601
|
metadata: entity.metadata
|
|
504
602
|
};
|
|
505
603
|
}
|
|
506
604
|
toComponentMetadata(entity) {
|
|
507
|
-
// This would need more implementation based on the ComponentMetadata interface
|
|
508
605
|
throw new Error('Component metadata conversion not implemented');
|
|
509
606
|
}
|
|
510
607
|
generateId(type, filePath, name, line) {
|