codebase-onboarder 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/README.md +174 -46
  2. package/bin/build-if-source.js +23 -0
  3. package/cli/commands.d.ts +26 -0
  4. package/cli/commands.js +836 -811
  5. package/cli/commands.js.map +1 -0
  6. package/cli/explorer/advanced.d.ts +14 -0
  7. package/cli/explorer/advanced.js +321 -329
  8. package/cli/explorer/advanced.js.map +1 -0
  9. package/cli/explorer/app.d.ts +1 -0
  10. package/cli/explorer/app.js +384 -313
  11. package/cli/explorer/app.js.map +1 -0
  12. package/cli/explorer/assistant.d.ts +9 -0
  13. package/cli/explorer/assistant.js +58 -0
  14. package/cli/explorer/assistant.js.map +1 -0
  15. package/cli/explorer/commands.d.ts +17 -0
  16. package/cli/explorer/commands.js +368 -302
  17. package/cli/explorer/commands.js.map +1 -0
  18. package/cli/explorer/featureViews.d.ts +124 -0
  19. package/cli/explorer/featureViews.js +179 -0
  20. package/cli/explorer/featureViews.js.map +1 -0
  21. package/cli/explorer/github.d.ts +21 -0
  22. package/cli/explorer/github.js +42 -44
  23. package/cli/explorer/github.js.map +1 -0
  24. package/cli/explorer/graphs.d.ts +7 -0
  25. package/cli/explorer/graphs.js +90 -95
  26. package/cli/explorer/graphs.js.map +1 -0
  27. package/cli/explorer/picker.d.ts +22 -0
  28. package/cli/explorer/picker.js +150 -0
  29. package/cli/explorer/picker.js.map +1 -0
  30. package/cli/explorer/report.d.ts +85 -0
  31. package/cli/explorer/report.js +60 -0
  32. package/cli/explorer/report.js.map +1 -0
  33. package/cli/explorer/session.d.ts +449 -0
  34. package/cli/explorer/session.js +143 -144
  35. package/cli/explorer/session.js.map +1 -0
  36. package/cli/explorer/views.d.ts +19 -0
  37. package/cli/explorer/views.js +465 -482
  38. package/cli/explorer/views.js.map +1 -0
  39. package/cli/explorer/wrap.d.ts +1 -0
  40. package/cli/explorer/wrap.js +28 -44
  41. package/cli/explorer/wrap.js.map +1 -0
  42. package/cli/main.d.ts +1 -0
  43. package/cli/main.js +214 -161
  44. package/cli/main.js.map +1 -0
  45. package/cli/prompt.d.ts +5 -0
  46. package/cli/prompt.js +84 -80
  47. package/cli/prompt.js.map +1 -0
  48. package/cli/scanOptions.d.ts +2 -0
  49. package/cli/scanOptions.js +11 -0
  50. package/cli/scanOptions.js.map +1 -0
  51. package/cli/ui.d.ts +33 -0
  52. package/cli/ui.js +35 -44
  53. package/cli/ui.js.map +1 -0
  54. package/cli/wizard.d.ts +187 -0
  55. package/cli/wizard.js +304 -284
  56. package/cli/wizard.js.map +1 -0
  57. package/package.json +15 -4
  58. package/public/app.d.ts +1 -0
  59. package/public/app.js +1057 -1009
  60. package/public/app.js.map +1 -0
  61. package/public/browser.d.ts +68 -0
  62. package/public/browser.js +2 -0
  63. package/public/browser.js.map +1 -0
  64. package/public/index.html +30 -13
  65. package/public/js/about.d.ts +6 -0
  66. package/public/js/about.js +152 -172
  67. package/public/js/about.js.map +1 -0
  68. package/public/js/aiDraft.d.ts +3 -0
  69. package/public/js/aiDraft.js +116 -124
  70. package/public/js/aiDraft.js.map +1 -0
  71. package/public/js/analysisPanel.d.ts +7 -0
  72. package/public/js/analysisPanel.js +166 -166
  73. package/public/js/analysisPanel.js.map +1 -0
  74. package/public/js/analysisReport.d.ts +38 -0
  75. package/public/js/analysisReport.js +105 -110
  76. package/public/js/analysisReport.js.map +1 -0
  77. package/public/js/api.d.ts +26 -0
  78. package/public/js/api.js +176 -167
  79. package/public/js/api.js.map +1 -0
  80. package/public/js/atlas.d.ts +6 -0
  81. package/public/js/atlas.js +50 -58
  82. package/public/js/atlas.js.map +1 -0
  83. package/public/js/blameView.d.ts +2 -0
  84. package/public/js/blameView.js +36 -37
  85. package/public/js/blameView.js.map +1 -0
  86. package/public/js/codeTab.d.ts +3 -0
  87. package/public/js/codeTab.js +175 -180
  88. package/public/js/codeTab.js.map +1 -0
  89. package/public/js/codeViewer.d.ts +5 -0
  90. package/public/js/codeViewer.js +162 -150
  91. package/public/js/codeViewer.js.map +1 -0
  92. package/public/js/components/FileChip.d.ts +9 -0
  93. package/public/js/components/FileChip.js +45 -49
  94. package/public/js/components/FileChip.js.map +1 -0
  95. package/public/js/components/MetricSparkline.d.ts +7 -0
  96. package/public/js/components/MetricSparkline.js +35 -44
  97. package/public/js/components/MetricSparkline.js.map +1 -0
  98. package/public/js/components/RiskBadge.d.ts +9 -0
  99. package/public/js/components/RiskBadge.js +55 -63
  100. package/public/js/components/RiskBadge.js.map +1 -0
  101. package/public/js/deepAnalysisView.d.ts +99 -0
  102. package/public/js/deepAnalysisView.js +282 -302
  103. package/public/js/deepAnalysisView.js.map +1 -0
  104. package/public/js/diagramPane.d.ts +8 -0
  105. package/public/js/diagramPane.js +133 -135
  106. package/public/js/diagramPane.js.map +1 -0
  107. package/public/js/diffView.d.ts +6 -0
  108. package/public/js/diffView.js +222 -209
  109. package/public/js/diffView.js.map +1 -0
  110. package/public/js/docsView.d.ts +2 -0
  111. package/public/js/docsView.js +441 -442
  112. package/public/js/docsView.js.map +1 -0
  113. package/public/js/dom.d.ts +189 -0
  114. package/public/js/dom.js +5 -0
  115. package/public/js/dom.js.map +1 -0
  116. package/public/js/fileSourceBrowser.d.ts +5 -0
  117. package/public/js/fileSourceBrowser.js +33 -41
  118. package/public/js/fileSourceBrowser.js.map +1 -0
  119. package/public/js/flameGraph.d.ts +5 -0
  120. package/public/js/flameGraph.js +62 -72
  121. package/public/js/flameGraph.js.map +1 -0
  122. package/public/js/forceGraph.d.ts +10 -0
  123. package/public/js/forceGraph.js +581 -556
  124. package/public/js/forceGraph.js.map +1 -0
  125. package/public/js/heatmap.d.ts +4 -0
  126. package/public/js/heatmap.js +142 -164
  127. package/public/js/heatmap.js.map +1 -0
  128. package/public/js/highlight.d.ts +2 -0
  129. package/public/js/highlight.js +116 -107
  130. package/public/js/highlight.js.map +1 -0
  131. package/public/js/html.d.ts +2 -0
  132. package/public/js/html.js +14 -44
  133. package/public/js/html.js.map +1 -0
  134. package/public/js/insightsView.d.ts +5 -0
  135. package/public/js/insightsView.js +93 -111
  136. package/public/js/insightsView.js.map +1 -0
  137. package/public/js/inspector.d.ts +37 -0
  138. package/public/js/inspector.js +416 -445
  139. package/public/js/inspector.js.map +1 -0
  140. package/public/js/llm.d.ts +113 -0
  141. package/public/js/llm.js +233 -272
  142. package/public/js/llm.js.map +1 -0
  143. package/public/js/mapView.d.ts +3 -0
  144. package/public/js/mapView.js +121 -120
  145. package/public/js/mapView.js.map +1 -0
  146. package/public/js/markdown.d.ts +3 -0
  147. package/public/js/markdown.js +84 -91
  148. package/public/js/markdown.js.map +1 -0
  149. package/public/js/mindmap.d.ts +32 -0
  150. package/public/js/mindmap.js +244 -259
  151. package/public/js/mindmap.js.map +1 -0
  152. package/public/js/mobilePanels.d.ts +5 -0
  153. package/public/js/mobilePanels.js +50 -0
  154. package/public/js/mobilePanels.js.map +1 -0
  155. package/public/js/repoFiles.d.ts +12 -0
  156. package/public/js/repoFiles.js +28 -27
  157. package/public/js/repoFiles.js.map +1 -0
  158. package/public/js/reviewView.d.ts +28 -0
  159. package/public/js/reviewView.js +256 -0
  160. package/public/js/reviewView.js.map +1 -0
  161. package/public/js/sbomView.d.ts +3 -0
  162. package/public/js/sbomView.js +59 -67
  163. package/public/js/sbomView.js.map +1 -0
  164. package/public/js/scanCache.d.ts +16 -0
  165. package/public/js/scanCache.js +67 -65
  166. package/public/js/scanCache.js.map +1 -0
  167. package/public/js/search.d.ts +7 -0
  168. package/public/js/search.js +868 -800
  169. package/public/js/search.js.map +1 -0
  170. package/public/js/searchLocal.d.ts +42 -0
  171. package/public/js/searchLocal.js +87 -0
  172. package/public/js/searchLocal.js.map +1 -0
  173. package/public/js/serverSettings.d.ts +5 -0
  174. package/public/js/serverSettings.js +153 -164
  175. package/public/js/serverSettings.js.map +1 -0
  176. package/public/js/state.d.ts +798 -0
  177. package/public/js/state.js +114 -122
  178. package/public/js/state.js.map +1 -0
  179. package/public/js/tour.d.ts +6 -0
  180. package/public/js/tour.js +5 -7
  181. package/public/js/tour.js.map +1 -0
  182. package/public/js/transitions.d.ts +2 -0
  183. package/public/js/transitions.js +9 -10
  184. package/public/js/transitions.js.map +1 -0
  185. package/public/js/tree.d.ts +12 -0
  186. package/public/js/tree.js +157 -154
  187. package/public/js/tree.js.map +1 -0
  188. package/public/js/workflowsView.d.ts +3 -0
  189. package/public/js/workflowsView.js +15 -22
  190. package/public/js/workflowsView.js.map +1 -0
  191. package/public/search.css +495 -0
  192. package/public/styles.css +163 -346
  193. package/public/workbench.css +166 -0
  194. package/server/apiAuth.d.ts +3 -0
  195. package/server/apiAuth.js +18 -20
  196. package/server/apiAuth.js.map +1 -0
  197. package/server/apiDiff.d.ts +2 -0
  198. package/server/apiDiff.js +20 -18
  199. package/server/apiDiff.js.map +1 -0
  200. package/server/apiDocs.d.ts +2 -0
  201. package/server/apiDocs.js +38 -40
  202. package/server/apiDocs.js.map +1 -0
  203. package/server/apiFile.d.ts +1 -0
  204. package/server/apiFile.js +14 -17
  205. package/server/apiFile.js.map +1 -0
  206. package/server/apiGitBlame.d.ts +2 -0
  207. package/server/apiGitBlame.js +50 -51
  208. package/server/apiGitBlame.js.map +1 -0
  209. package/server/apiMcp.d.ts +4 -0
  210. package/server/apiMcp.js +64 -66
  211. package/server/apiMcp.js.map +1 -0
  212. package/server/apiReview.d.ts +2 -0
  213. package/server/apiReview.js +45 -0
  214. package/server/apiReview.js.map +1 -0
  215. package/server/apiScan.d.ts +5 -0
  216. package/server/apiScan.js +90 -71
  217. package/server/apiScan.js.map +1 -0
  218. package/server/apiSearch.d.ts +33 -0
  219. package/server/apiSearch.js +184 -200
  220. package/server/apiSearch.js.map +1 -0
  221. package/server/apiSettings.d.ts +4 -0
  222. package/server/apiSettings.js +84 -85
  223. package/server/apiSettings.js.map +1 -0
  224. package/server/apiTools.d.ts +3 -0
  225. package/server/apiTools.js +55 -56
  226. package/server/apiTools.js.map +1 -0
  227. package/server/auth.d.ts +5 -0
  228. package/server/auth.js +54 -51
  229. package/server/auth.js.map +1 -0
  230. package/server/config.d.ts +42 -0
  231. package/server/config.js +189 -194
  232. package/server/config.js.map +1 -0
  233. package/server/daemon.d.ts +12 -0
  234. package/server/daemon.js +124 -114
  235. package/server/daemon.js.map +1 -0
  236. package/server/fileSourceNode.d.ts +2 -0
  237. package/server/fileSourceNode.js +34 -36
  238. package/server/fileSourceNode.js.map +1 -0
  239. package/server/gitClone.d.ts +9 -0
  240. package/server/gitClone.js +59 -61
  241. package/server/gitClone.js.map +1 -0
  242. package/server/gitDiff.d.ts +36 -0
  243. package/server/gitDiff.js +271 -169
  244. package/server/gitDiff.js.map +1 -0
  245. package/server/gitHistory.d.ts +12 -0
  246. package/server/gitHistory.js +80 -80
  247. package/server/gitHistory.js.map +1 -0
  248. package/server/gitRemote.d.ts +12 -0
  249. package/server/gitRemote.js +37 -38
  250. package/server/gitRemote.js.map +1 -0
  251. package/server/htmlText.d.ts +4 -0
  252. package/server/htmlText.js +16 -23
  253. package/server/htmlText.js.map +1 -0
  254. package/server/http.d.ts +5 -0
  255. package/server/http.js +27 -30
  256. package/server/http.js.map +1 -0
  257. package/server/httpGuards.d.ts +2 -0
  258. package/server/httpGuards.js +47 -43
  259. package/server/httpGuards.js.map +1 -0
  260. package/server/https.d.ts +34 -0
  261. package/server/https.js +121 -111
  262. package/server/https.js.map +1 -0
  263. package/server/index.d.ts +40 -0
  264. package/server/index.js +139 -147
  265. package/server/index.js.map +1 -0
  266. package/server/layout.d.ts +26 -0
  267. package/server/layout.js +59 -64
  268. package/server/layout.js.map +1 -0
  269. package/server/llmProxy.d.ts +3 -0
  270. package/server/llmProxy.js +137 -135
  271. package/server/llmProxy.js.map +1 -0
  272. package/server/logger.d.ts +38 -0
  273. package/server/logger.js +198 -211
  274. package/server/logger.js.map +1 -0
  275. package/server/mcp/analysis.d.ts +29 -0
  276. package/server/mcp/analysis.js +99 -120
  277. package/server/mcp/analysis.js.map +1 -0
  278. package/server/mcp/http.d.ts +9 -0
  279. package/server/mcp/http.js +128 -137
  280. package/server/mcp/http.js.map +1 -0
  281. package/server/mcp/runner.d.ts +68 -0
  282. package/server/mcp/runner.js +208 -218
  283. package/server/mcp/runner.js.map +1 -0
  284. package/server/mcp/server.d.ts +29 -0
  285. package/server/mcp/server.js +166 -179
  286. package/server/mcp/server.js.map +1 -0
  287. package/server/mcp/standalone.d.ts +1 -0
  288. package/server/mcp/standalone.js +8 -10
  289. package/server/mcp/standalone.js.map +1 -0
  290. package/server/mcp/tools.d.ts +2020 -0
  291. package/server/mcp/tools.js +523 -574
  292. package/server/mcp/tools.js.map +1 -0
  293. package/server/paths.d.ts +3 -0
  294. package/server/paths.js +17 -15
  295. package/server/paths.js.map +1 -0
  296. package/server/pidfile.d.ts +9 -0
  297. package/server/pidfile.js +43 -45
  298. package/server/pidfile.js.map +1 -0
  299. package/server/review.d.ts +5 -0
  300. package/server/review.js +35 -0
  301. package/server/review.js.map +1 -0
  302. package/server/router.d.ts +33 -0
  303. package/server/router.js +191 -197
  304. package/server/router.js.map +1 -0
  305. package/server/scanRequest.d.ts +3 -0
  306. package/server/scanRequest.js +36 -0
  307. package/server/scanRequest.js.map +1 -0
  308. package/server/searchIndex.d.ts +17 -0
  309. package/server/searchIndex.js +83 -80
  310. package/server/searchIndex.js.map +1 -0
  311. package/server/sessions.d.ts +14 -0
  312. package/server/sessions.js +62 -70
  313. package/server/sessions.js.map +1 -0
  314. package/server/startup.d.ts +118 -0
  315. package/server/startup.js +143 -148
  316. package/server/startup.js.map +1 -0
  317. package/server/static.d.ts +6 -0
  318. package/server/static.js +28 -31
  319. package/server/static.js.map +1 -0
  320. package/server/tools/install.d.ts +4 -0
  321. package/server/tools/install.js +176 -185
  322. package/server/tools/install.js.map +1 -0
  323. package/server/tools/parse.d.ts +8 -0
  324. package/server/tools/parse.js +112 -114
  325. package/server/tools/parse.js.map +1 -0
  326. package/server/tools/platform.d.ts +9 -0
  327. package/server/tools/platform.js +49 -47
  328. package/server/tools/platform.js.map +1 -0
  329. package/server/tools/registry.d.ts +137 -0
  330. package/server/tools/registry.js +173 -172
  331. package/server/tools/registry.js.map +1 -0
  332. package/server/tools/scan.d.ts +34 -0
  333. package/server/tools/scan.js +89 -98
  334. package/server/tools/scan.js.map +1 -0
  335. package/server/tools.d.ts +34 -0
  336. package/server/tools.js +94 -107
  337. package/server/tools.js.map +1 -0
  338. package/server/tunnel.d.ts +29 -0
  339. package/server/tunnel.js +61 -66
  340. package/server/tunnel.js.map +1 -0
  341. package/shared/analyzer/docs.d.ts +16 -0
  342. package/shared/analyzer/docs.js +99 -93
  343. package/shared/analyzer/docs.js.map +1 -0
  344. package/shared/analyzer/explainLocal.d.ts +4 -0
  345. package/shared/analyzer/explainLocal.js +122 -142
  346. package/shared/analyzer/explainLocal.js.map +1 -0
  347. package/shared/analyzer/github.d.ts +37 -0
  348. package/shared/analyzer/github.js +41 -43
  349. package/shared/analyzer/github.js.map +1 -0
  350. package/shared/analyzer/graph.d.ts +41 -0
  351. package/shared/analyzer/graph.js +393 -400
  352. package/shared/analyzer/graph.js.map +1 -0
  353. package/shared/analyzer/health.d.ts +33 -0
  354. package/shared/analyzer/health.js +197 -193
  355. package/shared/analyzer/health.js.map +1 -0
  356. package/shared/analyzer/history.d.ts +29 -0
  357. package/shared/analyzer/history.js +110 -111
  358. package/shared/analyzer/history.js.map +1 -0
  359. package/shared/analyzer/jsonConfig.d.ts +2 -0
  360. package/shared/analyzer/jsonConfig.js +61 -0
  361. package/shared/analyzer/jsonConfig.js.map +1 -0
  362. package/shared/analyzer/languages/csharp.d.ts +26 -0
  363. package/shared/analyzer/languages/csharp.js +83 -88
  364. package/shared/analyzer/languages/csharp.js.map +1 -0
  365. package/shared/analyzer/languages/generic.d.ts +23 -0
  366. package/shared/analyzer/languages/generic.js +94 -105
  367. package/shared/analyzer/languages/generic.js.map +1 -0
  368. package/shared/analyzer/languages/go.d.ts +24 -0
  369. package/shared/analyzer/languages/go.js +45 -54
  370. package/shared/analyzer/languages/go.js.map +1 -0
  371. package/shared/analyzer/languages/index.d.ts +6 -0
  372. package/shared/analyzer/languages/index.js +19 -20
  373. package/shared/analyzer/languages/index.js.map +1 -0
  374. package/shared/analyzer/languages/java.d.ts +20 -0
  375. package/shared/analyzer/languages/java.js +73 -78
  376. package/shared/analyzer/languages/java.js.map +1 -0
  377. package/shared/analyzer/languages/javascript.d.ts +12 -0
  378. package/shared/analyzer/languages/javascript.js +258 -209
  379. package/shared/analyzer/languages/javascript.js.map +1 -0
  380. package/shared/analyzer/languages/python.d.ts +23 -0
  381. package/shared/analyzer/languages/python.js +92 -100
  382. package/shared/analyzer/languages/python.js.map +1 -0
  383. package/shared/analyzer/languages/rust.d.ts +17 -0
  384. package/shared/analyzer/languages/rust.js +96 -98
  385. package/shared/analyzer/languages/rust.js.map +1 -0
  386. package/shared/analyzer/languages/typescript.d.ts +11 -0
  387. package/shared/analyzer/languages/typescript.js +117 -116
  388. package/shared/analyzer/languages/typescript.js.map +1 -0
  389. package/shared/analyzer/licenses.d.ts +18 -0
  390. package/shared/analyzer/licenses.js +130 -133
  391. package/shared/analyzer/licenses.js.map +1 -0
  392. package/shared/analyzer/metrics.d.ts +20 -0
  393. package/shared/analyzer/metrics.js +112 -104
  394. package/shared/analyzer/metrics.js.map +1 -0
  395. package/shared/analyzer/pathUtil.d.ts +10 -0
  396. package/shared/analyzer/pathUtil.js +29 -35
  397. package/shared/analyzer/pathUtil.js.map +1 -0
  398. package/shared/analyzer/patterns.d.ts +11 -0
  399. package/shared/analyzer/patterns.js +231 -253
  400. package/shared/analyzer/patterns.js.map +1 -0
  401. package/shared/analyzer/scan.d.ts +62 -0
  402. package/shared/analyzer/scan.js +451 -442
  403. package/shared/analyzer/scan.js.map +1 -0
  404. package/shared/analyzer/scanControl.d.ts +11 -0
  405. package/shared/analyzer/scanControl.js +62 -0
  406. package/shared/analyzer/scanControl.js.map +1 -0
  407. package/shared/analyzer/security.d.ts +18 -0
  408. package/shared/analyzer/security.js +159 -159
  409. package/shared/analyzer/security.js.map +1 -0
  410. package/shared/analyzer/services.d.ts +5 -0
  411. package/shared/analyzer/services.js +141 -138
  412. package/shared/analyzer/services.js.map +1 -0
  413. package/shared/analyzer/stack.d.ts +6 -0
  414. package/shared/analyzer/stack.js +134 -141
  415. package/shared/analyzer/stack.js.map +1 -0
  416. package/shared/analyzer/tour.d.ts +2 -0
  417. package/shared/analyzer/tour.js +45 -53
  418. package/shared/analyzer/tour.js.map +1 -0
  419. package/shared/analyzer/util.d.ts +8 -0
  420. package/shared/analyzer/util.js +130 -76
  421. package/shared/analyzer/util.js.map +1 -0
  422. package/shared/analyzer/workflows.d.ts +8 -0
  423. package/shared/analyzer/workflows.js +139 -134
  424. package/shared/analyzer/workflows.js.map +1 -0
  425. package/shared/contracts.d.ts +250 -0
  426. package/shared/contracts.js +2 -0
  427. package/shared/contracts.js.map +1 -0
  428. package/shared/diagram/aiFacts.d.ts +35 -0
  429. package/shared/diagram/aiFacts.js +102 -105
  430. package/shared/diagram/aiFacts.js.map +1 -0
  431. package/shared/diagram/aiMermaid.d.ts +5 -0
  432. package/shared/diagram/aiMermaid.js +46 -45
  433. package/shared/diagram/aiMermaid.js.map +1 -0
  434. package/shared/diagram/atlas.d.ts +16 -0
  435. package/shared/diagram/atlas.js +51 -60
  436. package/shared/diagram/atlas.js.map +1 -0
  437. package/shared/diagram/mermaid.d.ts +43 -0
  438. package/shared/diagram/mermaid.js +348 -370
  439. package/shared/diagram/mermaid.js.map +1 -0
  440. package/shared/review/contracts.d.ts +95 -0
  441. package/shared/review/contracts.js +2 -0
  442. package/shared/review/contracts.js.map +1 -0
  443. package/shared/review/review.d.ts +10 -0
  444. package/shared/review/review.js +184 -0
  445. package/shared/review/review.js.map +1 -0
  446. package/shared/search/query.d.ts +32 -0
  447. package/shared/search/query.js +395 -388
  448. package/shared/search/query.js.map +1 -0
