synabun 2.0.5 → 2.0.7

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 (233) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +2 -1
  3. package/THIRD-PARTY-LICENSES.md +13 -0
  4. package/docs/whatsapp.md +151 -16
  5. package/hooks/claude-code/shared.mjs +6 -3
  6. package/lib/child-path.js +303 -0
  7. package/lib/claude-hooks.js +2 -1
  8. package/lib/data-home-migration.js +2 -0
  9. package/lib/desktop-app.js +265 -0
  10. package/lib/external-tools.js +7 -3
  11. package/lib/log-redact.js +102 -0
  12. package/lib/packaged-runtime.js +138 -11
  13. package/mcp-server/dist/http.d.ts +3 -1
  14. package/mcp-server/dist/http.d.ts.map +1 -1
  15. package/mcp-server/dist/http.js +15 -4
  16. package/mcp-server/dist/http.js.map +1 -1
  17. package/mcp-server/dist/index.d.ts.map +1 -1
  18. package/mcp-server/dist/index.js +9 -6
  19. package/mcp-server/dist/index.js.map +1 -1
  20. package/mcp-server/dist/services/budget-judgments.d.ts +108 -0
  21. package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -0
  22. package/mcp-server/dist/services/budget-judgments.js +153 -0
  23. package/mcp-server/dist/services/budget-judgments.js.map +1 -0
  24. package/mcp-server/dist/services/codex-config-heal.d.ts +5 -1
  25. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
  26. package/mcp-server/dist/services/codex-config-heal.js +41 -4
  27. package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
  28. package/mcp-server/dist/services/identity.d.ts +11 -0
  29. package/mcp-server/dist/services/identity.d.ts.map +1 -1
  30. package/mcp-server/dist/services/identity.js +24 -0
  31. package/mcp-server/dist/services/identity.js.map +1 -1
  32. package/mcp-server/dist/services/neural-interface.d.ts +13 -0
  33. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
  34. package/mcp-server/dist/services/neural-interface.js +34 -2
  35. package/mcp-server/dist/services/neural-interface.js.map +1 -1
  36. package/mcp-server/dist/services/typesafe-config.d.ts +1 -1
  37. package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -1
  38. package/mcp-server/dist/services/typesafe-config.js +4 -1
  39. package/mcp-server/dist/services/typesafe-config.js.map +1 -1
  40. package/mcp-server/dist/tools/agents.d.ts +10 -7
  41. package/mcp-server/dist/tools/agents.d.ts.map +1 -1
  42. package/mcp-server/dist/tools/agents.js +34 -13
  43. package/mcp-server/dist/tools/agents.js.map +1 -1
  44. package/mcp-server/dist/tools/whatsapp-send-file.d.ts +17 -0
  45. package/mcp-server/dist/tools/whatsapp-send-file.d.ts.map +1 -0
  46. package/mcp-server/dist/tools/whatsapp-send-file.js +44 -0
  47. package/mcp-server/dist/tools/whatsapp-send-file.js.map +1 -0
  48. package/mcp-server/dist/tui.js +2 -1
  49. package/mcp-server/dist/tui.js.map +1 -1
  50. package/mcp-server/dist/version.d.ts +5 -0
  51. package/mcp-server/dist/version.d.ts.map +1 -0
  52. package/mcp-server/dist/version.js +21 -0
  53. package/mcp-server/dist/version.js.map +1 -0
  54. package/mcp-server/package-lock.json +2 -2
  55. package/mcp-server/package.json +1 -1
  56. package/mcp-server/run.mjs +15 -9
  57. package/mcp-server/src/http.ts +18 -3
  58. package/mcp-server/src/index.ts +9 -6
  59. package/mcp-server/src/services/budget-judgments.ts +183 -0
  60. package/mcp-server/src/services/codex-config-heal.ts +35 -4
  61. package/mcp-server/src/services/identity.ts +27 -0
  62. package/mcp-server/src/services/neural-interface.ts +34 -2
  63. package/mcp-server/src/services/typesafe-config.ts +4 -1
  64. package/mcp-server/src/tools/agents.ts +33 -14
  65. package/mcp-server/src/tools/whatsapp-send-file.ts +51 -0
  66. package/mcp-server/src/tui.ts +2 -1
  67. package/mcp-server/src/version.ts +22 -0
  68. package/neural-interface/i18n/en.json +627 -57
  69. package/neural-interface/i18n/pt-BR.json +626 -56
  70. package/neural-interface/lib/account-usage.js +163 -0
  71. package/neural-interface/lib/assistant-api.js +255 -52
  72. package/neural-interface/lib/assistant-brains/claude.js +15 -2
  73. package/neural-interface/lib/assistant-brains/codex.js +3 -0
  74. package/neural-interface/lib/assistant-brains/opencode.js +17 -4
  75. package/neural-interface/lib/assistant-budget-planner.js +390 -0
  76. package/neural-interface/lib/assistant-budget-split.js +408 -0
  77. package/neural-interface/lib/assistant-budget.js +94 -95
  78. package/neural-interface/lib/assistant-config.js +62 -14
  79. package/neural-interface/lib/assistant-dispatch.js +432 -125
  80. package/neural-interface/lib/assistant-jev.js +26 -3
  81. package/neural-interface/lib/assistant-persona.js +68 -11
  82. package/neural-interface/lib/assistant-plan-permissions.js +8 -1
  83. package/neural-interface/lib/assistant-route-accounts.js +14 -0
  84. package/neural-interface/lib/assistant-route-gate.js +19 -3
  85. package/neural-interface/lib/assistant-router.js +373 -42
  86. package/neural-interface/lib/assistant-runtime.js +307 -47
  87. package/neural-interface/lib/assistant-user-writer.js +4 -2
  88. package/neural-interface/lib/augmented-path.js +317 -53
  89. package/neural-interface/lib/claude-accounts.js +342 -31
  90. package/neural-interface/lib/claude-agent-bridge.js +90 -3
  91. package/neural-interface/lib/claude-executable.js +6 -1
  92. package/neural-interface/lib/claude-model-catalog.js +3 -3
  93. package/neural-interface/lib/claude-panel-auth.js +221 -0
  94. package/neural-interface/lib/claude-profile-api-key.js +62 -0
  95. package/neural-interface/lib/cli-install-api.js +137 -0
  96. package/neural-interface/lib/cli-install.js +797 -0
  97. package/neural-interface/lib/cli-path.js +130 -0
  98. package/neural-interface/lib/cli-resolver.js +744 -0
  99. package/neural-interface/lib/cli-update-planner.js +143 -7
  100. package/neural-interface/lib/codex-account-auth.js +178 -0
  101. package/neural-interface/lib/codex-accounts.js +489 -0
  102. package/neural-interface/lib/codex-capabilities.js +2 -1
  103. package/neural-interface/lib/codex-compat-rpc.js +8 -2
  104. package/neural-interface/lib/codex-mcp-approvals.js +5 -1
  105. package/neural-interface/lib/codex-panel-auth.js +62 -0
  106. package/neural-interface/lib/codex-session-settings.js +1 -1
  107. package/neural-interface/lib/codex-settings-schema.js +120 -0
  108. package/neural-interface/lib/desktop/config.js +3 -0
  109. package/neural-interface/lib/git-bash/bzip2.js +339 -0
  110. package/neural-interface/lib/git-bash/claude-settings.js +73 -0
  111. package/neural-interface/lib/git-bash/extract-worker.js +34 -0
  112. package/neural-interface/lib/git-bash/install.js +529 -0
  113. package/neural-interface/lib/git-bash/licenses/COPYING +360 -0
  114. package/neural-interface/lib/git-bash/licenses/LGPL-2.1 +511 -0
  115. package/neural-interface/lib/git-bash/manager.js +268 -0
  116. package/neural-interface/lib/git-bash/pins.js +206 -0
  117. package/neural-interface/lib/git-bash/pins.json +34 -0
  118. package/neural-interface/lib/git-bash/resolver.js +194 -0
  119. package/neural-interface/lib/git-read.js +34 -2
  120. package/neural-interface/lib/install-details.js +145 -0
  121. package/neural-interface/lib/mcp-installer.js +14 -2
  122. package/neural-interface/lib/native-loop-providers.js +16 -3
  123. package/neural-interface/lib/native-loop-runtime.js +9 -4
  124. package/neural-interface/lib/os-path.js +319 -0
  125. package/neural-interface/lib/provider-panel-api-key-auth.js +92 -0
  126. package/neural-interface/lib/provider-panel-terminal-auth.js +95 -0
  127. package/neural-interface/lib/pty-host/core.js +2 -1
  128. package/neural-interface/lib/pty-host/manager.js +27 -2
  129. package/neural-interface/lib/remote-policy.js +20 -11
  130. package/neural-interface/lib/session-title-generator.js +4 -3
  131. package/neural-interface/lib/system-about.js +340 -0
  132. package/neural-interface/lib/system-activity.js +66 -0
  133. package/neural-interface/lib/terminal-env.js +11 -3
  134. package/neural-interface/lib/terminal-path.js +55 -0
  135. package/neural-interface/lib/virtual-socket.js +12 -1
  136. package/neural-interface/lib/whatsapp/baileys-adapter.js +165 -45
  137. package/neural-interface/lib/whatsapp/bridge.js +78 -34
  138. package/neural-interface/lib/whatsapp/commands.js +13 -14
  139. package/neural-interface/lib/whatsapp/config.js +134 -20
  140. package/neural-interface/lib/whatsapp/fake-baileys.js +99 -14
  141. package/neural-interface/lib/whatsapp/host-core.js +168 -35
  142. package/neural-interface/lib/whatsapp/inbound.js +5 -3
  143. package/neural-interface/lib/whatsapp/local-file.js +524 -0
  144. package/neural-interface/lib/whatsapp/manager.js +92 -32
  145. package/neural-interface/lib/whatsapp/paths.js +11 -1
  146. package/neural-interface/lib/whatsapp/protocol.js +65 -5
  147. package/neural-interface/lib/whatsapp/redact.js +63 -0
  148. package/neural-interface/lib/whatsapp/service.js +343 -91
  149. package/neural-interface/lib/whatsapp/transcription.js +463 -0
  150. package/neural-interface/package-lock.json +2 -2
  151. package/neural-interface/package.json +1 -1
  152. package/neural-interface/public/index.html +2 -0
  153. package/neural-interface/public/index2d.html +2 -0
  154. package/neural-interface/public/offline.html +16 -1
  155. package/neural-interface/public/onboarding.html +96 -2
  156. package/neural-interface/public/shared/account-i18n.js +7 -0
  157. package/neural-interface/public/shared/account-menu.js +539 -0
  158. package/neural-interface/public/shared/account-usage.js +19 -0
  159. package/neural-interface/public/shared/account-view.js +335 -0
  160. package/neural-interface/public/shared/agent-runtime-options.js +28 -8
  161. package/neural-interface/public/shared/assistant/asst-accounts.js +182 -184
  162. package/neural-interface/public/shared/assistant/asst-api.js +32 -2
  163. package/neural-interface/public/shared/assistant/asst-brain-picker.js +124 -25
  164. package/neural-interface/public/shared/assistant/asst-budget.js +259 -303
  165. package/neural-interface/public/shared/assistant/asst-mascot.js +126 -7
  166. package/neural-interface/public/shared/assistant/asst-menu.js +15 -3
  167. package/neural-interface/public/shared/assistant/asst-panel.js +48 -14
  168. package/neural-interface/public/shared/assistant/asst-render.js +38 -7
  169. package/neural-interface/public/shared/assistant/asst-route.js +72 -14
  170. package/neural-interface/public/shared/assistant/asst-routes-editor.js +45 -6
  171. package/neural-interface/public/shared/assistant/asst-slash.js +1 -1
  172. package/neural-interface/public/shared/assistant/asst-state.js +1 -1
  173. package/neural-interface/public/shared/assistant/asst-styles.js +99 -17
  174. package/neural-interface/public/shared/cdx/cdx-commands.js +4 -1
  175. package/neural-interface/public/shared/cdx/cdx-features.js +22 -14
  176. package/neural-interface/public/shared/cdx/cdx-icons.js +2 -0
  177. package/neural-interface/public/shared/cdx/cdx-panel.js +48 -107
  178. package/neural-interface/public/shared/cdx/cdx-settings.js +231 -0
  179. package/neural-interface/public/shared/cdx/cdx-styles.js +128 -107
  180. package/neural-interface/public/shared/cdx/cdx-tabs.js +261 -664
  181. package/neural-interface/public/shared/cdx/cdx-ws.js +2 -0
  182. package/neural-interface/public/shared/claude-account-view.js +3 -0
  183. package/neural-interface/public/shared/cli-install-view.js +392 -0
  184. package/neural-interface/public/shared/cli-status.js +282 -22
  185. package/neural-interface/public/shared/cp/cp-events.js +2 -1
  186. package/neural-interface/public/shared/cp/cp-styles.js +46 -0
  187. package/neural-interface/public/shared/desktop-bridge.js +39 -0
  188. package/neural-interface/public/shared/desktop-titlebar-page.js +59 -0
  189. package/neural-interface/public/shared/desktop-titlebar-view.js +122 -0
  190. package/neural-interface/public/shared/desktop-titlebar.js +153 -0
  191. package/neural-interface/public/shared/desktop-update-view.js +462 -0
  192. package/neural-interface/public/shared/editor/editor-panel.js +1 -1
  193. package/neural-interface/public/shared/explorer/fx-main.js +1 -1
  194. package/neural-interface/public/shared/git-bash-view.js +145 -0
  195. package/neural-interface/public/shared/html-shell.js +1 -0
  196. package/neural-interface/public/shared/i18n.js +19 -1
  197. package/neural-interface/public/shared/install-details-view.js +86 -0
  198. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +32 -0
  199. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +17 -0
  200. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +118 -0
  201. package/neural-interface/public/shared/pwa-install-page.js +3 -1
  202. package/neural-interface/public/shared/settings/settings-about-pane.js +271 -0
  203. package/neural-interface/public/shared/settings/settings-about.js +254 -0
  204. package/neural-interface/public/shared/settings/settings-ia.js +15 -0
  205. package/neural-interface/public/shared/showcase-privacy.js +489 -0
  206. package/neural-interface/public/shared/storage.js +30 -3
  207. package/neural-interface/public/shared/styles.css +278 -31
  208. package/neural-interface/public/shared/synabun-mascot.js +48 -2
  209. package/neural-interface/public/shared/ui-claude-panel.js +212 -213
  210. package/neural-interface/public/shared/ui-cli-banner.js +355 -0
  211. package/neural-interface/public/shared/ui-git-bash.js +124 -0
  212. package/neural-interface/public/shared/ui-judgments.js +10 -1
  213. package/neural-interface/public/shared/ui-loading.js +30 -6
  214. package/neural-interface/public/shared/ui-menubar.js +13 -3
  215. package/neural-interface/public/shared/ui-navbar.js +3 -1
  216. package/neural-interface/public/shared/ui-provider-auth.js +104 -0
  217. package/neural-interface/public/shared/ui-provider-terminal-auth.js +223 -0
  218. package/neural-interface/public/shared/ui-sessions.js +9 -3
  219. package/neural-interface/public/shared/ui-settings.js +55 -3
  220. package/neural-interface/public/shared/ui-sidepanel-sessions.js +3 -1
  221. package/neural-interface/public/shared/ui-sync.js +6 -0
  222. package/neural-interface/public/shared/ui-terminal.js +17 -0
  223. package/neural-interface/public/shared/ui-tool-updates.js +5 -0
  224. package/neural-interface/public/shared/ui-update.js +594 -5
  225. package/neural-interface/public/shared/ui-whatsapp.js +21 -6
  226. package/neural-interface/public/shared/whatsapp/wa-view.js +51 -8
  227. package/neural-interface/public/shared/worker-end.js +2 -0
  228. package/neural-interface/public/sw.js +1 -1
  229. package/neural-interface/public/variant/2d/main.js +10 -1
  230. package/neural-interface/public/variant/3d/main.js +10 -1
  231. package/neural-interface/server.js +1219 -608
  232. package/package.json +4 -1
  233. package/setup.js +9 -8
