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
@@ -1,26 +1,22 @@
1
1
  // Software Bill of Materials (SBOM) & License Compliance View.
2
2
  // Renders dependency inventory, license classification, and copyleft compliance audit.
3
-
4
3
  import { escapeHtml } from './html.js';
5
-
6
4
  export function renderSbom(container, { scan }) {
7
- if (!container) return;
8
-
9
- const report = scan?.licenseReport || {
10
- projectLicense: scan?.license || { id: 'UNKNOWN', name: 'Unknown', type: 'unknown' },
11
- sbom: scan?.sbom || [],
12
- counts: { permissive: 0, copyleft: 0, weakCopyleft: 0, unknown: 0, total: 0 },
13
- complianceStatus: 'clean',
14
- };
15
-
16
- const sbom = report.sbom || [];
17
- const counts = report.counts || { permissive: 0, copyleft: 0, weakCopyleft: 0, unknown: 0, total: sbom.length };
18
- const projectLicense = report.projectLicense || { id: 'UNKNOWN', name: 'Unknown' };
19
-
20
- // The filter bar is pointless when there is nothing to filter.
21
- // Built as a separate template — nesting backticks inline breaks the
22
- // dangling-call lint (nested template literals defeat its string blanking).
23
- const filterBar = sbom.length ? `
5
+ if (!container)
6
+ return;
7
+ const report = scan?.licenseReport || {
8
+ projectLicense: scan?.license || { id: 'UNKNOWN', name: 'Unknown', type: 'unknown' },
9
+ sbom: scan?.sbom || [],
10
+ counts: { permissive: 0, copyleft: 0, weakCopyleft: 0, unknown: 0, total: 0 },
11
+ complianceStatus: 'clean',
12
+ };
13
+ const sbom = report.sbom || [];
14
+ const counts = report.counts || { permissive: 0, copyleft: 0, weakCopyleft: 0, unknown: 0, total: sbom.length };
15
+ const projectLicense = report.projectLicense || { id: 'UNKNOWN', name: 'Unknown' };
16
+ // The filter bar is pointless when there is nothing to filter.
17
+ // Built as a separate template — nesting backticks inline breaks the
18
+ // dangling-call lint (nested template literals defeat its string blanking).
19
+ const filterBar = sbom.length ? `
24
20
  <div class="sbom-filter-bar">
25
21
  <input type="text" class="text-input sbom-search-input" id="sbomSearchInput" placeholder="Filter dependencies or licenses…">
26
22
  <div class="sbom-filter-chips">
@@ -30,8 +26,7 @@ export function renderSbom(container, { scan }) {
30
26
  <button class="btn btn-ghost btn-sm" data-filter="copyleft">Copyleft (${counts.copyleft})</button>
31
27
  </div>
32
28
  </div>` : '';
33
-
34
- container.innerHTML = `
29
+ container.innerHTML = `
35
30
  <div class="sbom-layout">
36
31
  <!-- License Header & Summary -->
37
32
  <header class="sbom-header">
@@ -81,55 +76,51 @@ export function renderSbom(container, { scan }) {
81
76
  </div>
82
77
  </div>
83
78
  `;
84
-
85
- // Wire search & filtering
86
- const searchInput = container.querySelector('#sbomSearchInput');
87
- const tableBody = container.querySelector('#sbomTableBody');
88
- const filterBtns = container.querySelectorAll('.sbom-filter-chips button');
89
-
90
- let activeFilter = 'all';
91
-
92
- function applyFilter() {
93
- const q = (searchInput?.value || '').toLowerCase().trim();
94
- const filtered = sbom.filter((item) => {
95
- if (activeFilter === 'prod' && item.isDev) return false;
96
- if (activeFilter === 'dev' && !item.isDev) return false;
97
- if (activeFilter === 'copyleft' && item.license?.type !== 'copyleft') return false;
98
-
99
- if (!q) return true;
100
- return item.name.toLowerCase().includes(q)
101
- || item.ecosystem.toLowerCase().includes(q)
102
- || String(item.license?.id || '').toLowerCase().includes(q);
103
- });
104
-
105
- if (tableBody) tableBody.innerHTML = renderSbomRows(filtered, { filtered: true });
106
- }
107
-
108
- searchInput?.addEventListener('input', applyFilter);
109
-
110
- filterBtns.forEach((btn) => {
111
- btn.addEventListener('click', () => {
112
- filterBtns.forEach((b) => b.classList.remove('is-active'));
113
- btn.classList.add('is-active');
114
- activeFilter = btn.dataset.filter;
115
- applyFilter();
79
+ // Wire search & filtering
80
+ const searchInput = container.querySelector('#sbomSearchInput');
81
+ const tableBody = container.querySelector('#sbomTableBody');
82
+ const filterBtns = container.querySelectorAll('.sbom-filter-chips button');
83
+ let activeFilter = 'all';
84
+ function applyFilter() {
85
+ const q = (searchInput?.value || '').toLowerCase().trim();
86
+ const filtered = sbom.filter((item) => {
87
+ if (activeFilter === 'prod' && item.isDev)
88
+ return false;
89
+ if (activeFilter === 'dev' && !item.isDev)
90
+ return false;
91
+ if (activeFilter === 'copyleft' && item.license?.type !== 'copyleft')
92
+ return false;
93
+ if (!q)
94
+ return true;
95
+ return item.name.toLowerCase().includes(q)
96
+ || item.ecosystem.toLowerCase().includes(q)
97
+ || String(item.license?.id || '').toLowerCase().includes(q);
98
+ });
99
+ if (tableBody)
100
+ tableBody.innerHTML = renderSbomRows(filtered, { filtered: true });
101
+ }
102
+ searchInput?.addEventListener('input', applyFilter);
103
+ filterBtns.forEach((btn) => {
104
+ btn.addEventListener('click', () => {
105
+ filterBtns.forEach((b) => b.classList.remove('is-active'));
106
+ btn.classList.add('is-active');
107
+ activeFilter = btn.dataset.filter;
108
+ applyFilter();
109
+ });
116
110
  });
117
- });
118
111
  }
119
-
120
112
  function renderSbomRows(items, { filtered } = {}) {
121
- if (!items.length) {
122
- // Distinguish "nothing matched your filter" from "this project simply
123
- // declares no dependencies" — the latter is a finding, not a dead end.
124
- if (!filtered) {
125
- return '<tr><td colspan="5" class="sbom-no-results">No dependency manifests found — this project declares no npm, pip, Go, or Cargo dependencies.</td></tr>';
113
+ if (!items.length) {
114
+ // Distinguish "nothing matched your filter" from "this project simply
115
+ // declares no dependencies" — the latter is a finding, not a dead end.
116
+ if (!filtered) {
117
+ return '<tr><td colspan="5" class="sbom-no-results">No dependency manifests found — this project declares no npm, pip, Go, or Cargo dependencies.</td></tr>';
118
+ }
119
+ return '<tr><td colspan="5" class="sbom-no-results">No packages match the current filter.</td></tr>';
126
120
  }
127
- return '<tr><td colspan="5" class="sbom-no-results">No packages match the current filter.</td></tr>';
128
- }
129
-
130
- return items.map((item) => {
131
- const lic = item.license || { id: 'Unknown', type: 'unknown' };
132
- return `
121
+ return items.map((item) => {
122
+ const lic = item.license || { id: 'Unknown', type: 'unknown' };
123
+ return `
133
124
  <tr>
134
125
  <td class="sbom-cell-pkg"><b>${escapeHtml(item.name)}</b></td>
135
126
  <td class="sbom-cell-ver"><code>${escapeHtml(item.version)}</code></td>
@@ -138,5 +129,6 @@ function renderSbomRows(items, { filtered } = {}) {
138
129
  <td class="sbom-cell-lic"><span class="sbom-badge is-${lic.type}">${escapeHtml(lic.id)}</span></td>
139
130
  </tr>
140
131
  `;
141
- }).join('');
132
+ }).join('');
142
133
  }
134
+ //# sourceMappingURL=sbomView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sbomView.js","sourceRoot":"","sources":["../../src/public/js/sbomView.ts"],"names":[],"mappings":"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","sourcesContent":["// Software Bill of Materials (SBOM) & License Compliance View.\n// Renders dependency inventory, license classification, and copyleft compliance audit.\n\nimport { escapeHtml } from './html.js';\n\nexport function renderSbom(container, { scan }) {\n if (!container) return;\n\n const report = scan?.licenseReport || {\n projectLicense: scan?.license || { id: 'UNKNOWN', name: 'Unknown', type: 'unknown' },\n sbom: scan?.sbom || [],\n counts: { permissive: 0, copyleft: 0, weakCopyleft: 0, unknown: 0, total: 0 },\n complianceStatus: 'clean',\n };\n\n const sbom = report.sbom || [];\n const counts = report.counts || { permissive: 0, copyleft: 0, weakCopyleft: 0, unknown: 0, total: sbom.length };\n const projectLicense = report.projectLicense || { id: 'UNKNOWN', name: 'Unknown' };\n\n // The filter bar is pointless when there is nothing to filter.\n // Built as a separate template — nesting backticks inline breaks the\n // dangling-call lint (nested template literals defeat its string blanking).\n const filterBar = sbom.length ? `\n <div class=\"sbom-filter-bar\">\n <input type=\"text\" class=\"text-input sbom-search-input\" id=\"sbomSearchInput\" placeholder=\"Filter dependencies or licenses…\">\n <div class=\"sbom-filter-chips\">\n <button class=\"btn btn-ghost btn-sm is-active\" data-filter=\"all\">All (${sbom.length})</button>\n <button class=\"btn btn-ghost btn-sm\" data-filter=\"prod\">Production</button>\n <button class=\"btn btn-ghost btn-sm\" data-filter=\"dev\">Development</button>\n <button class=\"btn btn-ghost btn-sm\" data-filter=\"copyleft\">Copyleft (${counts.copyleft})</button>\n </div>\n </div>` : '';\n\n container.innerHTML = `\n <div class=\"sbom-layout\">\n <!-- License Header & Summary -->\n <header class=\"sbom-header\">\n <div class=\"sbom-lic-card\">\n <span class=\"sbom-lic-label\">Project License</span>\n <div class=\"sbom-lic-val\">\n <span class=\"sbom-badge is-${projectLicense.type || 'permissive'}\">${escapeHtml(projectLicense.id)}</span>\n <span class=\"sbom-lic-name\">${escapeHtml(projectLicense.name)}</span>\n </div>\n </div>\n\n <div class=\"sbom-stat-cards\">\n <div class=\"sbom-stat-chip\">\n <b>${counts.total}</b> Total Packages\n </div>\n <div class=\"sbom-stat-chip is-permissive\">\n <b>${counts.permissive}</b> Permissive\n </div>\n <div class=\"sbom-stat-chip is-copyleft\">\n <b>${counts.copyleft}</b> Copyleft\n </div>\n <div class=\"sbom-stat-chip is-weak\">\n <b>${counts.weakCopyleft}</b> Weak Copyleft\n </div>\n </div>\n </header>\n\n <!-- Search & Filter Controls (only useful with packages to filter) -->\n ${filterBar}\n\n <!-- Dependencies Inventory Table -->\n <div class=\"sbom-table-wrap\">\n <table class=\"sbom-table\" id=\"sbomTable\">\n <thead>\n <tr>\n <th>Package Name</th>\n <th>Version</th>\n <th>Ecosystem</th>\n <th>Type</th>\n <th>License</th>\n </tr>\n </thead>\n <tbody id=\"sbomTableBody\">\n ${renderSbomRows(sbom)}\n </tbody>\n </table>\n </div>\n </div>\n `;\n\n // Wire search & filtering\n const searchInput = container.querySelector('#sbomSearchInput');\n const tableBody = container.querySelector('#sbomTableBody');\n const filterBtns = container.querySelectorAll('.sbom-filter-chips button');\n\n let activeFilter = 'all';\n\n function applyFilter() {\n const q = (searchInput?.value || '').toLowerCase().trim();\n const filtered = sbom.filter((item) => {\n if (activeFilter === 'prod' && item.isDev) return false;\n if (activeFilter === 'dev' && !item.isDev) return false;\n if (activeFilter === 'copyleft' && item.license?.type !== 'copyleft') return false;\n\n if (!q) return true;\n return item.name.toLowerCase().includes(q)\n || item.ecosystem.toLowerCase().includes(q)\n || String(item.license?.id || '').toLowerCase().includes(q);\n });\n\n if (tableBody) tableBody.innerHTML = renderSbomRows(filtered, { filtered: true });\n }\n\n searchInput?.addEventListener('input', applyFilter);\n\n filterBtns.forEach((btn) => {\n btn.addEventListener('click', () => {\n filterBtns.forEach((b) => b.classList.remove('is-active'));\n btn.classList.add('is-active');\n activeFilter = btn.dataset.filter;\n applyFilter();\n });\n });\n}\n\nfunction renderSbomRows(items, { filtered }: Record<string, any> = {}) {\n if (!items.length) {\n // Distinguish \"nothing matched your filter\" from \"this project simply\n // declares no dependencies\" — the latter is a finding, not a dead end.\n if (!filtered) {\n return '<tr><td colspan=\"5\" class=\"sbom-no-results\">No dependency manifests found — this project declares no npm, pip, Go, or Cargo dependencies.</td></tr>';\n }\n return '<tr><td colspan=\"5\" class=\"sbom-no-results\">No packages match the current filter.</td></tr>';\n }\n\n return items.map((item) => {\n const lic = item.license || { id: 'Unknown', type: 'unknown' };\n return `\n <tr>\n <td class=\"sbom-cell-pkg\"><b>${escapeHtml(item.name)}</b></td>\n <td class=\"sbom-cell-ver\"><code>${escapeHtml(item.version)}</code></td>\n <td class=\"sbom-cell-eco\"><span class=\"eco-tag eco-${item.ecosystem}\">${escapeHtml(item.ecosystem)}</span></td>\n <td class=\"sbom-cell-dev\"><span class=\"dep-type-chip ${item.isDev ? 'is-dev' : 'is-prod'}\">${item.isDev ? 'dev' : 'prod'}</span></td>\n <td class=\"sbom-cell-lic\"><span class=\"sbom-badge is-${lic.type}\">${escapeHtml(lic.id)}</span></td>\n </tr>\n `;\n }).join('');\n}\n"]}
@@ -0,0 +1,16 @@
1
+ export declare function hashString(str: any): string;
2
+ export declare function repoCacheKey(scan: any): string;
3
+ export declare function compareScans(prev: any, curr: any): {
4
+ scoreDiff: number;
5
+ filesDiff: number;
6
+ trend: string;
7
+ summary: string;
8
+ };
9
+ export declare class ScanCache {
10
+ storage: any;
11
+ memory: Map<string, any>;
12
+ constructor(storage?: Storage);
13
+ get(key: any): any;
14
+ set(key: any, val: any): void;
15
+ clear(): void;
16
+ }
@@ -1,76 +1,78 @@
1
1
  // Scan caching & trend analysis. Pure logic so it is unit-tested without a browser.
2
-
3
2
  export function hashString(str) {
4
- let h = 2166136261 >>> 0;
5
- for (let i = 0; i < str.length; i++) {
6
- h ^= str.charCodeAt(i);
7
- h = Math.imul(h, 16777619) >>> 0;
8
- }
9
- return h.toString(16);
3
+ let h = 2166136261 >>> 0;
4
+ for (let i = 0; i < str.length; i++) {
5
+ h ^= str.charCodeAt(i);
6
+ h = Math.imul(h, 16777619) >>> 0;
7
+ }
8
+ return h.toString(16);
10
9
  }
11
-
12
10
  export function repoCacheKey(scan) {
13
- if (!scan) return '';
14
- const id = scan.gitUrl || scan.root || scan.name || '';
15
- const summary = (scan.files || [])
16
- .slice(0, 100)
17
- .map((f) => `${f.path}:${f.size}:${f.loc}`)
18
- .join('|');
19
- return `onboarder.cache.${hashString(id)}.${hashString(summary)}`;
11
+ if (!scan)
12
+ return '';
13
+ const id = scan.gitUrl || scan.root || scan.name || '';
14
+ const summary = (scan.files || [])
15
+ .map((f) => JSON.stringify([f.path, f.size, f.loc, f.imports, f.exports, f.findings]))
16
+ .join('|');
17
+ return `onboarder.cache.${hashString(id)}.${hashString(summary)}`;
20
18
  }
21
-
22
19
  export function compareScans(prev, curr) {
23
- if (!prev || !curr) return null;
24
- const prevScore = prev.health?.score ?? prev.score ?? 100;
25
- const currScore = curr.health?.score ?? curr.score ?? 100;
26
- const scoreDiff = currScore - prevScore;
27
- const prevFiles = prev.scan?.files?.length ?? prev.files?.length ?? 0;
28
- const currFiles = curr.scan?.files?.length ?? curr.files?.length ?? 0;
29
- const filesDiff = currFiles - prevFiles;
30
-
31
- return {
32
- scoreDiff,
33
- filesDiff,
34
- trend: scoreDiff > 0 ? 'improving' : scoreDiff < 0 ? 'degrading' : 'stable',
35
- summary: scoreDiff > 0
36
- ? `Health improved by +${scoreDiff} pts since last scan.`
37
- : scoreDiff < 0
38
- ? `Health decreased by ${scoreDiff} pts since last scan.`
39
- : 'Health score matches previous scan.',
40
- };
20
+ if (!prev || !curr)
21
+ return null;
22
+ const prevScore = prev.health?.score ?? prev.score ?? 100;
23
+ const currScore = curr.health?.score ?? curr.score ?? 100;
24
+ const scoreDiff = currScore - prevScore;
25
+ const prevFiles = prev.scan?.files?.length ?? prev.files?.length ?? 0;
26
+ const currFiles = curr.scan?.files?.length ?? curr.files?.length ?? 0;
27
+ const filesDiff = currFiles - prevFiles;
28
+ return {
29
+ scoreDiff,
30
+ filesDiff,
31
+ trend: scoreDiff > 0 ? 'improving' : scoreDiff < 0 ? 'degrading' : 'stable',
32
+ summary: scoreDiff > 0
33
+ ? `Health improved by +${scoreDiff} pts since last scan.`
34
+ : scoreDiff < 0
35
+ ? `Health decreased by ${scoreDiff} pts since last scan.`
36
+ : 'Health score matches previous scan.',
37
+ };
41
38
  }
42
-
43
39
  export class ScanCache {
44
- constructor(storage = typeof localStorage !== 'undefined' ? localStorage : null) {
45
- this.storage = storage;
46
- this.memory = new Map();
47
- }
48
-
49
- get(key) {
50
- if (this.memory.has(key)) return this.memory.get(key);
51
- if (!this.storage) return null;
52
- try {
53
- const raw = this.storage.getItem(key);
54
- if (!raw) return null;
55
- const parsed = JSON.parse(raw);
56
- this.memory.set(key, parsed);
57
- return parsed;
58
- } catch {
59
- return null;
40
+ storage;
41
+ memory;
42
+ constructor(storage = typeof localStorage !== 'undefined' ? localStorage : null) {
43
+ this.storage = storage;
44
+ this.memory = new Map();
45
+ }
46
+ get(key) {
47
+ if (this.memory.has(key))
48
+ return this.memory.get(key);
49
+ if (!this.storage)
50
+ return null;
51
+ try {
52
+ const raw = this.storage.getItem(key);
53
+ if (!raw)
54
+ return null;
55
+ const parsed = JSON.parse(raw);
56
+ this.memory.set(key, parsed);
57
+ return parsed;
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ set(key, val) {
64
+ this.memory.set(key, val);
65
+ if (!this.storage)
66
+ return;
67
+ try {
68
+ this.storage.setItem(key, JSON.stringify(val));
69
+ }
70
+ catch {
71
+ // Quota exceeded or disabled
72
+ }
60
73
  }
61
- }
62
-
63
- set(key, val) {
64
- this.memory.set(key, val);
65
- if (!this.storage) return;
66
- try {
67
- this.storage.setItem(key, JSON.stringify(val));
68
- } catch {
69
- // Quota exceeded or disabled
74
+ clear() {
75
+ this.memory.clear();
70
76
  }
71
- }
72
-
73
- clear() {
74
- this.memory.clear();
75
- }
76
77
  }
78
+ //# sourceMappingURL=scanCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanCache.js","sourceRoot":"","sources":["../../src/public/js/scanCache.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAEpF,MAAM,UAAU,UAAU,CAAC,GAAG;IAC5B,IAAI,CAAC,GAAG,UAAU,KAAK,CAAC,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAI;IAC/B,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;SAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;SACrF,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,mBAAmB,UAAU,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAI,EAAE,IAAI;IACrC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;IAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;IAC1D,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAExC,OAAO;QACL,SAAS;QACT,SAAS;QACT,KAAK,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;QAC3E,OAAO,EAAE,SAAS,GAAG,CAAC;YACpB,CAAC,CAAC,uBAAuB,SAAS,uBAAuB;YACzD,CAAC,CAAC,SAAS,GAAG,CAAC;gBACb,CAAC,CAAC,uBAAuB,SAAS,uBAAuB;gBACzD,CAAC,CAAC,qCAAqC;KAC5C,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,SAAS;IACpB,OAAO,CAAM;IACb,MAAM,CAAmB;IAEzB,YAAY,OAAO,GAAG,OAAO,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI;QAC7E,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,GAAG,CAAC,GAAG;QACL,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC7B,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAG,EAAE,GAAG;QACV,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF","sourcesContent":["// Scan caching & trend analysis. Pure logic so it is unit-tested without a browser.\n\nexport function hashString(str) {\n let h = 2166136261 >>> 0;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = Math.imul(h, 16777619) >>> 0;\n }\n return h.toString(16);\n}\n\nexport function repoCacheKey(scan) {\n if (!scan) return '';\n const id = scan.gitUrl || scan.root || scan.name || '';\n const summary = (scan.files || [])\n .map((f) => JSON.stringify([f.path, f.size, f.loc, f.imports, f.exports, f.findings]))\n .join('|');\n return `onboarder.cache.${hashString(id)}.${hashString(summary)}`;\n}\n\nexport function compareScans(prev, curr) {\n if (!prev || !curr) return null;\n const prevScore = prev.health?.score ?? prev.score ?? 100;\n const currScore = curr.health?.score ?? curr.score ?? 100;\n const scoreDiff = currScore - prevScore;\n const prevFiles = prev.scan?.files?.length ?? prev.files?.length ?? 0;\n const currFiles = curr.scan?.files?.length ?? curr.files?.length ?? 0;\n const filesDiff = currFiles - prevFiles;\n\n return {\n scoreDiff,\n filesDiff,\n trend: scoreDiff > 0 ? 'improving' : scoreDiff < 0 ? 'degrading' : 'stable',\n summary: scoreDiff > 0\n ? `Health improved by +${scoreDiff} pts since last scan.`\n : scoreDiff < 0\n ? `Health decreased by ${scoreDiff} pts since last scan.`\n : 'Health score matches previous scan.',\n };\n}\n\nexport class ScanCache {\n storage: any;\n memory: Map<string, any>;\n\n constructor(storage = typeof localStorage !== 'undefined' ? localStorage : null) {\n this.storage = storage;\n this.memory = new Map();\n }\n\n get(key) {\n if (this.memory.has(key)) return this.memory.get(key);\n if (!this.storage) return null;\n try {\n const raw = this.storage.getItem(key);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n this.memory.set(key, parsed);\n return parsed;\n } catch {\n return null;\n }\n }\n\n set(key, val) {\n this.memory.set(key, val);\n if (!this.storage) return;\n try {\n this.storage.setItem(key, JSON.stringify(val));\n } catch {\n // Quota exceeded or disabled\n }\n }\n\n clear() {\n this.memory.clear();\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export declare function initSearch(files: any[], options: any): {
2
+ show: (opener?: HTMLElement) => void;
3
+ hide: (restoreFocus?: boolean) => void;
4
+ destroy: () => void;
5
+ updateFiles: (newFiles: any, newScanId: any) => void;
6
+ isShowing: () => boolean;
7
+ };