codebase-onboarder 0.5.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 +196 -47
  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 +449 -0
  8. package/cli/explorer/advanced.js.map +1 -0
  9. package/cli/explorer/app.d.ts +1 -0
  10. package/cli/explorer/app.js +396 -229
  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 +400 -162
  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 +73 -0
  23. package/cli/explorer/github.js.map +1 -0
  24. package/cli/explorer/graphs.d.ts +7 -0
  25. package/cli/explorer/graphs.js +173 -0
  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 +184 -95
  35. package/cli/explorer/session.js.map +1 -0
  36. package/cli/explorer/views.d.ts +19 -0
  37. package/cli/explorer/views.js +496 -412
  38. package/cli/explorer/views.js.map +1 -0
  39. package/cli/explorer/wrap.d.ts +1 -0
  40. package/cli/explorer/wrap.js +33 -0
  41. package/cli/explorer/wrap.js.map +1 -0
  42. package/cli/main.d.ts +1 -0
  43. package/cli/main.js +235 -138
  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 +55 -35
  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 +165 -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 +60 -0
  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 -37
  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 +79 -0
  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
@@ -6,184 +6,173 @@
6
6
  // app.js is the drawer choreography — one scrim at a time, Escape to close —
7
7
  // which is why it returns open/close/isOpen instead of wiring the topbar
8
8
  // button itself.
9
-
10
9
  import { fetchServerSettings, updateServerSettings, rotateServerAccessKey, logoutRemoteSession } from '/js/api.js';
11
-
12
10
  // A function declaration, not a const arrow: the import-time DOM check in
13
11
  // tests/frontend.test.js blanks top-level function bodies but reads const
14
12
  // bodies, and this module must stay importable from Node.
15
13
  function $(id) {
16
- return document.getElementById(id);
14
+ return document.getElementById(id);
17
15
  }
18
-
19
16
  const MODE_NOTES = {
20
- local: 'Local mode answers only this machine. No key, no network — the safe default.',
21
- 'self-hosted': 'Self-hosted answers whoever can reach the port, so every API call needs the access key below.',
17
+ local: 'Local mode answers only this machine. No key, no network — the safe default.',
18
+ 'self-hosted': 'Self-hosted answers whoever can reach the port, so every API call needs the access key below.',
22
19
  };