@@ -3,6 +3,8 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <!-- Inside the SynaBun desktop app this page lays out its own top (shared/desktop-titlebar-page.js). -->
7
+ <meta name="synabun-titlebar" content="page">
6
8
  <title>Setup - SynaBun</title>
7
9
  <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
8
10
  <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
@@ -52,6 +54,15 @@
52
54
  justify-content: center;
53
55
  }
54
56
 
57
+ /* ── Inside the SynaBun desktop app (shared/desktop-titlebar-page.js): the window has no native title bar, and a
58
+ strip along the top drags it. The logo keeps its click, and on macOS clears the traffic lights. ── */
59
+ .ob-logo { -webkit-app-region: no-drag; }
60
+ html.desktop-titlebar--darwin .ob-logo { left: calc(env(titlebar-area-x, 86px) + 12px) !important; }
61
+ /* The Details areas (desktop app): what the wizard checked and what this copy has, in the build output's box. */
62
+ .ob-details { margin-top: 12px; }
63
+ .ob-details .mcp-other-header:focus-visible { outline: 1px solid var(--accent-border); outline-offset: -1px; }
64
+ .ob-details .terminal { margin: 0; max-height: 200px; word-break: break-word; user-select: text; }
65
+
55
66
  /* Background canvas */
56
67
  #bgCanvas {
