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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docsView.js","sourceRoot":"","sources":["../../src/public/js/docsView.ts"],"names":[],"mappings":"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","sourcesContent":["import { eventElement } from '/js/dom.js';\n// The Docs tab: a written account of the repo.\n//\n// Three layers, in order of how much they cost. The overview page and the\n// folder-by-folder sections are written from the import graph and need no\n// network at all. Pressing \"Generate documentation\" replaces those sentences\n// with a model's, streamed in place. Opening a topic from the contents adds a\n// tab that documents one file or folder in depth, and the bar at the bottom\n// answers questions scoped to whichever of those is on screen.\n//\n// The static sentences live in `/shared/analyzer/docs.js` — pure, and tested.\n// What is here is the DOM: tabs, streaming, and the wiring between them.\n\nimport { parseFolderDoc, fileFactsLine, fileStaticDoc, folderStaticDoc, docFileRow } from '/shared/analyzer/docs.js';\nimport { explainOverview } from '/shared/analyzer/explainLocal.js';\nimport { scanIndex } from '/shared/analyzer/graph.js';\nimport { escapeHtml } from './html.js';\nimport { mdLite, mdRender } from './markdown.js';\nimport { state } from './state.js';\nimport { streamExplain } from './api.js';\nimport { findNode, countFiles } from './tree.js';\nimport { readRepoFile, gatherFileContext } from './repoFiles.js';\nimport * as llm from './llm.js';\n\nlet host = null;\nlet hooks = {\n onToast: (..._args: unknown[]) => {},\n onOpenSettings: (..._args: unknown[]) => {},\n onOpenFile: (..._args: unknown[]) => {},\n repoOverview: () => '',\n};\n\nexport function initDocs(options) {\n host = options.host;\n hooks = { ...hooks, ...options };\n}\n\n// Facts about one file or folder, bound to the loaded repo. Every prompt and\n// every static sentence on this page goes through these two, so the doc tab and\n// the folder pass can never describe the same file differently.\nconst factsLine = (path) => fileFactsLine(path, state.scan, state.facts);\nconst staticDoc = (path) => fileStaticDoc(path, state.scan, state.facts);\nconst fileRow = (path) => docFileRow(path, state.scan, state.facts);\n\n// ---- the page ---------------------------------------------------------------\n\n// One-time document build per scan; AI briefs update rows in place afterwards.\nexport function renderDocs() {\n if (state.docs.rendered) return;\n state.docs.rendered = true;\n\n const tabsEl = document.createElement('div');\n tabsEl.className = 'doc-tabs';\n const wrapEl = document.createElement('div');\n const scrollEl = document.createElement('div');\n scrollEl.className = 'doc-scroll';\n scrollEl.append(tabsEl, wrapEl);\n\n // Answers stream into this rail, above the bar, only once there's something\n // to show.\n const railEl = document.createElement('div');\n railEl.className = 'doc-qa-rail';\n railEl.hidden = true;\n\n // The sticky bottom bar: questions about whatever doc is on screen, with\n // clear/close once a conversation is underway.\n const barEl = document.createElement('form');\n barEl.className = 'doc-askbar';\n barEl.innerHTML = `\n <input type=\"text\" id=\"docAskInput\" class=\"text-input\" placeholder=\"Ask me anything about this doc…\" spellcheck=\"false\" autocomplete=\"off\">\n <button type=\"submit\" class=\"btn btn-ink\">Ask</button>`;\n const clearBtn = document.createElement('button');\n clearBtn.type = 'button';\n clearBtn.className = 'btn btn-sm btn-ghost doc-clear';\n clearBtn.textContent = 'clear';\n clearBtn.title = 'Clear the conversation';\n clearBtn.hidden = true;\n const closeBtn = document.createElement('button');\n closeBtn.type = 'button';\n closeBtn.className = 'btn btn-sm btn-ghost doc-close';\n closeBtn.textContent = 'close';\n closeBtn.title = 'Close the conversation';\n closeBtn.hidden = true;\n clearBtn.addEventListener('click', () => { railEl.innerHTML = ''; });\n closeBtn.addEventListener('click', () => {\n railEl.hidden = true;\n clearBtn.hidden = true;\n closeBtn.hidden = true;\n });\n barEl.append(clearBtn, closeBtn);\n barEl.addEventListener('submit', (event) => {\n event.preventDefault();\n askAboutRepo();\n });\n\n host.innerHTML = '';\n host.append(scrollEl, railEl, barEl);\n state.docs.tabsEl = tabsEl;\n state.docs.wrapEl = wrapEl;\n state.docs.railEl = railEl;\n state.docs.bar = barEl;\n state.docs.pageEl = buildOverviewPage();\n\n renderDocStrip();\n showActiveDoc();\n loadReadme();\n}\n\n// The landing tab: repo header, topic index, README, the documentation zone\n// (filled on demand by the AI), and the question box at the bottom.\nfunction buildOverviewPage() {\n const { scan, facts, manifest } = state;\n const root = state.treeData;\n\n const page = document.createElement('div');\n page.className = 'doc-page';\n page.innerHTML = `\n <div id=\"doc-top\">\n <h1 class=\"doc-title\">${escapeHtml(scan.name)}</h1>\n <p class=\"doc-sub\">${escapeHtml(scan.root)}</p>\n <p class=\"doc-sub\">${scan.stats.filesParsed} code files · ${scan.stats.edgeCount} connections · scanned in ${scan.stats.tookMs} ms</p>\n <p class=\"doc-ai-note\" id=\"docAiNote\">Pick a topic in the contents for a detailed AI document. “Generate documentation” writes the full folder-by-folder write-up below.</p>\n <p class=\"doc-overview\" id=\"docOverview\">${escapeHtml(explainOverview(scan, facts, manifest).replace(/[*`]/g, ''))}</p>\n </div>\n <nav class=\"doc-toc\" id=\"docToc\"></nav>\n <h2 class=\"doc-section-h doc-anchor\" id=\"doc-readme-h\">In its own words</h2>\n <div class=\"doc-readme\" id=\"docReadme\"><span class=\"doc-readme-none\">Looking for a README…</span></div>\n <h2 class=\"doc-section-h doc-anchor\" id=\"doc-layout-h\">The documentation</h2>\n <div id=\"docGenZone\">\n <p class=\"doc-gen-empty\">Nothing written yet. Press the button and the AI will document this repo folder by folder, right here.</p>\n <button class=\"btn btn-ink\" id=\"docGenBtn\">Generate documentation</button>\n </div>\n `;\n\n buildToc(page, root);\n\n page.addEventListener('click', (event) => {\n const b = eventElement(event)?.closest<HTMLElement>('[data-doc-open]');\n if (!b) return;\n const raw = b.dataset.docOpen;\n const i = raw.indexOf(':');\n openDocTab(raw.slice(0, i), raw.slice(i + 1));\n });\n page.querySelector<HTMLButtonElement>('#docGenBtn').addEventListener('click', writeDocsWithAI);\n\n return page;\n}\n\n// The contents index: page anchors up top, then every folder and file as a\n// topic — clicking any of them opens its detailed AI tab.\nfunction buildToc(page, root) {\n const toc = page.querySelector('#docToc');\n const bits = [\n `<span class=\"doc-toc-h\">Get documentation about a topic</span>`,\n `<a href=\"#doc-top\">Overview</a>`,\n `<a href=\"#doc-readme-h\">In its own words</a>`,\n `<span class=\"doc-toc-group\">Folders and files — click for the AI document</span>`,\n ];\n let folderCount = 0;\n const parsedSet = new Set(state.scan.files.map((f) => f.path));\n const walk = (node, depth) => {\n if (folderCount >= 30) return;\n folderCount++;\n const indent = Math.min(depth, 3);\n bits.push(`<button class=\"doc-toc-link doc-toc-folder doc-indent-${indent}\" data-doc-open=\"folder:${escapeHtml(node.path)}\">${escapeHtml(node.path ? node.name + '/' : '(repo root)')}</button>`);\n const files = node.files.filter((f) => parsedSet.has(f)).slice(0, 10);\n if (files.length) {\n const links = files\n .map((f) => `<button class=\"doc-toc-link\" data-doc-open=\"file:${escapeHtml(f)}\">${escapeHtml(f.split('/').pop())}</button>`)\n .join('<span class=\"doc-toc-sep\"> · </span>');\n bits.push(`<span class=\"doc-toc-files doc-indent-${indent}\">${links}${node.files.length > files.length ? ' …' : ''}</span>`);\n }\n for (const child of [...node.dirs.values()].sort((a, b) => a.name.localeCompare(b.name))) {\n walk(child, depth + 1);\n }\n };\n if (root.files.length) walk({ ...root, dirs: new Map() }, 0);\n for (const child of [...root.dirs.values()].sort((a, b) => a.name.localeCompare(b.name))) {\n walk(child, 0);\n }\n toc.innerHTML = bits.join('');\n}\n\nasync function loadReadme() {\n const box = host.querySelector('#docReadme');\n if (!box) return;\n for (const name of ['README.md', 'readme.md', 'Readme.md', 'README', 'README.txt']) {\n try {\n const text = await readRepoFile(name);\n if (text) {\n box.innerHTML = mdRender(text);\n return;\n }\n } catch {\n /* try the next spelling */\n }\n }\n box.innerHTML = '<span class=\"doc-readme-none\">This repo ships no README — the map and the patterns are all you get.</span>';\n}\n\n// ---- the sticky ask bar: questions scoped to the doc on screen -------------\n\nasync function askAboutRepo() {\n const input = host.querySelector('#docAskInput');\n const question = input?.value.trim();\n if (!question) return hooks.onToast('Type a question first.');\n if (!llm.isConfigured()) {\n hooks.onOpenSettings();\n hooks.onToast('Add an endpoint and model first.');\n return;\n }\n input.value = '';\n const rail = state.docs.railEl;\n rail.hidden = false;\n // reveal the clear/close controls now that a conversation exists\n const bar = state.docs.bar;\n if (bar) {\n const c = bar.querySelector<HTMLElement>('.doc-clear');\n const x = bar.querySelector<HTMLElement>('.doc-close');\n if (c) c.hidden = false;\n if (x) x.hidden = false;\n }\n const settings = llm.getSettings();\n\n const card = document.createElement('div');\n card.className = 'doc-qa-card';\n card.innerHTML = `<p class=\"doc-qa-q\">“${escapeHtml(question)}”</p><div class=\"doc-qa-a\"><span class=\"caret\"></span></div>`;\n rail.appendChild(card);\n card.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n\n // Scope the answer to whatever is on screen: an open file/folder doc tab\n // gets its facts (and source, for files) sent along; the overview answers\n // from the repo-wide picture.\n const active = state.docs.active || 'overview';\n let file = null;\n let scope = 'the repo overview';\n let overview = hooks.repoOverview() + ' Top-level folders: ' + [...state.treeData.dirs.keys()].join(', ') + '.';\n if (active.startsWith('file:')) {\n const path = active.slice(5);\n file = await gatherFileContext(path);\n scope = path;\n } else if (active.startsWith('folder:')) {\n scope = active.slice(7) + '/';\n overview += ` The user is currently reading the documentation for the folder \"${active.slice(7)}\".`;\n }\n\n const messages = llm.questionMessages({ repoName: state.scan.name, overview, question, file });\n let text = '';\n try {\n for await (const delta of streamExplain({ ...settings, messages, maxTokens: 1200 })) {\n text += delta;\n card.querySelector('.doc-qa-a').innerHTML = mdLite(text) + '<span class=\"caret\"></span>';\n }\n card.querySelector('.doc-qa-a').innerHTML =\n mdLite(text) + `<p class=\"explain-src\">Answered by ${settings.model}, looking at ${escapeHtml(scope)}.</p>`;\n } catch (err) {\n card.querySelector('.doc-qa-a').innerHTML =\n `<p style=\"color:var(--warn)\">${escapeHtml(err.message)} — check the API key drawer, top right.</p>`;\n }\n}\n\n// ---- doc tabs: detailed AI documents per file/folder -----------------------\n\nfunction renderDocStrip() {\n const strip = state.docs.tabsEl;\n if (!strip) return;\n strip.innerHTML = '';\n\n const mk = (key, label, closable) => {\n const b = document.createElement('button');\n b.className = 'doc-tab' + (state.docs.active === key ? ' is-active' : '');\n const entry = state.docs.tabs.get(key);\n b.innerHTML = `<span>${escapeHtml(label)}</span>${entry?.status === 'writing' ? '<span class=\"doc-tab-spin\">…</span>' : ''}`;\n b.addEventListener('click', () => {\n state.docs.active = key;\n renderDocStrip();\n showActiveDoc();\n });\n if (closable) {\n const x = document.createElement('span');\n x.className = 'doc-tab-x';\n x.textContent = '×';\n x.title = 'Close this tab';\n x.addEventListener('click', (event) => {\n event.stopPropagation();\n closeDocTab(key);\n });\n b.appendChild(x);\n }\n return b;\n };\n\n strip.appendChild(mk('overview', 'Overview', false));\n for (const [key, entry] of state.docs.tabs) {\n strip.appendChild(mk(key, entry.title, true));\n }\n}\n\nfunction openDocTab(kind, path) {\n const key = kind + ':' + path;\n if (!state.docs.tabs.has(key)) {\n const title = (path ? path.split('/').pop() : '(root)') + (kind === 'folder' ? '/' : '');\n state.docs.tabs.set(key, { key, kind, path, title, status: 'idle', text: '', error: '' });\n }\n state.docs.active = key;\n renderDocStrip();\n showActiveDoc();\n const entry = state.docs.tabs.get(key);\n if (entry.status === 'idle') generateDocTab(entry);\n}\n\nfunction closeDocTab(key) {\n state.docs.tabs.delete(key);\n if (state.docs.active === key) state.docs.active = 'overview';\n renderDocStrip();\n showActiveDoc();\n}\n\nfunction showActiveDoc() {\n const wrap = state.docs.wrapEl;\n if (!wrap) return;\n if (state.docs.active === 'overview') {\n wrap.replaceChildren(state.docs.pageEl);\n return;\n }\n const entry = state.docs.tabs.get(state.docs.active);\n if (entry) wrap.replaceChildren(buildPaneEl(entry));\n}\n\nfunction buildPaneEl(entry) {\n const pane = document.createElement('div');\n pane.className = 'doc-page doc-detail';\n\n const chips = [];\n if (entry.kind === 'file') {\n const f = scanIndex(state.scan).fileAt(entry.path);\n const fin = state.facts.fanIn[entry.path] || 0;\n const fout = state.facts.fanOut[entry.path] || 0;\n chips.push(`<b>${fin}</b> dependents`, `<b>${fout}</b> imports`);\n if (f) chips.push(`<b>${f.functions.length}</b> functions`, `<b>${(f.size / 1024).toFixed(1)}</b> kb`);\n } else {\n const node = findNode(state.treeData, entry.path);\n if (node) chips.push(`<b>${node.files.length}</b> files`, `<b>${node.dirs.size}</b> subfolders`);\n }\n\n pane.innerHTML = `\n <h1 class=\"doc-title\">${escapeHtml(entry.title)}</h1>\n <p class=\"doc-sub\">${escapeHtml(entry.path || '(repo root)')}</p>\n <p class=\"doc-sub doc-detail-meta\">${chips.join(' &nbsp;·&nbsp; ')}</p>\n <div class=\"doc-detail-actions\">\n ${entry.kind === 'file' ? '<button class=\"linklike\" data-doc-dd>Open the diagram deep-dive →</button>' : ''}\n <button class=\"linklike\" data-doc-regen>Regenerate</button>\n </div>\n <div class=\"doc-detail-body\"></div>\n `;\n\n const body = pane.querySelector('.doc-detail-body');\n if (entry.status === 'error') {\n body.innerHTML = `<p style=\"color:var(--warn)\">${escapeHtml(entry.error)} — hit Regenerate to try again.</p>`;\n } else if (entry.status === 'idle' || (entry.status === 'writing' && !entry.text)) {\n // The static write-up is the floor: something true is on screen before the\n // model answers, and stays there if it never does.\n const fallback = entry.kind === 'file'\n ? staticDoc(entry.path)\n : folderStaticDoc(entry.path, state.scan, state.facts, findNode(state.treeData, entry.path)?.dirs.size || 0);\n body.innerHTML = `<p>${escapeHtml(fallback)}</p>`\n + '<p class=\"doc-readme-none\">Gathering facts and writing<span class=\"caret\"></span></p>';\n } else {\n body.innerHTML = mdRender(entry.text) + (entry.status === 'writing' ? '<span class=\"caret\"></span>' : '');\n }\n\n pane.addEventListener('click', (event) => {\n if (eventElement(event)?.closest<HTMLElement>('[data-doc-dd]')) hooks.onOpenFile(entry.path);\n if (eventElement(event)?.closest<HTMLElement>('[data-doc-regen]')) {\n entry.status = 'idle';\n entry.text = '';\n generateDocTab(entry);\n showActiveDoc();\n }\n });\n return pane;\n}\n\nlet docRefreshTimer = null;\nfunction scheduleDocPaneRefresh(entry) {\n if (state.docs.active !== entry.key || docRefreshTimer) return;\n docRefreshTimer = setTimeout(() => {\n docRefreshTimer = null;\n if (state.docs.active === entry.key) showActiveDoc();\n }, 160);\n}\n\nasync function generateDocTab(entry) {\n if (!llm.isConfigured()) {\n entry.status = 'error';\n entry.error = 'No endpoint configured — open the API key drawer, top right.';\n showActiveDoc();\n renderDocStrip();\n hooks.onOpenSettings();\n return;\n }\n const settings = llm.getSettings();\n entry.status = 'writing';\n entry.text = '';\n entry.error = '';\n renderDocStrip();\n try {\n let messages;\n if (entry.kind === 'file') {\n const ctx = await gatherFileContext(entry.path);\n messages = llm.fileDocMessages({ repoName: state.scan.name, overview: hooks.repoOverview(), file: ctx });\n } else {\n const node = findNode(state.treeData, entry.path);\n messages = llm.folderDocDetailedMessages({\n repoName: state.scan.name,\n folder: entry.path,\n subfolders: node ? [...node.dirs.keys()].map((n) => n + '/') : [],\n files: (node?.files || []).slice(0, 18).map(fileRow),\n });\n }\n for await (const delta of streamExplain({ ...settings, messages, maxTokens: 1800 })) {\n entry.text += delta;\n scheduleDocPaneRefresh(entry);\n }\n entry.status = 'done';\n } catch (err) {\n entry.status = 'error';\n entry.error = err.message;\n }\n renderDocStrip();\n if (state.docs.active === entry.key) showActiveDoc();\n}\n\n// ---- the folder-by-folder pass --------------------------------------------\n\n// Which folders get an AI brief, and with what file facts. Top-level folders\n// by size, capped — one call briefs a folder and everything directly in it.\nfunction docTargets() {\n const root = state.treeData;\n const targets = [];\n if (root.files.length) {\n targets.push({\n path: '',\n label: '(repo root)',\n subfolders: [...root.dirs.keys()].map((n) => n + '/'),\n files: root.files.slice(0, 18).map(fileRow),\n });\n }\n const topDirs = [...root.dirs.values()]\n .map((node) => ({ node, count: countFiles(node) }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 8);\n for (const { node } of topDirs) {\n targets.push({\n path: node.path,\n label: node.path + '/',\n subfolders: [...node.dirs.keys()].map((n) => n + '/'),\n files: node.files.slice(0, 18).map(fileRow),\n });\n }\n return targets;\n}\n\nasync function writeDocsWithAI() {\n if (state.docs.writing) return;\n if (!llm.isConfigured()) {\n hooks.onOpenSettings();\n hooks.onToast('Add an endpoint and model first.');\n return;\n }\n const settings = llm.getSettings();\n const page = state.docs.pageEl;\n const zone = page?.querySelector('#docGenZone');\n const btn = page?.querySelector<HTMLButtonElement>('#docGenBtn');\n const note = page?.querySelector('#docAiNote');\n const overviewEl = page?.querySelector('#docOverview');\n if (!zone) return;\n\n state.docs.writing = true;\n if (btn) {\n btn.disabled = true;\n btn.textContent = 'writing…';\n }\n zone.querySelectorAll('.doc-generated').forEach((el) => el.remove()); // regenerate = fresh page\n const empty = zone.querySelector<HTMLElement>('.doc-gen-empty');\n if (empty) empty.hidden = true;\n\n try {\n // 1. The repo-level overview, streamed in place.\n if (note) note.textContent = 'Writing the overview…';\n const readmeText = host.querySelector('#docReadme')?.innerText?.slice(0, 1500) || '';\n let out = '';\n if (overviewEl) overviewEl.innerHTML = '<span class=\"caret\"></span>';\n const overviewMsgs = llm.repoDocMessages({\n repoName: state.scan.name,\n overview: hooks.repoOverview(),\n readmeExcerpt: readmeText,\n entries: state.facts.entries,\n hubs: state.facts.hubs,\n });\n for await (const delta of streamExplain({ ...settings, messages: overviewMsgs, maxTokens: 900 })) {\n out += delta;\n if (overviewEl) overviewEl.textContent = out;\n }\n\n // 2. Folder by folder: each section appears with static sentences first,\n // then the AI's documentation overwrites it as the answer lands.\n const targets = docTargets();\n let done = 0;\n for (const t of targets) {\n done++;\n if (note) note.textContent = `Writing documentation… ${done} of ${targets.length} — ${t.label}`;\n\n const node = findNode(state.treeData, t.path);\n const section = document.createElement('section');\n section.className = 'doc-folder doc-generated';\n section.innerHTML = `\n <h3 class=\"doc-folder-h\"><button data-doc-open=\"folder:${escapeHtml(t.path)}\">${escapeHtml(t.label)}</button></h3>\n <p class=\"doc-folder-brief\"><span class=\"caret\"></span></p>\n ${t.files.map((f) => `\n <div class=\"doc-entry${f.parsed ? '' : ' is-unparsed'}\">\n <div class=\"doc-entry-head\">\n ${f.parsed ? `<button class=\"doc-entry-name\" data-doc-open=\"file:${escapeHtml(f.path)}\">${escapeHtml(f.name)}</button>` : `<span class=\"doc-entry-name\">${escapeHtml(f.name)}</span>`}\n <span class=\"doc-entry-facts\">${escapeHtml(factsLine(f.path))}</span>\n </div>\n <p class=\"doc-entry-text\" data-doc-file=\"${escapeHtml(f.path)}\">${escapeHtml(staticDoc(f.path))}</p>\n </div>`).join('')}\n `;\n zone.appendChild(section);\n section.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n\n let text = '';\n const msgs = llm.folderDocMessages({\n repoName: state.scan.name,\n folder: t.path,\n subfolders: t.subfolders,\n files: t.files,\n });\n for await (const delta of streamExplain({ ...settings, messages: msgs, maxTokens: 1600 })) {\n text += delta;\n }\n const parsed = parseFolderDoc(text);\n const folderP = section.querySelector('.doc-folder-brief');\n if (folderP) {\n folderP.textContent = parsed.folderBrief\n || folderStaticDoc(t.path, state.scan, state.facts, node?.dirs.size || 0);\n }\n for (const [name, brief] of parsed.files) {\n const row = t.files.find((f) => f.name === name);\n if (!row) continue;\n const el = section.querySelector(`[data-doc-file=\"${CSS.escape(row.path)}\"]`);\n if (el) el.textContent = brief;\n }\n }\n if (note) note.textContent = `Written by ${settings.model} from the real import graph. Press “Regenerate documentation” for a fresh take.`;\n if (btn) btn.textContent = 'Regenerate documentation';\n } catch (err) {\n if (note) note.textContent = 'AI writing stopped: ' + err.message;\n hooks.onToast(err.message);\n } finally {\n state.docs.writing = false;\n if (btn) {\n btn.disabled = false;\n if (btn.textContent === 'writing…') btn.textContent = 'Generate documentation';\n }\n }\n}\n"]}
@@ -0,0 +1,189 @@
1
+ /** Element types for the app shell and view templates. */
2
+ export interface AppElements {
3
+ reviewView: HTMLElement;
4
+ cancelScanBtn: HTMLButtonElement;
5
+ scanProgress: HTMLProgressElement;
6
+ inspTitle: HTMLElement;
7
+ 'aboutRemote': HTMLElement;
8
+ 'aboutView': HTMLElement;
9
+ 'aiDrawBtn': HTMLButtonElement;
10
+ 'aiExplainBtn': HTMLButtonElement;
11
+ 'analysisView': HTMLElement;
12
+ 'askBtn': HTMLButtonElement;
13
+ 'askInput': HTMLInputElement;
14
+ 'blameGutter': HTMLElement;
15
+ 'blastDesc': HTMLElement;
16
+ 'blastMetric': HTMLElement;
17
+ 'blastRadiusBox': HTMLElement;
18
+ 'brandNote': HTMLElement;
19
+ 'canvas': HTMLElement;
20
+ 'canvasContent': HTMLElement;
21
+ 'canvasEmpty': HTMLElement;
22
+ 'codeAlt': HTMLElement;
23
+ 'codeHead': HTMLElement;
24
+ 'codeLinks': HTMLElement;
25
+ 'codeMonaco': HTMLElement;
26
+ 'codeTabContainer': HTMLElement;
27
+ 'codeView': HTMLElement;
28
+ 'copyMermaidBtn': HTMLButtonElement;
29
+ 'creditsBar': HTMLElement;
30
+ 'creditsBarRemove': HTMLButtonElement;
31
+ 'creditsHide': HTMLButtonElement;
32
+ 'creditsRemove': HTMLButtonElement;
33
+ 'creditsShow': HTMLButtonElement;
34
+ 'crumbs': HTMLElement;
35
+ 'demoBtn': HTMLButtonElement;
36
+ 'depthSelect': HTMLSelectElement;
37
+ 'diffBaseSelect': HTMLSelectElement;
38
+ 'diffFilesList': HTMLElement;
39
+ 'diffHeadSelect': HTMLSelectElement;
40
+ 'diffModeSplit': HTMLButtonElement;
41
+ 'diffModeUnified': HTMLButtonElement;
42
+ 'diffRunBtn': HTMLButtonElement;
43
+ 'diffSummaryChip': HTMLElement;
44
+ 'diffView': HTMLElement;
45
+ 'diffViewerMain': HTMLElement;
46
+ 'doc-top': HTMLElement;
47
+ 'docAiNote': HTMLElement;
48
+ 'docAskInput': HTMLInputElement;
49
+ 'docGenBtn': HTMLButtonElement;
50
+ 'docGenZone': HTMLElement;
51
+ 'docOverview': HTMLElement;
52
+ 'docReadme': HTMLElement;
53
+ 'docToc': HTMLElement;
54
+ 'docView': HTMLElement;
55
+ 'drawerClose': HTMLButtonElement;
56
+ 'drawerScrim': HTMLElement;
57
+ 'explorer': HTMLElement;
58
+ 'fileSidebar': HTMLElement;
59
+ 'fileTree': HTMLElement;
60
+ 'fitBtn': HTMLButtonElement;
61
+ 'footCredit': HTMLElement;
62
+ 'gitForm': HTMLFormElement;
63
+ 'gitInput': HTMLInputElement;
64
+ 'graphCanvas': HTMLCanvasElement;
65
+ 'graphControls': HTMLElement;
66
+ 'graphFit': HTMLButtonElement;
67
+ 'graphReset': HTMLButtonElement;
68
+ 'graphSearchInput': HTMLInputElement;
69
+ 'graphTooltip': HTMLElement;
70
+ 'graphView': HTMLElement;
71
+ 'graphZoomIn': HTMLButtonElement;
72
+ 'graphZoomOut': HTMLButtonElement;
73
+ 'heatmapCanvas': HTMLCanvasElement;
74
+ 'heatmapTooltip': HTMLElement;
75
+ 'heatmapView': HTMLElement;
76
+ 'insightsView': HTMLElement;
77
+ 'inspBack': HTMLButtonElement;
78
+ 'inspExplain': HTMLElement;
79
+ 'inspLists': HTMLElement;
80
+ 'inspPath': HTMLElement;
81
+ 'inspRole': HTMLElement;
82
+ 'inspSecurityTools': HTMLElement;
83
+ 'inspStats': HTMLElement;
84
+ 'inspector': HTMLElement;
85
+ 'inspectorBody': HTMLElement;
86
+ 'inspectorEmpty': HTMLElement;
87
+ 'landing': HTMLElement;
88
+ 'landingAbout': HTMLElement;
89
+ 'landingError': HTMLElement;
90
+ 'landingFoot': HTMLElement;
91
+ 'landingStatus': HTMLElement;
92
+ 'mcpBtn': HTMLButtonElement;
93
+ 'mcpBtnLabel': HTMLElement;
94
+ 'mcpClose': HTMLButtonElement;
95
+ 'mcpCommandInput': HTMLInputElement;
96
+ 'mcpConfig': HTMLElement;
97
+ 'mcpConfigBlock': HTMLElement;
98
+ 'mcpCopy': HTMLButtonElement;
99
+ 'mcpDot': HTMLElement;
100
+ 'mcpDrawer': HTMLElement;
101
+ 'mcpPanelDot': HTMLElement;
102
+ 'mcpPanelState': HTMLElement;
103
+ 'mcpScrim': HTMLElement;
104
+ 'mcpStart': HTMLButtonElement;
105
+ 'mcpStateRow': HTMLElement;
106
+ 'mcpStatus': HTMLElement;
107
+ 'mcpStop': HTMLButtonElement;
108
+ 'mcpTabJson': HTMLButtonElement;
109
+ 'mcpTabToml': HTMLButtonElement;
110
+ 'mcpToolsHint': HTMLElement;
111
+ 'mmToggleBtn': HTMLButtonElement;
112
+ 'mobileDetailsBtn': HTMLButtonElement;
113
+ 'mobileDetailsClose': HTMLButtonElement;
114
+ 'mobileFilesBtn': HTMLButtonElement;
115
+ 'mobileFilesClose': HTMLButtonElement;
116
+ 'mobilePanelScrim': HTMLButtonElement;
117
+ 'modeSwitch': HTMLElement;
118
+ 'newRepoBtn': HTMLButtonElement;
119
+ 'nodeFilter': HTMLInputElement;
120
+ 'pathForm': HTMLFormElement;
121
+ 'pathInput': HTMLInputElement;
122
+ 'pickBtn': HTMLButtonElement;
123
+ 'pickCard': HTMLElement;
124
+ 'repoChip': HTMLElement;
125
+ 'saveSettings': HTMLButtonElement;
126
+ 'sbomSearchInput': HTMLInputElement;
127
+ 'sbomTable': HTMLElement;
128
+ 'sbomTableBody': HTMLElement;
129
+ 'sbomView': HTMLElement;
130
+ 'searchOverlay': HTMLElement;
131
+ 'searchResultList': HTMLElement;
132
+ 'searchTriggerBtn': HTMLButtonElement;
133
+ 'serverBtn': HTMLButtonElement;
134
+ 'serverClose': HTMLButtonElement;
135
+ 'serverDrawer': HTMLElement;
136
+ 'serverModeNote': HTMLElement;
137
+ 'serverScrim': HTMLElement;
138
+ 'setApiKey': HTMLInputElement;
139
+ 'setBaseUrl': HTMLInputElement;
140
+ 'setModel': HTMLInputElement;
141
+ 'settingsBtn': HTMLButtonElement;
142
+ 'settingsDrawer': HTMLElement;
143
+ 'settingsStatus': HTMLElement;
144
+ 'srvAutoOpen': HTMLInputElement;
145
+ 'srvConfigPath': HTMLElement;
146
+ 'srvCopyKey': HTMLButtonElement;
147
+ 'srvDomain': HTMLInputElement;
148
+ 'srvDomainField': HTMLElement;
149
+ 'srvEmail': HTMLInputElement;
150
+ 'srvFreshKey': HTMLInputElement;
151
+ 'srvFreshKeyRow': HTMLElement;
152
+ 'srvHost': HTMLInputElement;
153
+ 'srvHttps': HTMLInputElement;
154
+ 'srvHttpsField': HTMLElement;
155
+ 'srvHttpsStatus': HTMLElement;
156
+ 'srvKeyHint': HTMLElement;
157
+ 'srvKeyMasked': HTMLInputElement;
158
+ 'srvKeySection': HTMLElement;
159
+ 'srvLogout': HTMLButtonElement;
160
+ 'srvMode': HTMLSelectElement;
161
+ 'srvName': HTMLInputElement;
162
+ 'srvPort': HTMLInputElement;
163
+ 'srvRotate': HTMLButtonElement;
164
+ 'srvSave': HTMLButtonElement;
165
+ 'srvStatus': HTMLElement;
166
+ 'srvTunnelCloudflare': HTMLInputElement;
167
+ 'srvTunnelCloudflareStatus': HTMLElement;
168
+ 'srvTunnelTailscale': HTMLInputElement;
169
+ 'srvTunnelTailscaleStatus': HTMLElement;
170
+ 'stackZone': HTMLElement;
171
+ 'stageFilters': HTMLElement;
172
+ 'stageFoot': HTMLElement;
173
+ 'svgBtn': HTMLButtonElement;
174
+ 'testSettings': HTMLButtonElement;
175
+ 'testsToggle': HTMLButtonElement;
176
+ 'themeBtn': HTMLButtonElement;
177
+ 'toast': HTMLElement;
178
+ 'tourCount': HTMLElement;
179
+ 'tourExit': HTMLButtonElement;
180
+ 'tourNext': HTMLButtonElement;
181
+ 'tourPrev': HTMLButtonElement;
182
+ 'tourTitle': HTMLElement;
183
+ 'tourbar': HTMLElement;
184
+ 'treeFilter': HTMLInputElement;
185
+ 'viewTabs': HTMLElement;
186
+ 'workflowsView': HTMLElement;
187
+ }
188
+ /** Delegated events may originate from a non-element node. */
189
+ export declare function eventElement(event: Event): HTMLElement | null;
@@ -0,0 +1,5 @@
1
+ /** Delegated events may originate from a non-element node. */
2
+ export function eventElement(event) {
3
+ return event.target instanceof HTMLElement ? event.target : null;
4
+ }
5
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/public/js/dom.ts"],"names":[],"mappings":"AA4LA,8DAA8D;AAC9D,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,OAAO,KAAK,CAAC,MAAM,YAAY,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC","sourcesContent":["/** Element types for the app shell and view templates. */\nexport interface AppElements {\n reviewView: HTMLElement;\n cancelScanBtn: HTMLButtonElement;\n scanProgress: HTMLProgressElement;\n inspTitle: HTMLElement;\n 'aboutRemote': HTMLElement;\n 'aboutView': HTMLElement;\n 'aiDrawBtn': HTMLButtonElement;\n 'aiExplainBtn': HTMLButtonElement;\n 'analysisView': HTMLElement;\n 'askBtn': HTMLButtonElement;\n 'askInput': HTMLInputElement;\n 'blameGutter': HTMLElement;\n 'blastDesc': HTMLElement;\n 'blastMetric': HTMLElement;\n 'blastRadiusBox': HTMLElement;\n 'brandNote': HTMLElement;\n 'canvas': HTMLElement;\n 'canvasContent': HTMLElement;\n 'canvasEmpty': HTMLElement;\n 'codeAlt': HTMLElement;\n 'codeHead': HTMLElement;\n 'codeLinks': HTMLElement;\n 'codeMonaco': HTMLElement;\n 'codeTabContainer': HTMLElement;\n 'codeView': HTMLElement;\n 'copyMermaidBtn': HTMLButtonElement;\n 'creditsBar': HTMLElement;\n 'creditsBarRemove': HTMLButtonElement;\n 'creditsHide': HTMLButtonElement;\n 'creditsRemove': HTMLButtonElement;\n 'creditsShow': HTMLButtonElement;\n 'crumbs': HTMLElement;\n 'demoBtn': HTMLButtonElement;\n 'depthSelect': HTMLSelectElement;\n 'diffBaseSelect': HTMLSelectElement;\n 'diffFilesList': HTMLElement;\n 'diffHeadSelect': HTMLSelectElement;\n 'diffModeSplit': HTMLButtonElement;\n 'diffModeUnified': HTMLButtonElement;\n 'diffRunBtn': HTMLButtonElement;\n 'diffSummaryChip': HTMLElement;\n 'diffView': HTMLElement;\n 'diffViewerMain': HTMLElement;\n 'doc-top': HTMLElement;\n 'docAiNote': HTMLElement;\n 'docAskInput': HTMLInputElement;\n 'docGenBtn': HTMLButtonElement;\n 'docGenZone': HTMLElement;\n 'docOverview': HTMLElement;\n 'docReadme': HTMLElement;\n 'docToc': HTMLElement;\n 'docView': HTMLElement;\n 'drawerClose': HTMLButtonElement;\n 'drawerScrim': HTMLElement;\n 'explorer': HTMLElement;\n 'fileSidebar': HTMLElement;\n 'fileTree': HTMLElement;\n 'fitBtn': HTMLButtonElement;\n 'footCredit': HTMLElement;\n 'gitForm': HTMLFormElement;\n 'gitInput': HTMLInputElement;\n 'graphCanvas': HTMLCanvasElement;\n 'graphControls': HTMLElement;\n 'graphFit': HTMLButtonElement;\n 'graphReset': HTMLButtonElement;\n 'graphSearchInput': HTMLInputElement;\n 'graphTooltip': HTMLElement;\n 'graphView': HTMLElement;\n 'graphZoomIn': HTMLButtonElement;\n 'graphZoomOut': HTMLButtonElement;\n 'heatmapCanvas': HTMLCanvasElement;\n 'heatmapTooltip': HTMLElement;\n 'heatmapView': HTMLElement;\n 'insightsView': HTMLElement;\n 'inspBack': HTMLButtonElement;\n 'inspExplain': HTMLElement;\n 'inspLists': HTMLElement;\n 'inspPath': HTMLElement;\n 'inspRole': HTMLElement;\n 'inspSecurityTools': HTMLElement;\n 'inspStats': HTMLElement;\n 'inspector': HTMLElement;\n 'inspectorBody': HTMLElement;\n 'inspectorEmpty': HTMLElement;\n 'landing': HTMLElement;\n 'landingAbout': HTMLElement;\n 'landingError': HTMLElement;\n 'landingFoot': HTMLElement;\n 'landingStatus': HTMLElement;\n 'mcpBtn': HTMLButtonElement;\n 'mcpBtnLabel': HTMLElement;\n 'mcpClose': HTMLButtonElement;\n 'mcpCommandInput': HTMLInputElement;\n 'mcpConfig': HTMLElement;\n 'mcpConfigBlock': HTMLElement;\n 'mcpCopy': HTMLButtonElement;\n 'mcpDot': HTMLElement;\n 'mcpDrawer': HTMLElement;\n 'mcpPanelDot': HTMLElement;\n 'mcpPanelState': HTMLElement;\n 'mcpScrim': HTMLElement;\n 'mcpStart': HTMLButtonElement;\n 'mcpStateRow': HTMLElement;\n 'mcpStatus': HTMLElement;\n 'mcpStop': HTMLButtonElement;\n 'mcpTabJson': HTMLButtonElement;\n 'mcpTabToml': HTMLButtonElement;\n 'mcpToolsHint': HTMLElement;\n 'mmToggleBtn': HTMLButtonElement;\n 'mobileDetailsBtn': HTMLButtonElement;\n 'mobileDetailsClose': HTMLButtonElement;\n 'mobileFilesBtn': HTMLButtonElement;\n 'mobileFilesClose': HTMLButtonElement;\n 'mobilePanelScrim': HTMLButtonElement;\n 'modeSwitch': HTMLElement;\n 'newRepoBtn': HTMLButtonElement;\n 'nodeFilter': HTMLInputElement;\n 'pathForm': HTMLFormElement;\n 'pathInput': HTMLInputElement;\n 'pickBtn': HTMLButtonElement;\n 'pickCard': HTMLElement;\n 'repoChip': HTMLElement;\n 'saveSettings': HTMLButtonElement;\n 'sbomSearchInput': HTMLInputElement;\n 'sbomTable': HTMLElement;\n 'sbomTableBody': HTMLElement;\n 'sbomView': HTMLElement;\n 'searchOverlay': HTMLElement;\n 'searchResultList': HTMLElement;\n 'searchTriggerBtn': HTMLButtonElement;\n 'serverBtn': HTMLButtonElement;\n 'serverClose': HTMLButtonElement;\n 'serverDrawer': HTMLElement;\n 'serverModeNote': HTMLElement;\n 'serverScrim': HTMLElement;\n 'setApiKey': HTMLInputElement;\n 'setBaseUrl': HTMLInputElement;\n 'setModel': HTMLInputElement;\n 'settingsBtn': HTMLButtonElement;\n 'settingsDrawer': HTMLElement;\n 'settingsStatus': HTMLElement;\n 'srvAutoOpen': HTMLInputElement;\n 'srvConfigPath': HTMLElement;\n 'srvCopyKey': HTMLButtonElement;\n 'srvDomain': HTMLInputElement;\n 'srvDomainField': HTMLElement;\n 'srvEmail': HTMLInputElement;\n 'srvFreshKey': HTMLInputElement;\n 'srvFreshKeyRow': HTMLElement;\n 'srvHost': HTMLInputElement;\n 'srvHttps': HTMLInputElement;\n 'srvHttpsField': HTMLElement;\n 'srvHttpsStatus': HTMLElement;\n 'srvKeyHint': HTMLElement;\n 'srvKeyMasked': HTMLInputElement;\n 'srvKeySection': HTMLElement;\n 'srvLogout': HTMLButtonElement;\n 'srvMode': HTMLSelectElement;\n 'srvName': HTMLInputElement;\n 'srvPort': HTMLInputElement;\n 'srvRotate': HTMLButtonElement;\n 'srvSave': HTMLButtonElement;\n 'srvStatus': HTMLElement;\n 'srvTunnelCloudflare': HTMLInputElement;\n 'srvTunnelCloudflareStatus': HTMLElement;\n 'srvTunnelTailscale': HTMLInputElement;\n 'srvTunnelTailscaleStatus': HTMLElement;\n 'stackZone': HTMLElement;\n 'stageFilters': HTMLElement;\n 'stageFoot': HTMLElement;\n 'svgBtn': HTMLButtonElement;\n 'testSettings': HTMLButtonElement;\n 'testsToggle': HTMLButtonElement;\n 'themeBtn': HTMLButtonElement;\n 'toast': HTMLElement;\n 'tourCount': HTMLElement;\n 'tourExit': HTMLButtonElement;\n 'tourNext': HTMLButtonElement;\n 'tourPrev': HTMLButtonElement;\n 'tourTitle': HTMLElement;\n 'tourbar': HTMLElement;\n 'treeFilter': HTMLInputElement;\n 'viewTabs': HTMLElement;\n 'workflowsView': HTMLElement;\n}\n\n/** Delegated events may originate from a non-element node. */\nexport function eventElement(event: Event): HTMLElement | null {\n return event.target instanceof HTMLElement ? event.target : null;\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { BrowserDirectoryHandle } from '../browser.js';
2
+ import type { FileSource } from '../../shared/contracts.js';
3
+ export declare function canPickFolder(): boolean;
4
+ export declare function pickDirectory(): Promise<BrowserDirectoryHandle>;
5
+ export declare function browserFileSource(rootHandle: BrowserDirectoryHandle): FileSource;
@@ -1,47 +1,39 @@
1
- // FileSource over the File System Access API. The directory handle stays
2
- // alive after the scan so the AI-explain feature can re-read individual
3
- // files on demand. Chromium only — the caller feature-detects first.
4
-
1
+ // Browser folder handles stay in this tab and can be reused to preview source.
5
2
  export function canPickFolder() {
6
- return typeof window.showDirectoryPicker === 'function';
3
+ return typeof window.showDirectoryPicker === 'function';
7
4
  }
8
-
9
5
  export async function pickDirectory() {
10
- return window.showDirectoryPicker({ mode: 'read' });
6
+ if (!window.showDirectoryPicker)
7
+ throw new Error('This browser cannot pick folders.');
8
+ return window.showDirectoryPicker({ mode: 'read' });
11
9
  }
12
-
13
10
  export function browserFileSource(rootHandle) {
14
- const handles = new Map([['', rootHandle]]);
15
-
16
- const source = {
17
- kind: 'browser',
18
- root: rootHandle.name,
19
- name: rootHandle.name,
20
-
21
- async list(dir) {
22
- const handle = handles.get(dir);
23
- if (!handle) return [];
24
- const out = [];
25
- try {
26
- for await (const [name, child] of handle.entries()) {
27
- const path = dir ? dir + '/' + name : name;
28
- handles.set(path, child);
29
- out.push({ name, path, type: child.kind === 'directory' ? 'dir' : 'file' });
30
- }
31
- } catch {
32
- /* unreadable directory (permissions) — treat as empty */
33
- }
34
- return out;
35
- },
36
-
37
- async read(path) {
38
- const handle = handles.get(path);
39
- if (!handle) throw new Error('No handle for ' + path);
40
- const file = await handle.getFile();
41
- if (file.size > 400 * 1024) throw new Error('File too large to read');
42
- return file.text();
43
- },
44
- };
45
-
46
- return source;
11
+ const handles = new Map([['', rootHandle]]);
12
+ return {
13
+ kind: 'browser',
14
+ root: rootHandle.name,
15
+ name: rootHandle.name,
16
+ async list(directory) {
17
+ const handle = handles.get(directory);
18
+ if (!handle || handle.kind !== 'directory')
19
+ throw new Error('No directory handle for ' + directory);
20
+ const entries = [];
21
+ for await (const [name, child] of handle.entries()) {
22
+ const path = directory ? directory + '/' + name : name;
23
+ handles.set(path, child);
24
+ entries.push({ name, path, type: child.kind === 'directory' ? 'dir' : 'file' });
25
+ }
26
+ return entries;
27
+ },
28
+ async read(path) {
29
+ const handle = handles.get(path);
30
+ if (!handle || handle.kind !== 'file')
31
+ throw new Error('No file handle for ' + path);
32
+ const file = await handle.getFile();
33
+ if (file.size > 10 * 1024 * 1024)
34
+ throw new Error('File too large to read');
35
+ return file.text();
36
+ },
37
+ };
47
38
  }
39
+ //# sourceMappingURL=fileSourceBrowser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileSourceBrowser.js","sourceRoot":"","sources":["../../src/public/js/fileSourceBrowser.ts"],"names":[],"mappings":"AAGA,+EAA+E;AAC/E,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,MAAM,CAAC,mBAAmB,KAAK,UAAU,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC,MAAM,CAAC,mBAAmB;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACtF,OAAO,MAAM,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAAkC;IAClE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAqD,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAChG,OAAO;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,IAAI,EAAE,UAAU,CAAC,IAAI;QAErB,KAAK,CAAC,IAAI,CAAC,SAAiB;YAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,SAAS,CAAC,CAAC;YACpG,MAAM,OAAO,GAAgB,EAAE,CAAC;YAChC,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;gBACnD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAClF,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAY;YACrB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;YACrF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC5E,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { BrowserDirectoryHandle, BrowserFileHandle } from '../browser.js';\nimport type { FileSource, FileEntry } from '../../shared/contracts.js';\n\n// Browser folder handles stay in this tab and can be reused to preview source.\nexport function canPickFolder(): boolean {\n return typeof window.showDirectoryPicker === 'function';\n}\n\nexport async function pickDirectory(): Promise<BrowserDirectoryHandle> {\n if (!window.showDirectoryPicker) throw new Error('This browser cannot pick folders.');\n return window.showDirectoryPicker({ mode: 'read' });\n}\n\nexport function browserFileSource(rootHandle: BrowserDirectoryHandle): FileSource {\n const handles = new Map<string, BrowserDirectoryHandle | BrowserFileHandle>([['', rootHandle]]);\n return {\n kind: 'browser',\n root: rootHandle.name,\n name: rootHandle.name,\n\n async list(directory: string): Promise<FileEntry[]> {\n const handle = handles.get(directory);\n if (!handle || handle.kind !== 'directory') throw new Error('No directory handle for ' + directory);\n const entries: FileEntry[] = [];\n for await (const [name, child] of handle.entries()) {\n const path = directory ? directory + '/' + name : name;\n handles.set(path, child);\n entries.push({ name, path, type: child.kind === 'directory' ? 'dir' : 'file' });\n }\n return entries;\n },\n\n async read(path: string): Promise<string> {\n const handle = handles.get(path);\n if (!handle || handle.kind !== 'file') throw new Error('No file handle for ' + path);\n const file = await handle.getFile();\n if (file.size > 10 * 1024 * 1024) throw new Error('File too large to read');\n return file.text();\n },\n };\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export declare function initFlameGraph(canvas: any, options: any): {
2
+ update: () => void;
3
+ resize: () => void;
4
+ destroy: () => void;
5
+ };
@@ -1,75 +1,65 @@
1
1
  export function initFlameGraph(canvas, options) {
2
- const { layers = [], files = [], facts = {} } = options || {};
3
- const ctx = canvas.getContext('2d');
4
- let width = canvas.width;
5
- let height = canvas.height;
6
-
7
- function resize() {
8
- const rect = canvas.parentElement.getBoundingClientRect();
9
- canvas.width = rect.width;
10
- canvas.height = rect.height;
11
- width = canvas.width;
12
- height = canvas.height;
13
- render();
14
- }
15
-
16
- function getRiskColor(risk) {
17
- if (risk <= 33) return 'rgb(76, 175, 80)';
18
- if (risk <= 66) return 'rgb(255, 193, 7)';
19
- return 'rgb(244, 67, 54)';
20
- }
21
-
22
- let rects = [];
23
- let rootPath = null;
24
- let breadcrumb = [];
25
-
26
- function update() {
27
- render();
28
- }
29
-
30
- function render() {
31
- ctx.clearRect(0, 0, width, height);
32
- if (!layers || layers.length === 0) return;
33
-
34
- rects = [];
35
- const layerH = 30;
36
- const pad = 2;
37
-
38
- // A real flame graph needs hierarchical data. If layers is just a list of arrays,
39
- // we'll lay them out horizontally per layer for now.
40
-
41
- let y = height - layerH;
42
-
43
- for (let i = layers.length - 1; i >= 0; i--) {
44
- const layer = layers[i];
45
- let x = 0;
46
- let totalWeight = layer.length; // simplified
47
-
48
- for (const item of layer) {
49
- const w = (1 / totalWeight) * width;
50
- const risk = 0; // Find risk from facts if available
51
-
52
- ctx.fillStyle = getRiskColor(risk);
53
- ctx.fillRect(x + pad, y + pad, w - pad*2, layerH - pad*2);
54
-
55
- ctx.fillStyle = '#fff';
56
- ctx.font = '10px sans-serif';
57
- const txt = String(item).split('/').pop();
58
- if (w > 20) ctx.fillText(txt, x + pad + 2, y + 18);
59
-
60
- rects.push({ x, y, w, h: layerH, path: item });
61
- x += w;
62
- }
63
- y -= layerH;
2
+ const { layers = [], files = [], facts = {} } = options || {};
3
+ const ctx = canvas.getContext('2d');
4
+ let width = canvas.width;
5
+ let height = canvas.height;
6
+ function resize() {
7
+ const rect = canvas.parentElement.getBoundingClientRect();
8
+ canvas.width = rect.width;
9
+ canvas.height = rect.height;
10
+ width = canvas.width;
11
+ height = canvas.height;
12
+ render();
64
13
  }
65
- }
66
-
67
- window.addEventListener('resize', resize);
68
- resize();
69
-
70
- return {
71
- update,
72
- resize,
73
- destroy: () => window.removeEventListener('resize', resize)
74
- };
14
+ function getRiskColor(risk) {
15
+ if (risk <= 33)
16
+ return 'rgb(76, 175, 80)';
17
+ if (risk <= 66)
18
+ return 'rgb(255, 193, 7)';
19
+ return 'rgb(244, 67, 54)';
20
+ }
21
+ let rects = [];
22
+ let rootPath = null;
23
+ let breadcrumb = [];
24
+ function update() {
25
+ render();
26
+ }
27
+ function render() {
28
+ ctx.clearRect(0, 0, width, height);
29
+ if (!layers || layers.length === 0)
30
+ return;
31
+ rects = [];
32
+ const layerH = 30;
33
+ const pad = 2;
34
+ // A real flame graph needs hierarchical data. If layers is just a list of arrays,
35
+ // we'll lay them out horizontally per layer for now.
36
+ let y = height - layerH;
37
+ for (let i = layers.length - 1; i >= 0; i--) {
38
+ const layer = layers[i];
39
+ let x = 0;
40
+ let totalWeight = layer.length; // simplified
41
+ for (const item of layer) {
42
+ const w = (1 / totalWeight) * width;
43
+ const risk = 0; // Find risk from facts if available
44
+ ctx.fillStyle = getRiskColor(risk);
45
+ ctx.fillRect(x + pad, y + pad, w - pad * 2, layerH - pad * 2);
46
+ ctx.fillStyle = '#fff';
47
+ ctx.font = '10px sans-serif';
48
+ const txt = String(item).split('/').pop();
49
+ if (w > 20)
50
+ ctx.fillText(txt, x + pad + 2, y + 18);
51
+ rects.push({ x, y, w, h: layerH, path: item });
52
+ x += w;
53
+ }
54
+ y -= layerH;
55
+ }
56
+ }
57
+ window.addEventListener('resize', resize);
58
+ resize();
59
+ return {
60
+ update,
61
+ resize,
62
+ destroy: () => window.removeEventListener('resize', resize)
63
+ };
75
64
  }
65
+ //# sourceMappingURL=flameGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flameGraph.js","sourceRoot":"","sources":["../../src/public/js/flameGraph.ts"],"names":[],"mappings":"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","sourcesContent":["export function initFlameGraph(canvas, options) {\n const { layers = [], files = [], facts = {} } = options || {};\n const ctx = canvas.getContext('2d');\n let width = canvas.width;\n let height = canvas.height;\n \n function resize() {\n const rect = canvas.parentElement.getBoundingClientRect();\n canvas.width = rect.width;\n canvas.height = rect.height;\n width = canvas.width;\n height = canvas.height;\n render();\n }\n\n function getRiskColor(risk) {\n if (risk <= 33) return 'rgb(76, 175, 80)';\n if (risk <= 66) return 'rgb(255, 193, 7)';\n return 'rgb(244, 67, 54)';\n }\n\n let rects = [];\n let rootPath = null;\n let breadcrumb = [];\n\n function update() {\n render();\n }\n\n function render() {\n ctx.clearRect(0, 0, width, height);\n if (!layers || layers.length === 0) return;\n\n rects = [];\n const layerH = 30;\n const pad = 2;\n\n // A real flame graph needs hierarchical data. If layers is just a list of arrays,\n // we'll lay them out horizontally per layer for now.\n \n let y = height - layerH;\n \n for (let i = layers.length - 1; i >= 0; i--) {\n const layer = layers[i];\n let x = 0;\n let totalWeight = layer.length; // simplified\n \n for (const item of layer) {\n const w = (1 / totalWeight) * width;\n const risk = 0; // Find risk from facts if available\n \n ctx.fillStyle = getRiskColor(risk);\n ctx.fillRect(x + pad, y + pad, w - pad*2, layerH - pad*2);\n \n ctx.fillStyle = '#fff';\n ctx.font = '10px sans-serif';\n const txt = String(item).split('/').pop();\n if (w > 20) ctx.fillText(txt, x + pad + 2, y + 18);\n \n rects.push({ x, y, w, h: layerH, path: item });\n x += w;\n }\n y -= layerH;\n }\n }\n\n window.addEventListener('resize', resize);\n resize();\n\n return {\n update,\n resize,\n destroy: () => window.removeEventListener('resize', resize)\n };\n}\n"]}
@@ -0,0 +1,10 @@
1
+ export declare function initForceGraph(canvas: any, options?: any): {
2
+ update: (newNodes: any, newEdges: any, newComms: any) => void;
3
+ resize: () => void;
4
+ setActive: (value: boolean) => void;
5
+ fit: () => void;
6
+ reset: () => void;
7
+ search: (q: any) => void;
8
+ highlight: (path: any) => void;
9
+ destroy: () => void;
10
+ };