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
@@ -8,156 +8,197 @@
8
8
  // Three states for one button: draw, drawn (flip back to static), and drawing.
9
9
  // Nothing here is required for the app to work; with no endpoint configured the
10
10
  // button opens the settings drawer and says so.
11
-
12
- import { extractAIDiagram, matchNodeText } from '/shared/diagram/aiMermaid.js';
11
+ import { extractAIDiagram, matchNodeText } from '../../shared/diagram/aiMermaid.js';
13
12
  import { streamExplain } from './api.js';
14
13
  import { state, aiViewKey } from './state.js';
15
14
  import { gatherFileContext } from './repoFiles.js';
16
- import {
17
- diagramTarget, externalsFor, overviewFacts, layersFacts, servicesFacts,
18
- fileFacts, tourStopFacts, folderFacts,
19
- } from '/shared/diagram/aiFacts.js';
15
+ import { diagramTarget, externalsFor, overviewFacts, layersFacts, servicesFacts, fileFacts, tourStopFacts, folderFacts, } from '../../shared/diagram/aiFacts.js';
20
16
  import * as llm from './llm.js';
21
-
22
17
  const MAX_TOKENS = 4000;
23
- const PROGRESS_MS = 250;
24
-
18
+ const PROGRESS_MS = 1000;
25
19
  let btn = null;
26
20
  let statusEl = null;
27
21
  let nodeHost = null;
22
+ let pending = null;
28
23
  let hooks = {
29
- onRender: () => {},
30
- onOpenFile: () => {},
31
- onOpenSettings: () => {},
32
- onToast: () => {},
24
+ onRender: (..._args) => { },
25
+ onValidate: async (_source) => { },
26
+ onOpenFile: (..._args) => { },
27
+ onOpenSettings: (..._args) => { },
28
+ onToast: (..._args) => { },
33
29
  };
34
-
35
30
  export function initAiDraft(options) {
36
- btn = options.host;
37
- statusEl = options.statusEl;
38
- nodeHost = options.nodeHost;
39
- hooks = { ...hooks, ...options };
40
-
41
- btn.addEventListener('click', () => {
42
- const key = aiViewKey();
43
- if (state.aiActiveKey === key) {
44
- state.aiActiveKey = null; // back to static
45
- hooks.onRender();
46
- return;
47
- }
48
- if (state.aiDiagrams[key]) {
49
- state.aiActiveKey = key; // cached draft, instant
50
- hooks.onRender();
51
- return;
52
- }
53
- drawWithAI(key);
54
- });
31
+ btn = options.host;
32
+ statusEl = options.statusEl;
33
+ nodeHost = options.nodeHost;
34
+ hooks = { ...hooks, ...options };
35
+ btn.addEventListener('click', () => {
36
+ if (pending) {
37
+ stopAiDraft();
38
+ updateAiBtn();
39
+ hooks.onToast('Sketch cancelled.');
40
+ return;
41
+ }
42
+ const key = aiViewKey();
43
+ if (state.aiActiveKey === key) {
44
+ state.aiActiveKey = null; // back to static
45
+ updateAiBtn(key);
46
+ hooks.onRender();
47
+ return;
48
+ }
49
+ if (state.aiDiagrams[key]) {
50
+ state.aiActiveKey = key; // cached draft, instant
51
+ updateAiBtn(key);
52
+ hooks.onRender();
53
+ return;
54
+ }
55
+ return drawWithAI(key);
56
+ });
55
57
  }
56
-
57
58
  // Which of the three things the button currently offers. Called on every canvas
58
59
  // render, because the answer depends on the view.
59
60
  export function updateAiBtn(key = aiViewKey()) {
60
- btn.hidden = state.view === 'docs' || state.view === 'about'
61
- || (state.view === 'atlas' && !state.atlasOpen);
62
- if (state.aiActiveKey === key) {
63
- btn.textContent = 'Static';
64
- btn.title = 'Back to the static diagram';
65
- } else {
66
- btn.textContent = state.aiDiagrams[key] ? 'AI draft ✓' : 'AI draft';
67
- btn.title = 'Ask the AI to draw this view';
68
- }
61
+ if (pending && (pending.scan !== state.scan || pending.key !== key))
62
+ stopAiDraft();
63
+ btn.hidden = state.view === 'docs' || state.view === 'about'
64
+ || (state.view === 'atlas' && !state.atlasOpen);
65
+ if (pending) {
66
+ btn.textContent = 'Cancel sketch';
67
+ btn.title = 'Stop generating this sketch';
68
+ btn.setAttribute('aria-busy', 'true');
69
+ }
70
+ else if (state.aiActiveKey === key) {
71
+ btn.textContent = 'Static';
72
+ btn.title = 'Back to the static diagram';
73
+ }
74
+ else {
75
+ btn.textContent = state.aiDiagrams[key] ? 'AI sketch ✓' : 'AI sketch';
76
+ btn.title = 'Ask the AI to draw this view';
77
+ }
78
+ if (!pending)
79
+ btn.removeAttribute('aria-busy');
80
+ }
81
+ export function stopAiDraft() {
82
+ pending?.controller.abort();
83
+ pending = null;
84
+ if (statusEl)
85
+ statusEl.hidden = true;
86
+ statusEl?.removeAttribute('aria-busy');
69
87
  }