23
-
24
20
  export function createServerDrawer(options = {}) {
25
- // Pulled out of the parameter list on purpose: the front-end static check
26
- // in tests/frontend.test.js only understands plain params, and `toast` must
27
- // show up as a declaration, not a dangling call.
28
- const toast = typeof options.toast === 'function' ? options.toast : () => {};
29
- const dom = {};
30
- [
31
- 'serverDrawer', 'serverScrim', 'serverClose', 'serverModeNote', 'srvMode', 'srvHost', 'srvPort',
32
- 'srvDomain', 'srvDomainField', 'srvHttps', 'srvHttpsField', 'srvHttpsStatus', 'srvAutoOpen', 'srvKeySection', 'srvKeyMasked', 'srvRotate', 'srvLogout',
33
- 'srvFreshKeyRow', 'srvFreshKey', 'srvCopyKey', 'srvKeyHint', 'srvName', 'srvEmail',
34
- 'srvTunnelCloudflare', 'srvTunnelCloudflareStatus', 'srvTunnelTailscale', 'srvTunnelTailscaleStatus',
35
- 'srvSave', 'srvStatus', 'srvConfigPath',
36
- ].forEach((id) => (dom[id] = $(id)));
37
-
38
- let current = null; // the last settings body the server sent
39
-
40
- function status(text, cls = '') {
41
- dom.srvStatus.className = 'drawer-status' + (cls ? ' ' + cls : '');
42
- dom.srvStatus.textContent = text;
43
- }
44
-
45
- function tunnelLine(el, t) {
46
- if (!t) { el.textContent = ''; return; }
47
- if (!t.enabled) {
48
- el.textContent = t.installed ? 'Off.' : `Off — and ${t.install || 'the binary is not installed'}.`;
49
- return;
21
+ // Pulled out of the parameter list on purpose: the front-end static check
22
+ // in tests/frontend.test.js only understands plain params, and `toast` must
23
+ // show up as a declaration, not a dangling call.
24
+ const toast = typeof options.toast === 'function' ? options.toast : (..._args) => { };
25
+ const dom = {};
26
+ [
27
+ 'serverDrawer', 'serverScrim', 'serverClose', 'serverModeNote', 'srvMode', 'srvHost', 'srvPort',
28
+ 'srvDomain', 'srvDomainField', 'srvHttps', 'srvHttpsField', 'srvHttpsStatus', 'srvAutoOpen', 'srvKeySection', 'srvKeyMasked', 'srvRotate', 'srvLogout',
29
+ 'srvFreshKeyRow', 'srvFreshKey', 'srvCopyKey', 'srvKeyHint', 'srvName', 'srvEmail',
30
+ 'srvTunnelCloudflare', 'srvTunnelCloudflareStatus', 'srvTunnelTailscale', 'srvTunnelTailscaleStatus',
31
+ 'srvSave', 'srvStatus', 'srvConfigPath',
32
+ ].forEach((id) => (dom[id] = $(id)));
33
+ let current = null; // the last settings body the server sent
34
+ function status(text, cls = '') {
35
+ dom.srvStatus.className = 'drawer-status' + (cls ? ' ' + cls : '');
36
+ dom.srvStatus.textContent = text;
50
37
  }
51
- el.textContent = t.installed
52
- ? `On. Start it with: ${t.command}`
53
- : `On, but the binary is missing — ${t.install || 'install it first'}.`;
54
- }
55
-
56
- function render(data) {
57
- current = data;
58
- const s = data.settings;
59
- dom.srvMode.value = s.mode;
60
- dom.serverModeNote.textContent = MODE_NOTES[s.mode] || '';
61
- dom.srvHost.value = s.host;
62
- dom.srvPort.value = s.port;
63
- dom.srvDomain.value = s.domain || '';
64
- dom.srvHttps.checked = Boolean(s.https);
65
- dom.srvHttpsStatus.textContent = data.https?.caddyInstalled
66
- ? `Caddy ${data.https.caddyVersion || 'installed'}. ${s.https ? 'Run `onboarder https setup` after saving.' : 'Enable HTTPS above, save, then run the command.'}`
67
- : 'Caddy is not installed. Ubuntu: sudo apt install caddy; macOS: brew install caddy.';
68
- dom.srvAutoOpen.checked = Boolean(s.autoOpen);
69
- dom.srvName.value = s.account?.name || '';
70
- dom.srvEmail.value = s.account?.email || '';
71
- dom.srvTunnelCloudflare.checked = Boolean(s.tunnel?.cloudflare);
72
- dom.srvTunnelTailscale.checked = Boolean(s.tunnel?.tailscale);
73
- tunnelLine(dom.srvTunnelCloudflareStatus, data.tunnels?.cloudflare);
74
- tunnelLine(dom.srvTunnelTailscaleStatus, data.tunnels?.tailscale);
75
- dom.srvConfigPath.textContent = `Config file: ${data.configFile}`;
76
- dom.srvKeyMasked.value = s.accessKeyMasked || (s.hasAccessKey ? '' : '(none set — the API refuses every call)');
77
- dom.srvKeyHint.textContent = s.hasAccessKey
78
- ? 'Remote browsers sign in once; the key is exchanged for a secure HTTP-only session.'
79
- : 'No key is set. Generate one before remote access is possible.';
80
- applyModeVisibility();
81
- }
82
-
83
- // Mode drives which rows even make sense: local wipes the network/security
84
- // fields in the schema, so asking for them here would be collecting lies.
85
- function applyModeVisibility() {
86
- const remote = dom.srvMode.value === 'self-hosted';
87
- dom.srvKeySection.hidden = !remote;
88
- dom.srvDomainField.hidden = !remote;
89
- dom.srvHttpsField.hidden = !remote || !dom.srvDomain.value.trim();
90
- dom.serverModeNote.textContent = MODE_NOTES[dom.srvMode.value] || '';
91
- }
92
-
93
- async function open() {
94
- dom.serverDrawer.hidden = false;
95
- dom.serverScrim.hidden = false;
96
- dom.srvFreshKeyRow.hidden = true;
97
- status('Reading the server…');
98
- try {
99
- render(await fetchServerSettings());
100
- status('');
101
- } catch (err) {
102
- status(err.message, 'err');
38
+ function tunnelLine(el, t) {
39
+ if (!t) {
40
+ el.textContent = '';
41
+ return;
42
+ }
43
+ if (!t.enabled) {
44
+ el.textContent = t.installed ? 'Off.' : `Off — and ${t.install || 'the binary is not installed'}.`;
45
+ return;
46
+ }
47
+ el.textContent = t.installed
48
+ ? `On. Start it with: ${t.command}`
49
+ : `On, but the binary is missing — ${t.install || 'install it first'}.`;
103
50
  }
104
- }
105
-
106
- function close() {
107
- dom.serverDrawer.hidden = true;
108
- dom.serverScrim.hidden = true;
109
- }
110
-
111
-
112
- async function save() {
113
- const patch = {
114
- mode: dom.srvMode.value,
115
- host: dom.srvHost.value.trim() || '127.0.0.1',
116
- port: Number(dom.srvPort.value),
117
- autoOpen: dom.srvAutoOpen.checked,
118
- account: { name: dom.srvName.value.trim(), email: dom.srvEmail.value.trim() },
119
- tunnel: { cloudflare: dom.srvTunnelCloudflare.checked, tailscale: dom.srvTunnelTailscale.checked },
120
- };
121
- if (patch.mode === 'self-hosted') {
122
- patch.domain = dom.srvDomain.value.trim();
123
- patch.https = dom.srvHttps.checked;
51
+ function render(data) {
52
+ current = data;
53
+ const s = data.settings;
54
+ dom.srvMode.value = s.mode;
55
+ dom.serverModeNote.textContent = MODE_NOTES[s.mode] || '';
56
+ dom.srvHost.value = s.host;
57
+ dom.srvPort.value = s.port;
58
+ dom.srvDomain.value = s.domain || '';
59
+ dom.srvHttps.checked = Boolean(s.https);
60
+ dom.srvHttpsStatus.textContent = data.https?.caddyInstalled
61
+ ? `Caddy ${data.https.caddyVersion || 'installed'}. ${s.https ? 'Run `onboarder https setup` after saving.' : 'Enable HTTPS above, save, then run the command.'}`
62
+ : 'Caddy is not installed. Ubuntu: sudo apt install caddy; macOS: brew install caddy.';
63
+ dom.srvAutoOpen.checked = Boolean(s.autoOpen);
64
+ dom.srvName.value = s.account?.name || '';
65
+ dom.srvEmail.value = s.account?.email || '';
66
+ dom.srvTunnelCloudflare.checked = Boolean(s.tunnel?.cloudflare);
67
+ dom.srvTunnelTailscale.checked = Boolean(s.tunnel?.tailscale);
68
+ tunnelLine(dom.srvTunnelCloudflareStatus, data.tunnels?.cloudflare);
69
+ tunnelLine(dom.srvTunnelTailscaleStatus, data.tunnels?.tailscale);
70
+ dom.srvConfigPath.textContent = `Config file: ${data.configFile}`;
71
+ dom.srvKeyMasked.value = s.accessKeyMasked || (s.hasAccessKey ? '' : '(none set — the API refuses every call)');
72
+ dom.srvKeyHint.textContent = s.hasAccessKey
73
+ ? 'Remote browsers sign in once; the key is exchanged for a secure HTTP-only session.'
74
+ : 'No key is set. Generate one before remote access is possible.';
75
+ applyModeVisibility();
76
+ }
77
+ // Mode drives which rows even make sense: local wipes the network/security
78
+ // fields in the schema, so asking for them here would be collecting lies.
79
+ function applyModeVisibility() {
80
+ const remote = dom.srvMode.value === 'self-hosted';
81
+ dom.srvKeySection.hidden = !remote;
82
+ dom.srvDomainField.hidden = !remote;
83
+ dom.srvHttpsField.hidden = !remote || !dom.srvDomain.value.trim();
84
+ dom.serverModeNote.textContent = MODE_NOTES[dom.srvMode.value] || '';
124
85
  }
125
- status('Saving…');
126
- try {
127
- const data = await updateServerSettings(patch);
128
- render({ ...current, settings: data.settings });
129
- const restart = (data.restartRequired || []).join(' and ');
130
- const httpsChanged = (data.restartRequired || []).some((key) => key === 'domain' || key === 'https');
131
- status(
132
- httpsChanged
133
- ? 'Saved. Run `onboarder https setup` to validate the Caddyfile and reload TLS.'
134
- : restart
135
- ? `Saved. The ${restart} change takes effect after a restart — the running socket cannot move.`
136
- : 'Saved — live already.',
137
- 'ok',
138
- );
139
- } catch (err) {
140
- status(err.message, 'err');
86
+ async function open() {
87
+ dom.serverDrawer.hidden = false;
88
+ dom.serverScrim.hidden = false;
89
+ dom.srvFreshKeyRow.hidden = true;
90
+ status('Reading the server…');
91
+ try {
92
+ render(await fetchServerSettings());
93
+ status('');
94
+ }
95
+ catch (err) {
96
+ status(err.message, 'err');
97
+ }
141
98
  }
142
- }
143
-
144
- async function rotate() {
145
- status('Rotating…');
146
- try {
147
- const data = await rotateServerAccessKey();
148
- // The server refreshes this browser's signed session as part of rotation.
149
- // The raw key is shown once for copying elsewhere, never stored locally.
150
- render({ ...current, settings: data.settings });
151
- dom.srvFreshKey.value = data.accessKey;
152
- dom.srvFreshKeyRow.hidden = false; // render() does not know about the reveal
153
- status('Rotated. The old key is dead; update every other device.', 'ok');
154
- } catch (err) {
155
- status(err.message, 'err');
99
+ function close() {
100
+ dom.serverDrawer.hidden = true;
101
+ dom.serverScrim.hidden = true;
156
102
  }
157
- }
158
-
159
- async function signOut() {
160
- try {
161
- await logoutRemoteSession();
162
- location.replace('/');
163
- } catch (err) {
164
- status(err.message, 'err');
103
+ async function save() {
104
+ const patch = {
105
+ mode: dom.srvMode.value,
106
+ host: dom.srvHost.value.trim() || '127.0.0.1',
107
+ port: Number(dom.srvPort.value),
108
+ autoOpen: dom.srvAutoOpen.checked,
109
+ account: { name: dom.srvName.value.trim(), email: dom.srvEmail.value.trim() },
110
+ tunnel: { cloudflare: dom.srvTunnelCloudflare.checked, tailscale: dom.srvTunnelTailscale.checked },
111
+ };
112
+ if (patch.mode === 'self-hosted') {
113
+ patch.domain = dom.srvDomain.value.trim();
114
+ patch.https = dom.srvHttps.checked;
115
+ }
116
+ status('Saving…');
117
+ try {
118
+ const data = await updateServerSettings(patch);
119
+ render({ ...current, settings: data.settings });
120
+ const restart = (data.restartRequired || []).join(' and ');
121
+ const httpsChanged = (data.restartRequired || []).some((key) => key === 'domain' || key === 'https');
122
+ status(httpsChanged
123
+ ? 'Saved. Run `onboarder https setup` to validate the Caddyfile and reload TLS.'
124
+ : restart
125
+ ? `Saved. The ${restart} change takes effect after a restart — the running socket cannot move.`
126
+ : 'Saved — live already.', 'ok');
127
+ }
128
+ catch (err) {
129
+ status(err.message, 'err');
130
+ }
165
131
  }
166
- }
167
-
168
- dom.srvMode.addEventListener('change', applyModeVisibility);
169
- dom.srvDomain.addEventListener('input', applyModeVisibility);
170
- dom.srvSave.addEventListener('click', save);
171
- dom.srvRotate.addEventListener('click', rotate);
172
- dom.srvLogout.addEventListener('click', signOut);
173
- dom.serverClose.addEventListener('click', close);
174
- dom.serverScrim.addEventListener('click', close);
175
- dom.srvCopyKey.addEventListener('click', async () => {
176
- try {
177
- await navigator.clipboard.writeText(dom.srvFreshKey.value);
178
- toast('Key copied');
179
- } catch {
180
- dom.srvFreshKey.select(); // clipboard refused — select so a Ctrl+C works
132
+ async function rotate() {
133
+ status('Rotating…');
134
+ try {
135
+ const data = await rotateServerAccessKey();
136
+ // The server refreshes this browser's signed session as part of rotation.
137
+ // The raw key is shown once for copying elsewhere, never stored locally.
138
+ render({ ...current, settings: data.settings });
139
+ dom.srvFreshKey.value = data.accessKey;
140
+ dom.srvFreshKeyRow.hidden = false; // render() does not know about the reveal
141
+ status('Rotated. The old key is dead; update every other device.', 'ok');
142
+ }
143
+ catch (err) {
144
+ status(err.message, 'err');
145
+ }
181
146
  }
182
- });
183
-
184
- return {
185
- open,
186
- close,
187
- isOpen: () => !dom.serverDrawer.hidden,
188
- };
147
+ async function signOut() {
148
+ try {
149
+ await logoutRemoteSession();
150
+ location.replace('/');
151
+ }
152
+ catch (err) {
153
+ status(err.message, 'err');
154
+ }
155
+ }
156
+ dom.srvMode.addEventListener('change', applyModeVisibility);
157
+ dom.srvDomain.addEventListener('input', applyModeVisibility);
158
+ dom.srvSave.addEventListener('click', save);
159
+ dom.srvRotate.addEventListener('click', rotate);
160
+ dom.srvLogout.addEventListener('click', signOut);
161
+ dom.serverClose.addEventListener('click', close);
162
+ dom.serverScrim.addEventListener('click', close);
163
+ dom.srvCopyKey.addEventListener('click', async () => {
164
+ try {
165
+ await navigator.clipboard.writeText(dom.srvFreshKey.value);
166
+ toast('Key copied');
167
+ }
168
+ catch {
169
+ dom.srvFreshKey.select(); // clipboard refused — select so a Ctrl+C works
170
+ }
171
+ });
172
+ return {
173
+ open,
174
+ close,
175
+ isOpen: () => !dom.serverDrawer.hidden,
176
+ };
189
177
  }
178
+ //# sourceMappingURL=serverSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverSettings.js","sourceRoot":"","sources":["../../src/public/js/serverSettings.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SettingsInput } from '../../shared/contracts.js';\nimport type { AppElements } from '/js/dom.js';\n// The Server drawer: the web face of the same config file the CLI wizard\n// writes. Reads come back with the key masked; saves send only the changed\n// keys; rotation reveals the new key once and signs this browser in.\n//\n// The module owns its own DOM and its own round-trips. What it borrows from\n// app.js is the drawer choreography — one scrim at a time, Escape to close —\n// which is why it returns open/close/isOpen instead of wiring the topbar\n// button itself.\n\nimport { fetchServerSettings, updateServerSettings, rotateServerAccessKey, logoutRemoteSession } from '/js/api.js';\n\n// A function declaration, not a const arrow: the import-time DOM check in\n// tests/frontend.test.js blanks top-level function bodies but reads const\n// bodies, and this module must stay importable from Node.\nfunction $(id) {\n return document.getElementById(id);\n}\n\nconst MODE_NOTES = {\n local: 'Local mode answers only this machine. No key, no network — the safe default.',\n 'self-hosted': 'Self-hosted answers whoever can reach the port, so every API call needs the access key below.',\n};\n\nexport function createServerDrawer(options: Record<string, any> = {}) {\n // Pulled out of the parameter list on purpose: the front-end static check\n // in tests/frontend.test.js only understands plain params, and `toast` must\n // show up as a declaration, not a dangling call.\n const toast = typeof options.toast === 'function' ? options.toast : (..._args: unknown[]) => {};\n const dom: Partial<AppElements> = {};\n [\n 'serverDrawer', 'serverScrim', 'serverClose', 'serverModeNote', 'srvMode', 'srvHost', 'srvPort',\n 'srvDomain', 'srvDomainField', 'srvHttps', 'srvHttpsField', 'srvHttpsStatus', 'srvAutoOpen', 'srvKeySection', 'srvKeyMasked', 'srvRotate', 'srvLogout',\n 'srvFreshKeyRow', 'srvFreshKey', 'srvCopyKey', 'srvKeyHint', 'srvName', 'srvEmail',\n 'srvTunnelCloudflare', 'srvTunnelCloudflareStatus', 'srvTunnelTailscale', 'srvTunnelTailscaleStatus',\n 'srvSave', 'srvStatus', 'srvConfigPath',\n ].forEach((id) => (dom[id] = $(id)));\n\n let current = null; // the last settings body the server sent\n\n function status(text, cls = '') {\n dom.srvStatus.className = 'drawer-status' + (cls ? ' ' + cls : '');\n dom.srvStatus.textContent = text;\n }\n\n function tunnelLine(el, t) {\n if (!t) { el.textContent = ''; return; }\n if (!t.enabled) {\n el.textContent = t.installed ? 'Off.' : `Off — and ${t.install || 'the binary is not installed'}.`;\n return;\n }\n el.textContent = t.installed\n ? `On. Start it with: ${t.command}`\n : `On, but the binary is missing — ${t.install || 'install it first'}.`;\n }\n\n function render(data) {\n current = data;\n const s = data.settings;\n dom.srvMode.value = s.mode;\n dom.serverModeNote.textContent = MODE_NOTES[s.mode] || '';\n dom.srvHost.value = s.host;\n dom.srvPort.value = s.port;\n dom.srvDomain.value = s.domain || '';\n dom.srvHttps.checked = Boolean(s.https);\n dom.srvHttpsStatus.textContent = data.https?.caddyInstalled\n ? `Caddy ${data.https.caddyVersion || 'installed'}. ${s.https ? 'Run `onboarder https setup` after saving.' : 'Enable HTTPS above, save, then run the command.'}`\n : 'Caddy is not installed. Ubuntu: sudo apt install caddy; macOS: brew install caddy.';\n dom.srvAutoOpen.checked = Boolean(s.autoOpen);\n dom.srvName.value = s.account?.name || '';\n dom.srvEmail.value = s.account?.email || '';\n dom.srvTunnelCloudflare.checked = Boolean(s.tunnel?.cloudflare);\n dom.srvTunnelTailscale.checked = Boolean(s.tunnel?.tailscale);\n tunnelLine(dom.srvTunnelCloudflareStatus, data.tunnels?.cloudflare);\n tunnelLine(dom.srvTunnelTailscaleStatus, data.tunnels?.tailscale);\n dom.srvConfigPath.textContent = `Config file: ${data.configFile}`;\n dom.srvKeyMasked.value = s.accessKeyMasked || (s.hasAccessKey ? '' : '(none set — the API refuses every call)');\n dom.srvKeyHint.textContent = s.hasAccessKey\n ? 'Remote browsers sign in once; the key is exchanged for a secure HTTP-only session.'\n : 'No key is set. Generate one before remote access is possible.';\n applyModeVisibility();\n }\n\n // Mode drives which rows even make sense: local wipes the network/security\n // fields in the schema, so asking for them here would be collecting lies.\n function applyModeVisibility() {\n const remote = dom.srvMode.value === 'self-hosted';\n dom.srvKeySection.hidden = !remote;\n dom.srvDomainField.hidden = !remote;\n dom.srvHttpsField.hidden = !remote || !dom.srvDomain.value.trim();\n dom.serverModeNote.textContent = MODE_NOTES[dom.srvMode.value] || '';\n }\n\n async function open() {\n dom.serverDrawer.hidden = false;\n dom.serverScrim.hidden = false;\n dom.srvFreshKeyRow.hidden = true;\n status('Reading the server…');\n try {\n render(await fetchServerSettings());\n status('');\n } catch (err) {\n status(err.message, 'err');\n }\n }\n\n function close() {\n dom.serverDrawer.hidden = true;\n dom.serverScrim.hidden = true;\n }\n\n\n async function save() {\n const patch: SettingsInput = {\n mode: dom.srvMode.value,\n host: dom.srvHost.value.trim() || '127.0.0.1',\n port: Number(dom.srvPort.value),\n autoOpen: dom.srvAutoOpen.checked,\n account: { name: dom.srvName.value.trim(), email: dom.srvEmail.value.trim() },\n tunnel: { cloudflare: dom.srvTunnelCloudflare.checked, tailscale: dom.srvTunnelTailscale.checked },\n };\n if (patch.mode === 'self-hosted') {\n patch.domain = dom.srvDomain.value.trim();\n patch.https = dom.srvHttps.checked;\n }\n status('Saving…');\n try {\n const data = await updateServerSettings(patch);\n render({ ...current, settings: data.settings });\n const restart = (data.restartRequired || []).join(' and ');\n const httpsChanged = (data.restartRequired || []).some((key) => key === 'domain' || key === 'https');\n status(\n httpsChanged\n ? 'Saved. Run `onboarder https setup` to validate the Caddyfile and reload TLS.'\n : restart\n ? `Saved. The ${restart} change takes effect after a restart — the running socket cannot move.`\n : 'Saved — live already.',\n 'ok',\n );\n } catch (err) {\n status(err.message, 'err');\n }\n }\n\n async function rotate() {\n status('Rotating…');\n try {\n const data = await rotateServerAccessKey();\n // The server refreshes this browser's signed session as part of rotation.\n // The raw key is shown once for copying elsewhere, never stored locally.\n render({ ...current, settings: data.settings });\n dom.srvFreshKey.value = data.accessKey;\n dom.srvFreshKeyRow.hidden = false; // render() does not know about the reveal\n status('Rotated. The old key is dead; update every other device.', 'ok');\n } catch (err) {\n status(err.message, 'err');\n }\n }\n\n async function signOut() {\n try {\n await logoutRemoteSession();\n location.replace('/');\n } catch (err) {\n status(err.message, 'err');\n }\n }\n\n dom.srvMode.addEventListener('change', applyModeVisibility);\n dom.srvDomain.addEventListener('input', applyModeVisibility);\n dom.srvSave.addEventListener('click', save);\n dom.srvRotate.addEventListener('click', rotate);\n dom.srvLogout.addEventListener('click', signOut);\n dom.serverClose.addEventListener('click', close);\n dom.serverScrim.addEventListener('click', close);\n dom.srvCopyKey.addEventListener('click', async () => {\n try {\n await navigator.clipboard.writeText(dom.srvFreshKey.value);\n toast('Key copied');\n } catch {\n dom.srvFreshKey.select(); // clipboard refused — select so a Ctrl+C works\n }\n });\n\n return {\n open,\n close,\n isOpen: () => !dom.serverDrawer.hidden,\n };\n}\n"]}