57
68
  position: fixed;
@@ -1068,7 +1079,7 @@
1068
1079
 
1069
1080
  <canvas id="bgCanvas"></canvas>
1070
1081
 
1071
- <a href="https://synabun.ai" target="_blank" rel="noopener" style="position:fixed;top:24px;left:28px;z-index:10;opacity:0.4;transition:opacity 0.2s;" onmouseenter="this.style.opacity='0.7'" onmouseleave="this.style.opacity='0.4'">
1082
+ <a href="https://synabun.ai" target="_blank" rel="noopener" class="ob-logo" style="position:fixed;top:24px;left:28px;z-index:10;opacity:0.4;transition:opacity 0.2s;" onmouseenter="this.style.opacity='0.7'" onmouseleave="this.style.opacity='0.4'">
1072
1083
  <img src="synabun.png?v=2" alt="SynaBun" style="height:34px;width:auto;">
1073
1084
  </a>
1074
1085
 
@@ -1137,6 +1148,16 @@
1137
1148
  <h2>Environment Check</h2>
1138
1149
  <p class="subtitle">Verifying your system has everything SynaBun needs.</p>
1139
1150
  <ul class="dep-list" id="depList"></ul>
1151
+ <!-- Desktop app: the commands the check ran and what they answered (shared/install-details-view.js). -->
1152
+ <div class="mcp-other-section ob-details" id="envDetails" hidden>
1153
+ <div class="mcp-other-header" id="envDetailsHeader" role="button" tabindex="0" aria-expanded="false" aria-controls="envDetailsBody">
1154
+ <span>Details</span>
1155
+ <svg class="mcp-other-chevron" viewBox="0 0 24 24" width="14" height="14" aria-hidden="true"><polyline points="6 9 12 15 18 9" fill="none" stroke="currentColor" stroke-width="2"/></svg>
1156
+ </div>
1157
+ <div class="mcp-other-body" id="envDetailsBody" style="display:none;">
1158
+ <div class="terminal" id="envDetailsLog" role="log"></div>
1159
+ </div>
1160
+ </div>
1140
1161
  </div>
