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.
Files changed (1434) hide show
  1. package/README.md +244 -0
  2. package/dist/admin/__tests__/admin-db.test.d.ts +5 -0
  3. package/dist/admin/__tests__/admin-db.test.js +357 -0
  4. package/dist/admin/__tests__/admin-db.test.js.map +1 -0
  5. package/dist/admin/admin-db.d.ts +120 -0
  6. package/dist/admin/admin-db.js +1056 -0
  7. package/dist/admin/admin-db.js.map +1 -0
  8. package/dist/admin/index.d.ts +13 -0
  9. package/dist/admin/index.js +73 -0
  10. package/dist/admin/index.js.map +1 -0
  11. package/dist/admin/middleware/audit.middleware.d.ts +13 -0
  12. package/dist/admin/middleware/audit.middleware.js +57 -0
  13. package/dist/admin/middleware/audit.middleware.js.map +1 -0
  14. package/dist/admin/middleware/rate-limit.middleware.d.ts +2 -0
  15. package/dist/admin/middleware/rate-limit.middleware.js +47 -0
  16. package/dist/admin/middleware/rate-limit.middleware.js.map +1 -0
  17. package/dist/admin/middleware/rbac.middleware.d.ts +8 -0
  18. package/dist/admin/middleware/rbac.middleware.js +111 -0
  19. package/dist/admin/middleware/rbac.middleware.js.map +1 -0
  20. package/dist/admin/routes/analytics.router.d.ts +3 -0
  21. package/dist/admin/routes/analytics.router.js +47 -0
  22. package/dist/admin/routes/analytics.router.js.map +1 -0
  23. package/dist/admin/routes/audit.router.d.ts +4 -0
  24. package/dist/admin/routes/audit.router.js +27 -0
  25. package/dist/admin/routes/audit.router.js.map +1 -0
  26. package/dist/admin/routes/config.router.d.ts +4 -0
  27. package/dist/admin/routes/config.router.js +23 -0
  28. package/dist/admin/routes/config.router.js.map +1 -0
  29. package/dist/admin/routes/dashboard.router.d.ts +5 -0
  30. package/dist/admin/routes/dashboard.router.js +11 -0
  31. package/dist/admin/routes/dashboard.router.js.map +1 -0
  32. package/dist/admin/routes/helpers.d.ts +26 -0
  33. package/dist/admin/routes/helpers.js +13 -0
  34. package/dist/admin/routes/helpers.js.map +1 -0
  35. package/dist/admin/routes/kb-admin.router.d.ts +5 -0
  36. package/dist/admin/routes/kb-admin.router.js +49 -0
  37. package/dist/admin/routes/kb-admin.router.js.map +1 -0
  38. package/dist/admin/routes/mcp-admin.router.d.ts +4 -0
  39. package/dist/admin/routes/mcp-admin.router.js +35 -0
  40. package/dist/admin/routes/mcp-admin.router.js.map +1 -0
  41. package/dist/admin/routes/rbac.router.d.ts +4 -0
  42. package/dist/admin/routes/rbac.router.js +71 -0
  43. package/dist/admin/routes/rbac.router.js.map +1 -0
  44. package/dist/admin/routes/search.router.d.ts +3 -0
  45. package/dist/admin/routes/search.router.js +20 -0
  46. package/dist/admin/routes/search.router.js.map +1 -0
  47. package/dist/admin/routes/user.router.d.ts +4 -0
  48. package/dist/admin/routes/user.router.js +53 -0
  49. package/dist/admin/routes/user.router.js.map +1 -0
  50. package/dist/admin/services/audit.service.d.ts +13 -0
  51. package/dist/admin/services/audit.service.js +40 -0
  52. package/dist/admin/services/audit.service.js.map +1 -0
  53. package/dist/admin/services/config.service.d.ts +10 -0
  54. package/dist/admin/services/config.service.js +31 -0
  55. package/dist/admin/services/config.service.js.map +1 -0
  56. package/dist/admin/services/dashboard.service.d.ts +9 -0
  57. package/dist/admin/services/dashboard.service.js +46 -0
  58. package/dist/admin/services/dashboard.service.js.map +1 -0
  59. package/dist/admin/services/kb-admin.service.d.ts +27 -0
  60. package/dist/admin/services/kb-admin.service.js +74 -0
  61. package/dist/admin/services/kb-admin.service.js.map +1 -0
  62. package/dist/admin/services/mcp-admin.service.d.ts +13 -0
  63. package/dist/admin/services/mcp-admin.service.js +40 -0
  64. package/dist/admin/services/mcp-admin.service.js.map +1 -0
  65. package/dist/admin/services/rbac.service.d.ts +16 -0
  66. package/dist/admin/services/rbac.service.js +104 -0
  67. package/dist/admin/services/rbac.service.js.map +1 -0
  68. package/dist/admin/services/search.service.d.ts +23 -0
  69. package/dist/admin/services/search.service.js +36 -0
  70. package/dist/admin/services/search.service.js.map +1 -0
  71. package/dist/admin/services/sse.manager.d.ts +12 -0
  72. package/dist/admin/services/sse.manager.js +55 -0
  73. package/dist/admin/services/sse.manager.js.map +1 -0
  74. package/dist/admin/services/user.service.d.ts +25 -0
  75. package/dist/admin/services/user.service.js +69 -0
  76. package/dist/admin/services/user.service.js.map +1 -0
  77. package/dist/admin/standalone-server.d.ts +1 -0
  78. package/dist/admin/standalone-server.js +94 -0
  79. package/dist/admin/standalone-server.js.map +1 -0
  80. package/dist/admin/types/admin.types.d.ts +187 -0
  81. package/dist/admin/types/admin.types.js +28 -0
  82. package/dist/admin/types/admin.types.js.map +1 -0
  83. package/dist/admin/types/api.types.d.ts +41 -0
  84. package/dist/admin/types/api.types.js +44 -0
  85. package/dist/admin/types/api.types.js.map +1 -0
  86. package/dist/admin/types/rbac.types.d.ts +86 -0
  87. package/dist/admin/types/rbac.types.js +6 -0
  88. package/dist/admin/types/rbac.types.js.map +1 -0
  89. package/dist/config/BackendConfig.d.ts +32 -0
  90. package/dist/config/BackendConfig.js +41 -0
  91. package/dist/config/BackendConfig.js.map +1 -0
  92. package/dist/engine/analyzers/complexity/ComplexityAnalyzer.d.ts +24 -0
  93. package/dist/engine/analyzers/complexity/ComplexityAnalyzer.js +90 -0
  94. package/dist/engine/analyzers/complexity/ComplexityAnalyzer.js.map +1 -0
  95. package/dist/engine/analyzers/complexity/ComplexityCalculator.d.ts +19 -0
  96. package/dist/engine/analyzers/complexity/ComplexityCalculator.js +54 -0
  97. package/dist/engine/analyzers/complexity/ComplexityCalculator.js.map +1 -0
  98. package/dist/engine/analyzers/complexity/ComplexityStore.d.ts +22 -0
  99. package/dist/engine/analyzers/complexity/ComplexityStore.js +152 -0
  100. package/dist/engine/analyzers/complexity/ComplexityStore.js.map +1 -0
  101. package/dist/engine/analyzers/complexity/ComplexityTool.d.ts +45 -0
  102. package/dist/engine/analyzers/complexity/ComplexityTool.js +58 -0
  103. package/dist/engine/analyzers/complexity/ComplexityTool.js.map +1 -0
  104. package/dist/engine/analyzers/complexity/GradeAssigner.d.ts +12 -0
  105. package/dist/engine/analyzers/complexity/GradeAssigner.js +32 -0
  106. package/dist/engine/analyzers/complexity/GradeAssigner.js.map +1 -0
  107. package/dist/engine/analyzers/complexity/counters/BaseNodeCounter.d.ts +25 -0
  108. package/dist/engine/analyzers/complexity/counters/BaseNodeCounter.js +85 -0
  109. package/dist/engine/analyzers/complexity/counters/BaseNodeCounter.js.map +1 -0
  110. package/dist/engine/analyzers/complexity/counters/GoCounter.d.ts +14 -0
  111. package/dist/engine/analyzers/complexity/counters/GoCounter.js +31 -0
  112. package/dist/engine/analyzers/complexity/counters/GoCounter.js.map +1 -0
  113. package/dist/engine/analyzers/complexity/counters/JavaCounter.d.ts +13 -0
  114. package/dist/engine/analyzers/complexity/counters/JavaCounter.js +29 -0
  115. package/dist/engine/analyzers/complexity/counters/JavaCounter.js.map +1 -0
  116. package/dist/engine/analyzers/complexity/counters/KotlinCounter.d.ts +14 -0
  117. package/dist/engine/analyzers/complexity/counters/KotlinCounter.js +34 -0
  118. package/dist/engine/analyzers/complexity/counters/KotlinCounter.js.map +1 -0
  119. package/dist/engine/analyzers/complexity/counters/PythonCounter.d.ts +14 -0
  120. package/dist/engine/analyzers/complexity/counters/PythonCounter.js +36 -0
  121. package/dist/engine/analyzers/complexity/counters/PythonCounter.js.map +1 -0
  122. package/dist/engine/analyzers/complexity/counters/TypeScriptCounter.d.ts +13 -0
  123. package/dist/engine/analyzers/complexity/counters/TypeScriptCounter.js +33 -0
  124. package/dist/engine/analyzers/complexity/counters/TypeScriptCounter.js.map +1 -0
  125. package/dist/engine/analyzers/complexity/index.d.ts +16 -0
  126. package/dist/engine/analyzers/complexity/index.js +16 -0
  127. package/dist/engine/analyzers/complexity/index.js.map +1 -0
  128. package/dist/engine/analyzers/complexity/types.d.ts +53 -0
  129. package/dist/engine/analyzers/complexity/types.js +5 -0
  130. package/dist/engine/analyzers/complexity/types.js.map +1 -0
  131. package/dist/engine/analyzers/entry-points/EntryPointDetector.d.ts +27 -0
  132. package/dist/engine/analyzers/entry-points/EntryPointDetector.js +60 -0
  133. package/dist/engine/analyzers/entry-points/EntryPointDetector.js.map +1 -0
  134. package/dist/engine/analyzers/entry-points/EntryPointStore.d.ts +20 -0
  135. package/dist/engine/analyzers/entry-points/EntryPointStore.js +133 -0
  136. package/dist/engine/analyzers/entry-points/EntryPointStore.js.map +1 -0
  137. package/dist/engine/analyzers/entry-points/EntryPointTool.d.ts +43 -0
  138. package/dist/engine/analyzers/entry-points/EntryPointTool.js +55 -0
  139. package/dist/engine/analyzers/entry-points/EntryPointTool.js.map +1 -0
  140. package/dist/engine/analyzers/entry-points/FrameworkDetector.d.ts +13 -0
  141. package/dist/engine/analyzers/entry-points/FrameworkDetector.js +49 -0
  142. package/dist/engine/analyzers/entry-points/FrameworkDetector.js.map +1 -0
  143. package/dist/engine/analyzers/entry-points/PatternRegistry.d.ts +27 -0
  144. package/dist/engine/analyzers/entry-points/PatternRegistry.js +105 -0
  145. package/dist/engine/analyzers/entry-points/PatternRegistry.js.map +1 -0
  146. package/dist/engine/analyzers/entry-points/RouteResolver.d.ts +12 -0
  147. package/dist/engine/analyzers/entry-points/RouteResolver.js +43 -0
  148. package/dist/engine/analyzers/entry-points/RouteResolver.js.map +1 -0
  149. package/dist/engine/analyzers/entry-points/detectors/CLIDetector.d.ts +14 -0
  150. package/dist/engine/analyzers/entry-points/detectors/CLIDetector.js +39 -0
  151. package/dist/engine/analyzers/entry-points/detectors/CLIDetector.js.map +1 -0
  152. package/dist/engine/analyzers/entry-points/detectors/EventDetector.d.ts +16 -0
  153. package/dist/engine/analyzers/entry-points/detectors/EventDetector.js +67 -0
  154. package/dist/engine/analyzers/entry-points/detectors/EventDetector.js.map +1 -0
  155. package/dist/engine/analyzers/entry-points/detectors/HTTPHandlerDetector.d.ts +30 -0
  156. package/dist/engine/analyzers/entry-points/detectors/HTTPHandlerDetector.js +140 -0
  157. package/dist/engine/analyzers/entry-points/detectors/HTTPHandlerDetector.js.map +1 -0
  158. package/dist/engine/analyzers/entry-points/detectors/MainDetector.d.ts +17 -0
  159. package/dist/engine/analyzers/entry-points/detectors/MainDetector.js +51 -0
  160. package/dist/engine/analyzers/entry-points/detectors/MainDetector.js.map +1 -0
  161. package/dist/engine/analyzers/entry-points/index.d.ts +14 -0
  162. package/dist/engine/analyzers/entry-points/index.js +14 -0
  163. package/dist/engine/analyzers/entry-points/index.js.map +1 -0
  164. package/dist/engine/analyzers/entry-points/types.d.ts +77 -0
  165. package/dist/engine/analyzers/entry-points/types.js +5 -0
  166. package/dist/engine/analyzers/entry-points/types.js.map +1 -0
  167. package/dist/engine/analyzers/graph-analysis/CircularDepDetector.d.ts +16 -0
  168. package/dist/engine/analyzers/graph-analysis/CircularDepDetector.js +80 -0
  169. package/dist/engine/analyzers/graph-analysis/CircularDepDetector.js.map +1 -0
  170. package/dist/engine/analyzers/graph-analysis/DeadImportDetector.d.ts +15 -0
  171. package/dist/engine/analyzers/graph-analysis/DeadImportDetector.js +56 -0
  172. package/dist/engine/analyzers/graph-analysis/DeadImportDetector.js.map +1 -0
  173. package/dist/engine/analyzers/graph-analysis/GraphAnalysisTools.d.ts +123 -0
  174. package/dist/engine/analyzers/graph-analysis/GraphAnalysisTools.js +187 -0
  175. package/dist/engine/analyzers/graph-analysis/GraphAnalysisTools.js.map +1 -0
  176. package/dist/engine/analyzers/graph-analysis/HotPathAnalyzer.d.ts +17 -0
  177. package/dist/engine/analyzers/graph-analysis/HotPathAnalyzer.js +55 -0
  178. package/dist/engine/analyzers/graph-analysis/HotPathAnalyzer.js.map +1 -0
  179. package/dist/engine/analyzers/graph-analysis/ModuleSummarizer.d.ts +14 -0
  180. package/dist/engine/analyzers/graph-analysis/ModuleSummarizer.js +59 -0
  181. package/dist/engine/analyzers/graph-analysis/ModuleSummarizer.js.map +1 -0
  182. package/dist/engine/analyzers/graph-analysis/RelatedTestFinder.d.ts +16 -0
  183. package/dist/engine/analyzers/graph-analysis/RelatedTestFinder.js +87 -0
  184. package/dist/engine/analyzers/graph-analysis/RelatedTestFinder.js.map +1 -0
  185. package/dist/engine/analyzers/graph-analysis/index.d.ts +13 -0
  186. package/dist/engine/analyzers/graph-analysis/index.js +13 -0
  187. package/dist/engine/analyzers/graph-analysis/index.js.map +1 -0
  188. package/dist/engine/analyzers/graph-analysis/types.d.ts +67 -0
  189. package/dist/engine/analyzers/graph-analysis/types.js +5 -0
  190. package/dist/engine/analyzers/graph-analysis/types.js.map +1 -0
  191. package/dist/engine/analyzers/graph-analysis/utils/GraphLoader.d.ts +27 -0
  192. package/dist/engine/analyzers/graph-analysis/utils/GraphLoader.js +124 -0
  193. package/dist/engine/analyzers/graph-analysis/utils/GraphLoader.js.map +1 -0
  194. package/dist/engine/analyzers/graph-analysis/utils/TarjanSCC.d.ts +17 -0
  195. package/dist/engine/analyzers/graph-analysis/utils/TarjanSCC.js +59 -0
  196. package/dist/engine/analyzers/graph-analysis/utils/TarjanSCC.js.map +1 -0
  197. package/dist/engine/analyzers/graph-analysis/utils/TestFileDetector.d.ts +11 -0
  198. package/dist/engine/analyzers/graph-analysis/utils/TestFileDetector.js +29 -0
  199. package/dist/engine/analyzers/graph-analysis/utils/TestFileDetector.js.map +1 -0
  200. package/dist/engine/analyzers/security/cfg/BasicBlock.d.ts +19 -0
  201. package/dist/engine/analyzers/security/cfg/BasicBlock.js +115 -0
  202. package/dist/engine/analyzers/security/cfg/BasicBlock.js.map +1 -0
  203. package/dist/engine/analyzers/security/cfg/CFGBuilder.d.ts +22 -0
  204. package/dist/engine/analyzers/security/cfg/CFGBuilder.js +244 -0
  205. package/dist/engine/analyzers/security/cfg/CFGBuilder.js.map +1 -0
  206. package/dist/engine/analyzers/security/cfg/CFGEdge.d.ts +13 -0
  207. package/dist/engine/analyzers/security/cfg/CFGEdge.js +19 -0
  208. package/dist/engine/analyzers/security/cfg/CFGEdge.js.map +1 -0
  209. package/dist/engine/analyzers/security/cfg/ControlFlowGraph.d.ts +29 -0
  210. package/dist/engine/analyzers/security/cfg/ControlFlowGraph.js +87 -0
  211. package/dist/engine/analyzers/security/cfg/ControlFlowGraph.js.map +1 -0
  212. package/dist/engine/analyzers/security/dataflow/DataFlowAnalyzer.d.ts +14 -0
  213. package/dist/engine/analyzers/security/dataflow/DataFlowAnalyzer.js +61 -0
  214. package/dist/engine/analyzers/security/dataflow/DataFlowAnalyzer.js.map +1 -0
  215. package/dist/engine/analyzers/security/dataflow/ReachingDefinitions.d.ts +16 -0
  216. package/dist/engine/analyzers/security/dataflow/ReachingDefinitions.js +79 -0
  217. package/dist/engine/analyzers/security/dataflow/ReachingDefinitions.js.map +1 -0
  218. package/dist/engine/analyzers/security/idor/IDORDetector.d.ts +21 -0
  219. package/dist/engine/analyzers/security/idor/IDORDetector.js +124 -0
  220. package/dist/engine/analyzers/security/idor/IDORDetector.js.map +1 -0
  221. package/dist/engine/analyzers/security/injection/InjectionScanner.d.ts +28 -0
  222. package/dist/engine/analyzers/security/injection/InjectionScanner.js +134 -0
  223. package/dist/engine/analyzers/security/injection/InjectionScanner.js.map +1 -0
  224. package/dist/engine/analyzers/security/injection/PatternMatcher.d.ts +25 -0
  225. package/dist/engine/analyzers/security/injection/PatternMatcher.js +72 -0
  226. package/dist/engine/analyzers/security/injection/PatternMatcher.js.map +1 -0
  227. package/dist/engine/analyzers/security/injection/SuppressionChecker.d.ts +17 -0
  228. package/dist/engine/analyzers/security/injection/SuppressionChecker.js +52 -0
  229. package/dist/engine/analyzers/security/injection/SuppressionChecker.js.map +1 -0
  230. package/dist/engine/analyzers/security/injection/patterns/CommandInjectionMatcher.d.ts +9 -0
  231. package/dist/engine/analyzers/security/injection/patterns/CommandInjectionMatcher.js +54 -0
  232. package/dist/engine/analyzers/security/injection/patterns/CommandInjectionMatcher.js.map +1 -0
  233. package/dist/engine/analyzers/security/injection/patterns/DeserializationMatcher.d.ts +9 -0
  234. package/dist/engine/analyzers/security/injection/patterns/DeserializationMatcher.js +43 -0
  235. package/dist/engine/analyzers/security/injection/patterns/DeserializationMatcher.js.map +1 -0
  236. package/dist/engine/analyzers/security/injection/patterns/LDAPXMLMatcher.d.ts +9 -0
  237. package/dist/engine/analyzers/security/injection/patterns/LDAPXMLMatcher.js +32 -0
  238. package/dist/engine/analyzers/security/injection/patterns/LDAPXMLMatcher.js.map +1 -0
  239. package/dist/engine/analyzers/security/injection/patterns/PathTraversalMatcher.d.ts +9 -0
  240. package/dist/engine/analyzers/security/injection/patterns/PathTraversalMatcher.js +43 -0
  241. package/dist/engine/analyzers/security/injection/patterns/PathTraversalMatcher.js.map +1 -0
  242. package/dist/engine/analyzers/security/injection/patterns/SQLInjectionMatcher.d.ts +9 -0
  243. package/dist/engine/analyzers/security/injection/patterns/SQLInjectionMatcher.js +54 -0
  244. package/dist/engine/analyzers/security/injection/patterns/SQLInjectionMatcher.js.map +1 -0
  245. package/dist/engine/analyzers/security/injection/patterns/XSSMatcher.d.ts +9 -0
  246. package/dist/engine/analyzers/security/injection/patterns/XSSMatcher.js +54 -0
  247. package/dist/engine/analyzers/security/injection/patterns/XSSMatcher.js.map +1 -0
  248. package/dist/engine/analyzers/security/ssrf/SSRFDetector.d.ts +16 -0
  249. package/dist/engine/analyzers/security/ssrf/SSRFDetector.js +89 -0
  250. package/dist/engine/analyzers/security/ssrf/SSRFDetector.js.map +1 -0
  251. package/dist/engine/analyzers/security/taint/TaintAnalyzer.d.ts +24 -0
  252. package/dist/engine/analyzers/security/taint/TaintAnalyzer.js +202 -0
  253. package/dist/engine/analyzers/security/taint/TaintAnalyzer.js.map +1 -0
  254. package/dist/engine/analyzers/security/taint/TaintPropagator.d.ts +35 -0
  255. package/dist/engine/analyzers/security/taint/TaintPropagator.js +223 -0
  256. package/dist/engine/analyzers/security/taint/TaintPropagator.js.map +1 -0
  257. package/dist/engine/analyzers/security/taint/TaintRegistry.d.ts +47 -0
  258. package/dist/engine/analyzers/security/taint/TaintRegistry.js +109 -0
  259. package/dist/engine/analyzers/security/taint/TaintRegistry.js.map +1 -0
  260. package/dist/engine/analyzers/security/types.d.ts +291 -0
  261. package/dist/engine/analyzers/security/types.js +5 -0
  262. package/dist/engine/analyzers/security/types.js.map +1 -0
  263. package/dist/engine/analyzers/similarity/ClusterBuilder.d.ts +18 -0
  264. package/dist/engine/analyzers/similarity/ClusterBuilder.js +66 -0
  265. package/dist/engine/analyzers/similarity/ClusterBuilder.js.map +1 -0
  266. package/dist/engine/analyzers/similarity/DeadCodeDetector.d.ts +23 -0
  267. package/dist/engine/analyzers/similarity/DeadCodeDetector.js +180 -0
  268. package/dist/engine/analyzers/similarity/DeadCodeDetector.js.map +1 -0
  269. package/dist/engine/analyzers/similarity/DuplicateDetector.d.ts +22 -0
  270. package/dist/engine/analyzers/similarity/DuplicateDetector.js +163 -0
  271. package/dist/engine/analyzers/similarity/DuplicateDetector.js.map +1 -0
  272. package/dist/engine/analyzers/similarity/GitMiner.d.ts +27 -0
  273. package/dist/engine/analyzers/similarity/GitMiner.js +184 -0
  274. package/dist/engine/analyzers/similarity/GitMiner.js.map +1 -0
  275. package/dist/engine/analyzers/similarity/SimilarityTools.d.ts +125 -0
  276. package/dist/engine/analyzers/similarity/SimilarityTools.js +156 -0
  277. package/dist/engine/analyzers/similarity/SimilarityTools.js.map +1 -0
  278. package/dist/engine/analyzers/similarity/types.d.ts +67 -0
  279. package/dist/engine/analyzers/similarity/types.js +6 -0
  280. package/dist/engine/analyzers/similarity/types.js.map +1 -0
  281. package/dist/engine/config.d.ts +29 -0
  282. package/dist/engine/config.js +133 -0
  283. package/dist/engine/config.js.map +1 -0
  284. package/dist/engine/context/ai-context-service.d.ts +33 -0
  285. package/dist/engine/context/ai-context-service.js +277 -0
  286. package/dist/engine/context/ai-context-service.js.map +1 -0
  287. package/dist/engine/context/budget-allocator.d.ts +16 -0
  288. package/dist/engine/context/budget-allocator.js +52 -0
  289. package/dist/engine/context/budget-allocator.js.map +1 -0
  290. package/dist/engine/context/curated-context-service.d.ts +25 -0
  291. package/dist/engine/context/curated-context-service.js +217 -0
  292. package/dist/engine/context/curated-context-service.js.map +1 -0
  293. package/dist/engine/context/edit-context-service.d.ts +32 -0
  294. package/dist/engine/context/edit-context-service.js +232 -0
  295. package/dist/engine/context/edit-context-service.js.map +1 -0
  296. package/dist/engine/context/git-service.d.ts +12 -0
  297. package/dist/engine/context/git-service.js +41 -0
  298. package/dist/engine/context/git-service.js.map +1 -0
  299. package/dist/engine/context/index.d.ts +14 -0
  300. package/dist/engine/context/index.js +15 -0
  301. package/dist/engine/context/index.js.map +1 -0
  302. package/dist/engine/context/intent-strategies.d.ts +16 -0
  303. package/dist/engine/context/intent-strategies.js +62 -0
  304. package/dist/engine/context/intent-strategies.js.map +1 -0
  305. package/dist/engine/context/query-analyzer.d.ts +8 -0
  306. package/dist/engine/context/query-analyzer.js +40 -0
  307. package/dist/engine/context/query-analyzer.js.map +1 -0
  308. package/dist/engine/context/rrf-merger.d.ts +20 -0
  309. package/dist/engine/context/rrf-merger.js +46 -0
  310. package/dist/engine/context/rrf-merger.js.map +1 -0
  311. package/dist/engine/context/token-budget-manager.d.ts +38 -0
  312. package/dist/engine/context/token-budget-manager.js +114 -0
  313. package/dist/engine/context/token-budget-manager.js.map +1 -0
  314. package/dist/engine/context/types.d.ts +147 -0
  315. package/dist/engine/context/types.js +5 -0
  316. package/dist/engine/context/types.js.map +1 -0
  317. package/dist/engine/database/graph-repository.d.ts +55 -0
  318. package/dist/engine/database/graph-repository.js +101 -0
  319. package/dist/engine/database/graph-repository.js.map +1 -0
  320. package/dist/engine/database/incremental-updater.d.ts +29 -0
  321. package/dist/engine/database/incremental-updater.js +92 -0
  322. package/dist/engine/database/incremental-updater.js.map +1 -0
  323. package/dist/engine/database/index.d.ts +10 -0
  324. package/dist/engine/database/index.js +9 -0
  325. package/dist/engine/database/index.js.map +1 -0
  326. package/dist/engine/database/migrator.d.ts +12 -0
  327. package/dist/engine/database/migrator.js +132 -0
  328. package/dist/engine/database/migrator.js.map +1 -0
  329. package/dist/engine/db/database-manager.d.ts +26 -0
  330. package/dist/engine/db/database-manager.js +80 -0
  331. package/dist/engine/db/database-manager.js.map +1 -0
  332. package/dist/engine/db/migrations.d.ts +9 -0
  333. package/dist/engine/db/migrations.js +135 -0
  334. package/dist/engine/db/migrations.js.map +1 -0
  335. package/dist/engine/db/native-addon-resolver.d.ts +22 -0
  336. package/dist/engine/db/native-addon-resolver.js +333 -0
  337. package/dist/engine/db/native-addon-resolver.js.map +1 -0
  338. package/dist/engine/db/schema.d.ts +5 -0
  339. package/dist/engine/db/schema.js +122 -0
  340. package/dist/engine/db/schema.js.map +1 -0
  341. package/dist/engine/graph/__tests__/graph-services.test.d.ts +5 -0
  342. package/dist/engine/graph/__tests__/graph-services.test.js +407 -0
  343. package/dist/engine/graph/__tests__/graph-services.test.js.map +1 -0
  344. package/dist/engine/graph/call-graph-service.d.ts +44 -0
  345. package/dist/engine/graph/call-graph-service.js +153 -0
  346. package/dist/engine/graph/call-graph-service.js.map +1 -0
  347. package/dist/engine/graph/dependency-formatters.d.ts +16 -0
  348. package/dist/engine/graph/dependency-formatters.js +76 -0
  349. package/dist/engine/graph/dependency-formatters.js.map +1 -0
  350. package/dist/engine/graph/dependency-graph-service.d.ts +39 -0
  351. package/dist/engine/graph/dependency-graph-service.js +180 -0
  352. package/dist/engine/graph/dependency-graph-service.js.map +1 -0
  353. package/dist/engine/graph/file-resolver.d.ts +22 -0
  354. package/dist/engine/graph/file-resolver.js +92 -0
  355. package/dist/engine/graph/file-resolver.js.map +1 -0
  356. package/dist/engine/graph/impact-analysis-service.d.ts +56 -0
  357. package/dist/engine/graph/impact-analysis-service.js +216 -0
  358. package/dist/engine/graph/impact-analysis-service.js.map +1 -0
  359. package/dist/engine/graph/index.d.ts +12 -0
  360. package/dist/engine/graph/index.js +13 -0
  361. package/dist/engine/graph/index.js.map +1 -0
  362. package/dist/engine/graph/symbol-resolver.d.ts +22 -0
  363. package/dist/engine/graph/symbol-resolver.js +71 -0
  364. package/dist/engine/graph/symbol-resolver.js.map +1 -0
  365. package/dist/engine/graph/test-detector.d.ts +19 -0
  366. package/dist/engine/graph/test-detector.js +56 -0
  367. package/dist/engine/graph/test-detector.js.map +1 -0
  368. package/dist/engine/graph/traverser.d.ts +65 -0
  369. package/dist/engine/graph/traverser.js +171 -0
  370. package/dist/engine/graph/traverser.js.map +1 -0
  371. package/dist/engine/indexer/__tests__/tree-sitter-pipeline.test.d.ts +6 -0
  372. package/dist/engine/indexer/__tests__/tree-sitter-pipeline.test.js +167 -0
  373. package/dist/engine/indexer/__tests__/tree-sitter-pipeline.test.js.map +1 -0
  374. package/dist/engine/indexer/file-watcher.d.ts +22 -0
  375. package/dist/engine/indexer/file-watcher.js +63 -0
  376. package/dist/engine/indexer/file-watcher.js.map +1 -0
  377. package/dist/engine/indexer/indexing-engine.d.ts +66 -0
  378. package/dist/engine/indexer/indexing-engine.js +411 -0
  379. package/dist/engine/indexer/indexing-engine.js.map +1 -0
  380. package/dist/engine/parsers/ast-utils.d.ts +31 -0
  381. package/dist/engine/parsers/ast-utils.js +133 -0
  382. package/dist/engine/parsers/ast-utils.js.map +1 -0
  383. package/dist/engine/parsers/embedding/EmbeddingService.d.ts +19 -0
  384. package/dist/engine/parsers/embedding/EmbeddingService.js +59 -0
  385. package/dist/engine/parsers/embedding/EmbeddingService.js.map +1 -0
  386. package/dist/engine/parsers/embedding/body-extractor.d.ts +25 -0
  387. package/dist/engine/parsers/embedding/body-extractor.js +99 -0
  388. package/dist/engine/parsers/embedding/body-extractor.js.map +1 -0
  389. package/dist/engine/parsers/embedding/chunker.d.ts +20 -0
  390. package/dist/engine/parsers/embedding/chunker.js +53 -0
  391. package/dist/engine/parsers/embedding/chunker.js.map +1 -0
  392. package/dist/engine/parsers/embedding/index.d.ts +5 -0
  393. package/dist/engine/parsers/embedding/index.js +6 -0
  394. package/dist/engine/parsers/embedding/index.js.map +1 -0
  395. package/dist/engine/parsers/grammar-registry.d.ts +44 -0
  396. package/dist/engine/parsers/grammar-registry.js +131 -0
  397. package/dist/engine/parsers/grammar-registry.js.map +1 -0
  398. package/dist/engine/parsers/grammars/grammar-config-loader.d.ts +57 -0
  399. package/dist/engine/parsers/grammars/grammar-config-loader.js +127 -0
  400. package/dist/engine/parsers/grammars/grammar-config-loader.js.map +1 -0
  401. package/dist/engine/parsers/ignore/ignore-parser.d.ts +23 -0
  402. package/dist/engine/parsers/ignore/ignore-parser.js +96 -0
  403. package/dist/engine/parsers/ignore/ignore-parser.js.map +1 -0
  404. package/dist/engine/parsers/ignore/index.d.ts +1 -0
  405. package/dist/engine/parsers/ignore/index.js +2 -0
  406. package/dist/engine/parsers/ignore/index.js.map +1 -0
  407. package/dist/engine/parsers/index.d.ts +10 -0
  408. package/dist/engine/parsers/index.js +9 -0
  409. package/dist/engine/parsers/index.js.map +1 -0
  410. package/dist/engine/parsers/languages/__tests__/apex-parser.test.d.ts +6 -0
  411. package/dist/engine/parsers/languages/__tests__/apex-parser.test.js +225 -0
  412. package/dist/engine/parsers/languages/__tests__/apex-parser.test.js.map +1 -0
  413. package/dist/engine/parsers/languages/__tests__/go-parser.test.d.ts +5 -0
  414. package/dist/engine/parsers/languages/__tests__/go-parser.test.js +243 -0
  415. package/dist/engine/parsers/languages/__tests__/go-parser.test.js.map +1 -0
  416. package/dist/engine/parsers/languages/__tests__/java-parser.test.d.ts +5 -0
  417. package/dist/engine/parsers/languages/__tests__/java-parser.test.js +257 -0
  418. package/dist/engine/parsers/languages/__tests__/java-parser.test.js.map +1 -0
  419. package/dist/engine/parsers/languages/__tests__/python-parser.test.d.ts +5 -0
  420. package/dist/engine/parsers/languages/__tests__/python-parser.test.js +224 -0
  421. package/dist/engine/parsers/languages/__tests__/python-parser.test.js.map +1 -0
  422. package/dist/engine/parsers/languages/__tests__/rust-parser.test.d.ts +5 -0
  423. package/dist/engine/parsers/languages/__tests__/rust-parser.test.js +329 -0
  424. package/dist/engine/parsers/languages/__tests__/rust-parser.test.js.map +1 -0
  425. package/dist/engine/parsers/languages/__tests__/salesforce-meta-parser.test.d.ts +6 -0
  426. package/dist/engine/parsers/languages/__tests__/salesforce-meta-parser.test.js +174 -0
  427. package/dist/engine/parsers/languages/__tests__/salesforce-meta-parser.test.js.map +1 -0
  428. package/dist/engine/parsers/languages/apex-parser.d.ts +36 -0
  429. package/dist/engine/parsers/languages/apex-parser.js +550 -0
  430. package/dist/engine/parsers/languages/apex-parser.js.map +1 -0
  431. package/dist/engine/parsers/languages/go-parser.d.ts +31 -0
  432. package/dist/engine/parsers/languages/go-parser.js +347 -0
  433. package/dist/engine/parsers/languages/go-parser.js.map +1 -0
  434. package/dist/engine/parsers/languages/java-parser.d.ts +32 -0
  435. package/dist/engine/parsers/languages/java-parser.js +538 -0
  436. package/dist/engine/parsers/languages/java-parser.js.map +1 -0
  437. package/dist/engine/parsers/languages/kotlin-parser.d.ts +37 -0
  438. package/dist/engine/parsers/languages/kotlin-parser.js +509 -0
  439. package/dist/engine/parsers/languages/kotlin-parser.js.map +1 -0
  440. package/dist/engine/parsers/languages/python-parser.d.ts +28 -0
  441. package/dist/engine/parsers/languages/python-parser.js +436 -0
  442. package/dist/engine/parsers/languages/python-parser.js.map +1 -0
  443. package/dist/engine/parsers/languages/rust-parser.d.ts +34 -0
  444. package/dist/engine/parsers/languages/rust-parser.js +535 -0
  445. package/dist/engine/parsers/languages/rust-parser.js.map +1 -0
  446. package/dist/engine/parsers/languages/salesforce-meta-parser.d.ts +27 -0
  447. package/dist/engine/parsers/languages/salesforce-meta-parser.js +352 -0
  448. package/dist/engine/parsers/languages/salesforce-meta-parser.js.map +1 -0
  449. package/dist/engine/parsers/languages/ts-call-extractor.d.ts +13 -0
  450. package/dist/engine/parsers/languages/ts-call-extractor.js +136 -0
  451. package/dist/engine/parsers/languages/ts-call-extractor.js.map +1 -0
  452. package/dist/engine/parsers/languages/ts-import-extractor.d.ts +10 -0
  453. package/dist/engine/parsers/languages/ts-import-extractor.js +112 -0
  454. package/dist/engine/parsers/languages/ts-import-extractor.js.map +1 -0
  455. package/dist/engine/parsers/languages/ts-inheritance-extractor.d.ts +9 -0
  456. package/dist/engine/parsers/languages/ts-inheritance-extractor.js +47 -0
  457. package/dist/engine/parsers/languages/ts-inheritance-extractor.js.map +1 -0
  458. package/dist/engine/parsers/languages/ts-symbol-extractor.d.ts +18 -0
  459. package/dist/engine/parsers/languages/ts-symbol-extractor.js +262 -0
  460. package/dist/engine/parsers/languages/ts-symbol-extractor.js.map +1 -0
  461. package/dist/engine/parsers/languages/ts-utils.d.ts +24 -0
  462. package/dist/engine/parsers/languages/ts-utils.js +77 -0
  463. package/dist/engine/parsers/languages/ts-utils.js.map +1 -0
  464. package/dist/engine/parsers/languages/typescript-parser.d.ts +17 -0
  465. package/dist/engine/parsers/languages/typescript-parser.js +60 -0
  466. package/dist/engine/parsers/languages/typescript-parser.js.map +1 -0
  467. package/dist/engine/parsers/tree-sitter-indexer.d.ts +28 -0
  468. package/dist/engine/parsers/tree-sitter-indexer.js +212 -0
  469. package/dist/engine/parsers/tree-sitter-indexer.js.map +1 -0
  470. package/dist/engine/parsers/types.d.ts +59 -0
  471. package/dist/engine/parsers/types.js +6 -0
  472. package/dist/engine/parsers/types.js.map +1 -0
  473. package/dist/engine/query/query-layer.d.ts +63 -0
  474. package/dist/engine/query/query-layer.js +112 -0
  475. package/dist/engine/query/query-layer.js.map +1 -0
  476. package/dist/engine/scanner/file-scanner.d.ts +20 -0
  477. package/dist/engine/scanner/file-scanner.js +151 -0
  478. package/dist/engine/scanner/file-scanner.js.map +1 -0
  479. package/dist/engine/scanner/pattern-detector.d.ts +16 -0
  480. package/dist/engine/scanner/pattern-detector.js +90 -0
  481. package/dist/engine/scanner/pattern-detector.js.map +1 -0
  482. package/dist/engine/scanner/signature-extractor.d.ts +17 -0
  483. package/dist/engine/scanner/signature-extractor.js +148 -0
  484. package/dist/engine/scanner/signature-extractor.js.map +1 -0
  485. package/dist/engine/tools/ai-context-tools.d.ts +138 -0
  486. package/dist/engine/tools/ai-context-tools.js +136 -0
  487. package/dist/engine/tools/ai-context-tools.js.map +1 -0
  488. package/dist/engine/tools/call-graph-tools.d.ts +67 -0
  489. package/dist/engine/tools/call-graph-tools.js +95 -0
  490. package/dist/engine/tools/call-graph-tools.js.map +1 -0
  491. package/dist/engine/tools/code-context.d.ts +7 -0
  492. package/dist/engine/tools/code-context.js +48 -0
  493. package/dist/engine/tools/code-context.js.map +1 -0
  494. package/dist/engine/tools/code-index-status.d.ts +8 -0
  495. package/dist/engine/tools/code-index-status.js +63 -0
  496. package/dist/engine/tools/code-index-status.js.map +1 -0
  497. package/dist/engine/tools/code-kb-export.d.ts +7 -0
  498. package/dist/engine/tools/code-kb-export.js +67 -0
  499. package/dist/engine/tools/code-kb-export.js.map +1 -0
  500. package/dist/engine/tools/code-modules.d.ts +6 -0
  501. package/dist/engine/tools/code-modules.js +52 -0
  502. package/dist/engine/tools/code-modules.js.map +1 -0
  503. package/dist/engine/tools/code-search.d.ts +6 -0
  504. package/dist/engine/tools/code-search.js +31 -0
  505. package/dist/engine/tools/code-search.js.map +1 -0
  506. package/dist/engine/tools/code-symbols.d.ts +6 -0
  507. package/dist/engine/tools/code-symbols.js +48 -0
  508. package/dist/engine/tools/code-symbols.js.map +1 -0
  509. package/dist/engine/tools/code-traverse.d.ts +54 -0
  510. package/dist/engine/tools/code-traverse.js +66 -0
  511. package/dist/engine/tools/code-traverse.js.map +1 -0
  512. package/dist/engine/tools/dependency-tools.d.ts +41 -0
  513. package/dist/engine/tools/dependency-tools.js +46 -0
  514. package/dist/engine/tools/dependency-tools.js.map +1 -0
  515. package/dist/engine/tools/drawio-export-png.d.ts +44 -0
  516. package/dist/engine/tools/drawio-export-png.js +214 -0
  517. package/dist/engine/tools/drawio-export-png.js.map +1 -0
  518. package/dist/engine/tools/drawio-layout.d.ts +6 -0
  519. package/dist/engine/tools/drawio-layout.js +179 -0
  520. package/dist/engine/tools/drawio-layout.js.map +1 -0
  521. package/dist/engine/tools/drawio-parser.d.ts +30 -0
  522. package/dist/engine/tools/drawio-parser.js +92 -0
  523. package/dist/engine/tools/drawio-parser.js.map +1 -0
  524. package/dist/engine/tools/drawio-router.d.ts +10 -0
  525. package/dist/engine/tools/drawio-router.js +112 -0
  526. package/dist/engine/tools/drawio-router.js.map +1 -0
  527. package/dist/engine/tools/drawio-tool.d.ts +39 -0
  528. package/dist/engine/tools/drawio-tool.js +174 -0
  529. package/dist/engine/tools/drawio-tool.js.map +1 -0
  530. package/dist/engine/tools/drawio-writer.d.ts +6 -0
  531. package/dist/engine/tools/drawio-writer.js +120 -0
  532. package/dist/engine/tools/drawio-writer.js.map +1 -0
  533. package/dist/engine/tools/impact-tools.d.ts +37 -0
  534. package/dist/engine/tools/impact-tools.js +85 -0
  535. package/dist/engine/tools/impact-tools.js.map +1 -0
  536. package/dist/engine/tools/register-tools.d.ts +862 -0
  537. package/dist/engine/tools/register-tools.js +226 -0
  538. package/dist/engine/tools/register-tools.js.map +1 -0
  539. package/dist/index.d.ts +6 -0
  540. package/dist/index.js +98 -0
  541. package/dist/index.js.map +1 -0
  542. package/dist/logger.d.ts +15 -0
  543. package/dist/logger.js +23 -0
  544. package/dist/logger.js.map +1 -0
  545. package/dist/modules/ModuleRegistry.d.ts +23 -0
  546. package/dist/modules/ModuleRegistry.js +86 -0
  547. package/dist/modules/ModuleRegistry.js.map +1 -0
  548. package/dist/modules/analytics/AnalyticsModule.d.ts +17 -0
  549. package/dist/modules/analytics/AnalyticsModule.js +36 -0
  550. package/dist/modules/analytics/AnalyticsModule.js.map +1 -0
  551. package/dist/modules/code-intel/CodeIntelModule.d.ts +23 -0
  552. package/dist/modules/code-intel/CodeIntelModule.js +73 -0
  553. package/dist/modules/code-intel/CodeIntelModule.js.map +1 -0
  554. package/dist/modules/kb-graph/KBGraphModule.d.ts +18 -0
  555. package/dist/modules/kb-graph/KBGraphModule.js +49 -0
  556. package/dist/modules/kb-graph/KBGraphModule.js.map +1 -0
  557. package/dist/modules/kb-graph/SqliteGraphService.d.ts +95 -0
  558. package/dist/modules/kb-graph/SqliteGraphService.js +417 -0
  559. package/dist/modules/kb-graph/SqliteGraphService.js.map +1 -0
  560. package/dist/modules/memory/MemoryDb.d.ts +9 -0
  561. package/dist/modules/memory/MemoryDb.js +51 -0
  562. package/dist/modules/memory/MemoryDb.js.map +1 -0
  563. package/dist/modules/memory/MemoryEngine.d.ts +43 -0
  564. package/dist/modules/memory/MemoryEngine.js +185 -0
  565. package/dist/modules/memory/MemoryEngine.js.map +1 -0
  566. package/dist/modules/memory/MemoryEngineFull.d.ts +0 -0
  567. package/dist/modules/memory/MemoryEngineFull.js +2 -0
  568. package/dist/modules/memory/MemoryEngineFull.js.map +1 -0
  569. package/dist/modules/memory/MemoryModule.d.ts +26 -0
  570. package/dist/modules/memory/MemoryModule.js +146 -0
  571. package/dist/modules/memory/MemoryModule.js.map +1 -0
  572. package/dist/modules/memory/MemoryToolDefinitions.d.ts +2400 -0
  573. package/dist/modules/memory/MemoryToolDefinitions.js +294 -0
  574. package/dist/modules/memory/MemoryToolDefinitions.js.map +1 -0
  575. package/dist/modules/memory/MemoryToolDispatcher.d.ts +50 -0
  576. package/dist/modules/memory/MemoryToolDispatcher.js +523 -0
  577. package/dist/modules/memory/MemoryToolDispatcher.js.map +1 -0
  578. package/dist/modules/memory/ScopePromotionService.d.ts +86 -0
  579. package/dist/modules/memory/ScopePromotionService.js +263 -0
  580. package/dist/modules/memory/ScopePromotionService.js.map +1 -0
  581. package/dist/modules/memory/__tests__/MemoryToolDispatcher.test.d.ts +1 -0
  582. package/dist/modules/memory/__tests__/MemoryToolDispatcher.test.js +72 -0
  583. package/dist/modules/memory/__tests__/MemoryToolDispatcher.test.js.map +1 -0
  584. package/dist/modules/memory/__tests__/ScopePromotionService.test.d.ts +1 -0
  585. package/dist/modules/memory/__tests__/ScopePromotionService.test.js +142 -0
  586. package/dist/modules/memory/__tests__/ScopePromotionService.test.js.map +1 -0
  587. package/dist/modules/memory/llm/LLMService.d.ts +17 -0
  588. package/dist/modules/memory/llm/LLMService.js +64 -0
  589. package/dist/modules/memory/llm/LLMService.js.map +1 -0
  590. package/dist/modules/memory/llm/TagAnalyzerService.d.ts +37 -0
  591. package/dist/modules/memory/llm/TagAnalyzerService.js +198 -0
  592. package/dist/modules/memory/llm/TagAnalyzerService.js.map +1 -0
  593. package/dist/modules/memory/llm/index.d.ts +2 -0
  594. package/dist/modules/memory/llm/index.js +2 -0
  595. package/dist/modules/memory/llm/index.js.map +1 -0
  596. package/dist/modules/memory/llm/ollama-adapter.d.ts +9 -0
  597. package/dist/modules/memory/llm/ollama-adapter.js +55 -0
  598. package/dist/modules/memory/llm/ollama-adapter.js.map +1 -0
  599. package/dist/modules/memory/llm/openai-adapter.d.ts +8 -0
  600. package/dist/modules/memory/llm/openai-adapter.js +43 -0
  601. package/dist/modules/memory/llm/openai-adapter.js.map +1 -0
  602. package/dist/modules/memory/llm/types.d.ts +26 -0
  603. package/dist/modules/memory/llm/types.js +5 -0
  604. package/dist/modules/memory/llm/types.js.map +1 -0
  605. package/dist/modules/memory/masking/MaskingMiddleware.d.ts +23 -0
  606. package/dist/modules/memory/masking/MaskingMiddleware.js +118 -0
  607. package/dist/modules/memory/masking/MaskingMiddleware.js.map +1 -0
  608. package/dist/modules/memory/masking/__tests__/CredentialDetector.test.d.ts +1 -0
  609. package/dist/modules/memory/masking/__tests__/CredentialDetector.test.js +41 -0
  610. package/dist/modules/memory/masking/__tests__/CredentialDetector.test.js.map +1 -0
  611. package/dist/modules/memory/masking/__tests__/MaskingMiddleware.test.d.ts +1 -0
  612. package/dist/modules/memory/masking/__tests__/MaskingMiddleware.test.js +65 -0
  613. package/dist/modules/memory/masking/__tests__/MaskingMiddleware.test.js.map +1 -0
  614. package/dist/modules/memory/masking/__tests__/PiiDetector.test.d.ts +1 -0
  615. package/dist/modules/memory/masking/__tests__/PiiDetector.test.js +52 -0
  616. package/dist/modules/memory/masking/__tests__/PiiDetector.test.js.map +1 -0
  617. package/dist/modules/memory/masking/detectors/CredentialDetector.d.ts +13 -0
  618. package/dist/modules/memory/masking/detectors/CredentialDetector.js +50 -0
  619. package/dist/modules/memory/masking/detectors/CredentialDetector.js.map +1 -0
  620. package/dist/modules/memory/masking/detectors/DetectorStrategy.d.ts +9 -0
  621. package/dist/modules/memory/masking/detectors/DetectorStrategy.js +2 -0
  622. package/dist/modules/memory/masking/detectors/DetectorStrategy.js.map +1 -0
  623. package/dist/modules/memory/masking/detectors/PiiDetector.d.ts +13 -0
  624. package/dist/modules/memory/masking/detectors/PiiDetector.js +50 -0
  625. package/dist/modules/memory/masking/detectors/PiiDetector.js.map +1 -0
  626. package/dist/modules/memory/masking/index.d.ts +8 -0
  627. package/dist/modules/memory/masking/index.js +9 -0
  628. package/dist/modules/memory/masking/index.js.map +1 -0
  629. package/dist/modules/memory/masking/maskers/ContentMasker.d.ts +22 -0
  630. package/dist/modules/memory/masking/maskers/ContentMasker.js +89 -0
  631. package/dist/modules/memory/masking/maskers/ContentMasker.js.map +1 -0
  632. package/dist/modules/memory/masking/models/MaskingTypes.d.ts +73 -0
  633. package/dist/modules/memory/masking/models/MaskingTypes.js +5 -0
  634. package/dist/modules/memory/masking/models/MaskingTypes.js.map +1 -0
  635. package/dist/modules/memory/masking/services/AllowlistService.d.ts +11 -0
  636. package/dist/modules/memory/masking/services/AllowlistService.js +34 -0
  637. package/dist/modules/memory/masking/services/AllowlistService.js.map +1 -0
  638. package/dist/modules/memory/masking/services/AuditService.d.ts +14 -0
  639. package/dist/modules/memory/masking/services/AuditService.js +39 -0
  640. package/dist/modules/memory/masking/services/AuditService.js.map +1 -0
  641. package/dist/modules/memory/masking/services/ConfigCacheService.d.ts +19 -0
  642. package/dist/modules/memory/masking/services/ConfigCacheService.js +36 -0
  643. package/dist/modules/memory/masking/services/ConfigCacheService.js.map +1 -0
  644. package/dist/modules/memory/migrations/001-add-scope-columns.d.ts +9 -0
  645. package/dist/modules/memory/migrations/001-add-scope-columns.js +16 -0
  646. package/dist/modules/memory/migrations/001-add-scope-columns.js.map +1 -0
  647. package/dist/modules/memory/models.d.ts +95 -0
  648. package/dist/modules/memory/models.js +5 -0
  649. package/dist/modules/memory/models.js.map +1 -0
  650. package/dist/modules/memory/schema.d.ts +5 -0
  651. package/dist/modules/memory/schema.js +269 -0
  652. package/dist/modules/memory/schema.js.map +1 -0
  653. package/dist/modules/memory/tool-definitions.d.ts +5 -0
  654. package/dist/modules/memory/tool-definitions.js +26 -0
  655. package/dist/modules/memory/tool-definitions.js.map +1 -0
  656. package/dist/modules/orchestration/McpClientManager.d.ts +18 -0
  657. package/dist/modules/orchestration/McpClientManager.js +196 -0
  658. package/dist/modules/orchestration/McpClientManager.js.map +1 -0
  659. package/dist/modules/orchestration/McpConfigRoutes.d.ts +9 -0
  660. package/dist/modules/orchestration/McpConfigRoutes.js +123 -0
  661. package/dist/modules/orchestration/McpConfigRoutes.js.map +1 -0
  662. package/dist/modules/orchestration/McpConfigService.d.ts +50 -0
  663. package/dist/modules/orchestration/McpConfigService.js +115 -0
  664. package/dist/modules/orchestration/McpConfigService.js.map +1 -0
  665. package/dist/modules/orchestration/OrchestrationModule.d.ts +23 -0
  666. package/dist/modules/orchestration/OrchestrationModule.js +140 -0
  667. package/dist/modules/orchestration/OrchestrationModule.js.map +1 -0
  668. package/dist/modules/utility/UtilityModule.d.ts +18 -0
  669. package/dist/modules/utility/UtilityModule.js +50 -0
  670. package/dist/modules/utility/UtilityModule.js.map +1 -0
  671. package/dist/modules/web/WebModule.d.ts +25 -0
  672. package/dist/modules/web/WebModule.js +70 -0
  673. package/dist/modules/web/WebModule.js.map +1 -0
  674. package/dist/modules/web/handlers/ApiCallHandler.d.ts +16 -0
  675. package/dist/modules/web/handlers/ApiCallHandler.js +54 -0
  676. package/dist/modules/web/handlers/ApiCallHandler.js.map +1 -0
  677. package/dist/modules/web/handlers/DownloadFileHandler.d.ts +18 -0
  678. package/dist/modules/web/handlers/DownloadFileHandler.js +73 -0
  679. package/dist/modules/web/handlers/DownloadFileHandler.js.map +1 -0
  680. package/dist/modules/web/handlers/FetchUrlHandler.d.ts +21 -0
  681. package/dist/modules/web/handlers/FetchUrlHandler.js +87 -0
  682. package/dist/modules/web/handlers/FetchUrlHandler.js.map +1 -0
  683. package/dist/modules/web/handlers/GitBrowseHandler.d.ts +16 -0
  684. package/dist/modules/web/handlers/GitBrowseHandler.js +73 -0
  685. package/dist/modules/web/handlers/GitBrowseHandler.js.map +1 -0
  686. package/dist/modules/web/handlers/ReadWebpageHandler.d.ts +20 -0
  687. package/dist/modules/web/handlers/ReadWebpageHandler.js +70 -0
  688. package/dist/modules/web/handlers/ReadWebpageHandler.js.map +1 -0
  689. package/dist/modules/web/handlers/WebSearchHandler.d.ts +15 -0
  690. package/dist/modules/web/handlers/WebSearchHandler.js +50 -0
  691. package/dist/modules/web/handlers/WebSearchHandler.js.map +1 -0
  692. package/dist/modules/web/middleware/ContentTruncator.d.ts +14 -0
  693. package/dist/modules/web/middleware/ContentTruncator.js +23 -0
  694. package/dist/modules/web/middleware/ContentTruncator.js.map +1 -0
  695. package/dist/modules/web/middleware/RateLimiter.d.ts +19 -0
  696. package/dist/modules/web/middleware/RateLimiter.js +49 -0
  697. package/dist/modules/web/middleware/RateLimiter.js.map +1 -0
  698. package/dist/modules/web/middleware/SsrfGuard.d.ts +18 -0
  699. package/dist/modules/web/middleware/SsrfGuard.js +89 -0
  700. package/dist/modules/web/middleware/SsrfGuard.js.map +1 -0
  701. package/dist/modules/web/models/WebError.d.ts +10 -0
  702. package/dist/modules/web/models/WebError.js +15 -0
  703. package/dist/modules/web/models/WebError.js.map +1 -0
  704. package/dist/modules/web/models/WebModuleConfig.d.ts +17 -0
  705. package/dist/modules/web/models/WebModuleConfig.js +22 -0
  706. package/dist/modules/web/models/WebModuleConfig.js.map +1 -0
  707. package/dist/modules/web/models/WebToolResult.d.ts +7 -0
  708. package/dist/modules/web/models/WebToolResult.js +19 -0
  709. package/dist/modules/web/models/WebToolResult.js.map +1 -0
  710. package/dist/modules/web/utils/GitUrlParser.d.ts +12 -0
  711. package/dist/modules/web/utils/GitUrlParser.js +32 -0
  712. package/dist/modules/web/utils/GitUrlParser.js.map +1 -0
  713. package/dist/modules/web/utils/HtmlExtractor.d.ts +9 -0
  714. package/dist/modules/web/utils/HtmlExtractor.js +46 -0
  715. package/dist/modules/web/utils/HtmlExtractor.js.map +1 -0
  716. package/dist/modules/web/utils/UrlValidator.d.ts +5 -0
  717. package/dist/modules/web/utils/UrlValidator.js +23 -0
  718. package/dist/modules/web/utils/UrlValidator.js.map +1 -0
  719. package/dist/server/HttpServer.d.ts +30 -0
  720. package/dist/server/HttpServer.js +108 -0
  721. package/dist/server/HttpServer.js.map +1 -0
  722. package/dist/server/mcpServer.d.ts +6 -0
  723. package/dist/server/mcpServer.js +83 -0
  724. package/dist/server/mcpServer.js.map +1 -0
  725. package/dist/server/middleware/error-handler.d.ts +7 -0
  726. package/dist/server/middleware/error-handler.js +16 -0
  727. package/dist/server/middleware/error-handler.js.map +1 -0
  728. package/dist/server/middleware/localhost-only.d.ts +6 -0
  729. package/dist/server/middleware/localhost-only.js +15 -0
  730. package/dist/server/middleware/localhost-only.js.map +1 -0
  731. package/dist/server/middleware/rate-limiter.d.ts +11 -0
  732. package/dist/server/middleware/rate-limiter.js +44 -0
  733. package/dist/server/middleware/rate-limiter.js.map +1 -0
  734. package/dist/server/middleware/request-logger.d.ts +7 -0
  735. package/dist/server/middleware/request-logger.js +21 -0
  736. package/dist/server/middleware/request-logger.js.map +1 -0
  737. package/dist/server/routes/__tests__/admin.test.d.ts +8 -0
  738. package/dist/server/routes/__tests__/admin.test.js +607 -0
  739. package/dist/server/routes/__tests__/admin.test.js.map +1 -0
  740. package/dist/server/routes/admin.d.ts +8 -0
  741. package/dist/server/routes/admin.js +2314 -0
  742. package/dist/server/routes/admin.js.map +1 -0
  743. package/dist/server/routes/api.d.ts +9 -0
  744. package/dist/server/routes/api.js +181 -0
  745. package/dist/server/routes/api.js.map +1 -0
  746. package/dist/server/routes/health.d.ts +8 -0
  747. package/dist/server/routes/health.js +26 -0
  748. package/dist/server/routes/health.js.map +1 -0
  749. package/dist/server/routes/tools.d.ts +8 -0
  750. package/dist/server/routes/tools.js +50 -0
  751. package/dist/server/routes/tools.js.map +1 -0
  752. package/dist/shared/protocol.d.ts +194 -0
  753. package/dist/shared/protocol.js +8 -0
  754. package/dist/shared/protocol.js.map +1 -0
  755. package/dist/tool-router/ToolDefinitions.d.ts +11 -0
  756. package/dist/tool-router/ToolDefinitions.js +15 -0
  757. package/dist/tool-router/ToolDefinitions.js.map +1 -0
  758. package/dist/tool-router/ToolRouter.d.ts +17 -0
  759. package/dist/tool-router/ToolRouter.js +53 -0
  760. package/dist/tool-router/ToolRouter.js.map +1 -0
  761. package/dist/tool-router/ToolValidator.d.ts +12 -0
  762. package/dist/tool-router/ToolValidator.js +48 -0
  763. package/dist/tool-router/ToolValidator.js.map +1 -0
  764. package/dist/types/module.d.ts +19 -0
  765. package/dist/types/module.js +6 -0
  766. package/dist/types/module.js.map +1 -0
  767. package/dist/types/tool.d.ts +32 -0
  768. package/dist/types/tool.js +6 -0
  769. package/dist/types/tool.js.map +1 -0
  770. package/dist/types.d.ts +1 -0
  771. package/dist/types.js +6 -0
  772. package/dist/types.js.map +1 -0
  773. package/dist/vitest.config.d.ts +2 -0
  774. package/dist/vitest.config.js +9 -0
  775. package/dist/vitest.config.js.map +1 -0
  776. package/dist/vitest.ksa252.config.d.ts +2 -0
  777. package/dist/vitest.ksa252.config.js +10 -0
  778. package/dist/vitest.ksa252.config.js.map +1 -0
  779. package/extension/build-platform-swap.mjs +16 -0
  780. package/extension/esbuild.js +36 -0
  781. package/extension/resources/webview-assets/chat/chat.js +1907 -0
  782. package/extension/resources/webview-assets/chat/graph-viz.js +144 -0
  783. package/extension/resources/webview-assets/chat/markdown-renderer.js +254 -0
  784. package/extension/resources/webview-assets/settings/settings.js +575 -0
  785. package/extension/scripts/capture-screenshots.py +45 -0
  786. package/extension/scripts/copy-resources.js +75 -0
  787. package/extension/scripts/gen-checksums.js +68 -0
  788. package/extension/scripts/update-onnx-manifest.js +119 -0
  789. package/extension/src/__tests__/converter.test.ts +286 -0
  790. package/extension/src/__tests__/indexer.test.ts +204 -0
  791. package/extension/src/addon-download-helpers.ts +135 -0
  792. package/extension/src/ai-context-commands.ts +97 -0
  793. package/extension/src/anthropic/__tests__/converter.test.ts +201 -0
  794. package/extension/src/anthropic/__tests__/handlers.test.ts +255 -0
  795. package/extension/src/anthropic/converter.ts +95 -0
  796. package/extension/src/anthropic/handlers.ts +106 -0
  797. package/extension/src/anthropic/types.ts +124 -0
  798. package/extension/src/auth/AuthManager.ts +200 -0
  799. package/extension/src/auth/PkceService.ts +32 -0
  800. package/extension/src/auth/TokenRefreshTimer.ts +38 -0
  801. package/extension/src/backend-local-tools.ts +44 -0
  802. package/extension/src/chat-panel/ChatContextPicker.ts +191 -0
  803. package/extension/src/chat-panel/ChatHtmlBuilder.ts +67 -0
  804. package/extension/src/chat-panel/ChatModelManager.ts +49 -0
  805. package/extension/src/chat-panel/ChatStateManager.ts +129 -0
  806. package/extension/src/chat-panel/ChatStatusManager.ts +49 -0
  807. package/extension/src/chat-panel/__tests__/chat-models.test.ts +134 -0
  808. package/extension/src/chat-panel/__tests__/context-usage-tracker.test.ts +170 -0
  809. package/extension/src/chat-panel/__tests__/conversation-manager.test.ts +152 -0
  810. package/extension/src/chat-panel/__tests__/token-counter.test.ts +93 -0
  811. package/extension/src/chat-panel/chat-models.ts +167 -0
  812. package/extension/src/chat-panel/chat-panel-provider.ts +221 -0
  813. package/extension/src/chat-panel/context-usage-tracker.ts +144 -0
  814. package/extension/src/chat-panel/conversation-manager.ts +180 -0
  815. package/extension/src/chat-panel/conversation-types.ts +47 -0
  816. package/extension/src/chat-panel/message-handler.ts +116 -0
  817. package/extension/src/chat-panel/message-protocol.ts +107 -0
  818. package/extension/src/chat-panel/message-routing.ts +111 -0
  819. package/extension/src/chat-panel/token-counter.ts +103 -0
  820. package/extension/src/checksum.ts +197 -0
  821. package/extension/src/commands/CommandRegistrar.ts +177 -0
  822. package/extension/src/commands/LlmCommands.ts +111 -0
  823. package/extension/src/config-watcher.ts +171 -0
  824. package/extension/src/config.ts +106 -0
  825. package/extension/src/connection/ConnectionManager.ts +128 -0
  826. package/extension/src/connection/HealthChecker.ts +45 -0
  827. package/extension/src/converter/FileConverterService.ts +62 -0
  828. package/extension/src/converter/IFileConverter.ts +15 -0
  829. package/extension/src/converter/LocalFallbackConverter.ts +89 -0
  830. package/extension/src/converter/RemoteConverter.ts +86 -0
  831. package/extension/src/converter/TextConverter.ts +41 -0
  832. package/extension/src/converter/index.ts +31 -0
  833. package/extension/src/converter-helpers.ts +125 -0
  834. package/extension/src/converter.ts +17 -0
  835. package/extension/src/debug-logger.ts +23 -0
  836. package/extension/src/diagnostics-provider.ts +150 -0
  837. package/extension/src/extension.ts +187 -0
  838. package/extension/src/file-utils.ts +64 -0
  839. package/extension/src/history/conversation.ts +91 -0
  840. package/extension/src/indexer-discovery.ts +95 -0
  841. package/extension/src/indexer-http.ts +106 -0
  842. package/extension/src/indexer.ts +91 -0
  843. package/extension/src/injector-helpers.ts +72 -0
  844. package/extension/src/injector.ts +86 -0
  845. package/extension/src/kb-event-bus.ts +125 -0
  846. package/extension/src/langgraph/__tests__/anthropic-provider-content-guard.test.ts +95 -0
  847. package/extension/src/langgraph/__tests__/base-node-retry.test.ts +277 -0
  848. package/extension/src/langgraph/__tests__/chat-graph-agent-step.test.ts +99 -0
  849. package/extension/src/langgraph/__tests__/chat-graph-loop.test.ts +155 -0
  850. package/extension/src/langgraph/__tests__/chat-panel-e2e.test.ts +616 -0
  851. package/extension/src/langgraph/__tests__/edges-self-correction.test.ts +148 -0
  852. package/extension/src/langgraph/__tests__/hook-commands.test.ts +203 -0
  853. package/extension/src/langgraph/__tests__/hook-events.test.ts +273 -0
  854. package/extension/src/langgraph/__tests__/hook-executor.test.ts +257 -0
  855. package/extension/src/langgraph/__tests__/hook-loader.test.ts +204 -0
  856. package/extension/src/langgraph/__tests__/stream-handler-events.test.ts +158 -0
  857. package/extension/src/langgraph/__tests__/verify-node.test.ts +275 -0
  858. package/extension/src/langgraph/checkpointer-helpers.ts +78 -0
  859. package/extension/src/langgraph/checkpointer.ts +83 -0
  860. package/extension/src/langgraph/config/alternate-strategies.ts +49 -0
  861. package/extension/src/langgraph/config/verify-criteria.ts +87 -0
  862. package/extension/src/langgraph/context-budget.ts +194 -0
  863. package/extension/src/langgraph/edges-feedback.ts +63 -0
  864. package/extension/src/langgraph/edges.ts +137 -0
  865. package/extension/src/langgraph/engine-chat-handler.ts +66 -0
  866. package/extension/src/langgraph/errors/non-recoverable-error.ts +13 -0
  867. package/extension/src/langgraph/graph-builder.ts +36 -0
  868. package/extension/src/langgraph/graphs/GraphFactory.ts +85 -0
  869. package/extension/src/langgraph/graphs/chat-graph-nodes.ts +285 -0
  870. package/extension/src/langgraph/graphs/chat-graph.ts +177 -0
  871. package/extension/src/langgraph/graphs/code-review-graph.ts +112 -0
  872. package/extension/src/langgraph/graphs/docs-graph.ts +89 -0
  873. package/extension/src/langgraph/graphs/hotfix-graph.ts +106 -0
  874. package/extension/src/langgraph/graphs/rag-grader-nodes.ts +237 -0
  875. package/extension/src/langgraph/graphs/rag-grader-prompts.ts +54 -0
  876. package/extension/src/langgraph/graphs/sdlc-graph.ts +132 -0
  877. package/extension/src/langgraph/graphs/sdlc-node-factory.ts +72 -0
  878. package/extension/src/langgraph/graphs/security-audit-graph.ts +98 -0
  879. package/extension/src/langgraph/graphs/verify-node.ts +161 -0
  880. package/extension/src/langgraph/graphs/verify-prompt.ts +45 -0
  881. package/extension/src/langgraph/hook-commands.ts +84 -0
  882. package/extension/src/langgraph/hook-emitter.ts +37 -0
  883. package/extension/src/langgraph/hook-engine.ts +171 -0
  884. package/extension/src/langgraph/hook-events.ts +195 -0
  885. package/extension/src/langgraph/hook-executor.ts +192 -0
  886. package/extension/src/langgraph/hook-filters.ts +94 -0
  887. package/extension/src/langgraph/hook-loader.ts +86 -0
  888. package/extension/src/langgraph/hook-tool-matcher.ts +64 -0
  889. package/extension/src/langgraph/index.ts +69 -0
  890. package/extension/src/langgraph/langgraph-engine.ts +190 -0
  891. package/extension/src/langgraph/llm-provider.ts +83 -0
  892. package/extension/src/langgraph/mcp-bridge.ts +118 -0
  893. package/extension/src/langgraph/nodes/agent-prompt-loader.ts +84 -0
  894. package/extension/src/langgraph/nodes/approval-node.ts +165 -0
  895. package/extension/src/langgraph/nodes/ba-node.ts +58 -0
  896. package/extension/src/langgraph/nodes/ba-prompts.ts +40 -0
  897. package/extension/src/langgraph/nodes/base-node.ts +198 -0
  898. package/extension/src/langgraph/nodes/dev-node.ts +77 -0
  899. package/extension/src/langgraph/nodes/dev-prompts.ts +23 -0
  900. package/extension/src/langgraph/nodes/devops-node.ts +180 -0
  901. package/extension/src/langgraph/nodes/feedback-node.ts +68 -0
  902. package/extension/src/langgraph/nodes/hook-helpers.ts +122 -0
  903. package/extension/src/langgraph/nodes/jira-helpers.ts +86 -0
  904. package/extension/src/langgraph/nodes/qa-node.ts +82 -0
  905. package/extension/src/langgraph/nodes/qa-prompts.ts +35 -0
  906. package/extension/src/langgraph/nodes/sa-node.ts +152 -0
  907. package/extension/src/langgraph/nodes/security-node.ts +94 -0
  908. package/extension/src/langgraph/nodes/sm-node.ts +35 -0
  909. package/extension/src/langgraph/nodes/ta-node.ts +113 -0
  910. package/extension/src/langgraph/nodes/ui-node.ts +93 -0
  911. package/extension/src/langgraph/nodes/verify-node.ts +158 -0
  912. package/extension/src/langgraph/nodes/workspace-file-ops.ts +155 -0
  913. package/extension/src/langgraph/providers/BaseLlmProvider.ts +113 -0
  914. package/extension/src/langgraph/providers/anthropic-adapter.ts +165 -0
  915. package/extension/src/langgraph/providers/anthropic-helpers.ts +26 -0
  916. package/extension/src/langgraph/providers/anthropic-provider.ts +142 -0
  917. package/extension/src/langgraph/providers/index.ts +114 -0
  918. package/extension/src/langgraph/providers/kiro-client.ts +151 -0
  919. package/extension/src/langgraph/providers/kiro-http-helpers.ts +93 -0
  920. package/extension/src/langgraph/providers/model-parser.ts +33 -0
  921. package/extension/src/langgraph/providers/model-registry.ts +98 -0
  922. package/extension/src/langgraph/providers/ollama-provider.ts +114 -0
  923. package/extension/src/langgraph/providers/ollama-tools.ts +52 -0
  924. package/extension/src/langgraph/providers/onnx-provider.ts +151 -0
  925. package/extension/src/langgraph/providers/onnx-tokenizer.ts +47 -0
  926. package/extension/src/langgraph/providers/openai-helpers.ts +38 -0
  927. package/extension/src/langgraph/providers/openai-provider.ts +168 -0
  928. package/extension/src/langgraph/providers/stream-handler.ts +187 -0
  929. package/extension/src/langgraph/providers/token-manager.ts +180 -0
  930. package/extension/src/langgraph/providers/token-refresh.ts +94 -0
  931. package/extension/src/langgraph/router/intent-classifier.ts +131 -0
  932. package/extension/src/langgraph/router/router-graph.ts +187 -0
  933. package/extension/src/langgraph/router/router-state.ts +19 -0
  934. package/extension/src/langgraph/state-types.ts +21 -0
  935. package/extension/src/langgraph/state.ts +61 -0
  936. package/extension/src/langgraph/steering-loader.ts +192 -0
  937. package/extension/src/langgraph/stream-handler.ts +185 -0
  938. package/extension/src/langgraph/tool-registry.ts +85 -0
  939. package/extension/src/langgraph/vscode-tool-definitions.ts +44 -0
  940. package/extension/src/langgraph/vscode-tools.ts +146 -0
  941. package/extension/src/langgraph/workflow-executor-actions.ts +144 -0
  942. package/extension/src/langgraph/workflow-executor.ts +87 -0
  943. package/extension/src/langgraph/workflow-graph-data.ts +132 -0
  944. package/extension/src/langgraph/workflow-parser-actions.ts +87 -0
  945. package/extension/src/langgraph/workflow-parser.ts +74 -0
  946. package/extension/src/logger.ts +34 -0
  947. package/extension/src/mcp-config-builder.ts +118 -0
  948. package/extension/src/mcp-injector.ts +68 -0
  949. package/extension/src/mcp-server-manager.ts +24 -0
  950. package/extension/src/models/LlmProviderConfig.ts +25 -0
  951. package/extension/src/models/LlmTestResult.ts +9 -0
  952. package/extension/src/models/SettingsState.ts +16 -0
  953. package/extension/src/models/index.ts +3 -0
  954. package/extension/src/native-addon-manager.ts +194 -0
  955. package/extension/src/panels/analytics-panel.ts +31 -0
  956. package/extension/src/panels/base-panel.ts +95 -0
  957. package/extension/src/panels/dashboard-panel.ts +29 -0
  958. package/extension/src/panels/graph-panel.ts +27 -0
  959. package/extension/src/panels/impact-panel.ts +167 -0
  960. package/extension/src/panels/login-panel.ts +100 -0
  961. package/extension/src/panels/panel-html.ts +124 -0
  962. package/extension/src/panels/quality-panel.ts +31 -0
  963. package/extension/src/panels/security-panel.ts +162 -0
  964. package/extension/src/panels/settings/SettingsMessageHandler.ts +190 -0
  965. package/extension/src/panels/settings/SettingsPanel.ts +121 -0
  966. package/extension/src/panels/settings-panel.ts +10 -0
  967. package/extension/src/panels/tags-panel.ts +31 -0
  968. package/extension/src/panels/workflow-panel.ts +80 -0
  969. package/extension/src/platform-swap/backup-manager.ts +156 -0
  970. package/extension/src/platform-swap/index.ts +62 -0
  971. package/extension/src/platform-swap/platform-config.ts +84 -0
  972. package/extension/src/platform-swap/platform-detector.ts +90 -0
  973. package/extension/src/platform-swap/platform-status-bar.ts +71 -0
  974. package/extension/src/platform-swap/state-manager.ts +101 -0
  975. package/extension/src/platform-swap/swap-commands.ts +161 -0
  976. package/extension/src/platform-swap/swap-executor.ts +193 -0
  977. package/extension/src/platform-swap/types.ts +68 -0
  978. package/extension/src/proxy/HttpClient.ts +120 -0
  979. package/extension/src/proxy/ToolProxy.ts +58 -0
  980. package/extension/src/remote-backend-client.ts +185 -0
  981. package/extension/src/services/IndexerHttpClient.ts +129 -0
  982. package/extension/src/services/IndexingService.ts +101 -0
  983. package/extension/src/services/LlmTestService.ts +96 -0
  984. package/extension/src/services/ProviderConfigService.ts +85 -0
  985. package/extension/src/services/WorkspaceSyncService.ts +48 -0
  986. package/extension/src/sf-indexer.ts +85 -0
  987. package/extension/src/sidebar/tree-view-provider.ts +173 -0
  988. package/extension/src/symbol-search.ts +135 -0
  989. package/extension/src/test/base-panel.test.ts +168 -0
  990. package/extension/src/test/mcp-server-manager.test.ts +322 -0
  991. package/extension/src/test/mocks/vscode.ts +148 -0
  992. package/extension/src/test/setup.ts +18 -0
  993. package/extension/src/test/tree-view-provider.test.ts +208 -0
  994. package/extension/src/test/webview-panel-manager.test.ts +160 -0
  995. package/extension/src/types/index.ts +6 -0
  996. package/extension/src/types/panel-types.ts +81 -0
  997. package/extension/src/types/server-types.ts +96 -0
  998. package/extension/src/types.ts +5 -0
  999. package/extension/src/ui/status-bar.ts +55 -0
  1000. package/extension/src/webview/__tests__/integration.test.ts +341 -0
  1001. package/extension/src/webview/__tests__/options.integration.test.ts +269 -0
  1002. package/extension/src/webview/__tests__/options.pbt.test.ts +222 -0
  1003. package/extension/src/webview/__tests__/options.unit.test.ts +413 -0
  1004. package/extension/src/webview/__tests__/pbt.test.ts +251 -0
  1005. package/extension/src/webview/__tests__/slash-menu.integration.test.ts +259 -0
  1006. package/extension/src/webview/__tests__/slash-menu.pbt.test.ts +229 -0
  1007. package/extension/src/webview/__tests__/slash-menu.unit.test.ts +244 -0
  1008. package/extension/src/webview/__tests__/spinner.integration.test.ts +214 -0
  1009. package/extension/src/webview/__tests__/spinner.pbt.test.ts +151 -0
  1010. package/extension/src/webview/__tests__/spinner.unit.test.ts +263 -0
  1011. package/extension/src/webview/__tests__/unit-part2.test.ts +377 -0
  1012. package/extension/src/webview/__tests__/unit.test.ts +101 -0
  1013. package/extension/src/webview/badges/BadgeManager.ts +94 -0
  1014. package/extension/src/webview/badges/BadgeRenderer.ts +66 -0
  1015. package/extension/src/webview/badges/types.ts +12 -0
  1016. package/extension/src/webview/bridge/MessageBridge.ts +107 -0
  1017. package/extension/src/webview/bridge/types.ts +15 -0
  1018. package/extension/src/webview/context-menu/ContextMenuController.ts +275 -0
  1019. package/extension/src/webview/context-menu/ContextMenuItems.ts +72 -0
  1020. package/extension/src/webview/context-menu/ContextMenuView.ts +154 -0
  1021. package/extension/src/webview/context-menu/FilePicker.ts +100 -0
  1022. package/extension/src/webview/context-menu/FolderPicker.ts +98 -0
  1023. package/extension/src/webview/context-menu/FuzzyFilter.ts +67 -0
  1024. package/extension/src/webview/context-menu/ListPicker.ts +172 -0
  1025. package/extension/src/webview/context-menu/PickerPanel.ts +205 -0
  1026. package/extension/src/webview/context-menu/types.ts +49 -0
  1027. package/extension/src/webview/graph/lod/BudgetManager.ts +53 -0
  1028. package/extension/src/webview/graph/lod/ClusteringAlgorithm.ts +186 -0
  1029. package/extension/src/webview/graph/lod/DistanceChecker.ts +51 -0
  1030. package/extension/src/webview/graph/lod/LODManager.ts +177 -0
  1031. package/extension/src/webview/graph/lod/OrbitalLayout.ts +52 -0
  1032. package/extension/src/webview/graph/lod/__tests__/lod.test.ts +269 -0
  1033. package/extension/src/webview/graph/lod/clustering-helpers.ts +62 -0
  1034. package/extension/src/webview/graph/lod/config.ts +36 -0
  1035. package/extension/src/webview/graph/lod/index.ts +25 -0
  1036. package/extension/src/webview/graph/lod/types.ts +91 -0
  1037. package/extension/src/webview/input/InputAreaIntegration.ts +408 -0
  1038. package/extension/src/webview/options/OptionsController.ts +203 -0
  1039. package/extension/src/webview/options/OptionsView.ts +169 -0
  1040. package/extension/src/webview/options/types.ts +42 -0
  1041. package/extension/src/webview/protocol.ts +134 -0
  1042. package/extension/src/webview/slash-menu/SlashMenuController.ts +249 -0
  1043. package/extension/src/webview/slash-menu/SlashMenuItems.ts +89 -0
  1044. package/extension/src/webview/slash-menu/SlashMenuView.ts +216 -0
  1045. package/extension/src/webview/slash-menu/types.ts +61 -0
  1046. package/extension/src/webview/spinner/SpinnerController.ts +114 -0
  1047. package/extension/src/webview/spinner/SpinnerView.ts +67 -0
  1048. package/extension/src/webview/spinner/types.ts +35 -0
  1049. package/extension/src/webview-panel-manager.ts +117 -0
  1050. package/extension/vitest.config.ts +10 -0
  1051. package/extension/webview-assets/3d-force-graph.min.js +5 -0
  1052. package/extension/webview-assets/analytics.js +174 -0
  1053. package/extension/webview-assets/chart.min.js +14 -0
  1054. package/extension/webview-assets/chat/chat.js +1907 -0
  1055. package/extension/webview-assets/chat/graph-viz.js +144 -0
  1056. package/extension/webview-assets/chat/markdown-renderer.js +254 -0
  1057. package/extension/webview-assets/dashboard.js +246 -0
  1058. package/extension/webview-assets/graph.js +636 -0
  1059. package/extension/webview-assets/quality.js +203 -0
  1060. package/extension/webview-assets/settings/settings.css +391 -0
  1061. package/extension/webview-assets/settings/settings.js +575 -0
  1062. package/extension/webview-assets/tags.js +182 -0
  1063. package/extension/webview-assets/three.min.js +6 -0
  1064. package/extension/webview-assets/workflow-graph.js +108 -0
  1065. package/package.json +61 -0
  1066. package/scripts/debug/check_tools.js +76 -0
  1067. package/scripts/debug/clear_graph.cjs +12 -0
  1068. package/scripts/debug/fetch_ticket.mjs +18 -0
  1069. package/scripts/debug/get-jira.js +27 -0
  1070. package/scripts/debug/get_tools.js +14 -0
  1071. package/scripts/debug/inject_all_logs.js +15 -0
  1072. package/scripts/debug/inject_debug.js +14 -0
  1073. package/scripts/debug/inject_error.js +14 -0
  1074. package/scripts/debug/migrate-db-types.js +91 -0
  1075. package/scripts/debug/read-ksa-295.mjs +15 -0
  1076. package/scripts/debug/scratch.cjs +17 -0
  1077. package/scripts/debug/scratch_admin.cjs +11 -0
  1078. package/scripts/debug/sm-discovery.mjs +33 -0
  1079. package/scripts/debug/test-atlassian-endpoints.js +32 -0
  1080. package/scripts/debug/test-convert.js +33 -0
  1081. package/scripts/debug/test-db-debug.cjs +24 -0
  1082. package/scripts/debug/test-db.js +22 -0
  1083. package/scripts/debug/test-find-tools.mjs +32 -0
  1084. package/scripts/debug/test-mcp-sdk.js +28 -0
  1085. package/scripts/debug/test-post.js +31 -0
  1086. package/scripts/debug/test-stream.mjs +57 -0
  1087. package/scripts/debug/test-ws.js +25 -0
  1088. package/scripts/debug/test.js +12 -0
  1089. package/scripts/debug/test2.ts +9 -0
  1090. package/scripts/debug/test_activate.js +130 -0
  1091. package/scripts/debug/test_api.py +19 -0
  1092. package/scripts/debug/tmp-jira-call.js +38 -0
  1093. package/src/admin/__tests__/admin-db.test.ts +450 -0
  1094. package/src/admin/admin-db.ts +1134 -0
  1095. package/src/admin/index.ts +83 -0
  1096. package/src/admin/middleware/audit.middleware.ts +60 -0
  1097. package/src/admin/middleware/rate-limit.middleware.ts +48 -0
  1098. package/src/admin/middleware/rbac.middleware.ts +116 -0
  1099. package/src/admin/routes/analytics.router.ts +60 -0
  1100. package/src/admin/routes/audit.router.ts +28 -0
  1101. package/src/admin/routes/config.router.ts +23 -0
  1102. package/src/admin/routes/dashboard.router.ts +14 -0
  1103. package/src/admin/routes/helpers.ts +15 -0
  1104. package/src/admin/routes/kb-admin.router.ts +42 -0
  1105. package/src/admin/routes/mcp-admin.router.ts +34 -0
  1106. package/src/admin/routes/rbac.router.ts +53 -0
  1107. package/src/admin/routes/search.router.ts +24 -0
  1108. package/src/admin/routes/user.router.ts +40 -0
  1109. package/src/admin/services/audit.service.ts +29 -0
  1110. package/src/admin/services/config.service.ts +28 -0
  1111. package/src/admin/services/dashboard.service.ts +46 -0
  1112. package/src/admin/services/kb-admin.service.ts +65 -0
  1113. package/src/admin/services/mcp-admin.service.ts +42 -0
  1114. package/src/admin/services/rbac.service.ts +99 -0
  1115. package/src/admin/services/search.service.ts +47 -0
  1116. package/src/admin/services/sse.manager.ts +41 -0
  1117. package/src/admin/services/user.service.ts +55 -0
  1118. package/src/admin/standalone-server.ts +105 -0
  1119. package/src/admin/types/admin.types.ts +185 -0
  1120. package/src/admin/types/api.types.ts +66 -0
  1121. package/src/admin/types/rbac.types.ts +111 -0
  1122. package/src/config/BackendConfig.ts +48 -0
  1123. package/src/engine/analyzers/complexity/ComplexityAnalyzer.ts +115 -0
  1124. package/src/engine/analyzers/complexity/ComplexityCalculator.ts +65 -0
  1125. package/src/engine/analyzers/complexity/ComplexityStore.ts +177 -0
  1126. package/src/engine/analyzers/complexity/ComplexityTool.ts +71 -0
  1127. package/src/engine/analyzers/complexity/GradeAssigner.ts +34 -0
  1128. package/src/engine/analyzers/complexity/counters/BaseNodeCounter.ts +94 -0
  1129. package/src/engine/analyzers/complexity/counters/GoCounter.ts +34 -0
  1130. package/src/engine/analyzers/complexity/counters/JavaCounter.ts +31 -0
  1131. package/src/engine/analyzers/complexity/counters/KotlinCounter.ts +37 -0
  1132. package/src/engine/analyzers/complexity/counters/PythonCounter.ts +38 -0
  1133. package/src/engine/analyzers/complexity/counters/TypeScriptCounter.ts +34 -0
  1134. package/src/engine/analyzers/complexity/index.ts +25 -0
  1135. package/src/engine/analyzers/complexity/types.ts +62 -0
  1136. package/src/engine/analyzers/entry-points/EntryPointDetector.ts +76 -0
  1137. package/src/engine/analyzers/entry-points/EntryPointStore.ts +162 -0
  1138. package/src/engine/analyzers/entry-points/EntryPointTool.ts +63 -0
  1139. package/src/engine/analyzers/entry-points/FrameworkDetector.ts +57 -0
  1140. package/src/engine/analyzers/entry-points/PatternRegistry.ts +114 -0
  1141. package/src/engine/analyzers/entry-points/RouteResolver.ts +44 -0
  1142. package/src/engine/analyzers/entry-points/detectors/CLIDetector.ts +48 -0
  1143. package/src/engine/analyzers/entry-points/detectors/EventDetector.ts +77 -0
  1144. package/src/engine/analyzers/entry-points/detectors/HTTPHandlerDetector.ts +158 -0
  1145. package/src/engine/analyzers/entry-points/detectors/MainDetector.ts +64 -0
  1146. package/src/engine/analyzers/entry-points/index.ts +23 -0
  1147. package/src/engine/analyzers/entry-points/types.ts +74 -0
  1148. package/src/engine/analyzers/graph-analysis/CircularDepDetector.ts +93 -0
  1149. package/src/engine/analyzers/graph-analysis/DeadImportDetector.ts +70 -0
  1150. package/src/engine/analyzers/graph-analysis/GraphAnalysisTools.ts +202 -0
  1151. package/src/engine/analyzers/graph-analysis/HotPathAnalyzer.ts +67 -0
  1152. package/src/engine/analyzers/graph-analysis/ModuleSummarizer.ts +72 -0
  1153. package/src/engine/analyzers/graph-analysis/RelatedTestFinder.ts +97 -0
  1154. package/src/engine/analyzers/graph-analysis/index.ts +23 -0
  1155. package/src/engine/analyzers/graph-analysis/types.ts +73 -0
  1156. package/src/engine/analyzers/graph-analysis/utils/GraphLoader.ts +149 -0
  1157. package/src/engine/analyzers/graph-analysis/utils/TarjanSCC.ts +65 -0
  1158. package/src/engine/analyzers/graph-analysis/utils/TestFileDetector.ts +35 -0
  1159. package/src/engine/analyzers/security/cfg/BasicBlock.ts +130 -0
  1160. package/src/engine/analyzers/security/cfg/CFGBuilder.ts +266 -0
  1161. package/src/engine/analyzers/security/cfg/CFGEdge.ts +24 -0
  1162. package/src/engine/analyzers/security/cfg/ControlFlowGraph.ts +102 -0
  1163. package/src/engine/analyzers/security/dataflow/DataFlowAnalyzer.ts +78 -0
  1164. package/src/engine/analyzers/security/dataflow/ReachingDefinitions.ts +91 -0
  1165. package/src/engine/analyzers/security/idor/IDORDetector.ts +143 -0
  1166. package/src/engine/analyzers/security/injection/InjectionScanner.ts +164 -0
  1167. package/src/engine/analyzers/security/injection/PatternMatcher.ts +85 -0
  1168. package/src/engine/analyzers/security/injection/SuppressionChecker.ts +65 -0
  1169. package/src/engine/analyzers/security/injection/patterns/CommandInjectionMatcher.ts +56 -0
  1170. package/src/engine/analyzers/security/injection/patterns/DeserializationMatcher.ts +45 -0
  1171. package/src/engine/analyzers/security/injection/patterns/LDAPXMLMatcher.ts +34 -0
  1172. package/src/engine/analyzers/security/injection/patterns/PathTraversalMatcher.ts +45 -0
  1173. package/src/engine/analyzers/security/injection/patterns/SQLInjectionMatcher.ts +56 -0
  1174. package/src/engine/analyzers/security/injection/patterns/XSSMatcher.ts +56 -0
  1175. package/src/engine/analyzers/security/ssrf/SSRFDetector.ts +103 -0
  1176. package/src/engine/analyzers/security/taint/TaintAnalyzer.ts +230 -0
  1177. package/src/engine/analyzers/security/taint/TaintPropagator.ts +250 -0
  1178. package/src/engine/analyzers/security/taint/TaintRegistry.ts +139 -0
  1179. package/src/engine/analyzers/security/types.ts +326 -0
  1180. package/src/engine/analyzers/similarity/ClusterBuilder.ts +68 -0
  1181. package/src/engine/analyzers/similarity/DeadCodeDetector.ts +227 -0
  1182. package/src/engine/analyzers/similarity/DuplicateDetector.ts +211 -0
  1183. package/src/engine/analyzers/similarity/GitMiner.ts +227 -0
  1184. package/src/engine/analyzers/similarity/SimilarityTools.ts +181 -0
  1185. package/src/engine/analyzers/similarity/types.ts +76 -0
  1186. package/src/engine/config.ts +153 -0
  1187. package/src/engine/context/ai-context-service.ts +302 -0
  1188. package/src/engine/context/budget-allocator.ts +66 -0
  1189. package/src/engine/context/curated-context-service.ts +268 -0
  1190. package/src/engine/context/edit-context-service.ts +279 -0
  1191. package/src/engine/context/git-service.ts +48 -0
  1192. package/src/engine/context/index.ts +15 -0
  1193. package/src/engine/context/intent-strategies.ts +75 -0
  1194. package/src/engine/context/query-analyzer.ts +49 -0
  1195. package/src/engine/context/rrf-merger.ts +63 -0
  1196. package/src/engine/context/token-budget-manager.ts +129 -0
  1197. package/src/engine/context/types.ts +164 -0
  1198. package/src/engine/database/graph-repository.ts +166 -0
  1199. package/src/engine/database/incremental-updater.ts +117 -0
  1200. package/src/engine/database/index.ts +13 -0
  1201. package/src/engine/database/migrations/002-graph-schema.sql +24 -0
  1202. package/src/engine/database/migrator.ts +148 -0
  1203. package/src/engine/db/database-manager.ts +89 -0
  1204. package/src/engine/db/migrations.ts +159 -0
  1205. package/src/engine/db/native-addon-resolver.ts +386 -0
  1206. package/src/engine/db/schema.ts +123 -0
  1207. package/src/engine/graph/__tests__/graph-services.test.ts +476 -0
  1208. package/src/engine/graph/call-graph-service.ts +216 -0
  1209. package/src/engine/graph/dependency-formatters.ts +95 -0
  1210. package/src/engine/graph/dependency-graph-service.ts +236 -0
  1211. package/src/engine/graph/file-resolver.ts +102 -0
  1212. package/src/engine/graph/impact-analysis-service.ts +293 -0
  1213. package/src/engine/graph/index.ts +13 -0
  1214. package/src/engine/graph/symbol-resolver.ts +90 -0
  1215. package/src/engine/graph/test-detector.ts +77 -0
  1216. package/src/engine/graph/traverser.ts +237 -0
  1217. package/src/engine/indexer/__tests__/tree-sitter-pipeline.test.ts +205 -0
  1218. package/src/engine/indexer/file-watcher.ts +77 -0
  1219. package/src/engine/indexer/indexing-engine.ts +468 -0
  1220. package/src/engine/parsers/ast-utils.ts +140 -0
  1221. package/src/engine/parsers/embedding/EmbeddingService.ts +64 -0
  1222. package/src/engine/parsers/embedding/body-extractor.ts +123 -0
  1223. package/src/engine/parsers/embedding/chunker.ts +71 -0
  1224. package/src/engine/parsers/embedding/index.ts +6 -0
  1225. package/src/engine/parsers/grammar-config.json +58 -0
  1226. package/src/engine/parsers/grammar-registry.ts +162 -0
  1227. package/src/engine/parsers/grammars/config-schema.json +1 -0
  1228. package/src/engine/parsers/grammars/grammar-config-loader.ts +192 -0
  1229. package/src/engine/parsers/grammars/tree-sitter-apex.wasm +0 -0
  1230. package/src/engine/parsers/grammars/tree-sitter-go.wasm +0 -0
  1231. package/src/engine/parsers/grammars/tree-sitter-java.wasm +0 -0
  1232. package/src/engine/parsers/grammars/tree-sitter-javascript.wasm +0 -0
  1233. package/src/engine/parsers/grammars/tree-sitter-python.wasm +0 -0
  1234. package/src/engine/parsers/grammars/tree-sitter-rust.wasm +0 -0
  1235. package/src/engine/parsers/grammars/tree-sitter-typescript.wasm +0 -0
  1236. package/src/engine/parsers/grammars/typescript.grammar.json +67 -0
  1237. package/src/engine/parsers/ignore/ignore-parser.ts +112 -0
  1238. package/src/engine/parsers/ignore/index.ts +1 -0
  1239. package/src/engine/parsers/index.ts +17 -0
  1240. package/src/engine/parsers/languages/__tests__/apex-parser.test.ts +253 -0
  1241. package/src/engine/parsers/languages/__tests__/fixtures/Annotations.java +57 -0
  1242. package/src/engine/parsers/languages/__tests__/fixtures/SimpleClass.java +72 -0
  1243. package/src/engine/parsers/languages/__tests__/fixtures/UserController.java +57 -0
  1244. package/src/engine/parsers/languages/__tests__/fixtures/UserService.java +72 -0
  1245. package/src/engine/parsers/languages/__tests__/fixtures/apex/ClassWithDML.cls +17 -0
  1246. package/src/engine/parsers/languages/__tests__/fixtures/apex/ClassWithMethods.cls +24 -0
  1247. package/src/engine/parsers/languages/__tests__/fixtures/apex/ClassWithSOQL.cls +9 -0
  1248. package/src/engine/parsers/languages/__tests__/fixtures/apex/InheritanceExample.cls +18 -0
  1249. package/src/engine/parsers/languages/__tests__/fixtures/apex/InterfaceExample.cls +5 -0
  1250. package/src/engine/parsers/languages/__tests__/fixtures/apex/MalformedClass.cls +5 -0
  1251. package/src/engine/parsers/languages/__tests__/fixtures/apex/SimpleClass.cls +2 -0
  1252. package/src/engine/parsers/languages/__tests__/fixtures/apex/TriggerExample.trigger +8 -0
  1253. package/src/engine/parsers/languages/__tests__/fixtures/protocol-class.py +63 -0
  1254. package/src/engine/parsers/languages/__tests__/fixtures/salesforce-meta/CustomObject.object-meta.xml +21 -0
  1255. package/src/engine/parsers/languages/__tests__/fixtures/salesforce-meta/LWCMeta.js-meta.xml +9 -0
  1256. package/src/engine/parsers/languages/__tests__/fixtures/salesforce-meta/LookupField.field-meta.xml +7 -0
  1257. package/src/engine/parsers/languages/__tests__/fixtures/salesforce-meta/SimpleFlow.flow-meta.xml +32 -0
  1258. package/src/engine/parsers/languages/__tests__/fixtures/simple-function.py +57 -0
  1259. package/src/engine/parsers/languages/__tests__/fixtures/simple.go +55 -0
  1260. package/src/engine/parsers/languages/__tests__/fixtures/simple.rs +109 -0
  1261. package/src/engine/parsers/languages/__tests__/go-parser.test.ts +254 -0
  1262. package/src/engine/parsers/languages/__tests__/java-parser.test.ts +296 -0
  1263. package/src/engine/parsers/languages/__tests__/python-parser.test.ts +256 -0
  1264. package/src/engine/parsers/languages/__tests__/rust-parser.test.ts +354 -0
  1265. package/src/engine/parsers/languages/__tests__/salesforce-meta-parser.test.ts +216 -0
  1266. package/src/engine/parsers/languages/apex-parser.ts +665 -0
  1267. package/src/engine/parsers/languages/go-parser.ts +429 -0
  1268. package/src/engine/parsers/languages/java-parser.ts +651 -0
  1269. package/src/engine/parsers/languages/kotlin-parser.ts +624 -0
  1270. package/src/engine/parsers/languages/python-parser.ts +502 -0
  1271. package/src/engine/parsers/languages/rust-parser.ts +644 -0
  1272. package/src/engine/parsers/languages/salesforce-meta-parser.ts +404 -0
  1273. package/src/engine/parsers/languages/ts-call-extractor.ts +155 -0
  1274. package/src/engine/parsers/languages/ts-import-extractor.ts +132 -0
  1275. package/src/engine/parsers/languages/ts-inheritance-extractor.ts +54 -0
  1276. package/src/engine/parsers/languages/ts-symbol-extractor.ts +319 -0
  1277. package/src/engine/parsers/languages/ts-utils.ts +88 -0
  1278. package/src/engine/parsers/languages/typescript-parser.ts +72 -0
  1279. package/src/engine/parsers/tree-sitter-indexer.ts +263 -0
  1280. package/src/engine/parsers/types.ts +78 -0
  1281. package/src/engine/query/query-layer.ts +177 -0
  1282. package/src/engine/scanner/file-scanner.ts +173 -0
  1283. package/src/engine/scanner/pattern-detector.ts +112 -0
  1284. package/src/engine/scanner/signature-extractor.ts +173 -0
  1285. package/src/engine/tools/ai-context-tools.ts +155 -0
  1286. package/src/engine/tools/call-graph-tools.ts +109 -0
  1287. package/src/engine/tools/code-context.ts +70 -0
  1288. package/src/engine/tools/code-index-status.ts +85 -0
  1289. package/src/engine/tools/code-kb-export.ts +84 -0
  1290. package/src/engine/tools/code-modules.ts +53 -0
  1291. package/src/engine/tools/code-search.ts +39 -0
  1292. package/src/engine/tools/code-symbols.ts +53 -0
  1293. package/src/engine/tools/code-traverse.ts +75 -0
  1294. package/src/engine/tools/dependency-tools.ts +54 -0
  1295. package/src/engine/tools/drawio-export-png.ts +272 -0
  1296. package/src/engine/tools/drawio-layout.ts +143 -0
  1297. package/src/engine/tools/drawio-parser.ts +118 -0
  1298. package/src/engine/tools/drawio-router.ts +112 -0
  1299. package/src/engine/tools/drawio-tool.ts +167 -0
  1300. package/src/engine/tools/drawio-writer.ts +133 -0
  1301. package/src/engine/tools/impact-tools.ts +97 -0
  1302. package/src/engine/tools/register-tools.ts +230 -0
  1303. package/src/index.ts +131 -0
  1304. package/src/logger.ts +34 -0
  1305. package/src/modules/ModuleRegistry.ts +106 -0
  1306. package/src/modules/analytics/AnalyticsModule.ts +49 -0
  1307. package/src/modules/code-intel/CodeIntelModule.ts +84 -0
  1308. package/src/modules/kb-graph/KBGraphModule.ts +63 -0
  1309. package/src/modules/kb-graph/SqliteGraphService.ts +488 -0
  1310. package/src/modules/memory/MemoryDb.ts +53 -0
  1311. package/src/modules/memory/MemoryEngine.ts +239 -0
  1312. package/src/modules/memory/MemoryEngineFull.ts +0 -0
  1313. package/src/modules/memory/MemoryModule.ts +163 -0
  1314. package/src/modules/memory/MemoryToolDefinitions.ts +301 -0
  1315. package/src/modules/memory/MemoryToolDispatcher.ts +488 -0
  1316. package/src/modules/memory/ScopePromotionService.ts +339 -0
  1317. package/src/modules/memory/__tests__/MemoryToolDispatcher.test.ts +85 -0
  1318. package/src/modules/memory/__tests__/ScopePromotionService.test.ts +160 -0
  1319. package/src/modules/memory/llm/LLMService.ts +75 -0
  1320. package/src/modules/memory/llm/TagAnalyzerService.ts +255 -0
  1321. package/src/modules/memory/llm/index.ts +2 -0
  1322. package/src/modules/memory/llm/ollama-adapter.ts +60 -0
  1323. package/src/modules/memory/llm/openai-adapter.ts +44 -0
  1324. package/src/modules/memory/llm/types.ts +31 -0
  1325. package/src/modules/memory/masking/MaskingMiddleware.ts +143 -0
  1326. package/src/modules/memory/masking/__tests__/CredentialDetector.test.ts +48 -0
  1327. package/src/modules/memory/masking/__tests__/MaskingMiddleware.test.ts +74 -0
  1328. package/src/modules/memory/masking/__tests__/PiiDetector.test.ts +59 -0
  1329. package/src/modules/memory/masking/db/migrations/001-masking-tables.sql +60 -0
  1330. package/src/modules/memory/masking/detectors/CredentialDetector.ts +54 -0
  1331. package/src/modules/memory/masking/detectors/DetectorStrategy.ts +10 -0
  1332. package/src/modules/memory/masking/detectors/PiiDetector.ts +54 -0
  1333. package/src/modules/memory/masking/index.ts +8 -0
  1334. package/src/modules/memory/masking/maskers/ContentMasker.ts +111 -0
  1335. package/src/modules/memory/masking/models/MaskingTypes.ts +91 -0
  1336. package/src/modules/memory/masking/services/AllowlistService.ts +34 -0
  1337. package/src/modules/memory/masking/services/AuditService.ts +42 -0
  1338. package/src/modules/memory/masking/services/ConfigCacheService.ts +45 -0
  1339. package/src/modules/memory/migrations/001-add-scope-columns.ts +25 -0
  1340. package/src/modules/memory/models.ts +106 -0
  1341. package/src/modules/memory/schema.ts +269 -0
  1342. package/src/modules/memory/tool-definitions.ts +31 -0
  1343. package/src/modules/orchestration/McpClientManager.ts +209 -0
  1344. package/src/modules/orchestration/McpConfigRoutes.ts +133 -0
  1345. package/src/modules/orchestration/McpConfigService.ts +158 -0
  1346. package/src/modules/orchestration/OrchestrationModule.ts +168 -0
  1347. package/src/modules/utility/UtilityModule.ts +67 -0
  1348. package/src/modules/web/WebModule.ts +79 -0
  1349. package/src/modules/web/handlers/ApiCallHandler.ts +48 -0
  1350. package/src/modules/web/handlers/DownloadFileHandler.ts +66 -0
  1351. package/src/modules/web/handlers/FetchUrlHandler.ts +93 -0
  1352. package/src/modules/web/handlers/GitBrowseHandler.ts +70 -0
  1353. package/src/modules/web/handlers/ReadWebpageHandler.ts +59 -0
  1354. package/src/modules/web/handlers/WebSearchHandler.ts +50 -0
  1355. package/src/modules/web/middleware/ContentTruncator.ts +31 -0
  1356. package/src/modules/web/middleware/RateLimiter.ts +70 -0
  1357. package/src/modules/web/middleware/SsrfGuard.ts +82 -0
  1358. package/src/modules/web/models/WebError.ts +25 -0
  1359. package/src/modules/web/models/WebModuleConfig.ts +35 -0
  1360. package/src/modules/web/models/WebToolResult.ts +23 -0
  1361. package/src/modules/web/utils/GitUrlParser.ts +46 -0
  1362. package/src/modules/web/utils/HtmlExtractor.ts +46 -0
  1363. package/src/modules/web/utils/UrlValidator.ts +24 -0
  1364. package/src/server/HttpServer.ts +135 -0
  1365. package/src/server/mcpServer.ts +91 -0
  1366. package/src/server/middleware/error-handler.ts +23 -0
  1367. package/src/server/middleware/localhost-only.ts +22 -0
  1368. package/src/server/middleware/rate-limiter.ts +61 -0
  1369. package/src/server/middleware/request-logger.ts +26 -0
  1370. package/src/server/routes/__tests__/admin.test.ts +667 -0
  1371. package/src/server/routes/admin.ts +2511 -0
  1372. package/src/server/routes/api.ts +208 -0
  1373. package/src/server/routes/health.ts +33 -0
  1374. package/src/server/routes/tools.ts +70 -0
  1375. package/src/shared/protocol.ts +134 -0
  1376. package/src/tool-router/ToolDefinitions.ts +17 -0
  1377. package/src/tool-router/ToolRouter.ts +65 -0
  1378. package/src/tool-router/ToolValidator.ts +55 -0
  1379. package/src/types/module.ts +23 -0
  1380. package/src/types/tool.ts +39 -0
  1381. package/src/types.ts +6 -0
  1382. package/src/viewer/3d-force-graph.min.js +5 -0
  1383. package/src/viewer/__tests__/lod-manager.test.js +300 -0
  1384. package/src/viewer/admin/camera-physics.js +102 -0
  1385. package/src/viewer/admin/gesture-fsm.js +195 -0
  1386. package/src/viewer/admin/index.html +338 -0
  1387. package/src/viewer/admin/kb-graph-renderer.js +601 -0
  1388. package/src/viewer/admin/lod-animation.js +202 -0
  1389. package/src/viewer/admin/lod-clustering.js +229 -0
  1390. package/src/viewer/admin/lod-manager.js +341 -0
  1391. package/src/viewer/admin/map-controls.js +195 -0
  1392. package/src/viewer/admin/zoom-animator.js +90 -0
  1393. package/src/viewer/analytics.js +73 -0
  1394. package/src/viewer/browser.js +82 -0
  1395. package/src/viewer/dashboard.js +193 -0
  1396. package/src/viewer/graph.js +249 -0
  1397. package/src/viewer/lod-animation.js +200 -0
  1398. package/src/viewer/lod-clustering.js +227 -0
  1399. package/src/viewer/lod-manager.js +274 -0
  1400. package/src/viewer/modules/empty-states.js +123 -0
  1401. package/src/viewer/modules/event-bus.js +37 -0
  1402. package/src/viewer/modules/graph-analysis.js +131 -0
  1403. package/src/viewer/modules/help-panel.js +104 -0
  1404. package/src/viewer/modules/markdown-renderer.js +70 -0
  1405. package/src/viewer/modules/recommendations.js +116 -0
  1406. package/src/viewer/modules/tooltips.js +119 -0
  1407. package/src/viewer/modules/tour-ui.js +136 -0
  1408. package/src/viewer/modules/tour.js +99 -0
  1409. package/src/viewer/quality.js +122 -0
  1410. package/src/viewer/session-export.js +37 -0
  1411. package/src/viewer/session-playback.js +80 -0
  1412. package/src/viewer/session-timeline.js +112 -0
  1413. package/src/viewer/sessions.js +84 -0
  1414. package/src/viewer/stream.js +109 -0
  1415. package/src/viewer/tags.js +101 -0
  1416. package/src/vitest.config.ts +9 -0
  1417. package/src/vitest.ksa252.config.ts +10 -0
  1418. package/tests/e2e/admin-api.e2e.test.ts +702 -0
  1419. package/tests/e2e/admin-ui.e2e.test.ts +703 -0
  1420. package/tests/e2e/check-lod.mjs +33 -0
  1421. package/tests/e2e/debug-collapse.mjs +79 -0
  1422. package/tests/e2e/debug-expand.mjs +38 -0
  1423. package/tests/e2e/debug-lod.mjs +41 -0
  1424. package/tests/e2e/debug-realtime.mjs +39 -0
  1425. package/tests/e2e/lod-collapse.e2e.test.ts +163 -0
  1426. package/tests/e2e/mcp-api.e2e.test.ts +280 -0
  1427. package/tests/e2e/multi-tenant.e2e.test.ts +440 -0
  1428. package/tests/e2e/test-progressive.mjs +72 -0
  1429. package/tests/e2e/test-user-zoom.mjs +63 -0
  1430. package/tests/e2e/tool-forwarding.e2e.test.ts +128 -0
  1431. package/tests/integration/auth.test.ts +342 -0
  1432. package/tests/integration/mcp-tools.test.ts +288 -0
  1433. package/tsconfig.json +19 -0
  1434. 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 = "&times;";
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: "&gt;_", label: "CMD", cls: "cat-command" },
1111
+ { prefix: "control_pwsh", icon: "&gt;_", label: "CMD", cls: "cat-command" },
1112
+ { prefix: "get_process", icon: "&gt;_", label: "CMD", cls: "cat-command" },
1113
+ { prefix: "list_process", icon: "&gt;_", 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: "&gt;_", 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">&#x25B6;</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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
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
+ })();