codebase-onboarder 0.6.0 → 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 (526) hide show
  1. package/README.md +284 -53
  2. package/bin/build-if-source.js +23 -0
  3. package/bin/onboarder.js +0 -0
  4. package/cli/agent/command.d.ts +71 -0
  5. package/cli/agent/command.js +177 -0
  6. package/cli/agent/command.js.map +1 -0
  7. package/cli/agent/config.d.ts +31 -0
  8. package/cli/agent/config.js +98 -0
  9. package/cli/agent/config.js.map +1 -0
  10. package/cli/agent/contracts.d.ts +77 -0
  11. package/cli/agent/contracts.js +2 -0
  12. package/cli/agent/contracts.js.map +1 -0
  13. package/cli/agent/files.d.ts +19 -0
  14. package/cli/agent/files.js +109 -0
  15. package/cli/agent/files.js.map +1 -0
  16. package/cli/agent/gitSource.d.ts +18 -0
  17. package/cli/agent/gitSource.js +69 -0
  18. package/cli/agent/gitSource.js.map +1 -0
  19. package/cli/agent/github.d.ts +21 -0
  20. package/cli/agent/github.js +94 -0
  21. package/cli/agent/github.js.map +1 -0
  22. package/cli/agent/mcp.d.ts +15 -0
  23. package/cli/agent/mcp.js +78 -0
  24. package/cli/agent/mcp.js.map +1 -0
  25. package/cli/agent/process.d.ts +18 -0
  26. package/cli/agent/process.js +118 -0
  27. package/cli/agent/process.js.map +1 -0
  28. package/cli/agent/protocol.d.ts +3 -0
  29. package/cli/agent/protocol.js +26 -0
  30. package/cli/agent/protocol.js.map +1 -0
  31. package/cli/agent/runner.d.ts +34 -0
  32. package/cli/agent/runner.js +152 -0
  33. package/cli/agent/runner.js.map +1 -0
  34. package/cli/agent/stdio.d.ts +1 -0
  35. package/cli/agent/stdio.js +62 -0
  36. package/cli/agent/stdio.js.map +1 -0
  37. package/cli/agent/tools.d.ts +7 -0
  38. package/cli/agent/tools.js +201 -0
  39. package/cli/agent/tools.js.map +1 -0
  40. package/cli/chat/app.d.ts +16 -0
  41. package/cli/chat/app.js +345 -0
  42. package/cli/chat/app.js.map +1 -0
  43. package/cli/chat/commands.d.ts +11 -0
  44. package/cli/chat/commands.js +120 -0
  45. package/cli/chat/commands.js.map +1 -0
  46. package/cli/chat/composer.d.ts +75 -0
  47. package/cli/chat/composer.js +467 -0
  48. package/cli/chat/composer.js.map +1 -0
  49. package/cli/chat/controller.d.ts +60 -0
  50. package/cli/chat/controller.js +393 -0
  51. package/cli/chat/controller.js.map +1 -0
  52. package/cli/chat/logo.d.ts +3 -0
  53. package/cli/chat/logo.js +14 -0
  54. package/cli/chat/logo.js.map +1 -0
  55. package/cli/chat/models.d.ts +18 -0
  56. package/cli/chat/models.js +88 -0
  57. package/cli/chat/models.js.map +1 -0
  58. package/cli/chat/profile.d.ts +5 -0
  59. package/cli/chat/profile.js +98 -0
  60. package/cli/chat/profile.js.map +1 -0
  61. package/cli/chat/render.d.ts +40 -0
  62. package/cli/chat/render.js +259 -0
  63. package/cli/chat/render.js.map +1 -0
  64. package/cli/chat/screen.d.ts +26 -0
  65. package/cli/chat/screen.js +117 -0
  66. package/cli/chat/screen.js.map +1 -0
  67. package/cli/chat/source.d.ts +29 -0
  68. package/cli/chat/source.js +116 -0
  69. package/cli/chat/source.js.map +1 -0
  70. package/cli/chat/store.d.ts +43 -0
  71. package/cli/chat/store.js +94 -0
  72. package/cli/chat/store.js.map +1 -0
  73. package/cli/chat/text.d.ts +4 -0
  74. package/cli/chat/text.js +27 -0
  75. package/cli/chat/text.js.map +1 -0
  76. package/cli/commands.d.ts +26 -0
  77. package/cli/commands.js +836 -811
  78. package/cli/commands.js.map +1 -0
  79. package/cli/explorer/advanced.d.ts +14 -0
  80. package/cli/explorer/advanced.js +321 -329
  81. package/cli/explorer/advanced.js.map +1 -0
  82. package/cli/explorer/app.d.ts +2 -0
  83. package/cli/explorer/app.js +404 -314
  84. package/cli/explorer/app.js.map +1 -0
  85. package/cli/explorer/assistant.d.ts +9 -0
  86. package/cli/explorer/assistant.js +58 -0
  87. package/cli/explorer/assistant.js.map +1 -0
  88. package/cli/explorer/commands.d.ts +17 -0
  89. package/cli/explorer/commands.js +373 -302
  90. package/cli/explorer/commands.js.map +1 -0
  91. package/cli/explorer/featureViews.d.ts +124 -0
  92. package/cli/explorer/featureViews.js +179 -0
  93. package/cli/explorer/featureViews.js.map +1 -0
  94. package/cli/explorer/github.d.ts +21 -0
  95. package/cli/explorer/github.js +42 -44
  96. package/cli/explorer/github.js.map +1 -0
  97. package/cli/explorer/graphs.d.ts +7 -0
  98. package/cli/explorer/graphs.js +90 -95
  99. package/cli/explorer/graphs.js.map +1 -0
  100. package/cli/explorer/picker.d.ts +22 -0
  101. package/cli/explorer/picker.js +150 -0
  102. package/cli/explorer/picker.js.map +1 -0
  103. package/cli/explorer/report.d.ts +85 -0
  104. package/cli/explorer/report.js +60 -0
  105. package/cli/explorer/report.js.map +1 -0
  106. package/cli/explorer/session.d.ts +449 -0
  107. package/cli/explorer/session.js +143 -144
  108. package/cli/explorer/session.js.map +1 -0
  109. package/cli/explorer/views.d.ts +19 -0
  110. package/cli/explorer/views.js +465 -482
  111. package/cli/explorer/views.js.map +1 -0
  112. package/cli/explorer/wrap.d.ts +1 -0
  113. package/cli/explorer/wrap.js +28 -44
  114. package/cli/explorer/wrap.js.map +1 -0
  115. package/cli/main.d.ts +1 -0
  116. package/cli/main.js +251 -164
  117. package/cli/main.js.map +1 -0
  118. package/cli/prompt.d.ts +5 -0
  119. package/cli/prompt.js +84 -80
  120. package/cli/prompt.js.map +1 -0
  121. package/cli/scanOptions.d.ts +2 -0
  122. package/cli/scanOptions.js +11 -0
  123. package/cli/scanOptions.js.map +1 -0
  124. package/cli/ui.d.ts +33 -0
  125. package/cli/ui.js +35 -44
  126. package/cli/ui.js.map +1 -0
  127. package/cli/wizard.d.ts +187 -0
  128. package/cli/wizard.js +304 -284
  129. package/cli/wizard.js.map +1 -0
  130. package/docs/HERMES_RESEARCH.md +51 -0
  131. package/package.json +16 -4
  132. package/public/app.d.ts +1 -0
  133. package/public/app.js +1133 -1011
  134. package/public/app.js.map +1 -0
  135. package/public/assets/onboarder-mark.svg +11 -0
  136. package/public/browser.d.ts +71 -0
  137. package/public/browser.js +2 -0
  138. package/public/browser.js.map +1 -0
  139. package/public/index.html +54 -20
  140. package/public/js/about.d.ts +6 -0
  141. package/public/js/about.js +152 -172
  142. package/public/js/about.js.map +1 -0
  143. package/public/js/aiDraft.d.ts +4 -0
  144. package/public/js/aiDraft.js +166 -125
  145. package/public/js/aiDraft.js.map +1 -0
  146. package/public/js/analysisPanel.d.ts +7 -0
  147. package/public/js/analysisPanel.js +166 -166
  148. package/public/js/analysisPanel.js.map +1 -0
  149. package/public/js/analysisReport.d.ts +38 -0
  150. package/public/js/analysisReport.js +105 -110
  151. package/public/js/analysisReport.js.map +1 -0
  152. package/public/js/api.d.ts +29 -0
  153. package/public/js/api.js +198 -166
  154. package/public/js/api.js.map +1 -0
  155. package/public/js/atlas.d.ts +6 -0
  156. package/public/js/atlas.js +50 -58
  157. package/public/js/atlas.js.map +1 -0
  158. package/public/js/blameView.d.ts +2 -0
  159. package/public/js/blameView.js +36 -37
  160. package/public/js/blameView.js.map +1 -0
  161. package/public/js/codeTab.d.ts +3 -0
  162. package/public/js/codeTab.js +175 -180
  163. package/public/js/codeTab.js.map +1 -0
  164. package/public/js/codeViewer.d.ts +5 -0
  165. package/public/js/codeViewer.js +162 -150
  166. package/public/js/codeViewer.js.map +1 -0
  167. package/public/js/components/FileChip.d.ts +9 -0
  168. package/public/js/components/FileChip.js +45 -49
  169. package/public/js/components/FileChip.js.map +1 -0
  170. package/public/js/components/MetricSparkline.d.ts +7 -0
  171. package/public/js/components/MetricSparkline.js +35 -44
  172. package/public/js/components/MetricSparkline.js.map +1 -0
  173. package/public/js/components/RiskBadge.d.ts +9 -0
  174. package/public/js/components/RiskBadge.js +55 -63
  175. package/public/js/components/RiskBadge.js.map +1 -0
  176. package/public/js/deepAnalysisView.d.ts +99 -0
  177. package/public/js/deepAnalysisView.js +282 -302
  178. package/public/js/deepAnalysisView.js.map +1 -0
  179. package/public/js/diagramPane.d.ts +9 -0
  180. package/public/js/diagramPane.js +138 -135
  181. package/public/js/diagramPane.js.map +1 -0
  182. package/public/js/diffView.d.ts +6 -0
  183. package/public/js/diffView.js +222 -209
  184. package/public/js/diffView.js.map +1 -0
  185. package/public/js/docsView.d.ts +2 -0
  186. package/public/js/docsView.js +441 -442
  187. package/public/js/docsView.js.map +1 -0
  188. package/public/js/dom.d.ts +197 -0
  189. package/public/js/dom.js +5 -0
  190. package/public/js/dom.js.map +1 -0
  191. package/public/js/fileSourceBrowser.d.ts +5 -0
  192. package/public/js/fileSourceBrowser.js +33 -41
  193. package/public/js/fileSourceBrowser.js.map +1 -0
  194. package/public/js/flameGraph.d.ts +5 -0
  195. package/public/js/flameGraph.js +62 -72
  196. package/public/js/flameGraph.js.map +1 -0
  197. package/public/js/forceGraph.d.ts +10 -0
  198. package/public/js/forceGraph.js +581 -556
  199. package/public/js/forceGraph.js.map +1 -0
  200. package/public/js/heatmap.d.ts +4 -0
  201. package/public/js/heatmap.js +142 -164
  202. package/public/js/heatmap.js.map +1 -0
  203. package/public/js/highlight.d.ts +2 -0
  204. package/public/js/highlight.js +116 -107
  205. package/public/js/highlight.js.map +1 -0
  206. package/public/js/html.d.ts +2 -0
  207. package/public/js/html.js +14 -44
  208. package/public/js/html.js.map +1 -0
  209. package/public/js/insightsView.d.ts +5 -0
  210. package/public/js/insightsView.js +93 -111
  211. package/public/js/insightsView.js.map +1 -0
  212. package/public/js/inspector.d.ts +37 -0
  213. package/public/js/inspector.js +416 -445
  214. package/public/js/inspector.js.map +1 -0
  215. package/public/js/llm.d.ts +115 -0
  216. package/public/js/llm.js +246 -278
  217. package/public/js/llm.js.map +1 -0
  218. package/public/js/mapView.d.ts +3 -0
  219. package/public/js/mapView.js +121 -120
  220. package/public/js/mapView.js.map +1 -0
  221. package/public/js/markdown.d.ts +3 -0
  222. package/public/js/markdown.js +84 -91
  223. package/public/js/markdown.js.map +1 -0
  224. package/public/js/mindmap.d.ts +32 -0
  225. package/public/js/mindmap.js +244 -259
  226. package/public/js/mindmap.js.map +1 -0
  227. package/public/js/mobilePanels.d.ts +5 -0
  228. package/public/js/mobilePanels.js +50 -0
  229. package/public/js/mobilePanels.js.map +1 -0
  230. package/public/js/repoFiles.d.ts +12 -0
  231. package/public/js/repoFiles.js +29 -28
  232. package/public/js/repoFiles.js.map +1 -0
  233. package/public/js/reviewView.d.ts +28 -0
  234. package/public/js/reviewView.js +256 -0
  235. package/public/js/reviewView.js.map +1 -0
  236. package/public/js/sbomView.d.ts +3 -0
  237. package/public/js/sbomView.js +59 -67
  238. package/public/js/sbomView.js.map +1 -0
  239. package/public/js/scanCache.d.ts +16 -0
  240. package/public/js/scanCache.js +67 -65
  241. package/public/js/scanCache.js.map +1 -0
  242. package/public/js/search.d.ts +7 -0
  243. package/public/js/search.js +868 -800
  244. package/public/js/search.js.map +1 -0
  245. package/public/js/searchLocal.d.ts +42 -0
  246. package/public/js/searchLocal.js +87 -0
  247. package/public/js/searchLocal.js.map +1 -0
  248. package/public/js/serverSettings.d.ts +5 -0
  249. package/public/js/serverSettings.js +153 -164
  250. package/public/js/serverSettings.js.map +1 -0
  251. package/public/js/state.d.ts +798 -0
  252. package/public/js/state.js +114 -122
  253. package/public/js/state.js.map +1 -0
  254. package/public/js/tour.d.ts +6 -0
  255. package/public/js/tour.js +5 -7
  256. package/public/js/tour.js.map +1 -0
  257. package/public/js/transitions.d.ts +2 -0
  258. package/public/js/transitions.js +9 -10
  259. package/public/js/transitions.js.map +1 -0
  260. package/public/js/tree.d.ts +12 -0
  261. package/public/js/tree.js +157 -154
  262. package/public/js/tree.js.map +1 -0
  263. package/public/js/workflowsView.d.ts +3 -0
  264. package/public/js/workflowsView.js +15 -22
  265. package/public/js/workflowsView.js.map +1 -0
  266. package/public/search.css +495 -0
  267. package/public/styles.css +188 -346
  268. package/public/workbench.css +166 -0
  269. package/server/apiAuth.d.ts +3 -0
  270. package/server/apiAuth.js +18 -20
  271. package/server/apiAuth.js.map +1 -0
  272. package/server/apiDiff.d.ts +2 -0
  273. package/server/apiDiff.js +20 -18
  274. package/server/apiDiff.js.map +1 -0
  275. package/server/apiDocs.d.ts +2 -0
  276. package/server/apiDocs.js +38 -40
  277. package/server/apiDocs.js.map +1 -0
  278. package/server/apiFile.d.ts +1 -0
  279. package/server/apiFile.js +14 -17
  280. package/server/apiFile.js.map +1 -0
  281. package/server/apiGitBlame.d.ts +2 -0
  282. package/server/apiGitBlame.js +50 -51
  283. package/server/apiGitBlame.js.map +1 -0
  284. package/server/apiMcp.d.ts +4 -0
  285. package/server/apiMcp.js +64 -66
  286. package/server/apiMcp.js.map +1 -0
  287. package/server/apiReview.d.ts +2 -0
  288. package/server/apiReview.js +45 -0
  289. package/server/apiReview.js.map +1 -0
  290. package/server/apiScan.d.ts +5 -0
  291. package/server/apiScan.js +90 -71
  292. package/server/apiScan.js.map +1 -0
  293. package/server/apiSearch.d.ts +33 -0
  294. package/server/apiSearch.js +184 -200
  295. package/server/apiSearch.js.map +1 -0
  296. package/server/apiSettings.d.ts +4 -0
  297. package/server/apiSettings.js +84 -85
  298. package/server/apiSettings.js.map +1 -0
  299. package/server/apiTools.d.ts +3 -0
  300. package/server/apiTools.js +55 -56
  301. package/server/apiTools.js.map +1 -0
  302. package/server/auth.d.ts +5 -0
  303. package/server/auth.js +54 -51
  304. package/server/auth.js.map +1 -0
  305. package/server/config.d.ts +42 -0
  306. package/server/config.js +189 -194
  307. package/server/config.js.map +1 -0
  308. package/server/daemon.d.ts +12 -0
  309. package/server/daemon.js +124 -114
  310. package/server/daemon.js.map +1 -0
  311. package/server/fileSourceNode.d.ts +2 -0
  312. package/server/fileSourceNode.js +34 -36
  313. package/server/fileSourceNode.js.map +1 -0
  314. package/server/gitClone.d.ts +9 -0
  315. package/server/gitClone.js +59 -61
  316. package/server/gitClone.js.map +1 -0
  317. package/server/gitDiff.d.ts +36 -0
  318. package/server/gitDiff.js +271 -169
  319. package/server/gitDiff.js.map +1 -0
  320. package/server/gitHistory.d.ts +12 -0
  321. package/server/gitHistory.js +80 -80
  322. package/server/gitHistory.js.map +1 -0
  323. package/server/gitRemote.d.ts +12 -0
  324. package/server/gitRemote.js +37 -38
  325. package/server/gitRemote.js.map +1 -0
  326. package/server/hermesChat.d.ts +13 -0
  327. package/server/hermesChat.js +145 -0
  328. package/server/hermesChat.js.map +1 -0
  329. package/server/htmlText.d.ts +4 -0
  330. package/server/htmlText.js +16 -23
  331. package/server/htmlText.js.map +1 -0
  332. package/server/http.d.ts +6 -0
  333. package/server/http.js +27 -34
  334. package/server/http.js.map +1 -0
  335. package/server/httpGuards.d.ts +2 -0
  336. package/server/httpGuards.js +47 -43
  337. package/server/httpGuards.js.map +1 -0
  338. package/server/https.d.ts +34 -0
  339. package/server/https.js +121 -111
  340. package/server/https.js.map +1 -0
  341. package/server/index.d.ts +40 -0
  342. package/server/index.js +139 -147
  343. package/server/index.js.map +1 -0
  344. package/server/layout.d.ts +26 -0
  345. package/server/layout.js +59 -64
  346. package/server/layout.js.map +1 -0
  347. package/server/llmProxy.d.ts +3 -0
  348. package/server/llmProxy.js +137 -135
  349. package/server/llmProxy.js.map +1 -0
  350. package/server/logger.d.ts +38 -0
  351. package/server/logger.js +198 -211
  352. package/server/logger.js.map +1 -0
  353. package/server/mcp/analysis.d.ts +29 -0
  354. package/server/mcp/analysis.js +99 -120
  355. package/server/mcp/analysis.js.map +1 -0
  356. package/server/mcp/http.d.ts +9 -0
  357. package/server/mcp/http.js +128 -137
  358. package/server/mcp/http.js.map +1 -0
  359. package/server/mcp/runner.d.ts +68 -0
  360. package/server/mcp/runner.js +208 -218
  361. package/server/mcp/runner.js.map +1 -0
  362. package/server/mcp/server.d.ts +29 -0
  363. package/server/mcp/server.js +167 -180
  364. package/server/mcp/server.js.map +1 -0
  365. package/server/mcp/standalone.d.ts +1 -0
  366. package/server/mcp/standalone.js +8 -10
  367. package/server/mcp/standalone.js.map +1 -0
  368. package/server/mcp/tools.d.ts +2020 -0
  369. package/server/mcp/tools.js +523 -574
  370. package/server/mcp/tools.js.map +1 -0
  371. package/server/paths.d.ts +3 -0
  372. package/server/paths.js +17 -15
  373. package/server/paths.js.map +1 -0
  374. package/server/pidfile.d.ts +9 -0
  375. package/server/pidfile.js +43 -45
  376. package/server/pidfile.js.map +1 -0
  377. package/server/review.d.ts +5 -0
  378. package/server/review.js +35 -0
  379. package/server/review.js.map +1 -0
  380. package/server/router.d.ts +33 -0
  381. package/server/router.js +195 -197
  382. package/server/router.js.map +1 -0
  383. package/server/scanRequest.d.ts +3 -0
  384. package/server/scanRequest.js +36 -0
  385. package/server/scanRequest.js.map +1 -0
  386. package/server/searchIndex.d.ts +17 -0
  387. package/server/searchIndex.js +83 -80
  388. package/server/searchIndex.js.map +1 -0
  389. package/server/sessions.d.ts +14 -0
  390. package/server/sessions.js +62 -70
  391. package/server/sessions.js.map +1 -0
  392. package/server/startup.d.ts +118 -0
  393. package/server/startup.js +143 -148
  394. package/server/startup.js.map +1 -0
  395. package/server/static.d.ts +6 -0
  396. package/server/static.js +28 -31
  397. package/server/static.js.map +1 -0
  398. package/server/tools/install.d.ts +4 -0
  399. package/server/tools/install.js +176 -185
  400. package/server/tools/install.js.map +1 -0
  401. package/server/tools/parse.d.ts +8 -0
  402. package/server/tools/parse.js +112 -114
  403. package/server/tools/parse.js.map +1 -0
  404. package/server/tools/platform.d.ts +9 -0
  405. package/server/tools/platform.js +49 -47
  406. package/server/tools/platform.js.map +1 -0
  407. package/server/tools/registry.d.ts +137 -0
  408. package/server/tools/registry.js +173 -172
  409. package/server/tools/registry.js.map +1 -0
  410. package/server/tools/scan.d.ts +34 -0
  411. package/server/tools/scan.js +89 -98
  412. package/server/tools/scan.js.map +1 -0
  413. package/server/tools.d.ts +34 -0
  414. package/server/tools.js +94 -107
  415. package/server/tools.js.map +1 -0
  416. package/server/tunnel.d.ts +29 -0
  417. package/server/tunnel.js +61 -66
  418. package/server/tunnel.js.map +1 -0
  419. package/shared/analyzer/docs.d.ts +16 -0
  420. package/shared/analyzer/docs.js +99 -93
  421. package/shared/analyzer/docs.js.map +1 -0
  422. package/shared/analyzer/explainLocal.d.ts +4 -0
  423. package/shared/analyzer/explainLocal.js +122 -142
  424. package/shared/analyzer/explainLocal.js.map +1 -0
  425. package/shared/analyzer/github.d.ts +37 -0
  426. package/shared/analyzer/github.js +41 -43
  427. package/shared/analyzer/github.js.map +1 -0
  428. package/shared/analyzer/graph.d.ts +41 -0
  429. package/shared/analyzer/graph.js +393 -400
  430. package/shared/analyzer/graph.js.map +1 -0
  431. package/shared/analyzer/health.d.ts +33 -0
  432. package/shared/analyzer/health.js +197 -193
  433. package/shared/analyzer/health.js.map +1 -0
  434. package/shared/analyzer/history.d.ts +29 -0
  435. package/shared/analyzer/history.js +110 -111
  436. package/shared/analyzer/history.js.map +1 -0
  437. package/shared/analyzer/jsonConfig.d.ts +2 -0
  438. package/shared/analyzer/jsonConfig.js +61 -0
  439. package/shared/analyzer/jsonConfig.js.map +1 -0
  440. package/shared/analyzer/languages/csharp.d.ts +26 -0
  441. package/shared/analyzer/languages/csharp.js +83 -88
  442. package/shared/analyzer/languages/csharp.js.map +1 -0
  443. package/shared/analyzer/languages/generic.d.ts +23 -0
  444. package/shared/analyzer/languages/generic.js +94 -105
  445. package/shared/analyzer/languages/generic.js.map +1 -0
  446. package/shared/analyzer/languages/go.d.ts +24 -0
  447. package/shared/analyzer/languages/go.js +45 -54
  448. package/shared/analyzer/languages/go.js.map +1 -0
  449. package/shared/analyzer/languages/index.d.ts +6 -0
  450. package/shared/analyzer/languages/index.js +19 -20
  451. package/shared/analyzer/languages/index.js.map +1 -0
  452. package/shared/analyzer/languages/java.d.ts +20 -0
  453. package/shared/analyzer/languages/java.js +73 -78
  454. package/shared/analyzer/languages/java.js.map +1 -0
  455. package/shared/analyzer/languages/javascript.d.ts +12 -0
  456. package/shared/analyzer/languages/javascript.js +258 -209
  457. package/shared/analyzer/languages/javascript.js.map +1 -0
  458. package/shared/analyzer/languages/python.d.ts +23 -0
  459. package/shared/analyzer/languages/python.js +92 -100
  460. package/shared/analyzer/languages/python.js.map +1 -0
  461. package/shared/analyzer/languages/rust.d.ts +17 -0
  462. package/shared/analyzer/languages/rust.js +96 -98
  463. package/shared/analyzer/languages/rust.js.map +1 -0
  464. package/shared/analyzer/languages/typescript.d.ts +11 -0
  465. package/shared/analyzer/languages/typescript.js +117 -116
  466. package/shared/analyzer/languages/typescript.js.map +1 -0
  467. package/shared/analyzer/licenses.d.ts +18 -0
  468. package/shared/analyzer/licenses.js +130 -133
  469. package/shared/analyzer/licenses.js.map +1 -0
  470. package/shared/analyzer/metrics.d.ts +20 -0
  471. package/shared/analyzer/metrics.js +112 -104
  472. package/shared/analyzer/metrics.js.map +1 -0
  473. package/shared/analyzer/pathUtil.d.ts +10 -0
  474. package/shared/analyzer/pathUtil.js +29 -35
  475. package/shared/analyzer/pathUtil.js.map +1 -0
  476. package/shared/analyzer/patterns.d.ts +11 -0
  477. package/shared/analyzer/patterns.js +231 -253
  478. package/shared/analyzer/patterns.js.map +1 -0
  479. package/shared/analyzer/scan.d.ts +62 -0
  480. package/shared/analyzer/scan.js +451 -442
  481. package/shared/analyzer/scan.js.map +1 -0
  482. package/shared/analyzer/scanControl.d.ts +11 -0
  483. package/shared/analyzer/scanControl.js +62 -0
  484. package/shared/analyzer/scanControl.js.map +1 -0
  485. package/shared/analyzer/security.d.ts +18 -0
  486. package/shared/analyzer/security.js +159 -159
  487. package/shared/analyzer/security.js.map +1 -0
  488. package/shared/analyzer/services.d.ts +5 -0
  489. package/shared/analyzer/services.js +141 -138
  490. package/shared/analyzer/services.js.map +1 -0
  491. package/shared/analyzer/stack.d.ts +6 -0
  492. package/shared/analyzer/stack.js +134 -141
  493. package/shared/analyzer/stack.js.map +1 -0
  494. package/shared/analyzer/tour.d.ts +2 -0
  495. package/shared/analyzer/tour.js +45 -53
  496. package/shared/analyzer/tour.js.map +1 -0
  497. package/shared/analyzer/util.d.ts +8 -0
  498. package/shared/analyzer/util.js +130 -76
  499. package/shared/analyzer/util.js.map +1 -0
  500. package/shared/analyzer/workflows.d.ts +8 -0
  501. package/shared/analyzer/workflows.js +139 -134
  502. package/shared/analyzer/workflows.js.map +1 -0
  503. package/shared/contracts.d.ts +250 -0
  504. package/shared/contracts.js +2 -0
  505. package/shared/contracts.js.map +1 -0
  506. package/shared/diagram/aiFacts.d.ts +35 -0
  507. package/shared/diagram/aiFacts.js +102 -105
  508. package/shared/diagram/aiFacts.js.map +1 -0
  509. package/shared/diagram/aiMermaid.d.ts +5 -0
  510. package/shared/diagram/aiMermaid.js +50 -46
  511. package/shared/diagram/aiMermaid.js.map +1 -0
  512. package/shared/diagram/atlas.d.ts +16 -0
  513. package/shared/diagram/atlas.js +51 -60
  514. package/shared/diagram/atlas.js.map +1 -0
  515. package/shared/diagram/mermaid.d.ts +43 -0
  516. package/shared/diagram/mermaid.js +348 -370
  517. package/shared/diagram/mermaid.js.map +1 -0
  518. package/shared/review/contracts.d.ts +95 -0
  519. package/shared/review/contracts.js +2 -0
  520. package/shared/review/contracts.js.map +1 -0
  521. package/shared/review/review.d.ts +10 -0
  522. package/shared/review/review.js +184 -0
  523. package/shared/review/review.js.map +1 -0
  524. package/shared/search/query.d.ts +32 -0
  525. package/shared/search/query.js +395 -388
  526. package/shared/search/query.js.map +1 -0
