sdlc-agent-4-enterprise-server 1.0.0
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 +244 -0
- package/dist/admin/__tests__/admin-db.test.d.ts +5 -0
- package/dist/admin/__tests__/admin-db.test.js +357 -0
- package/dist/admin/__tests__/admin-db.test.js.map +1 -0
- package/dist/admin/admin-db.d.ts +120 -0
- package/dist/admin/admin-db.js +1056 -0
- package/dist/admin/admin-db.js.map +1 -0
- package/dist/admin/index.d.ts +13 -0
- package/dist/admin/index.js +73 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/middleware/audit.middleware.d.ts +13 -0
- package/dist/admin/middleware/audit.middleware.js +57 -0
- package/dist/admin/middleware/audit.middleware.js.map +1 -0
- package/dist/admin/middleware/rate-limit.middleware.d.ts +2 -0
- package/dist/admin/middleware/rate-limit.middleware.js +47 -0
- package/dist/admin/middleware/rate-limit.middleware.js.map +1 -0
- package/dist/admin/middleware/rbac.middleware.d.ts +8 -0
- package/dist/admin/middleware/rbac.middleware.js +111 -0
- package/dist/admin/middleware/rbac.middleware.js.map +1 -0
- package/dist/admin/routes/analytics.router.d.ts +3 -0
- package/dist/admin/routes/analytics.router.js +47 -0
- package/dist/admin/routes/analytics.router.js.map +1 -0
- package/dist/admin/routes/audit.router.d.ts +4 -0
- package/dist/admin/routes/audit.router.js +27 -0
- package/dist/admin/routes/audit.router.js.map +1 -0
- package/dist/admin/routes/config.router.d.ts +4 -0
- package/dist/admin/routes/config.router.js +23 -0
- package/dist/admin/routes/config.router.js.map +1 -0
- package/dist/admin/routes/dashboard.router.d.ts +5 -0
- package/dist/admin/routes/dashboard.router.js +11 -0
- package/dist/admin/routes/dashboard.router.js.map +1 -0
- package/dist/admin/routes/helpers.d.ts +26 -0
- package/dist/admin/routes/helpers.js +13 -0
- package/dist/admin/routes/helpers.js.map +1 -0
- package/dist/admin/routes/kb-admin.router.d.ts +5 -0
- package/dist/admin/routes/kb-admin.router.js +49 -0
- package/dist/admin/routes/kb-admin.router.js.map +1 -0
- package/dist/admin/routes/mcp-admin.router.d.ts +4 -0
- package/dist/admin/routes/mcp-admin.router.js +35 -0
- package/dist/admin/routes/mcp-admin.router.js.map +1 -0
- package/dist/admin/routes/rbac.router.d.ts +4 -0
- package/dist/admin/routes/rbac.router.js +71 -0
- package/dist/admin/routes/rbac.router.js.map +1 -0
- package/dist/admin/routes/search.router.d.ts +3 -0
- package/dist/admin/routes/search.router.js +20 -0
- package/dist/admin/routes/search.router.js.map +1 -0
- package/dist/admin/routes/user.router.d.ts +4 -0
- package/dist/admin/routes/user.router.js +53 -0
- package/dist/admin/routes/user.router.js.map +1 -0
- package/dist/admin/services/audit.service.d.ts +13 -0
- package/dist/admin/services/audit.service.js +40 -0
- package/dist/admin/services/audit.service.js.map +1 -0
- package/dist/admin/services/config.service.d.ts +10 -0
- package/dist/admin/services/config.service.js +31 -0
- package/dist/admin/services/config.service.js.map +1 -0
- package/dist/admin/services/dashboard.service.d.ts +9 -0
- package/dist/admin/services/dashboard.service.js +46 -0
- package/dist/admin/services/dashboard.service.js.map +1 -0
- package/dist/admin/services/kb-admin.service.d.ts +27 -0
- package/dist/admin/services/kb-admin.service.js +74 -0
- package/dist/admin/services/kb-admin.service.js.map +1 -0
- package/dist/admin/services/mcp-admin.service.d.ts +13 -0
- package/dist/admin/services/mcp-admin.service.js +40 -0
- package/dist/admin/services/mcp-admin.service.js.map +1 -0
- package/dist/admin/services/rbac.service.d.ts +16 -0
- package/dist/admin/services/rbac.service.js +104 -0
- package/dist/admin/services/rbac.service.js.map +1 -0
- package/dist/admin/services/search.service.d.ts +23 -0
- package/dist/admin/services/search.service.js +36 -0
- package/dist/admin/services/search.service.js.map +1 -0
- package/dist/admin/services/sse.manager.d.ts +12 -0
- package/dist/admin/services/sse.manager.js +55 -0
- package/dist/admin/services/sse.manager.js.map +1 -0
- package/dist/admin/services/user.service.d.ts +25 -0
- package/dist/admin/services/user.service.js +69 -0
- package/dist/admin/services/user.service.js.map +1 -0
- package/dist/admin/standalone-server.d.ts +1 -0
- package/dist/admin/standalone-server.js +94 -0
- package/dist/admin/standalone-server.js.map +1 -0
- package/dist/admin/types/admin.types.d.ts +187 -0
- package/dist/admin/types/admin.types.js +28 -0
- package/dist/admin/types/admin.types.js.map +1 -0
- package/dist/admin/types/api.types.d.ts +41 -0
- package/dist/admin/types/api.types.js +44 -0
- package/dist/admin/types/api.types.js.map +1 -0
- package/dist/admin/types/rbac.types.d.ts +86 -0
- package/dist/admin/types/rbac.types.js +6 -0
- package/dist/admin/types/rbac.types.js.map +1 -0
- package/dist/config/BackendConfig.d.ts +32 -0
- package/dist/config/BackendConfig.js +41 -0
- package/dist/config/BackendConfig.js.map +1 -0
- package/dist/engine/analyzers/complexity/ComplexityAnalyzer.d.ts +24 -0
- package/dist/engine/analyzers/complexity/ComplexityAnalyzer.js +90 -0
- package/dist/engine/analyzers/complexity/ComplexityAnalyzer.js.map +1 -0
- package/dist/engine/analyzers/complexity/ComplexityCalculator.d.ts +19 -0
- package/dist/engine/analyzers/complexity/ComplexityCalculator.js +54 -0
- package/dist/engine/analyzers/complexity/ComplexityCalculator.js.map +1 -0
- package/dist/engine/analyzers/complexity/ComplexityStore.d.ts +22 -0
- package/dist/engine/analyzers/complexity/ComplexityStore.js +152 -0
- package/dist/engine/analyzers/complexity/ComplexityStore.js.map +1 -0
- package/dist/engine/analyzers/complexity/ComplexityTool.d.ts +45 -0
- package/dist/engine/analyzers/complexity/ComplexityTool.js +58 -0
- package/dist/engine/analyzers/complexity/ComplexityTool.js.map +1 -0
- package/dist/engine/analyzers/complexity/GradeAssigner.d.ts +12 -0
- package/dist/engine/analyzers/complexity/GradeAssigner.js +32 -0
- package/dist/engine/analyzers/complexity/GradeAssigner.js.map +1 -0
- package/dist/engine/analyzers/complexity/counters/BaseNodeCounter.d.ts +25 -0
- package/dist/engine/analyzers/complexity/counters/BaseNodeCounter.js +85 -0
- package/dist/engine/analyzers/complexity/counters/BaseNodeCounter.js.map +1 -0
- package/dist/engine/analyzers/complexity/counters/GoCounter.d.ts +14 -0
- package/dist/engine/analyzers/complexity/counters/GoCounter.js +31 -0
- package/dist/engine/analyzers/complexity/counters/GoCounter.js.map +1 -0
- package/dist/engine/analyzers/complexity/counters/JavaCounter.d.ts +13 -0
- package/dist/engine/analyzers/complexity/counters/JavaCounter.js +29 -0
- package/dist/engine/analyzers/complexity/counters/JavaCounter.js.map +1 -0
- package/dist/engine/analyzers/complexity/counters/KotlinCounter.d.ts +14 -0
- package/dist/engine/analyzers/complexity/counters/KotlinCounter.js +34 -0
- package/dist/engine/analyzers/complexity/counters/KotlinCounter.js.map +1 -0
- package/dist/engine/analyzers/complexity/counters/PythonCounter.d.ts +14 -0
- package/dist/engine/analyzers/complexity/counters/PythonCounter.js +36 -0
- package/dist/engine/analyzers/complexity/counters/PythonCounter.js.map +1 -0
- package/dist/engine/analyzers/complexity/counters/TypeScriptCounter.d.ts +13 -0
- package/dist/engine/analyzers/complexity/counters/TypeScriptCounter.js +33 -0
- package/dist/engine/analyzers/complexity/counters/TypeScriptCounter.js.map +1 -0
- package/dist/engine/analyzers/complexity/index.d.ts +16 -0
- package/dist/engine/analyzers/complexity/index.js +16 -0
- package/dist/engine/analyzers/complexity/index.js.map +1 -0
- package/dist/engine/analyzers/complexity/types.d.ts +53 -0
- package/dist/engine/analyzers/complexity/types.js +5 -0
- package/dist/engine/analyzers/complexity/types.js.map +1 -0
- package/dist/engine/analyzers/entry-points/EntryPointDetector.d.ts +27 -0
- package/dist/engine/analyzers/entry-points/EntryPointDetector.js +60 -0
- package/dist/engine/analyzers/entry-points/EntryPointDetector.js.map +1 -0
- package/dist/engine/analyzers/entry-points/EntryPointStore.d.ts +20 -0
- package/dist/engine/analyzers/entry-points/EntryPointStore.js +133 -0
- package/dist/engine/analyzers/entry-points/EntryPointStore.js.map +1 -0
- package/dist/engine/analyzers/entry-points/EntryPointTool.d.ts +43 -0
- package/dist/engine/analyzers/entry-points/EntryPointTool.js +55 -0
- package/dist/engine/analyzers/entry-points/EntryPointTool.js.map +1 -0
- package/dist/engine/analyzers/entry-points/FrameworkDetector.d.ts +13 -0
- package/dist/engine/analyzers/entry-points/FrameworkDetector.js +49 -0
- package/dist/engine/analyzers/entry-points/FrameworkDetector.js.map +1 -0
- package/dist/engine/analyzers/entry-points/PatternRegistry.d.ts +27 -0
- package/dist/engine/analyzers/entry-points/PatternRegistry.js +105 -0
- package/dist/engine/analyzers/entry-points/PatternRegistry.js.map +1 -0
- package/dist/engine/analyzers/entry-points/RouteResolver.d.ts +12 -0
- package/dist/engine/analyzers/entry-points/RouteResolver.js +43 -0
- package/dist/engine/analyzers/entry-points/RouteResolver.js.map +1 -0
- package/dist/engine/analyzers/entry-points/detectors/CLIDetector.d.ts +14 -0
- package/dist/engine/analyzers/entry-points/detectors/CLIDetector.js +39 -0
- package/dist/engine/analyzers/entry-points/detectors/CLIDetector.js.map +1 -0
- package/dist/engine/analyzers/entry-points/detectors/EventDetector.d.ts +16 -0
- package/dist/engine/analyzers/entry-points/detectors/EventDetector.js +67 -0
- package/dist/engine/analyzers/entry-points/detectors/EventDetector.js.map +1 -0
- package/dist/engine/analyzers/entry-points/detectors/HTTPHandlerDetector.d.ts +30 -0
- package/dist/engine/analyzers/entry-points/detectors/HTTPHandlerDetector.js +140 -0
- package/dist/engine/analyzers/entry-points/detectors/HTTPHandlerDetector.js.map +1 -0
- package/dist/engine/analyzers/entry-points/detectors/MainDetector.d.ts +17 -0
- package/dist/engine/analyzers/entry-points/detectors/MainDetector.js +51 -0
- package/dist/engine/analyzers/entry-points/detectors/MainDetector.js.map +1 -0
- package/dist/engine/analyzers/entry-points/index.d.ts +14 -0
- package/dist/engine/analyzers/entry-points/index.js +14 -0
- package/dist/engine/analyzers/entry-points/index.js.map +1 -0
- package/dist/engine/analyzers/entry-points/types.d.ts +77 -0
- package/dist/engine/analyzers/entry-points/types.js +5 -0
- package/dist/engine/analyzers/entry-points/types.js.map +1 -0
- package/dist/engine/analyzers/graph-analysis/CircularDepDetector.d.ts +16 -0
- package/dist/engine/analyzers/graph-analysis/CircularDepDetector.js +80 -0
- package/dist/engine/analyzers/graph-analysis/CircularDepDetector.js.map +1 -0
- package/dist/engine/analyzers/graph-analysis/DeadImportDetector.d.ts +15 -0
- package/dist/engine/analyzers/graph-analysis/DeadImportDetector.js +56 -0
- package/dist/engine/analyzers/graph-analysis/DeadImportDetector.js.map +1 -0
- package/dist/engine/analyzers/graph-analysis/GraphAnalysisTools.d.ts +123 -0
- package/dist/engine/analyzers/graph-analysis/GraphAnalysisTools.js +187 -0
- package/dist/engine/analyzers/graph-analysis/GraphAnalysisTools.js.map +1 -0
- package/dist/engine/analyzers/graph-analysis/HotPathAnalyzer.d.ts +17 -0
- package/dist/engine/analyzers/graph-analysis/HotPathAnalyzer.js +55 -0
- package/dist/engine/analyzers/graph-analysis/HotPathAnalyzer.js.map +1 -0
- package/dist/engine/analyzers/graph-analysis/ModuleSummarizer.d.ts +14 -0
- package/dist/engine/analyzers/graph-analysis/ModuleSummarizer.js +59 -0
- package/dist/engine/analyzers/graph-analysis/ModuleSummarizer.js.map +1 -0
- package/dist/engine/analyzers/graph-analysis/RelatedTestFinder.d.ts +16 -0
- package/dist/engine/analyzers/graph-analysis/RelatedTestFinder.js +87 -0
- package/dist/engine/analyzers/graph-analysis/RelatedTestFinder.js.map +1 -0
- package/dist/engine/analyzers/graph-analysis/index.d.ts +13 -0
- package/dist/engine/analyzers/graph-analysis/index.js +13 -0
- package/dist/engine/analyzers/graph-analysis/index.js.map +1 -0
- package/dist/engine/analyzers/graph-analysis/types.d.ts +67 -0
- package/dist/engine/analyzers/graph-analysis/types.js +5 -0
- package/dist/engine/analyzers/graph-analysis/types.js.map +1 -0
- package/dist/engine/analyzers/graph-analysis/utils/GraphLoader.d.ts +27 -0
- package/dist/engine/analyzers/graph-analysis/utils/GraphLoader.js +124 -0
- package/dist/engine/analyzers/graph-analysis/utils/GraphLoader.js.map +1 -0
- package/dist/engine/analyzers/graph-analysis/utils/TarjanSCC.d.ts +17 -0
- package/dist/engine/analyzers/graph-analysis/utils/TarjanSCC.js +59 -0
- package/dist/engine/analyzers/graph-analysis/utils/TarjanSCC.js.map +1 -0
- package/dist/engine/analyzers/graph-analysis/utils/TestFileDetector.d.ts +11 -0
- package/dist/engine/analyzers/graph-analysis/utils/TestFileDetector.js +29 -0
- package/dist/engine/analyzers/graph-analysis/utils/TestFileDetector.js.map +1 -0
- package/dist/engine/analyzers/security/cfg/BasicBlock.d.ts +19 -0
- package/dist/engine/analyzers/security/cfg/BasicBlock.js +115 -0
- package/dist/engine/analyzers/security/cfg/BasicBlock.js.map +1 -0
- package/dist/engine/analyzers/security/cfg/CFGBuilder.d.ts +22 -0
- package/dist/engine/analyzers/security/cfg/CFGBuilder.js +244 -0
- package/dist/engine/analyzers/security/cfg/CFGBuilder.js.map +1 -0
- package/dist/engine/analyzers/security/cfg/CFGEdge.d.ts +13 -0
- package/dist/engine/analyzers/security/cfg/CFGEdge.js +19 -0
- package/dist/engine/analyzers/security/cfg/CFGEdge.js.map +1 -0
- package/dist/engine/analyzers/security/cfg/ControlFlowGraph.d.ts +29 -0
- package/dist/engine/analyzers/security/cfg/ControlFlowGraph.js +87 -0
- package/dist/engine/analyzers/security/cfg/ControlFlowGraph.js.map +1 -0
- package/dist/engine/analyzers/security/dataflow/DataFlowAnalyzer.d.ts +14 -0
- package/dist/engine/analyzers/security/dataflow/DataFlowAnalyzer.js +61 -0
- package/dist/engine/analyzers/security/dataflow/DataFlowAnalyzer.js.map +1 -0
- package/dist/engine/analyzers/security/dataflow/ReachingDefinitions.d.ts +16 -0
- package/dist/engine/analyzers/security/dataflow/ReachingDefinitions.js +79 -0
- package/dist/engine/analyzers/security/dataflow/ReachingDefinitions.js.map +1 -0
- package/dist/engine/analyzers/security/idor/IDORDetector.d.ts +21 -0
- package/dist/engine/analyzers/security/idor/IDORDetector.js +124 -0
- package/dist/engine/analyzers/security/idor/IDORDetector.js.map +1 -0
- package/dist/engine/analyzers/security/injection/InjectionScanner.d.ts +28 -0
- package/dist/engine/analyzers/security/injection/InjectionScanner.js +134 -0
- package/dist/engine/analyzers/security/injection/InjectionScanner.js.map +1 -0
- package/dist/engine/analyzers/security/injection/PatternMatcher.d.ts +25 -0
- package/dist/engine/analyzers/security/injection/PatternMatcher.js +72 -0
- package/dist/engine/analyzers/security/injection/PatternMatcher.js.map +1 -0
- package/dist/engine/analyzers/security/injection/SuppressionChecker.d.ts +17 -0
- package/dist/engine/analyzers/security/injection/SuppressionChecker.js +52 -0
- package/dist/engine/analyzers/security/injection/SuppressionChecker.js.map +1 -0
- package/dist/engine/analyzers/security/injection/patterns/CommandInjectionMatcher.d.ts +9 -0
- package/dist/engine/analyzers/security/injection/patterns/CommandInjectionMatcher.js +54 -0
- package/dist/engine/analyzers/security/injection/patterns/CommandInjectionMatcher.js.map +1 -0
- package/dist/engine/analyzers/security/injection/patterns/DeserializationMatcher.d.ts +9 -0
- package/dist/engine/analyzers/security/injection/patterns/DeserializationMatcher.js +43 -0
- package/dist/engine/analyzers/security/injection/patterns/DeserializationMatcher.js.map +1 -0
- package/dist/engine/analyzers/security/injection/patterns/LDAPXMLMatcher.d.ts +9 -0
- package/dist/engine/analyzers/security/injection/patterns/LDAPXMLMatcher.js +32 -0
- package/dist/engine/analyzers/security/injection/patterns/LDAPXMLMatcher.js.map +1 -0
- package/dist/engine/analyzers/security/injection/patterns/PathTraversalMatcher.d.ts +9 -0
- package/dist/engine/analyzers/security/injection/patterns/PathTraversalMatcher.js +43 -0
- package/dist/engine/analyzers/security/injection/patterns/PathTraversalMatcher.js.map +1 -0
- package/dist/engine/analyzers/security/injection/patterns/SQLInjectionMatcher.d.ts +9 -0
- package/dist/engine/analyzers/security/injection/patterns/SQLInjectionMatcher.js +54 -0
- package/dist/engine/analyzers/security/injection/patterns/SQLInjectionMatcher.js.map +1 -0
- package/dist/engine/analyzers/security/injection/patterns/XSSMatcher.d.ts +9 -0
- package/dist/engine/analyzers/security/injection/patterns/XSSMatcher.js +54 -0
- package/dist/engine/analyzers/security/injection/patterns/XSSMatcher.js.map +1 -0
- package/dist/engine/analyzers/security/ssrf/SSRFDetector.d.ts +16 -0
- package/dist/engine/analyzers/security/ssrf/SSRFDetector.js +89 -0
- package/dist/engine/analyzers/security/ssrf/SSRFDetector.js.map +1 -0
- package/dist/engine/analyzers/security/taint/TaintAnalyzer.d.ts +24 -0
- package/dist/engine/analyzers/security/taint/TaintAnalyzer.js +202 -0
- package/dist/engine/analyzers/security/taint/TaintAnalyzer.js.map +1 -0
- package/dist/engine/analyzers/security/taint/TaintPropagator.d.ts +35 -0
- package/dist/engine/analyzers/security/taint/TaintPropagator.js +223 -0
- package/dist/engine/analyzers/security/taint/TaintPropagator.js.map +1 -0
- package/dist/engine/analyzers/security/taint/TaintRegistry.d.ts +47 -0
- package/dist/engine/analyzers/security/taint/TaintRegistry.js +109 -0
- package/dist/engine/analyzers/security/taint/TaintRegistry.js.map +1 -0
- package/dist/engine/analyzers/security/types.d.ts +291 -0
- package/dist/engine/analyzers/security/types.js +5 -0
- package/dist/engine/analyzers/security/types.js.map +1 -0
- package/dist/engine/analyzers/similarity/ClusterBuilder.d.ts +18 -0
- package/dist/engine/analyzers/similarity/ClusterBuilder.js +66 -0
- package/dist/engine/analyzers/similarity/ClusterBuilder.js.map +1 -0
- package/dist/engine/analyzers/similarity/DeadCodeDetector.d.ts +23 -0
- package/dist/engine/analyzers/similarity/DeadCodeDetector.js +180 -0
- package/dist/engine/analyzers/similarity/DeadCodeDetector.js.map +1 -0
- package/dist/engine/analyzers/similarity/DuplicateDetector.d.ts +22 -0
- package/dist/engine/analyzers/similarity/DuplicateDetector.js +163 -0
- package/dist/engine/analyzers/similarity/DuplicateDetector.js.map +1 -0
- package/dist/engine/analyzers/similarity/GitMiner.d.ts +27 -0
- package/dist/engine/analyzers/similarity/GitMiner.js +184 -0
- package/dist/engine/analyzers/similarity/GitMiner.js.map +1 -0
- package/dist/engine/analyzers/similarity/SimilarityTools.d.ts +125 -0
- package/dist/engine/analyzers/similarity/SimilarityTools.js +156 -0
- package/dist/engine/analyzers/similarity/SimilarityTools.js.map +1 -0
- package/dist/engine/analyzers/similarity/types.d.ts +67 -0
- package/dist/engine/analyzers/similarity/types.js +6 -0
- package/dist/engine/analyzers/similarity/types.js.map +1 -0
- package/dist/engine/config.d.ts +29 -0
- package/dist/engine/config.js +133 -0
- package/dist/engine/config.js.map +1 -0
- package/dist/engine/context/ai-context-service.d.ts +33 -0
- package/dist/engine/context/ai-context-service.js +277 -0
- package/dist/engine/context/ai-context-service.js.map +1 -0
- package/dist/engine/context/budget-allocator.d.ts +16 -0
- package/dist/engine/context/budget-allocator.js +52 -0
- package/dist/engine/context/budget-allocator.js.map +1 -0
- package/dist/engine/context/curated-context-service.d.ts +25 -0
- package/dist/engine/context/curated-context-service.js +217 -0
- package/dist/engine/context/curated-context-service.js.map +1 -0
- package/dist/engine/context/edit-context-service.d.ts +32 -0
- package/dist/engine/context/edit-context-service.js +232 -0
- package/dist/engine/context/edit-context-service.js.map +1 -0
- package/dist/engine/context/git-service.d.ts +12 -0
- package/dist/engine/context/git-service.js +41 -0
- package/dist/engine/context/git-service.js.map +1 -0
- package/dist/engine/context/index.d.ts +14 -0
- package/dist/engine/context/index.js +15 -0
- package/dist/engine/context/index.js.map +1 -0
- package/dist/engine/context/intent-strategies.d.ts +16 -0
- package/dist/engine/context/intent-strategies.js +62 -0
- package/dist/engine/context/intent-strategies.js.map +1 -0
- package/dist/engine/context/query-analyzer.d.ts +8 -0
- package/dist/engine/context/query-analyzer.js +40 -0
- package/dist/engine/context/query-analyzer.js.map +1 -0
- package/dist/engine/context/rrf-merger.d.ts +20 -0
- package/dist/engine/context/rrf-merger.js +46 -0
- package/dist/engine/context/rrf-merger.js.map +1 -0
- package/dist/engine/context/token-budget-manager.d.ts +38 -0
- package/dist/engine/context/token-budget-manager.js +114 -0
- package/dist/engine/context/token-budget-manager.js.map +1 -0
- package/dist/engine/context/types.d.ts +147 -0
- package/dist/engine/context/types.js +5 -0
- package/dist/engine/context/types.js.map +1 -0
- package/dist/engine/database/graph-repository.d.ts +55 -0
- package/dist/engine/database/graph-repository.js +101 -0
- package/dist/engine/database/graph-repository.js.map +1 -0
- package/dist/engine/database/incremental-updater.d.ts +29 -0
- package/dist/engine/database/incremental-updater.js +92 -0
- package/dist/engine/database/incremental-updater.js.map +1 -0
- package/dist/engine/database/index.d.ts +10 -0
- package/dist/engine/database/index.js +9 -0
- package/dist/engine/database/index.js.map +1 -0
- package/dist/engine/database/migrator.d.ts +12 -0
- package/dist/engine/database/migrator.js +132 -0
- package/dist/engine/database/migrator.js.map +1 -0
- package/dist/engine/db/database-manager.d.ts +26 -0
- package/dist/engine/db/database-manager.js +80 -0
- package/dist/engine/db/database-manager.js.map +1 -0
- package/dist/engine/db/migrations.d.ts +9 -0
- package/dist/engine/db/migrations.js +135 -0
- package/dist/engine/db/migrations.js.map +1 -0
- package/dist/engine/db/native-addon-resolver.d.ts +22 -0
- package/dist/engine/db/native-addon-resolver.js +333 -0
- package/dist/engine/db/native-addon-resolver.js.map +1 -0
- package/dist/engine/db/schema.d.ts +5 -0
- package/dist/engine/db/schema.js +122 -0
- package/dist/engine/db/schema.js.map +1 -0
- package/dist/engine/graph/__tests__/graph-services.test.d.ts +5 -0
- package/dist/engine/graph/__tests__/graph-services.test.js +407 -0
- package/dist/engine/graph/__tests__/graph-services.test.js.map +1 -0
- package/dist/engine/graph/call-graph-service.d.ts +44 -0
- package/dist/engine/graph/call-graph-service.js +153 -0
- package/dist/engine/graph/call-graph-service.js.map +1 -0
- package/dist/engine/graph/dependency-formatters.d.ts +16 -0
- package/dist/engine/graph/dependency-formatters.js +76 -0
- package/dist/engine/graph/dependency-formatters.js.map +1 -0
- package/dist/engine/graph/dependency-graph-service.d.ts +39 -0
- package/dist/engine/graph/dependency-graph-service.js +180 -0
- package/dist/engine/graph/dependency-graph-service.js.map +1 -0
- package/dist/engine/graph/file-resolver.d.ts +22 -0
- package/dist/engine/graph/file-resolver.js +92 -0
- package/dist/engine/graph/file-resolver.js.map +1 -0
- package/dist/engine/graph/impact-analysis-service.d.ts +56 -0
- package/dist/engine/graph/impact-analysis-service.js +216 -0
- package/dist/engine/graph/impact-analysis-service.js.map +1 -0
- package/dist/engine/graph/index.d.ts +12 -0
- package/dist/engine/graph/index.js +13 -0
- package/dist/engine/graph/index.js.map +1 -0
- package/dist/engine/graph/symbol-resolver.d.ts +22 -0
- package/dist/engine/graph/symbol-resolver.js +71 -0
- package/dist/engine/graph/symbol-resolver.js.map +1 -0
- package/dist/engine/graph/test-detector.d.ts +19 -0
- package/dist/engine/graph/test-detector.js +56 -0
- package/dist/engine/graph/test-detector.js.map +1 -0
- package/dist/engine/graph/traverser.d.ts +65 -0
- package/dist/engine/graph/traverser.js +171 -0
- package/dist/engine/graph/traverser.js.map +1 -0
- package/dist/engine/indexer/__tests__/tree-sitter-pipeline.test.d.ts +6 -0
- package/dist/engine/indexer/__tests__/tree-sitter-pipeline.test.js +167 -0
- package/dist/engine/indexer/__tests__/tree-sitter-pipeline.test.js.map +1 -0
- package/dist/engine/indexer/file-watcher.d.ts +22 -0
- package/dist/engine/indexer/file-watcher.js +63 -0
- package/dist/engine/indexer/file-watcher.js.map +1 -0
- package/dist/engine/indexer/indexing-engine.d.ts +66 -0
- package/dist/engine/indexer/indexing-engine.js +411 -0
- package/dist/engine/indexer/indexing-engine.js.map +1 -0
- package/dist/engine/parsers/ast-utils.d.ts +31 -0
- package/dist/engine/parsers/ast-utils.js +133 -0
- package/dist/engine/parsers/ast-utils.js.map +1 -0
- package/dist/engine/parsers/embedding/EmbeddingService.d.ts +19 -0
- package/dist/engine/parsers/embedding/EmbeddingService.js +59 -0
- package/dist/engine/parsers/embedding/EmbeddingService.js.map +1 -0
- package/dist/engine/parsers/embedding/body-extractor.d.ts +25 -0
- package/dist/engine/parsers/embedding/body-extractor.js +99 -0
- package/dist/engine/parsers/embedding/body-extractor.js.map +1 -0
- package/dist/engine/parsers/embedding/chunker.d.ts +20 -0
- package/dist/engine/parsers/embedding/chunker.js +53 -0
- package/dist/engine/parsers/embedding/chunker.js.map +1 -0
- package/dist/engine/parsers/embedding/index.d.ts +5 -0
- package/dist/engine/parsers/embedding/index.js +6 -0
- package/dist/engine/parsers/embedding/index.js.map +1 -0
- package/dist/engine/parsers/grammar-registry.d.ts +44 -0
- package/dist/engine/parsers/grammar-registry.js +131 -0
- package/dist/engine/parsers/grammar-registry.js.map +1 -0
- package/dist/engine/parsers/grammars/grammar-config-loader.d.ts +57 -0
- package/dist/engine/parsers/grammars/grammar-config-loader.js +127 -0
- package/dist/engine/parsers/grammars/grammar-config-loader.js.map +1 -0
- package/dist/engine/parsers/ignore/ignore-parser.d.ts +23 -0
- package/dist/engine/parsers/ignore/ignore-parser.js +96 -0
- package/dist/engine/parsers/ignore/ignore-parser.js.map +1 -0
- package/dist/engine/parsers/ignore/index.d.ts +1 -0
- package/dist/engine/parsers/ignore/index.js +2 -0
- package/dist/engine/parsers/ignore/index.js.map +1 -0
- package/dist/engine/parsers/index.d.ts +10 -0
- package/dist/engine/parsers/index.js +9 -0
- package/dist/engine/parsers/index.js.map +1 -0
- package/dist/engine/parsers/languages/__tests__/apex-parser.test.d.ts +6 -0
- package/dist/engine/parsers/languages/__tests__/apex-parser.test.js +225 -0
- package/dist/engine/parsers/languages/__tests__/apex-parser.test.js.map +1 -0
- package/dist/engine/parsers/languages/__tests__/go-parser.test.d.ts +5 -0
- package/dist/engine/parsers/languages/__tests__/go-parser.test.js +243 -0
- package/dist/engine/parsers/languages/__tests__/go-parser.test.js.map +1 -0
- package/dist/engine/parsers/languages/__tests__/java-parser.test.d.ts +5 -0
- package/dist/engine/parsers/languages/__tests__/java-parser.test.js +257 -0
- package/dist/engine/parsers/languages/__tests__/java-parser.test.js.map +1 -0
- package/dist/engine/parsers/languages/__tests__/python-parser.test.d.ts +5 -0
- package/dist/engine/parsers/languages/__tests__/python-parser.test.js +224 -0
- package/dist/engine/parsers/languages/__tests__/python-parser.test.js.map +1 -0
- package/dist/engine/parsers/languages/__tests__/rust-parser.test.d.ts +5 -0
- package/dist/engine/parsers/languages/__tests__/rust-parser.test.js +329 -0
- package/dist/engine/parsers/languages/__tests__/rust-parser.test.js.map +1 -0
- package/dist/engine/parsers/languages/__tests__/salesforce-meta-parser.test.d.ts +6 -0
- package/dist/engine/parsers/languages/__tests__/salesforce-meta-parser.test.js +174 -0
- package/dist/engine/parsers/languages/__tests__/salesforce-meta-parser.test.js.map +1 -0
- package/dist/engine/parsers/languages/apex-parser.d.ts +36 -0
- package/dist/engine/parsers/languages/apex-parser.js +550 -0
- package/dist/engine/parsers/languages/apex-parser.js.map +1 -0
- package/dist/engine/parsers/languages/go-parser.d.ts +31 -0
- package/dist/engine/parsers/languages/go-parser.js +347 -0
- package/dist/engine/parsers/languages/go-parser.js.map +1 -0
- package/dist/engine/parsers/languages/java-parser.d.ts +32 -0
- package/dist/engine/parsers/languages/java-parser.js +538 -0
- package/dist/engine/parsers/languages/java-parser.js.map +1 -0
- package/dist/engine/parsers/languages/kotlin-parser.d.ts +37 -0
- package/dist/engine/parsers/languages/kotlin-parser.js +509 -0
- package/dist/engine/parsers/languages/kotlin-parser.js.map +1 -0
- package/dist/engine/parsers/languages/python-parser.d.ts +28 -0
- package/dist/engine/parsers/languages/python-parser.js +436 -0
- package/dist/engine/parsers/languages/python-parser.js.map +1 -0
- package/dist/engine/parsers/languages/rust-parser.d.ts +34 -0
- package/dist/engine/parsers/languages/rust-parser.js +535 -0
- package/dist/engine/parsers/languages/rust-parser.js.map +1 -0
- package/dist/engine/parsers/languages/salesforce-meta-parser.d.ts +27 -0
- package/dist/engine/parsers/languages/salesforce-meta-parser.js +352 -0
- package/dist/engine/parsers/languages/salesforce-meta-parser.js.map +1 -0
- package/dist/engine/parsers/languages/ts-call-extractor.d.ts +13 -0
- package/dist/engine/parsers/languages/ts-call-extractor.js +136 -0
- package/dist/engine/parsers/languages/ts-call-extractor.js.map +1 -0
- package/dist/engine/parsers/languages/ts-import-extractor.d.ts +10 -0
- package/dist/engine/parsers/languages/ts-import-extractor.js +112 -0
- package/dist/engine/parsers/languages/ts-import-extractor.js.map +1 -0
- package/dist/engine/parsers/languages/ts-inheritance-extractor.d.ts +9 -0
- package/dist/engine/parsers/languages/ts-inheritance-extractor.js +47 -0
- package/dist/engine/parsers/languages/ts-inheritance-extractor.js.map +1 -0
- package/dist/engine/parsers/languages/ts-symbol-extractor.d.ts +18 -0
- package/dist/engine/parsers/languages/ts-symbol-extractor.js +262 -0
- package/dist/engine/parsers/languages/ts-symbol-extractor.js.map +1 -0
- package/dist/engine/parsers/languages/ts-utils.d.ts +24 -0
- package/dist/engine/parsers/languages/ts-utils.js +77 -0
- package/dist/engine/parsers/languages/ts-utils.js.map +1 -0
- package/dist/engine/parsers/languages/typescript-parser.d.ts +17 -0
- package/dist/engine/parsers/languages/typescript-parser.js +60 -0
- package/dist/engine/parsers/languages/typescript-parser.js.map +1 -0
- package/dist/engine/parsers/tree-sitter-indexer.d.ts +28 -0
- package/dist/engine/parsers/tree-sitter-indexer.js +212 -0
- package/dist/engine/parsers/tree-sitter-indexer.js.map +1 -0
- package/dist/engine/parsers/types.d.ts +59 -0
- package/dist/engine/parsers/types.js +6 -0
- package/dist/engine/parsers/types.js.map +1 -0
- package/dist/engine/query/query-layer.d.ts +63 -0
- package/dist/engine/query/query-layer.js +112 -0
- package/dist/engine/query/query-layer.js.map +1 -0
- package/dist/engine/scanner/file-scanner.d.ts +20 -0
- package/dist/engine/scanner/file-scanner.js +151 -0
- package/dist/engine/scanner/file-scanner.js.map +1 -0
- package/dist/engine/scanner/pattern-detector.d.ts +16 -0
- package/dist/engine/scanner/pattern-detector.js +90 -0
- package/dist/engine/scanner/pattern-detector.js.map +1 -0
- package/dist/engine/scanner/signature-extractor.d.ts +17 -0
- package/dist/engine/scanner/signature-extractor.js +148 -0
- package/dist/engine/scanner/signature-extractor.js.map +1 -0
- package/dist/engine/tools/ai-context-tools.d.ts +138 -0
- package/dist/engine/tools/ai-context-tools.js +136 -0
- package/dist/engine/tools/ai-context-tools.js.map +1 -0
- package/dist/engine/tools/call-graph-tools.d.ts +67 -0
- package/dist/engine/tools/call-graph-tools.js +95 -0
- package/dist/engine/tools/call-graph-tools.js.map +1 -0
- package/dist/engine/tools/code-context.d.ts +7 -0
- package/dist/engine/tools/code-context.js +48 -0
- package/dist/engine/tools/code-context.js.map +1 -0
- package/dist/engine/tools/code-index-status.d.ts +8 -0
- package/dist/engine/tools/code-index-status.js +63 -0
- package/dist/engine/tools/code-index-status.js.map +1 -0
- package/dist/engine/tools/code-kb-export.d.ts +7 -0
- package/dist/engine/tools/code-kb-export.js +67 -0
- package/dist/engine/tools/code-kb-export.js.map +1 -0
- package/dist/engine/tools/code-modules.d.ts +6 -0
- package/dist/engine/tools/code-modules.js +52 -0
- package/dist/engine/tools/code-modules.js.map +1 -0
- package/dist/engine/tools/code-search.d.ts +6 -0
- package/dist/engine/tools/code-search.js +31 -0
- package/dist/engine/tools/code-search.js.map +1 -0
- package/dist/engine/tools/code-symbols.d.ts +6 -0
- package/dist/engine/tools/code-symbols.js +48 -0
- package/dist/engine/tools/code-symbols.js.map +1 -0
- package/dist/engine/tools/code-traverse.d.ts +54 -0
- package/dist/engine/tools/code-traverse.js +66 -0
- package/dist/engine/tools/code-traverse.js.map +1 -0
- package/dist/engine/tools/dependency-tools.d.ts +41 -0
- package/dist/engine/tools/dependency-tools.js +46 -0
- package/dist/engine/tools/dependency-tools.js.map +1 -0
- package/dist/engine/tools/drawio-export-png.d.ts +44 -0
- package/dist/engine/tools/drawio-export-png.js +214 -0
- package/dist/engine/tools/drawio-export-png.js.map +1 -0
- package/dist/engine/tools/drawio-layout.d.ts +6 -0
- package/dist/engine/tools/drawio-layout.js +179 -0
- package/dist/engine/tools/drawio-layout.js.map +1 -0
- package/dist/engine/tools/drawio-parser.d.ts +30 -0
- package/dist/engine/tools/drawio-parser.js +92 -0
- package/dist/engine/tools/drawio-parser.js.map +1 -0
- package/dist/engine/tools/drawio-router.d.ts +10 -0
- package/dist/engine/tools/drawio-router.js +112 -0
- package/dist/engine/tools/drawio-router.js.map +1 -0
- package/dist/engine/tools/drawio-tool.d.ts +39 -0
- package/dist/engine/tools/drawio-tool.js +174 -0
- package/dist/engine/tools/drawio-tool.js.map +1 -0
- package/dist/engine/tools/drawio-writer.d.ts +6 -0
- package/dist/engine/tools/drawio-writer.js +120 -0
- package/dist/engine/tools/drawio-writer.js.map +1 -0
- package/dist/engine/tools/impact-tools.d.ts +37 -0
- package/dist/engine/tools/impact-tools.js +85 -0
- package/dist/engine/tools/impact-tools.js.map +1 -0
- package/dist/engine/tools/register-tools.d.ts +862 -0
- package/dist/engine/tools/register-tools.js +226 -0
- package/dist/engine/tools/register-tools.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +15 -0
- package/dist/logger.js +23 -0
- package/dist/logger.js.map +1 -0
- package/dist/modules/ModuleRegistry.d.ts +23 -0
- package/dist/modules/ModuleRegistry.js +86 -0
- package/dist/modules/ModuleRegistry.js.map +1 -0
- package/dist/modules/analytics/AnalyticsModule.d.ts +17 -0
- package/dist/modules/analytics/AnalyticsModule.js +36 -0
- package/dist/modules/analytics/AnalyticsModule.js.map +1 -0
- package/dist/modules/code-intel/CodeIntelModule.d.ts +23 -0
- package/dist/modules/code-intel/CodeIntelModule.js +73 -0
- package/dist/modules/code-intel/CodeIntelModule.js.map +1 -0
- package/dist/modules/kb-graph/KBGraphModule.d.ts +18 -0
- package/dist/modules/kb-graph/KBGraphModule.js +49 -0
- package/dist/modules/kb-graph/KBGraphModule.js.map +1 -0
- package/dist/modules/kb-graph/SqliteGraphService.d.ts +95 -0
- package/dist/modules/kb-graph/SqliteGraphService.js +417 -0
- package/dist/modules/kb-graph/SqliteGraphService.js.map +1 -0
- package/dist/modules/memory/MemoryDb.d.ts +9 -0
- package/dist/modules/memory/MemoryDb.js +51 -0
- package/dist/modules/memory/MemoryDb.js.map +1 -0
- package/dist/modules/memory/MemoryEngine.d.ts +43 -0
- package/dist/modules/memory/MemoryEngine.js +185 -0
- package/dist/modules/memory/MemoryEngine.js.map +1 -0
- package/dist/modules/memory/MemoryEngineFull.d.ts +0 -0
- package/dist/modules/memory/MemoryEngineFull.js +2 -0
- package/dist/modules/memory/MemoryEngineFull.js.map +1 -0
- package/dist/modules/memory/MemoryModule.d.ts +26 -0
- package/dist/modules/memory/MemoryModule.js +146 -0
- package/dist/modules/memory/MemoryModule.js.map +1 -0
- package/dist/modules/memory/MemoryToolDefinitions.d.ts +2400 -0
- package/dist/modules/memory/MemoryToolDefinitions.js +294 -0
- package/dist/modules/memory/MemoryToolDefinitions.js.map +1 -0
- package/dist/modules/memory/MemoryToolDispatcher.d.ts +50 -0
- package/dist/modules/memory/MemoryToolDispatcher.js +523 -0
- package/dist/modules/memory/MemoryToolDispatcher.js.map +1 -0
- package/dist/modules/memory/ScopePromotionService.d.ts +86 -0
- package/dist/modules/memory/ScopePromotionService.js +263 -0
- package/dist/modules/memory/ScopePromotionService.js.map +1 -0
- package/dist/modules/memory/__tests__/MemoryToolDispatcher.test.d.ts +1 -0
- package/dist/modules/memory/__tests__/MemoryToolDispatcher.test.js +72 -0
- package/dist/modules/memory/__tests__/MemoryToolDispatcher.test.js.map +1 -0
- package/dist/modules/memory/__tests__/ScopePromotionService.test.d.ts +1 -0
- package/dist/modules/memory/__tests__/ScopePromotionService.test.js +142 -0
- package/dist/modules/memory/__tests__/ScopePromotionService.test.js.map +1 -0
- package/dist/modules/memory/llm/LLMService.d.ts +17 -0
- package/dist/modules/memory/llm/LLMService.js +64 -0
- package/dist/modules/memory/llm/LLMService.js.map +1 -0
- package/dist/modules/memory/llm/TagAnalyzerService.d.ts +37 -0
- package/dist/modules/memory/llm/TagAnalyzerService.js +198 -0
- package/dist/modules/memory/llm/TagAnalyzerService.js.map +1 -0
- package/dist/modules/memory/llm/index.d.ts +2 -0
- package/dist/modules/memory/llm/index.js +2 -0
- package/dist/modules/memory/llm/index.js.map +1 -0
- package/dist/modules/memory/llm/ollama-adapter.d.ts +9 -0
- package/dist/modules/memory/llm/ollama-adapter.js +55 -0
- package/dist/modules/memory/llm/ollama-adapter.js.map +1 -0
- package/dist/modules/memory/llm/openai-adapter.d.ts +8 -0
- package/dist/modules/memory/llm/openai-adapter.js +43 -0
- package/dist/modules/memory/llm/openai-adapter.js.map +1 -0
- package/dist/modules/memory/llm/types.d.ts +26 -0
- package/dist/modules/memory/llm/types.js +5 -0
- package/dist/modules/memory/llm/types.js.map +1 -0
- package/dist/modules/memory/masking/MaskingMiddleware.d.ts +23 -0
- package/dist/modules/memory/masking/MaskingMiddleware.js +118 -0
- package/dist/modules/memory/masking/MaskingMiddleware.js.map +1 -0
- package/dist/modules/memory/masking/__tests__/CredentialDetector.test.d.ts +1 -0
- package/dist/modules/memory/masking/__tests__/CredentialDetector.test.js +41 -0
- package/dist/modules/memory/masking/__tests__/CredentialDetector.test.js.map +1 -0
- package/dist/modules/memory/masking/__tests__/MaskingMiddleware.test.d.ts +1 -0
- package/dist/modules/memory/masking/__tests__/MaskingMiddleware.test.js +65 -0
- package/dist/modules/memory/masking/__tests__/MaskingMiddleware.test.js.map +1 -0
- package/dist/modules/memory/masking/__tests__/PiiDetector.test.d.ts +1 -0
- package/dist/modules/memory/masking/__tests__/PiiDetector.test.js +52 -0
- package/dist/modules/memory/masking/__tests__/PiiDetector.test.js.map +1 -0
- package/dist/modules/memory/masking/detectors/CredentialDetector.d.ts +13 -0
- package/dist/modules/memory/masking/detectors/CredentialDetector.js +50 -0
- package/dist/modules/memory/masking/detectors/CredentialDetector.js.map +1 -0
- package/dist/modules/memory/masking/detectors/DetectorStrategy.d.ts +9 -0
- package/dist/modules/memory/masking/detectors/DetectorStrategy.js +2 -0
- package/dist/modules/memory/masking/detectors/DetectorStrategy.js.map +1 -0
- package/dist/modules/memory/masking/detectors/PiiDetector.d.ts +13 -0
- package/dist/modules/memory/masking/detectors/PiiDetector.js +50 -0
- package/dist/modules/memory/masking/detectors/PiiDetector.js.map +1 -0
- package/dist/modules/memory/masking/index.d.ts +8 -0
- package/dist/modules/memory/masking/index.js +9 -0
- package/dist/modules/memory/masking/index.js.map +1 -0
- package/dist/modules/memory/masking/maskers/ContentMasker.d.ts +22 -0
- package/dist/modules/memory/masking/maskers/ContentMasker.js +89 -0
- package/dist/modules/memory/masking/maskers/ContentMasker.js.map +1 -0
- package/dist/modules/memory/masking/models/MaskingTypes.d.ts +73 -0
- package/dist/modules/memory/masking/models/MaskingTypes.js +5 -0
- package/dist/modules/memory/masking/models/MaskingTypes.js.map +1 -0
- package/dist/modules/memory/masking/services/AllowlistService.d.ts +11 -0
- package/dist/modules/memory/masking/services/AllowlistService.js +34 -0
- package/dist/modules/memory/masking/services/AllowlistService.js.map +1 -0
- package/dist/modules/memory/masking/services/AuditService.d.ts +14 -0
- package/dist/modules/memory/masking/services/AuditService.js +39 -0
- package/dist/modules/memory/masking/services/AuditService.js.map +1 -0
- package/dist/modules/memory/masking/services/ConfigCacheService.d.ts +19 -0
- package/dist/modules/memory/masking/services/ConfigCacheService.js +36 -0
- package/dist/modules/memory/masking/services/ConfigCacheService.js.map +1 -0
- package/dist/modules/memory/migrations/001-add-scope-columns.d.ts +9 -0
- package/dist/modules/memory/migrations/001-add-scope-columns.js +16 -0
- package/dist/modules/memory/migrations/001-add-scope-columns.js.map +1 -0
- package/dist/modules/memory/models.d.ts +95 -0
- package/dist/modules/memory/models.js +5 -0
- package/dist/modules/memory/models.js.map +1 -0
- package/dist/modules/memory/schema.d.ts +5 -0
- package/dist/modules/memory/schema.js +269 -0
- package/dist/modules/memory/schema.js.map +1 -0
- package/dist/modules/memory/tool-definitions.d.ts +5 -0
- package/dist/modules/memory/tool-definitions.js +26 -0
- package/dist/modules/memory/tool-definitions.js.map +1 -0
- package/dist/modules/orchestration/McpClientManager.d.ts +18 -0
- package/dist/modules/orchestration/McpClientManager.js +196 -0
- package/dist/modules/orchestration/McpClientManager.js.map +1 -0
- package/dist/modules/orchestration/McpConfigRoutes.d.ts +9 -0
- package/dist/modules/orchestration/McpConfigRoutes.js +123 -0
- package/dist/modules/orchestration/McpConfigRoutes.js.map +1 -0
- package/dist/modules/orchestration/McpConfigService.d.ts +50 -0
- package/dist/modules/orchestration/McpConfigService.js +115 -0
- package/dist/modules/orchestration/McpConfigService.js.map +1 -0
- package/dist/modules/orchestration/OrchestrationModule.d.ts +23 -0
- package/dist/modules/orchestration/OrchestrationModule.js +140 -0
- package/dist/modules/orchestration/OrchestrationModule.js.map +1 -0
- package/dist/modules/utility/UtilityModule.d.ts +18 -0
- package/dist/modules/utility/UtilityModule.js +50 -0
- package/dist/modules/utility/UtilityModule.js.map +1 -0
- package/dist/modules/web/WebModule.d.ts +25 -0
- package/dist/modules/web/WebModule.js +70 -0
- package/dist/modules/web/WebModule.js.map +1 -0
- package/dist/modules/web/handlers/ApiCallHandler.d.ts +16 -0
- package/dist/modules/web/handlers/ApiCallHandler.js +54 -0
- package/dist/modules/web/handlers/ApiCallHandler.js.map +1 -0
- package/dist/modules/web/handlers/DownloadFileHandler.d.ts +18 -0
- package/dist/modules/web/handlers/DownloadFileHandler.js +73 -0
- package/dist/modules/web/handlers/DownloadFileHandler.js.map +1 -0
- package/dist/modules/web/handlers/FetchUrlHandler.d.ts +21 -0
- package/dist/modules/web/handlers/FetchUrlHandler.js +87 -0
- package/dist/modules/web/handlers/FetchUrlHandler.js.map +1 -0
- package/dist/modules/web/handlers/GitBrowseHandler.d.ts +16 -0
- package/dist/modules/web/handlers/GitBrowseHandler.js +73 -0
- package/dist/modules/web/handlers/GitBrowseHandler.js.map +1 -0
- package/dist/modules/web/handlers/ReadWebpageHandler.d.ts +20 -0
- package/dist/modules/web/handlers/ReadWebpageHandler.js +70 -0
- package/dist/modules/web/handlers/ReadWebpageHandler.js.map +1 -0
- package/dist/modules/web/handlers/WebSearchHandler.d.ts +15 -0
- package/dist/modules/web/handlers/WebSearchHandler.js +50 -0
- package/dist/modules/web/handlers/WebSearchHandler.js.map +1 -0
- package/dist/modules/web/middleware/ContentTruncator.d.ts +14 -0
- package/dist/modules/web/middleware/ContentTruncator.js +23 -0
- package/dist/modules/web/middleware/ContentTruncator.js.map +1 -0
- package/dist/modules/web/middleware/RateLimiter.d.ts +19 -0
- package/dist/modules/web/middleware/RateLimiter.js +49 -0
- package/dist/modules/web/middleware/RateLimiter.js.map +1 -0
- package/dist/modules/web/middleware/SsrfGuard.d.ts +18 -0
- package/dist/modules/web/middleware/SsrfGuard.js +89 -0
- package/dist/modules/web/middleware/SsrfGuard.js.map +1 -0
- package/dist/modules/web/models/WebError.d.ts +10 -0
- package/dist/modules/web/models/WebError.js +15 -0
- package/dist/modules/web/models/WebError.js.map +1 -0
- package/dist/modules/web/models/WebModuleConfig.d.ts +17 -0
- package/dist/modules/web/models/WebModuleConfig.js +22 -0
- package/dist/modules/web/models/WebModuleConfig.js.map +1 -0
- package/dist/modules/web/models/WebToolResult.d.ts +7 -0
- package/dist/modules/web/models/WebToolResult.js +19 -0
- package/dist/modules/web/models/WebToolResult.js.map +1 -0
- package/dist/modules/web/utils/GitUrlParser.d.ts +12 -0
- package/dist/modules/web/utils/GitUrlParser.js +32 -0
- package/dist/modules/web/utils/GitUrlParser.js.map +1 -0
- package/dist/modules/web/utils/HtmlExtractor.d.ts +9 -0
- package/dist/modules/web/utils/HtmlExtractor.js +46 -0
- package/dist/modules/web/utils/HtmlExtractor.js.map +1 -0
- package/dist/modules/web/utils/UrlValidator.d.ts +5 -0
- package/dist/modules/web/utils/UrlValidator.js +23 -0
- package/dist/modules/web/utils/UrlValidator.js.map +1 -0
- package/dist/server/HttpServer.d.ts +30 -0
- package/dist/server/HttpServer.js +108 -0
- package/dist/server/HttpServer.js.map +1 -0
- package/dist/server/mcpServer.d.ts +6 -0
- package/dist/server/mcpServer.js +83 -0
- package/dist/server/mcpServer.js.map +1 -0
- package/dist/server/middleware/error-handler.d.ts +7 -0
- package/dist/server/middleware/error-handler.js +16 -0
- package/dist/server/middleware/error-handler.js.map +1 -0
- package/dist/server/middleware/localhost-only.d.ts +6 -0
- package/dist/server/middleware/localhost-only.js +15 -0
- package/dist/server/middleware/localhost-only.js.map +1 -0
- package/dist/server/middleware/rate-limiter.d.ts +11 -0
- package/dist/server/middleware/rate-limiter.js +44 -0
- package/dist/server/middleware/rate-limiter.js.map +1 -0
- package/dist/server/middleware/request-logger.d.ts +7 -0
- package/dist/server/middleware/request-logger.js +21 -0
- package/dist/server/middleware/request-logger.js.map +1 -0
- package/dist/server/routes/__tests__/admin.test.d.ts +8 -0
- package/dist/server/routes/__tests__/admin.test.js +607 -0
- package/dist/server/routes/__tests__/admin.test.js.map +1 -0
- package/dist/server/routes/admin.d.ts +8 -0
- package/dist/server/routes/admin.js +2314 -0
- package/dist/server/routes/admin.js.map +1 -0
- package/dist/server/routes/api.d.ts +9 -0
- package/dist/server/routes/api.js +181 -0
- package/dist/server/routes/api.js.map +1 -0
- package/dist/server/routes/health.d.ts +8 -0
- package/dist/server/routes/health.js +26 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/tools.d.ts +8 -0
- package/dist/server/routes/tools.js +50 -0
- package/dist/server/routes/tools.js.map +1 -0
- package/dist/shared/protocol.d.ts +194 -0
- package/dist/shared/protocol.js +8 -0
- package/dist/shared/protocol.js.map +1 -0
- package/dist/tool-router/ToolDefinitions.d.ts +11 -0
- package/dist/tool-router/ToolDefinitions.js +15 -0
- package/dist/tool-router/ToolDefinitions.js.map +1 -0
- package/dist/tool-router/ToolRouter.d.ts +17 -0
- package/dist/tool-router/ToolRouter.js +53 -0
- package/dist/tool-router/ToolRouter.js.map +1 -0
- package/dist/tool-router/ToolValidator.d.ts +12 -0
- package/dist/tool-router/ToolValidator.js +48 -0
- package/dist/tool-router/ToolValidator.js.map +1 -0
- package/dist/types/module.d.ts +19 -0
- package/dist/types/module.js +6 -0
- package/dist/types/module.js.map +1 -0
- package/dist/types/tool.d.ts +32 -0
- package/dist/types/tool.js +6 -0
- package/dist/types/tool.js.map +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/vitest.config.d.ts +2 -0
- package/dist/vitest.config.js +9 -0
- package/dist/vitest.config.js.map +1 -0
- package/dist/vitest.ksa252.config.d.ts +2 -0
- package/dist/vitest.ksa252.config.js +10 -0
- package/dist/vitest.ksa252.config.js.map +1 -0
- package/extension/build-platform-swap.mjs +16 -0
- package/extension/esbuild.js +36 -0
- package/extension/resources/webview-assets/chat/chat.js +1907 -0
- package/extension/resources/webview-assets/chat/graph-viz.js +144 -0
- package/extension/resources/webview-assets/chat/markdown-renderer.js +254 -0
- package/extension/resources/webview-assets/settings/settings.js +575 -0
- package/extension/scripts/capture-screenshots.py +45 -0
- package/extension/scripts/copy-resources.js +75 -0
- package/extension/scripts/gen-checksums.js +68 -0
- package/extension/scripts/update-onnx-manifest.js +119 -0
- package/extension/src/__tests__/converter.test.ts +286 -0
- package/extension/src/__tests__/indexer.test.ts +204 -0
- package/extension/src/addon-download-helpers.ts +135 -0
- package/extension/src/ai-context-commands.ts +97 -0
- package/extension/src/anthropic/__tests__/converter.test.ts +201 -0
- package/extension/src/anthropic/__tests__/handlers.test.ts +255 -0
- package/extension/src/anthropic/converter.ts +95 -0
- package/extension/src/anthropic/handlers.ts +106 -0
- package/extension/src/anthropic/types.ts +124 -0
- package/extension/src/auth/AuthManager.ts +200 -0
- package/extension/src/auth/PkceService.ts +32 -0
- package/extension/src/auth/TokenRefreshTimer.ts +38 -0
- package/extension/src/backend-local-tools.ts +44 -0
- package/extension/src/chat-panel/ChatContextPicker.ts +191 -0
- package/extension/src/chat-panel/ChatHtmlBuilder.ts +67 -0
- package/extension/src/chat-panel/ChatModelManager.ts +49 -0
- package/extension/src/chat-panel/ChatStateManager.ts +129 -0
- package/extension/src/chat-panel/ChatStatusManager.ts +49 -0
- package/extension/src/chat-panel/__tests__/chat-models.test.ts +134 -0
- package/extension/src/chat-panel/__tests__/context-usage-tracker.test.ts +170 -0
- package/extension/src/chat-panel/__tests__/conversation-manager.test.ts +152 -0
- package/extension/src/chat-panel/__tests__/token-counter.test.ts +93 -0
- package/extension/src/chat-panel/chat-models.ts +167 -0
- package/extension/src/chat-panel/chat-panel-provider.ts +221 -0
- package/extension/src/chat-panel/context-usage-tracker.ts +144 -0
- package/extension/src/chat-panel/conversation-manager.ts +180 -0
- package/extension/src/chat-panel/conversation-types.ts +47 -0
- package/extension/src/chat-panel/message-handler.ts +116 -0
- package/extension/src/chat-panel/message-protocol.ts +107 -0
- package/extension/src/chat-panel/message-routing.ts +111 -0
- package/extension/src/chat-panel/token-counter.ts +103 -0
- package/extension/src/checksum.ts +197 -0
- package/extension/src/commands/CommandRegistrar.ts +177 -0
- package/extension/src/commands/LlmCommands.ts +111 -0
- package/extension/src/config-watcher.ts +171 -0
- package/extension/src/config.ts +106 -0
- package/extension/src/connection/ConnectionManager.ts +128 -0
- package/extension/src/connection/HealthChecker.ts +45 -0
- package/extension/src/converter/FileConverterService.ts +62 -0
- package/extension/src/converter/IFileConverter.ts +15 -0
- package/extension/src/converter/LocalFallbackConverter.ts +89 -0
- package/extension/src/converter/RemoteConverter.ts +86 -0
- package/extension/src/converter/TextConverter.ts +41 -0
- package/extension/src/converter/index.ts +31 -0
- package/extension/src/converter-helpers.ts +125 -0
- package/extension/src/converter.ts +17 -0
- package/extension/src/debug-logger.ts +23 -0
- package/extension/src/diagnostics-provider.ts +150 -0
- package/extension/src/extension.ts +187 -0
- package/extension/src/file-utils.ts +64 -0
- package/extension/src/history/conversation.ts +91 -0
- package/extension/src/indexer-discovery.ts +95 -0
- package/extension/src/indexer-http.ts +106 -0
- package/extension/src/indexer.ts +91 -0
- package/extension/src/injector-helpers.ts +72 -0
- package/extension/src/injector.ts +86 -0
- package/extension/src/kb-event-bus.ts +125 -0
- package/extension/src/langgraph/__tests__/anthropic-provider-content-guard.test.ts +95 -0
- package/extension/src/langgraph/__tests__/base-node-retry.test.ts +277 -0
- package/extension/src/langgraph/__tests__/chat-graph-agent-step.test.ts +99 -0
- package/extension/src/langgraph/__tests__/chat-graph-loop.test.ts +155 -0
- package/extension/src/langgraph/__tests__/chat-panel-e2e.test.ts +616 -0
- package/extension/src/langgraph/__tests__/edges-self-correction.test.ts +148 -0
- package/extension/src/langgraph/__tests__/hook-commands.test.ts +203 -0
- package/extension/src/langgraph/__tests__/hook-events.test.ts +273 -0
- package/extension/src/langgraph/__tests__/hook-executor.test.ts +257 -0
- package/extension/src/langgraph/__tests__/hook-loader.test.ts +204 -0
- package/extension/src/langgraph/__tests__/stream-handler-events.test.ts +158 -0
- package/extension/src/langgraph/__tests__/verify-node.test.ts +275 -0
- package/extension/src/langgraph/checkpointer-helpers.ts +78 -0
- package/extension/src/langgraph/checkpointer.ts +83 -0
- package/extension/src/langgraph/config/alternate-strategies.ts +49 -0
- package/extension/src/langgraph/config/verify-criteria.ts +87 -0
- package/extension/src/langgraph/context-budget.ts +194 -0
- package/extension/src/langgraph/edges-feedback.ts +63 -0
- package/extension/src/langgraph/edges.ts +137 -0
- package/extension/src/langgraph/engine-chat-handler.ts +66 -0
- package/extension/src/langgraph/errors/non-recoverable-error.ts +13 -0
- package/extension/src/langgraph/graph-builder.ts +36 -0
- package/extension/src/langgraph/graphs/GraphFactory.ts +85 -0
- package/extension/src/langgraph/graphs/chat-graph-nodes.ts +285 -0
- package/extension/src/langgraph/graphs/chat-graph.ts +177 -0
- package/extension/src/langgraph/graphs/code-review-graph.ts +112 -0
- package/extension/src/langgraph/graphs/docs-graph.ts +89 -0
- package/extension/src/langgraph/graphs/hotfix-graph.ts +106 -0
- package/extension/src/langgraph/graphs/rag-grader-nodes.ts +237 -0
- package/extension/src/langgraph/graphs/rag-grader-prompts.ts +54 -0
- package/extension/src/langgraph/graphs/sdlc-graph.ts +132 -0
- package/extension/src/langgraph/graphs/sdlc-node-factory.ts +72 -0
- package/extension/src/langgraph/graphs/security-audit-graph.ts +98 -0
- package/extension/src/langgraph/graphs/verify-node.ts +161 -0
- package/extension/src/langgraph/graphs/verify-prompt.ts +45 -0
- package/extension/src/langgraph/hook-commands.ts +84 -0
- package/extension/src/langgraph/hook-emitter.ts +37 -0
- package/extension/src/langgraph/hook-engine.ts +171 -0
- package/extension/src/langgraph/hook-events.ts +195 -0
- package/extension/src/langgraph/hook-executor.ts +192 -0
- package/extension/src/langgraph/hook-filters.ts +94 -0
- package/extension/src/langgraph/hook-loader.ts +86 -0
- package/extension/src/langgraph/hook-tool-matcher.ts +64 -0
- package/extension/src/langgraph/index.ts +69 -0
- package/extension/src/langgraph/langgraph-engine.ts +190 -0
- package/extension/src/langgraph/llm-provider.ts +83 -0
- package/extension/src/langgraph/mcp-bridge.ts +118 -0
- package/extension/src/langgraph/nodes/agent-prompt-loader.ts +84 -0
- package/extension/src/langgraph/nodes/approval-node.ts +165 -0
- package/extension/src/langgraph/nodes/ba-node.ts +58 -0
- package/extension/src/langgraph/nodes/ba-prompts.ts +40 -0
- package/extension/src/langgraph/nodes/base-node.ts +198 -0
- package/extension/src/langgraph/nodes/dev-node.ts +77 -0
- package/extension/src/langgraph/nodes/dev-prompts.ts +23 -0
- package/extension/src/langgraph/nodes/devops-node.ts +180 -0
- package/extension/src/langgraph/nodes/feedback-node.ts +68 -0
- package/extension/src/langgraph/nodes/hook-helpers.ts +122 -0
- package/extension/src/langgraph/nodes/jira-helpers.ts +86 -0
- package/extension/src/langgraph/nodes/qa-node.ts +82 -0
- package/extension/src/langgraph/nodes/qa-prompts.ts +35 -0
- package/extension/src/langgraph/nodes/sa-node.ts +152 -0
- package/extension/src/langgraph/nodes/security-node.ts +94 -0
- package/extension/src/langgraph/nodes/sm-node.ts +35 -0
- package/extension/src/langgraph/nodes/ta-node.ts +113 -0
- package/extension/src/langgraph/nodes/ui-node.ts +93 -0
- package/extension/src/langgraph/nodes/verify-node.ts +158 -0
- package/extension/src/langgraph/nodes/workspace-file-ops.ts +155 -0
- package/extension/src/langgraph/providers/BaseLlmProvider.ts +113 -0
- package/extension/src/langgraph/providers/anthropic-adapter.ts +165 -0
- package/extension/src/langgraph/providers/anthropic-helpers.ts +26 -0
- package/extension/src/langgraph/providers/anthropic-provider.ts +142 -0
- package/extension/src/langgraph/providers/index.ts +114 -0
- package/extension/src/langgraph/providers/kiro-client.ts +151 -0
- package/extension/src/langgraph/providers/kiro-http-helpers.ts +93 -0
- package/extension/src/langgraph/providers/model-parser.ts +33 -0
- package/extension/src/langgraph/providers/model-registry.ts +98 -0
- package/extension/src/langgraph/providers/ollama-provider.ts +114 -0
- package/extension/src/langgraph/providers/ollama-tools.ts +52 -0
- package/extension/src/langgraph/providers/onnx-provider.ts +151 -0
- package/extension/src/langgraph/providers/onnx-tokenizer.ts +47 -0
- package/extension/src/langgraph/providers/openai-helpers.ts +38 -0
- package/extension/src/langgraph/providers/openai-provider.ts +168 -0
- package/extension/src/langgraph/providers/stream-handler.ts +187 -0
- package/extension/src/langgraph/providers/token-manager.ts +180 -0
- package/extension/src/langgraph/providers/token-refresh.ts +94 -0
- package/extension/src/langgraph/router/intent-classifier.ts +131 -0
- package/extension/src/langgraph/router/router-graph.ts +187 -0
- package/extension/src/langgraph/router/router-state.ts +19 -0
- package/extension/src/langgraph/state-types.ts +21 -0
- package/extension/src/langgraph/state.ts +61 -0
- package/extension/src/langgraph/steering-loader.ts +192 -0
- package/extension/src/langgraph/stream-handler.ts +185 -0
- package/extension/src/langgraph/tool-registry.ts +85 -0
- package/extension/src/langgraph/vscode-tool-definitions.ts +44 -0
- package/extension/src/langgraph/vscode-tools.ts +146 -0
- package/extension/src/langgraph/workflow-executor-actions.ts +144 -0
- package/extension/src/langgraph/workflow-executor.ts +87 -0
- package/extension/src/langgraph/workflow-graph-data.ts +132 -0
- package/extension/src/langgraph/workflow-parser-actions.ts +87 -0
- package/extension/src/langgraph/workflow-parser.ts +74 -0
- package/extension/src/logger.ts +34 -0
- package/extension/src/mcp-config-builder.ts +118 -0
- package/extension/src/mcp-injector.ts +68 -0
- package/extension/src/mcp-server-manager.ts +24 -0
- package/extension/src/models/LlmProviderConfig.ts +25 -0
- package/extension/src/models/LlmTestResult.ts +9 -0
- package/extension/src/models/SettingsState.ts +16 -0
- package/extension/src/models/index.ts +3 -0
- package/extension/src/native-addon-manager.ts +194 -0
- package/extension/src/panels/analytics-panel.ts +31 -0
- package/extension/src/panels/base-panel.ts +95 -0
- package/extension/src/panels/dashboard-panel.ts +29 -0
- package/extension/src/panels/graph-panel.ts +27 -0
- package/extension/src/panels/impact-panel.ts +167 -0
- package/extension/src/panels/login-panel.ts +100 -0
- package/extension/src/panels/panel-html.ts +124 -0
- package/extension/src/panels/quality-panel.ts +31 -0
- package/extension/src/panels/security-panel.ts +162 -0
- package/extension/src/panels/settings/SettingsMessageHandler.ts +190 -0
- package/extension/src/panels/settings/SettingsPanel.ts +121 -0
- package/extension/src/panels/settings-panel.ts +10 -0
- package/extension/src/panels/tags-panel.ts +31 -0
- package/extension/src/panels/workflow-panel.ts +80 -0
- package/extension/src/platform-swap/backup-manager.ts +156 -0
- package/extension/src/platform-swap/index.ts +62 -0
- package/extension/src/platform-swap/platform-config.ts +84 -0
- package/extension/src/platform-swap/platform-detector.ts +90 -0
- package/extension/src/platform-swap/platform-status-bar.ts +71 -0
- package/extension/src/platform-swap/state-manager.ts +101 -0
- package/extension/src/platform-swap/swap-commands.ts +161 -0
- package/extension/src/platform-swap/swap-executor.ts +193 -0
- package/extension/src/platform-swap/types.ts +68 -0
- package/extension/src/proxy/HttpClient.ts +120 -0
- package/extension/src/proxy/ToolProxy.ts +58 -0
- package/extension/src/remote-backend-client.ts +185 -0
- package/extension/src/services/IndexerHttpClient.ts +129 -0
- package/extension/src/services/IndexingService.ts +101 -0
- package/extension/src/services/LlmTestService.ts +96 -0
- package/extension/src/services/ProviderConfigService.ts +85 -0
- package/extension/src/services/WorkspaceSyncService.ts +48 -0
- package/extension/src/sf-indexer.ts +85 -0
- package/extension/src/sidebar/tree-view-provider.ts +173 -0
- package/extension/src/symbol-search.ts +135 -0
- package/extension/src/test/base-panel.test.ts +168 -0
- package/extension/src/test/mcp-server-manager.test.ts +322 -0
- package/extension/src/test/mocks/vscode.ts +148 -0
- package/extension/src/test/setup.ts +18 -0
- package/extension/src/test/tree-view-provider.test.ts +208 -0
- package/extension/src/test/webview-panel-manager.test.ts +160 -0
- package/extension/src/types/index.ts +6 -0
- package/extension/src/types/panel-types.ts +81 -0
- package/extension/src/types/server-types.ts +96 -0
- package/extension/src/types.ts +5 -0
- package/extension/src/ui/status-bar.ts +55 -0
- package/extension/src/webview/__tests__/integration.test.ts +341 -0
- package/extension/src/webview/__tests__/options.integration.test.ts +269 -0
- package/extension/src/webview/__tests__/options.pbt.test.ts +222 -0
- package/extension/src/webview/__tests__/options.unit.test.ts +413 -0
- package/extension/src/webview/__tests__/pbt.test.ts +251 -0
- package/extension/src/webview/__tests__/slash-menu.integration.test.ts +259 -0
- package/extension/src/webview/__tests__/slash-menu.pbt.test.ts +229 -0
- package/extension/src/webview/__tests__/slash-menu.unit.test.ts +244 -0
- package/extension/src/webview/__tests__/spinner.integration.test.ts +214 -0
- package/extension/src/webview/__tests__/spinner.pbt.test.ts +151 -0
- package/extension/src/webview/__tests__/spinner.unit.test.ts +263 -0
- package/extension/src/webview/__tests__/unit-part2.test.ts +377 -0
- package/extension/src/webview/__tests__/unit.test.ts +101 -0
- package/extension/src/webview/badges/BadgeManager.ts +94 -0
- package/extension/src/webview/badges/BadgeRenderer.ts +66 -0
- package/extension/src/webview/badges/types.ts +12 -0
- package/extension/src/webview/bridge/MessageBridge.ts +107 -0
- package/extension/src/webview/bridge/types.ts +15 -0
- package/extension/src/webview/context-menu/ContextMenuController.ts +275 -0
- package/extension/src/webview/context-menu/ContextMenuItems.ts +72 -0
- package/extension/src/webview/context-menu/ContextMenuView.ts +154 -0
- package/extension/src/webview/context-menu/FilePicker.ts +100 -0
- package/extension/src/webview/context-menu/FolderPicker.ts +98 -0
- package/extension/src/webview/context-menu/FuzzyFilter.ts +67 -0
- package/extension/src/webview/context-menu/ListPicker.ts +172 -0
- package/extension/src/webview/context-menu/PickerPanel.ts +205 -0
- package/extension/src/webview/context-menu/types.ts +49 -0
- package/extension/src/webview/graph/lod/BudgetManager.ts +53 -0
- package/extension/src/webview/graph/lod/ClusteringAlgorithm.ts +186 -0
- package/extension/src/webview/graph/lod/DistanceChecker.ts +51 -0
- package/extension/src/webview/graph/lod/LODManager.ts +177 -0
- package/extension/src/webview/graph/lod/OrbitalLayout.ts +52 -0
- package/extension/src/webview/graph/lod/__tests__/lod.test.ts +269 -0
- package/extension/src/webview/graph/lod/clustering-helpers.ts +62 -0
- package/extension/src/webview/graph/lod/config.ts +36 -0
- package/extension/src/webview/graph/lod/index.ts +25 -0
- package/extension/src/webview/graph/lod/types.ts +91 -0
- package/extension/src/webview/input/InputAreaIntegration.ts +408 -0
- package/extension/src/webview/options/OptionsController.ts +203 -0
- package/extension/src/webview/options/OptionsView.ts +169 -0
- package/extension/src/webview/options/types.ts +42 -0
- package/extension/src/webview/protocol.ts +134 -0
- package/extension/src/webview/slash-menu/SlashMenuController.ts +249 -0
- package/extension/src/webview/slash-menu/SlashMenuItems.ts +89 -0
- package/extension/src/webview/slash-menu/SlashMenuView.ts +216 -0
- package/extension/src/webview/slash-menu/types.ts +61 -0
- package/extension/src/webview/spinner/SpinnerController.ts +114 -0
- package/extension/src/webview/spinner/SpinnerView.ts +67 -0
- package/extension/src/webview/spinner/types.ts +35 -0
- package/extension/src/webview-panel-manager.ts +117 -0
- package/extension/vitest.config.ts +10 -0
- package/extension/webview-assets/3d-force-graph.min.js +5 -0
- package/extension/webview-assets/analytics.js +174 -0
- package/extension/webview-assets/chart.min.js +14 -0
- package/extension/webview-assets/chat/chat.js +1907 -0
- package/extension/webview-assets/chat/graph-viz.js +144 -0
- package/extension/webview-assets/chat/markdown-renderer.js +254 -0
- package/extension/webview-assets/dashboard.js +246 -0
- package/extension/webview-assets/graph.js +636 -0
- package/extension/webview-assets/quality.js +203 -0
- package/extension/webview-assets/settings/settings.css +391 -0
- package/extension/webview-assets/settings/settings.js +575 -0
- package/extension/webview-assets/tags.js +182 -0
- package/extension/webview-assets/three.min.js +6 -0
- package/extension/webview-assets/workflow-graph.js +108 -0
- package/package.json +61 -0
- package/scripts/debug/check_tools.js +76 -0
- package/scripts/debug/clear_graph.cjs +12 -0
- package/scripts/debug/fetch_ticket.mjs +18 -0
- package/scripts/debug/get-jira.js +27 -0
- package/scripts/debug/get_tools.js +14 -0
- package/scripts/debug/inject_all_logs.js +15 -0
- package/scripts/debug/inject_debug.js +14 -0
- package/scripts/debug/inject_error.js +14 -0
- package/scripts/debug/migrate-db-types.js +91 -0
- package/scripts/debug/read-ksa-295.mjs +15 -0
- package/scripts/debug/scratch.cjs +17 -0
- package/scripts/debug/scratch_admin.cjs +11 -0
- package/scripts/debug/sm-discovery.mjs +33 -0
- package/scripts/debug/test-atlassian-endpoints.js +32 -0
- package/scripts/debug/test-convert.js +33 -0
- package/scripts/debug/test-db-debug.cjs +24 -0
- package/scripts/debug/test-db.js +22 -0
- package/scripts/debug/test-find-tools.mjs +32 -0
- package/scripts/debug/test-mcp-sdk.js +28 -0
- package/scripts/debug/test-post.js +31 -0
- package/scripts/debug/test-stream.mjs +57 -0
- package/scripts/debug/test-ws.js +25 -0
- package/scripts/debug/test.js +12 -0
- package/scripts/debug/test2.ts +9 -0
- package/scripts/debug/test_activate.js +130 -0
- package/scripts/debug/test_api.py +19 -0
- package/scripts/debug/tmp-jira-call.js +38 -0
- package/src/admin/__tests__/admin-db.test.ts +450 -0
- package/src/admin/admin-db.ts +1134 -0
- package/src/admin/index.ts +83 -0
- package/src/admin/middleware/audit.middleware.ts +60 -0
- package/src/admin/middleware/rate-limit.middleware.ts +48 -0
- package/src/admin/middleware/rbac.middleware.ts +116 -0
- package/src/admin/routes/analytics.router.ts +60 -0
- package/src/admin/routes/audit.router.ts +28 -0
- package/src/admin/routes/config.router.ts +23 -0
- package/src/admin/routes/dashboard.router.ts +14 -0
- package/src/admin/routes/helpers.ts +15 -0
- package/src/admin/routes/kb-admin.router.ts +42 -0
- package/src/admin/routes/mcp-admin.router.ts +34 -0
- package/src/admin/routes/rbac.router.ts +53 -0
- package/src/admin/routes/search.router.ts +24 -0
- package/src/admin/routes/user.router.ts +40 -0
- package/src/admin/services/audit.service.ts +29 -0
- package/src/admin/services/config.service.ts +28 -0
- package/src/admin/services/dashboard.service.ts +46 -0
- package/src/admin/services/kb-admin.service.ts +65 -0
- package/src/admin/services/mcp-admin.service.ts +42 -0
- package/src/admin/services/rbac.service.ts +99 -0
- package/src/admin/services/search.service.ts +47 -0
- package/src/admin/services/sse.manager.ts +41 -0
- package/src/admin/services/user.service.ts +55 -0
- package/src/admin/standalone-server.ts +105 -0
- package/src/admin/types/admin.types.ts +185 -0
- package/src/admin/types/api.types.ts +66 -0
- package/src/admin/types/rbac.types.ts +111 -0
- package/src/config/BackendConfig.ts +48 -0
- package/src/engine/analyzers/complexity/ComplexityAnalyzer.ts +115 -0
- package/src/engine/analyzers/complexity/ComplexityCalculator.ts +65 -0
- package/src/engine/analyzers/complexity/ComplexityStore.ts +177 -0
- package/src/engine/analyzers/complexity/ComplexityTool.ts +71 -0
- package/src/engine/analyzers/complexity/GradeAssigner.ts +34 -0
- package/src/engine/analyzers/complexity/counters/BaseNodeCounter.ts +94 -0
- package/src/engine/analyzers/complexity/counters/GoCounter.ts +34 -0
- package/src/engine/analyzers/complexity/counters/JavaCounter.ts +31 -0
- package/src/engine/analyzers/complexity/counters/KotlinCounter.ts +37 -0
- package/src/engine/analyzers/complexity/counters/PythonCounter.ts +38 -0
- package/src/engine/analyzers/complexity/counters/TypeScriptCounter.ts +34 -0
- package/src/engine/analyzers/complexity/index.ts +25 -0
- package/src/engine/analyzers/complexity/types.ts +62 -0
- package/src/engine/analyzers/entry-points/EntryPointDetector.ts +76 -0
- package/src/engine/analyzers/entry-points/EntryPointStore.ts +162 -0
- package/src/engine/analyzers/entry-points/EntryPointTool.ts +63 -0
- package/src/engine/analyzers/entry-points/FrameworkDetector.ts +57 -0
- package/src/engine/analyzers/entry-points/PatternRegistry.ts +114 -0
- package/src/engine/analyzers/entry-points/RouteResolver.ts +44 -0
- package/src/engine/analyzers/entry-points/detectors/CLIDetector.ts +48 -0
- package/src/engine/analyzers/entry-points/detectors/EventDetector.ts +77 -0
- package/src/engine/analyzers/entry-points/detectors/HTTPHandlerDetector.ts +158 -0
- package/src/engine/analyzers/entry-points/detectors/MainDetector.ts +64 -0
- package/src/engine/analyzers/entry-points/index.ts +23 -0
- package/src/engine/analyzers/entry-points/types.ts +74 -0
- package/src/engine/analyzers/graph-analysis/CircularDepDetector.ts +93 -0
- package/src/engine/analyzers/graph-analysis/DeadImportDetector.ts +70 -0
- package/src/engine/analyzers/graph-analysis/GraphAnalysisTools.ts +202 -0
- package/src/engine/analyzers/graph-analysis/HotPathAnalyzer.ts +67 -0
- package/src/engine/analyzers/graph-analysis/ModuleSummarizer.ts +72 -0
- package/src/engine/analyzers/graph-analysis/RelatedTestFinder.ts +97 -0
- package/src/engine/analyzers/graph-analysis/index.ts +23 -0
- package/src/engine/analyzers/graph-analysis/types.ts +73 -0
- package/src/engine/analyzers/graph-analysis/utils/GraphLoader.ts +149 -0
- package/src/engine/analyzers/graph-analysis/utils/TarjanSCC.ts +65 -0
- package/src/engine/analyzers/graph-analysis/utils/TestFileDetector.ts +35 -0
- package/src/engine/analyzers/security/cfg/BasicBlock.ts +130 -0
- package/src/engine/analyzers/security/cfg/CFGBuilder.ts +266 -0
- package/src/engine/analyzers/security/cfg/CFGEdge.ts +24 -0
- package/src/engine/analyzers/security/cfg/ControlFlowGraph.ts +102 -0
- package/src/engine/analyzers/security/dataflow/DataFlowAnalyzer.ts +78 -0
- package/src/engine/analyzers/security/dataflow/ReachingDefinitions.ts +91 -0
- package/src/engine/analyzers/security/idor/IDORDetector.ts +143 -0
- package/src/engine/analyzers/security/injection/InjectionScanner.ts +164 -0
- package/src/engine/analyzers/security/injection/PatternMatcher.ts +85 -0
- package/src/engine/analyzers/security/injection/SuppressionChecker.ts +65 -0
- package/src/engine/analyzers/security/injection/patterns/CommandInjectionMatcher.ts +56 -0
- package/src/engine/analyzers/security/injection/patterns/DeserializationMatcher.ts +45 -0
- package/src/engine/analyzers/security/injection/patterns/LDAPXMLMatcher.ts +34 -0
- package/src/engine/analyzers/security/injection/patterns/PathTraversalMatcher.ts +45 -0
- package/src/engine/analyzers/security/injection/patterns/SQLInjectionMatcher.ts +56 -0
- package/src/engine/analyzers/security/injection/patterns/XSSMatcher.ts +56 -0
- package/src/engine/analyzers/security/ssrf/SSRFDetector.ts +103 -0
- package/src/engine/analyzers/security/taint/TaintAnalyzer.ts +230 -0
- package/src/engine/analyzers/security/taint/TaintPropagator.ts +250 -0
- package/src/engine/analyzers/security/taint/TaintRegistry.ts +139 -0
- package/src/engine/analyzers/security/types.ts +326 -0
- package/src/engine/analyzers/similarity/ClusterBuilder.ts +68 -0
- package/src/engine/analyzers/similarity/DeadCodeDetector.ts +227 -0
- package/src/engine/analyzers/similarity/DuplicateDetector.ts +211 -0
- package/src/engine/analyzers/similarity/GitMiner.ts +227 -0
- package/src/engine/analyzers/similarity/SimilarityTools.ts +181 -0
- package/src/engine/analyzers/similarity/types.ts +76 -0
- package/src/engine/config.ts +153 -0
- package/src/engine/context/ai-context-service.ts +302 -0
- package/src/engine/context/budget-allocator.ts +66 -0
- package/src/engine/context/curated-context-service.ts +268 -0
- package/src/engine/context/edit-context-service.ts +279 -0
- package/src/engine/context/git-service.ts +48 -0
- package/src/engine/context/index.ts +15 -0
- package/src/engine/context/intent-strategies.ts +75 -0
- package/src/engine/context/query-analyzer.ts +49 -0
- package/src/engine/context/rrf-merger.ts +63 -0
- package/src/engine/context/token-budget-manager.ts +129 -0
- package/src/engine/context/types.ts +164 -0
- package/src/engine/database/graph-repository.ts +166 -0
- package/src/engine/database/incremental-updater.ts +117 -0
- package/src/engine/database/index.ts +13 -0
- package/src/engine/database/migrations/002-graph-schema.sql +24 -0
- package/src/engine/database/migrator.ts +148 -0
- package/src/engine/db/database-manager.ts +89 -0
- package/src/engine/db/migrations.ts +159 -0
- package/src/engine/db/native-addon-resolver.ts +386 -0
- package/src/engine/db/schema.ts +123 -0
- package/src/engine/graph/__tests__/graph-services.test.ts +476 -0
- package/src/engine/graph/call-graph-service.ts +216 -0
- package/src/engine/graph/dependency-formatters.ts +95 -0
- package/src/engine/graph/dependency-graph-service.ts +236 -0
- package/src/engine/graph/file-resolver.ts +102 -0
- package/src/engine/graph/impact-analysis-service.ts +293 -0
- package/src/engine/graph/index.ts +13 -0
- package/src/engine/graph/symbol-resolver.ts +90 -0
- package/src/engine/graph/test-detector.ts +77 -0
- package/src/engine/graph/traverser.ts +237 -0
- package/src/engine/indexer/__tests__/tree-sitter-pipeline.test.ts +205 -0
- package/src/engine/indexer/file-watcher.ts +77 -0
- package/src/engine/indexer/indexing-engine.ts +468 -0
- package/src/engine/parsers/ast-utils.ts +140 -0
- package/src/engine/parsers/embedding/EmbeddingService.ts +64 -0
- package/src/engine/parsers/embedding/body-extractor.ts +123 -0
- package/src/engine/parsers/embedding/chunker.ts +71 -0
- package/src/engine/parsers/embedding/index.ts +6 -0
- package/src/engine/parsers/grammar-config.json +58 -0
- package/src/engine/parsers/grammar-registry.ts +162 -0
- package/src/engine/parsers/grammars/config-schema.json +1 -0
- package/src/engine/parsers/grammars/grammar-config-loader.ts +192 -0
- package/src/engine/parsers/grammars/tree-sitter-apex.wasm +0 -0
- package/src/engine/parsers/grammars/tree-sitter-go.wasm +0 -0
- package/src/engine/parsers/grammars/tree-sitter-java.wasm +0 -0
- package/src/engine/parsers/grammars/tree-sitter-javascript.wasm +0 -0
- package/src/engine/parsers/grammars/tree-sitter-python.wasm +0 -0
- package/src/engine/parsers/grammars/tree-sitter-rust.wasm +0 -0
- package/src/engine/parsers/grammars/tree-sitter-typescript.wasm +0 -0
- package/src/engine/parsers/grammars/typescript.grammar.json +67 -0
- package/src/engine/parsers/ignore/ignore-parser.ts +112 -0
- package/src/engine/parsers/ignore/index.ts +1 -0
- package/src/engine/parsers/index.ts +17 -0
- package/src/engine/parsers/languages/__tests__/apex-parser.test.ts +253 -0
- package/src/engine/parsers/languages/__tests__/fixtures/Annotations.java +57 -0
- package/src/engine/parsers/languages/__tests__/fixtures/SimpleClass.java +72 -0
- package/src/engine/parsers/languages/__tests__/fixtures/UserController.java +57 -0
- package/src/engine/parsers/languages/__tests__/fixtures/UserService.java +72 -0
- package/src/engine/parsers/languages/__tests__/fixtures/apex/ClassWithDML.cls +17 -0
- package/src/engine/parsers/languages/__tests__/fixtures/apex/ClassWithMethods.cls +24 -0
- package/src/engine/parsers/languages/__tests__/fixtures/apex/ClassWithSOQL.cls +9 -0
- package/src/engine/parsers/languages/__tests__/fixtures/apex/InheritanceExample.cls +18 -0
- package/src/engine/parsers/languages/__tests__/fixtures/apex/InterfaceExample.cls +5 -0
- package/src/engine/parsers/languages/__tests__/fixtures/apex/MalformedClass.cls +5 -0
- package/src/engine/parsers/languages/__tests__/fixtures/apex/SimpleClass.cls +2 -0
- package/src/engine/parsers/languages/__tests__/fixtures/apex/TriggerExample.trigger +8 -0
- package/src/engine/parsers/languages/__tests__/fixtures/protocol-class.py +63 -0
- package/src/engine/parsers/languages/__tests__/fixtures/salesforce-meta/CustomObject.object-meta.xml +21 -0
- package/src/engine/parsers/languages/__tests__/fixtures/salesforce-meta/LWCMeta.js-meta.xml +9 -0
- package/src/engine/parsers/languages/__tests__/fixtures/salesforce-meta/LookupField.field-meta.xml +7 -0
- package/src/engine/parsers/languages/__tests__/fixtures/salesforce-meta/SimpleFlow.flow-meta.xml +32 -0
- package/src/engine/parsers/languages/__tests__/fixtures/simple-function.py +57 -0
- package/src/engine/parsers/languages/__tests__/fixtures/simple.go +55 -0
- package/src/engine/parsers/languages/__tests__/fixtures/simple.rs +109 -0
- package/src/engine/parsers/languages/__tests__/go-parser.test.ts +254 -0
- package/src/engine/parsers/languages/__tests__/java-parser.test.ts +296 -0
- package/src/engine/parsers/languages/__tests__/python-parser.test.ts +256 -0
- package/src/engine/parsers/languages/__tests__/rust-parser.test.ts +354 -0
- package/src/engine/parsers/languages/__tests__/salesforce-meta-parser.test.ts +216 -0
- package/src/engine/parsers/languages/apex-parser.ts +665 -0
- package/src/engine/parsers/languages/go-parser.ts +429 -0
- package/src/engine/parsers/languages/java-parser.ts +651 -0
- package/src/engine/parsers/languages/kotlin-parser.ts +624 -0
- package/src/engine/parsers/languages/python-parser.ts +502 -0
- package/src/engine/parsers/languages/rust-parser.ts +644 -0
- package/src/engine/parsers/languages/salesforce-meta-parser.ts +404 -0
- package/src/engine/parsers/languages/ts-call-extractor.ts +155 -0
- package/src/engine/parsers/languages/ts-import-extractor.ts +132 -0
- package/src/engine/parsers/languages/ts-inheritance-extractor.ts +54 -0
- package/src/engine/parsers/languages/ts-symbol-extractor.ts +319 -0
- package/src/engine/parsers/languages/ts-utils.ts +88 -0
- package/src/engine/parsers/languages/typescript-parser.ts +72 -0
- package/src/engine/parsers/tree-sitter-indexer.ts +263 -0
- package/src/engine/parsers/types.ts +78 -0
- package/src/engine/query/query-layer.ts +177 -0
- package/src/engine/scanner/file-scanner.ts +173 -0
- package/src/engine/scanner/pattern-detector.ts +112 -0
- package/src/engine/scanner/signature-extractor.ts +173 -0
- package/src/engine/tools/ai-context-tools.ts +155 -0
- package/src/engine/tools/call-graph-tools.ts +109 -0
- package/src/engine/tools/code-context.ts +70 -0
- package/src/engine/tools/code-index-status.ts +85 -0
- package/src/engine/tools/code-kb-export.ts +84 -0
- package/src/engine/tools/code-modules.ts +53 -0
- package/src/engine/tools/code-search.ts +39 -0
- package/src/engine/tools/code-symbols.ts +53 -0
- package/src/engine/tools/code-traverse.ts +75 -0
- package/src/engine/tools/dependency-tools.ts +54 -0
- package/src/engine/tools/drawio-export-png.ts +272 -0
- package/src/engine/tools/drawio-layout.ts +143 -0
- package/src/engine/tools/drawio-parser.ts +118 -0
- package/src/engine/tools/drawio-router.ts +112 -0
- package/src/engine/tools/drawio-tool.ts +167 -0
- package/src/engine/tools/drawio-writer.ts +133 -0
- package/src/engine/tools/impact-tools.ts +97 -0
- package/src/engine/tools/register-tools.ts +230 -0
- package/src/index.ts +131 -0
- package/src/logger.ts +34 -0
- package/src/modules/ModuleRegistry.ts +106 -0
- package/src/modules/analytics/AnalyticsModule.ts +49 -0
- package/src/modules/code-intel/CodeIntelModule.ts +84 -0
- package/src/modules/kb-graph/KBGraphModule.ts +63 -0
- package/src/modules/kb-graph/SqliteGraphService.ts +488 -0
- package/src/modules/memory/MemoryDb.ts +53 -0
- package/src/modules/memory/MemoryEngine.ts +239 -0
- package/src/modules/memory/MemoryEngineFull.ts +0 -0
- package/src/modules/memory/MemoryModule.ts +163 -0
- package/src/modules/memory/MemoryToolDefinitions.ts +301 -0
- package/src/modules/memory/MemoryToolDispatcher.ts +488 -0
- package/src/modules/memory/ScopePromotionService.ts +339 -0
- package/src/modules/memory/__tests__/MemoryToolDispatcher.test.ts +85 -0
- package/src/modules/memory/__tests__/ScopePromotionService.test.ts +160 -0
- package/src/modules/memory/llm/LLMService.ts +75 -0
- package/src/modules/memory/llm/TagAnalyzerService.ts +255 -0
- package/src/modules/memory/llm/index.ts +2 -0
- package/src/modules/memory/llm/ollama-adapter.ts +60 -0
- package/src/modules/memory/llm/openai-adapter.ts +44 -0
- package/src/modules/memory/llm/types.ts +31 -0
- package/src/modules/memory/masking/MaskingMiddleware.ts +143 -0
- package/src/modules/memory/masking/__tests__/CredentialDetector.test.ts +48 -0
- package/src/modules/memory/masking/__tests__/MaskingMiddleware.test.ts +74 -0
- package/src/modules/memory/masking/__tests__/PiiDetector.test.ts +59 -0
- package/src/modules/memory/masking/db/migrations/001-masking-tables.sql +60 -0
- package/src/modules/memory/masking/detectors/CredentialDetector.ts +54 -0
- package/src/modules/memory/masking/detectors/DetectorStrategy.ts +10 -0
- package/src/modules/memory/masking/detectors/PiiDetector.ts +54 -0
- package/src/modules/memory/masking/index.ts +8 -0
- package/src/modules/memory/masking/maskers/ContentMasker.ts +111 -0
- package/src/modules/memory/masking/models/MaskingTypes.ts +91 -0
- package/src/modules/memory/masking/services/AllowlistService.ts +34 -0
- package/src/modules/memory/masking/services/AuditService.ts +42 -0
- package/src/modules/memory/masking/services/ConfigCacheService.ts +45 -0
- package/src/modules/memory/migrations/001-add-scope-columns.ts +25 -0
- package/src/modules/memory/models.ts +106 -0
- package/src/modules/memory/schema.ts +269 -0
- package/src/modules/memory/tool-definitions.ts +31 -0
- package/src/modules/orchestration/McpClientManager.ts +209 -0
- package/src/modules/orchestration/McpConfigRoutes.ts +133 -0
- package/src/modules/orchestration/McpConfigService.ts +158 -0
- package/src/modules/orchestration/OrchestrationModule.ts +168 -0
- package/src/modules/utility/UtilityModule.ts +67 -0
- package/src/modules/web/WebModule.ts +79 -0
- package/src/modules/web/handlers/ApiCallHandler.ts +48 -0
- package/src/modules/web/handlers/DownloadFileHandler.ts +66 -0
- package/src/modules/web/handlers/FetchUrlHandler.ts +93 -0
- package/src/modules/web/handlers/GitBrowseHandler.ts +70 -0
- package/src/modules/web/handlers/ReadWebpageHandler.ts +59 -0
- package/src/modules/web/handlers/WebSearchHandler.ts +50 -0
- package/src/modules/web/middleware/ContentTruncator.ts +31 -0
- package/src/modules/web/middleware/RateLimiter.ts +70 -0
- package/src/modules/web/middleware/SsrfGuard.ts +82 -0
- package/src/modules/web/models/WebError.ts +25 -0
- package/src/modules/web/models/WebModuleConfig.ts +35 -0
- package/src/modules/web/models/WebToolResult.ts +23 -0
- package/src/modules/web/utils/GitUrlParser.ts +46 -0
- package/src/modules/web/utils/HtmlExtractor.ts +46 -0
- package/src/modules/web/utils/UrlValidator.ts +24 -0
- package/src/server/HttpServer.ts +135 -0
- package/src/server/mcpServer.ts +91 -0
- package/src/server/middleware/error-handler.ts +23 -0
- package/src/server/middleware/localhost-only.ts +22 -0
- package/src/server/middleware/rate-limiter.ts +61 -0
- package/src/server/middleware/request-logger.ts +26 -0
- package/src/server/routes/__tests__/admin.test.ts +667 -0
- package/src/server/routes/admin.ts +2511 -0
- package/src/server/routes/api.ts +208 -0
- package/src/server/routes/health.ts +33 -0
- package/src/server/routes/tools.ts +70 -0
- package/src/shared/protocol.ts +134 -0
- package/src/tool-router/ToolDefinitions.ts +17 -0
- package/src/tool-router/ToolRouter.ts +65 -0
- package/src/tool-router/ToolValidator.ts +55 -0
- package/src/types/module.ts +23 -0
- package/src/types/tool.ts +39 -0
- package/src/types.ts +6 -0
- package/src/viewer/3d-force-graph.min.js +5 -0
- package/src/viewer/__tests__/lod-manager.test.js +300 -0
- package/src/viewer/admin/camera-physics.js +102 -0
- package/src/viewer/admin/gesture-fsm.js +195 -0
- package/src/viewer/admin/index.html +338 -0
- package/src/viewer/admin/kb-graph-renderer.js +601 -0
- package/src/viewer/admin/lod-animation.js +202 -0
- package/src/viewer/admin/lod-clustering.js +229 -0
- package/src/viewer/admin/lod-manager.js +341 -0
- package/src/viewer/admin/map-controls.js +195 -0
- package/src/viewer/admin/zoom-animator.js +90 -0
- package/src/viewer/analytics.js +73 -0
- package/src/viewer/browser.js +82 -0
- package/src/viewer/dashboard.js +193 -0
- package/src/viewer/graph.js +249 -0
- package/src/viewer/lod-animation.js +200 -0
- package/src/viewer/lod-clustering.js +227 -0
- package/src/viewer/lod-manager.js +274 -0
- package/src/viewer/modules/empty-states.js +123 -0
- package/src/viewer/modules/event-bus.js +37 -0
- package/src/viewer/modules/graph-analysis.js +131 -0
- package/src/viewer/modules/help-panel.js +104 -0
- package/src/viewer/modules/markdown-renderer.js +70 -0
- package/src/viewer/modules/recommendations.js +116 -0
- package/src/viewer/modules/tooltips.js +119 -0
- package/src/viewer/modules/tour-ui.js +136 -0
- package/src/viewer/modules/tour.js +99 -0
- package/src/viewer/quality.js +122 -0
- package/src/viewer/session-export.js +37 -0
- package/src/viewer/session-playback.js +80 -0
- package/src/viewer/session-timeline.js +112 -0
- package/src/viewer/sessions.js +84 -0
- package/src/viewer/stream.js +109 -0
- package/src/viewer/tags.js +101 -0
- package/src/vitest.config.ts +9 -0
- package/src/vitest.ksa252.config.ts +10 -0
- package/tests/e2e/admin-api.e2e.test.ts +702 -0
- package/tests/e2e/admin-ui.e2e.test.ts +703 -0
- package/tests/e2e/check-lod.mjs +33 -0
- package/tests/e2e/debug-collapse.mjs +79 -0
- package/tests/e2e/debug-expand.mjs +38 -0
- package/tests/e2e/debug-lod.mjs +41 -0
- package/tests/e2e/debug-realtime.mjs +39 -0
- package/tests/e2e/lod-collapse.e2e.test.ts +163 -0
- package/tests/e2e/mcp-api.e2e.test.ts +280 -0
- package/tests/e2e/multi-tenant.e2e.test.ts +440 -0
- package/tests/e2e/test-progressive.mjs +72 -0
- package/tests/e2e/test-user-zoom.mjs +63 -0
- package/tests/e2e/tool-forwarding.e2e.test.ts +128 -0
- package/tests/integration/auth.test.ts +342 -0
- package/tests/integration/mcp-tools.test.ts +288 -0
- package/tsconfig.json +19 -0
- package/vitest.config.ts +18 -0
|
@@ -0,0 +1,1056 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin Portal SQLite Database Layer
|
|
3
|
+
* Persistent storage for users, RBAC groups, sessions, and audit trail.
|
|
4
|
+
* Uses better-sqlite3 for synchronous, fast SQLite access.
|
|
5
|
+
*/
|
|
6
|
+
import Database from 'better-sqlite3';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as crypto from 'crypto';
|
|
10
|
+
import { fileURLToPath } from 'url';
|
|
11
|
+
import { loadConfig, getWorkspacePath } from '../config/BackendConfig.js';
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
13
|
+
const __dirname = path.dirname(__filename);
|
|
14
|
+
const config = loadConfig();
|
|
15
|
+
// DB location: .code-intel/admin.db (separate from index.db)
|
|
16
|
+
const DB_PATH = path.resolve(getWorkspacePath(), config.dataDir, 'admin.db');
|
|
17
|
+
function getIndexDbPath() {
|
|
18
|
+
return path.resolve(getWorkspacePath(), config.dataDir, config.sqliteDbPath);
|
|
19
|
+
}
|
|
20
|
+
let db = null;
|
|
21
|
+
export function getAdminDb() {
|
|
22
|
+
if (!db) {
|
|
23
|
+
const dir = path.dirname(DB_PATH);
|
|
24
|
+
if (!fs.existsSync(dir))
|
|
25
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
26
|
+
db = new Database(DB_PATH);
|
|
27
|
+
db.pragma('journal_mode = WAL');
|
|
28
|
+
db.pragma('foreign_keys = ON');
|
|
29
|
+
initSchema(db);
|
|
30
|
+
seedDefaults(db);
|
|
31
|
+
}
|
|
32
|
+
return db;
|
|
33
|
+
}
|
|
34
|
+
function initSchema(db) {
|
|
35
|
+
db.exec(`
|
|
36
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
37
|
+
user_id TEXT PRIMARY KEY,
|
|
38
|
+
username TEXT UNIQUE NOT NULL,
|
|
39
|
+
email TEXT NOT NULL DEFAULT '',
|
|
40
|
+
password_hash TEXT NOT NULL,
|
|
41
|
+
status TEXT NOT NULL DEFAULT 'ACTIVE',
|
|
42
|
+
access_group_id TEXT NOT NULL,
|
|
43
|
+
force_password_change INTEGER NOT NULL DEFAULT 0,
|
|
44
|
+
created_at TEXT NOT NULL,
|
|
45
|
+
last_login TEXT
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
CREATE TABLE IF NOT EXISTS access_groups (
|
|
49
|
+
access_group_id TEXT PRIMARY KEY,
|
|
50
|
+
access_group_name TEXT UNIQUE NOT NULL,
|
|
51
|
+
is_system_group INTEGER NOT NULL DEFAULT 0,
|
|
52
|
+
created_at TEXT NOT NULL,
|
|
53
|
+
updated_at TEXT NOT NULL
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
CREATE TABLE IF NOT EXISTS group_permissions (
|
|
57
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
58
|
+
access_group_id TEXT NOT NULL,
|
|
59
|
+
permission_id TEXT NOT NULL,
|
|
60
|
+
role_data TEXT NOT NULL DEFAULT '{}',
|
|
61
|
+
FOREIGN KEY (access_group_id) REFERENCES access_groups(access_group_id) ON DELETE CASCADE,
|
|
62
|
+
UNIQUE(access_group_id, permission_id)
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
66
|
+
session_id TEXT PRIMARY KEY,
|
|
67
|
+
user_id TEXT NOT NULL,
|
|
68
|
+
token TEXT UNIQUE NOT NULL,
|
|
69
|
+
device TEXT DEFAULT '',
|
|
70
|
+
ip_address TEXT DEFAULT '',
|
|
71
|
+
login_at TEXT NOT NULL,
|
|
72
|
+
expires_at TEXT NOT NULL,
|
|
73
|
+
is_active INTEGER NOT NULL DEFAULT 1,
|
|
74
|
+
FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
CREATE TABLE IF NOT EXISTS audit_log (
|
|
78
|
+
audit_id TEXT PRIMARY KEY,
|
|
79
|
+
user_id TEXT NOT NULL,
|
|
80
|
+
username TEXT NOT NULL,
|
|
81
|
+
action TEXT NOT NULL,
|
|
82
|
+
resource TEXT NOT NULL,
|
|
83
|
+
resource_id TEXT DEFAULT '',
|
|
84
|
+
changes TEXT DEFAULT '',
|
|
85
|
+
timestamp TEXT NOT NULL,
|
|
86
|
+
ip_address TEXT DEFAULT ''
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
CREATE TABLE IF NOT EXISTS config_changes (
|
|
90
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
91
|
+
section TEXT NOT NULL,
|
|
92
|
+
key TEXT NOT NULL,
|
|
93
|
+
old_value TEXT,
|
|
94
|
+
new_value TEXT NOT NULL,
|
|
95
|
+
changed_by TEXT NOT NULL,
|
|
96
|
+
changed_at TEXT NOT NULL,
|
|
97
|
+
requires_restart INTEGER NOT NULL DEFAULT 0
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_token ON sessions(token);
|
|
101
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_user ON sessions(user_id);
|
|
102
|
+
CREATE INDEX IF NOT EXISTS idx_audit_timestamp ON audit_log(timestamp);
|
|
103
|
+
CREATE INDEX IF NOT EXISTS idx_audit_user ON audit_log(user_id);
|
|
104
|
+
CREATE INDEX IF NOT EXISTS idx_config_changes_time ON config_changes(changed_at);
|
|
105
|
+
|
|
106
|
+
-- Graph visualization tables (spatial 3D positions for KB Graph)
|
|
107
|
+
CREATE TABLE IF NOT EXISTS graph_nodes (
|
|
108
|
+
entry_id TEXT PRIMARY KEY,
|
|
109
|
+
label TEXT NOT NULL DEFAULT '',
|
|
110
|
+
type TEXT NOT NULL DEFAULT 'DOCUMENT',
|
|
111
|
+
tier TEXT NOT NULL DEFAULT 'SHARED',
|
|
112
|
+
x REAL NOT NULL DEFAULT 0,
|
|
113
|
+
y REAL NOT NULL DEFAULT 0,
|
|
114
|
+
z REAL NOT NULL DEFAULT 0,
|
|
115
|
+
level INTEGER NOT NULL DEFAULT 2,
|
|
116
|
+
cluster_id TEXT DEFAULT NULL,
|
|
117
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
CREATE TABLE IF NOT EXISTS graph_edges (
|
|
121
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
122
|
+
source TEXT NOT NULL,
|
|
123
|
+
target TEXT NOT NULL,
|
|
124
|
+
weight REAL NOT NULL DEFAULT 0.5,
|
|
125
|
+
rel_type TEXT NOT NULL DEFAULT 'RELATED_TO',
|
|
126
|
+
UNIQUE(source, target)
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
CREATE INDEX IF NOT EXISTS idx_graph_nodes_x ON graph_nodes(x);
|
|
130
|
+
CREATE INDEX IF NOT EXISTS idx_graph_nodes_y ON graph_nodes(y);
|
|
131
|
+
CREATE INDEX IF NOT EXISTS idx_graph_nodes_z ON graph_nodes(z);
|
|
132
|
+
CREATE INDEX IF NOT EXISTS idx_graph_nodes_level ON graph_nodes(level);
|
|
133
|
+
CREATE INDEX IF NOT EXISTS idx_graph_nodes_cluster ON graph_nodes(cluster_id);
|
|
134
|
+
CREATE INDEX IF NOT EXISTS idx_graph_edges_source ON graph_edges(source);
|
|
135
|
+
CREATE INDEX IF NOT EXISTS idx_graph_edges_target ON graph_edges(target);
|
|
136
|
+
CREATE INDEX IF NOT EXISTS idx_graph_edges_source_target ON graph_edges(source, target);
|
|
137
|
+
`);
|
|
138
|
+
}
|
|
139
|
+
function seedDefaults(db) {
|
|
140
|
+
const groupExists = db.prepare('SELECT 1 FROM access_groups WHERE access_group_id = ?').get('grp-admin');
|
|
141
|
+
if (!groupExists) {
|
|
142
|
+
const now = new Date().toISOString();
|
|
143
|
+
db.prepare(`INSERT INTO access_groups (access_group_id, access_group_name, is_system_group, created_at, updated_at)
|
|
144
|
+
VALUES (?, ?, 1, ?, ?)`).run('grp-admin', 'Administrators', now, now);
|
|
145
|
+
const allPerms = [
|
|
146
|
+
'DASHBOARD_VIEW', 'KB_READ', 'KB_WRITE', 'KB_PROMOTE', 'KB_IMPORT_EXPORT',
|
|
147
|
+
'MCP_ACCESS', 'MCP_MANAGE', 'USER_MANAGE', 'RBAC_MANAGE', 'CONFIG_EDIT',
|
|
148
|
+
'SEARCH_EXPLORE', 'AUDIT_VIEW', 'GRAPH_VIEW', 'ANALYTICS_VIEW'
|
|
149
|
+
];
|
|
150
|
+
const insertPerm = db.prepare('INSERT INTO group_permissions (access_group_id, permission_id, role_data) VALUES (?, ?, ?)');
|
|
151
|
+
for (const perm of allPerms) {
|
|
152
|
+
insertPerm.run('grp-admin', perm, '{}');
|
|
153
|
+
}
|
|
154
|
+
// Seed: Developers group
|
|
155
|
+
db.prepare(`INSERT INTO access_groups (access_group_id, access_group_name, is_system_group, created_at, updated_at)
|
|
156
|
+
VALUES (?, ?, 0, ?, ?)`).run('grp-dev', 'Developers', now, now);
|
|
157
|
+
const devPerms = ['DASHBOARD_VIEW', 'KB_READ', 'KB_WRITE', 'MCP_ACCESS', 'SEARCH_EXPLORE', 'GRAPH_VIEW', 'ANALYTICS_VIEW'];
|
|
158
|
+
for (const perm of devPerms) {
|
|
159
|
+
insertPerm.run('grp-dev', perm, '{}');
|
|
160
|
+
}
|
|
161
|
+
// Seed: Viewers group (read-only)
|
|
162
|
+
db.prepare(`INSERT INTO access_groups (access_group_id, access_group_name, is_system_group, created_at, updated_at)
|
|
163
|
+
VALUES (?, ?, 0, ?, ?)`).run('grp-viewer', 'Viewers', now, now);
|
|
164
|
+
const viewerPerms = ['DASHBOARD_VIEW', 'KB_READ', 'SEARCH_EXPLORE', 'GRAPH_VIEW', 'ANALYTICS_VIEW'];
|
|
165
|
+
for (const perm of viewerPerms) {
|
|
166
|
+
insertPerm.run('grp-viewer', perm, '{}');
|
|
167
|
+
}
|
|
168
|
+
// Seed: MCP Operators group
|
|
169
|
+
db.prepare(`INSERT INTO access_groups (access_group_id, access_group_name, is_system_group, created_at, updated_at)
|
|
170
|
+
VALUES (?, ?, 0, ?, ?)`).run('grp-mcp-ops', 'MCP Operators', now, now);
|
|
171
|
+
const mcpPerms = ['DASHBOARD_VIEW', 'MCP_ACCESS', 'MCP_MANAGE'];
|
|
172
|
+
for (const perm of mcpPerms) {
|
|
173
|
+
insertPerm.run('grp-mcp-ops', perm, '{}');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const userExists = db.prepare('SELECT 1 FROM users WHERE username = ?').get('admin');
|
|
177
|
+
if (!userExists) {
|
|
178
|
+
const now = new Date().toISOString();
|
|
179
|
+
const hash = hashPassword('admin');
|
|
180
|
+
db.prepare(`INSERT INTO users (user_id, username, email, password_hash, status, access_group_id, force_password_change, created_at)
|
|
181
|
+
VALUES (?, ?, ?, ?, 'ACTIVE', 'grp-admin', 0, ?)`).run('user-admin-001', 'admin', 'admin@localhost', hash, now);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// --- Password Hashing ---
|
|
185
|
+
export function hashPassword(password) {
|
|
186
|
+
const salt = crypto.randomBytes(16).toString('hex');
|
|
187
|
+
const hash = crypto.pbkdf2Sync(password, salt, 10000, 64, 'sha512').toString('hex');
|
|
188
|
+
return `${salt}:${hash}`;
|
|
189
|
+
}
|
|
190
|
+
export function verifyPassword(password, stored) {
|
|
191
|
+
const [salt, hash] = stored.split(':');
|
|
192
|
+
if (!salt || !hash)
|
|
193
|
+
return false;
|
|
194
|
+
const computed = crypto.pbkdf2Sync(password, salt, 10000, 64, 'sha512').toString('hex');
|
|
195
|
+
return crypto.timingSafeEqual(Buffer.from(hash, 'hex'), Buffer.from(computed, 'hex'));
|
|
196
|
+
}
|
|
197
|
+
// --- Token Management ---
|
|
198
|
+
export function generateToken() {
|
|
199
|
+
return crypto.randomBytes(32).toString('hex');
|
|
200
|
+
}
|
|
201
|
+
export function createSession(userId, device, ip) {
|
|
202
|
+
const d = getAdminDb();
|
|
203
|
+
const sessionId = 'sess-' + crypto.randomUUID().slice(0, 8);
|
|
204
|
+
const token = generateToken();
|
|
205
|
+
const now = new Date();
|
|
206
|
+
const expires = new Date(now.getTime() + 24 * 60 * 60 * 1000); // 24h
|
|
207
|
+
d.prepare(`INSERT INTO sessions (session_id, user_id, token, device, ip_address, login_at, expires_at, is_active)
|
|
208
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, 1)`).run(sessionId, userId, token, device || '', ip || '', now.toISOString(), expires.toISOString());
|
|
209
|
+
return { sessionId, userId, token, device, ipAddress: ip, loginAt: now.toISOString(), expiresAt: expires.toISOString(), isActive: true };
|
|
210
|
+
}
|
|
211
|
+
export function validateSession(token) {
|
|
212
|
+
const d = getAdminDb();
|
|
213
|
+
const row = d.prepare(`
|
|
214
|
+
SELECT s.user_id, s.expires_at, s.is_active, u.username, u.access_group_id, u.status
|
|
215
|
+
FROM sessions s JOIN users u ON s.user_id = u.user_id
|
|
216
|
+
WHERE s.token = ?
|
|
217
|
+
`).get(token);
|
|
218
|
+
if (!row)
|
|
219
|
+
return null;
|
|
220
|
+
if (!row.is_active)
|
|
221
|
+
return null;
|
|
222
|
+
if (row.status !== 'ACTIVE')
|
|
223
|
+
return null;
|
|
224
|
+
if (new Date(row.expires_at) < new Date()) {
|
|
225
|
+
d.prepare('UPDATE sessions SET is_active = 0 WHERE token = ?').run(token);
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
return { userId: row.user_id, username: row.username, accessGroupId: row.access_group_id };
|
|
229
|
+
}
|
|
230
|
+
export function invalidateSession(token) {
|
|
231
|
+
const d = getAdminDb();
|
|
232
|
+
d.prepare('UPDATE sessions SET is_active = 0 WHERE token = ?').run(token);
|
|
233
|
+
}
|
|
234
|
+
export function invalidateUserSessions(userId) {
|
|
235
|
+
const d = getAdminDb();
|
|
236
|
+
const result = d.prepare('UPDATE sessions SET is_active = 0 WHERE user_id = ? AND is_active = 1').run(userId);
|
|
237
|
+
return result.changes;
|
|
238
|
+
}
|
|
239
|
+
export function refreshSession(token) {
|
|
240
|
+
const d = getAdminDb();
|
|
241
|
+
const row = d.prepare(`
|
|
242
|
+
SELECT s.user_id, s.expires_at, s.is_active, u.status
|
|
243
|
+
FROM sessions s JOIN users u ON s.user_id = u.user_id
|
|
244
|
+
WHERE s.token = ?
|
|
245
|
+
`).get(token);
|
|
246
|
+
if (!row)
|
|
247
|
+
return null;
|
|
248
|
+
if (!row.is_active)
|
|
249
|
+
return null;
|
|
250
|
+
if (row.status !== 'ACTIVE')
|
|
251
|
+
return null;
|
|
252
|
+
if (new Date(row.expires_at) < new Date()) {
|
|
253
|
+
d.prepare('UPDATE sessions SET is_active = 0 WHERE token = ?').run(token);
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
const newToken = generateToken();
|
|
257
|
+
const newExpires = new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString();
|
|
258
|
+
d.prepare('UPDATE sessions SET token = ?, expires_at = ? WHERE token = ?').run(newToken, newExpires, token);
|
|
259
|
+
return { token: newToken, expiresAt: newExpires };
|
|
260
|
+
}
|
|
261
|
+
// --- User Operations ---
|
|
262
|
+
export function getUsers(filters, page = 1, pageSize = 50) {
|
|
263
|
+
const d = getAdminDb();
|
|
264
|
+
let where = 'WHERE 1=1';
|
|
265
|
+
const params = [];
|
|
266
|
+
if (filters?.status) {
|
|
267
|
+
where += ' AND u.status = ?';
|
|
268
|
+
params.push(filters.status);
|
|
269
|
+
}
|
|
270
|
+
if (filters?.accessGroupId) {
|
|
271
|
+
where += ' AND u.access_group_id = ?';
|
|
272
|
+
params.push(filters.accessGroupId);
|
|
273
|
+
}
|
|
274
|
+
if (filters?.search) {
|
|
275
|
+
where += ' AND (u.username LIKE ? OR u.email LIKE ?)';
|
|
276
|
+
params.push(`%${filters.search}%`, `%${filters.search}%`);
|
|
277
|
+
}
|
|
278
|
+
const total = d.prepare(`SELECT COUNT(*) as cnt FROM users u ${where}`).get(...params).cnt;
|
|
279
|
+
const rows = d.prepare(`SELECT u.*, g.access_group_name FROM users u LEFT JOIN access_groups g ON u.access_group_id = g.access_group_id ${where} ORDER BY u.created_at DESC LIMIT ? OFFSET ?`).all(...params, pageSize, (page - 1) * pageSize);
|
|
280
|
+
return {
|
|
281
|
+
total,
|
|
282
|
+
items: rows.map(r => ({
|
|
283
|
+
userId: r.user_id,
|
|
284
|
+
username: r.username,
|
|
285
|
+
email: r.email,
|
|
286
|
+
status: r.status,
|
|
287
|
+
accessGroupId: r.access_group_id,
|
|
288
|
+
accessGroupName: r.access_group_name || '',
|
|
289
|
+
forcePasswordChange: !!r.force_password_change,
|
|
290
|
+
createdAt: r.created_at,
|
|
291
|
+
lastLogin: r.last_login || undefined,
|
|
292
|
+
})),
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
export function getUserById(userId) {
|
|
296
|
+
const d = getAdminDb();
|
|
297
|
+
const r = d.prepare('SELECT * FROM users WHERE user_id = ?').get(userId);
|
|
298
|
+
if (!r)
|
|
299
|
+
return null;
|
|
300
|
+
return {
|
|
301
|
+
userId: r.user_id, username: r.username, email: r.email, status: r.status,
|
|
302
|
+
accessGroupId: r.access_group_id, forcePasswordChange: !!r.force_password_change,
|
|
303
|
+
createdAt: r.created_at, lastLogin: r.last_login || undefined,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
export function getUserByUsername(username) {
|
|
307
|
+
const d = getAdminDb();
|
|
308
|
+
const r = d.prepare('SELECT * FROM users WHERE username = ?').get(username);
|
|
309
|
+
if (!r)
|
|
310
|
+
return null;
|
|
311
|
+
return {
|
|
312
|
+
userId: r.user_id, username: r.username, email: r.email, status: r.status,
|
|
313
|
+
accessGroupId: r.access_group_id, forcePasswordChange: !!r.force_password_change,
|
|
314
|
+
createdAt: r.created_at, lastLogin: r.last_login || undefined, passwordHash: r.password_hash,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
export function createUser(username, email, password, accessGroupId) {
|
|
318
|
+
const d = getAdminDb();
|
|
319
|
+
const userId = 'user-' + crypto.randomUUID().slice(0, 8);
|
|
320
|
+
const now = new Date().toISOString();
|
|
321
|
+
const hash = hashPassword(password);
|
|
322
|
+
d.prepare(`INSERT INTO users (user_id, username, email, password_hash, status, access_group_id, force_password_change, created_at)
|
|
323
|
+
VALUES (?, ?, ?, ?, 'ACTIVE', ?, 1, ?)`).run(userId, username, email, hash, accessGroupId, now);
|
|
324
|
+
return { userId, username, email, status: 'ACTIVE', accessGroupId, forcePasswordChange: true, createdAt: now };
|
|
325
|
+
}
|
|
326
|
+
export function updateUserStatus(userId, status) {
|
|
327
|
+
const d = getAdminDb();
|
|
328
|
+
d.prepare('UPDATE users SET status = ? WHERE user_id = ?').run(status, userId);
|
|
329
|
+
if (status === 'DISABLED') {
|
|
330
|
+
return invalidateUserSessions(userId);
|
|
331
|
+
}
|
|
332
|
+
return 0;
|
|
333
|
+
}
|
|
334
|
+
export function deleteUser(userId) {
|
|
335
|
+
const d = getAdminDb();
|
|
336
|
+
const user = d.prepare('SELECT username FROM users WHERE user_id = ?').get(userId);
|
|
337
|
+
if (user?.username === 'admin')
|
|
338
|
+
throw new Error('Cannot delete system admin');
|
|
339
|
+
invalidateUserSessions(userId);
|
|
340
|
+
d.prepare('DELETE FROM users WHERE user_id = ?').run(userId);
|
|
341
|
+
}
|
|
342
|
+
export function resetUserPassword(userId) {
|
|
343
|
+
const d = getAdminDb();
|
|
344
|
+
const tempPwd = crypto.randomBytes(6).toString('base64url');
|
|
345
|
+
const hash = hashPassword(tempPwd);
|
|
346
|
+
d.prepare('UPDATE users SET password_hash = ?, force_password_change = 1 WHERE user_id = ?').run(hash, userId);
|
|
347
|
+
return tempPwd;
|
|
348
|
+
}
|
|
349
|
+
export function changePassword(userId, newPassword) {
|
|
350
|
+
const d = getAdminDb();
|
|
351
|
+
const hash = hashPassword(newPassword);
|
|
352
|
+
d.prepare('UPDATE users SET password_hash = ?, force_password_change = 0 WHERE user_id = ?').run(hash, userId);
|
|
353
|
+
}
|
|
354
|
+
export function updateLastLogin(userId) {
|
|
355
|
+
const d = getAdminDb();
|
|
356
|
+
d.prepare('UPDATE users SET last_login = ? WHERE user_id = ?').run(new Date().toISOString(), userId);
|
|
357
|
+
}
|
|
358
|
+
// --- RBAC Group Operations ---
|
|
359
|
+
export function getGroups() {
|
|
360
|
+
const d = getAdminDb();
|
|
361
|
+
const groups = d.prepare('SELECT * FROM access_groups ORDER BY is_system_group DESC, access_group_name ASC').all();
|
|
362
|
+
const permStmt = d.prepare('SELECT permission_id, role_data FROM group_permissions WHERE access_group_id = ?');
|
|
363
|
+
return groups.map(g => {
|
|
364
|
+
const perms = permStmt.all(g.access_group_id);
|
|
365
|
+
return {
|
|
366
|
+
accessGroupId: g.access_group_id,
|
|
367
|
+
accessGroupName: g.access_group_name,
|
|
368
|
+
isSystemGroup: !!g.is_system_group,
|
|
369
|
+
permissions: perms.map(p => ({ permissionId: p.permission_id, roleData: JSON.parse(p.role_data || '{}') })),
|
|
370
|
+
createdAt: g.created_at,
|
|
371
|
+
updatedAt: g.updated_at,
|
|
372
|
+
};
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
export function getGroupById(groupId) {
|
|
376
|
+
const d = getAdminDb();
|
|
377
|
+
const g = d.prepare('SELECT * FROM access_groups WHERE access_group_id = ?').get(groupId);
|
|
378
|
+
if (!g)
|
|
379
|
+
return null;
|
|
380
|
+
const perms = d.prepare('SELECT permission_id, role_data FROM group_permissions WHERE access_group_id = ?').all(groupId);
|
|
381
|
+
return {
|
|
382
|
+
accessGroupId: g.access_group_id, accessGroupName: g.access_group_name,
|
|
383
|
+
isSystemGroup: !!g.is_system_group,
|
|
384
|
+
permissions: perms.map(p => ({ permissionId: p.permission_id, roleData: JSON.parse(p.role_data || '{}') })),
|
|
385
|
+
createdAt: g.created_at, updatedAt: g.updated_at,
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
export function createGroup(name, permissions) {
|
|
389
|
+
const d = getAdminDb();
|
|
390
|
+
const id = 'grp-' + crypto.randomUUID().slice(0, 8);
|
|
391
|
+
const now = new Date().toISOString();
|
|
392
|
+
d.prepare('INSERT INTO access_groups (access_group_id, access_group_name, is_system_group, created_at, updated_at) VALUES (?, ?, 0, ?, ?)').run(id, name, now, now);
|
|
393
|
+
const insertPerm = d.prepare('INSERT INTO group_permissions (access_group_id, permission_id, role_data) VALUES (?, ?, ?)');
|
|
394
|
+
for (const p of permissions) {
|
|
395
|
+
insertPerm.run(id, p.permissionId, JSON.stringify(p.roleData || {}));
|
|
396
|
+
}
|
|
397
|
+
return { accessGroupId: id, accessGroupName: name, isSystemGroup: false, permissions, createdAt: now, updatedAt: now };
|
|
398
|
+
}
|
|
399
|
+
export function updateGroup(groupId, name, permissions) {
|
|
400
|
+
const d = getAdminDb();
|
|
401
|
+
const existing = d.prepare('SELECT * FROM access_groups WHERE access_group_id = ?').get(groupId);
|
|
402
|
+
if (!existing)
|
|
403
|
+
throw new Error('Group not found');
|
|
404
|
+
const now = new Date().toISOString();
|
|
405
|
+
if (name) {
|
|
406
|
+
d.prepare('UPDATE access_groups SET access_group_name = ?, updated_at = ? WHERE access_group_id = ?').run(name, now, groupId);
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
d.prepare('UPDATE access_groups SET updated_at = ? WHERE access_group_id = ?').run(now, groupId);
|
|
410
|
+
}
|
|
411
|
+
d.prepare('DELETE FROM group_permissions WHERE access_group_id = ?').run(groupId);
|
|
412
|
+
const insertPerm = d.prepare('INSERT INTO group_permissions (access_group_id, permission_id, role_data) VALUES (?, ?, ?)');
|
|
413
|
+
for (const p of permissions) {
|
|
414
|
+
insertPerm.run(groupId, p.permissionId, JSON.stringify(p.roleData || {}));
|
|
415
|
+
}
|
|
416
|
+
return getGroupById(groupId);
|
|
417
|
+
}
|
|
418
|
+
export function deleteGroup(groupId) {
|
|
419
|
+
const d = getAdminDb();
|
|
420
|
+
const g = d.prepare('SELECT is_system_group FROM access_groups WHERE access_group_id = ?').get(groupId);
|
|
421
|
+
if (!g)
|
|
422
|
+
throw new Error('Group not found');
|
|
423
|
+
if (g.is_system_group)
|
|
424
|
+
throw new Error('Cannot delete system group');
|
|
425
|
+
const usersInGroup = d.prepare('SELECT COUNT(*) as cnt FROM users WHERE access_group_id = ?').get(groupId);
|
|
426
|
+
if (usersInGroup.cnt > 0)
|
|
427
|
+
throw new Error('Cannot delete group with assigned users');
|
|
428
|
+
d.prepare('DELETE FROM access_groups WHERE access_group_id = ?').run(groupId);
|
|
429
|
+
}
|
|
430
|
+
// --- User Permissions ---
|
|
431
|
+
export function getUserPermissions(userId) {
|
|
432
|
+
const d = getAdminDb();
|
|
433
|
+
const user = d.prepare('SELECT access_group_id FROM users WHERE user_id = ?').get(userId);
|
|
434
|
+
if (!user)
|
|
435
|
+
return [];
|
|
436
|
+
const perms = d.prepare('SELECT permission_id, role_data FROM group_permissions WHERE access_group_id = ?').all(user.access_group_id);
|
|
437
|
+
return perms.map(p => ({ permissionId: p.permission_id, roleData: JSON.parse(p.role_data || '{}') }));
|
|
438
|
+
}
|
|
439
|
+
// --- Audit Operations ---
|
|
440
|
+
export function recordAudit(userId, username, action, resource, resourceId, changes, ip) {
|
|
441
|
+
const d = getAdminDb();
|
|
442
|
+
const auditId = 'aud-' + crypto.randomUUID().slice(0, 8);
|
|
443
|
+
d.prepare(`INSERT INTO audit_log (audit_id, user_id, username, action, resource, resource_id, changes, timestamp, ip_address)
|
|
444
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(auditId, userId, username, action, resource, resourceId || '', changes || '', new Date().toISOString(), ip || '');
|
|
445
|
+
}
|
|
446
|
+
export function getAuditLogs(filters, page = 1, pageSize = 50) {
|
|
447
|
+
const d = getAdminDb();
|
|
448
|
+
let where = 'WHERE 1=1';
|
|
449
|
+
const params = [];
|
|
450
|
+
if (filters?.userId) {
|
|
451
|
+
where += ' AND user_id = ?';
|
|
452
|
+
params.push(filters.userId);
|
|
453
|
+
}
|
|
454
|
+
if (filters?.action) {
|
|
455
|
+
where += ' AND action = ?';
|
|
456
|
+
params.push(filters.action);
|
|
457
|
+
}
|
|
458
|
+
if (filters?.dateFrom) {
|
|
459
|
+
where += ' AND timestamp >= ?';
|
|
460
|
+
params.push(filters.dateFrom);
|
|
461
|
+
}
|
|
462
|
+
if (filters?.dateTo) {
|
|
463
|
+
where += ' AND timestamp <= ?';
|
|
464
|
+
params.push(filters.dateTo);
|
|
465
|
+
}
|
|
466
|
+
const total = d.prepare(`SELECT COUNT(*) as cnt FROM audit_log ${where}`).get(...params).cnt;
|
|
467
|
+
const rows = d.prepare(`SELECT * FROM audit_log ${where} ORDER BY timestamp DESC LIMIT ? OFFSET ?`).all(...params, pageSize, (page - 1) * pageSize);
|
|
468
|
+
return {
|
|
469
|
+
total,
|
|
470
|
+
items: rows.map(r => ({
|
|
471
|
+
auditId: r.audit_id, userId: r.user_id, username: r.username,
|
|
472
|
+
action: r.action, resource: r.resource, resourceId: r.resource_id,
|
|
473
|
+
changes: r.changes, timestamp: r.timestamp, ipAddress: r.ip_address,
|
|
474
|
+
})),
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
// --- Session listing ---
|
|
478
|
+
export function getUserSessions(userId) {
|
|
479
|
+
const d = getAdminDb();
|
|
480
|
+
const rows = d.prepare('SELECT * FROM sessions WHERE user_id = ? AND is_active = 1 ORDER BY login_at DESC').all(userId);
|
|
481
|
+
return rows.map(r => ({
|
|
482
|
+
sessionId: r.session_id, userId: r.user_id,
|
|
483
|
+
device: r.device, ipAddress: r.ip_address, loginAt: r.login_at,
|
|
484
|
+
expiresAt: r.expires_at, isActive: !!r.is_active,
|
|
485
|
+
}));
|
|
486
|
+
}
|
|
487
|
+
export function recordConfigChange(section, key, oldValue, newValue, changedBy, requiresRestart) {
|
|
488
|
+
const d = getAdminDb();
|
|
489
|
+
d.prepare(`INSERT INTO config_changes (section, key, old_value, new_value, changed_by, changed_at, requires_restart) VALUES (?, ?, ?, ?, ?, ?, ?)`).run(section, key, oldValue, newValue, changedBy, new Date().toISOString(), requiresRestart ? 1 : 0);
|
|
490
|
+
// Keep only last 50 entries
|
|
491
|
+
d.prepare(`DELETE FROM config_changes WHERE id NOT IN (SELECT id FROM config_changes ORDER BY changed_at DESC LIMIT 50)`).run();
|
|
492
|
+
}
|
|
493
|
+
export function getConfigChanges(limit = 10) {
|
|
494
|
+
const d = getAdminDb();
|
|
495
|
+
const rows = d.prepare('SELECT * FROM config_changes ORDER BY changed_at DESC LIMIT ?').all(limit);
|
|
496
|
+
return rows.map(r => ({
|
|
497
|
+
id: r.id,
|
|
498
|
+
section: r.section,
|
|
499
|
+
key: r.key,
|
|
500
|
+
oldValue: r.old_value,
|
|
501
|
+
newValue: r.new_value,
|
|
502
|
+
changedBy: r.changed_by,
|
|
503
|
+
changedAt: r.changed_at,
|
|
504
|
+
requiresRestart: !!r.requires_restart,
|
|
505
|
+
}));
|
|
506
|
+
}
|
|
507
|
+
// --- Query Logs (STORY 4 — real query tracking) ---
|
|
508
|
+
export function initQueryLogsTable() {
|
|
509
|
+
const d = getAdminDb();
|
|
510
|
+
d.exec(`
|
|
511
|
+
CREATE TABLE IF NOT EXISTS query_logs (
|
|
512
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
513
|
+
query TEXT NOT NULL,
|
|
514
|
+
timestamp TEXT NOT NULL,
|
|
515
|
+
response_time_ms INTEGER NOT NULL,
|
|
516
|
+
result_count INTEGER NOT NULL DEFAULT 0,
|
|
517
|
+
user_id TEXT NOT NULL DEFAULT ''
|
|
518
|
+
);
|
|
519
|
+
CREATE INDEX IF NOT EXISTS idx_query_logs_timestamp ON query_logs(timestamp);
|
|
520
|
+
`);
|
|
521
|
+
// Migration: add user_id column if table already existed without it
|
|
522
|
+
try {
|
|
523
|
+
d.exec(`ALTER TABLE query_logs ADD COLUMN user_id TEXT NOT NULL DEFAULT ''`);
|
|
524
|
+
}
|
|
525
|
+
catch { /* column already exists */ }
|
|
526
|
+
// Create index on user_id (after migration ensures column exists)
|
|
527
|
+
d.exec(`CREATE INDEX IF NOT EXISTS idx_query_logs_user_id ON query_logs(user_id);`);
|
|
528
|
+
}
|
|
529
|
+
export function recordQueryLog(query, responseTimeMs, resultCount, userId = '') {
|
|
530
|
+
const d = getAdminDb();
|
|
531
|
+
initQueryLogsTable();
|
|
532
|
+
d.prepare('INSERT INTO query_logs (query, timestamp, response_time_ms, result_count, user_id) VALUES (?, ?, ?, ?, ?)').run(query, new Date().toISOString(), responseTimeMs, resultCount, userId);
|
|
533
|
+
}
|
|
534
|
+
export function getQueryLogs(days = 14, userId) {
|
|
535
|
+
const d = getAdminDb();
|
|
536
|
+
initQueryLogsTable();
|
|
537
|
+
const since = new Date(Date.now() - days * 86400000).toISOString();
|
|
538
|
+
let sql = `
|
|
539
|
+
SELECT
|
|
540
|
+
substr(timestamp, 1, 10) as date,
|
|
541
|
+
COUNT(*) as queries,
|
|
542
|
+
CAST(AVG(response_time_ms) AS INTEGER) as avg_response_time
|
|
543
|
+
FROM query_logs
|
|
544
|
+
WHERE timestamp >= ?`;
|
|
545
|
+
const params = [since];
|
|
546
|
+
if (userId) {
|
|
547
|
+
sql += ' AND user_id = ?';
|
|
548
|
+
params.push(userId);
|
|
549
|
+
}
|
|
550
|
+
sql += `
|
|
551
|
+
GROUP BY substr(timestamp, 1, 10)
|
|
552
|
+
ORDER BY date ASC`;
|
|
553
|
+
const rows = d.prepare(sql).all(...params);
|
|
554
|
+
return rows.map(r => ({ date: r.date, queries: r.queries, avgResponseTime: r.avg_response_time }));
|
|
555
|
+
}
|
|
556
|
+
export function getQueryLogStats(userId) {
|
|
557
|
+
const d = getAdminDb();
|
|
558
|
+
initQueryLogsTable();
|
|
559
|
+
const userFilter = userId ? ' WHERE user_id = ?' : '';
|
|
560
|
+
const userFilterAnd = userId ? ' AND user_id = ?' : '';
|
|
561
|
+
const totalParams = userId ? [userId] : [];
|
|
562
|
+
const total = d.prepare(`SELECT COUNT(*) as cnt, CAST(AVG(response_time_ms) AS INTEGER) as avg FROM query_logs${userFilter}`).get(...totalParams);
|
|
563
|
+
const since24h = new Date(Date.now() - 86400000).toISOString();
|
|
564
|
+
const last24hParams = userId ? [since24h, userId] : [since24h];
|
|
565
|
+
const last24h = d.prepare(`SELECT COUNT(*) as cnt FROM query_logs WHERE timestamp >= ?${userFilterAnd}`).get(...last24hParams).cnt;
|
|
566
|
+
return { totalQueries: total.cnt || 0, avgResponseTime: total.avg || 0, queriesLast24h: last24h || 0 };
|
|
567
|
+
}
|
|
568
|
+
// --- Promotion Cooldown (STORY 11 — 7-day cooldown after rejection) ---
|
|
569
|
+
export function initPromotionCooldownTable() {
|
|
570
|
+
const d = getAdminDb();
|
|
571
|
+
d.exec(`
|
|
572
|
+
CREATE TABLE IF NOT EXISTS promotion_cooldowns (
|
|
573
|
+
entry_id TEXT NOT NULL,
|
|
574
|
+
cooldown_until TEXT NOT NULL,
|
|
575
|
+
rejected_at TEXT NOT NULL,
|
|
576
|
+
rejected_by TEXT NOT NULL DEFAULT ''
|
|
577
|
+
);
|
|
578
|
+
CREATE INDEX IF NOT EXISTS idx_promo_cooldown_entry ON promotion_cooldowns(entry_id);
|
|
579
|
+
`);
|
|
580
|
+
}
|
|
581
|
+
export function setPromotionCooldown(entryId, rejectedBy) {
|
|
582
|
+
const d = getAdminDb();
|
|
583
|
+
initPromotionCooldownTable();
|
|
584
|
+
const cooldownUntil = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString();
|
|
585
|
+
d.prepare('INSERT INTO promotion_cooldowns (entry_id, cooldown_until, rejected_at, rejected_by) VALUES (?, ?, ?, ?)').run(entryId, cooldownUntil, new Date().toISOString(), rejectedBy);
|
|
586
|
+
}
|
|
587
|
+
export function checkPromotionCooldown(entryId) {
|
|
588
|
+
const d = getAdminDb();
|
|
589
|
+
initPromotionCooldownTable();
|
|
590
|
+
const now = new Date().toISOString();
|
|
591
|
+
const row = d.prepare('SELECT cooldown_until FROM promotion_cooldowns WHERE entry_id = ? AND cooldown_until > ? ORDER BY cooldown_until DESC LIMIT 1').get(entryId, now);
|
|
592
|
+
if (row)
|
|
593
|
+
return { onCooldown: true, cooldownUntil: row.cooldown_until };
|
|
594
|
+
return { onCooldown: false };
|
|
595
|
+
}
|
|
596
|
+
// --- KB search with real index.db data (STORY 9) ---
|
|
597
|
+
export function searchKbEntries(query) {
|
|
598
|
+
try {
|
|
599
|
+
const indexDbPath = getIndexDbPath();
|
|
600
|
+
if (!fs.existsSync(indexDbPath))
|
|
601
|
+
return { items: [], total: 0 };
|
|
602
|
+
const indexDb = new Database(indexDbPath, { readonly: true });
|
|
603
|
+
// Check for knowledge_entries table (actual table name in index.db)
|
|
604
|
+
const tableExists = indexDb.prepare("SELECT COUNT(*) as cnt FROM sqlite_master WHERE type='table' AND name='knowledge_entries'").get();
|
|
605
|
+
if (!tableExists || tableExists.cnt === 0) {
|
|
606
|
+
indexDb.close();
|
|
607
|
+
return { items: [], total: 0 };
|
|
608
|
+
}
|
|
609
|
+
// Tokenize query into words for TF-IDF scoring
|
|
610
|
+
const queryTerms = query.toLowerCase().split(/\s+/).filter(t => t.length > 1);
|
|
611
|
+
if (queryTerms.length === 0) {
|
|
612
|
+
indexDb.close();
|
|
613
|
+
return { items: [], total: 0 };
|
|
614
|
+
}
|
|
615
|
+
// Get total document count for IDF calculation
|
|
616
|
+
const totalDocs = indexDb.prepare('SELECT COUNT(*) as cnt FROM knowledge_entries').get().cnt;
|
|
617
|
+
// Use LIKE to get candidate rows matching any query term
|
|
618
|
+
const searchCols = ['content', 'source', 'summary', 'tags'];
|
|
619
|
+
const likeClauses = [];
|
|
620
|
+
const likeParams = [];
|
|
621
|
+
for (const term of queryTerms) {
|
|
622
|
+
for (const col of searchCols) {
|
|
623
|
+
likeClauses.push(`${col} LIKE ?`);
|
|
624
|
+
likeParams.push(`%${term}%`);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
const sql = `SELECT * FROM knowledge_entries WHERE ${likeClauses.join(' OR ')} LIMIT 200`;
|
|
628
|
+
const rows = indexDb.prepare(sql).all(...likeParams);
|
|
629
|
+
// Calculate document frequency for each query term across candidates
|
|
630
|
+
const termDocFreq = {};
|
|
631
|
+
for (const term of queryTerms) {
|
|
632
|
+
let docCount = 0;
|
|
633
|
+
for (const row of rows) {
|
|
634
|
+
const text = `${row.content || ''} ${row.source || ''} ${row.summary || ''} ${row.tags || ''}`.toLowerCase();
|
|
635
|
+
if (text.includes(term))
|
|
636
|
+
docCount++;
|
|
637
|
+
}
|
|
638
|
+
termDocFreq[term] = docCount;
|
|
639
|
+
}
|
|
640
|
+
// Score each row using TF-IDF + keyword/recency/quality bonuses
|
|
641
|
+
const now = Date.now();
|
|
642
|
+
const scoredRows = rows.map((row) => {
|
|
643
|
+
const fields = {
|
|
644
|
+
content: (row.content || '').toLowerCase(),
|
|
645
|
+
source: (row.source || '').toLowerCase(),
|
|
646
|
+
summary: (row.summary || '').toLowerCase(),
|
|
647
|
+
tags: (row.tags || '').toLowerCase(),
|
|
648
|
+
};
|
|
649
|
+
const fullText = `${fields.content} ${fields.source} ${fields.summary} ${fields.tags}`;
|
|
650
|
+
const totalWords = fullText.split(/\s+/).length || 1;
|
|
651
|
+
// TF-IDF score
|
|
652
|
+
let tfidfScore = 0;
|
|
653
|
+
for (const term of queryTerms) {
|
|
654
|
+
const escaped = term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
655
|
+
const regex = new RegExp(escaped, 'gi');
|
|
656
|
+
const occurrences = (fullText.match(regex) || []).length;
|
|
657
|
+
const tf = occurrences / totalWords;
|
|
658
|
+
const df = termDocFreq[term] || 1;
|
|
659
|
+
const idf = Math.log((totalDocs + 1) / (df + 1)) + 1;
|
|
660
|
+
tfidfScore += tf * idf;
|
|
661
|
+
}
|
|
662
|
+
// Normalize TF-IDF to 0-1 (empirical cap)
|
|
663
|
+
const normalizedTfidf = Math.min(tfidfScore * 100, 1.0);
|
|
664
|
+
// Keyword bonus: exact term in source/summary = high relevance
|
|
665
|
+
let keywordBonus = 0;
|
|
666
|
+
for (const term of queryTerms) {
|
|
667
|
+
if (fields.source.includes(term))
|
|
668
|
+
keywordBonus += 0.15;
|
|
669
|
+
if (fields.summary.includes(term))
|
|
670
|
+
keywordBonus += 0.1;
|
|
671
|
+
if (fields.tags.includes(term))
|
|
672
|
+
keywordBonus += 0.05;
|
|
673
|
+
}
|
|
674
|
+
keywordBonus = Math.min(keywordBonus, 0.3);
|
|
675
|
+
// Recency bonus: last 7 days = +0.2, last 30 days = +0.1
|
|
676
|
+
let recencyBonus = 0;
|
|
677
|
+
const createdAt = row.created_at ? new Date(row.created_at).getTime() : 0;
|
|
678
|
+
const ageDays = (now - createdAt) / (1000 * 60 * 60 * 24);
|
|
679
|
+
if (ageDays <= 7)
|
|
680
|
+
recencyBonus = 0.2;
|
|
681
|
+
else if (ageDays <= 30)
|
|
682
|
+
recencyBonus = 0.1;
|
|
683
|
+
// Quality bonus from entry's quality_score or confidence
|
|
684
|
+
const qualityRaw = row.quality_score != null ? row.quality_score / 100 : (row.confidence || 0);
|
|
685
|
+
const qualityBonus = qualityRaw * 0.1;
|
|
686
|
+
const totalScore = normalizedTfidf + keywordBonus + recencyBonus + qualityBonus;
|
|
687
|
+
const finalScore = Math.min(+totalScore.toFixed(3), 1.0);
|
|
688
|
+
return {
|
|
689
|
+
...row,
|
|
690
|
+
score: finalScore,
|
|
691
|
+
scores: {
|
|
692
|
+
similarity: +normalizedTfidf.toFixed(3),
|
|
693
|
+
keyword: +keywordBonus.toFixed(3),
|
|
694
|
+
recency: +recencyBonus.toFixed(3),
|
|
695
|
+
quality: +qualityBonus.toFixed(3),
|
|
696
|
+
},
|
|
697
|
+
};
|
|
698
|
+
});
|
|
699
|
+
// Sort by score descending
|
|
700
|
+
scoredRows.sort((a, b) => b.score - a.score);
|
|
701
|
+
indexDb.close();
|
|
702
|
+
return { items: scoredRows.slice(0, 50), total: scoredRows.length };
|
|
703
|
+
}
|
|
704
|
+
catch {
|
|
705
|
+
return { items: [], total: 0 };
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
// --- KB Embedding space from real vectors (STORY 4) ---
|
|
709
|
+
export function getKbEmbeddings(limit = 100) {
|
|
710
|
+
try {
|
|
711
|
+
const indexDbPath = getIndexDbPath();
|
|
712
|
+
if (!fs.existsSync(indexDbPath))
|
|
713
|
+
return { items: [], hasRealData: false };
|
|
714
|
+
const indexDb = new Database(indexDbPath, { readonly: true });
|
|
715
|
+
// Check knowledge_entries table exists
|
|
716
|
+
const tableExists = indexDb.prepare("SELECT COUNT(*) as cnt FROM sqlite_master WHERE type='table' AND name='knowledge_entries'").get();
|
|
717
|
+
if (!tableExists || tableExists.cnt === 0) {
|
|
718
|
+
indexDb.close();
|
|
719
|
+
return { items: [], hasRealData: false };
|
|
720
|
+
}
|
|
721
|
+
// Check if knowledge_vectors table exists (separate table for embeddings)
|
|
722
|
+
const vectorsExist = indexDb.prepare("SELECT COUNT(*) as cnt FROM sqlite_master WHERE type='table' AND name='knowledge_vectors'").get();
|
|
723
|
+
if (vectorsExist && vectorsExist.cnt > 0) {
|
|
724
|
+
// Join knowledge_entries with knowledge_vectors for real embedding-based projection
|
|
725
|
+
const rows = indexDb.prepare(`
|
|
726
|
+
SELECT e.id, e.source, e.summary, e.type, e.tier, v.vector
|
|
727
|
+
FROM knowledge_entries e
|
|
728
|
+
INNER JOIN knowledge_vectors v ON v.entry_id = e.id
|
|
729
|
+
WHERE v.vector IS NOT NULL
|
|
730
|
+
ORDER BY e.created_at DESC
|
|
731
|
+
LIMIT ?
|
|
732
|
+
`).all(limit);
|
|
733
|
+
if (rows.length > 0) {
|
|
734
|
+
const items = rows.map((row, i) => {
|
|
735
|
+
let x = 0, y = 0;
|
|
736
|
+
try {
|
|
737
|
+
let embedding = [];
|
|
738
|
+
if (typeof row.vector === 'string') {
|
|
739
|
+
embedding = JSON.parse(row.vector);
|
|
740
|
+
}
|
|
741
|
+
else if (Buffer.isBuffer(row.vector)) {
|
|
742
|
+
const buf = row.vector;
|
|
743
|
+
const floats = new Float32Array(buf.buffer, buf.byteOffset, buf.length / 4);
|
|
744
|
+
embedding = Array.from(floats);
|
|
745
|
+
}
|
|
746
|
+
if (embedding.length >= 2) {
|
|
747
|
+
// PCA-like 2D projection: split vector in half, average each half
|
|
748
|
+
const half = Math.floor(embedding.length / 2);
|
|
749
|
+
let sumX = 0, sumY = 0;
|
|
750
|
+
for (let j = 0; j < half; j++) {
|
|
751
|
+
sumX += embedding[j];
|
|
752
|
+
sumY += embedding[j + half];
|
|
753
|
+
}
|
|
754
|
+
x = sumX / half;
|
|
755
|
+
y = sumY / half;
|
|
756
|
+
// Normalize to 0-1
|
|
757
|
+
x = +((x + 1) / 2).toFixed(3);
|
|
758
|
+
y = +((y + 1) / 2).toFixed(3);
|
|
759
|
+
x = Math.max(0, Math.min(1, x));
|
|
760
|
+
y = Math.max(0, Math.min(1, y));
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
catch {
|
|
764
|
+
// Fallback: hash-based from content
|
|
765
|
+
const content = row.source || row.summary || '';
|
|
766
|
+
let h1 = 0, h2 = 0;
|
|
767
|
+
for (let j = 0; j < content.length; j++) {
|
|
768
|
+
h1 = (h1 * 31 + content.charCodeAt(j)) & 0x7fffffff;
|
|
769
|
+
h2 = (h2 * 37 + content.charCodeAt(j)) & 0x7fffffff;
|
|
770
|
+
}
|
|
771
|
+
x = +((h1 % 1000) / 1000).toFixed(3);
|
|
772
|
+
y = +((h2 % 1000) / 1000).toFixed(3);
|
|
773
|
+
}
|
|
774
|
+
return {
|
|
775
|
+
id: String(row.id),
|
|
776
|
+
label: row.source || row.summary || `Entry ${i + 1}`,
|
|
777
|
+
x, y,
|
|
778
|
+
type: row.type || 'document',
|
|
779
|
+
};
|
|
780
|
+
});
|
|
781
|
+
indexDb.close();
|
|
782
|
+
return { items, hasRealData: true };
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
// Fallback: no vectors table or no vector data — use hash-based projection from entries
|
|
786
|
+
const rows = indexDb.prepare('SELECT id, source, summary, type, content FROM knowledge_entries ORDER BY created_at DESC LIMIT ?').all(limit);
|
|
787
|
+
indexDb.close();
|
|
788
|
+
if (rows.length === 0)
|
|
789
|
+
return { items: [], hasRealData: false };
|
|
790
|
+
const items = rows.map((row, i) => {
|
|
791
|
+
const content = row.content || row.source || row.summary || '';
|
|
792
|
+
let h1 = 0, h2 = 0;
|
|
793
|
+
for (let j = 0; j < content.length; j++) {
|
|
794
|
+
h1 = (h1 * 31 + content.charCodeAt(j)) & 0x7fffffff;
|
|
795
|
+
h2 = (h2 * 37 + content.charCodeAt(j)) & 0x7fffffff;
|
|
796
|
+
}
|
|
797
|
+
return {
|
|
798
|
+
id: String(row.id),
|
|
799
|
+
label: row.source || row.summary || `Entry ${i + 1}`,
|
|
800
|
+
x: +((h1 % 1000) / 1000).toFixed(3),
|
|
801
|
+
y: +((h2 % 1000) / 1000).toFixed(3),
|
|
802
|
+
type: row.type || 'document',
|
|
803
|
+
};
|
|
804
|
+
});
|
|
805
|
+
return { items, hasRealData: true };
|
|
806
|
+
}
|
|
807
|
+
catch {
|
|
808
|
+
return { items: [], hasRealData: false };
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
// --- KB single entry by ID (STORY 3 — graph node click detail) ---
|
|
812
|
+
export function getKbEntryById(entryId) {
|
|
813
|
+
try {
|
|
814
|
+
const indexDbPath = getIndexDbPath();
|
|
815
|
+
if (!fs.existsSync(indexDbPath))
|
|
816
|
+
return null;
|
|
817
|
+
const indexDb = new Database(indexDbPath, { readonly: true });
|
|
818
|
+
const tableExists = indexDb.prepare("SELECT COUNT(*) as cnt FROM sqlite_master WHERE type='table' AND name='knowledge_entries'").get();
|
|
819
|
+
if (!tableExists || tableExists.cnt === 0) {
|
|
820
|
+
indexDb.close();
|
|
821
|
+
return null;
|
|
822
|
+
}
|
|
823
|
+
const row = indexDb.prepare('SELECT * FROM knowledge_entries WHERE id = ?').get(entryId);
|
|
824
|
+
indexDb.close();
|
|
825
|
+
return row || null;
|
|
826
|
+
}
|
|
827
|
+
catch {
|
|
828
|
+
return null;
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
// --- KB Entry Count (from index.db knowledge_entries table) ---
|
|
832
|
+
export function getKbEntryCount() {
|
|
833
|
+
try {
|
|
834
|
+
const indexDbPath = getIndexDbPath();
|
|
835
|
+
if (!fs.existsSync(indexDbPath))
|
|
836
|
+
return 0;
|
|
837
|
+
const indexDb = new Database(indexDbPath, { readonly: true });
|
|
838
|
+
const result = indexDb.prepare("SELECT COUNT(*) as cnt FROM sqlite_master WHERE type='table' AND name='knowledge_entries'").get();
|
|
839
|
+
if (!result || result.cnt === 0) {
|
|
840
|
+
indexDb.close();
|
|
841
|
+
return 0;
|
|
842
|
+
}
|
|
843
|
+
const count = indexDb.prepare('SELECT COUNT(*) as cnt FROM knowledge_entries').get().cnt;
|
|
844
|
+
indexDb.close();
|
|
845
|
+
return count;
|
|
846
|
+
}
|
|
847
|
+
catch {
|
|
848
|
+
return 0;
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
export function getKbEntries(page = 1, pageSize = 20, sortBy = 'created_at', sortDir = 'desc') {
|
|
852
|
+
try {
|
|
853
|
+
const indexDbPath = getIndexDbPath();
|
|
854
|
+
if (!fs.existsSync(indexDbPath))
|
|
855
|
+
return { items: [], total: 0 };
|
|
856
|
+
const indexDb = new Database(indexDbPath, { readonly: true });
|
|
857
|
+
// Check if knowledge_entries table exists
|
|
858
|
+
const tableExists = indexDb.prepare("SELECT COUNT(*) as cnt FROM sqlite_master WHERE type='table' AND name='knowledge_entries'").get();
|
|
859
|
+
if (!tableExists || tableExists.cnt === 0) {
|
|
860
|
+
indexDb.close();
|
|
861
|
+
return { items: [], total: 0 };
|
|
862
|
+
}
|
|
863
|
+
// Get column names to validate sortBy
|
|
864
|
+
const columns = indexDb.prepare("PRAGMA table_info(knowledge_entries)").all();
|
|
865
|
+
const validColumns = columns.map((c) => c.name);
|
|
866
|
+
const safeSort = validColumns.includes(sortBy) ? sortBy : 'created_at';
|
|
867
|
+
const safeDir = sortDir === 'asc' ? 'ASC' : 'DESC';
|
|
868
|
+
const total = indexDb.prepare('SELECT COUNT(*) as cnt FROM knowledge_entries').get().cnt;
|
|
869
|
+
const rows = indexDb.prepare(`SELECT * FROM knowledge_entries ORDER BY ${safeSort} ${safeDir} LIMIT ? OFFSET ?`).all(pageSize, (page - 1) * pageSize);
|
|
870
|
+
indexDb.close();
|
|
871
|
+
return { items: rows, total };
|
|
872
|
+
}
|
|
873
|
+
catch {
|
|
874
|
+
return { items: [], total: 0 };
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
// --- Recent Activity (last N audit entries) ---
|
|
878
|
+
export function getRecentActivity(limit = 10) {
|
|
879
|
+
const d = getAdminDb();
|
|
880
|
+
const rows = d.prepare('SELECT * FROM audit_log ORDER BY timestamp DESC LIMIT ?').all(limit);
|
|
881
|
+
return rows.map(r => ({
|
|
882
|
+
auditId: r.audit_id, userId: r.user_id, username: r.username,
|
|
883
|
+
action: r.action, resource: r.resource, resourceId: r.resource_id,
|
|
884
|
+
changes: r.changes, timestamp: r.timestamp, ipAddress: r.ip_address,
|
|
885
|
+
}));
|
|
886
|
+
}
|
|
887
|
+
// --- KB Tags Management ---
|
|
888
|
+
export function getAllKbTags() {
|
|
889
|
+
const tagCounts = {};
|
|
890
|
+
try {
|
|
891
|
+
const indexDbPath = getIndexDbPath();
|
|
892
|
+
if (!fs.existsSync(indexDbPath))
|
|
893
|
+
return tagCounts;
|
|
894
|
+
const indexDb = new Database(indexDbPath, { readonly: true });
|
|
895
|
+
const tableExists = indexDb.prepare("SELECT COUNT(*) as cnt FROM sqlite_master WHERE type='table' AND name='knowledge_entries'").get();
|
|
896
|
+
if (tableExists && tableExists.cnt > 0) {
|
|
897
|
+
const rows = indexDb.prepare("SELECT tags, created_at FROM knowledge_entries WHERE tags IS NOT NULL AND tags != ''").all();
|
|
898
|
+
for (const row of rows) {
|
|
899
|
+
if (!row.tags)
|
|
900
|
+
continue;
|
|
901
|
+
const tags = row.tags.split(',').map((t) => t.trim()).filter((t) => t.length > 0);
|
|
902
|
+
for (const tag of tags) {
|
|
903
|
+
if (!tagCounts[tag]) {
|
|
904
|
+
tagCounts[tag] = { count: 0, lastUsed: row.created_at || new Date().toISOString() };
|
|
905
|
+
}
|
|
906
|
+
tagCounts[tag].count++;
|
|
907
|
+
if (row.created_at && new Date(row.created_at) > new Date(tagCounts[tag].lastUsed)) {
|
|
908
|
+
tagCounts[tag].lastUsed = row.created_at;
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
indexDb.close();
|
|
914
|
+
}
|
|
915
|
+
catch (e) {
|
|
916
|
+
console.error('Error in getAllKbTags:', e);
|
|
917
|
+
}
|
|
918
|
+
return tagCounts;
|
|
919
|
+
}
|
|
920
|
+
export function updateKbEntryTags(entryId, tags) {
|
|
921
|
+
try {
|
|
922
|
+
const indexDbPath = getIndexDbPath();
|
|
923
|
+
if (!fs.existsSync(indexDbPath))
|
|
924
|
+
return;
|
|
925
|
+
const indexDb = new Database(indexDbPath);
|
|
926
|
+
const tableExists = indexDb.prepare("SELECT COUNT(*) as cnt FROM sqlite_master WHERE type='table' AND name='knowledge_entries'").get();
|
|
927
|
+
if (tableExists && tableExists.cnt > 0) {
|
|
928
|
+
const tagsStr = tags.join(',');
|
|
929
|
+
indexDb.prepare('UPDATE knowledge_entries SET tags = ? WHERE id = ?').run(tagsStr, entryId);
|
|
930
|
+
}
|
|
931
|
+
indexDb.close();
|
|
932
|
+
}
|
|
933
|
+
catch (e) {
|
|
934
|
+
console.error('Error in updateKbEntryTags:', e);
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
export function renameKbTag(oldName, newName) {
|
|
938
|
+
let renamed = 0;
|
|
939
|
+
try {
|
|
940
|
+
const indexDbPath = getIndexDbPath();
|
|
941
|
+
if (!fs.existsSync(indexDbPath))
|
|
942
|
+
return 0;
|
|
943
|
+
const indexDb = new Database(indexDbPath);
|
|
944
|
+
const tableExists = indexDb.prepare("SELECT COUNT(*) as cnt FROM sqlite_master WHERE type='table' AND name='knowledge_entries'").get();
|
|
945
|
+
if (tableExists && tableExists.cnt > 0) {
|
|
946
|
+
const rows = indexDb.prepare('SELECT id, tags FROM knowledge_entries WHERE tags LIKE ?').all(`%${oldName}%`);
|
|
947
|
+
const updateStmt = indexDb.prepare('UPDATE knowledge_entries SET tags = ? WHERE id = ?');
|
|
948
|
+
for (const row of rows) {
|
|
949
|
+
if (!row.tags)
|
|
950
|
+
continue;
|
|
951
|
+
const tagArr = row.tags.split(',').map((t) => t.trim()).filter((t) => t.length > 0);
|
|
952
|
+
const idx = tagArr.indexOf(oldName);
|
|
953
|
+
if (idx !== -1) {
|
|
954
|
+
tagArr[idx] = newName.trim();
|
|
955
|
+
updateStmt.run(tagArr.join(','), row.id);
|
|
956
|
+
renamed++;
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
indexDb.close();
|
|
961
|
+
}
|
|
962
|
+
catch (e) {
|
|
963
|
+
console.error('Error in renameKbTag:', e);
|
|
964
|
+
}
|
|
965
|
+
return renamed;
|
|
966
|
+
}
|
|
967
|
+
export function deleteKbTag(tagName) {
|
|
968
|
+
let removed = 0;
|
|
969
|
+
try {
|
|
970
|
+
const indexDbPath = getIndexDbPath();
|
|
971
|
+
if (!fs.existsSync(indexDbPath))
|
|
972
|
+
return 0;
|
|
973
|
+
const indexDb = new Database(indexDbPath);
|
|
974
|
+
const tableExists = indexDb.prepare("SELECT COUNT(*) as cnt FROM sqlite_master WHERE type='table' AND name='knowledge_entries'").get();
|
|
975
|
+
if (tableExists && tableExists.cnt > 0) {
|
|
976
|
+
const rows = indexDb.prepare('SELECT id, tags FROM knowledge_entries WHERE tags LIKE ?').all(`%${tagName}%`);
|
|
977
|
+
const updateStmt = indexDb.prepare('UPDATE knowledge_entries SET tags = ? WHERE id = ?');
|
|
978
|
+
for (const row of rows) {
|
|
979
|
+
if (!row.tags)
|
|
980
|
+
continue;
|
|
981
|
+
const tagArr = row.tags.split(',').map((t) => t.trim()).filter((t) => t.length > 0);
|
|
982
|
+
const idx = tagArr.indexOf(tagName);
|
|
983
|
+
if (idx !== -1) {
|
|
984
|
+
tagArr.splice(idx, 1);
|
|
985
|
+
updateStmt.run(tagArr.join(','), row.id);
|
|
986
|
+
removed++;
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
}
|
|
990
|
+
indexDb.close();
|
|
991
|
+
}
|
|
992
|
+
catch (e) {
|
|
993
|
+
console.error('Error in deleteKbTag:', e);
|
|
994
|
+
}
|
|
995
|
+
return removed;
|
|
996
|
+
}
|
|
997
|
+
export function mergeKbTags(sourceTag, targetTag) {
|
|
998
|
+
let merged = 0;
|
|
999
|
+
try {
|
|
1000
|
+
const indexDbPath = getIndexDbPath();
|
|
1001
|
+
if (!fs.existsSync(indexDbPath))
|
|
1002
|
+
return 0;
|
|
1003
|
+
const indexDb = new Database(indexDbPath);
|
|
1004
|
+
const tableExists = indexDb.prepare("SELECT COUNT(*) as cnt FROM sqlite_master WHERE type='table' AND name='knowledge_entries'").get();
|
|
1005
|
+
if (tableExists && tableExists.cnt > 0) {
|
|
1006
|
+
const rows = indexDb.prepare('SELECT id, tags FROM knowledge_entries WHERE tags LIKE ?').all(`%${sourceTag}%`);
|
|
1007
|
+
const updateStmt = indexDb.prepare('UPDATE knowledge_entries SET tags = ? WHERE id = ?');
|
|
1008
|
+
for (const row of rows) {
|
|
1009
|
+
if (!row.tags)
|
|
1010
|
+
continue;
|
|
1011
|
+
const tagArr = row.tags.split(',').map((t) => t.trim()).filter((t) => t.length > 0);
|
|
1012
|
+
const idx = tagArr.indexOf(sourceTag);
|
|
1013
|
+
if (idx !== -1) {
|
|
1014
|
+
tagArr.splice(idx, 1);
|
|
1015
|
+
if (!tagArr.includes(targetTag)) {
|
|
1016
|
+
tagArr.push(targetTag);
|
|
1017
|
+
}
|
|
1018
|
+
updateStmt.run(tagArr.join(','), row.id);
|
|
1019
|
+
merged++;
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
indexDb.close();
|
|
1024
|
+
}
|
|
1025
|
+
catch (e) {
|
|
1026
|
+
console.error('Error in mergeKbTags:', e);
|
|
1027
|
+
}
|
|
1028
|
+
return merged;
|
|
1029
|
+
}
|
|
1030
|
+
export function getKbEntriesByTag(tagName) {
|
|
1031
|
+
const entries = [];
|
|
1032
|
+
try {
|
|
1033
|
+
const indexDbPath = getIndexDbPath();
|
|
1034
|
+
if (!fs.existsSync(indexDbPath))
|
|
1035
|
+
return entries;
|
|
1036
|
+
const indexDb = new Database(indexDbPath, { readonly: true });
|
|
1037
|
+
const tableExists = indexDb.prepare("SELECT COUNT(*) as cnt FROM sqlite_master WHERE type='table' AND name='knowledge_entries'").get();
|
|
1038
|
+
if (tableExists && tableExists.cnt > 0) {
|
|
1039
|
+
const rows = indexDb.prepare('SELECT * FROM knowledge_entries WHERE tags LIKE ?').all(`%${tagName}%`);
|
|
1040
|
+
for (const row of rows) {
|
|
1041
|
+
if (!row.tags)
|
|
1042
|
+
continue;
|
|
1043
|
+
const tagArr = row.tags.split(',').map((t) => t.trim());
|
|
1044
|
+
if (tagArr.includes(tagName)) {
|
|
1045
|
+
entries.push(row);
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
}
|
|
1049
|
+
indexDb.close();
|
|
1050
|
+
}
|
|
1051
|
+
catch (e) {
|
|
1052
|
+
console.error('Error in getKbEntriesByTag:', e);
|
|
1053
|
+
}
|
|
1054
|
+
return entries;
|
|
1055
|
+
}
|
|
1056
|
+
//# sourceMappingURL=admin-db.js.map
|