@@ -8,156 +8,148 @@
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
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
18
  const PROGRESS_MS = 250;
24
-
25
19
  let btn = null;
26
20
  let statusEl = null;
27
21
  let nodeHost = null;
28
22
  let hooks = {
29
- onRender: () => {},
30
- onOpenFile: () => {},
31
- onOpenSettings: () => {},
32
- onToast: () => {},
23
+ onRender: (..._args) => { },
24
+ onOpenFile: (..._args) => { },
25
+ onOpenSettings: (..._args) => { },
26
+ onToast: (..._args) => { },
33
27
  };
34
-
35
28
  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
- });
29
+ btn = options.host;
30
+ statusEl = options.statusEl;
31
+ nodeHost = options.nodeHost;
32
+ hooks = { ...hooks, ...options };
33
+ btn.addEventListener('click', () => {
34
+ const key = aiViewKey();
35
+ if (state.aiActiveKey === key) {
36
+ state.aiActiveKey = null; // back to static
37
+ hooks.onRender();
38
+ return;
39
+ }
40
+ if (state.aiDiagrams[key]) {
41
+ state.aiActiveKey = key; // cached draft, instant
42
+ hooks.onRender();
43
+ return;
44
+ }
45
+ drawWithAI(key);
46
+ });
55
47
  }
