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,1907 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat Panel Main Logic — KSA-210 + KSA-230 (Kiro-style)
|
|
3
|
+
* Handles message rendering, streaming, tool calls, context chips,
|
|
4
|
+
* model selector, autopilot toggle, attachments, and extension comms.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
(function () {
|
|
8
|
+
"use strict";
|
|
9
|
+
|
|
10
|
+
var vscode = acquireVsCodeApi();
|
|
11
|
+
window.__vscode = vscode;
|
|
12
|
+
|
|
13
|
+
// === DOM References ===
|
|
14
|
+
var messagesEl = document.getElementById("chat-messages");
|
|
15
|
+
var inputEl = document.getElementById("chat-input");
|
|
16
|
+
var sendBtn = document.getElementById("send-btn");
|
|
17
|
+
var statusEl = document.getElementById("status-indicator");
|
|
18
|
+
var welcomeEl = document.getElementById("welcome-state");
|
|
19
|
+
var workingBar = document.getElementById("working-bar");
|
|
20
|
+
var workingText = document.getElementById("working-text");
|
|
21
|
+
var cancelBtn = document.getElementById("cancel-btn");
|
|
22
|
+
var followBtn = document.getElementById("follow-btn");
|
|
23
|
+
var stopBtn = document.getElementById("stop-btn");
|
|
24
|
+
var ctxBtn = document.getElementById("ctx-btn");
|
|
25
|
+
var attachBtn = document.getElementById("attach-btn");
|
|
26
|
+
var modelBtn = document.getElementById("model-btn");
|
|
27
|
+
var modelLabel = document.getElementById("model-label");
|
|
28
|
+
var modelDropdown = document.getElementById("model-dropdown");
|
|
29
|
+
var contextMenu = document.getElementById("context-menu");
|
|
30
|
+
var autopilotToggle = document.getElementById("autopilot-toggle");
|
|
31
|
+
var inputChipsEl = document.getElementById("input-context-chips");
|
|
32
|
+
|
|
33
|
+
// === State ===
|
|
34
|
+
var streamingNodes = {};
|
|
35
|
+
var isStreaming = false;
|
|
36
|
+
var graphDone = false; // KSA-240: prevents working re-activation after completion
|
|
37
|
+
var hasMessages = false;
|
|
38
|
+
var currentModel = "auto";
|
|
39
|
+
var currentMode = "autopilot";
|
|
40
|
+
var contextItems = [];
|
|
41
|
+
var toolCalls = {};
|
|
42
|
+
var messageHistory = [];
|
|
43
|
+
var historyIndex = -1;
|
|
44
|
+
var pendingInput = "";
|
|
45
|
+
|
|
46
|
+
// === Tab State (KSA-240) ===
|
|
47
|
+
var defaultTabId = crypto.randomUUID();
|
|
48
|
+
var tabs = [{ id: defaultTabId, name: "Chat 1", messages: [], tokenCount: 0, maxTokens: 128000 }];
|
|
49
|
+
var activeTabId = defaultTabId;
|
|
50
|
+
var tabCounter = 1;
|
|
51
|
+
var MAX_TABS = 10;
|
|
52
|
+
var lastThreshold = "safe";
|
|
53
|
+
|
|
54
|
+
// === Tab DOM References (KSA-240) ===
|
|
55
|
+
var tabBar = document.getElementById("tab-bar");
|
|
56
|
+
var tabAddBtn = document.getElementById("tab-add-btn");
|
|
57
|
+
var contextUsageIcon = document.getElementById("context-usage-icon");
|
|
58
|
+
var contextTooltip = document.getElementById("context-tooltip");
|
|
59
|
+
var contextFullWarning = document.getElementById("context-full-warning");
|
|
60
|
+
var fullNewTabLink = document.getElementById("full-new-tab");
|
|
61
|
+
var contextToast = document.getElementById("context-toast");
|
|
62
|
+
var toastText = document.getElementById("toast-text");
|
|
63
|
+
var toastDismiss = document.getElementById("toast-dismiss");
|
|
64
|
+
|
|
65
|
+
// === Context Usage Icon Logic (KSA-240) ===
|
|
66
|
+
var ARC_CIRCUMFERENCE = 50.27; // 2*PI*8
|
|
67
|
+
|
|
68
|
+
function updateContextIcon(tokenCount, maxTokens) {
|
|
69
|
+
if (maxTokens <= 0) return;
|
|
70
|
+
var pct = Math.min(100, Math.round((tokenCount / maxTokens) * 100));
|
|
71
|
+
var offset = ARC_CIRCUMFERENCE - (ARC_CIRCUMFERENCE * pct / 100);
|
|
72
|
+
var arcEl = contextUsageIcon.querySelector(".arc-progress");
|
|
73
|
+
|
|
74
|
+
// Update arc
|
|
75
|
+
arcEl.setAttribute("stroke-dashoffset", offset.toString());
|
|
76
|
+
|
|
77
|
+
// Determine threshold
|
|
78
|
+
var ratio = pct / 100;
|
|
79
|
+
var threshold = "safe";
|
|
80
|
+
if (ratio >= 0.95) threshold = "full";
|
|
81
|
+
else if (ratio >= 0.80) threshold = "critical";
|
|
82
|
+
else if (ratio >= 0.60) threshold = "warning";
|
|
83
|
+
|
|
84
|
+
// Update color class
|
|
85
|
+
arcEl.className.baseVal = "arc-progress " + threshold;
|
|
86
|
+
|
|
87
|
+
// Tooltip
|
|
88
|
+
var formatted = tokenCount.toLocaleString() + " / " + maxTokens.toLocaleString() + " tokens (" + pct + "%)";
|
|
89
|
+
contextTooltip.textContent = formatted;
|
|
90
|
+
|
|
91
|
+
// Pulse animation when crossing 80% boundary
|
|
92
|
+
if (threshold === "critical" && lastThreshold !== "critical" && lastThreshold !== "full") {
|
|
93
|
+
contextUsageIcon.classList.add("pulse");
|
|
94
|
+
setTimeout(function() { contextUsageIcon.classList.remove("pulse"); }, 2000);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Notification toast at 95%
|
|
98
|
+
if (ratio >= 0.95 && lastThreshold !== "full") {
|
|
99
|
+
toastText.textContent = "Context usage at " + pct + "% \u2014 consider starting a new tab";
|
|
100
|
+
contextToast.classList.add("visible");
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Full warning in input area
|
|
104
|
+
if (ratio >= 1.0) {
|
|
105
|
+
contextFullWarning.classList.add("visible");
|
|
106
|
+
} else {
|
|
107
|
+
contextFullWarning.classList.remove("visible");
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
lastThreshold = threshold;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Toast dismiss
|
|
114
|
+
toastDismiss.addEventListener("click", function() {
|
|
115
|
+
contextToast.classList.remove("visible");
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// Full warning "new tab" link
|
|
119
|
+
fullNewTabLink.addEventListener("click", function() {
|
|
120
|
+
createNewTab();
|
|
121
|
+
contextFullWarning.classList.remove("visible");
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// === Tab Bar Logic (KSA-240) ===
|
|
125
|
+
function createNewTab() {
|
|
126
|
+
if (tabs.length >= MAX_TABS) return;
|
|
127
|
+
tabCounter++;
|
|
128
|
+
var newTab = { id: crypto.randomUUID(), name: "Chat " + tabCounter, messages: [], tokenCount: 0, maxTokens: 128000 };
|
|
129
|
+
tabs.push(newTab);
|
|
130
|
+
switchToTab(newTab.id);
|
|
131
|
+
renderTabBar();
|
|
132
|
+
saveStateToDisk();
|
|
133
|
+
vscode.postMessage({ type: "tab:create" });
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function switchToTab(tabId) {
|
|
137
|
+
if (tabId === activeTabId) return;
|
|
138
|
+
// Save current tab state
|
|
139
|
+
var current = getTab(activeTabId);
|
|
140
|
+
if (current) {
|
|
141
|
+
current.scrollPosition = messagesEl.scrollTop;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
activeTabId = tabId;
|
|
145
|
+
var tab = getTab(tabId);
|
|
146
|
+
|
|
147
|
+
// Clear message area and re-render target tab messages
|
|
148
|
+
messagesEl.innerHTML = "";
|
|
149
|
+
activeToolContainer = null; // Reset container on tab switch
|
|
150
|
+
if (tab && tab.messages && tab.messages.length > 0) {
|
|
151
|
+
showMessages();
|
|
152
|
+
for (var i = 0; i < tab.messages.length; i++) {
|
|
153
|
+
var msg = tab.messages[i];
|
|
154
|
+
if (msg.role === "tool" && msg.toolData) {
|
|
155
|
+
renderToolCall(msg.toolData, true);
|
|
156
|
+
} else {
|
|
157
|
+
finalizeToolContainer();
|
|
158
|
+
appendMessage(msg.role, msg.content, msg.nodeId);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
finalizeToolContainer();
|
|
162
|
+
// Restore scroll position
|
|
163
|
+
if (tab.scrollPosition) {
|
|
164
|
+
messagesEl.scrollTop = tab.scrollPosition;
|
|
165
|
+
}
|
|
166
|
+
} else {
|
|
167
|
+
// Empty tab — show welcome state
|
|
168
|
+
messagesEl.classList.add("hidden");
|
|
169
|
+
welcomeEl.classList.remove("hidden");
|
|
170
|
+
hasMessages = false;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (tab) {
|
|
174
|
+
// Update context icon for this tab
|
|
175
|
+
updateContextIcon(tab.tokenCount, tab.maxTokens);
|
|
176
|
+
lastThreshold = "safe"; // Reset to avoid false pulse
|
|
177
|
+
}
|
|
178
|
+
renderTabBar();
|
|
179
|
+
vscode.postMessage({ type: "tab:switch", payload: { tabId: tabId } });
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function closeTab(tabId) {
|
|
183
|
+
if (tabs.length <= 1) return;
|
|
184
|
+
var idx = -1;
|
|
185
|
+
for (var i = 0; i < tabs.length; i++) { if (tabs[i].id === tabId) { idx = i; break; } }
|
|
186
|
+
if (idx === -1) return;
|
|
187
|
+
tabs.splice(idx, 1);
|
|
188
|
+
|
|
189
|
+
if (tabId === activeTabId) {
|
|
190
|
+
var newIdx = idx > 0 ? idx - 1 : 0;
|
|
191
|
+
activeTabId = tabs[newIdx].id;
|
|
192
|
+
}
|
|
193
|
+
renderTabBar();
|
|
194
|
+
saveStateToDisk();
|
|
195
|
+
vscode.postMessage({ type: "tab:close", payload: { tabId: tabId } });
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function renameTab(tabId, newName) {
|
|
199
|
+
var tab = getTab(tabId);
|
|
200
|
+
if (!tab) return;
|
|
201
|
+
var trimmed = (newName || "").trim();
|
|
202
|
+
if (!trimmed) return;
|
|
203
|
+
tab.name = trimmed.substring(0, 30);
|
|
204
|
+
renderTabBar();
|
|
205
|
+
saveStateToDisk();
|
|
206
|
+
vscode.postMessage({ type: "tab:rename", payload: { tabId: tabId, newName: tab.name } });
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function getTab(tabId) {
|
|
210
|
+
for (var i = 0; i < tabs.length; i++) {
|
|
211
|
+
if (tabs[i].id === tabId) return tabs[i];
|
|
212
|
+
}
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function renderTabBar() {
|
|
217
|
+
// Remove all tab items (keep add button)
|
|
218
|
+
var existingTabs = tabBar.querySelectorAll(".tab-item");
|
|
219
|
+
for (var i = 0; i < existingTabs.length; i++) {
|
|
220
|
+
existingTabs[i].remove();
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Create tab elements
|
|
224
|
+
for (var t = 0; t < tabs.length; t++) {
|
|
225
|
+
var tab = tabs[t];
|
|
226
|
+
var el = document.createElement("button");
|
|
227
|
+
el.className = "tab-item" + (tab.id === activeTabId ? " active" : "");
|
|
228
|
+
el.setAttribute("data-tab-id", tab.id);
|
|
229
|
+
el.setAttribute("role", "tab");
|
|
230
|
+
el.setAttribute("aria-selected", tab.id === activeTabId ? "true" : "false");
|
|
231
|
+
|
|
232
|
+
var label = document.createElement("span");
|
|
233
|
+
label.className = "tab-label";
|
|
234
|
+
label.textContent = tab.name;
|
|
235
|
+
el.appendChild(label);
|
|
236
|
+
|
|
237
|
+
if (tabs.length > 1) {
|
|
238
|
+
var closeBtn = document.createElement("span");
|
|
239
|
+
closeBtn.className = "tab-close";
|
|
240
|
+
closeBtn.setAttribute("aria-label", "Close tab");
|
|
241
|
+
closeBtn.innerHTML = "×";
|
|
242
|
+
closeBtn.setAttribute("data-tab-id", tab.id);
|
|
243
|
+
el.appendChild(closeBtn);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
tabBar.insertBefore(el, tabAddBtn);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Update add button state
|
|
250
|
+
tabAddBtn.disabled = tabs.length >= MAX_TABS;
|
|
251
|
+
tabAddBtn.title = tabs.length >= MAX_TABS ? "Maximum 10 tabs" : "New conversation (Ctrl+Shift+T)";
|
|
252
|
+
|
|
253
|
+
// Bind events
|
|
254
|
+
bindTabEvents();
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
function bindTabEvents() {
|
|
258
|
+
var tabItems = tabBar.querySelectorAll(".tab-item");
|
|
259
|
+
for (var i = 0; i < tabItems.length; i++) {
|
|
260
|
+
(function(item) {
|
|
261
|
+
// Click to switch
|
|
262
|
+
item.addEventListener("click", function(e) {
|
|
263
|
+
if (e.target.classList.contains("tab-close")) return;
|
|
264
|
+
var id = this.getAttribute("data-tab-id");
|
|
265
|
+
switchToTab(id);
|
|
266
|
+
});
|
|
267
|
+
// Double-click to rename
|
|
268
|
+
item.addEventListener("dblclick", function(e) {
|
|
269
|
+
e.preventDefault();
|
|
270
|
+
var tabId = this.getAttribute("data-tab-id");
|
|
271
|
+
startRename(this, tabId);
|
|
272
|
+
});
|
|
273
|
+
})(tabItems[i]);
|
|
274
|
+
}
|
|
275
|
+
// Close buttons
|
|
276
|
+
var closeBtns = tabBar.querySelectorAll(".tab-close");
|
|
277
|
+
for (var c = 0; c < closeBtns.length; c++) {
|
|
278
|
+
(function(btn) {
|
|
279
|
+
btn.addEventListener("click", function(e) {
|
|
280
|
+
e.stopPropagation();
|
|
281
|
+
var id = this.getAttribute("data-tab-id");
|
|
282
|
+
closeTab(id);
|
|
283
|
+
});
|
|
284
|
+
})(closeBtns[c]);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function startRename(tabEl, tabId) {
|
|
289
|
+
var labelEl = tabEl.querySelector(".tab-label");
|
|
290
|
+
var currentName = labelEl.textContent;
|
|
291
|
+
var input = document.createElement("input");
|
|
292
|
+
input.type = "text";
|
|
293
|
+
input.className = "tab-rename-input";
|
|
294
|
+
input.value = currentName;
|
|
295
|
+
input.maxLength = 30;
|
|
296
|
+
labelEl.style.display = "none";
|
|
297
|
+
tabEl.insertBefore(input, labelEl);
|
|
298
|
+
input.focus();
|
|
299
|
+
input.select();
|
|
300
|
+
|
|
301
|
+
function finishRename() {
|
|
302
|
+
var val = input.value.trim();
|
|
303
|
+
if (val) renameTab(tabId, val);
|
|
304
|
+
input.remove();
|
|
305
|
+
labelEl.style.display = "";
|
|
306
|
+
var tab = getTab(tabId);
|
|
307
|
+
if (tab) labelEl.textContent = tab.name;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
input.addEventListener("blur", finishRename);
|
|
311
|
+
input.addEventListener("keydown", function(e) {
|
|
312
|
+
if (e.key === "Enter") { e.preventDefault(); finishRename(); }
|
|
313
|
+
if (e.key === "Escape") { input.remove(); labelEl.style.display = ""; }
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Tab add button
|
|
318
|
+
tabAddBtn.addEventListener("click", function() {
|
|
319
|
+
createNewTab();
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
// Keyboard shortcuts for tabs
|
|
323
|
+
document.addEventListener("keydown", function(e) {
|
|
324
|
+
// Ctrl+Shift+T = new tab
|
|
325
|
+
if (e.ctrlKey && e.shiftKey && e.key === "T") {
|
|
326
|
+
e.preventDefault();
|
|
327
|
+
createNewTab();
|
|
328
|
+
}
|
|
329
|
+
// Ctrl+W = close tab
|
|
330
|
+
if (e.ctrlKey && !e.shiftKey && e.key === "w") {
|
|
331
|
+
e.preventDefault();
|
|
332
|
+
closeTab(activeTabId);
|
|
333
|
+
}
|
|
334
|
+
// Ctrl+Tab = next tab
|
|
335
|
+
if (e.ctrlKey && e.key === "Tab" && !e.shiftKey) {
|
|
336
|
+
e.preventDefault();
|
|
337
|
+
var idx = -1;
|
|
338
|
+
for (var i = 0; i < tabs.length; i++) { if (tabs[i].id === activeTabId) { idx = i; break; } }
|
|
339
|
+
var nextIdx = (idx + 1) % tabs.length;
|
|
340
|
+
switchToTab(tabs[nextIdx].id);
|
|
341
|
+
}
|
|
342
|
+
// Ctrl+Shift+Tab = prev tab
|
|
343
|
+
if (e.ctrlKey && e.shiftKey && e.key === "Tab") {
|
|
344
|
+
e.preventDefault();
|
|
345
|
+
var idx2 = -1;
|
|
346
|
+
for (var j = 0; j < tabs.length; j++) { if (tabs[j].id === activeTabId) { idx2 = j; break; } }
|
|
347
|
+
var prevIdx = (idx2 - 1 + tabs.length) % tabs.length;
|
|
348
|
+
switchToTab(tabs[prevIdx].id);
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
// Initial render
|
|
353
|
+
renderTabBar();
|
|
354
|
+
|
|
355
|
+
// === Initialization ===
|
|
356
|
+
vscode.postMessage({ type: "ready" });
|
|
357
|
+
|
|
358
|
+
// === Contenteditable Input Helpers ===
|
|
359
|
+
function getInputText() {
|
|
360
|
+
var clone = inputEl.cloneNode(true);
|
|
361
|
+
var badges = clone.querySelectorAll(".slash-badge");
|
|
362
|
+
for (var i = 0; i < badges.length; i++) {
|
|
363
|
+
var textNode = document.createTextNode(badges[i].getAttribute("data-value") + " ");
|
|
364
|
+
badges[i].parentNode.replaceChild(textNode, badges[i]);
|
|
365
|
+
}
|
|
366
|
+
return (clone.innerText || clone.textContent || "").replace(/\n$/, "");
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
function setInputText(text) {
|
|
370
|
+
inputEl.textContent = text;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
function clearInput() {
|
|
374
|
+
inputEl.innerHTML = "";
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function isInputEmpty() {
|
|
378
|
+
return !inputEl.textContent.trim() && !inputEl.querySelector(".slash-badge");
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
function insertSlashBadge(label, value, icon) {
|
|
382
|
+
var sel = window.getSelection();
|
|
383
|
+
if (!sel.rangeCount) return;
|
|
384
|
+
var range = sel.getRangeAt(0);
|
|
385
|
+
var textNode = range.startContainer;
|
|
386
|
+
if (textNode.nodeType === 3) {
|
|
387
|
+
var text = textNode.textContent;
|
|
388
|
+
var offset = range.startOffset;
|
|
389
|
+
var before = text.substring(0, offset);
|
|
390
|
+
var slashIdx = before.lastIndexOf("/");
|
|
391
|
+
if (slashIdx !== -1) {
|
|
392
|
+
textNode.textContent = text.substring(0, slashIdx) + text.substring(offset);
|
|
393
|
+
var badge = document.createElement("span");
|
|
394
|
+
badge.className = "slash-badge";
|
|
395
|
+
badge.contentEditable = "false";
|
|
396
|
+
badge.setAttribute("data-value", value);
|
|
397
|
+
badge.innerHTML = '<span class="badge-icon">' + icon + '</span> /' + escapeHtml(label);
|
|
398
|
+
var afterText = textNode.splitText(slashIdx);
|
|
399
|
+
textNode.parentNode.insertBefore(badge, afterText);
|
|
400
|
+
var space = document.createTextNode("\u00A0");
|
|
401
|
+
badge.parentNode.insertBefore(space, badge.nextSibling);
|
|
402
|
+
var newRange = document.createRange();
|
|
403
|
+
newRange.setStartAfter(space);
|
|
404
|
+
newRange.collapse(true);
|
|
405
|
+
sel.removeAllRanges();
|
|
406
|
+
sel.addRange(newRange);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
function getCursorContext() {
|
|
412
|
+
var sel = window.getSelection();
|
|
413
|
+
if (!sel.rangeCount) return { text: "", cursorPos: 0 };
|
|
414
|
+
var range = sel.getRangeAt(0);
|
|
415
|
+
var node = range.startContainer;
|
|
416
|
+
if (node.nodeType === 3) {
|
|
417
|
+
return { text: node.textContent, cursorPos: range.startOffset, textNode: node };
|
|
418
|
+
}
|
|
419
|
+
return { text: "", cursorPos: 0 };
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// === Welcome Suggestions ===
|
|
423
|
+
var suggestionBtns = welcomeEl.querySelectorAll(".welcome-suggestions button");
|
|
424
|
+
for (var i = 0; i < suggestionBtns.length; i++) {
|
|
425
|
+
suggestionBtns[i].addEventListener("click", function () {
|
|
426
|
+
var action = this.getAttribute("data-action");
|
|
427
|
+
if (action) {
|
|
428
|
+
vscode.postMessage({ type: "executeCommand", command: "kiroSdlc." + action });
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
var cmd = this.getAttribute("data-cmd");
|
|
432
|
+
setInputText(cmd);
|
|
433
|
+
inputEl.focus();
|
|
434
|
+
if (cmd === "status" || cmd === "resume") {
|
|
435
|
+
sendMessage();
|
|
436
|
+
}
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// === Send ===
|
|
441
|
+
sendBtn.addEventListener("click", sendMessage);
|
|
442
|
+
|
|
443
|
+
inputEl.addEventListener("keydown", function (e) {
|
|
444
|
+
if (e.key === "Enter" && !e.shiftKey) {
|
|
445
|
+
e.preventDefault();
|
|
446
|
+
sendMessage();
|
|
447
|
+
}
|
|
448
|
+
if (e.key === "#" && isInputEmpty()) {
|
|
449
|
+
e.preventDefault();
|
|
450
|
+
toggleContextMenu();
|
|
451
|
+
}
|
|
452
|
+
// Up/Down arrow history navigation
|
|
453
|
+
if (e.key === "ArrowUp" && isInputEmpty() && messageHistory.length > 0) {
|
|
454
|
+
e.preventDefault();
|
|
455
|
+
if (historyIndex === -1) {
|
|
456
|
+
pendingInput = getInputText();
|
|
457
|
+
historyIndex = messageHistory.length - 1;
|
|
458
|
+
} else if (historyIndex > 0) {
|
|
459
|
+
historyIndex--;
|
|
460
|
+
}
|
|
461
|
+
setInputText(messageHistory[historyIndex]);
|
|
462
|
+
inputEl.style.height = "auto";
|
|
463
|
+
inputEl.style.height = Math.min(inputEl.scrollHeight, 300) + "px";
|
|
464
|
+
}
|
|
465
|
+
if (e.key === "ArrowDown" && historyIndex !== -1) {
|
|
466
|
+
e.preventDefault();
|
|
467
|
+
if (historyIndex < messageHistory.length - 1) {
|
|
468
|
+
historyIndex++;
|
|
469
|
+
setInputText(messageHistory[historyIndex]);
|
|
470
|
+
} else {
|
|
471
|
+
historyIndex = -1;
|
|
472
|
+
setInputText(pendingInput);
|
|
473
|
+
}
|
|
474
|
+
inputEl.style.height = "auto";
|
|
475
|
+
inputEl.style.height = Math.min(inputEl.scrollHeight, 300) + "px";
|
|
476
|
+
}
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
inputEl.addEventListener("input", function () {
|
|
480
|
+
inputEl.style.height = "auto";
|
|
481
|
+
inputEl.style.height = Math.min(inputEl.scrollHeight, 300) + "px";
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
// === Paste Image Handler ===
|
|
485
|
+
var inputAttachmentsEl = document.getElementById("input-attachments");
|
|
486
|
+
var pastedAttachments = []; // { type, name, dataUrl }
|
|
487
|
+
|
|
488
|
+
inputEl.addEventListener("paste", function (e) {
|
|
489
|
+
var items = (e.clipboardData || window.clipboardData).items;
|
|
490
|
+
if (!items) return;
|
|
491
|
+
|
|
492
|
+
for (var i = 0; i < items.length; i++) {
|
|
493
|
+
if (items[i].type.indexOf("image") !== -1) {
|
|
494
|
+
e.preventDefault();
|
|
495
|
+
var file = items[i].getAsFile();
|
|
496
|
+
if (!file) continue;
|
|
497
|
+
|
|
498
|
+
var reader = new FileReader();
|
|
499
|
+
reader.onload = function (ev) {
|
|
500
|
+
var dataUrl = ev.target.result;
|
|
501
|
+
var name = "pasted-image-" + (pastedAttachments.length + 1) + ".png";
|
|
502
|
+
pastedAttachments.push({ type: "image", name: name, dataUrl: dataUrl });
|
|
503
|
+
renderAttachments();
|
|
504
|
+
};
|
|
505
|
+
reader.readAsDataURL(file);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
// === Drag & Drop Image/File ===
|
|
511
|
+
var inputWrapper = document.querySelector(".input-wrapper");
|
|
512
|
+
|
|
513
|
+
inputWrapper.addEventListener("dragover", function (e) {
|
|
514
|
+
e.preventDefault();
|
|
515
|
+
inputWrapper.style.borderColor = "var(--vscode-focusBorder, #6366f1)";
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
inputWrapper.addEventListener("dragleave", function () {
|
|
519
|
+
inputWrapper.style.borderColor = "";
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
inputWrapper.addEventListener("drop", function (e) {
|
|
523
|
+
e.preventDefault();
|
|
524
|
+
inputWrapper.style.borderColor = "";
|
|
525
|
+
var files = e.dataTransfer.files;
|
|
526
|
+
for (var i = 0; i < files.length; i++) {
|
|
527
|
+
var file = files[i];
|
|
528
|
+
if (file.type.indexOf("image") !== -1) {
|
|
529
|
+
var reader = new FileReader();
|
|
530
|
+
reader.onload = (function (f) {
|
|
531
|
+
return function (ev) {
|
|
532
|
+
pastedAttachments.push({ type: "image", name: f.name, dataUrl: ev.target.result });
|
|
533
|
+
renderAttachments();
|
|
534
|
+
};
|
|
535
|
+
})(file);
|
|
536
|
+
reader.readAsDataURL(file);
|
|
537
|
+
} else {
|
|
538
|
+
pastedAttachments.push({ type: "file", name: file.name, dataUrl: null });
|
|
539
|
+
renderAttachments();
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
});
|
|
543
|
+
|
|
544
|
+
function renderAttachments() {
|
|
545
|
+
inputAttachmentsEl.innerHTML = "";
|
|
546
|
+
for (var i = 0; i < pastedAttachments.length; i++) {
|
|
547
|
+
var att = pastedAttachments[i];
|
|
548
|
+
if (att.type === "image" && att.dataUrl) {
|
|
549
|
+
var wrapper = document.createElement("div");
|
|
550
|
+
wrapper.className = "input-attachment";
|
|
551
|
+
var img = document.createElement("img");
|
|
552
|
+
img.src = att.dataUrl;
|
|
553
|
+
img.alt = att.name;
|
|
554
|
+
wrapper.appendChild(img);
|
|
555
|
+
var removeBtn = document.createElement("button");
|
|
556
|
+
removeBtn.className = "attach-remove";
|
|
557
|
+
removeBtn.textContent = "\u00D7";
|
|
558
|
+
removeBtn.setAttribute("data-idx", i.toString());
|
|
559
|
+
removeBtn.addEventListener("click", function () {
|
|
560
|
+
var idx = parseInt(this.getAttribute("data-idx"));
|
|
561
|
+
pastedAttachments.splice(idx, 1);
|
|
562
|
+
renderAttachments();
|
|
563
|
+
});
|
|
564
|
+
wrapper.appendChild(removeBtn);
|
|
565
|
+
inputAttachmentsEl.appendChild(wrapper);
|
|
566
|
+
} else {
|
|
567
|
+
var ref = document.createElement("div");
|
|
568
|
+
ref.className = "input-file-ref";
|
|
569
|
+
ref.innerHTML = '<span class="file-ref-icon">\u1F4C4</span>' +
|
|
570
|
+
'<span class="file-ref-name">' + escapeHtml(att.name) + '</span>' +
|
|
571
|
+
'<span class="file-ref-remove" data-idx="' + i + '">\u00D7</span>';
|
|
572
|
+
ref.querySelector(".file-ref-remove").addEventListener("click", function () {
|
|
573
|
+
var idx = parseInt(this.getAttribute("data-idx"));
|
|
574
|
+
pastedAttachments.splice(idx, 1);
|
|
575
|
+
renderAttachments();
|
|
576
|
+
});
|
|
577
|
+
inputAttachmentsEl.appendChild(ref);
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
inputEl.style.height = "auto";
|
|
581
|
+
inputEl.style.height = Math.min(inputEl.scrollHeight, 300) + "px";
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
function addFileReference(item) {
|
|
585
|
+
if (item.type === "file" || item.type === "folder") {
|
|
586
|
+
pastedAttachments.push({ type: "file", name: item.label, dataUrl: null });
|
|
587
|
+
renderAttachments();
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
// === Cancel / Stop ===
|
|
592
|
+
cancelBtn.addEventListener("click", function () {
|
|
593
|
+
vscode.postMessage({ type: "chat:cancelStream" });
|
|
594
|
+
setWorking(false);
|
|
595
|
+
});
|
|
596
|
+
|
|
597
|
+
stopBtn.addEventListener("click", function () {
|
|
598
|
+
vscode.postMessage({ type: "chat:cancelStream" });
|
|
599
|
+
setWorking(false);
|
|
600
|
+
});
|
|
601
|
+
|
|
602
|
+
followBtn.addEventListener("click", function () {
|
|
603
|
+
scrollToBottom();
|
|
604
|
+
});
|
|
605
|
+
|
|
606
|
+
// === Context Menu (#) ===
|
|
607
|
+
ctxBtn.addEventListener("click", function (e) {
|
|
608
|
+
e.stopPropagation();
|
|
609
|
+
toggleContextMenu();
|
|
610
|
+
});
|
|
611
|
+
|
|
612
|
+
function toggleContextMenu() {
|
|
613
|
+
contextMenu.classList.toggle("hidden");
|
|
614
|
+
modelDropdown.classList.add("hidden");
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
var ctxMenuBtns = contextMenu.querySelectorAll("button");
|
|
618
|
+
for (var c = 0; c < ctxMenuBtns.length; c++) {
|
|
619
|
+
ctxMenuBtns[c].addEventListener("click", function () {
|
|
620
|
+
var ctxType = this.getAttribute("data-ctx");
|
|
621
|
+
vscode.postMessage({ type: "chat:pickContext", contextType: ctxType });
|
|
622
|
+
contextMenu.classList.add("hidden");
|
|
623
|
+
});
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
// === Attachment Button ===
|
|
627
|
+
attachBtn.addEventListener("click", function () {
|
|
628
|
+
vscode.postMessage({ type: "chat:pickAttachment" });
|
|
629
|
+
});
|
|
630
|
+
|
|
631
|
+
// === Model Selector ===
|
|
632
|
+
modelBtn.addEventListener("click", function (e) {
|
|
633
|
+
e.stopPropagation();
|
|
634
|
+
modelDropdown.classList.toggle("hidden");
|
|
635
|
+
contextMenu.classList.add("hidden");
|
|
636
|
+
});
|
|
637
|
+
|
|
638
|
+
// Available models are populated dynamically from the extension
|
|
639
|
+
// (chat:models message) based on the configured SDLC provider.
|
|
640
|
+
var availableModels = [];
|
|
641
|
+
var supportsAuto = true;
|
|
642
|
+
|
|
643
|
+
// Delegate clicks on dynamically-rendered model buttons.
|
|
644
|
+
modelDropdown.addEventListener("click", function (e) {
|
|
645
|
+
var btn = e.target.closest ? e.target.closest("button[data-model]") : null;
|
|
646
|
+
if (!btn) return;
|
|
647
|
+
var model = btn.getAttribute("data-model");
|
|
648
|
+
setModel(model);
|
|
649
|
+
modelDropdown.classList.add("hidden");
|
|
650
|
+
vscode.postMessage({ type: "chat:setModel", model: model });
|
|
651
|
+
});
|
|
652
|
+
|
|
653
|
+
function renderModelDropdown() {
|
|
654
|
+
modelDropdown.innerHTML = "";
|
|
655
|
+
if (supportsAuto) {
|
|
656
|
+
modelDropdown.appendChild(makeModelButton({ id: "auto", name: "Auto" }));
|
|
657
|
+
}
|
|
658
|
+
for (var i = 0; i < availableModels.length; i++) {
|
|
659
|
+
modelDropdown.appendChild(makeModelButton(availableModels[i]));
|
|
660
|
+
}
|
|
661
|
+
// Reflect current selection
|
|
662
|
+
var allBtns = modelDropdown.querySelectorAll("button");
|
|
663
|
+
for (var j = 0; j < allBtns.length; j++) {
|
|
664
|
+
allBtns[j].classList.toggle("active", allBtns[j].getAttribute("data-model") === currentModel);
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
function makeModelButton(model) {
|
|
669
|
+
var btn = document.createElement("button");
|
|
670
|
+
btn.setAttribute("data-model", model.id);
|
|
671
|
+
// KSA-237: render name + rate badge like Kiro IDE
|
|
672
|
+
var nameSpan = document.createElement("span");
|
|
673
|
+
nameSpan.className = "model-item-name";
|
|
674
|
+
nameSpan.textContent = model.name;
|
|
675
|
+
btn.appendChild(nameSpan);
|
|
676
|
+
|
|
677
|
+
if (typeof model.rateMultiplier === "number") {
|
|
678
|
+
var badge = document.createElement("span");
|
|
679
|
+
badge.className = "model-rate-badge";
|
|
680
|
+
if (model.rateMultiplier === 0) {
|
|
681
|
+
badge.textContent = "Free";
|
|
682
|
+
badge.classList.add("rate-free");
|
|
683
|
+
} else {
|
|
684
|
+
badge.textContent = model.rateMultiplier + (model.rateMultiplier === 1 ? " Credit" : " Credits");
|
|
685
|
+
}
|
|
686
|
+
btn.appendChild(badge);
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
if (model.description) {
|
|
690
|
+
var desc = document.createElement("span");
|
|
691
|
+
desc.className = "model-item-desc";
|
|
692
|
+
desc.textContent = model.description;
|
|
693
|
+
btn.appendChild(desc);
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
return btn;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
function labelForModel(model) {
|
|
700
|
+
if (model === "auto") return "Auto";
|
|
701
|
+
for (var i = 0; i < availableModels.length; i++) {
|
|
702
|
+
if (availableModels[i].id === model) {
|
|
703
|
+
var lbl = availableModels[i].name;
|
|
704
|
+
// KSA-237: show compact rate in the button label
|
|
705
|
+
if (typeof availableModels[i].rateMultiplier === "number" && availableModels[i].rateMultiplier !== 1) {
|
|
706
|
+
if (availableModels[i].rateMultiplier === 0) {
|
|
707
|
+
lbl += " (Free)";
|
|
708
|
+
} else {
|
|
709
|
+
lbl += " (" + availableModels[i].rateMultiplier + "x)";
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
return lbl;
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
return model;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
function setModel(model) {
|
|
719
|
+
currentModel = model;
|
|
720
|
+
modelLabel.textContent = labelForModel(model);
|
|
721
|
+
var allBtns = modelDropdown.querySelectorAll("button");
|
|
722
|
+
for (var i = 0; i < allBtns.length; i++) {
|
|
723
|
+
allBtns[i].classList.toggle("active", allBtns[i].getAttribute("data-model") === model);
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
// === Autopilot Toggle ===
|
|
728
|
+
autopilotToggle.addEventListener("click", function () {
|
|
729
|
+
var isOn = autopilotToggle.classList.contains("on");
|
|
730
|
+
autopilotToggle.classList.toggle("on", !isOn);
|
|
731
|
+
currentMode = isOn ? "supervised" : "autopilot";
|
|
732
|
+
vscode.postMessage({ type: "chat:setMode", mode: currentMode });
|
|
733
|
+
});
|
|
734
|
+
|
|
735
|
+
// === Close dropdowns on outside click ===
|
|
736
|
+
document.addEventListener("click", function () {
|
|
737
|
+
modelDropdown.classList.add("hidden");
|
|
738
|
+
contextMenu.classList.add("hidden");
|
|
739
|
+
});
|
|
740
|
+
|
|
741
|
+
// === Message Handler from Extension ===
|
|
742
|
+
window.addEventListener("message", function (event) {
|
|
743
|
+
var msg = event.data;
|
|
744
|
+
if (!msg || !msg.type) return;
|
|
745
|
+
|
|
746
|
+
switch (msg.type) {
|
|
747
|
+
case "chat:streamChunk":
|
|
748
|
+
handleStreamChunk(msg);
|
|
749
|
+
break;
|
|
750
|
+
case "chat:streamComplete":
|
|
751
|
+
handleStreamComplete(msg);
|
|
752
|
+
break;
|
|
753
|
+
case "chat:graphUpdate":
|
|
754
|
+
break;
|
|
755
|
+
case "chat:approvalRequest":
|
|
756
|
+
renderApprovalCard(msg.checkpoint);
|
|
757
|
+
break;
|
|
758
|
+
case "chat:chatHistory":
|
|
759
|
+
renderChatHistory(msg.messages);
|
|
760
|
+
break;
|
|
761
|
+
case "chat:pipelineStatus":
|
|
762
|
+
handlePipelineStatus(msg);
|
|
763
|
+
break;
|
|
764
|
+
case "chat:resumePrompt":
|
|
765
|
+
renderResumePrompt(msg);
|
|
766
|
+
break;
|
|
767
|
+
case "chat:error":
|
|
768
|
+
renderError(msg);
|
|
769
|
+
setWorking(false);
|
|
770
|
+
break;
|
|
771
|
+
case "chat:toolCall":
|
|
772
|
+
vscode.postMessage({ type: "chat:debugLog", text: "toolCall obj: " + JSON.stringify(msg.toolCall || msg).slice(0, 200) });
|
|
773
|
+
try {
|
|
774
|
+
renderToolCall(msg.toolCall);
|
|
775
|
+
} catch (e) {
|
|
776
|
+
vscode.postMessage({ type: "chat:debugLog", text: "renderToolCall ERROR: " + e.message });
|
|
777
|
+
}
|
|
778
|
+
break;
|
|
779
|
+
case "chat:toolCallUpdate":
|
|
780
|
+
updateToolCall(msg);
|
|
781
|
+
break;
|
|
782
|
+
case "chat:contextPicked":
|
|
783
|
+
addContextChip(msg.item);
|
|
784
|
+
addFileReference(msg.item);
|
|
785
|
+
break;
|
|
786
|
+
case "chat:configUpdate":
|
|
787
|
+
setModel(msg.model);
|
|
788
|
+
if (msg.mode) {
|
|
789
|
+
currentMode = msg.mode;
|
|
790
|
+
autopilotToggle.classList.toggle("on", msg.mode === "autopilot");
|
|
791
|
+
}
|
|
792
|
+
break;
|
|
793
|
+
case "chat:models":
|
|
794
|
+
availableModels = Array.isArray(msg.models) ? msg.models : [];
|
|
795
|
+
supportsAuto = msg.supportsAuto !== false;
|
|
796
|
+
renderModelDropdown();
|
|
797
|
+
if (msg.selected) {
|
|
798
|
+
setModel(msg.selected);
|
|
799
|
+
} else if (supportsAuto) {
|
|
800
|
+
setModel("auto");
|
|
801
|
+
} else if (availableModels.length > 0) {
|
|
802
|
+
setModel(availableModels[0].id);
|
|
803
|
+
}
|
|
804
|
+
break;
|
|
805
|
+
case "chat:workingStatus":
|
|
806
|
+
if (msg.working) {
|
|
807
|
+
setWorking(true, msg.label);
|
|
808
|
+
} else {
|
|
809
|
+
setGraphDone();
|
|
810
|
+
}
|
|
811
|
+
break;
|
|
812
|
+
case "chat:nodeDetails":
|
|
813
|
+
break;
|
|
814
|
+
case "serverStatus":
|
|
815
|
+
updateServerStatus(msg.status);
|
|
816
|
+
break;
|
|
817
|
+
case "tab:updated":
|
|
818
|
+
handleTabsUpdated(msg.payload);
|
|
819
|
+
break;
|
|
820
|
+
case "tab:contextUpdate":
|
|
821
|
+
handleContextUpdate(msg.payload);
|
|
822
|
+
break;
|
|
823
|
+
case "chat:steeringLoaded":
|
|
824
|
+
renderSteeringRules(msg.rules);
|
|
825
|
+
break;
|
|
826
|
+
case "chat:hookTriggered":
|
|
827
|
+
renderHookBadge(msg.hook);
|
|
828
|
+
break;
|
|
829
|
+
}
|
|
830
|
+
});
|
|
831
|
+
|
|
832
|
+
// === Send Message ===
|
|
833
|
+
function sendMessage() {
|
|
834
|
+
var text = getInputText().trim();
|
|
835
|
+
if (!text && pastedAttachments.length === 0) return;
|
|
836
|
+
|
|
837
|
+
// Reset graph completion flag for new interaction
|
|
838
|
+
graphDone = false;
|
|
839
|
+
|
|
840
|
+
showMessages();
|
|
841
|
+
if (text) appendMessage("user", text);
|
|
842
|
+
if (pastedAttachments.length > 0) {
|
|
843
|
+
for (var a = 0; a < pastedAttachments.length; a++) {
|
|
844
|
+
if (pastedAttachments[a].type === "image") {
|
|
845
|
+
appendMessage("user", "[Image: " + pastedAttachments[a].name + "]");
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
setWorking(true);
|
|
850
|
+
|
|
851
|
+
// KSA-240: Auto-rename tab to first message excerpt
|
|
852
|
+
var currentTab = getTab(activeTabId);
|
|
853
|
+
if (currentTab && text && (!currentTab.messages || currentTab.messages.length === 0)) {
|
|
854
|
+
var excerpt = text.substring(0, 25).trim();
|
|
855
|
+
if (text.length > 25) excerpt += "\u2026";
|
|
856
|
+
currentTab.name = excerpt;
|
|
857
|
+
renderTabBar();
|
|
858
|
+
vscode.postMessage({ type: "tab:rename", payload: { tabId: activeTabId, newName: excerpt } });
|
|
859
|
+
}
|
|
860
|
+
// Track message in local tab state
|
|
861
|
+
if (currentTab) {
|
|
862
|
+
if (!currentTab.messages) currentTab.messages = [];
|
|
863
|
+
currentTab.messages.push({ role: "user", content: text });
|
|
864
|
+
}
|
|
865
|
+
saveStateToDisk();
|
|
866
|
+
|
|
867
|
+
var attachments = pastedAttachments.map(function (att) {
|
|
868
|
+
return { name: att.name, type: att.type === "image" ? "image/png" : "application/octet-stream", size: 0, uri: att.dataUrl || "" };
|
|
869
|
+
});
|
|
870
|
+
|
|
871
|
+
vscode.postMessage({
|
|
872
|
+
type: "chat:userMessage",
|
|
873
|
+
text: text || "(attached files)",
|
|
874
|
+
context: contextItems.length > 0 ? contextItems : undefined,
|
|
875
|
+
attachments: attachments.length > 0 ? attachments : undefined
|
|
876
|
+
});
|
|
877
|
+
|
|
878
|
+
inputEl.innerHTML = "";
|
|
879
|
+
inputEl.style.height = "auto";
|
|
880
|
+
clearContextChips();
|
|
881
|
+
pastedAttachments = [];
|
|
882
|
+
renderAttachments();
|
|
883
|
+
// Save to history for Up/Down navigation
|
|
884
|
+
if (text) {
|
|
885
|
+
messageHistory.push(text);
|
|
886
|
+
if (messageHistory.length > 50) messageHistory.shift();
|
|
887
|
+
}
|
|
888
|
+
historyIndex = -1;
|
|
889
|
+
pendingInput = "";
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
// === Working Status ===
|
|
893
|
+
function setWorking(active, label) {
|
|
894
|
+
if (active) {
|
|
895
|
+
// Don't re-activate if graph already signaled final completion
|
|
896
|
+
if (graphDone) return;
|
|
897
|
+
workingBar.classList.add("active");
|
|
898
|
+
workingText.textContent = label || "Working...";
|
|
899
|
+
stopBtn.style.display = "inline-flex";
|
|
900
|
+
isStreaming = true;
|
|
901
|
+
} else {
|
|
902
|
+
workingBar.classList.remove("active");
|
|
903
|
+
stopBtn.style.display = "none";
|
|
904
|
+
isStreaming = false;
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
// Called only by chat:workingStatus message — marks graph as truly done
|
|
909
|
+
function setGraphDone() {
|
|
910
|
+
graphDone = true;
|
|
911
|
+
setWorking(false);
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
// Map a node status signal to a friendly working-bar label.
|
|
915
|
+
function statusLabel(nodeId, status) {
|
|
916
|
+
var node = (nodeId || "agent").toString();
|
|
917
|
+
var s = (status || "").toString();
|
|
918
|
+
if (s === "active" || s === "") {
|
|
919
|
+
return node === "chat" ? "Thinking..." : node.toUpperCase() + " working...";
|
|
920
|
+
}
|
|
921
|
+
return node.toUpperCase() + ": " + s;
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
// === Show messages (hide welcome) ===
|
|
925
|
+
function showMessages() {
|
|
926
|
+
if (!hasMessages) {
|
|
927
|
+
welcomeEl.classList.add("hidden");
|
|
928
|
+
messagesEl.classList.remove("hidden");
|
|
929
|
+
hasMessages = true;
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
// === Message Rendering ===
|
|
934
|
+
function appendMessage(role, content, nodeId) {
|
|
935
|
+
showMessages();
|
|
936
|
+
var el = document.createElement("div");
|
|
937
|
+
el.className = "message " + role;
|
|
938
|
+
|
|
939
|
+
if (nodeId) {
|
|
940
|
+
var badge = document.createElement("span");
|
|
941
|
+
badge.className = "node-badge " + nodeId;
|
|
942
|
+
badge.textContent = nodeId.toUpperCase();
|
|
943
|
+
el.appendChild(badge);
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
var contentEl = document.createElement("span");
|
|
947
|
+
if (role === "user") {
|
|
948
|
+
contentEl.textContent = content;
|
|
949
|
+
} else {
|
|
950
|
+
contentEl.innerHTML = MarkdownRenderer.render(content);
|
|
951
|
+
addCodeActions(contentEl);
|
|
952
|
+
}
|
|
953
|
+
el.appendChild(contentEl);
|
|
954
|
+
|
|
955
|
+
messagesEl.appendChild(el);
|
|
956
|
+
scrollToBottom();
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
function renderChatHistory(messages) {
|
|
960
|
+
messagesEl.innerHTML = "";
|
|
961
|
+
activeToolContainer = null; // Reset container on full re-render
|
|
962
|
+
if (messages && messages.length > 0) {
|
|
963
|
+
showMessages();
|
|
964
|
+
for (var i = 0; i < messages.length; i++) {
|
|
965
|
+
var m = messages[i];
|
|
966
|
+
if (m.role === "tool" && m.toolData) {
|
|
967
|
+
// Re-render persisted tool call block (into container)
|
|
968
|
+
renderToolCall(m.toolData, true);
|
|
969
|
+
} else {
|
|
970
|
+
// Seal tool container before rendering non-tool messages
|
|
971
|
+
finalizeToolContainer();
|
|
972
|
+
appendMessage(m.role, m.content, m.nodeId);
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
finalizeToolContainer();
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
// === Streaming ===
|
|
980
|
+
function handleStreamChunk(msg) {
|
|
981
|
+
showMessages();
|
|
982
|
+
setWorking(true, "Working...");
|
|
983
|
+
|
|
984
|
+
// KSA-247: Seal the tool container before streaming text starts
|
|
985
|
+
// This ensures tool blocks are never touched by streaming logic
|
|
986
|
+
finalizeToolContainer();
|
|
987
|
+
|
|
988
|
+
if (!streamingNodes[msg.nodeId]) {
|
|
989
|
+
var el = document.createElement("div");
|
|
990
|
+
el.className = "message assistant streaming";
|
|
991
|
+
|
|
992
|
+
var badge = document.createElement("span");
|
|
993
|
+
badge.className = "node-badge " + msg.nodeId;
|
|
994
|
+
// Map nodeId to friendly agent name
|
|
995
|
+
var agentNames = {
|
|
996
|
+
chat: "Pipeline Agent",
|
|
997
|
+
sm: "SM",
|
|
998
|
+
ba: "BA",
|
|
999
|
+
sa: "SA",
|
|
1000
|
+
ta: "TA",
|
|
1001
|
+
qa: "QA",
|
|
1002
|
+
dev: "DEV",
|
|
1003
|
+
devops: "DevOps"
|
|
1004
|
+
};
|
|
1005
|
+
badge.textContent = agentNames[msg.nodeId] || msg.nodeId.toUpperCase();
|
|
1006
|
+
el.appendChild(badge);
|
|
1007
|
+
|
|
1008
|
+
var contentEl = document.createElement("span");
|
|
1009
|
+
contentEl.className = "stream-content";
|
|
1010
|
+
el.appendChild(contentEl);
|
|
1011
|
+
|
|
1012
|
+
messagesEl.appendChild(el);
|
|
1013
|
+
streamingNodes[msg.nodeId] = { el: el, content: "" };
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
var node = streamingNodes[msg.nodeId];
|
|
1017
|
+
|
|
1018
|
+
if (msg.eventType === "token") {
|
|
1019
|
+
// Skip pure whitespace/newline-only tokens entirely
|
|
1020
|
+
var tokenContent = msg.content;
|
|
1021
|
+
if (!tokenContent || !tokenContent.replace(/[\s\n\r]/g, "")) return;
|
|
1022
|
+
// Trim leading whitespace from first meaningful token
|
|
1023
|
+
if (!node.content) {
|
|
1024
|
+
tokenContent = tokenContent.replace(/^[\s\n\r]+/, "");
|
|
1025
|
+
if (!tokenContent) return;
|
|
1026
|
+
}
|
|
1027
|
+
node.content += tokenContent;
|
|
1028
|
+
var contentSpan = node.el.querySelector(".stream-content");
|
|
1029
|
+
contentSpan.innerHTML = MarkdownRenderer.render(node.content);
|
|
1030
|
+
addCodeActions(contentSpan);
|
|
1031
|
+
} else if (msg.eventType === "status") {
|
|
1032
|
+
// Status is a node lifecycle signal (e.g. "active"), NOT answer content.
|
|
1033
|
+
// Show it on the working bar only — never concatenate into the reply
|
|
1034
|
+
// bubble, otherwise the bubble shows literal "active" (KSA-237).
|
|
1035
|
+
setWorking(true, statusLabel(msg.nodeId, msg.content));
|
|
1036
|
+
} else if (msg.eventType === "error") {
|
|
1037
|
+
node.el.classList.add("error");
|
|
1038
|
+
node.el.classList.remove("streaming");
|
|
1039
|
+
var errSpan = node.el.querySelector(".stream-content");
|
|
1040
|
+
errSpan.innerHTML = MarkdownRenderer.render("**Error:** " + msg.content);
|
|
1041
|
+
delete streamingNodes[msg.nodeId];
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
scrollToBottom();
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
function handleStreamComplete(msg) {
|
|
1048
|
+
var node = streamingNodes[msg.nodeId];
|
|
1049
|
+
if (node) {
|
|
1050
|
+
node.el.classList.remove("streaming");
|
|
1051
|
+
if (!node.content && msg.finalContent && !msg.finalContent.startsWith("Node ")) {
|
|
1052
|
+
var contentSpan = node.el.querySelector(".stream-content");
|
|
1053
|
+
contentSpan.innerHTML = MarkdownRenderer.render(msg.finalContent);
|
|
1054
|
+
addCodeActions(contentSpan);
|
|
1055
|
+
}
|
|
1056
|
+
// Save assistant message to tab state
|
|
1057
|
+
var content = node.content || msg.finalContent || "";
|
|
1058
|
+
if (content) {
|
|
1059
|
+
var currentTab = getTab(activeTabId);
|
|
1060
|
+
if (currentTab) {
|
|
1061
|
+
if (!currentTab.messages) currentTab.messages = [];
|
|
1062
|
+
currentTab.messages.push({ role: "assistant", content: content, nodeId: msg.nodeId });
|
|
1063
|
+
}
|
|
1064
|
+
saveStateToDisk();
|
|
1065
|
+
}
|
|
1066
|
+
delete streamingNodes[msg.nodeId];
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
if (Object.keys(streamingNodes).length === 0) {
|
|
1070
|
+
// Don't hide working bar here — only chat:workingStatus message controls it.
|
|
1071
|
+
// This prevents premature hide when verify loops back.
|
|
1072
|
+
isStreaming = false;
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1076
|
+
// === Tool Calls (Collapsible) — Isolated Container ===
|
|
1077
|
+
// KSA-247: Tool call blocks render in their own scoped container
|
|
1078
|
+
// completely isolated from streaming DOM manipulation
|
|
1079
|
+
var activeToolContainer = null;
|
|
1080
|
+
|
|
1081
|
+
function getOrCreateToolContainer() {
|
|
1082
|
+
if (!activeToolContainer || !activeToolContainer.parentNode) {
|
|
1083
|
+
activeToolContainer = document.createElement("div");
|
|
1084
|
+
activeToolContainer.className = "ksa247-tool-container";
|
|
1085
|
+
activeToolContainer.setAttribute("data-turn", "turn-" + Date.now());
|
|
1086
|
+
messagesEl.appendChild(activeToolContainer);
|
|
1087
|
+
}
|
|
1088
|
+
return activeToolContainer;
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
function finalizeToolContainer() {
|
|
1092
|
+
if (activeToolContainer) {
|
|
1093
|
+
activeToolContainer.setAttribute("data-sealed", "true");
|
|
1094
|
+
activeToolContainer = null;
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
// Categorize a tool by name -> { icon, label, cssClass }
|
|
1098
|
+
// KSA-247: Enhanced with explicit prefixMap to fix OI-4 priority bug
|
|
1099
|
+
function categorizeTool(name) {
|
|
1100
|
+
var n = (name || "").toLowerCase();
|
|
1101
|
+
|
|
1102
|
+
// KSA-279: System/meta events (steering, hooks) - distinct category
|
|
1103
|
+
if (n.indexOf("steering") !== -1 || n.indexOf("_rules_") !== -1)
|
|
1104
|
+
return { icon: "S", label: "RULES", cls: "cat-rules" };
|
|
1105
|
+
if (n.indexOf("hook") !== -1)
|
|
1106
|
+
return { icon: "H", label: "HOOK", cls: "cat-hook" };
|
|
1107
|
+
|
|
1108
|
+
// Priority 1: Explicit prefix matches (most specific first)
|
|
1109
|
+
var prefixMap = [
|
|
1110
|
+
{ prefix: "execute_pwsh", icon: ">_", label: "CMD", cls: "cat-command" },
|
|
1111
|
+
{ prefix: "control_pwsh", icon: ">_", label: "CMD", cls: "cat-command" },
|
|
1112
|
+
{ prefix: "get_process", icon: ">_", label: "CMD", cls: "cat-command" },
|
|
1113
|
+
{ prefix: "list_process", icon: ">_", label: "CMD", cls: "cat-command" },
|
|
1114
|
+
{ prefix: "grep_search", icon: "?", label: "SEARCH", cls: "cat-search" },
|
|
1115
|
+
{ prefix: "file_search", icon: "?", label: "SEARCH", cls: "cat-search" },
|
|
1116
|
+
{ prefix: "mem_search", icon: "m", label: "MEM", cls: "cat-memory" },
|
|
1117
|
+
{ prefix: "mem_ingest", icon: "m", label: "MEM", cls: "cat-memory" },
|
|
1118
|
+
{ prefix: "read_file", icon: "[]", label: "FILE", cls: "cat-file" },
|
|
1119
|
+
{ prefix: "read_files", icon: "[]", label: "FILE", cls: "cat-file" },
|
|
1120
|
+
{ prefix: "read_code", icon: "[]", label: "FILE", cls: "cat-file" },
|
|
1121
|
+
{ prefix: "list_directory", icon: "[]", label: "FILE", cls: "cat-file" },
|
|
1122
|
+
{ prefix: "fs_write", icon: "[]", label: "FILE", cls: "cat-file" },
|
|
1123
|
+
{ prefix: "str_replace", icon: "[]", label: "FILE", cls: "cat-file" },
|
|
1124
|
+
{ prefix: "stream_write", icon: "[]", label: "FILE", cls: "cat-file" },
|
|
1125
|
+
{ prefix: "export_docx", icon: "D", label: "DOC", cls: "cat-doc" },
|
|
1126
|
+
{ prefix: "embed_images", icon: "D", label: "DOC", cls: "cat-doc" },
|
|
1127
|
+
{ prefix: "drawio", icon: "D", label: "DOC", cls: "cat-doc" },
|
|
1128
|
+
{ prefix: "jira_", icon: "J", label: "JIRA", cls: "cat-jira" }
|
|
1129
|
+
];
|
|
1130
|
+
|
|
1131
|
+
for (var i = 0; i < prefixMap.length; i++) {
|
|
1132
|
+
if (n.indexOf(prefixMap[i].prefix) === 0) {
|
|
1133
|
+
return { icon: prefixMap[i].icon, label: prefixMap[i].label, cls: prefixMap[i].cls };
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
// Priority 2: Contains-based matching (broader patterns)
|
|
1138
|
+
if (n.indexOf("pwsh") !== -1 || n.indexOf("shell") !== -1 || n.indexOf("command") !== -1)
|
|
1139
|
+
return { icon: ">_", label: "CMD", cls: "cat-command" };
|
|
1140
|
+
if (n.indexOf("search") !== -1 || n.indexOf("grep") !== -1 || n.indexOf("find") !== -1)
|
|
1141
|
+
return { icon: "?", label: "SEARCH", cls: "cat-search" };
|
|
1142
|
+
if (n.indexOf("mem_") !== -1 || n.indexOf("kb_") !== -1)
|
|
1143
|
+
return { icon: "m", label: "MEM", cls: "cat-memory" };
|
|
1144
|
+
if (n.indexOf("jira") !== -1 || n.indexOf("issue") !== -1)
|
|
1145
|
+
return { icon: "J", label: "JIRA", cls: "cat-jira" };
|
|
1146
|
+
if (n.indexOf("read") !== -1 || n.indexOf("write") !== -1 || n.indexOf("file") !== -1 ||
|
|
1147
|
+
n.indexOf("list") !== -1 || n.indexOf("directory") !== -1)
|
|
1148
|
+
return { icon: "[]", label: "FILE", cls: "cat-file" };
|
|
1149
|
+
if (n.indexOf("drawio") !== -1 || n.indexOf("export") !== -1 || n.indexOf("docx") !== -1)
|
|
1150
|
+
return { icon: "D", label: "DOC", cls: "cat-doc" };
|
|
1151
|
+
|
|
1152
|
+
// Priority 3: Fallback
|
|
1153
|
+
return { icon: "T", label: "TOOL", cls: "cat-tool" };
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1156
|
+
function renderToolCall(tc, isReplay) {
|
|
1157
|
+
// EF-1: Validation - skip if required fields missing
|
|
1158
|
+
if (!tc || !tc.id || !tc.name) {
|
|
1159
|
+
console.warn("[chat.js] renderToolCall: missing id or name, skipping", tc);
|
|
1160
|
+
return;
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
showMessages();
|
|
1164
|
+
var block = document.createElement("div");
|
|
1165
|
+
block.className = "tool-call-block";
|
|
1166
|
+
block.id = "tc-" + tc.id;
|
|
1167
|
+
|
|
1168
|
+
// Accessibility: BR-17, OI-2
|
|
1169
|
+
block.setAttribute("tabindex", "0");
|
|
1170
|
+
block.setAttribute("role", "button");
|
|
1171
|
+
block.setAttribute("aria-expanded", "false");
|
|
1172
|
+
block.setAttribute("aria-label", "Tool call: " + tc.name + " - " + (tc.status || "running"));
|
|
1173
|
+
|
|
1174
|
+
var cat = categorizeTool(tc.name);
|
|
1175
|
+
|
|
1176
|
+
// OI-3: stale running -> interrupted on restore
|
|
1177
|
+
var displayStatus = tc.status;
|
|
1178
|
+
if (isReplay && tc.status === "running") {
|
|
1179
|
+
displayStatus = "interrupted";
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
var header = document.createElement("div");
|
|
1183
|
+
header.className = "tool-call-header";
|
|
1184
|
+
header.innerHTML = '<span class="tool-chevron">▶</span>' +
|
|
1185
|
+
'<span class="tool-icon">' + cat.icon + '</span>' +
|
|
1186
|
+
'<span class="tool-cat ' + cat.cls + '">' + cat.label + '</span>' +
|
|
1187
|
+
'<span class="tool-name">' + escapeHtml(tc.name) + '</span>' +
|
|
1188
|
+
'<span class="tool-status ' + displayStatus + '">' + statusIcon(displayStatus) + '</span>';
|
|
1189
|
+
|
|
1190
|
+
// Duration display (for completed/replayed blocks)
|
|
1191
|
+
if (tc.duration) {
|
|
1192
|
+
var dur = document.createElement("span");
|
|
1193
|
+
dur.className = "tool-duration";
|
|
1194
|
+
dur.textContent = formatDuration(tc.duration);
|
|
1195
|
+
header.appendChild(dur);
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
// Click handler: toggle expand/collapse
|
|
1199
|
+
header.addEventListener("click", function () {
|
|
1200
|
+
var isExpanded = block.classList.toggle("expanded");
|
|
1201
|
+
block.setAttribute("aria-expanded", isExpanded ? "true" : "false");
|
|
1202
|
+
});
|
|
1203
|
+
|
|
1204
|
+
// Keyboard handler: Enter/Space toggle (BR-17)
|
|
1205
|
+
block.addEventListener("keydown", function (e) {
|
|
1206
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
1207
|
+
e.preventDefault();
|
|
1208
|
+
var isExpanded = block.classList.toggle("expanded");
|
|
1209
|
+
block.setAttribute("aria-expanded", isExpanded ? "true" : "false");
|
|
1210
|
+
}
|
|
1211
|
+
});
|
|
1212
|
+
|
|
1213
|
+
// Body content — KSA-281: Two sections (Request + Response)
|
|
1214
|
+
var body = document.createElement("div");
|
|
1215
|
+
body.className = "tool-call-body";
|
|
1216
|
+
|
|
1217
|
+
// --- REQUEST section (always show args) ---
|
|
1218
|
+
var reqSection = document.createElement("div");
|
|
1219
|
+
reqSection.className = "tool-section tool-section-request";
|
|
1220
|
+
var reqLabel = document.createElement("div");
|
|
1221
|
+
reqLabel.className = "tool-section-label";
|
|
1222
|
+
reqLabel.textContent = "Request";
|
|
1223
|
+
var reqContent = document.createElement("pre");
|
|
1224
|
+
reqContent.className = "tool-section-content";
|
|
1225
|
+
reqContent.textContent = tc.args && Object.keys(tc.args).length > 0
|
|
1226
|
+
? JSON.stringify(tc.args, null, 2)
|
|
1227
|
+
: "(no parameters)";
|
|
1228
|
+
reqSection.appendChild(reqLabel);
|
|
1229
|
+
reqSection.appendChild(reqContent);
|
|
1230
|
+
|
|
1231
|
+
// --- RESPONSE section ---
|
|
1232
|
+
var resSection = document.createElement("div");
|
|
1233
|
+
resSection.className = "tool-section tool-section-response";
|
|
1234
|
+
var resLabel = document.createElement("div");
|
|
1235
|
+
resLabel.className = "tool-section-label";
|
|
1236
|
+
resLabel.textContent = "Response";
|
|
1237
|
+
var resContent = document.createElement("pre");
|
|
1238
|
+
resContent.className = "tool-section-content";
|
|
1239
|
+
if (displayStatus === "completed" && tc.result) {
|
|
1240
|
+
resContent.textContent = tc.result;
|
|
1241
|
+
} else if (displayStatus === "failed" && tc.error) {
|
|
1242
|
+
resContent.textContent = tc.error;
|
|
1243
|
+
resSection.classList.add("failed");
|
|
1244
|
+
} else if (displayStatus === "interrupted") {
|
|
1245
|
+
resContent.textContent = "(interrupted)";
|
|
1246
|
+
} else {
|
|
1247
|
+
resContent.textContent = "(waiting...)";
|
|
1248
|
+
}
|
|
1249
|
+
resSection.appendChild(resLabel);
|
|
1250
|
+
resSection.appendChild(resContent);
|
|
1251
|
+
|
|
1252
|
+
body.appendChild(reqSection);
|
|
1253
|
+
body.appendChild(resSection);
|
|
1254
|
+
|
|
1255
|
+
block.appendChild(header);
|
|
1256
|
+
block.appendChild(body);
|
|
1257
|
+
|
|
1258
|
+
// KSA-247: Append to isolated tool container (NOT messagesEl directly)
|
|
1259
|
+
var container = getOrCreateToolContainer();
|
|
1260
|
+
container.appendChild(block);
|
|
1261
|
+
toolCalls[tc.id] = block;
|
|
1262
|
+
scrollToBottom();
|
|
1263
|
+
|
|
1264
|
+
// KSA-240: Persist tool call into active tab so it survives re-renders/reload
|
|
1265
|
+
if (!isReplay) {
|
|
1266
|
+
var currentTab = getTab(activeTabId);
|
|
1267
|
+
if (currentTab) {
|
|
1268
|
+
if (!currentTab.messages) currentTab.messages = [];
|
|
1269
|
+
currentTab.messages.push({
|
|
1270
|
+
role: "tool",
|
|
1271
|
+
content: "",
|
|
1272
|
+
toolData: {
|
|
1273
|
+
id: tc.id,
|
|
1274
|
+
name: tc.name,
|
|
1275
|
+
args: tc.args,
|
|
1276
|
+
status: tc.status,
|
|
1277
|
+
result: tc.result,
|
|
1278
|
+
duration: tc.duration,
|
|
1279
|
+
timestamp: new Date().toISOString()
|
|
1280
|
+
}
|
|
1281
|
+
});
|
|
1282
|
+
saveStateToDisk();
|
|
1283
|
+
}
|
|
1284
|
+
}
|
|
1285
|
+
}
|
|
1286
|
+
|
|
1287
|
+
function updateToolCall(msg) {
|
|
1288
|
+
var block = toolCalls[msg.id];
|
|
1289
|
+
if (!block) {
|
|
1290
|
+
console.warn("[chat.js] updateToolCall: block not found for id", msg.id);
|
|
1291
|
+
return;
|
|
1292
|
+
}
|
|
1293
|
+
|
|
1294
|
+
// Update status indicator
|
|
1295
|
+
var statusSpan = block.querySelector(".tool-status");
|
|
1296
|
+
statusSpan.className = "tool-status " + msg.status;
|
|
1297
|
+
statusSpan.textContent = statusIcon(msg.status);
|
|
1298
|
+
|
|
1299
|
+
// Update aria-label
|
|
1300
|
+
var toolName = block.querySelector(".tool-name");
|
|
1301
|
+
block.setAttribute("aria-label", "Tool call: " +
|
|
1302
|
+
(toolName ? toolName.textContent : "") + " - " + msg.status);
|
|
1303
|
+
|
|
1304
|
+
// Update Response section content (KSA-281: keep Request visible)
|
|
1305
|
+
if (msg.result || msg.error) {
|
|
1306
|
+
var resSection = block.querySelector(".tool-section-response");
|
|
1307
|
+
if (resSection) {
|
|
1308
|
+
var resContent = resSection.querySelector(".tool-section-content");
|
|
1309
|
+
if (resContent) {
|
|
1310
|
+
resContent.textContent = msg.error || msg.result;
|
|
1311
|
+
}
|
|
1312
|
+
if (msg.status === "failed") {
|
|
1313
|
+
resSection.classList.add("failed");
|
|
1314
|
+
} else {
|
|
1315
|
+
resSection.classList.remove("failed");
|
|
1316
|
+
}
|
|
1317
|
+
}
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1320
|
+
// Duration display - guard against duplicates (OI-6)
|
|
1321
|
+
if (msg.duration) {
|
|
1322
|
+
var existingDur = block.querySelector(".tool-duration");
|
|
1323
|
+
if (!existingDur) {
|
|
1324
|
+
var dur = document.createElement("span");
|
|
1325
|
+
dur.className = "tool-duration";
|
|
1326
|
+
dur.textContent = formatDuration(msg.duration);
|
|
1327
|
+
block.querySelector(".tool-call-header").appendChild(dur);
|
|
1328
|
+
} else {
|
|
1329
|
+
existingDur.textContent = formatDuration(msg.duration);
|
|
1330
|
+
}
|
|
1331
|
+
}
|
|
1332
|
+
|
|
1333
|
+
// Update persisted state in tab
|
|
1334
|
+
var currentTab = getTab(activeTabId);
|
|
1335
|
+
if (currentTab && currentTab.messages) {
|
|
1336
|
+
for (var i = currentTab.messages.length - 1; i >= 0; i--) {
|
|
1337
|
+
var m = currentTab.messages[i];
|
|
1338
|
+
if (m.role === "tool" && m.toolData && m.toolData.id === msg.id) {
|
|
1339
|
+
m.toolData.status = msg.status;
|
|
1340
|
+
if (msg.result) m.toolData.result = msg.result;
|
|
1341
|
+
if (msg.duration) m.toolData.duration = msg.duration;
|
|
1342
|
+
break;
|
|
1343
|
+
}
|
|
1344
|
+
}
|
|
1345
|
+
saveStateToDisk();
|
|
1346
|
+
}
|
|
1347
|
+
}
|
|
1348
|
+
|
|
1349
|
+
// KSA-247: Format duration from ms to human-readable
|
|
1350
|
+
function formatDuration(ms) {
|
|
1351
|
+
if (ms < 1000) return ms + "ms";
|
|
1352
|
+
return (ms / 1000).toFixed(1) + "s";
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1355
|
+
function statusIcon(status) {
|
|
1356
|
+
if (status === "running") return "\u23F3";
|
|
1357
|
+
if (status === "completed") return "\u2713";
|
|
1358
|
+
if (status === "failed") return "\u2717";
|
|
1359
|
+
if (status === "interrupted") return "\u23F8";
|
|
1360
|
+
return "";
|
|
1361
|
+
}
|
|
1362
|
+
|
|
1363
|
+
// === Context Chips ===
|
|
1364
|
+
function addContextChip(item) {
|
|
1365
|
+
contextItems.push(item);
|
|
1366
|
+
renderContextChips();
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
function removeContextChip(index) {
|
|
1370
|
+
contextItems.splice(index, 1);
|
|
1371
|
+
renderContextChips();
|
|
1372
|
+
}
|
|
1373
|
+
|
|
1374
|
+
function clearContextChips() {
|
|
1375
|
+
contextItems = [];
|
|
1376
|
+
inputChipsEl.innerHTML = "";
|
|
1377
|
+
}
|
|
1378
|
+
|
|
1379
|
+
function renderContextChips() {
|
|
1380
|
+
inputChipsEl.innerHTML = "";
|
|
1381
|
+
for (var i = 0; i < contextItems.length; i++) {
|
|
1382
|
+
var chip = document.createElement("span");
|
|
1383
|
+
chip.className = "context-chip";
|
|
1384
|
+
chip.innerHTML = '<span class="chip-icon">#</span>' +
|
|
1385
|
+
escapeHtml(contextItems[i].label) +
|
|
1386
|
+
'<span class="chip-remove" data-idx="' + i + '">\u00D7</span>';
|
|
1387
|
+
inputChipsEl.appendChild(chip);
|
|
1388
|
+
}
|
|
1389
|
+
var removeBtns = inputChipsEl.querySelectorAll(".chip-remove");
|
|
1390
|
+
for (var r = 0; r < removeBtns.length; r++) {
|
|
1391
|
+
removeBtns[r].addEventListener("click", function () {
|
|
1392
|
+
removeContextChip(parseInt(this.getAttribute("data-idx")));
|
|
1393
|
+
});
|
|
1394
|
+
}
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1397
|
+
// === Pipeline Status ===
|
|
1398
|
+
function handlePipelineStatus(msg) {
|
|
1399
|
+
if (msg.status === "running") {
|
|
1400
|
+
setWorking(true, msg.ticketKey + " \u2014 " + msg.phase);
|
|
1401
|
+
} else if (msg.status === "completed" || msg.status === "cancelled" || msg.status === "failed") {
|
|
1402
|
+
setWorking(false);
|
|
1403
|
+
}
|
|
1404
|
+
var statusText = msg.ticketKey
|
|
1405
|
+
? msg.ticketKey + " \u2014 " + msg.phase + " (" + msg.status + ")"
|
|
1406
|
+
: msg.status;
|
|
1407
|
+
appendMessage("system", statusText);
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1410
|
+
// === Approval Card ===
|
|
1411
|
+
function renderApprovalCard(checkpoint) {
|
|
1412
|
+
showMessages();
|
|
1413
|
+
setWorking(false);
|
|
1414
|
+
var card = document.createElement("div");
|
|
1415
|
+
card.className = "approval-card";
|
|
1416
|
+
|
|
1417
|
+
var title = document.createElement("h4");
|
|
1418
|
+
title.textContent = checkpoint.gateId + ": " + checkpoint.summary;
|
|
1419
|
+
card.appendChild(title);
|
|
1420
|
+
|
|
1421
|
+
if (checkpoint.criteria && checkpoint.criteria.length > 0) {
|
|
1422
|
+
var ul = document.createElement("ul");
|
|
1423
|
+
for (var i = 0; i < checkpoint.criteria.length; i++) {
|
|
1424
|
+
var li = document.createElement("li");
|
|
1425
|
+
li.textContent = checkpoint.criteria[i];
|
|
1426
|
+
ul.appendChild(li);
|
|
1427
|
+
}
|
|
1428
|
+
card.appendChild(ul);
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
var actions = document.createElement("div");
|
|
1432
|
+
actions.className = "actions";
|
|
1433
|
+
|
|
1434
|
+
var approveBtn = document.createElement("button");
|
|
1435
|
+
approveBtn.className = "approve";
|
|
1436
|
+
approveBtn.textContent = "Approve";
|
|
1437
|
+
approveBtn.addEventListener("click", function () {
|
|
1438
|
+
vscode.postMessage({ type: "chat:approvalAction", decision: "approve" });
|
|
1439
|
+
card.remove();
|
|
1440
|
+
appendMessage("system", "Approved \u2014 continuing pipeline...");
|
|
1441
|
+
setWorking(true);
|
|
1442
|
+
});
|
|
1443
|
+
|
|
1444
|
+
var reviseBtn = document.createElement("button");
|
|
1445
|
+
reviseBtn.className = "revise";
|
|
1446
|
+
reviseBtn.textContent = "Revise";
|
|
1447
|
+
reviseBtn.addEventListener("click", function () {
|
|
1448
|
+
vscode.postMessage({ type: "chat:approvalAction", decision: "revise" });
|
|
1449
|
+
card.remove();
|
|
1450
|
+
appendMessage("system", "Revision requested \u2014 re-running phase...");
|
|
1451
|
+
setWorking(true);
|
|
1452
|
+
});
|
|
1453
|
+
|
|
1454
|
+
var rejectBtn = document.createElement("button");
|
|
1455
|
+
rejectBtn.className = "reject";
|
|
1456
|
+
rejectBtn.textContent = "Reject";
|
|
1457
|
+
rejectBtn.addEventListener("click", function () {
|
|
1458
|
+
vscode.postMessage({ type: "chat:approvalAction", decision: "reject" });
|
|
1459
|
+
card.remove();
|
|
1460
|
+
appendMessage("system", "Rejected \u2014 pipeline stopped.");
|
|
1461
|
+
});
|
|
1462
|
+
|
|
1463
|
+
actions.appendChild(approveBtn);
|
|
1464
|
+
actions.appendChild(reviseBtn);
|
|
1465
|
+
actions.appendChild(rejectBtn);
|
|
1466
|
+
card.appendChild(actions);
|
|
1467
|
+
messagesEl.appendChild(card);
|
|
1468
|
+
scrollToBottom();
|
|
1469
|
+
}
|
|
1470
|
+
|
|
1471
|
+
// === Resume Prompt ===
|
|
1472
|
+
function renderResumePrompt(msg) {
|
|
1473
|
+
showMessages();
|
|
1474
|
+
var prompt = document.createElement("div");
|
|
1475
|
+
prompt.className = "resume-prompt";
|
|
1476
|
+
|
|
1477
|
+
var p = document.createElement("p");
|
|
1478
|
+
p.textContent = "Pipeline paused: " + msg.ticketKey + " \u2014 " + msg.phase;
|
|
1479
|
+
prompt.appendChild(p);
|
|
1480
|
+
|
|
1481
|
+
var resumeBtn = document.createElement("button");
|
|
1482
|
+
resumeBtn.textContent = "Resume";
|
|
1483
|
+
resumeBtn.addEventListener("click", function () {
|
|
1484
|
+
vscode.postMessage({ type: "chat:resumePipeline", threadId: msg.threadId });
|
|
1485
|
+
prompt.remove();
|
|
1486
|
+
setWorking(true, "Resuming...");
|
|
1487
|
+
});
|
|
1488
|
+
|
|
1489
|
+
var freshBtn = document.createElement("button");
|
|
1490
|
+
freshBtn.textContent = "Start Fresh";
|
|
1491
|
+
freshBtn.addEventListener("click", function () {
|
|
1492
|
+
vscode.postMessage({ type: "chat:startFresh" });
|
|
1493
|
+
prompt.remove();
|
|
1494
|
+
});
|
|
1495
|
+
|
|
1496
|
+
prompt.appendChild(resumeBtn);
|
|
1497
|
+
prompt.appendChild(freshBtn);
|
|
1498
|
+
messagesEl.appendChild(prompt);
|
|
1499
|
+
scrollToBottom();
|
|
1500
|
+
}
|
|
1501
|
+
|
|
1502
|
+
// === Error ===
|
|
1503
|
+
function renderError(msg) {
|
|
1504
|
+
showMessages();
|
|
1505
|
+
appendMessage("error", msg.message);
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1508
|
+
// === Server Status ===
|
|
1509
|
+
function updateServerStatus(status) {
|
|
1510
|
+
statusEl.textContent = status;
|
|
1511
|
+
statusEl.className = "status " + status;
|
|
1512
|
+
}
|
|
1513
|
+
|
|
1514
|
+
// === Code Actions (Copy, Apply, Insert) ===
|
|
1515
|
+
function addCodeActions(container) {
|
|
1516
|
+
var preBlocks = container.querySelectorAll("pre");
|
|
1517
|
+
for (var i = 0; i < preBlocks.length; i++) {
|
|
1518
|
+
if (preBlocks[i].querySelector(".code-actions")) continue;
|
|
1519
|
+
var pre = preBlocks[i];
|
|
1520
|
+
var actionsDiv = document.createElement("div");
|
|
1521
|
+
actionsDiv.className = "code-actions";
|
|
1522
|
+
|
|
1523
|
+
actionsDiv.appendChild(createCodeBtn("Copy", pre, function (p) {
|
|
1524
|
+
var code = p.querySelector("code");
|
|
1525
|
+
var text = code ? code.textContent : p.textContent;
|
|
1526
|
+
navigator.clipboard.writeText(text || "");
|
|
1527
|
+
}));
|
|
1528
|
+
|
|
1529
|
+
actionsDiv.appendChild(createCodeBtn("Apply", pre, function (p) {
|
|
1530
|
+
var code = p.querySelector("code");
|
|
1531
|
+
var text = code ? code.textContent : p.textContent;
|
|
1532
|
+
var filePath = extractFilePathFromContext(p);
|
|
1533
|
+
vscode.postMessage({ type: "chat:applyCode", code: text || "", filePath: filePath || "" });
|
|
1534
|
+
}));
|
|
1535
|
+
|
|
1536
|
+
actionsDiv.appendChild(createCodeBtn("Insert", pre, function (p) {
|
|
1537
|
+
var code = p.querySelector("code");
|
|
1538
|
+
var text = code ? code.textContent : p.textContent;
|
|
1539
|
+
vscode.postMessage({ type: "chat:insertCode", code: text || "" });
|
|
1540
|
+
}));
|
|
1541
|
+
|
|
1542
|
+
pre.appendChild(actionsDiv);
|
|
1543
|
+
|
|
1544
|
+
// Language label
|
|
1545
|
+
var codeEl = pre.querySelector("code");
|
|
1546
|
+
if (codeEl && codeEl.className) {
|
|
1547
|
+
var langMatch = codeEl.className.match(/language-(\w+)/);
|
|
1548
|
+
if (langMatch) {
|
|
1549
|
+
var langLabel = document.createElement("span");
|
|
1550
|
+
langLabel.className = "code-lang-label";
|
|
1551
|
+
langLabel.textContent = langMatch[1];
|
|
1552
|
+
pre.appendChild(langLabel);
|
|
1553
|
+
}
|
|
1554
|
+
}
|
|
1555
|
+
}
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1558
|
+
function createCodeBtn(label, pre, handler) {
|
|
1559
|
+
var btn = document.createElement("button");
|
|
1560
|
+
btn.textContent = label;
|
|
1561
|
+
btn.addEventListener("click", (function (p) {
|
|
1562
|
+
return function () { handler(p); };
|
|
1563
|
+
})(pre));
|
|
1564
|
+
return btn;
|
|
1565
|
+
}
|
|
1566
|
+
|
|
1567
|
+
// Extract file path from surrounding context of a code block
|
|
1568
|
+
function extractFilePathFromContext(preEl) {
|
|
1569
|
+
// Strategy 1: Check data-file attribute (set by markdown renderer)
|
|
1570
|
+
if (preEl.dataset && preEl.dataset.file) return preEl.dataset.file;
|
|
1571
|
+
|
|
1572
|
+
// Strategy 2: Look at preceding sibling text for file path patterns
|
|
1573
|
+
var prev = preEl.previousElementSibling;
|
|
1574
|
+
if (prev) {
|
|
1575
|
+
var text = prev.textContent || "";
|
|
1576
|
+
// Match patterns like "src/index.ts:", "File: src/main.ts", "`path/to/file.ext`"
|
|
1577
|
+
var pathMatch = text.match(/(?:^|\s|`)([a-zA-Z0-9_./-]+\.[a-zA-Z]{1,10})(?:`|:|$|\s)/);
|
|
1578
|
+
if (pathMatch) return pathMatch[1];
|
|
1579
|
+
}
|
|
1580
|
+
|
|
1581
|
+
// Strategy 3: Look at the lang label — sometimes it's "typescript:src/file.ts"
|
|
1582
|
+
var langLabel = preEl.querySelector(".code-lang-label");
|
|
1583
|
+
if (langLabel) {
|
|
1584
|
+
var labelText = langLabel.textContent || "";
|
|
1585
|
+
if (labelText.includes("/") || labelText.includes("\\")) return labelText;
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
// Strategy 4: Scan parent message for file path mentioned before this code block
|
|
1589
|
+
var message = preEl.closest(".message");
|
|
1590
|
+
if (message) {
|
|
1591
|
+
var allText = message.textContent || "";
|
|
1592
|
+
// Find paths like src/xxx.ts, backend/xxx.kt etc
|
|
1593
|
+
var paths = allText.match(/(?:src|backend|lib|app)\/[\w./-]+\.\w{1,10}/g);
|
|
1594
|
+
if (paths && paths.length > 0) return paths[0];
|
|
1595
|
+
}
|
|
1596
|
+
|
|
1597
|
+
return "";
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1600
|
+
// === Utilities ===
|
|
1601
|
+
function scrollToBottom() {
|
|
1602
|
+
messagesEl.scrollTop = messagesEl.scrollHeight;
|
|
1603
|
+
}
|
|
1604
|
+
|
|
1605
|
+
function escapeHtml(str) {
|
|
1606
|
+
return (str || "").replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
1607
|
+
}
|
|
1608
|
+
|
|
1609
|
+
// === Tab/Context Update Handlers (KSA-240) ===
|
|
1610
|
+
function handleTabsUpdated(payload) {
|
|
1611
|
+
if (!payload) return;
|
|
1612
|
+
if (payload.tabs) {
|
|
1613
|
+
tabs = payload.tabs.map(function(t) {
|
|
1614
|
+
return { id: t.id, name: t.name, messages: t.messages || [], tokenCount: t.tokenCount || 0, maxTokens: t.maxTokens || 128000 };
|
|
1615
|
+
});
|
|
1616
|
+
}
|
|
1617
|
+
// Restore input history if provided
|
|
1618
|
+
if (payload.messageHistory && Array.isArray(payload.messageHistory)) {
|
|
1619
|
+
messageHistory = payload.messageHistory;
|
|
1620
|
+
}
|
|
1621
|
+
// Update tabCounter to avoid duplicate names
|
|
1622
|
+
tabCounter = tabs.length;
|
|
1623
|
+
|
|
1624
|
+
// Render tab bar first, then switch to active tab to render its messages correctly
|
|
1625
|
+
if (payload.activeTabId && getTab(payload.activeTabId)) {
|
|
1626
|
+
// Force activeTabId to differ so switchToTab actually executes
|
|
1627
|
+
activeTabId = "";
|
|
1628
|
+
renderTabBar();
|
|
1629
|
+
switchToTab(payload.activeTabId);
|
|
1630
|
+
} else if (tabs.length > 0) {
|
|
1631
|
+
activeTabId = "";
|
|
1632
|
+
renderTabBar();
|
|
1633
|
+
switchToTab(tabs[0].id);
|
|
1634
|
+
} else {
|
|
1635
|
+
renderTabBar();
|
|
1636
|
+
}
|
|
1637
|
+
}
|
|
1638
|
+
|
|
1639
|
+
function handleContextUpdate(payload) {
|
|
1640
|
+
if (!payload) return;
|
|
1641
|
+
// Update local tab data
|
|
1642
|
+
var tab = getTab(payload.tabId);
|
|
1643
|
+
if (tab) {
|
|
1644
|
+
tab.tokenCount = payload.tokenCount;
|
|
1645
|
+
tab.maxTokens = payload.maxTokens;
|
|
1646
|
+
}
|
|
1647
|
+
// Only update icon if this is the active tab
|
|
1648
|
+
if (payload.tabId === activeTabId) {
|
|
1649
|
+
updateContextIcon(payload.tokenCount, payload.maxTokens);
|
|
1650
|
+
}
|
|
1651
|
+
}
|
|
1652
|
+
|
|
1653
|
+
// === State Persistence (KSA-240) ===
|
|
1654
|
+
var saveTimer = null;
|
|
1655
|
+
|
|
1656
|
+
function saveStateToDisk() {
|
|
1657
|
+
if (saveTimer) clearTimeout(saveTimer);
|
|
1658
|
+
saveTimer = setTimeout(function() {
|
|
1659
|
+
vscode.postMessage({
|
|
1660
|
+
type: "chat:saveState",
|
|
1661
|
+
payload: { tabs: tabs, activeTabId: activeTabId, messageHistory: messageHistory }
|
|
1662
|
+
});
|
|
1663
|
+
}, 500);
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1666
|
+
// === Steering Rules & Hooks Rendering (KSA-240) ===
|
|
1667
|
+
var steeringSection = document.getElementById("steering-section");
|
|
1668
|
+
var steeringHeader = document.getElementById("steering-header");
|
|
1669
|
+
var steeringList = document.getElementById("steering-list");
|
|
1670
|
+
var steeringCount = document.getElementById("steering-count");
|
|
1671
|
+
|
|
1672
|
+
steeringHeader.addEventListener("click", function() {
|
|
1673
|
+
steeringSection.classList.toggle("expanded");
|
|
1674
|
+
});
|
|
1675
|
+
|
|
1676
|
+
function renderSteeringRules(rules) {
|
|
1677
|
+
if (!rules || rules.length === 0) return;
|
|
1678
|
+
steeringSection.classList.add("visible");
|
|
1679
|
+
steeringCount.textContent = "(" + rules.length + ")";
|
|
1680
|
+
steeringList.innerHTML = "";
|
|
1681
|
+
for (var i = 0; i < rules.length; i++) {
|
|
1682
|
+
var badge = document.createElement("span");
|
|
1683
|
+
badge.className = "steering-badge";
|
|
1684
|
+
badge.innerHTML = '<span class="badge-icon">\u{1F4CB}</span>' + escapeHtml(rules[i].name);
|
|
1685
|
+
badge.title = rules[i].file;
|
|
1686
|
+
steeringList.appendChild(badge);
|
|
1687
|
+
}
|
|
1688
|
+
}
|
|
1689
|
+
|
|
1690
|
+
function renderHookBadge(hook) {
|
|
1691
|
+
if (!hook) return;
|
|
1692
|
+
showMessages();
|
|
1693
|
+
var el = document.createElement("div");
|
|
1694
|
+
el.className = "hook-badge";
|
|
1695
|
+
var statusIcon = hook.status === "completed" ? "\u2713" : hook.status === "skipped" ? "\u23ED" : "\u23F3";
|
|
1696
|
+
el.innerHTML = '<span class="hook-icon">\u{1F517}</span>' +
|
|
1697
|
+
'<span class="hook-name">' + escapeHtml(hook.name) + '</span>' +
|
|
1698
|
+
'<span class="hook-status ' + hook.status + '">' + statusIcon + '</span>';
|
|
1699
|
+
messagesEl.appendChild(el);
|
|
1700
|
+
scrollToBottom();
|
|
1701
|
+
}
|
|
1702
|
+
|
|
1703
|
+
// === Slash Command Popup ===
|
|
1704
|
+
var slashPopup = document.getElementById("slash-popup");
|
|
1705
|
+
var slashSteeringList = document.getElementById("slash-steering-list");
|
|
1706
|
+
var slashActiveIndex = -1;
|
|
1707
|
+
var slashVisible = false;
|
|
1708
|
+
var slashFilterText = "";
|
|
1709
|
+
|
|
1710
|
+
// Steering rules data (populated from extension message or defaults)
|
|
1711
|
+
var slashSteeringRules = [];
|
|
1712
|
+
|
|
1713
|
+
// Populate steering list from chat:steeringLoaded message data
|
|
1714
|
+
function populateSlashSteering(rules) {
|
|
1715
|
+
slashSteeringRules = rules || [];
|
|
1716
|
+
slashSteeringList.innerHTML = "";
|
|
1717
|
+
for (var i = 0; i < slashSteeringRules.length; i++) {
|
|
1718
|
+
var btn = document.createElement("button");
|
|
1719
|
+
btn.type = "button";
|
|
1720
|
+
btn.className = "slash-item";
|
|
1721
|
+
btn.setAttribute("data-slash", "/" + slashSteeringRules[i].name);
|
|
1722
|
+
btn.setAttribute("role", "option");
|
|
1723
|
+
btn.innerHTML = '<span class="slash-icon">\u{1F9ED}</span>' +
|
|
1724
|
+
'<span class="slash-label">' + escapeHtml(slashSteeringRules[i].name) + '</span>' +
|
|
1725
|
+
'<span class="slash-desc">' + escapeHtml(slashSteeringRules[i].file || "") + '</span>';
|
|
1726
|
+
slashSteeringList.appendChild(btn);
|
|
1727
|
+
}
|
|
1728
|
+
}
|
|
1729
|
+
|
|
1730
|
+
// Default steering entries (fallback if extension hasn't sent steeringLoaded)
|
|
1731
|
+
var defaultSteeringNames = [
|
|
1732
|
+
"concise-responses", "sm-core", "phase-1-requirements", "phase-2-specification",
|
|
1733
|
+
"phase-3-design", "phase-4-test-planning", "phase-5-implementation",
|
|
1734
|
+
"phase-6-testing", "phase-7-deployment", "shared-jira", "shared-quality-gates",
|
|
1735
|
+
"shared-diagrams", "tool-usage-dynamic", "code-standards"
|
|
1736
|
+
];
|
|
1737
|
+
(function initDefaultSteering() {
|
|
1738
|
+
var defaults = [];
|
|
1739
|
+
for (var i = 0; i < defaultSteeringNames.length; i++) {
|
|
1740
|
+
defaults.push({ name: defaultSteeringNames[i], file: ".kiro/steering/" + defaultSteeringNames[i] + ".md" });
|
|
1741
|
+
}
|
|
1742
|
+
populateSlashSteering(defaults);
|
|
1743
|
+
})();
|
|
1744
|
+
|
|
1745
|
+
// Override renderSteeringRules to also populate slash popup
|
|
1746
|
+
var _origRenderSteering = renderSteeringRules;
|
|
1747
|
+
renderSteeringRules = function(rules) {
|
|
1748
|
+
_origRenderSteering(rules);
|
|
1749
|
+
populateSlashSteering(rules);
|
|
1750
|
+
};
|
|
1751
|
+
|
|
1752
|
+
function showSlashPopup() {
|
|
1753
|
+
slashPopup.classList.remove("hidden");
|
|
1754
|
+
slashVisible = true;
|
|
1755
|
+
slashActiveIndex = -1;
|
|
1756
|
+
filterSlashItems();
|
|
1757
|
+
}
|
|
1758
|
+
|
|
1759
|
+
function hideSlashPopup() {
|
|
1760
|
+
slashPopup.classList.add("hidden");
|
|
1761
|
+
slashVisible = false;
|
|
1762
|
+
slashActiveIndex = -1;
|
|
1763
|
+
slashFilterText = "";
|
|
1764
|
+
// Remove active class from all items
|
|
1765
|
+
var items = slashPopup.querySelectorAll(".slash-item");
|
|
1766
|
+
for (var i = 0; i < items.length; i++) {
|
|
1767
|
+
items[i].classList.remove("active");
|
|
1768
|
+
}
|
|
1769
|
+
}
|
|
1770
|
+
|
|
1771
|
+
function filterSlashItems() {
|
|
1772
|
+
var filter = slashFilterText.toLowerCase();
|
|
1773
|
+
var items = slashPopup.querySelectorAll(".slash-item");
|
|
1774
|
+
for (var i = 0; i < items.length; i++) {
|
|
1775
|
+
var label = items[i].getAttribute("data-slash") || "";
|
|
1776
|
+
var desc = items[i].querySelector(".slash-desc");
|
|
1777
|
+
var descText = desc ? desc.textContent : "";
|
|
1778
|
+
var matches = !filter || label.toLowerCase().indexOf(filter) !== -1 || descText.toLowerCase().indexOf(filter) !== -1;
|
|
1779
|
+
items[i].style.display = matches ? "" : "none";
|
|
1780
|
+
}
|
|
1781
|
+
// Show/hide section titles based on visible children
|
|
1782
|
+
var sections = slashPopup.querySelectorAll(".slash-section");
|
|
1783
|
+
for (var s = 0; s < sections.length; s++) {
|
|
1784
|
+
var sectionItems = sections[s].querySelectorAll(".slash-item");
|
|
1785
|
+
var hasVisible = false;
|
|
1786
|
+
for (var si = 0; si < sectionItems.length; si++) {
|
|
1787
|
+
if (sectionItems[si].style.display !== "none") { hasVisible = true; break; }
|
|
1788
|
+
}
|
|
1789
|
+
sections[s].style.display = hasVisible ? "" : "none";
|
|
1790
|
+
}
|
|
1791
|
+
}
|
|
1792
|
+
|
|
1793
|
+
function getVisibleSlashItems() {
|
|
1794
|
+
var items = slashPopup.querySelectorAll(".slash-item");
|
|
1795
|
+
var visible = [];
|
|
1796
|
+
for (var i = 0; i < items.length; i++) {
|
|
1797
|
+
if (items[i].style.display !== "none") visible.push(items[i]);
|
|
1798
|
+
}
|
|
1799
|
+
return visible;
|
|
1800
|
+
}
|
|
1801
|
+
|
|
1802
|
+
function selectSlashItem(item) {
|
|
1803
|
+
if (!item) return;
|
|
1804
|
+
var slashValue = item.getAttribute("data-slash");
|
|
1805
|
+
var slashLabel = item.querySelector(".slash-label");
|
|
1806
|
+
var slashIcon = item.querySelector(".slash-icon");
|
|
1807
|
+
var label = slashLabel ? slashLabel.textContent : slashValue;
|
|
1808
|
+
var icon = slashIcon ? slashIcon.textContent : "/";
|
|
1809
|
+
|
|
1810
|
+
// Insert inline badge in contenteditable
|
|
1811
|
+
insertSlashBadge(label, slashValue, icon);
|
|
1812
|
+
|
|
1813
|
+
hideSlashPopup();
|
|
1814
|
+
inputEl.focus();
|
|
1815
|
+
}
|
|
1816
|
+
|
|
1817
|
+
// Detect / trigger in input — listen on the existing input handler
|
|
1818
|
+
var _origInputHandler = inputEl.oninput;
|
|
1819
|
+
inputEl.addEventListener("input", function () {
|
|
1820
|
+
var ctx = getCursorContext();
|
|
1821
|
+
var beforeCursor = ctx.text.substring(0, ctx.cursorPos);
|
|
1822
|
+
|
|
1823
|
+
// Check if / is at start or after a space
|
|
1824
|
+
var slashIdx = beforeCursor.lastIndexOf("/");
|
|
1825
|
+
var shouldShow = false;
|
|
1826
|
+
|
|
1827
|
+
if (slashIdx !== -1) {
|
|
1828
|
+
if (slashIdx === 0 || /[\s\n\u00A0]/.test(beforeCursor[slashIdx - 1])) {
|
|
1829
|
+
var afterSlash = beforeCursor.substring(slashIdx + 1);
|
|
1830
|
+
if (afterSlash.indexOf(" ") === -1) {
|
|
1831
|
+
shouldShow = true;
|
|
1832
|
+
slashFilterText = afterSlash;
|
|
1833
|
+
}
|
|
1834
|
+
}
|
|
1835
|
+
}
|
|
1836
|
+
|
|
1837
|
+
if (shouldShow) {
|
|
1838
|
+
if (!slashVisible) showSlashPopup();
|
|
1839
|
+
else filterSlashItems();
|
|
1840
|
+
} else if (slashVisible) {
|
|
1841
|
+
hideSlashPopup();
|
|
1842
|
+
}
|
|
1843
|
+
});
|
|
1844
|
+
|
|
1845
|
+
// Keyboard navigation for slash popup (added before the existing keydown)
|
|
1846
|
+
inputEl.addEventListener("keydown", function (e) {
|
|
1847
|
+
if (!slashVisible) return;
|
|
1848
|
+
|
|
1849
|
+
if (e.key === "ArrowDown") {
|
|
1850
|
+
e.preventDefault();
|
|
1851
|
+
e.stopImmediatePropagation();
|
|
1852
|
+
var items = getVisibleSlashItems();
|
|
1853
|
+
if (items.length === 0) return;
|
|
1854
|
+
slashActiveIndex = Math.min(slashActiveIndex + 1, items.length - 1);
|
|
1855
|
+
updateSlashActive(items);
|
|
1856
|
+
} else if (e.key === "ArrowUp") {
|
|
1857
|
+
e.preventDefault();
|
|
1858
|
+
e.stopImmediatePropagation();
|
|
1859
|
+
var items2 = getVisibleSlashItems();
|
|
1860
|
+
if (items2.length === 0) return;
|
|
1861
|
+
slashActiveIndex = Math.max(slashActiveIndex - 1, 0);
|
|
1862
|
+
updateSlashActive(items2);
|
|
1863
|
+
} else if (e.key === "Enter" || e.key === "Tab") {
|
|
1864
|
+
var items3 = getVisibleSlashItems();
|
|
1865
|
+
if (items3.length > 0 && slashActiveIndex >= 0) {
|
|
1866
|
+
e.preventDefault();
|
|
1867
|
+
e.stopImmediatePropagation();
|
|
1868
|
+
selectSlashItem(items3[slashActiveIndex]);
|
|
1869
|
+
} else if (e.key === "Tab" && items3.length > 0) {
|
|
1870
|
+
e.preventDefault();
|
|
1871
|
+
e.stopImmediatePropagation();
|
|
1872
|
+
selectSlashItem(items3[0]);
|
|
1873
|
+
}
|
|
1874
|
+
} else if (e.key === "Escape") {
|
|
1875
|
+
e.preventDefault();
|
|
1876
|
+
e.stopImmediatePropagation();
|
|
1877
|
+
hideSlashPopup();
|
|
1878
|
+
}
|
|
1879
|
+
}, true); // capture phase to intercept before other handlers
|
|
1880
|
+
|
|
1881
|
+
function updateSlashActive(items) {
|
|
1882
|
+
for (var i = 0; i < items.length; i++) {
|
|
1883
|
+
items[i].classList.toggle("active", i === slashActiveIndex);
|
|
1884
|
+
}
|
|
1885
|
+
// Scroll active into view
|
|
1886
|
+
if (slashActiveIndex >= 0 && items[slashActiveIndex]) {
|
|
1887
|
+
items[slashActiveIndex].scrollIntoView({ block: "nearest" });
|
|
1888
|
+
}
|
|
1889
|
+
}
|
|
1890
|
+
|
|
1891
|
+
// Click handler for slash items
|
|
1892
|
+
slashPopup.addEventListener("click", function (e) {
|
|
1893
|
+
var item = e.target.closest ? e.target.closest(".slash-item") : null;
|
|
1894
|
+
if (item) {
|
|
1895
|
+
e.preventDefault();
|
|
1896
|
+
e.stopPropagation();
|
|
1897
|
+
selectSlashItem(item);
|
|
1898
|
+
}
|
|
1899
|
+
});
|
|
1900
|
+
|
|
1901
|
+
// Hide popup on outside click
|
|
1902
|
+
document.addEventListener("click", function (e) {
|
|
1903
|
+
if (slashVisible && !slashPopup.contains(e.target) && e.target !== inputEl) {
|
|
1904
|
+
hideSlashPopup();
|
|
1905
|
+
}
|
|
1906
|
+
});
|
|
1907
|
+
})();
|