codebase-onboarder 0.6.0 → 0.7.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 (448) hide show
  1. package/README.md +174 -46
  2. package/bin/build-if-source.js +23 -0
  3. package/cli/commands.d.ts +26 -0
  4. package/cli/commands.js +836 -811
  5. package/cli/commands.js.map +1 -0
  6. package/cli/explorer/advanced.d.ts +14 -0
  7. package/cli/explorer/advanced.js +321 -329
  8. package/cli/explorer/advanced.js.map +1 -0
  9. package/cli/explorer/app.d.ts +1 -0
  10. package/cli/explorer/app.js +384 -313
  11. package/cli/explorer/app.js.map +1 -0
  12. package/cli/explorer/assistant.d.ts +9 -0
  13. package/cli/explorer/assistant.js +58 -0
  14. package/cli/explorer/assistant.js.map +1 -0
  15. package/cli/explorer/commands.d.ts +17 -0
  16. package/cli/explorer/commands.js +368 -302
  17. package/cli/explorer/commands.js.map +1 -0
  18. package/cli/explorer/featureViews.d.ts +124 -0
  19. package/cli/explorer/featureViews.js +179 -0
  20. package/cli/explorer/featureViews.js.map +1 -0
  21. package/cli/explorer/github.d.ts +21 -0
  22. package/cli/explorer/github.js +42 -44
  23. package/cli/explorer/github.js.map +1 -0
  24. package/cli/explorer/graphs.d.ts +7 -0
  25. package/cli/explorer/graphs.js +90 -95
  26. package/cli/explorer/graphs.js.map +1 -0
  27. package/cli/explorer/picker.d.ts +22 -0
  28. package/cli/explorer/picker.js +150 -0
  29. package/cli/explorer/picker.js.map +1 -0
  30. package/cli/explorer/report.d.ts +85 -0
  31. package/cli/explorer/report.js +60 -0
  32. package/cli/explorer/report.js.map +1 -0
  33. package/cli/explorer/session.d.ts +449 -0
  34. package/cli/explorer/session.js +143 -144
  35. package/cli/explorer/session.js.map +1 -0
  36. package/cli/explorer/views.d.ts +19 -0
  37. package/cli/explorer/views.js +465 -482
  38. package/cli/explorer/views.js.map +1 -0
  39. package/cli/explorer/wrap.d.ts +1 -0
  40. package/cli/explorer/wrap.js +28 -44
  41. package/cli/explorer/wrap.js.map +1 -0
  42. package/cli/main.d.ts +1 -0
  43. package/cli/main.js +214 -161
  44. package/cli/main.js.map +1 -0
  45. package/cli/prompt.d.ts +5 -0
  46. package/cli/prompt.js +84 -80
  47. package/cli/prompt.js.map +1 -0
  48. package/cli/scanOptions.d.ts +2 -0
  49. package/cli/scanOptions.js +11 -0
  50. package/cli/scanOptions.js.map +1 -0
  51. package/cli/ui.d.ts +33 -0
  52. package/cli/ui.js +35 -44
  53. package/cli/ui.js.map +1 -0
  54. package/cli/wizard.d.ts +187 -0
  55. package/cli/wizard.js +304 -284
  56. package/cli/wizard.js.map +1 -0
  57. package/package.json +15 -4
  58. package/public/app.d.ts +1 -0
  59. package/public/app.js +1057 -1009
  60. package/public/app.js.map +1 -0
  61. package/public/browser.d.ts +68 -0
  62. package/public/browser.js +2 -0
  63. package/public/browser.js.map +1 -0
  64. package/public/index.html +30 -13
  65. package/public/js/about.d.ts +6 -0
  66. package/public/js/about.js +152 -172
  67. package/public/js/about.js.map +1 -0
  68. package/public/js/aiDraft.d.ts +3 -0
  69. package/public/js/aiDraft.js +116 -124
  70. package/public/js/aiDraft.js.map +1 -0
  71. package/public/js/analysisPanel.d.ts +7 -0
  72. package/public/js/analysisPanel.js +166 -166
  73. package/public/js/analysisPanel.js.map +1 -0
  74. package/public/js/analysisReport.d.ts +38 -0
  75. package/public/js/analysisReport.js +105 -110
  76. package/public/js/analysisReport.js.map +1 -0
  77. package/public/js/api.d.ts +26 -0
  78. package/public/js/api.js +176 -167
  79. package/public/js/api.js.map +1 -0
  80. package/public/js/atlas.d.ts +6 -0
  81. package/public/js/atlas.js +50 -58
  82. package/public/js/atlas.js.map +1 -0
  83. package/public/js/blameView.d.ts +2 -0
  84. package/public/js/blameView.js +36 -37
  85. package/public/js/blameView.js.map +1 -0
  86. package/public/js/codeTab.d.ts +3 -0
  87. package/public/js/codeTab.js +175 -180
  88. package/public/js/codeTab.js.map +1 -0
  89. package/public/js/codeViewer.d.ts +5 -0
  90. package/public/js/codeViewer.js +162 -150
  91. package/public/js/codeViewer.js.map +1 -0
  92. package/public/js/components/FileChip.d.ts +9 -0
  93. package/public/js/components/FileChip.js +45 -49
  94. package/public/js/components/FileChip.js.map +1 -0
  95. package/public/js/components/MetricSparkline.d.ts +7 -0
  96. package/public/js/components/MetricSparkline.js +35 -44
  97. package/public/js/components/MetricSparkline.js.map +1 -0
  98. package/public/js/components/RiskBadge.d.ts +9 -0
  99. package/public/js/components/RiskBadge.js +55 -63
  100. package/public/js/components/RiskBadge.js.map +1 -0
  101. package/public/js/deepAnalysisView.d.ts +99 -0
  102. package/public/js/deepAnalysisView.js +282 -302
  103. package/public/js/deepAnalysisView.js.map +1 -0
  104. package/public/js/diagramPane.d.ts +8 -0
  105. package/public/js/diagramPane.js +133 -135
  106. package/public/js/diagramPane.js.map +1 -0
  107. package/public/js/diffView.d.ts +6 -0
  108. package/public/js/diffView.js +222 -209
  109. package/public/js/diffView.js.map +1 -0
  110. package/public/js/docsView.d.ts +2 -0
  111. package/public/js/docsView.js +441 -442
  112. package/public/js/docsView.js.map +1 -0
  113. package/public/js/dom.d.ts +189 -0
  114. package/public/js/dom.js +5 -0
  115. package/public/js/dom.js.map +1 -0
  116. package/public/js/fileSourceBrowser.d.ts +5 -0
  117. package/public/js/fileSourceBrowser.js +33 -41
  118. package/public/js/fileSourceBrowser.js.map +1 -0
  119. package/public/js/flameGraph.d.ts +5 -0
  120. package/public/js/flameGraph.js +62 -72
  121. package/public/js/flameGraph.js.map +1 -0
  122. package/public/js/forceGraph.d.ts +10 -0
  123. package/public/js/forceGraph.js +581 -556
  124. package/public/js/forceGraph.js.map +1 -0
  125. package/public/js/heatmap.d.ts +4 -0
  126. package/public/js/heatmap.js +142 -164
  127. package/public/js/heatmap.js.map +1 -0
  128. package/public/js/highlight.d.ts +2 -0
  129. package/public/js/highlight.js +116 -107
  130. package/public/js/highlight.js.map +1 -0
  131. package/public/js/html.d.ts +2 -0
  132. package/public/js/html.js +14 -44
  133. package/public/js/html.js.map +1 -0
  134. package/public/js/insightsView.d.ts +5 -0
  135. package/public/js/insightsView.js +93 -111
  136. package/public/js/insightsView.js.map +1 -0
  137. package/public/js/inspector.d.ts +37 -0
  138. package/public/js/inspector.js +416 -445
  139. package/public/js/inspector.js.map +1 -0
  140. package/public/js/llm.d.ts +113 -0
  141. package/public/js/llm.js +233 -272
  142. package/public/js/llm.js.map +1 -0
  143. package/public/js/mapView.d.ts +3 -0
  144. package/public/js/mapView.js +121 -120
  145. package/public/js/mapView.js.map +1 -0
  146. package/public/js/markdown.d.ts +3 -0
  147. package/public/js/markdown.js +84 -91
  148. package/public/js/markdown.js.map +1 -0
  149. package/public/js/mindmap.d.ts +32 -0
  150. package/public/js/mindmap.js +244 -259
  151. package/public/js/mindmap.js.map +1 -0
  152. package/public/js/mobilePanels.d.ts +5 -0
  153. package/public/js/mobilePanels.js +50 -0
  154. package/public/js/mobilePanels.js.map +1 -0
  155. package/public/js/repoFiles.d.ts +12 -0
  156. package/public/js/repoFiles.js +28 -27
  157. package/public/js/repoFiles.js.map +1 -0
  158. package/public/js/reviewView.d.ts +28 -0
  159. package/public/js/reviewView.js +256 -0
  160. package/public/js/reviewView.js.map +1 -0
  161. package/public/js/sbomView.d.ts +3 -0
  162. package/public/js/sbomView.js +59 -67
  163. package/public/js/sbomView.js.map +1 -0
  164. package/public/js/scanCache.d.ts +16 -0
  165. package/public/js/scanCache.js +67 -65
  166. package/public/js/scanCache.js.map +1 -0
  167. package/public/js/search.d.ts +7 -0
  168. package/public/js/search.js +868 -800
  169. package/public/js/search.js.map +1 -0
  170. package/public/js/searchLocal.d.ts +42 -0
  171. package/public/js/searchLocal.js +87 -0
  172. package/public/js/searchLocal.js.map +1 -0
  173. package/public/js/serverSettings.d.ts +5 -0
  174. package/public/js/serverSettings.js +153 -164
  175. package/public/js/serverSettings.js.map +1 -0
  176. package/public/js/state.d.ts +798 -0
  177. package/public/js/state.js +114 -122
  178. package/public/js/state.js.map +1 -0
  179. package/public/js/tour.d.ts +6 -0
  180. package/public/js/tour.js +5 -7
  181. package/public/js/tour.js.map +1 -0
  182. package/public/js/transitions.d.ts +2 -0
  183. package/public/js/transitions.js +9 -10
  184. package/public/js/transitions.js.map +1 -0
  185. package/public/js/tree.d.ts +12 -0
  186. package/public/js/tree.js +157 -154
  187. package/public/js/tree.js.map +1 -0
  188. package/public/js/workflowsView.d.ts +3 -0
  189. package/public/js/workflowsView.js +15 -22
  190. package/public/js/workflowsView.js.map +1 -0
  191. package/public/search.css +495 -0
  192. package/public/styles.css +163 -346
  193. package/public/workbench.css +166 -0
  194. package/server/apiAuth.d.ts +3 -0
  195. package/server/apiAuth.js +18 -20
  196. package/server/apiAuth.js.map +1 -0
  197. package/server/apiDiff.d.ts +2 -0
  198. package/server/apiDiff.js +20 -18
  199. package/server/apiDiff.js.map +1 -0
  200. package/server/apiDocs.d.ts +2 -0
  201. package/server/apiDocs.js +38 -40
  202. package/server/apiDocs.js.map +1 -0
  203. package/server/apiFile.d.ts +1 -0
  204. package/server/apiFile.js +14 -17
  205. package/server/apiFile.js.map +1 -0
  206. package/server/apiGitBlame.d.ts +2 -0
  207. package/server/apiGitBlame.js +50 -51
  208. package/server/apiGitBlame.js.map +1 -0
  209. package/server/apiMcp.d.ts +4 -0
  210. package/server/apiMcp.js +64 -66
  211. package/server/apiMcp.js.map +1 -0
  212. package/server/apiReview.d.ts +2 -0
  213. package/server/apiReview.js +45 -0
  214. package/server/apiReview.js.map +1 -0
  215. package/server/apiScan.d.ts +5 -0
  216. package/server/apiScan.js +90 -71
  217. package/server/apiScan.js.map +1 -0
  218. package/server/apiSearch.d.ts +33 -0
  219. package/server/apiSearch.js +184 -200
  220. package/server/apiSearch.js.map +1 -0
  221. package/server/apiSettings.d.ts +4 -0
  222. package/server/apiSettings.js +84 -85
  223. package/server/apiSettings.js.map +1 -0
  224. package/server/apiTools.d.ts +3 -0
  225. package/server/apiTools.js +55 -56
  226. package/server/apiTools.js.map +1 -0
  227. package/server/auth.d.ts +5 -0
  228. package/server/auth.js +54 -51
  229. package/server/auth.js.map +1 -0
  230. package/server/config.d.ts +42 -0
  231. package/server/config.js +189 -194
  232. package/server/config.js.map +1 -0
  233. package/server/daemon.d.ts +12 -0
  234. package/server/daemon.js +124 -114
  235. package/server/daemon.js.map +1 -0
  236. package/server/fileSourceNode.d.ts +2 -0
  237. package/server/fileSourceNode.js +34 -36
  238. package/server/fileSourceNode.js.map +1 -0
  239. package/server/gitClone.d.ts +9 -0
  240. package/server/gitClone.js +59 -61
  241. package/server/gitClone.js.map +1 -0
  242. package/server/gitDiff.d.ts +36 -0
  243. package/server/gitDiff.js +271 -169
  244. package/server/gitDiff.js.map +1 -0
  245. package/server/gitHistory.d.ts +12 -0
  246. package/server/gitHistory.js +80 -80
  247. package/server/gitHistory.js.map +1 -0
  248. package/server/gitRemote.d.ts +12 -0
  249. package/server/gitRemote.js +37 -38
  250. package/server/gitRemote.js.map +1 -0
  251. package/server/htmlText.d.ts +4 -0
  252. package/server/htmlText.js +16 -23
  253. package/server/htmlText.js.map +1 -0
  254. package/server/http.d.ts +5 -0
  255. package/server/http.js +27 -30
  256. package/server/http.js.map +1 -0
  257. package/server/httpGuards.d.ts +2 -0
  258. package/server/httpGuards.js +47 -43
  259. package/server/httpGuards.js.map +1 -0
  260. package/server/https.d.ts +34 -0
  261. package/server/https.js +121 -111
  262. package/server/https.js.map +1 -0
  263. package/server/index.d.ts +40 -0
  264. package/server/index.js +139 -147
  265. package/server/index.js.map +1 -0
  266. package/server/layout.d.ts +26 -0
  267. package/server/layout.js +59 -64
  268. package/server/layout.js.map +1 -0
  269. package/server/llmProxy.d.ts +3 -0
  270. package/server/llmProxy.js +137 -135
  271. package/server/llmProxy.js.map +1 -0
  272. package/server/logger.d.ts +38 -0
  273. package/server/logger.js +198 -211
  274. package/server/logger.js.map +1 -0
  275. package/server/mcp/analysis.d.ts +29 -0
  276. package/server/mcp/analysis.js +99 -120
  277. package/server/mcp/analysis.js.map +1 -0
  278. package/server/mcp/http.d.ts +9 -0
  279. package/server/mcp/http.js +128 -137
  280. package/server/mcp/http.js.map +1 -0
  281. package/server/mcp/runner.d.ts +68 -0
  282. package/server/mcp/runner.js +208 -218
  283. package/server/mcp/runner.js.map +1 -0
  284. package/server/mcp/server.d.ts +29 -0
  285. package/server/mcp/server.js +166 -179
  286. package/server/mcp/server.js.map +1 -0
  287. package/server/mcp/standalone.d.ts +1 -0
  288. package/server/mcp/standalone.js +8 -10
  289. package/server/mcp/standalone.js.map +1 -0
  290. package/server/mcp/tools.d.ts +2020 -0
  291. package/server/mcp/tools.js +523 -574
  292. package/server/mcp/tools.js.map +1 -0
  293. package/server/paths.d.ts +3 -0
  294. package/server/paths.js +17 -15
  295. package/server/paths.js.map +1 -0
  296. package/server/pidfile.d.ts +9 -0
  297. package/server/pidfile.js +43 -45
  298. package/server/pidfile.js.map +1 -0
  299. package/server/review.d.ts +5 -0
  300. package/server/review.js +35 -0
  301. package/server/review.js.map +1 -0
  302. package/server/router.d.ts +33 -0
  303. package/server/router.js +191 -197
  304. package/server/router.js.map +1 -0
  305. package/server/scanRequest.d.ts +3 -0
  306. package/server/scanRequest.js +36 -0
  307. package/server/scanRequest.js.map +1 -0
  308. package/server/searchIndex.d.ts +17 -0
  309. package/server/searchIndex.js +83 -80
  310. package/server/searchIndex.js.map +1 -0
  311. package/server/sessions.d.ts +14 -0
  312. package/server/sessions.js +62 -70
  313. package/server/sessions.js.map +1 -0
  314. package/server/startup.d.ts +118 -0
  315. package/server/startup.js +143 -148
  316. package/server/startup.js.map +1 -0
  317. package/server/static.d.ts +6 -0
  318. package/server/static.js +28 -31
  319. package/server/static.js.map +1 -0
  320. package/server/tools/install.d.ts +4 -0
  321. package/server/tools/install.js +176 -185
  322. package/server/tools/install.js.map +1 -0
  323. package/server/tools/parse.d.ts +8 -0
  324. package/server/tools/parse.js +112 -114
  325. package/server/tools/parse.js.map +1 -0
  326. package/server/tools/platform.d.ts +9 -0
  327. package/server/tools/platform.js +49 -47
  328. package/server/tools/platform.js.map +1 -0
  329. package/server/tools/registry.d.ts +137 -0
  330. package/server/tools/registry.js +173 -172
  331. package/server/tools/registry.js.map +1 -0
  332. package/server/tools/scan.d.ts +34 -0
  333. package/server/tools/scan.js +89 -98
  334. package/server/tools/scan.js.map +1 -0
  335. package/server/tools.d.ts +34 -0
  336. package/server/tools.js +94 -107
  337. package/server/tools.js.map +1 -0
  338. package/server/tunnel.d.ts +29 -0
  339. package/server/tunnel.js +61 -66
  340. package/server/tunnel.js.map +1 -0
  341. package/shared/analyzer/docs.d.ts +16 -0
  342. package/shared/analyzer/docs.js +99 -93
  343. package/shared/analyzer/docs.js.map +1 -0
  344. package/shared/analyzer/explainLocal.d.ts +4 -0
  345. package/shared/analyzer/explainLocal.js +122 -142
  346. package/shared/analyzer/explainLocal.js.map +1 -0
  347. package/shared/analyzer/github.d.ts +37 -0
  348. package/shared/analyzer/github.js +41 -43
  349. package/shared/analyzer/github.js.map +1 -0
  350. package/shared/analyzer/graph.d.ts +41 -0
  351. package/shared/analyzer/graph.js +393 -400
  352. package/shared/analyzer/graph.js.map +1 -0
  353. package/shared/analyzer/health.d.ts +33 -0
  354. package/shared/analyzer/health.js +197 -193
  355. package/shared/analyzer/health.js.map +1 -0
  356. package/shared/analyzer/history.d.ts +29 -0
  357. package/shared/analyzer/history.js +110 -111
  358. package/shared/analyzer/history.js.map +1 -0
  359. package/shared/analyzer/jsonConfig.d.ts +2 -0
  360. package/shared/analyzer/jsonConfig.js +61 -0
  361. package/shared/analyzer/jsonConfig.js.map +1 -0
  362. package/shared/analyzer/languages/csharp.d.ts +26 -0
  363. package/shared/analyzer/languages/csharp.js +83 -88
  364. package/shared/analyzer/languages/csharp.js.map +1 -0
  365. package/shared/analyzer/languages/generic.d.ts +23 -0
  366. package/shared/analyzer/languages/generic.js +94 -105
  367. package/shared/analyzer/languages/generic.js.map +1 -0
  368. package/shared/analyzer/languages/go.d.ts +24 -0
  369. package/shared/analyzer/languages/go.js +45 -54
  370. package/shared/analyzer/languages/go.js.map +1 -0
  371. package/shared/analyzer/languages/index.d.ts +6 -0
  372. package/shared/analyzer/languages/index.js +19 -20
  373. package/shared/analyzer/languages/index.js.map +1 -0
  374. package/shared/analyzer/languages/java.d.ts +20 -0
  375. package/shared/analyzer/languages/java.js +73 -78
  376. package/shared/analyzer/languages/java.js.map +1 -0
  377. package/shared/analyzer/languages/javascript.d.ts +12 -0
  378. package/shared/analyzer/languages/javascript.js +258 -209
  379. package/shared/analyzer/languages/javascript.js.map +1 -0
  380. package/shared/analyzer/languages/python.d.ts +23 -0
  381. package/shared/analyzer/languages/python.js +92 -100
  382. package/shared/analyzer/languages/python.js.map +1 -0
  383. package/shared/analyzer/languages/rust.d.ts +17 -0
  384. package/shared/analyzer/languages/rust.js +96 -98
  385. package/shared/analyzer/languages/rust.js.map +1 -0
  386. package/shared/analyzer/languages/typescript.d.ts +11 -0
  387. package/shared/analyzer/languages/typescript.js +117 -116
  388. package/shared/analyzer/languages/typescript.js.map +1 -0
  389. package/shared/analyzer/licenses.d.ts +18 -0
  390. package/shared/analyzer/licenses.js +130 -133
  391. package/shared/analyzer/licenses.js.map +1 -0
  392. package/shared/analyzer/metrics.d.ts +20 -0
  393. package/shared/analyzer/metrics.js +112 -104
  394. package/shared/analyzer/metrics.js.map +1 -0
  395. package/shared/analyzer/pathUtil.d.ts +10 -0
  396. package/shared/analyzer/pathUtil.js +29 -35
  397. package/shared/analyzer/pathUtil.js.map +1 -0
  398. package/shared/analyzer/patterns.d.ts +11 -0
  399. package/shared/analyzer/patterns.js +231 -253
  400. package/shared/analyzer/patterns.js.map +1 -0
  401. package/shared/analyzer/scan.d.ts +62 -0
  402. package/shared/analyzer/scan.js +451 -442
  403. package/shared/analyzer/scan.js.map +1 -0
  404. package/shared/analyzer/scanControl.d.ts +11 -0
  405. package/shared/analyzer/scanControl.js +62 -0
  406. package/shared/analyzer/scanControl.js.map +1 -0
  407. package/shared/analyzer/security.d.ts +18 -0
  408. package/shared/analyzer/security.js +159 -159
  409. package/shared/analyzer/security.js.map +1 -0
  410. package/shared/analyzer/services.d.ts +5 -0
  411. package/shared/analyzer/services.js +141 -138
  412. package/shared/analyzer/services.js.map +1 -0
  413. package/shared/analyzer/stack.d.ts +6 -0
  414. package/shared/analyzer/stack.js +134 -141
  415. package/shared/analyzer/stack.js.map +1 -0
  416. package/shared/analyzer/tour.d.ts +2 -0
  417. package/shared/analyzer/tour.js +45 -53
  418. package/shared/analyzer/tour.js.map +1 -0
  419. package/shared/analyzer/util.d.ts +8 -0
  420. package/shared/analyzer/util.js +130 -76
  421. package/shared/analyzer/util.js.map +1 -0
  422. package/shared/analyzer/workflows.d.ts +8 -0
  423. package/shared/analyzer/workflows.js +139 -134
  424. package/shared/analyzer/workflows.js.map +1 -0
  425. package/shared/contracts.d.ts +250 -0
  426. package/shared/contracts.js +2 -0
  427. package/shared/contracts.js.map +1 -0
  428. package/shared/diagram/aiFacts.d.ts +35 -0
  429. package/shared/diagram/aiFacts.js +102 -105
  430. package/shared/diagram/aiFacts.js.map +1 -0
  431. package/shared/diagram/aiMermaid.d.ts +5 -0
  432. package/shared/diagram/aiMermaid.js +46 -45
  433. package/shared/diagram/aiMermaid.js.map +1 -0
  434. package/shared/diagram/atlas.d.ts +16 -0
  435. package/shared/diagram/atlas.js +51 -60
  436. package/shared/diagram/atlas.js.map +1 -0
  437. package/shared/diagram/mermaid.d.ts +43 -0
  438. package/shared/diagram/mermaid.js +348 -370
  439. package/shared/diagram/mermaid.js.map +1 -0
  440. package/shared/review/contracts.d.ts +95 -0
  441. package/shared/review/contracts.js +2 -0
  442. package/shared/review/contracts.js.map +1 -0
  443. package/shared/review/review.d.ts +10 -0
  444. package/shared/review/review.js +184 -0
  445. package/shared/review/review.js.map +1 -0
  446. package/shared/search/query.d.ts +32 -0
  447. package/shared/search/query.js +395 -388
  448. package/shared/search/query.js.map +1 -0