56
-
57
48
  // Which of the three things the button currently offers. Called on every canvas
58
49
  // render, because the answer depends on the view.
59
50
  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
- }
51
+ btn.hidden = state.view === 'docs' || state.view === 'about'
52
+ || (state.view === 'atlas' && !state.atlasOpen);
53
+ if (state.aiActiveKey === key) {
54
+ btn.textContent = 'Static';
55
+ btn.title = 'Back to the static diagram';
56
+ }
57
+ else {
58
+ btn.textContent = state.aiDiagrams[key] ? 'AI draft ✓' : 'AI draft';
59
+ btn.title = 'Ask the AI to draw this view';
60
+ }
69
61
  }
70
-
71
62
  // AI nodes carry no stable ids — clicks are matched by label text instead.
72
63
  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
- }
64
+ for (const g of nodeHost.querySelectorAll('g.node')) {
65
+ const path = matchNodeText(g.textContent, state.scan.files);
66
+ if (!path)
67
+ continue;
68
+ g.style.cursor = 'pointer';
69
+ g.addEventListener('click', (event) => {
70
+ event.stopPropagation();
71
+ hooks.onOpenFile(path);
72
+ });
73
+ }
82
74
  }
83
-
84
75
  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;
76
+ if (!llm.isConfigured()) {
77
+ hooks.onOpenSettings();
78
+ hooks.onToast('Add an endpoint and model first.');
79
+ return;
80
+ }
81
+ const settings = llm.getSettings();
82
+ btn.disabled = true;
83
+ btn.textContent = 'drawing…';
84
+ statusEl.hidden = false;
85
+ // Live progress: elapsed time plus how much the model has written so far. A
86
+ // reasoning model can be quiet for half a minute, and a canvas that says
87
+ // nothing is indistinguishable from one that has hung.
88
+ const startedAt = Date.now();
89
+ let received = 0;
90
+ const tick = () => {
91
+ const secs = Math.round((Date.now() - startedAt) / 1000);
92
+ const kb = received >= 1000 ? (received / 1000).toFixed(1) + 'k' : String(received);
93
+ statusEl.textContent = `The AI is sketching this view… ${kb} chars · ${secs}s`;
94
+ };
95
+ tick();
96
+ const progressTimer = setInterval(tick, PROGRESS_MS);
97
+ try {
98
+ const { kind, facts } = await factsForView();
99
+ const messages = llm.diagramMessages({ repoName: state.scan.name, kind, facts });
100
+ let text = '';
101
+ // Big budget, and no visible thinking where the dialect allows it:
102
+ // reasoning models otherwise spend the whole allowance before a single
103
+ // diagram line appears. Azure rejects that parameter outright.
104
+ const providerOptions = llm.isAzureHost(settings.baseUrl) ? {} : { reasoning: { exclude: true } };
105
+ for await (const delta of streamExplain({ ...settings, messages, maxTokens: MAX_TOKENS, providerOptions })) {
106
+ text += delta;
107
+ received += delta.length;
108
+ }
109
+ const parsed = extractAIDiagram(text);
110
+ if (!parsed)
111
+ throw new Error('The model answered without a diagram. Try again.');
112
+ state.aiDiagrams[key] = { body: parsed.body, caption: parsed.caption };
113
+ state.aiActiveKey = key;
114
+ statusEl.hidden = true;
115
+ hooks.onRender();
116
+ }
117
+ catch (err) {
118
+ statusEl.hidden = true;
119
+ hooks.onToast(err.message);
120
+ }
121
+ finally {
122
+ clearInterval(progressTimer);
123
+ btn.disabled = false;
124
+ updateAiBtn(key);
119
125
  }
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;
132
- updateAiBtn(key);
133
- }
134
126
  }