@@ -4,38 +4,34 @@
4
4
  // The rendering needs the DOM, but the parts worth checking — the coverage
5
5
  // prose, the GitHub URL parsing, date formatting — are pure and exported for
6
6
  // that reason. Nothing here runs at import time.
7
-
8
7
  import { escapeHtml } from './html.js';
9
8
  import { state } from './state.js';
10
9
  import { streamExplain } from './api.js';
11
10
  import { mdLite } from './markdown.js';
12
11
  import * as llm from './llm.js';
13
-
14
12
  let host = null;
15
- let hooks = { onToast: () => {}, onOpenSettings: () => {}, repoOverview: () => '' };
16
-
13
+ let hooks = { onToast: (..._args) => { }, onOpenSettings: (..._args) => { }, repoOverview: () => '' };
17
14
  export function initAbout(options) {
18
- host = options.host;
19
- hooks = { ...hooks, ...options };
20
- host.addEventListener('click', (event) => {
21
- const b = event.target.closest('[data-stack-sum]');
22
- if (b) summarizeStackItem(b.dataset.stackSum);
23
- });
15
+ host = options.host;
16
+ hooks = { ...hooks, ...options };
17
+ host.addEventListener('click', (event) => {
18
+ const b = event.target.closest('[data-stack-sum]');
19
+ if (b)
20
+ summarizeStackItem(b.dataset.stackSum);
21
+ });
24
22
  }