@@ -13,142 +13,137 @@
13
13
  // * What survives a filter? Severity, engine and free text, applied as one
14
14
  // predicate so the counts above and the table below can never disagree
15
15
  // about what is being shown.
16
-
17
16
  export const SEV_ORDER = ['critical', 'high', 'medium', 'low', 'info'];
18
-
19
17
  export function sevRank(severity) {
20
- const at = SEV_ORDER.indexOf(severity);
21
- return at === -1 ? SEV_ORDER.length : at;
18
+ const at = SEV_ORDER.indexOf(severity);
19
+ return at === -1 ? SEV_ORDER.length : at;
22
20
  }
23
-
24
21
  export const BUILTIN_TOOL = 'built-in';
25
-
26
22
  // One flat list of findings, worst first. `security` is the roll-up from
27
23
  // `summarizeSecurity`, which is also what the Security panel draws.
28
24
  export function findingsFromSecurity(security) {
29
- const rows = [];
30
- // The parenthesised default is hoisted rather than inlined: `for (const x of
31
- // (a || []))` reads as a call to a function named `of` to the front end's
32
- // dangling-call lint, and the lint is right to be suspicious of that shape.
33
- const files = (security && security.files) || [];
34
- for (const file of files) {
35
- for (const finding of file.findings || []) {
36
- rows.push({
37
- path: file.path,
38
- name: file.name || String(file.path || '').split('/').pop(),
39
- line: finding.line || 1,
40
- severity: SEV_ORDER.includes(finding.severity) ? finding.severity : 'info',
41
- rule: finding.rule || 'unknown',
42
- category: finding.category || 'other',
43
- message: finding.message || '',
44
- excerpt: finding.excerpt || '',
45
- tool: finding.source === 'external' ? (finding.tool || 'external') : BUILTIN_TOOL,
46
- });
25
+ const rows = [];
26
+ // The parenthesised default is hoisted rather than inlined: `for (const x of
27
+ // (a || []))` reads as a call to a function named `of` to the front end's
28
+ // dangling-call lint, and the lint is right to be suspicious of that shape.
29
+ const files = (security && security.files) || [];
30
+ for (const file of files) {
31
+ for (const finding of file.findings || []) {
32
+ rows.push({
33
+ path: file.path,
34
+ name: file.name || String(file.path || '').split('/').pop(),
35
+ line: finding.line || 1,
36
+ severity: SEV_ORDER.includes(finding.severity) ? finding.severity : 'info',
37
+ rule: finding.rule || 'unknown',
38
+ category: finding.category || 'other',
39
+ message: finding.message || '',
40
+ excerpt: finding.excerpt || '',
41
+ tool: finding.source === 'external' ? (finding.tool || 'external') : BUILTIN_TOOL,
42
+ });
43
+ }
47
44
  }
48
- }
49
- return rows.sort((a, b) => sevRank(a.severity) - sevRank(b.severity)
50
- || a.path.localeCompare(b.path)
51
- || a.line - b.line);
45
+ return rows.sort((a, b) => sevRank(a.severity) - sevRank(b.severity)
46
+ || a.path.localeCompare(b.path)
47
+ || a.line - b.line);
52
48
  }
53
-
54
49
  // Counts for the header and the prompt. `external` vs `builtin` is kept because
55
50
  // "the built-in regex scanner said so" and "Semgrep said so" carry different
56
51
  // weight, and the UI should be able to say which.
57
52
  export function tabulate(rows) {
58
- const bySeverity = {};
59
- const byTool = {};
60
- const byCategory = {};
61
- for (const row of rows) {
62
- bySeverity[row.severity] = (bySeverity[row.severity] || 0) + 1;
63
- byTool[row.tool] = (byTool[row.tool] || 0) + 1;
64
- byCategory[row.category] = (byCategory[row.category] || 0) + 1;
65
- }
66
- const external = rows.filter((r) => r.tool !== BUILTIN_TOOL).length;
67
- return {
68
- total: rows.length,
69
- bySeverity,
70
- byTool,
71
- byCategory,
72
- external,
73
- builtin: rows.length - external,
74
- critical: bySeverity.critical || 0,
75
- high: bySeverity.high || 0,
76
- medium: bySeverity.medium || 0,
77
- low: (bySeverity.low || 0) + (bySeverity.info || 0),
78
- };
53
+ const bySeverity = {};
54
+ const byTool = {};
55
+ const byCategory = {};
56
+ for (const row of rows) {
57
+ bySeverity[row.severity] = (bySeverity[row.severity] || 0) + 1;
58
+ byTool[row.tool] = (byTool[row.tool] || 0) + 1;
59
+ byCategory[row.category] = (byCategory[row.category] || 0) + 1;
60
+ }
61
+ const external = rows.filter((r) => r.tool !== BUILTIN_TOOL).length;
62
+ return {
63
+ total: rows.length,
64
+ bySeverity,
65
+ byTool,
66
+ byCategory,
67
+ external,
68
+ builtin: rows.length - external,
69
+ critical: bySeverity.critical || 0,
70
+ high: bySeverity.high || 0,
71
+ medium: bySeverity.medium || 0,
72
+ low: (bySeverity.low || 0) + (bySeverity.info || 0),
73
+ };
79
74
  }
80
-
81
75
  // The filter is one predicate over three independent axes. `all` on an axis
82
76
  // means "do not filter on this", which is why the default object is usable as-is.
83
77
  export function filterFindings(rows, { severity = 'all', tool = 'all', q = '' } = {}) {
84
- const needle = String(q || '').trim().toLowerCase();
85
- return rows.filter((row) => {
86
- if (severity !== 'all' && row.severity !== severity) return false;
87
- if (tool !== 'all' && row.tool !== tool) return false;
88
- if (!needle) return true;
89
- return row.path.toLowerCase().includes(needle)
90
- || row.message.toLowerCase().includes(needle)
91
- || row.rule.toLowerCase().includes(needle)
92
- || row.category.toLowerCase().includes(needle);
93
- });
78
+ const needle = String(q || '').trim().toLowerCase();
79
+ return rows.filter((row) => {
80
+ if (severity !== 'all' && row.severity !== severity)
81
+ return false;
82
+ if (tool !== 'all' && row.tool !== tool)
83
+ return false;
84
+ if (!needle)
85
+ return true;
86
+ return row.path.toLowerCase().includes(needle)
87
+ || row.message.toLowerCase().includes(needle)
88
+ || row.rule.toLowerCase().includes(needle)
89
+ || row.category.toLowerCase().includes(needle);
90
+ });
94
91
  }
95
-
96
92
  // The engine table: what each tool is, whether it is installed, and what it did
97
93
  // last time it ran. `status` comes from `GET /api/tools`, `report` from the last
98
94
  // `POST /api/tools/run` — they are joined here so the view has one list to draw
99
95
  // instead of two to reconcile.
100
96
  export function engineRows(status, report) {
101
- const passes = (report && report.passes) || [];
102
- return Object.keys(status || {}).map((id) => {
103
- const meta = status[id] || {};
104
- const pass = passes.find((p) => p.id === id) || null;
105
- return {
106
- id,
107
- label: meta.label || id,
108
- kind: meta.kind || 'security',
109
- purpose: meta.purpose || '',
110
- available: !!meta.available,
111
- how: meta.how || null,
112
- reason: meta.reason || null,
113
- // The option schema and its defaults, for the Configure form; `installable`
114
- // is whether the server knows how to install this engine from the GUI.
115
- options: Array.isArray(meta.options) ? meta.options : [],
116
- defaults: meta.defaults || {},
117
- installable: meta.installable !== false,
118
- ran: !!(pass && pass.ok),
119
- failed: !!(pass && !pass.ok && pass.available),
120
- findings: pass && pass.ok ? (pass.findings || []).length : 0,
121
- ms: pass && pass.ok ? pass.ms : null,
122
- failure: pass && !pass.ok && pass.available ? pass.reason : null,
123
- };
124
- });
97
+ const passes = (report && report.passes) || [];
98
+ return Object.keys(status || {}).map((id) => {
99
+ const meta = status[id] || {};
100
+ const pass = passes.find((p) => p.id === id) || null;
101
+ return {
102
+ id,
103
+ label: meta.label || id,
104
+ kind: meta.kind || 'security',
105
+ purpose: meta.purpose || '',
106
+ available: !!meta.available,
107
+ how: meta.how || null,
108
+ reason: meta.reason || null,
109
+ // The option schema and its defaults, for the Configure form; `installable`
110
+ // is whether the server knows how to install this engine from the GUI.
111
+ options: Array.isArray(meta.options) ? meta.options : [],
112
+ defaults: meta.defaults || {},
113
+ installable: meta.installable !== false,
114
+ ran: !!(pass && pass.ok),
115
+ failed: !!(pass && !pass.ok && pass.available),
116
+ findings: pass && pass.ok ? (pass.findings || []).length : 0,
117
+ ms: pass && pass.ok ? pass.ms : null,
118
+ failure: pass && !pass.ok && pass.available ? pass.reason : null,
119
+ };
120
+ });
125
121
  }
126
-
127
122
  // The one-line verdict under the engine list. Written here rather than in the
128
123
  // view because "nothing ran" and "nothing found" must never be confused, and
129
124
  // that distinction is the whole point of the panel.
130
125
  export function engineSummary(report, rows) {
131
- if (!report) {
132
- return { tone: 'idle', text: 'No run yet. The built-in scanner is the whole story until you run an engine.' };
133
- }
134
- const ran = rows.filter((r) => r.ran).length;
135
- const missing = rows.filter((r) => !r.available).length;
136
- const failed = rows.filter((r) => r.failed).length;
137
-
138
- if (!ran) {
139
- return {
140
- tone: 'none',
141
- text: missing === rows.length && rows.length
142
- ? 'No engine is installed on this machine. Install any of the ones below and run again — the built-in scan still stands.'
143
- : 'No engine managed to run. The reasons are listed above.',
144
- };
145
- }
146
-
147
- const findings = (report.findings || []).length;
148
- const parts = [`${ran} of ${rows.length} engines ran in ${report.ms}ms`];
149
- parts.push(findings ? `${findings} finding${findings === 1 ? '' : 's'} came back` : 'none of them found anything');
150
- if (failed) parts.push(`${failed} failed`);
151
- if (missing) parts.push(`${missing} not installed`);
152
- return { tone: findings ? 'found' : 'clean', text: parts.join(' · ') + '.' };
126
+ if (!report) {
127
+ return { tone: 'idle', text: 'No run yet. The built-in scanner is the whole story until you run an engine.' };
128
+ }
129
+ const ran = rows.filter((r) => r.ran).length;
130
+ const missing = rows.filter((r) => !r.available).length;
131
+ const failed = rows.filter((r) => r.failed).length;
132
+ if (!ran) {
133
+ return {
134
+ tone: 'none',
135
+ text: missing === rows.length && rows.length
136
+ ? 'No engine is installed on this machine. Install any of the ones below and run again — the built-in scan still stands.'
137
+ : 'No engine managed to run. The reasons are listed above.',
138
+ };
139
+ }
140
+ const findings = (report.findings || []).length;
141
+ const parts = [`${ran} of ${rows.length} engines ran in ${report.ms}ms`];
142
+ parts.push(findings ? `${findings} finding${findings === 1 ? '' : 's'} came back` : 'none of them found anything');
143
+ if (failed)
144
+ parts.push(`${failed} failed`);
145
+ if (missing)
146
+ parts.push(`${missing} not installed`);
147
+ return { tone: findings ? 'found' : 'clean', text: parts.join(' · ') + '.' };
153
148
  }
154
-
149
+ //# sourceMappingURL=analysisReport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysisReport.js","sourceRoot":"","sources":["../../src/public/js/analysisReport.ts"],"names":[],"mappings":"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","sourcesContent":["// Shaping an analysis report for the Deep Analysis view — pure, DOM-free, and\n// therefore testable in Node.\n//\n// Three questions get answered here, and nowhere else:\n//\n// * What findings do we actually have? The built-in scanner's findings live\n// under `security.files[].findings`; the external engines' findings are\n// merged into the same place, tagged `source: 'external'`. Flattening them\n// into rows is the only place that difference is spelled out, so every view\n// downstream can stop caring which engine answered.\n// * What is the shape of the report? Counts by severity, by tool and by\n// category are what the header chips and the AI prompt both run on.\n// * What survives a filter? Severity, engine and free text, applied as one\n// predicate so the counts above and the table below can never disagree\n// about what is being shown.\n\nexport const SEV_ORDER = ['critical', 'high', 'medium', 'low', 'info'];\n\nexport function sevRank(severity) {\n const at = SEV_ORDER.indexOf(severity);\n return at === -1 ? SEV_ORDER.length : at;\n}\n\nexport const BUILTIN_TOOL = 'built-in';\n\n// One flat list of findings, worst first. `security` is the roll-up from\n// `summarizeSecurity`, which is also what the Security panel draws.\nexport function findingsFromSecurity(security) {\n const rows = [];\n // The parenthesised default is hoisted rather than inlined: `for (const x of\n // (a || []))` reads as a call to a function named `of` to the front end's\n // dangling-call lint, and the lint is right to be suspicious of that shape.\n const files = (security && security.files) || [];\n for (const file of files) {\n for (const finding of file.findings || []) {\n rows.push({\n path: file.path,\n name: file.name || String(file.path || '').split('/').pop(),\n line: finding.line || 1,\n severity: SEV_ORDER.includes(finding.severity) ? finding.severity : 'info',\n rule: finding.rule || 'unknown',\n category: finding.category || 'other',\n message: finding.message || '',\n excerpt: finding.excerpt || '',\n tool: finding.source === 'external' ? (finding.tool || 'external') : BUILTIN_TOOL,\n });\n }\n }\n return rows.sort((a, b) => sevRank(a.severity) - sevRank(b.severity)\n || a.path.localeCompare(b.path)\n || a.line - b.line);\n}\n\n// Counts for the header and the prompt. `external` vs `builtin` is kept because\n// \"the built-in regex scanner said so\" and \"Semgrep said so\" carry different\n// weight, and the UI should be able to say which.\nexport function tabulate(rows) {\n const bySeverity: Record<string, any> = {};\n const byTool: Record<string, any> = {};\n const byCategory: Record<string, any> = {};\n for (const row of rows) {\n bySeverity[row.severity] = (bySeverity[row.severity] || 0) + 1;\n byTool[row.tool] = (byTool[row.tool] || 0) + 1;\n byCategory[row.category] = (byCategory[row.category] || 0) + 1;\n }\n const external = rows.filter((r) => r.tool !== BUILTIN_TOOL).length;\n return {\n total: rows.length,\n bySeverity,\n byTool,\n byCategory,\n external,\n builtin: rows.length - external,\n critical: bySeverity.critical || 0,\n high: bySeverity.high || 0,\n medium: bySeverity.medium || 0,\n low: (bySeverity.low || 0) + (bySeverity.info || 0),\n };\n}\n\n// The filter is one predicate over three independent axes. `all` on an axis\n// means \"do not filter on this\", which is why the default object is usable as-is.\nexport function filterFindings(rows, { severity = 'all', tool = 'all', q = '' }: Record<string, any> = {}) {\n const needle = String(q || '').trim().toLowerCase();\n return rows.filter((row) => {\n if (severity !== 'all' && row.severity !== severity) return false;\n if (tool !== 'all' && row.tool !== tool) return false;\n if (!needle) return true;\n return row.path.toLowerCase().includes(needle)\n || row.message.toLowerCase().includes(needle)\n || row.rule.toLowerCase().includes(needle)\n || row.category.toLowerCase().includes(needle);\n });\n}\n\n// The engine table: what each tool is, whether it is installed, and what it did\n// last time it ran. `status` comes from `GET /api/tools`, `report` from the last\n// `POST /api/tools/run` — they are joined here so the view has one list to draw\n// instead of two to reconcile.\nexport function engineRows(status, report) {\n const passes = (report && report.passes) || [];\n return Object.keys(status || {}).map((id) => {\n const meta = status[id] || {};\n const pass = passes.find((p) => p.id === id) || null;\n return {\n id,\n label: meta.label || id,\n kind: meta.kind || 'security',\n purpose: meta.purpose || '',\n available: !!meta.available,\n how: meta.how || null,\n reason: meta.reason || null,\n // The option schema and its defaults, for the Configure form; `installable`\n // is whether the server knows how to install this engine from the GUI.\n options: Array.isArray(meta.options) ? meta.options : [],\n defaults: meta.defaults || {},\n installable: meta.installable !== false,\n ran: !!(pass && pass.ok),\n failed: !!(pass && !pass.ok && pass.available),\n findings: pass && pass.ok ? (pass.findings || []).length : 0,\n ms: pass && pass.ok ? pass.ms : null,\n failure: pass && !pass.ok && pass.available ? pass.reason : null,\n };\n });\n}\n\n// The one-line verdict under the engine list. Written here rather than in the\n// view because \"nothing ran\" and \"nothing found\" must never be confused, and\n// that distinction is the whole point of the panel.\nexport function engineSummary(report, rows) {\n if (!report) {\n return { tone: 'idle', text: 'No run yet. The built-in scanner is the whole story until you run an engine.' };\n }\n const ran = rows.filter((r) => r.ran).length;\n const missing = rows.filter((r) => !r.available).length;\n const failed = rows.filter((r) => r.failed).length;\n\n if (!ran) {\n return {\n tone: 'none',\n text: missing === rows.length && rows.length\n ? 'No engine is installed on this machine. Install any of the ones below and run again — the built-in scan still stands.'\n : 'No engine managed to run. The reasons are listed above.',\n };\n }\n\n const findings = (report.findings || []).length;\n const parts = [`${ran} of ${rows.length} engines ran in ${report.ms}ms`];\n parts.push(findings ? `${findings} finding${findings === 1 ? '' : 's'} came back` : 'none of them found anything');\n if (failed) parts.push(`${failed} failed`);\n if (missing) parts.push(`${missing} not installed`);\n return { tone: findings ? 'found' : 'clean', text: parts.join(' · ') + '.' };\n}\n\n"]}
@@ -0,0 +1,26 @@
1
+ import type { ScanRequest } from '../../shared/contracts.js';
2
+ export declare function scanOnServer(payload: ScanRequest, options?: {
3
+ signal?: AbortSignal;
4
+ }): Promise<any>;
5
+ export declare function cleanupClone(cloneId: any): Promise<void>;
6
+ export declare function fetchFileText(scanId: any, path: any): Promise<string>;
7
+ export declare function fetchToolsStatus(): Promise<any>;
8
+ export declare function runAnalysisTools(scanId: any, options?: Record<string, any>): Promise<any>;
9
+ export declare function streamToolInstall(tool: any, onEvent: any): Promise<any>;
10
+ export declare function fetchMcpStatus(): Promise<any>;
11
+ export declare function startMcpServer(): Promise<any>;
12
+ export declare function stopMcpServer(): Promise<any>;
13
+ export declare function fetchMcpCommand(): Promise<any>;
14
+ export declare function streamExplain({ baseUrl, apiKey, model, messages, maxTokens, providerOptions, signal }: {
15
+ apiKey: any;
16
+ baseUrl: any;
17
+ maxTokens?: number;
18
+ messages: any;
19
+ model: any;
20
+ providerOptions?: {};
21
+ signal?: AbortSignal;
22
+ }): AsyncGenerator<any, void, unknown>;
23
+ export declare function fetchServerSettings(): Promise<any>;
24
+ export declare function updateServerSettings(patch: any): Promise<any>;
25
+ export declare function rotateServerAccessKey(): Promise<any>;
26
+ export declare function logoutRemoteSession(): Promise<any>;