135
-
136
127
  // Picks the sheet for the current view and fetches the source the file-shaped
137
128
  // ones need. The choosing is pure and tested in aiFacts.js; this is the read.
138
129
  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
- });
130
+ const { scan, facts, manifest, patterns } = state;
131
+ const target = diagramTarget(state);
132
+ switch (target.view) {
133
+ case 'map': return overviewFacts(scan, facts);
134
+ case 'patterns': return layersFacts(facts, patterns);
135
+ case 'services': return servicesFacts(scan, manifest);
136
+ case 'tour': {
137
+ const stop = state.tour.stops[state.tour.idx];
138
+ if (!stop)
139
+ return tourStopFacts({ stop: null });
140
+ return tourStopFacts({
141
+ ctx: await gatherFileContext(target.path),
142
+ externals: externalsFor(scan, target.path),
143
+ stop,
144
+ index: state.tour.idx,
145
+ total: state.tour.stops.length,
146
+ });
147
+ }
148
+ case 'file': return fileFacts({
149
+ ctx: await gatherFileContext(target.path),
150
+ externals: externalsFor(scan, target.path),
151
+ });
152
+ default: return folderFacts(scan, facts, target.path);
156
153
  }
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
154
  }
155
+ //# 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 = 250;\n\nlet btn = null;\nlet statusEl = null;\nlet nodeHost = null;\nlet hooks = {\n onRender: (..._args: unknown[]) => {},\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 const key = aiViewKey();\n if (state.aiActiveKey === key) {\n state.aiActiveKey = null; // back to static\n hooks.onRender();\n return;\n }\n if (state.aiDiagrams[key]) {\n state.aiActiveKey = key; // cached draft, instant\n hooks.onRender();\n return;\n }\n 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 btn.hidden = state.view === 'docs' || state.view === 'about'\n || (state.view === 'atlas' && !state.atlasOpen);\n 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 draft ✓' : 'AI draft';\n btn.title = 'Ask the AI to draw this view';\n }\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('Add an endpoint and model first.');\n return;\n }\n const settings = llm.getSettings();\n btn.disabled = true;\n btn.textContent = 'drawing…';\n statusEl.hidden = false;\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 const secs = Math.round((Date.now() - startedAt) / 1000);\n const kb = received >= 1000 ? (received / 1000).toFixed(1) + 'k' : String(received);\n statusEl.textContent = `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 const messages = llm.diagramMessages({ repoName: state.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 })) {\n text += delta;\n received += delta.length;\n }\n const parsed = extractAIDiagram(text);\n if (!parsed) throw new Error('The model answered without a diagram. Try again.');\n state.aiDiagrams[key] = { body: parsed.body, caption: parsed.caption };\n state.aiActiveKey = key;\n statusEl.hidden = true;\n hooks.onRender();\n } catch (err) {\n statusEl.hidden = true;\n hooks.onToast(err.message);\n } finally {\n clearInterval(progressTimer);\n btn.disabled = false;\n updateAiBtn(key);\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;