1141
1162
 
1142
1163
  <!-- Step 2: Memory Name & Location -->
@@ -1192,6 +1213,16 @@
1192
1213
  </div>
1193
1214
  <div class="terminal" id="buildOutput" style="display:none"></div>
1194
1215
  <button class="action-btn" id="buildBtn">Install & Build</button>
1216
+ <!-- Desktop app: what this copy came with, every dependency with its version (shared/install-details-view.js). -->
1217
+ <div class="mcp-other-section ob-details" id="installDetails" hidden>
1218
+ <div class="mcp-other-header" id="installDetailsHeader" role="button" tabindex="0" aria-expanded="false" aria-controls="installDetailsBody">
1219
+ <span>Details</span>
1220
+ <svg class="mcp-other-chevron" viewBox="0 0 24 24" width="14" height="14" aria-hidden="true"><polyline points="6 9 12 15 18 9" fill="none" stroke="currentColor" stroke-width="2"/></svg>
1221
+ </div>
1222
+ <div class="mcp-other-body" id="installDetailsBody" style="display:none;">
1223
+ <div class="terminal" id="installDetailsLog" role="log"></div>
1224
+ </div>
1225
+ </div>
1195
1226
  </div>
1196
1227
 
1197
1228
  <!-- Step 4: Add Projects -->