70
-
71
88
  // AI nodes carry no stable ids — clicks are matched by label text instead.
72
89
  export function wireAIClicks() {
73
- for (const g of nodeHost.querySelectorAll('g.node')) {
74
- const path = matchNodeText(g.textContent, state.scan.files);
75
- if (!path) continue;
76
- g.style.cursor = 'pointer';
77
- g.addEventListener('click', (event) => {
78
- event.stopPropagation();
79
- hooks.onOpenFile(path);
80
- });
81
- }
90
+ for (const g of nodeHost.querySelectorAll('g.node')) {
91
+ const path = matchNodeText(g.textContent, state.scan.files);
92
+ if (!path)
93
+ continue;
94
+ g.style.cursor = 'pointer';
95
+ g.addEventListener('click', (event) => {
96
+ event.stopPropagation();
97
+ hooks.onOpenFile(path);
98
+ });
99
+ }
82
100
  }
83
-
84
101
  async function drawWithAI(key) {
85
- if (!llm.isConfigured()) {
86
- hooks.onOpenSettings();
87
- hooks.onToast('Add an endpoint and model first.');
88
- return;
89
- }
90
- const settings = llm.getSettings();
91
- btn.disabled = true;
92
- btn.textContent = 'drawing…';
93
- statusEl.hidden = false;
94
-
95
- // Live progress: elapsed time plus how much the model has written so far. A
96
- // reasoning model can be quiet for half a minute, and a canvas that says
97
- // nothing is indistinguishable from one that has hung.
98
- const startedAt = Date.now();
99
- let received = 0;
100
- const tick = () => {
101
- const secs = Math.round((Date.now() - startedAt) / 1000);
102
- const kb = received >= 1000 ? (received / 1000).toFixed(1) + 'k' : String(received);
103
- statusEl.textContent = `The AI is sketching this view… ${kb} chars · ${secs}s`;
104
- };
105
- tick();
106
- const progressTimer = setInterval(tick, PROGRESS_MS);
107
-
108
- try {
109
- const { kind, facts } = await factsForView();
110
- const messages = llm.diagramMessages({ repoName: state.scan.name, kind, facts });
111
- let text = '';
112
- // Big budget, and no visible thinking where the dialect allows it:
113
- // reasoning models otherwise spend the whole allowance before a single
114
- // diagram line appears. Azure rejects that parameter outright.
115
- const providerOptions = llm.isAzureHost(settings.baseUrl) ? {} : { reasoning: { exclude: true } };
116
- for await (const delta of streamExplain({ ...settings, messages, maxTokens: MAX_TOKENS, providerOptions })) {
117
- text += delta;
118
- received += delta.length;
102
+ if (!llm.isConfigured()) {
103
+ hooks.onOpenSettings();
104
+ hooks.onToast('Choose Hermes or an endpoint in AI connection first.');
105
+ return;
119
106
  }
120
- const parsed = extractAIDiagram(text);
121
- if (!parsed) throw new Error('The model answered without a diagram. Try again.');
122
- state.aiDiagrams[key] = { body: parsed.body, caption: parsed.caption };
123
- state.aiActiveKey = key;
124
- statusEl.hidden = true;
125
- hooks.onRender();
126
- } catch (err) {
127
- statusEl.hidden = true;
128
- hooks.onToast(err.message);
129
- } finally {
130
- clearInterval(progressTimer);
131
- btn.disabled = false;
107
+ if (!state.scan)
108
+ return;
109
+ const settings = llm.getSettings();
110
+ const job = pending = { key, scan: state.scan, controller: new AbortController() };
132
111
  updateAiBtn(key);
133
- }
112
+ statusEl.hidden = false;
113
+ statusEl.setAttribute('aria-busy', 'true');
114
+ // Live progress: elapsed time plus how much the model has written so far. A
115
+ // reasoning model can be quiet for half a minute, and a canvas that says
116
+ // nothing is indistinguishable from one that has hung.
117
+ const startedAt = Date.now();
118
+ let received = 0;
119
+ const tick = () => {
120
+ if (pending !== job)
121
+ return;
122
+ const secs = Math.round((Date.now() - startedAt) / 1000);
123
+ const kb = received >= 1000 ? (received / 1000).toFixed(1) + 'k' : String(received);
124
+ statusEl.textContent = `${settings.connection === 'hermes' ? 'Hermes' : 'The AI'} is sketching this view… ${kb} chars · ${secs}s`;
125
+ };
126
+ tick();
127
+ const progressTimer = setInterval(tick, PROGRESS_MS);
128
+ try {
129
+ const { kind, facts } = await factsForView();
130
+ job.controller.signal.throwIfAborted();
131
+ const messages = llm.diagramMessages({ repoName: job.scan.name, kind, facts });
132
+ let text = '';
133
+ // Big budget, and no visible thinking where the dialect allows it:
134
+ // reasoning models otherwise spend the whole allowance before a single
135
+ // diagram line appears. Azure rejects that parameter outright.
136
+ const providerOptions = llm.isAzureHost(settings.baseUrl) ? {} : { reasoning: { exclude: true } };
137
+ for await (const delta of streamExplain({ ...settings, messages, maxTokens: MAX_TOKENS, providerOptions, purpose: 'diagram', signal: job.controller.signal })) {
138
+ text += delta;
139
+ received += delta.length;
140
+ if (text.length > 120000)
141
+ throw new Error('The sketch was too large. Try a smaller folder or file.');
142
+ }
143
+ job.controller.signal.throwIfAborted();
144
+ const parsed = extractAIDiagram(text);
145
+ if (!parsed)
146
+ throw new Error('The model answered without a diagram. Try again.');
147
+ try {
148
+ await hooks.onValidate(parsed.body);
149
+ }
150
+ catch {
151
+ throw new Error('The AI returned a diagram that could not be drawn. Try again.');
152
+ }
153
+ job.controller.signal.throwIfAborted();
154
+ if (pending !== job || state.scan !== job.scan || aiViewKey() !== key)
155
+ return;
156
+ state.aiDiagrams[key] = { body: parsed.body, caption: parsed.caption };
157
+ state.aiActiveKey = key;
158
+ statusEl.hidden = true;
159
+ await hooks.onRender();
160
+ }
161
+ catch (err) {
162
+ if (pending === job && !job.controller.signal.aborted) {
163
+ statusEl.hidden = true;
164
+ hooks.onToast(err.message);
165
+ }
166
+ }
167
+ finally {
168
+ clearInterval(progressTimer);
169
+ if (pending === job) {
170
+ pending = null;
171
+ statusEl.removeAttribute('aria-busy');
172
+ updateAiBtn();
173
+ }
174
+ }
134
175
  }
135
-
136
176
  // Picks the sheet for the current view and fetches the source the file-shaped
137
177
  // ones need. The choosing is pure and tested in aiFacts.js; this is the read.
138
178
  async function factsForView() {
139
- const { scan, facts, manifest, patterns } = state;
140
- const target = diagramTarget(state);
141
-
142
- switch (target.view) {
143
- case 'map': return overviewFacts(scan, facts);
144
- case 'patterns': return layersFacts(facts, patterns);
145
- case 'services': return servicesFacts(scan, manifest);
146
- case 'tour': {
147
- const stop = state.tour.stops[state.tour.idx];
148
- if (!stop) return tourStopFacts({ stop: null });
149
- return tourStopFacts({
150
- ctx: await gatherFileContext(target.path),
151
- externals: externalsFor(scan, target.path),
152
- stop,
153
- index: state.tour.idx,
154
- total: state.tour.stops.length,
155
- });
179
+ const { scan, facts, manifest, patterns } = state;
180
+ const target = diagramTarget(state);
181
+ switch (target.view) {
182
+ case 'map': return overviewFacts(scan, facts);
183
+ case 'patterns': return layersFacts(facts, patterns);
184
+ case 'services': return servicesFacts(scan, manifest);
185
+ case 'tour': {
186
+ const stop = state.tour.stops[state.tour.idx];
187
+ if (!stop)
188
+ return tourStopFacts({ stop: null });
189
+ return tourStopFacts({
190
+ ctx: await gatherFileContext(target.path),
191
+ externals: externalsFor(scan, target.path),
192
+ stop,
193
+ index: state.tour.idx,
194
+ total: state.tour.stops.length,
195
+ });
196
+ }
197
+ case 'file': return fileFacts({
198
+ ctx: await gatherFileContext(target.path),
199
+ externals: externalsFor(scan, target.path),
200
+ });
201
+ default: return folderFacts(scan, facts, target.path);
156
202
  }
157
- case 'file': return fileFacts({
158
- ctx: await gatherFileContext(target.path),
159
- externals: externalsFor(scan, target.path),
160
- });
161
- default: return folderFacts(scan, facts, target.path);
162
- }
163
203
  }
204
+ //# sourceMappingURL=aiDraft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiDraft.js","sourceRoot":"","sources":["../../src/public/js/aiDraft.ts"],"names":[],"mappings":"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","sourcesContent":["// The \"AI draft\" button: ask a model to redraw whatever the canvas is showing.\n//\n// Every view has a static diagram built from the import graph, and that is what\n// loads. This is the optional second opinion — the model gets a fact sheet (see\n// aiFacts.js) and answers with Mermaid, which is cached per view so flipping\n// between the two is instant afterwards.\n//\n// Three states for one button: draw, drawn (flip back to static), and drawing.\n// Nothing here is required for the app to work; with no endpoint configured the\n// button opens the settings drawer and says so.\n\nimport { extractAIDiagram, matchNodeText } from '../../shared/diagram/aiMermaid.js';\nimport { streamExplain } from './api.js';\nimport { state, aiViewKey } from './state.js';\nimport { gatherFileContext } from './repoFiles.js';\nimport {\n diagramTarget, externalsFor, overviewFacts, layersFacts, servicesFacts,\n fileFacts, tourStopFacts, folderFacts,\n} from '../../shared/diagram/aiFacts.js';\nimport * as llm from './llm.js';\n\nconst MAX_TOKENS = 4000;\nconst PROGRESS_MS = 1000;\n\nlet btn = null;\nlet statusEl = null;\nlet nodeHost = null;\nlet pending: { key: string; scan: typeof state.scan; controller: AbortController } | null = null;\nlet hooks = {\n onRender: (..._args: unknown[]) => {},\n onValidate: async (_source: string) => {},\n onOpenFile: (..._args: unknown[]) => {},\n onOpenSettings: (..._args: unknown[]) => {},\n onToast: (..._args: unknown[]) => {},\n};\n\nexport function initAiDraft(options) {\n btn = options.host;\n statusEl = options.statusEl;\n nodeHost = options.nodeHost;\n hooks = { ...hooks, ...options };\n\n btn.addEventListener('click', () => {\n if (pending) { stopAiDraft(); updateAiBtn(); hooks.onToast('Sketch cancelled.'); return; }\n const key = aiViewKey();\n if (state.aiActiveKey === key) {\n state.aiActiveKey = null; // back to static\n updateAiBtn(key);\n hooks.onRender();\n return;\n }\n if (state.aiDiagrams[key]) {\n state.aiActiveKey = key; // cached draft, instant\n updateAiBtn(key);\n hooks.onRender();\n return;\n }\n return drawWithAI(key);\n });\n}\n\n// Which of the three things the button currently offers. Called on every canvas\n// render, because the answer depends on the view.\nexport function updateAiBtn(key = aiViewKey()) {\n if (pending && (pending.scan !== state.scan || pending.key !== key)) stopAiDraft();\n btn.hidden = state.view === 'docs' || state.view === 'about'\n || (state.view === 'atlas' && !state.atlasOpen);\n if (pending) {\n btn.textContent = 'Cancel sketch';\n btn.title = 'Stop generating this sketch';\n btn.setAttribute('aria-busy', 'true');\n } else if (state.aiActiveKey === key) {\n btn.textContent = 'Static';\n btn.title = 'Back to the static diagram';\n } else {\n btn.textContent = state.aiDiagrams[key] ? 'AI sketch ✓' : 'AI sketch';\n btn.title = 'Ask the AI to draw this view';\n }\n if (!pending) btn.removeAttribute('aria-busy');\n}\n\nexport function stopAiDraft() {\n pending?.controller.abort();\n pending = null;\n if (statusEl) statusEl.hidden = true;\n statusEl?.removeAttribute('aria-busy');\n}\n\n// AI nodes carry no stable ids — clicks are matched by label text instead.\nexport function wireAIClicks() {\n for (const g of nodeHost.querySelectorAll('g.node')) {\n const path = matchNodeText(g.textContent, state.scan.files);\n if (!path) continue;\n g.style.cursor = 'pointer';\n g.addEventListener('click', (event) => {\n event.stopPropagation();\n hooks.onOpenFile(path);\n });\n }\n}\n\nasync function drawWithAI(key) {\n if (!llm.isConfigured()) {\n hooks.onOpenSettings();\n hooks.onToast('Choose Hermes or an endpoint in AI connection first.');\n return;\n }\n if (!state.scan) return;\n const settings = llm.getSettings();\n const job = pending = { key, scan: state.scan, controller: new AbortController() };\n updateAiBtn(key);\n statusEl.hidden = false;\n statusEl.setAttribute('aria-busy', 'true');\n\n // Live progress: elapsed time plus how much the model has written so far. A\n // reasoning model can be quiet for half a minute, and a canvas that says\n // nothing is indistinguishable from one that has hung.\n const startedAt = Date.now();\n let received = 0;\n const tick = () => {\n if (pending !== job) return;\n const secs = Math.round((Date.now() - startedAt) / 1000);\n const kb = received >= 1000 ? (received / 1000).toFixed(1) + 'k' : String(received);\n statusEl.textContent = `${settings.connection === 'hermes' ? 'Hermes' : 'The AI'} is sketching this view… ${kb} chars · ${secs}s`;\n };\n tick();\n const progressTimer = setInterval(tick, PROGRESS_MS);\n\n try {\n const { kind, facts } = await factsForView();\n job.controller.signal.throwIfAborted();\n const messages = llm.diagramMessages({ repoName: job.scan.name, kind, facts });\n let text = '';\n // Big budget, and no visible thinking where the dialect allows it:\n // reasoning models otherwise spend the whole allowance before a single\n // diagram line appears. Azure rejects that parameter outright.\n const providerOptions = llm.isAzureHost(settings.baseUrl) ? {} : { reasoning: { exclude: true } };\n for await (const delta of streamExplain({ ...settings, messages, maxTokens: MAX_TOKENS, providerOptions, purpose: 'diagram', signal: job.controller.signal })) {\n text += delta;\n received += delta.length;\n if (text.length > 120000) throw new Error('The sketch was too large. Try a smaller folder or file.');\n }\n job.controller.signal.throwIfAborted();\n const parsed = extractAIDiagram(text);\n if (!parsed) throw new Error('The model answered without a diagram. Try again.');\n try { await hooks.onValidate(parsed.body); }\n catch { throw new Error('The AI returned a diagram that could not be drawn. Try again.'); }\n job.controller.signal.throwIfAborted();\n if (pending !== job || state.scan !== job.scan || aiViewKey() !== key) return;\n state.aiDiagrams[key] = { body: parsed.body, caption: parsed.caption };\n state.aiActiveKey = key;\n statusEl.hidden = true;\n await hooks.onRender();\n } catch (err) {\n if (pending === job && !job.controller.signal.aborted) {\n statusEl.hidden = true;\n hooks.onToast(err.message);\n }\n } finally {\n clearInterval(progressTimer);\n if (pending === job) { pending = null; statusEl.removeAttribute('aria-busy'); updateAiBtn(); }\n }\n}\n\n// Picks the sheet for the current view and fetches the source the file-shaped\n// ones need. The choosing is pure and tested in aiFacts.js; this is the read.\nasync function factsForView() {\n const { scan, facts, manifest, patterns } = state;\n const target = diagramTarget(state);\n\n switch (target.view) {\n case 'map': return overviewFacts(scan, facts);\n case 'patterns': return layersFacts(facts, patterns);\n case 'services': return servicesFacts(scan, manifest);\n case 'tour': {\n const stop = state.tour.stops[state.tour.idx];\n if (!stop) return tourStopFacts({ stop: null });\n return tourStopFacts({\n ctx: await gatherFileContext(target.path),\n externals: externalsFor(scan, target.path),\n stop,\n index: state.tour.idx,\n total: state.tour.stops.length,\n });\n }\n case 'file': return fileFacts({\n ctx: await gatherFileContext(target.path),\n externals: externalsFor(scan, target.path),\n });\n default: return folderFacts(scan, facts, target.path);\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export declare function subscribeAnalysis(listener: any): () => boolean;
2
+ export declare function ensureToolsStatus(force?: boolean): Promise<any>;
3
+ export declare function runDeepAnalysis(options?: Record<string, any>): Promise<any>;
4
+ export declare function installEngine(id: any): Promise<any>;
5
+ export declare function runOutcomeMessage(report: any): string;
6
+ export declare function initAnalysisPanel(options: any): void;
7
+ export declare function renderAnalysisPanel(): void;