25
-
26
23
  export function renderAbout() {
27
- if (state.about.rendered) return;
28
- state.about.rendered = true;
29
- const { scan, facts } = state;
30
- const gh = scan.gitUrl ? githubRepoPath(scan.gitUrl) : null;
31
-
32
- const sourceLine = scan.gitUrl
33
- ? `Cloned from ${scan.gitUrl}`
34
- : state.browserSource
35
- ? 'Picked in the browser — files never left this tab.'
36
- : `Read in place from ${scan.root}`;
37
-
38
- host.innerHTML = `
24
+ if (state.about.rendered)
25
+ return;
26
+ state.about.rendered = true;
27
+ const { scan, facts } = state;
28
+ const gh = scan.gitUrl ? githubRepoPath(scan.gitUrl) : null;
29
+ const sourceLine = scan.gitUrl
30
+ ? `Cloned from ${scan.gitUrl}`
31
+ : state.browserSource
32
+ ? 'Picked in the browser — files never left this tab.'
33
+ : `Read in place from ${scan.root}`;
34
+ host.innerHTML = `
39
35
  <div class="doc-page">
40
36
  <h1 class="doc-title">${escapeHtml(scan.name)}</h1>
41
37
  <p class="doc-sub">${escapeHtml(scan.tempId ? scan.tempId + ' — a temp clone' : scan.root)}</p>
@@ -56,11 +52,9 @@ export function renderAbout() {
56
52
  ${renderHistorySection(state.history)}
57
53
 
58
54
  <h2 class="doc-section-h">From the remote</h2>
59
- <div id="aboutRemote">${
60
- gh
61
- ? '<span class="doc-readme-none">Asking GitHub…</span>'
62
- : `<span class="doc-readme-none">${scan.gitUrl ? 'Not a GitHub URL — no remote facts to fetch.' : 'A local repo — no remote to ask about.'}</span>`
63
- }</div>
55
+ <div id="aboutRemote">${gh
56
+ ? '<span class="doc-readme-none">Asking GitHub…</span>'
57
+ : `<span class="doc-readme-none">${scan.gitUrl ? 'Not a GitHub URL — no remote facts to fetch.' : 'A local repo — no remote to ask about.'}</span>`}</div>
64
58
 
65
59
  <h2 class="doc-section-h">Lineage</h2>
66
60
  <ul class="about-lineage">
@@ -69,17 +63,18 @@ export function renderAbout() {
69
63
  ${scan.tempId ? `<li>The clone lives in your temp folder as <code>${escapeHtml(scan.tempId)}</code> until you hit New repo.</li>` : ''}
70
64
  </ul>
71
65
  </div>`;
72
-
73
- if (gh) loadRemoteInfo(gh);
74
- if (state.stack) renderStackZone(host.querySelector('#stackZone'));
66
+ if (gh)
67
+ loadRemoteInfo(gh);
68
+ if (state.stack)
69
+ renderStackZone(host.querySelector('#stackZone'));
75
70
  }
76
-
77
71
  function renderHistorySection(h) {
78
- if (!h) return '';
79
- if (!h.available) {
80
- return `<h2 class="doc-section-h">History</h2><p class="doc-readme-none">${escapeHtml(h.reason || 'No history available.')}</p>`;
81
- }
82
- return `
72
+ if (!h)
73
+ return '';
74
+ if (!h.available) {
75
+ return `<h2 class="doc-section-h">History</h2><p class="doc-readme-none">${escapeHtml(h.reason || 'No history available.')}</p>`;
76
+ }
77
+ return `
83
78
  <h2 class="doc-section-h">History & Activity</h2>
84
79
  <div class="about-numbers">
85
80
  ${aboutNum(h.commitCount, h.truncated ? 'commits analyzed' : 'commits')}
@@ -93,20 +88,16 @@ function renderHistorySection(h) {
93
88
  </ul>
94
89
  `;
95
90
  }
96
-
97
91
  // ---- Stack: detected languages, package managers, and frameworks ----------
98
-
99
92
  function renderStackZone(zone) {
100
- const st = state.stack;
101
- if (!st) return (zone.innerHTML = '');
102
-
103
- const langs = Object.entries(st.languages)
104
- .map(([name, count]) => `<span class="stack-lang"><i>${count}</i> ${escapeHtml(name)}</span>`)
105
- .join('');
106
-
107
- const rows = st.items
108
- .map(
109
- (it) => `
93
+ const st = state.stack;
94
+ if (!st)
95
+ return (zone.innerHTML = '');
96
+ const langs = Object.entries(st.languages)
97
+ .map(([name, count]) => `<span class="stack-lang"><i>${count}</i> ${escapeHtml(name)}</span>`)
98
+ .join('');
99
+ const rows = st.items
100
+ .map((it) => `
110
101
  <div class="stack-item">
111
102
  <span class="stack-name">${escapeHtml(it.name)}</span>
112
103
  <span class="stack-cat">${escapeHtml(it.category)}</span>
@@ -116,11 +107,9 @@ function renderStackZone(zone) {
116
107
  <a class="stack-doc" href="${escapeHtml(it.docs)}" target="_blank" rel="noopener">docs ↗</a>
117
108
  <button class="stack-sum" data-stack-sum="${escapeHtml(it.name)}" title="Summarize from official docs">summarize</button>
118
109
  <div class="stack-body" data-stack-body></div>
119
- </div>`
120
- )
121
- .join('');
122
-
123
- zone.innerHTML = `
110
+ </div>`)
111
+ .join('');
112
+ zone.innerHTML = `
124
113
  <div class="stack-block">
125
114
  <div class="stack-langs">${langs || '<span class="doc-readme-none">No languages parsed.</span>'}</div>
126
115
  ${st.pm.length ? `<p class="stack-pm">package managers: ${escapeHtml(st.pm.join(', '))}</p>` : ''}
@@ -130,115 +119,105 @@ function renderStackZone(zone) {
130
119
  : '<p class="doc-readme-none">No declared dependencies — nothing to analyze.</p>'}
131
120
  </div>`;
132
121
  }
133
-
134
122
  // Fetch a library's official docs (server-side, SSRF-safe) and summarize it
135
123
  // with the AI, streamed into the row.
136
124
  async function summarizeStackItem(name) {
137
- const item = state.stack.items.find((i) => i.name === name);
138
- if (!item) return hooks.onToast('Unknown dependency.');
139
- if (!llm.isConfigured()) {
140
- hooks.onOpenSettings();
141
- return hooks.onToast('Add an endpoint and model first.');
142
- }
143
- const row = host.querySelector(`[data-stack-sum="${CSS.escape(name)}"]`)?.closest('.stack-item');
144
- const body = row?.querySelector('[data-stack-body]');
145
- if (!body) return;
146
-
147
- row.querySelector('.stack-sum').textContent = 'looking…';
148
- row.querySelector('.stack-sum').disabled = true;
149
-
150
- let docsText = '';
151
- let docsTitle = '';
152
- try {
153
- const r = await fetch('/api/doc', {
154
- method: 'POST',
155
- headers: { 'content-type': 'application/json' },
156
- body: JSON.stringify({ url: item.docs }),
125
+ const item = state.stack.items.find((i) => i.name === name);
126
+ if (!item)
127
+ return hooks.onToast('Unknown dependency.');
128
+ if (!llm.isConfigured()) {
129
+ hooks.onOpenSettings();
130
+ return hooks.onToast('Choose Hermes or an endpoint in AI connection first.');
131
+ }
132
+ const row = host.querySelector(`[data-stack-sum="${CSS.escape(name)}"]`)?.closest('.stack-item');
133
+ const body = row?.querySelector('[data-stack-body]');
134
+ if (!body)
135
+ return;
136
+ row.querySelector('.stack-sum').textContent = 'looking…';
137
+ row.querySelector('.stack-sum').disabled = true;
138
+ let docsText = '';
139
+ let docsTitle = '';
140
+ try {
141
+ const r = await fetch('/api/doc', {
142
+ method: 'POST',
143
+ headers: { 'content-type': 'application/json' },
144
+ body: JSON.stringify({ url: item.docs }),
145
+ });
146
+ const j = await r.json();
147
+ if (j.text) {
148
+ docsText = j.text;
149
+ docsTitle = j.title || item.docs;
150
+ }
151
+ }
152
+ catch { /* summarized from knowledge */ }
153
+ body.innerHTML = '<br><div class="stack-body-text"><span class="caret"></span></div>';
154
+ const slot = body.querySelector('.stack-body-text');
155
+ const settings = llm.getSettings();
156
+ const messages = llm.stackSummaryMessages({
157
+ repoName: state.scan.name,
158
+ item,
159
+ docsText,
160
+ repoNote: hooks.repoOverview(),
157
161
  });
158
- const j = await r.json();
159
- if (j.text) {
160
- docsText = j.text;
161
- docsTitle = j.title || item.docs;
162
+ let text = '';
163
+ try {
164
+ for await (const delta of streamExplain({ ...settings, messages, maxTokens: 700 })) {
165
+ text += delta;
166
+ slot.innerHTML = mdLite(text) + '<span class="caret"></span>';
167
+ }
168
+ slot.innerHTML = mdLite(text)
169
+ + `<p class="explain-src">${docsText ? `From ${escapeHtml(docsTitle)}` : 'No docs fetched — general knowledge'} · ${escapeHtml(settings.model)}</p>`;
162
170
  }
163
- } catch { /* summarized from knowledge */ }
164
-
165
- body.innerHTML = '<br><div class="stack-body-text"><span class="caret"></span></div>';
166
- const slot = body.querySelector('.stack-body-text');
167
- const settings = llm.getSettings();
168
- const messages = llm.stackSummaryMessages({
169
- repoName: state.scan.name,
170
- item,
171
- docsText,
172
- repoNote: hooks.repoOverview(),
173
- });
174
- let text = '';
175
- try {
176
- for await (const delta of streamExplain({ ...settings, messages, maxTokens: 700 })) {
177
- text += delta;
178
- slot.innerHTML = mdLite(text) + '<span class="caret"></span>';
171
+ catch (err) {
172
+ slot.innerHTML = `<p style="color:var(--warn)">${escapeHtml(err.message)}</p>`;
179
173
  }
180
- slot.innerHTML = mdLite(text)
181
- + `<p class="explain-src">${docsText ? `From ${escapeHtml(docsTitle)}` : 'No docs fetched — general knowledge'} · ${settings.model}</p>`;
182
- } catch (err) {
183
- slot.innerHTML = `<p style="color:var(--warn)">${escapeHtml(err.message)}</p>`;
184
- } finally {
185
- const btn = row.querySelector('.stack-sum');
186
- if (btn) {
187
- btn.textContent = body.textContent.trim() ? 'summarize again' : 'summarize';
188
- btn.disabled = false;
174
+ finally {
175
+ const btn = row.querySelector('.stack-sum');
176
+ if (btn) {
177
+ btn.textContent = body.textContent.trim() ? 'summarize again' : 'summarize';
178
+ btn.disabled = false;
179
+ }
189
180
  }
190
- }
191
181
  }
192
-
193
182
  // ---- the pure parts -------------------------------------------------------
194
-
195
183
  export function aboutNum(value, label) {
196
- return `<div class="about-num"><b>${value}</b><span>${label}</span></div>`;
184
+ return `<div class="about-num"><b>${value}</b><span>${label}</span></div>`;
197
185
  }
198
-
199
186
  // What the scan left out, itemized. The line here used to read "N files skipped
200
187
  // by the ignore rules", which was one number covering eight unrelated reasons —
201
188
  // most of them not the ignore rules at all.
202
189
  export function lineageCoverage(scan) {
203
- const s = scan.stats;
204
- const k = s.skips || {};
205
- const out = [];
206
-
207
- if (s.truncated) {
208
- out.push(
209
- `<li><b>Partial scan.</b> Stopped at the ${s.truncated.atFiles}-file cap with ` +
210
- `${s.truncated.dirsQueued} ${s.truncated.dirsQueued === 1 ? 'directory' : 'directories'} ` +
211
- `still unvisited — every count below is a floor, not a total.</li>`
212
- );
213
- }
214
-
215
- const reasons = [
216
- [k.ignored, 'matched .gitignore'],
217
- [k.vendorDir, 'in vendor or build folders'],
218
- [k.notSource, 'not source (images, lockfiles, bundles)'],
219
- [k.notCode, 'no analyzer for the extension'],
220
- [k.tooLarge, 'over the size cap'],
221
- [k.readFailed, 'could not be read'],
222
- [k.analyzeFailed, 'could not be parsed'],
223
- [k.listFailed, 'directories that would not list'],
224
- ].filter(([n]) => n > 0).map(([n, why]) => `${n} ${why}`);
225
- if (reasons.length) {
226
- out.push(`<li>${s.filesParsed} of ${s.filesTotal} files analyzed. Left out: ${reasons.join('; ')}.</li>`);
227
- }
228
-
229
- const imp = s.imports;
230
- if (imp?.total) {
231
- const worst = imp.worst?.length
232
- ? ` Most common misses: ${imp.worst.slice(0, 3).map((w) => `<code>${escapeHtml(w.spec)}</code>`).join(', ')}.`
233
- : '';
234
- out.push(
235
- `<li><b>${imp.confidence}% of ${imp.total} imports placed</b> — ${imp.internal} internal, ` +
236
- `${imp.external} external packages, ${imp.unresolved} unresolved.${imp.unresolved ? worst : ''}</li>`
237
- );
238
- }
239
- return out.join('\n');
190
+ const s = scan.stats;
191
+ const k = s.skips || {};
192
+ const out = [];
193
+ if (s.truncated) {
194
+ out.push(`<li><b>Partial scan.</b> Stopped at the ${s.truncated.atFiles}-file cap with ` +
195
+ `${s.truncated.dirsQueued} ${s.truncated.dirsQueued === 1 ? 'directory' : 'directories'} ` +
196
+ `still unvisited — every count below is a floor, not a total.</li>`);
197
+ }
198
+ const reasons = [
199
+ [k.ignored, 'matched .gitignore'],
200
+ [k.vendorDir, 'in vendor or build folders'],
201
+ [k.notSource, 'not source (images, lockfiles, bundles)'],
202
+ [k.notCode, 'no analyzer for the extension'],
203
+ [k.tooLarge, 'over the size cap'],
204
+ [k.readFailed, 'could not be read'],
205
+ [k.analyzeFailed, 'could not be parsed'],
206
+ [k.listFailed, 'directories that would not list'],
207
+ ].filter(([n]) => n > 0).map(([n, why]) => `${n} ${why}`);
208
+ if (reasons.length) {
209
+ out.push(`<li>${s.filesParsed} of ${s.filesTotal} files analyzed. Left out: ${reasons.join('; ')}.</li>`);
210
+ }
211
+ const imp = s.imports;
212
+ if (imp?.total) {
213
+ const worst = imp.worst?.length
214
+ ? ` Most common misses: ${imp.worst.slice(0, 3).map((w) => `<code>${escapeHtml(w.spec)}</code>`).join(', ')}.`
215
+ : '';
216
+ out.push(`<li><b>${imp.confidence}% of ${imp.total} imports placed</b> — ${imp.internal} internal, ` +
217
+ `${imp.external} external packages, ${imp.unresolved} unresolved.${imp.unresolved ? worst : ''}</li>`);
218
+ }
219
+ return out.join('\n');
240
220
  }
241
-
242
221
  // The GitHub URL parsing and the reading of the API payload also exist in
243
222
  // `/shared/analyzer/github.js`, where the terminal reads them. This copy is not
244
223
  // an oversight and cannot simply be deleted: this module is loaded by Node tests
@@ -250,32 +229,31 @@ export function lineageCoverage(scan) {
250
229
  // `watchers_count` (a legacy alias for the *stargazer* count) and called it
251
230
  // "watching", printing the star number twice.
252
231
  export function githubRepoPath(url) {
253
- const m = String(url ?? '').match(/github\.com[:/]([^/\s]+\/[^/\s]+?)(?:\.git)?\/?$/);
254
- return m ? m[1] : null;
232
+ const m = String(url ?? '').match(/github\.com[:/]([^/\s]+\/[^/\s]+?)(?:\.git)?\/?$/);
233
+ return m ? m[1] : null;
255
234
  }
256
-
257
235
  export function aboutDate(iso) {
258
- if (!iso) return 'unknown';
259
- return new Date(iso).toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });
236
+ if (!iso)
237
+ return 'unknown';
238
+ return new Date(iso).toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });
260
239
  }
261
-
262
240
  async function loadRemoteInfo(repoPath) {
263
- const box = host.querySelector('#aboutRemote');
264
- try {
265
- const res = await fetch(`https://api.github.com/repos/${repoPath}`);
266
- if (!res.ok) {
267
- throw new Error(res.status === 403
268
- ? 'GitHub rate-limited the ask — unauthenticated allowance is 60 an hour.'
269
- : `GitHub answered ${res.status}.`);
270
- }
271
- const r = await res.json();
272
- // `subscribers_count`, not `watchers_count`. The API carries both and
273
- // `watchers_count` is a legacy alias for the *stargazer* count, so reading
274
- // it printed the star number a second time and called it "watching". The
275
- // real watcher count is the subscribers number.
276
- const watching = Number.isFinite(r.subscribers_count) ? r.subscribers_count : 0;
277
- const license = r.license?.spdx_id && r.license.spdx_id !== 'NOASSERTION' ? r.license.spdx_id : '';
278
- box.innerHTML = `
241
+ const box = host.querySelector('#aboutRemote');
242
+ try {
243
+ const res = await fetch(`https://api.github.com/repos/${repoPath}`);
244
+ if (!res.ok) {
245
+ throw new Error(res.status === 403
246
+ ? 'GitHub rate-limited the ask — unauthenticated allowance is 60 an hour.'
247
+ : `GitHub answered ${res.status}.`);
248
+ }
249
+ const r = await res.json();
250
+ // `subscribers_count`, not `watchers_count`. The API carries both and
251
+ // `watchers_count` is a legacy alias for the *stargazer* count, so reading
252
+ // it printed the star number a second time and called it "watching". The
253
+ // real watcher count is the subscribers number.
254
+ const watching = Number.isFinite(r.subscribers_count) ? r.subscribers_count : 0;
255
+ const license = r.license?.spdx_id && r.license.spdx_id !== 'NOASSERTION' ? r.license.spdx_id : '';
256
+ box.innerHTML = `
279
257
  <div class="about-numbers">
280
258
  ${aboutNum(r.stargazers_count ?? 0, 'stars')}
281
259
  ${aboutNum(r.forks_count ?? 0, 'forks')}
@@ -291,7 +269,9 @@ async function loadRemoteInfo(repoPath) {
291
269
  ${r.homepage ? `<li><a href="${escapeHtml(r.homepage)}" target="_blank" rel="noopener noreferrer">${escapeHtml(r.homepage)}</a></li>` : ''}
292
270
  <li class="doc-readme-none">These are GitHub's numbers, not this repository's — <code>health</code> and <code>risks</code> are about the code.</li>
293
271
  </ul>`;
294
- } catch (err) {
295
- box.innerHTML = `<span class="doc-readme-none">${escapeHtml(err.message)}</span>`;
296
- }
272
+ }
273
+ catch (err) {
274
+ box.innerHTML = `<span class="doc-readme-none">${escapeHtml(err.message)}</span>`;
275
+ }
297
276
  }
277
+ //# sourceMappingURL=about.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"about.js","sourceRoot":"","sources":["../../src/public/js/about.ts"],"names":[],"mappings":"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","sourcesContent":["// The About view: what this repo is, what it's built from, and how the scan\n// that produced this page actually went.\n//\n// The rendering needs the DOM, but the parts worth checking — the coverage\n// prose, the GitHub URL parsing, date formatting — are pure and exported for\n// that reason. Nothing here runs at import time.\n\nimport { escapeHtml } from './html.js';\nimport { state } from './state.js';\nimport { streamExplain } from './api.js';\nimport { mdLite } from './markdown.js';\nimport * as llm from './llm.js';\n\nlet host = null;\nlet hooks = { onToast: (..._args: unknown[]) => {}, onOpenSettings: (..._args: unknown[]) => {}, repoOverview: () => '' };\n\nexport function initAbout(options) {\n host = options.host;\n hooks = { ...hooks, ...options };\n host.addEventListener('click', (event) => {\n const b = event.target.closest('[data-stack-sum]');\n if (b) summarizeStackItem(b.dataset.stackSum);\n });\n}\n\nexport function renderAbout() {\n if (state.about.rendered) return;\n state.about.rendered = true;\n const { scan, facts } = state;\n const gh = scan.gitUrl ? githubRepoPath(scan.gitUrl) : null;\n\n const sourceLine = scan.gitUrl\n ? `Cloned from ${scan.gitUrl}`\n : state.browserSource\n ? 'Picked in the browser — files never left this tab.'\n : `Read in place from ${scan.root}`;\n\n host.innerHTML = `\n <div class=\"doc-page\">\n <h1 class=\"doc-title\">${escapeHtml(scan.name)}</h1>\n <p class=\"doc-sub\">${escapeHtml(scan.tempId ? scan.tempId + ' — a temp clone' : scan.root)}</p>\n <p class=\"doc-sub\">${escapeHtml(sourceLine)}</p>\n\n <div class=\"about-numbers\">\n ${aboutNum(scan.stats.filesParsed, 'code files')}\n ${aboutNum(scan.stats.edgeCount, 'connections')}\n ${aboutNum(facts.entries.length, 'entry points')}\n ${aboutNum(facts.hubs.length, 'hubs')}\n ${aboutNum(facts.cycles.length, 'cycles')}\n ${aboutNum(Object.keys(scan.stats.languages).length, 'languages')}\n </div>\n\n <h2 class=\"doc-section-h\">Stack</h2>\n <div id=\"stackZone\"></div>\n\n ${renderHistorySection(state.history)}\n\n <h2 class=\"doc-section-h\">From the remote</h2>\n <div id=\"aboutRemote\">${\n gh\n ? '<span class=\"doc-readme-none\">Asking GitHub…</span>'\n : `<span class=\"doc-readme-none\">${scan.gitUrl ? 'Not a GitHub URL — no remote facts to fetch.' : 'A local repo — no remote to ask about.'}</span>`\n }</div>\n\n <h2 class=\"doc-section-h\">Lineage</h2>\n <ul class=\"about-lineage\">\n <li>Scanned ${new Date(scan.scannedAt).toLocaleString()} in ${scan.stats.tookMs} ms.</li>\n ${lineageCoverage(scan)}\n ${scan.tempId ? `<li>The clone lives in your temp folder as <code>${escapeHtml(scan.tempId)}</code> until you hit New repo.</li>` : ''}\n </ul>\n </div>`;\n\n if (gh) loadRemoteInfo(gh);\n if (state.stack) renderStackZone(host.querySelector('#stackZone'));\n}\n\nfunction renderHistorySection(h) {\n if (!h) return '';\n if (!h.available) {\n return `<h2 class=\"doc-section-h\">History</h2><p class=\"doc-readme-none\">${escapeHtml(h.reason || 'No history available.')}</p>`;\n }\n return `\n <h2 class=\"doc-section-h\">History & Activity</h2>\n <div class=\"about-numbers\">\n ${aboutNum(h.commitCount, h.truncated ? 'commits analyzed' : 'commits')}\n ${aboutNum(h.authors.length, 'contributors')}\n ${aboutNum(h.soloFiles, 'solo-author files')}\n ${aboutNum(h.coChanged.length, 'co-change pairs')}\n </div>\n <ul class=\"about-lineage\">\n ${h.firstCommitAt ? `<li>First commit: <b>${aboutDate(h.firstCommitAt)}</b> · Latest: <b>${aboutDate(h.lastCommitAt)}</b></li>` : ''}\n ${h.authors.length ? `<li>Top contributors: ${h.authors.slice(0, 5).map((a) => `<b>${escapeHtml(a.name || a.email)}</b> (${a.commits})`).join(', ')}.</li>` : ''}\n </ul>\n `;\n}\n\n// ---- Stack: detected languages, package managers, and frameworks ----------\n\nfunction renderStackZone(zone) {\n const st = state.stack;\n if (!st) return (zone.innerHTML = '');\n\n const langs = Object.entries(st.languages)\n .map(([name, count]) => `<span class=\"stack-lang\"><i>${count}</i> ${escapeHtml(name)}</span>`)\n .join('');\n\n const rows = st.items\n .map(\n (it) => `\n <div class=\"stack-item\">\n <span class=\"stack-name\">${escapeHtml(it.name)}</span>\n <span class=\"stack-cat\">${escapeHtml(it.category)}</span>\n ${it.version ? `<span class=\"stack-ver\">v${escapeHtml(it.version)}</span>` : ''}\n ${it.dev ? '<span class=\"stack-dev\">dev</span>' : ''}\n <span class=\"stack-lang\">${escapeHtml(it.lang)}</span>\n <a class=\"stack-doc\" href=\"${escapeHtml(it.docs)}\" target=\"_blank\" rel=\"noopener\">docs ↗</a>\n <button class=\"stack-sum\" data-stack-sum=\"${escapeHtml(it.name)}\" title=\"Summarize from official docs\">summarize</button>\n <div class=\"stack-body\" data-stack-body></div>\n </div>`\n )\n .join('');\n\n zone.innerHTML = `\n <div class=\"stack-block\">\n <div class=\"stack-langs\">${langs || '<span class=\"doc-readme-none\">No languages parsed.</span>'}</div>\n ${st.pm.length ? `<p class=\"stack-pm\">package managers: ${escapeHtml(st.pm.join(', '))}</p>` : ''}\n ${st.items.length\n ? `<div class=\"stack-grid\">${rows}</div>\n <p class=\"stack-hint\">Each “summarize” fetches that library’s official docs and folds them into an AI field note.</p>`\n : '<p class=\"doc-readme-none\">No declared dependencies — nothing to analyze.</p>'}\n </div>`;\n}\n\n// Fetch a library's official docs (server-side, SSRF-safe) and summarize it\n// with the AI, streamed into the row.\nasync function summarizeStackItem(name) {\n const item = state.stack.items.find((i) => i.name === name);\n if (!item) return hooks.onToast('Unknown dependency.');\n if (!llm.isConfigured()) {\n hooks.onOpenSettings();\n return hooks.onToast('Choose Hermes or an endpoint in AI connection first.');\n }\n const row = host.querySelector(`[data-stack-sum=\"${CSS.escape(name)}\"]`)?.closest('.stack-item');\n const body = row?.querySelector('[data-stack-body]');\n if (!body) return;\n\n row.querySelector('.stack-sum').textContent = 'looking…';\n row.querySelector('.stack-sum').disabled = true;\n\n let docsText = '';\n let docsTitle = '';\n try {\n const r = await fetch('/api/doc', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ url: item.docs }),\n });\n const j = await r.json();\n if (j.text) {\n docsText = j.text;\n docsTitle = j.title || item.docs;\n }\n } catch { /* summarized from knowledge */ }\n\n body.innerHTML = '<br><div class=\"stack-body-text\"><span class=\"caret\"></span></div>';\n const slot = body.querySelector('.stack-body-text');\n const settings = llm.getSettings();\n const messages = llm.stackSummaryMessages({\n repoName: state.scan.name,\n item,\n docsText,\n repoNote: hooks.repoOverview(),\n });\n let text = '';\n try {\n for await (const delta of streamExplain({ ...settings, messages, maxTokens: 700 })) {\n text += delta;\n slot.innerHTML = mdLite(text) + '<span class=\"caret\"></span>';\n }\n slot.innerHTML = mdLite(text)\n + `<p class=\"explain-src\">${docsText ? `From ${escapeHtml(docsTitle)}` : 'No docs fetched — general knowledge'} · ${escapeHtml(settings.model)}</p>`;\n } catch (err) {\n slot.innerHTML = `<p style=\"color:var(--warn)\">${escapeHtml(err.message)}</p>`;\n } finally {\n const btn = row.querySelector('.stack-sum');\n if (btn) {\n btn.textContent = body.textContent.trim() ? 'summarize again' : 'summarize';\n btn.disabled = false;\n }\n }\n}\n\n// ---- the pure parts -------------------------------------------------------\n\nexport function aboutNum(value, label) {\n return `<div class=\"about-num\"><b>${value}</b><span>${label}</span></div>`;\n}\n\n// What the scan left out, itemized. The line here used to read \"N files skipped\n// by the ignore rules\", which was one number covering eight unrelated reasons —\n// most of them not the ignore rules at all.\nexport function lineageCoverage(scan) {\n const s = scan.stats;\n const k = s.skips || {};\n const out = [];\n\n if (s.truncated) {\n out.push(\n `<li><b>Partial scan.</b> Stopped at the ${s.truncated.atFiles}-file cap with ` +\n `${s.truncated.dirsQueued} ${s.truncated.dirsQueued === 1 ? 'directory' : 'directories'} ` +\n `still unvisited — every count below is a floor, not a total.</li>`\n );\n }\n\n const reasons = [\n [k.ignored, 'matched .gitignore'],\n [k.vendorDir, 'in vendor or build folders'],\n [k.notSource, 'not source (images, lockfiles, bundles)'],\n [k.notCode, 'no analyzer for the extension'],\n [k.tooLarge, 'over the size cap'],\n [k.readFailed, 'could not be read'],\n [k.analyzeFailed, 'could not be parsed'],\n [k.listFailed, 'directories that would not list'],\n ].filter(([n]) => n > 0).map(([n, why]) => `${n} ${why}`);\n if (reasons.length) {\n out.push(`<li>${s.filesParsed} of ${s.filesTotal} files analyzed. Left out: ${reasons.join('; ')}.</li>`);\n }\n\n const imp = s.imports;\n if (imp?.total) {\n const worst = imp.worst?.length\n ? ` Most common misses: ${imp.worst.slice(0, 3).map((w) => `<code>${escapeHtml(w.spec)}</code>`).join(', ')}.`\n : '';\n out.push(\n `<li><b>${imp.confidence}% of ${imp.total} imports placed</b> — ${imp.internal} internal, ` +\n `${imp.external} external packages, ${imp.unresolved} unresolved.${imp.unresolved ? worst : ''}</li>`\n );\n }\n return out.join('\\n');\n}\n\n// The GitHub URL parsing and the reading of the API payload also exist in\n// `/shared/analyzer/github.js`, where the terminal reads them. This copy is not\n// an oversight and cannot simply be deleted: this module is loaded by Node tests\n// (`tests/about.test.js`), and a `/shared/…` specifier does not resolve in Node,\n// so importing the shared version here would make this whole file unloadable\n// outside a browser. The duplication is therefore pinned by a test —\n// \"the two GitHub URL parsers agree\" — rather than left to drift, which is what\n// two unconnected copies of this regex had already done: the browser counted\n// `watchers_count` (a legacy alias for the *stargazer* count) and called it\n// \"watching\", printing the star number twice.\nexport function githubRepoPath(url) {\n const m = String(url ?? '').match(/github\\.com[:/]([^/\\s]+\\/[^/\\s]+?)(?:\\.git)?\\/?$/);\n return m ? m[1] : null;\n}\n\nexport function aboutDate(iso) {\n if (!iso) return 'unknown';\n return new Date(iso).toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n}\n\nasync function loadRemoteInfo(repoPath) {\n const box = host.querySelector('#aboutRemote');\n try {\n const res = await fetch(`https://api.github.com/repos/${repoPath}`);\n if (!res.ok) {\n throw new Error(res.status === 403\n ? 'GitHub rate-limited the ask — unauthenticated allowance is 60 an hour.'\n : `GitHub answered ${res.status}.`);\n }\n const r = await res.json();\n // `subscribers_count`, not `watchers_count`. The API carries both and\n // `watchers_count` is a legacy alias for the *stargazer* count, so reading\n // it printed the star number a second time and called it \"watching\". The\n // real watcher count is the subscribers number.\n const watching = Number.isFinite(r.subscribers_count) ? r.subscribers_count : 0;\n const license = r.license?.spdx_id && r.license.spdx_id !== 'NOASSERTION' ? r.license.spdx_id : '';\n box.innerHTML = `\n <div class=\"about-numbers\">\n ${aboutNum(r.stargazers_count ?? 0, 'stars')}\n ${aboutNum(r.forks_count ?? 0, 'forks')}\n ${aboutNum(watching, 'watching')}\n ${aboutNum(r.open_issues_count ?? 0, 'open issues')}\n </div>\n ${r.description ? `<p class=\"about-desc\">${escapeHtml(r.description)}</p>` : ''}\n <ul class=\"about-lineage\">\n ${license ? `<li>License: ${escapeHtml(license)}</li>` : ''}\n <li>Created ${aboutDate(r.created_at)} · last push ${aboutDate(r.pushed_at)}.</li>\n ${r.default_branch ? `<li>Default branch: <code>${escapeHtml(r.default_branch)}</code></li>` : ''}\n ${r.topics?.length ? `<li>Topics: ${r.topics.map((t) => `<span class=\"stat-chip\">${escapeHtml(t)}</span>`).join(' ')}</li>` : ''}\n ${r.homepage ? `<li><a href=\"${escapeHtml(r.homepage)}\" target=\"_blank\" rel=\"noopener noreferrer\">${escapeHtml(r.homepage)}</a></li>` : ''}\n <li class=\"doc-readme-none\">These are GitHub's numbers, not this repository's — <code>health</code> and <code>risks</code> are about the code.</li>\n </ul>`;\n } catch (err) {\n box.innerHTML = `<span class=\"doc-readme-none\">${escapeHtml(err.message)}</span>`;\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export declare function initAiDraft(options: any): void;
2
+ export declare function updateAiBtn(key?: string): void;
3
+ export declare function stopAiDraft(): void;
4
+ export declare function wireAIClicks(): void;