@@ -1416,9 +1447,18 @@ import {
1416
1447
  // Install as an app: the wizard has no step for it. The browser's own dialog opens once, from a click that
1417
1448
  // moves the wizard on anyway (the welcome choices, Next), and the wizard never reads the answer. Also import-free.
1418
1449
  import { initPwaInstall, isStandalone, offerPwaInstallOnce } from './shared/pwa-install.js';
1450
+ import { isDesktopApp } from './shared/desktop-bridge.js';
1451
+ // The desktop app: no native title bar (a strip along the top drags the window), and Details areas under the
1452
+ // environment check and the install step. Both import-free; neither does anything in a browser.
1453
+ import { initDesktopPageTitleBar } from './shared/desktop-titlebar-page.js';
1454
+ import { environmentLines, installLines } from './shared/install-details-view.js';
1455
+
1456
+ initDesktopPageTitleBar();
1419
1457
 
1420
1458
  // Chrome and Edge hand the page their install event when it can be installed; Safari and Firefox have none.
1421
- if (!isStandalone()) initPwaInstall();
1459
+ // The SynaBun desktop app is its own window: it never asks for the event, so offerPwaInstallOnce() has none
1460
+ // to open there.
1461
+ if (!isStandalone() && !isDesktopApp()) initPwaInstall();
1422
1462
 
1423
1463
  // ═══════════════════════════════════════════
1424
1464
  // STATE
@@ -2152,10 +2192,63 @@ async function onDepsStep() {
2152
2192
  detail.innerHTML = `${dep.detail} &mdash; <a href="${dep.url}" target="_blank" rel="noopener">Download \u2197</a>`;
2153
2193
  }
2154
2194
  }
