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
@@ -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('Choose Hermes or an endpoint in AI connection 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 ${escapeHtml(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 AI connection 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 AI connection configured — open the AI connection 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('Choose Hermes or an endpoint in AI connection 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 ${escapeHtml(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,197 @@
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
+ 'setConnection': HTMLSelectElement;
127
+ 'apiConnection': HTMLElement;
128
+ 'hermesConnection': HTMLElement;
129
+ 'hermesConnectionStatus': HTMLElement;
130
+ 'hermesModel': HTMLElement;
131
+ 'hermesProvider': HTMLElement;
132
+ 'refreshHermes': HTMLButtonElement;
133
+ 'aiConnectionNote': HTMLElement;
134
+ 'sbomSearchInput': HTMLInputElement;
135
+ 'sbomTable': HTMLElement;
136
+ 'sbomTableBody': HTMLElement;
137
+ 'sbomView': HTMLElement;
138
+ 'searchOverlay': HTMLElement;
139
+ 'searchResultList': HTMLElement;
140
+ 'searchTriggerBtn': HTMLButtonElement;
141
+ 'serverBtn': HTMLButtonElement;
142
+ 'serverClose': HTMLButtonElement;
143
+ 'serverDrawer': HTMLElement;
144
+ 'serverModeNote': HTMLElement;
145
+ 'serverScrim': HTMLElement;
146
+ 'setApiKey': HTMLInputElement;
147
+ 'setBaseUrl': HTMLInputElement;
148
+ 'setModel': HTMLInputElement;
149
+ 'settingsBtn': HTMLButtonElement;
150
+ 'settingsDrawer': HTMLElement;
151
+ 'settingsStatus': HTMLElement;
152
+ 'srvAutoOpen': HTMLInputElement;
153
+ 'srvConfigPath': HTMLElement;
154
+ 'srvCopyKey': HTMLButtonElement;
155
+ 'srvDomain': HTMLInputElement;
156
+ 'srvDomainField': HTMLElement;
157
+ 'srvEmail': HTMLInputElement;
158
+ 'srvFreshKey': HTMLInputElement;
159
+ 'srvFreshKeyRow': HTMLElement;
160
+ 'srvHost': HTMLInputElement;
161
+ 'srvHttps': HTMLInputElement;
162
+ 'srvHttpsField': HTMLElement;
163
+ 'srvHttpsStatus': HTMLElement;
164
+ 'srvKeyHint': HTMLElement;
165
+ 'srvKeyMasked': HTMLInputElement;
166
+ 'srvKeySection': HTMLElement;
167
+ 'srvLogout': HTMLButtonElement;
168
+ 'srvMode': HTMLSelectElement;
169
+ 'srvName': HTMLInputElement;
170
+ 'srvPort': HTMLInputElement;
171
+ 'srvRotate': HTMLButtonElement;
172
+ 'srvSave': HTMLButtonElement;
173
+ 'srvStatus': HTMLElement;
174
+ 'srvTunnelCloudflare': HTMLInputElement;
175
+ 'srvTunnelCloudflareStatus': HTMLElement;
176
+ 'srvTunnelTailscale': HTMLInputElement;
177
+ 'srvTunnelTailscaleStatus': HTMLElement;
178
+ 'stackZone': HTMLElement;
179
+ 'stageFilters': HTMLElement;
180
+ 'stageFoot': HTMLElement;
181
+ 'svgBtn': HTMLButtonElement;
182
+ 'testSettings': HTMLButtonElement;
183
+ 'testsToggle': HTMLButtonElement;
184
+ 'themeBtn': HTMLButtonElement;
185
+ 'toast': HTMLElement;
186
+ 'tourCount': HTMLElement;
187
+ 'tourExit': HTMLButtonElement;
188
+ 'tourNext': HTMLButtonElement;
189
+ 'tourPrev': HTMLButtonElement;
190
+ 'tourTitle': HTMLElement;
191
+ 'tourbar': HTMLElement;
192
+ 'treeFilter': HTMLInputElement;
193
+ 'viewTabs': HTMLElement;
194
+ 'workflowsView': HTMLElement;
195
+ }
196
+ /** Delegated events may originate from a non-element node. */
197
+ 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":"AAoMA,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 'setConnection': HTMLSelectElement;\n 'apiConnection': HTMLElement;\n 'hermesConnection': HTMLElement;\n 'hermesConnectionStatus': HTMLElement;\n 'hermesModel': HTMLElement;\n 'hermesProvider': HTMLElement;\n 'refreshHermes': HTMLButtonElement;\n 'aiConnectionNote': HTMLElement;\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
+ };