2195
+ showDetails('envDetails', environmentLines, 1);
2155
2196
  }
2156
2197
 
2157
2198
  function wait(ms) { return new Promise(r => setTimeout(r, ms)); }
2158
2199
 
2200
+ // ═══════════════════════════════════════════
2201
+ // DETAILS (desktop app): what the wizard checked and what this copy has
2202
+ // ═══════════════════════════════════════════
2203
+ // GET /api/setup/install-details, read once; open by default, collapsible. An npm or Git install shows none.
2204
+
2205
+ const SHOW_DETAILS = isDesktopApp();
2206
+ let installDetailsRequest = null;
2207
+ function loadInstallDetails() {
2208
+ if (!installDetailsRequest) {
2209
+ installDetailsRequest = fetch('/api/setup/install-details')
2210
+ .then(res => (res.ok ? res.json() : Promise.reject(new Error(`the server answered ${res.status}`))))
2211
+ .catch((error) => { installDetailsRequest = null; throw error; });
2212
+ }
2213
+ return installDetailsRequest;
2214
+ }
2215
+
2216
+ function openDetails(prefix, stepIndex, open) {
2217
+ const section = document.getElementById(prefix);
2218
+ section.classList.toggle('open', open);
2219
+ document.getElementById(`${prefix}Body`).style.display = open ? '' : 'none';
2220
+ document.getElementById(`${prefix}Header`).setAttribute('aria-expanded', String(open));
2221
+ requestAnimationFrame(() => resizeViewport(stepIndex));
2222
+ }
2223
+
2224
+ function wireDetails(prefix, stepIndex) {
2225
+ const header = document.getElementById(`${prefix}Header`);
2226
+ const toggle = () => openDetails(prefix, stepIndex, !document.getElementById(prefix).classList.contains('open'));
2227
+ header.addEventListener('click', toggle);
2228
+ header.addEventListener('keydown', (event) => {
2229
+ if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); toggle(); }
2230
+ });
2231
+ }
2232
+ wireDetails('envDetails', 1);
2233
+ wireDetails('installDetails', 3);
2234
+
2235
+ async function showDetails(prefix, linesOf, stepIndex) {
2236
+ if (!SHOW_DETAILS) return;
2237
+ const section = document.getElementById(prefix);
2238
+ const log = document.getElementById(`${prefix}Log`);
2239
+ const first = section.hidden;
2240
+ section.hidden = false;
2241
+ if (first) openDetails(prefix, stepIndex, true);
2242
+ log.textContent = 'Reading what this copy has\u2026';
2243
+ try {
2244
+ const lines = linesOf(await loadInstallDetails());
2245
+ log.textContent = lines.length ? lines.join('\n') : 'Nothing to show.';
2246
+ } catch (err) {
2247
+ log.textContent = `Could not read the details: ${err.message}`;
2248
+ }
2249
+ resizeViewport(stepIndex);
2250
+ }
2251
+
2159
2252
  // ═══════════════════════════════════════════
2160
2253
  // STEP 3: Install & Build
2161
2254
  // ═══════════════════════════════════════════
@@ -2225,6 +2318,7 @@ async function onBuildStep() {
2225
2318
  $btn.textContent = 'Already Done';
2226
2319
  $btn.classList.add('success');
2227
2320
  $btn.disabled = true;
2321
+ showDetails('installDetails', installLines, 3);
2228
2322
  return;
2229
2323
  }
2230
2324
  } catch {}
@@ -0,0 +1,7 @@
1
+ // Hands the page's translator to account-view.js (`accounts.*` in i18n/*.json).
2
+ // Browser-only: i18n.js reads the page's storage, so node tests load
3
+ // account-view.js without it and get the English.
4
+ import { t } from './i18n.js';
5
+ import { setAccountTranslator } from './account-view.js';
6
+
7
+ setAccountTranslator((key, params) => t(`accounts.${key}`, params));