@fased/fased 0.1.17 → 0.1.19

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 (227) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/{agents-ZHlcYNOm.js → agents-ET0n9FED.js} +11 -11
  3. package/dist/{attachment-normalize-BhPZ6uGO.js → attachment-normalize-CDK3Kj-a.js} +1 -1
  4. package/dist/{attachment-normalize-DTYtewZr.js → attachment-normalize-DMabJMU0.js} +1 -1
  5. package/dist/{audio-preflight-C7mBThF7.js → audio-preflight-CK4s7Cpe.js} +1 -1
  6. package/dist/{audio-preflight-ChwzRQPs.js → audio-preflight-CKsWKtOL.js} +2 -2
  7. package/dist/{audio-preflight-DVSnVlYd.js → audio-preflight-CtOWrCYT.js} +2 -2
  8. package/dist/{audio-preflight-CoQcqjKr.js → audio-preflight-D4ml3rER.js} +3 -3
  9. package/dist/{audio-preflight-Bi4VdYUO.js → audio-preflight-DnxL2DTu.js} +3 -3
  10. package/dist/{audit-DQnuqc0U.js → audit-Cw2GhO1l.js} +1 -1
  11. package/dist/{audit-CSWfakpx.js → audit-DBfVTWuR.js} +1 -1
  12. package/dist/{auth-CqkGNO1B.js → auth-D6aXaEgt.js} +5 -5
  13. package/dist/{auth-choice-CN9gyA5O.js → auth-choice-CRcRJvDg.js} +2 -2
  14. package/dist/{auth-choice-wNIst3YG.js → auth-choice-DCd_rmJr.js} +2 -2
  15. package/dist/{auth-choice-prompt-Dsfpbz6G.js → auth-choice-prompt-BBY8vO5H.js} +1 -1
  16. package/dist/{auth-choice-prompt-DvnUYnyW.js → auth-choice-prompt-CHAO6E_x.js} +1 -1
  17. package/dist/build-info.json +3 -3
  18. package/dist/bundled/boot-md/handler.js +2 -2
  19. package/dist/bundled/session-memory/handler.js +2 -2
  20. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  21. package/dist/{channel-web-I-U78wmf.js → channel-web-B90TOW9f.js} +1 -1
  22. package/dist/{channel-web-kLuTpWVX.js → channel-web-rogzKqNR.js} +1 -1
  23. package/dist/{channels-Cs8acObo.js → channels-BDdw6tRB.js} +9 -9
  24. package/dist/{channels-B3fxmvYP.js → channels-CIVRD15I.js} +9 -9
  25. package/dist/{channels-cli-C29njyWF.js → channels-cli-BlinY5L-.js} +6 -6
  26. package/dist/{channels-cli-D8zA2RvX.js → channels-cli-nB_AyrYg.js} +6 -6
  27. package/dist/{clack-prompter-D2fuSvy3.js → clack-prompter-DhFjwbXA.js} +110 -40
  28. package/dist/{clack-prompter-DsooqWFU.js → clack-prompter-Q_PN4iLX.js} +110 -40
  29. package/dist/cli/daemon-cli.js +1 -1
  30. package/dist/{cli-C0NqNpAe.js → cli-BkrcbFie.js} +3 -3
  31. package/dist/{cli-Mlqh5AdT.js → cli-DWyf6Ez0.js} +3 -3
  32. package/dist/{command-registry-B9_A3_Dx.js → command-registry-D0xhHn9Z.js} +9 -9
  33. package/dist/{completion-cli-Chx2En3m.js → completion-cli-BDgp9s2D.js} +2 -2
  34. package/dist/{completion-cli-C0A6ihvd.js → completion-cli-BpN_WF59.js} +1 -1
  35. package/dist/{config-cli-CMAn1M38.js → config-cli-D51JAiE2.js} +1 -1
  36. package/dist/{config-cli-yHQ8paR9.js → config-cli-Di8fNvh8.js} +1 -1
  37. package/dist/{config-guard-C74yuV1t.js → config-guard-D6r7usdP.js} +2 -2
  38. package/dist/{config-guard-ComvK070.js → config-guard-DnCSSIeP.js} +1 -1
  39. package/dist/{configure-BKSkbv4h.js → configure-CLUalzZB.js} +16 -16
  40. package/dist/{configure-Bc3GK0rN.js → configure-ZAJqoe8C.js} +16 -16
  41. package/dist/control-ui/assets/app-DXYMrRJ9.js.map +1 -1
  42. package/dist/{cron-cli-ApRsS-YG.js → cron-cli-CCfMl1ch.js} +2 -2
  43. package/dist/{cron-cli-DqPi-kbY.js → cron-cli-COETwgMD.js} +2 -2
  44. package/dist/{daemon-cli-DXHOflkW.js → daemon-cli-BwMJ_sub.js} +1 -1
  45. package/dist/{daemon-cli-DgdTmunC.js → daemon-cli-DUfzwrLw.js} +1 -1
  46. package/dist/daemon-cli.js +1 -1
  47. package/dist/{deps-fM7SZdlB.js → deps-BoCGz3bU.js} +1 -1
  48. package/dist/{deps-BVX6nj7c.js → deps-vuWHR8ix.js} +1 -1
  49. package/dist/{doctor-config-flow-4WutpMTV.js → doctor-config-flow-B-I0osH5.js} +1 -1
  50. package/dist/{doctor-config-flow-Cd9O0xNE.js → doctor-config-flow-Ceaz-Gkk.js} +1 -1
  51. package/dist/entry.js +1 -1
  52. package/dist/extensionAPI.js +2 -2
  53. package/dist/{gateway-cli-CGMY4qqc.js → gateway-cli-DAaMYDEy.js} +28 -28
  54. package/dist/{gateway-cli-B97xz3Px.js → gateway-cli-DcooukDx.js} +28 -28
  55. package/dist/{health-CdW7K4YP.js → health-CD-e8iEW.js} +2 -2
  56. package/dist/{health-Bn6vWkyn.js → health-c7sJIXY9.js} +2 -2
  57. package/dist/{heartbeat-runner-DIftlHX6.js → heartbeat-runner-BTRTcwja.js} +1 -1
  58. package/dist/{heartbeat-runner-B6wpYjuS.js → heartbeat-runner-DZuApcd1.js} +1 -1
  59. package/dist/{hooks-cli-CkFOVlH3.js → hooks-cli--azOmGId.js} +4 -4
  60. package/dist/{hooks-cli-Bh_WRNX5.js → hooks-cli-Bq6e41xH.js} +4 -4
  61. package/dist/index.js +9 -9
  62. package/dist/{ipv4-DT7rmgG8.js → ipv4-BKbsAV5a.js} +2 -2
  63. package/dist/{ipv4-6svR7SNz.js → ipv4-Bxa3Ql2B.js} +2 -2
  64. package/dist/{lifecycle-B9_sK7Lg.js → lifecycle-DE4kux0k.js} +1 -1
  65. package/dist/{lifecycle-BR79mC_A.js → lifecycle-DKOezW7h.js} +1 -1
  66. package/dist/{list.auth-overview-9xaYIGIY.js → list.auth-overview-DQlFpghW.js} +1 -1
  67. package/dist/{list.auth-overview-CAxvB_TW.js → list.auth-overview-SasQirvR.js} +1 -1
  68. package/dist/llm-slug-generator.js +2 -2
  69. package/dist/{model-catalog-B3hPEPfU.js → model-catalog-DHRVUWBf.js} +12 -8
  70. package/dist/{models-CGYvzn8x.js → models-CIAvUTl5.js} +7 -7
  71. package/dist/{models-cli-lhXhYVIL.js → models-cli-BW4m-HHk.js} +8 -8
  72. package/dist/{models-cli-CNGqdXNr.js → models-cli-CxRv-tjs.js} +7 -7
  73. package/dist/{node-cli-Crt3RJFB.js → node-cli--1sHB0Pz.js} +3 -3
  74. package/dist/{node-cli-BU8uKipw.js → node-cli-CsYpYqHF.js} +3 -3
  75. package/dist/{note-DrwZGnSu.js → note-DwkETqd-.js} +2 -0
  76. package/dist/{note-CLUeye9D.js → note-rV2vspIo.js} +2 -0
  77. package/dist/{onboard-D3lGTn86.js → onboard-BoT3D8J9.js} +8 -8
  78. package/dist/{onboard-channels-DKCvEt36.js → onboard-channels-BREKCcFf.js} +2 -2
  79. package/dist/{onboard-channels-EXJRjGSu.js → onboard-channels-fJXaj04M.js} +2 -2
  80. package/dist/{onboard-CTW2Nw9r.js → onboard-lbl9C2gj.js} +8 -8
  81. package/dist/{onboard-search-L1prKL6U.js → onboard-search-C6A1sfph.js} +6 -6
  82. package/dist/{onboard-search-1iOn9oPJ.js → onboard-search-D-tM9Xrg.js} +6 -6
  83. package/dist/{onboarding-DiEiT_LB.js → onboarding-Bejkgd8a.js} +94 -41
  84. package/dist/{onboarding-DeTMPDGg.js → onboarding-C8AUR3x1.js} +94 -41
  85. package/dist/{openresponses-http-BY6b2lDC.js → openresponses-http-BR0xNXbf.js} +2 -2
  86. package/dist/{openresponses-http-BJx01ruC.js → openresponses-http-BYKqYqIr.js} +1 -1
  87. package/dist/{openresponses-http-DaFH5UEc.js → openresponses-http-C8H-a3KL.js} +3 -3
  88. package/dist/{openresponses-http-kIRkHsD1.js → openresponses-http-CyP-RUzR.js} +2 -2
  89. package/dist/{openresponses-http-CQhCnjXY.js → openresponses-http-DNXaz2VR.js} +3 -3
  90. package/dist/{parent-default-help-BVu8jqwL.js → parent-default-help-B57KLY1o.js} +1 -1
  91. package/dist/{parent-default-help-Da2SaoCP.js → parent-default-help-B9-EyEJR.js} +1 -1
  92. package/dist/{paths-D2Fac7_V.js → paths-BGX-IMoI.js} +9 -9
  93. package/dist/{paths-DuymR5Rg.js → paths-Bzz-O3FX.js} +9 -9
  94. package/dist/{pi-embedded-BZv4Mjvw.js → pi-embedded-Dtw2m41q.js} +14 -14
  95. package/dist/{pi-embedded-B-qXRnRI.js → pi-embedded-G-VYb-eT.js} +14 -14
  96. package/dist/{plugin-registry-BgHwN_Lg.js → plugin-registry-C5c96kNk.js} +1 -1
  97. package/dist/{plugin-registry-BjOVIPs_.js → plugin-registry-Dr7BDkEc.js} +1 -1
  98. package/dist/plugin-sdk/{audio-preflight-B7YdvtUo.js → audio-preflight-Bf83dqiV.js} +1 -1
  99. package/dist/plugin-sdk/{audio-preflight-CS0BGiq5.js → audio-preflight-jaSZX_On.js} +1 -1
  100. package/dist/plugin-sdk/channel-plugin-common.js +1 -1
  101. package/dist/plugin-sdk/{channel-web-D7r6o_Nr.js → channel-web-Bu6Y92kC.js} +1 -1
  102. package/dist/plugin-sdk/command-status.js +1 -1
  103. package/dist/plugin-sdk/index.js +2 -2
  104. package/dist/plugin-sdk/{openresponses-http-aRyVxWnA.js → openresponses-http-M74cHGFJ.js} +1 -1
  105. package/dist/plugin-sdk/{openresponses-http-B2uRew9H.js → openresponses-http-gCxCNpHu.js} +1 -1
  106. package/dist/plugin-sdk/{pi-model-discovery-runtime-BWcaNxzp.js → pi-model-discovery-runtime-FgSYY3zE.js} +1 -1
  107. package/dist/plugin-sdk/{registry-DXXOSq_V.js → registry-DyRgZdL8.js} +8 -8
  108. package/dist/plugin-sdk/{reply-BlEQIxRB.js → reply-Bu9GXy54.js} +5 -5
  109. package/dist/plugin-sdk/src/brand.d.ts +2 -2
  110. package/dist/plugin-sdk/{status-C5KavVSM.js → status-DLh4u6pb.js} +5 -5
  111. package/dist/plugin-sdk/{web-C2qvRemd.js → web-BLZesoTn.js} +2 -2
  112. package/dist/plugin-sdk/{web-D3SBL6WL.js → web-BqmhQeOi.js} +1 -1
  113. package/dist/{plugins-cli-BgktSjQJ.js → plugins-cli-CpElRRGB.js} +6 -6
  114. package/dist/{plugins-cli-CKPZJor1.js → plugins-cli-hFcodPhF.js} +6 -6
  115. package/dist/{program-Nydl3I9b.js → program-ByNjbwln.js} +9 -9
  116. package/dist/{program-context-B2v5DYdk.js → program-context-BJ6EvoUW.js} +25 -25
  117. package/dist/{prompt-select-styled-BFIFk4AL.js → prompt-select-styled-DyUwhQR0.js} +8 -8
  118. package/dist/{prompt-select-styled-BjXEmV9l.js → prompt-select-styled-yZlzGWDe.js} +8 -8
  119. package/dist/{prompt-style-Wxki8rmI.js → prompt-style-CWAacuMq.js} +1 -2
  120. package/dist/{prompt-style-DxKPs6E0.js → prompt-style-Rmj3c-Ir.js} +1 -2
  121. package/dist/{providers-cli-DBG7T-38.js → providers-cli-BWZUM8kN.js} +3 -3
  122. package/dist/{providers-cli-DsUpaNkE.js → providers-cli-Dwb_MRo-.js} +3 -3
  123. package/dist/{pw-ai-CJ0aPd9o.js → pw-ai-42y3optV.js} +1 -1
  124. package/dist/{pw-ai-BWWVm40d.js → pw-ai-D6eWnTeA.js} +1 -1
  125. package/dist/{register.agent-CKCyVnHe.js → register.agent-DYThb3Qq.js} +12 -12
  126. package/dist/{register.agent-DMvHMzcw.js → register.agent-QbjX69Zq.js} +11 -11
  127. package/dist/{register.configure-ByF8uG5S.js → register.configure-CGzVdNRF.js} +16 -16
  128. package/dist/{register.configure-BUBxqquw.js → register.configure-CXn_6bwZ.js} +16 -16
  129. package/dist/{register.maintenance-C5PWlFfJ.js → register.maintenance-Cf-qQw2A.js} +13 -13
  130. package/dist/{register.maintenance-BGNb_S6N.js → register.maintenance-CiSlTmn6.js} +12 -12
  131. package/dist/{register.message-BWwA-s6K.js → register.message-Bz8Q1BDo.js} +4 -4
  132. package/dist/{register.message-aTN70VzV.js → register.message-CxejzCev.js} +4 -4
  133. package/dist/{register.onboard-Dlqyei9e.js → register.onboard-D-DkLJKD.js} +18 -18
  134. package/dist/{register.onboard-Dz42-nKS.js → register.onboard-DUvd2gzi.js} +18 -18
  135. package/dist/{register.setup-CNOjFVTJ.js → register.setup-BotpXpFX.js} +18 -18
  136. package/dist/{register.setup-B6v02LXR.js → register.setup-CzJsqVIe.js} +18 -18
  137. package/dist/{register.status-health-sessions-C3ItbaQ1.js → register.status-health-sessions-C9Zx-J4Y.js} +7 -7
  138. package/dist/{register.status-health-sessions-CmmN6MLd.js → register.status-health-sessions-IUpygKVu.js} +7 -7
  139. package/dist/{register.subclis-DESt0tVl.js → register.subclis-BtJ07gvR.js} +17 -17
  140. package/dist/{reply-jd1xrxXq.js → reply-BRoR6TOO.js} +12 -8
  141. package/dist/{run-main-D3CwNCnW.js → run-main-J8mnTN8L.js} +18 -18
  142. package/dist/{runtime-helper-grants-BRXTUail.js → runtime-helper-grants-CkoxSD6G.js} +1 -1
  143. package/dist/{runtime-helper-grants-BHKX5oKE.js → runtime-helper-grants-DMNl5B0x.js} +1 -1
  144. package/dist/{sandbox-cli-4kOH-DPO.js → sandbox-cli-CNyUbQKy.js} +3 -3
  145. package/dist/{sandbox-cli-DEc6XQT-.js → sandbox-cli-DfarPDi7.js} +3 -3
  146. package/dist/{security-cli-BUh3X9_F.js → security-cli-DYUEfOxV.js} +4 -4
  147. package/dist/{security-cli-B7M2Oc7k.js → security-cli-DfH_yEpS.js} +4 -4
  148. package/dist/{server-DtYT7_5l.js → server-3-CquHGG.js} +3 -3
  149. package/dist/{server-SVBXgb1K.js → server-OnS0sRn3.js} +3 -3
  150. package/dist/{server-cron-DYlWj-q5.js → server-cron-BclI8dUt.js} +2 -2
  151. package/dist/{server-cron-CW7fwBiW.js → server-cron-CB9ay7nN.js} +2 -2
  152. package/dist/{server-node-events-DKiw7ErS.js → server-node-events-B3wjSbTf.js} +4 -4
  153. package/dist/{server-node-events-CHxrrTwp.js → server-node-events-CHH1pmQi.js} +4 -4
  154. package/dist/{status-BMkqIbDJ.js → status-Cf-x3WJB.js} +1 -1
  155. package/dist/{status-CZGCfZGF.js → status-DhGsqqOx.js} +1 -1
  156. package/dist/{status-Aws79pOr.js → status-SrKDBHd_.js} +4 -4
  157. package/dist/{status-BlE8umrs.js → status-kfsSxAsl.js} +4 -4
  158. package/dist/{systemd-linger-9E60sw1j.js → systemd-linger-BTw_D-6k.js} +1 -1
  159. package/dist/{systemd-linger-BYFLOJbt.js → systemd-linger-BlmGMvvA.js} +1 -1
  160. package/dist/{tui-D_G4_9GB.js → tui-CIzUfHHB.js} +1 -1
  161. package/dist/{tui-El8PxPJw.js → tui-Cvc1YA_t.js} +1 -1
  162. package/dist/{tui-cli-DcfQ-oMv.js → tui-cli-BxyfSTll.js} +4 -4
  163. package/dist/{tui-cli-Crw0SZCT.js → tui-cli-D8ECRV-M.js} +4 -4
  164. package/dist/{update-cli-CX_5mVD4.js → update-cli-C1i3_uQZ.js} +13 -13
  165. package/dist/{update-cli-Dopc5Usd.js → update-cli-TMwGWZhI.js} +14 -14
  166. package/dist/{update-runner-Cd2MGute.js → update-runner-C6krqlIN.js} +1 -1
  167. package/dist/{update-runner-Iqgqs2dk.js → update-runner-ChBrrXIl.js} +1 -1
  168. package/dist/{web-CZCMgwva.js → web-CjKdghAZ.js} +4 -4
  169. package/dist/{web-ChYNYLuI.js → web-CnR4rHHv.js} +1 -1
  170. package/dist/{web-DnANur60.js → web-CoSbILfi.js} +2 -2
  171. package/dist/{web-y_U81dLD.js → web-l7WkPuq4.js} +2 -2
  172. package/dist/{web-search-providers.runtime-i1RoCwml.js → web-search-providers.runtime-B09rLDoa.js} +1 -1
  173. package/dist/{web-search-providers.runtime-CNjTAhI3.js → web-search-providers.runtime-BC_EmT37.js} +1 -1
  174. package/dist/{web-E9FagaIu.js → web-vOcMOS29.js} +4 -4
  175. package/docs/gateway/tailscale.md +44 -0
  176. package/docs/images/screenshots/local/chat-ui-1.png +0 -0
  177. package/docs/images/screenshots/local/final-ui-1.png +0 -0
  178. package/docs/images/screenshots/local/local-ui-1.png +0 -0
  179. package/docs/images/screenshots/local/local-ui-2.png +0 -0
  180. package/docs/images/screenshots/local/model-ui-1.png +0 -0
  181. package/docs/images/screenshots/local/wallet-ui-2.png +0 -0
  182. package/docs/install/index.md +26 -5
  183. package/docs/install/vps.md +27 -7
  184. package/docs/start/agent-wallet-mining-walkthrough.md +17 -1
  185. package/extensions/acpx/package.json +1 -1
  186. package/extensions/bluebubbles/package.json +1 -1
  187. package/extensions/copilot-proxy/package.json +1 -1
  188. package/extensions/diagnostics-otel/package.json +1 -1
  189. package/extensions/discord/package.json +1 -1
  190. package/extensions/fased-federation/package.json +1 -1
  191. package/extensions/feishu/package.json +1 -1
  192. package/extensions/google-gemini-cli-auth/package.json +1 -1
  193. package/extensions/googlechat/package.json +1 -1
  194. package/extensions/imessage/package.json +1 -1
  195. package/extensions/irc/package.json +1 -1
  196. package/extensions/line/package.json +1 -1
  197. package/extensions/llm-task/package.json +1 -1
  198. package/extensions/lobster/package.json +1 -1
  199. package/extensions/matrix/CHANGELOG.md +12 -0
  200. package/extensions/matrix/package.json +1 -1
  201. package/extensions/mattermost/package.json +1 -1
  202. package/extensions/memory-core/package.json +1 -1
  203. package/extensions/memory-lancedb/package.json +1 -1
  204. package/extensions/minimax-portal-auth/package.json +1 -1
  205. package/extensions/msteams/CHANGELOG.md +12 -0
  206. package/extensions/msteams/package.json +1 -1
  207. package/extensions/nextcloud-talk/package.json +1 -1
  208. package/extensions/nostr/CHANGELOG.md +12 -0
  209. package/extensions/nostr/package.json +1 -1
  210. package/extensions/open-prose/package.json +1 -1
  211. package/extensions/sat-mining/package.json +1 -1
  212. package/extensions/signal/package.json +1 -1
  213. package/extensions/slack/package.json +1 -1
  214. package/extensions/synology-chat/package.json +1 -1
  215. package/extensions/telegram/package.json +1 -1
  216. package/extensions/tlon/package.json +1 -1
  217. package/extensions/twitch/CHANGELOG.md +12 -0
  218. package/extensions/twitch/package.json +1 -1
  219. package/extensions/voice-call/CHANGELOG.md +12 -0
  220. package/extensions/voice-call/package.json +1 -1
  221. package/extensions/whatsapp/package.json +1 -1
  222. package/extensions/zalo/CHANGELOG.md +12 -0
  223. package/extensions/zalo/package.json +1 -1
  224. package/extensions/zalouser/CHANGELOG.md +12 -0
  225. package/extensions/zalouser/package.json +1 -1
  226. package/package.json +1 -1
  227. package/docs/images/screenshots/local/wallet-ui-1.png +0 -0
@@ -1,6 +1,6 @@
1
1
  import { Ba as normalizeOptionalSecretInput, Cu as formatCliCommand, Ii as resolveApiKeyForProfile, Ji as resolveDefaultSecretProviderAlias, Oa as loadPluginManifestRegistry, Pr as normalizeProviderId, Qt as readConfigFileSnapshot, Va as normalizeSecretInput, _n as parseDurationMs, di as resolveEnvApiKey, fa as upsertAuthProfile, ka as assertSupportedRuntime, ki as resolveAuthProfileOrder, ma as ensureAuthProfileStore, tn as writeConfigFile } from "./env-C77feXxI.js";
2
2
  import { x as resolveUserPath } from "./agent-paths-BI1hx-tF.js";
3
- import { A as waitForGatewayReachable, E as resolveControlUiLinks, T as randomToken, d as DEFAULT_WORKSPACE, f as applyWizardMetadata, h as ensureWorkspaceAndSessions, s as resolvePluginProviders, v as handleOnboardingRepair } from "./model-catalog-B3hPEPfU.js";
3
+ import { A as waitForGatewayReachable, E as resolveControlUiLinks, T as randomToken, d as DEFAULT_WORKSPACE, f as applyWizardMetadata, h as ensureWorkspaceAndSessions, s as resolvePluginProviders, v as handleOnboardingRepair } from "./model-catalog-DHRVUWBf.js";
4
4
  import { A as defaultRuntime, gt as resolveGatewayPort, j as restoreTerminalState } from "./entry.js";
5
5
  import { a as readWalletProviderRegistry, f as setWalletProvidersEnabled, t as WALLET_PROVIDER_IDS } from "./wallet-provider-registry-CFNtQ2ZR.js";
6
6
  import { or as clearDeviceAuthStore } from "./call-B9EvxMq6.js";
@@ -8,15 +8,15 @@ import { r as isGatewayDaemonRuntime, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from
8
8
  import { a as resolveHostedOnboardingGatewayStartupMode, n as gatewayInstallErrorHint, t as buildGatewayInstallPlan } from "./daemon-install-helpers-BB0qUcut.js";
9
9
  import { r as isSystemdUserServiceAvailable } from "./systemd-B8OPQXFR.js";
10
10
  import { t as resolveGatewayService } from "./service-2JBjv-ge.js";
11
- import { d as resolveCustomProviderId, l as parseNonInteractiveCustomApiFlags, o as CustomApiError, s as applyCustomApiConfig } from "./ipv4-DT7rmgG8.js";
12
- import { i as healthCommand } from "./health-CdW7K4YP.js";
13
- import { $ as applyLitellmConfig, At as validateAnthropicSetupToken, B as applyMistralConfig, Ct as setXaiApiKey, Dt as MINIMAX_HIGHSPEED_MODEL_ID, Et as MINIMAX_DEFAULT_MODEL_ID, F as applyMinimaxApiConfig, Ft as resolveManifestProviderAuthChoice, G as applyQwenCodingPlanConfig, H as applyMoonshotConfigCn, I as applyMinimaxApiConfigCn, J as applyTogetherConfig, K as applyQwenConfig, L as applyAuthProfileConfig$1, M as detectZaiEndpoint, Mt as normalizeSecretInputModeInput, N as applyGoogleGeminiModelDefault, P as applyOpencodeZenConfig, Pt as resolveManifestDeprecatedProviderAuthChoice, Q as applyZaiConfig, R as applyHuggingfaceConfig, St as setVolcengineApiKey, Tt as setZaiApiKey, U as applyOpenrouterConfig, V as applyMoonshotConfig, W as applyQianfanConfig, X as applyXaiConfig, Y as applyVeniceConfig, Z as applyXiaomiConfig, _t as setQwenCodingPlanApiKey, at as setGeminiApiKey, bt as setVeniceApiKey, c as applyDefaultModel, ct as setLitellmApiKey, d as resolveProviderMatch, dt as setMoonshotApiKey, et as applyCloudflareAiGatewayConfig, ft as setOpenaiApiKey, gt as setQwenApiKey, ht as setQianfanApiKey, i as applyOpenAIConfig, it as setCloudflareAiGatewayConfig, kt as buildTokenProfileId, l as mergeConfigPatch, lt as setMinimaxApiKey, m as applyPrimaryModel, mt as setOpenrouterApiKey, nt as setAnthropicApiKey, o as applyAuthProfileConfig, ot as setHuggingfaceApiKey, pt as setOpencodeZenApiKey, q as applySyntheticConfig, rt as setByteplusApiKey, s as buildApiKeyCredential, st as setKimiCodingApiKey, tt as applyVercelAiGatewayConfig, u as pickAuthMethod, ut as setMistralApiKey, vt as setSyntheticApiKey, wt as setXiaomiApiKey, xt as setVercelAiGatewayApiKey, yt as setTogetherApiKey, z as applyKimiCodeConfig } from "./auth-choice-CN9gyA5O.js";
14
- import { a as normalizeLegacyOnboardAuthChoice, i as isDeprecatedAuthChoice, r as resolveOnboardProviderAuthFlags } from "./auth-choice-prompt-DvnUYnyW.js";
11
+ import { d as resolveCustomProviderId, l as parseNonInteractiveCustomApiFlags, o as CustomApiError, s as applyCustomApiConfig } from "./ipv4-BKbsAV5a.js";
12
+ import { i as healthCommand } from "./health-CD-e8iEW.js";
13
+ import { $ as applyLitellmConfig, At as validateAnthropicSetupToken, B as applyMistralConfig, Ct as setXaiApiKey, Dt as MINIMAX_HIGHSPEED_MODEL_ID, Et as MINIMAX_DEFAULT_MODEL_ID, F as applyMinimaxApiConfig, Ft as resolveManifestProviderAuthChoice, G as applyQwenCodingPlanConfig, H as applyMoonshotConfigCn, I as applyMinimaxApiConfigCn, J as applyTogetherConfig, K as applyQwenConfig, L as applyAuthProfileConfig$1, M as detectZaiEndpoint, Mt as normalizeSecretInputModeInput, N as applyGoogleGeminiModelDefault, P as applyOpencodeZenConfig, Pt as resolveManifestDeprecatedProviderAuthChoice, Q as applyZaiConfig, R as applyHuggingfaceConfig, St as setVolcengineApiKey, Tt as setZaiApiKey, U as applyOpenrouterConfig, V as applyMoonshotConfig, W as applyQianfanConfig, X as applyXaiConfig, Y as applyVeniceConfig, Z as applyXiaomiConfig, _t as setQwenCodingPlanApiKey, at as setGeminiApiKey, bt as setVeniceApiKey, c as applyDefaultModel, ct as setLitellmApiKey, d as resolveProviderMatch, dt as setMoonshotApiKey, et as applyCloudflareAiGatewayConfig, ft as setOpenaiApiKey, gt as setQwenApiKey, ht as setQianfanApiKey, i as applyOpenAIConfig, it as setCloudflareAiGatewayConfig, kt as buildTokenProfileId, l as mergeConfigPatch, lt as setMinimaxApiKey, m as applyPrimaryModel, mt as setOpenrouterApiKey, nt as setAnthropicApiKey, o as applyAuthProfileConfig, ot as setHuggingfaceApiKey, pt as setOpencodeZenApiKey, q as applySyntheticConfig, rt as setByteplusApiKey, s as buildApiKeyCredential, st as setKimiCodingApiKey, tt as applyVercelAiGatewayConfig, u as pickAuthMethod, ut as setMistralApiKey, vt as setSyntheticApiKey, wt as setXiaomiApiKey, xt as setVercelAiGatewayApiKey, yt as setTogetherApiKey, z as applyKimiCodeConfig } from "./auth-choice-CRcRJvDg.js";
14
+ import { a as normalizeLegacyOnboardAuthChoice, i as isDeprecatedAuthChoice, r as resolveOnboardProviderAuthFlags } from "./auth-choice-prompt-CHAO6E_x.js";
15
15
  import { n as logConfigUpdated } from "./logging-DZ32I_SP.js";
16
- import { a as applyRecommendedInternalHooks, i as isHostedSecurityCapableSession, n as applyHostingSecurity, o as applyOnboardingLocalWorkspaceConfig, r as configureFederationForOnboarding, t as runOnboardingWizard } from "./onboarding-DeTMPDGg.js";
16
+ import { a as applyRecommendedInternalHooks, i as isHostedSecurityCapableSession, n as applyHostingSecurity, o as applyOnboardingLocalWorkspaceConfig, r as configureFederationForOnboarding, t as runOnboardingWizard } from "./onboarding-C8AUR3x1.js";
17
17
  import { t as WizardCancelledError } from "./prompts-DdS4bZNt.js";
18
- import { t as createClackPrompter } from "./clack-prompter-D2fuSvy3.js";
19
- import { n as ensureSystemdUserLingerNonInteractive } from "./systemd-linger-BYFLOJbt.js";
18
+ import { t as createClackPrompter } from "./clack-prompter-DhFjwbXA.js";
19
+ import { n as ensureSystemdUserLingerNonInteractive } from "./systemd-linger-BlmGMvvA.js";
20
20
  import { t as formatHealthCheckFailure } from "./health-format-DEsFwYbP.js";
21
21
 
22
22
  //#region src/commands/onboard-interactive.ts
@@ -2,7 +2,7 @@ import { $c as installPluginFromNpmSpec, Wa as coerceSecretRef, pd as resolveFas
2
2
  import { i as CONFIG_DIR, p as isRecord, x as resolveUserPath } from "./agent-paths-BI1hx-tF.js";
3
3
  import "./send-D7X0_iFp.js";
4
4
  import "./send-BFEd4vCM.js";
5
- import "./model-catalog-B3hPEPfU.js";
5
+ import "./model-catalog-DHRVUWBf.js";
6
6
  import "./github-copilot-token-A9DiaCB0.js";
7
7
  import "./reply-prefix-TUhpEtvr.js";
8
8
  import "./memory-2keYbXkc.js";
@@ -44,7 +44,7 @@ import "./send-C-su1wPZ.js";
44
44
  import "./outbound-attachment-Bh4FmcYg.js";
45
45
  import "./fetch-BVvWzHT_.js";
46
46
  import "./delivery-queue-55Cityuq.js";
47
- import "./deps-fM7SZdlB.js";
47
+ import "./deps-BoCGz3bU.js";
48
48
  import "./frontmatter-D2UNJikU.js";
49
49
  import "./skills-Dis31awJ.js";
50
50
  import "./skills-remote-CIAB0AXm.js";
@@ -71,14 +71,14 @@ import "./cli-utils-XevKf-tr.js";
71
71
  import "./help-format-B2DRdx98.js";
72
72
  import "./progress-DkVYFLij.js";
73
73
  import "./replies-FXlmpJVO.js";
74
- import "./prompt-style-DxKPs6E0.js";
74
+ import "./prompt-style-Rmj3c-Ir.js";
75
75
  import "./pairing-labels-BCM1S2e_.js";
76
76
  import { t as enablePluginInConfig } from "./enable-C4xB2A3x.js";
77
77
  import { t as buildNpmResolutionInstallFields } from "./installs-Cha8QIzO.js";
78
- import "./status-CZGCfZGF.js";
78
+ import "./status-DhGsqqOx.js";
79
79
  import "./update-D4rhRm3D.js";
80
- import { o as finalizeInstalledPluginConfig } from "./lifecycle-B9_sK7Lg.js";
81
- import { t as resolvePluginWebSearchProviders } from "./web-search-providers.runtime-CNjTAhI3.js";
80
+ import { o as finalizeInstalledPluginConfig } from "./lifecycle-DE4kux0k.js";
81
+ import { t as resolvePluginWebSearchProviders } from "./web-search-providers.runtime-BC_EmT37.js";
82
82
  import path from "node:path";
83
83
  import fs from "node:fs";
84
84
 
@@ -2,7 +2,7 @@ import "./paths-C9FmTW1x.js";
2
2
  import { S as resolveUserPath, i as CONFIG_DIR, m as isRecord } from "./agent-paths-DmOVZE7g.js";
3
3
  import { Co as coerceSecretRef, mo as resolveFasedAgentPackageRootSync, wl as installPluginFromNpmSpec } from "./agent-scope-DHrLr5OF.js";
4
4
  import "./commands-registry-BRvZQ1jh.js";
5
- import "./reply-jd1xrxXq.js";
5
+ import "./reply-BRoR6TOO.js";
6
6
  import "./errors-Dx3S3Nrp.js";
7
7
  import "./send-C5_fB8YQ.js";
8
8
  import "./send-jxmRy65D.js";
@@ -37,7 +37,7 @@ import "./ssrf-Blf4NrHS.js";
37
37
  import "./outbound-attachment-CsXJwFsg.js";
38
38
  import "./fetch-CnCPOuq7.js";
39
39
  import "./delivery-queue-DKRjVFlq.js";
40
- import "./deps-BVX6nj7c.js";
40
+ import "./deps-vuWHR8ix.js";
41
41
  import "./memory-DDpj0IVA.js";
42
42
  import "./memory-search-BwYkW6_V.js";
43
43
  import "./manager-BmONwMiP.js";
@@ -74,14 +74,14 @@ import "./progress-DZRfIFVb.js";
74
74
  import "./replies-Do40G8fO.js";
75
75
  import "./skills-remote-BghdrdFV.js";
76
76
  import "./skill-commands-QW8zKXC_.js";
77
- import "./prompt-style-Wxki8rmI.js";
77
+ import "./prompt-style-CWAacuMq.js";
78
78
  import "./pairing-labels-D2yOKhoV.js";
79
79
  import { t as enablePluginInConfig } from "./enable-D3_YPNIT.js";
80
80
  import { t as buildNpmResolutionInstallFields } from "./installs-DDbnXe4x.js";
81
- import "./status-BMkqIbDJ.js";
81
+ import "./status-Cf-x3WJB.js";
82
82
  import "./update-Dew6hqdf.js";
83
- import { o as finalizeInstalledPluginConfig } from "./lifecycle-BR79mC_A.js";
84
- import { t as resolvePluginWebSearchProviders } from "./web-search-providers.runtime-i1RoCwml.js";
83
+ import { o as finalizeInstalledPluginConfig } from "./lifecycle-DKOezW7h.js";
84
+ import { t as resolvePluginWebSearchProviders } from "./web-search-providers.runtime-B09rLDoa.js";
85
85
  import fs from "node:fs";
86
86
  import path from "node:path";
87
87
 
@@ -1,7 +1,7 @@
1
1
  import { _ as resolveStateDir, u as resolveGatewayPort } from "./paths-C9FmTW1x.js";
2
2
  import { S as resolveUserPath, U as theme } from "./agent-paths-DmOVZE7g.js";
3
3
  import { Ga as ensureAuthProfileStore, Mn as writeConfigFile, Zr as collectConfigServiceEnvVars, d as resolveDefaultAgentId, dd as formatCliCommand, fr as ensureActiveMemoryPluginAllowlisted, kn as readConfigFileSnapshot, u as resolveAgentWorkspaceDir } from "./agent-scope-DHrLr5OF.js";
4
- import { Bt as detectBrowserOpenSupport, Ht as formatControlUiSshHint, Jt as openUrl, Lt as DEFAULT_WORKSPACE, Mo as runFederationAutoConnectOnce, Qo as findTailscaleBinary, Qt as resolveControlUiLinks, Rt as applyWizardMetadata, Vt as ensureWorkspaceAndSessions, Wt as handleOnboardingRepair, Xo as enableTailscaleFunnel, Xt as probeGatewayReachable, Yt as printWizardHeader, Zo as enableTailscaleServe, Zt as randomToken, en as summarizeExistingConfig, nn as waitForGatewayReachable, qt as normalizeGatewayTokenInput, tn as validateGatewayPasswordInput, xo as normalizeControlUiBasePath, yo as CONTROL_UI_BOOT_CHECK_PATH } from "./reply-jd1xrxXq.js";
4
+ import { Bt as detectBrowserOpenSupport, Ht as formatControlUiSshHint, Jt as openUrl, Lt as DEFAULT_WORKSPACE, Mo as runFederationAutoConnectOnce, Qo as findTailscaleBinary, Qt as resolveControlUiLinks, Rt as applyWizardMetadata, Vt as ensureWorkspaceAndSessions, Wt as handleOnboardingRepair, Xo as enableTailscaleFunnel, Xt as probeGatewayReachable, Yt as printWizardHeader, Zo as enableTailscaleServe, Zt as randomToken, en as summarizeExistingConfig, nn as waitForGatewayReachable, qt as normalizeGatewayTokenInput, tn as validateGatewayPasswordInput, xo as normalizeControlUiBasePath, yo as CONTROL_UI_BOOT_CHECK_PATH } from "./reply-BRoR6TOO.js";
5
5
  import { d as defaultRuntime, f as restoreTerminalState, s as redactSensitiveText } from "./errors-Dx3S3Nrp.js";
6
6
  import { a as resolveSignerdBinaryPath, n as installSignerdBinary, o as restartLocalSocketSigner, r as migrateLocalSignerKeystoreToMaterialDir, t as configureWalletForOnboarding } from "./onboarding.wallet-CQG8MiG_.js";
7
7
  import { i as resolveLocalSignerRunAsUser, n as resolveLocalSignerBackendSocketPath, o as resolveLocalSignerSocketPath, r as resolveLocalSignerMaterialRootDir, t as ensureWalletStateDir } from "./wallet-runtime-config-BlRWvEER.js";
@@ -17,14 +17,14 @@ import { a as resolveHostedOnboardingGatewayStartupMode, i as resolveGatewayStar
17
17
  import { d as buildSystemdUnit, r as isSystemdUserServiceAvailable } from "./systemd-CmxDYXvt.js";
18
18
  import { t as resolveGatewayService } from "./service-Bsg622jp.js";
19
19
  import { n as auditGatewayServiceConfig, t as SERVICE_AUDIT_CODES } from "./service-audit-BRLbvcxT.js";
20
- import { a as promptRemoteGatewayConfig, n as getTailscaleMissingBinNoteLines, r as setupSkills, t as validateIPv4AddressInput, u as promptCustomApiConfig } from "./ipv4-6svR7SNz.js";
21
- import { o as waitForHostedDashboardBrowserPath } from "./health-Bn6vWkyn.js";
22
- import { n as warnIfModelConfigLooksOff, r as applyAuthChoice } from "./auth-choice-wNIst3YG.js";
23
- import { t as promptAuthChoiceGrouped } from "./auth-choice-prompt-Dsfpbz6G.js";
20
+ import { a as promptRemoteGatewayConfig, n as getTailscaleMissingBinNoteLines, r as setupSkills, t as validateIPv4AddressInput, u as promptCustomApiConfig } from "./ipv4-Bxa3Ql2B.js";
21
+ import { o as waitForHostedDashboardBrowserPath } from "./health-c7sJIXY9.js";
22
+ import { n as warnIfModelConfigLooksOff, r as applyAuthChoice } from "./auth-choice-DCd_rmJr.js";
23
+ import { t as promptAuthChoiceGrouped } from "./auth-choice-prompt-BBY8vO5H.js";
24
24
  import { n as logConfigUpdated } from "./logging-Dv2wthF_.js";
25
- import { n as setupChannels } from "./onboard-channels-DKCvEt36.js";
25
+ import { n as setupChannels } from "./onboard-channels-BREKCcFf.js";
26
26
  import { t as buildWorkspaceHookStatus } from "./hooks-status-BielXMUB.js";
27
- import { t as runTui } from "./tui-D_G4_9GB.js";
27
+ import { t as runTui } from "./tui-CIzUfHHB.js";
28
28
  import fs from "node:fs";
29
29
  import os from "node:os";
30
30
  import path from "node:path";
@@ -1358,7 +1358,7 @@ async function finalizeOnboardingWizard(options) {
1358
1358
  const systemdAvailable = process.platform === "linux" ? await isSystemdUserServiceAvailable() : true;
1359
1359
  if (process.platform === "linux" && !systemdAvailable && !strictVps && flow !== "quickstart") await prompter.note("Systemd user services are unavailable. Skipping lingering checks and user-service install.", "Systemd");
1360
1360
  if (process.platform === "linux" && systemdAvailable && strictVps) {} else if (process.platform === "linux" && systemdAvailable) {
1361
- const { ensureSystemdUserLingerInteractive } = await import("./systemd-linger-9E60sw1j.js").then((n) => n.r);
1361
+ const { ensureSystemdUserLingerInteractive } = await import("./systemd-linger-BTw_D-6k.js").then((n) => n.r);
1362
1362
  await ensureSystemdUserLingerInteractive({
1363
1363
  runtime,
1364
1364
  prompter: {
@@ -2463,7 +2463,7 @@ async function finalizeOnboardingWizard(options) {
2463
2463
  fallbackHint: !strictVps ? controlUiOpenHint : void 0
2464
2464
  }), "Dashboard ready");
2465
2465
  }
2466
- await prompter.outro(strictVps ? "Setup complete. Use HOSTED ACCESS above: Web UI, SSH, or fallback tunnel." : controlUiOpened ? "Setup complete. Next: Agent > Models, then Chat." : "Setup complete. Use the dashboard link above, then use Agent > Models and Chat.");
2466
+ if (!strictVps) await prompter.outro(controlUiOpened ? "Setup complete. Next: Agent > Models, then Chat." : "Setup complete. Use the dashboard link above, then use Agent > Models and Chat.");
2467
2467
  return { launchedTui };
2468
2468
  }
2469
2469
 
@@ -2747,6 +2747,7 @@ const LOW_MEMORY_SWAP_THRESHOLD_MB = 2304;
2747
2747
  const LOW_MEMORY_HOSTING_SWAP_GB = 4;
2748
2748
  const HOSTING_SWAP_GB = 2;
2749
2749
  const TAILSCALE_INTERACTIVE_TIMEOUT_MS = 120 * 1e3;
2750
+ const TAILSCALE_LOGIN_URL_RE = /https:\/\/login\.tailscale\.com\/a\/[A-Za-z0-9_-]+/i;
2750
2751
  function detectTotalMemoryMb() {
2751
2752
  if (process.platform === "linux") try {
2752
2753
  const match = fs.readFileSync("/proc/meminfo", "utf8").match(/^MemTotal:\s+(\d+)\s+kB/m);
@@ -2779,29 +2780,67 @@ function run(command, logPath) {
2779
2780
  detail: detail || `${command} (exit=${proc.status ?? "unknown"})`
2780
2781
  };
2781
2782
  }
2782
- function runInteractive(command, logPath, options) {
2783
- if (logPath) appendHostSecurityLog(logPath, command, "interactive command started; output shown in terminal");
2784
- const proc = spawnSync("bash", ["-lc", command], {
2785
- stdio: [
2783
+ async function runInteractive(command, logPath, options) {
2784
+ if (logPath) appendHostSecurityLog(logPath, command, "interactive command started; output captured for framed wizard display");
2785
+ return await new Promise((resolve) => {
2786
+ const proc = spawn("bash", ["-lc", command], { stdio: [
2786
2787
  "ignore",
2787
- "inherit",
2788
- "inherit"
2789
- ],
2790
- timeout: options?.timeoutMs,
2791
- killSignal: "SIGINT"
2788
+ "pipe",
2789
+ "pipe"
2790
+ ] });
2791
+ let output = "";
2792
+ let loginUrlShown = false;
2793
+ let timedOut = false;
2794
+ let noteQueue = Promise.resolve();
2795
+ const timer = options?.timeoutMs && options.timeoutMs > 0 ? setTimeout(() => {
2796
+ timedOut = true;
2797
+ proc.kill("SIGINT");
2798
+ }, options.timeoutMs) : null;
2799
+ const maybeShowLoginUrl = (chunk) => {
2800
+ output += chunk;
2801
+ if (loginUrlShown) return;
2802
+ const loginUrl = output.match(TAILSCALE_LOGIN_URL_RE)?.[0];
2803
+ if (!loginUrl) return;
2804
+ loginUrlShown = true;
2805
+ if (options?.prompter) {
2806
+ const message = [
2807
+ noteHeading("Open login URL"),
2808
+ "Open this URL in your local browser:",
2809
+ ...noteCommands([loginUrl]),
2810
+ "Return here after approving this VPS."
2811
+ ].join("\n");
2812
+ noteQueue = noteQueue.then(() => options.prompter?.note(message, options.noteTitle ?? "Tailscale login URL"));
2813
+ }
2814
+ };
2815
+ proc.stdout?.on("data", (chunk) => {
2816
+ maybeShowLoginUrl(String(chunk));
2817
+ });
2818
+ proc.stderr?.on("data", (chunk) => {
2819
+ maybeShowLoginUrl(String(chunk));
2820
+ });
2821
+ proc.on("error", (error) => {
2822
+ output += `\n${error instanceof Error ? error.message : String(error)}`;
2823
+ });
2824
+ proc.on("close", (code) => {
2825
+ if (timer) clearTimeout(timer);
2826
+ const detail = timedOut ? `${command} timed out after ${Math.round((options?.timeoutMs ?? 0) / 1e3)}s\n${output}`.trim() : `${command} (exit=${code ?? "unknown"})\n${output}`.trim();
2827
+ if (logPath) appendHostSecurityLog(logPath, command, detail);
2828
+ noteQueue.then(() => {
2829
+ if (code === 0) {
2830
+ resolve({
2831
+ ok: true,
2832
+ detail
2833
+ });
2834
+ return;
2835
+ }
2836
+ resolve({
2837
+ ok: false,
2838
+ detail,
2839
+ timedOut
2840
+ });
2841
+ });
2842
+ });
2792
2843
  });
2793
- const timedOut = proc.error?.code === "ETIMEDOUT";
2794
- const detail = timedOut ? `${command} timed out after ${Math.round((options?.timeoutMs ?? 0) / 1e3)}s` : `${command} (exit=${proc.status ?? "unknown"})`;
2795
- if (logPath) appendHostSecurityLog(logPath, command, detail);
2796
- if (proc.status === 0) return {
2797
- ok: true,
2798
- detail
2799
- };
2800
- return {
2801
- ok: false,
2802
- detail,
2803
- timedOut
2804
- };
2805
2844
  }
2806
2845
  function buildTailscaleLoginWaitCommand(command) {
2807
2846
  return [
@@ -2828,9 +2867,13 @@ function buildTailscaleLoginWaitCommand(command) {
2828
2867
  "exit 124"
2829
2868
  ].join("\n");
2830
2869
  }
2831
- function runInteractiveTailscaleLogin(command, logPath) {
2832
- if (logPath) appendHostSecurityLog(logPath, command, "interactive Tailscale login started; output shown in terminal");
2833
- const result = runInteractive(buildTailscaleLoginWaitCommand(command), void 0, { timeoutMs: TAILSCALE_INTERACTIVE_TIMEOUT_MS });
2870
+ async function runInteractiveTailscaleLogin(command, logPath, prompter) {
2871
+ if (logPath) appendHostSecurityLog(logPath, command, "interactive Tailscale login started; login URL shown in framed wizard note");
2872
+ const result = await runInteractive(buildTailscaleLoginWaitCommand(command), void 0, {
2873
+ timeoutMs: TAILSCALE_INTERACTIVE_TIMEOUT_MS,
2874
+ prompter,
2875
+ noteTitle: "Tailscale login URL"
2876
+ });
2834
2877
  if (logPath) appendHostSecurityLog(logPath, "tailscale login result", result.ok ? "tailnet IP appeared or tailscale up completed" : result.detail ?? "tailscale login failed");
2835
2878
  if (result.ok) return {
2836
2879
  ok: true,
@@ -3089,7 +3132,7 @@ async function confirmTailnetSshBeforeLockdown(params) {
3089
3132
  return false;
3090
3133
  }
3091
3134
  await prompter.note(formatTailscaleAccountBrowserLoginNote(), "Tailscale login");
3092
- const tsReset = interactiveRunner("sudo -n tailscale logout && sudo -n tailscale up --ssh --accept-routes --reset", logPath);
3135
+ const tsReset = await interactiveRunner("sudo -n tailscale logout && sudo -n tailscale up --ssh --accept-routes --reset", logPath, prompter);
3093
3136
  const acceptedTimedOutLogin = tailscaleTimedOutButReady(tsReset, logPath, runner);
3094
3137
  if (!tsReset.ok && !acceptedTimedOutLogin || !hasTailscaleIp(logPath, runner)) {
3095
3138
  runtime.error("Hosting setup stopped before SSH/firewall lock-down.");
@@ -3246,7 +3289,7 @@ function automaticUpdatesCommand() {
3246
3289
  " sudo -n systemctl enable --now apt-daily.timer apt-daily-upgrade.timer",
3247
3290
  "elif command -v dnf >/dev/null 2>&1 || command -v dnf5 >/dev/null 2>&1; then",
3248
3291
  " (" + packageInstallCommand(["dnf5-plugin-automatic"]) + ") || (" + packageInstallCommand(["dnf-automatic"]) + ")",
3249
- " sudo -n sed -i 's/^apply_updates[[:space:]]*=.*/apply_updates = yes/' /etc/dnf/automatic.conf >/dev/null 2>&1 || true",
3292
+ " sudo -n /usr/local/sbin/fased-host-maintenance enable-dnf-automatic >/dev/null 2>&1 || sudo -n sed -i 's/^apply_updates[[:space:]]*=.*/apply_updates = yes/' /etc/dnf/automatic.conf >/dev/null 2>&1 || true",
3250
3293
  " sudo -n systemctl enable --now dnf5-automatic.timer >/dev/null 2>&1 || sudo -n systemctl enable --now dnf-automatic.timer",
3251
3294
  "elif command -v yum >/dev/null 2>&1; then",
3252
3295
  " (" + packageInstallCommand(["dnf-automatic"]) + ") || (" + packageInstallCommand(["yum-cron"]) + ")",
@@ -3257,6 +3300,17 @@ function automaticUpdatesCommand() {
3257
3300
  "fi"
3258
3301
  ].join("\n");
3259
3302
  }
3303
+ function sshHardeningCommand() {
3304
+ return [
3305
+ "if sudo -n /usr/local/sbin/fased-host-maintenance harden-ssh >/dev/null 2>&1; then",
3306
+ " :",
3307
+ "else",
3308
+ " sudo -n sed -i 's/^#\\?PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config",
3309
+ " sudo -n sed -i 's/^#\\?PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config",
3310
+ " sudo -n systemctl restart ssh || sudo -n systemctl restart sshd",
3311
+ "fi"
3312
+ ].join("\n");
3313
+ }
3260
3314
  function failOrContinue(params) {
3261
3315
  const { opts, runtime, step, detail } = params;
3262
3316
  const body = detail ? `${step}: ${detail}` : step;
@@ -3302,7 +3356,7 @@ async function applyHostingSecurity(params) {
3302
3356
  })).trim();
3303
3357
  else await prompter.note(formatTailscaleBrowserLoginNote(), "Tailscale login");
3304
3358
  const resetCommand = tsAuthkey ? `sudo -n tailscale logout && sudo -n tailscale up --ssh --accept-routes --reset --authkey ${JSON.stringify(tsAuthkey)}` : "sudo -n tailscale logout && sudo -n tailscale up --ssh --accept-routes --reset";
3305
- const tsReset = tsAuthkey ? run(resetCommand, logPath) : runInteractiveTailscaleLogin(resetCommand, logPath);
3359
+ const tsReset = tsAuthkey ? run(resetCommand, logPath) : await runInteractiveTailscaleLogin(resetCommand, logPath, prompter);
3306
3360
  if (!tsReset.ok && !tailscaleTimedOutButReady(tsReset, logPath)) return {
3307
3361
  ok: false,
3308
3362
  detail: tsReset.detail ?? "tailscale account switch failed"
@@ -3434,7 +3488,7 @@ async function applyHostingSecurity(params) {
3434
3488
  initialValue: false
3435
3489
  })) {
3436
3490
  if (prompter) await prompter.note(formatTailscaleBrowserLoginNote(), "Tailscale login");
3437
- const tsReset = runInteractiveTailscaleLogin("sudo -n tailscale logout && sudo -n tailscale up --ssh --accept-routes --reset", logPath);
3491
+ const tsReset = await runInteractiveTailscaleLogin("sudo -n tailscale logout && sudo -n tailscale up --ssh --accept-routes --reset", logPath, prompter);
3438
3492
  if (!tsReset.ok && !tailscaleTimedOutButReady(tsReset, logPath)) {
3439
3493
  checks.push({
3440
3494
  name: "tailscale",
@@ -3521,7 +3575,7 @@ async function applyHostingSecurity(params) {
3521
3575
  };
3522
3576
  } else {
3523
3577
  if (prompter) await prompter.note(formatTailscaleBrowserLoginNote(), "Tailscale login");
3524
- const tsUp = runInteractiveTailscaleLogin("sudo -n tailscale up --ssh", logPath);
3578
+ const tsUp = await runInteractiveTailscaleLogin("sudo -n tailscale up --ssh", logPath, prompter);
3525
3579
  if (!tsUp.ok && !tailscaleTimedOutButReady(tsUp, logPath)) {
3526
3580
  checks.push({
3527
3581
  name: "tailscale",
@@ -3648,7 +3702,7 @@ async function applyHostingSecurity(params) {
3648
3702
  ok: true,
3649
3703
  detail: "default-deny public ingress with tailnet SSH/HTTPS access"
3650
3704
  });
3651
- const sshRes = run("sudo -n sed -i 's/^#\\?PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config; sudo -n sed -i 's/^#\\?PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config; sudo -n systemctl restart ssh || sudo -n systemctl restart sshd", logPath);
3705
+ const sshRes = run(sshHardeningCommand(), logPath);
3652
3706
  if (!sshRes.ok) {
3653
3707
  checks.push({
3654
3708
  name: "ssh",
@@ -3723,7 +3777,7 @@ async function applyHostingSecurity(params) {
3723
3777
  ok: true,
3724
3778
  detail: "automatic security updates enabled"
3725
3779
  });
3726
- runtime.log("Hosting host hardening complete.");
3780
+ appendHostSecurityLog(logPath, "hosting host hardening complete", "enforced");
3727
3781
  return {
3728
3782
  profile,
3729
3783
  checks,
@@ -4215,7 +4269,6 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
4215
4269
  await installPrivateGoForOnboarding();
4216
4270
  };
4217
4271
  printWizardHeader(runtime);
4218
- await prompter.intro("FASED Setup");
4219
4272
  await requireRiskAcknowledgement({
4220
4273
  opts,
4221
4274
  prompter
@@ -1,6 +1,6 @@
1
1
  import { Cu as formatCliCommand, Fn as ensureActiveMemoryPluginAllowlisted, Gu as resolveDefaultAgentId, Qt as readConfigFileSnapshot, Wu as resolveAgentWorkspaceDir, br as collectConfigServiceEnvVars, ma as ensureAuthProfileStore, tn as writeConfigFile } from "./env-C77feXxI.js";
2
2
  import { H as theme, x as resolveUserPath } from "./agent-paths-BI1hx-tF.js";
3
- import { A as waitForGatewayReachable, C as printWizardHeader, E as resolveControlUiLinks, Ha as CONTROL_UI_BOOT_CHECK_PATH, O as summarizeExistingConfig, S as openUrl, T as randomToken, Wa as normalizeControlUiBasePath, bo as enableTailscaleServe, d as DEFAULT_WORKSPACE, f as applyWizardMetadata, g as formatControlUiSshHint, h as ensureWorkspaceAndSessions, k as validateGatewayPasswordInput, m as detectBrowserOpenSupport, to as runFederationAutoConnectOnce, v as handleOnboardingRepair, w as probeGatewayReachable, x as normalizeGatewayTokenInput, xo as findTailscaleBinary, yo as enableTailscaleFunnel } from "./model-catalog-B3hPEPfU.js";
3
+ import { A as waitForGatewayReachable, C as printWizardHeader, E as resolveControlUiLinks, Ha as CONTROL_UI_BOOT_CHECK_PATH, O as summarizeExistingConfig, S as openUrl, T as randomToken, Wa as normalizeControlUiBasePath, bo as enableTailscaleServe, d as DEFAULT_WORKSPACE, f as applyWizardMetadata, g as formatControlUiSshHint, h as ensureWorkspaceAndSessions, k as validateGatewayPasswordInput, m as detectBrowserOpenSupport, to as runFederationAutoConnectOnce, v as handleOnboardingRepair, w as probeGatewayReachable, x as normalizeGatewayTokenInput, xo as findTailscaleBinary, yo as enableTailscaleFunnel } from "./model-catalog-DHRVUWBf.js";
4
4
  import { A as defaultRuntime, Ct as resolveStateDir, E as redactSensitiveText, gt as resolveGatewayPort, j as restoreTerminalState } from "./entry.js";
5
5
  import { n as redactSensitiveUrlLikeString } from "./redact-sensitive-url-BW03TVj8.js";
6
6
  import { a as resolveSignerdBinaryPath, n as installSignerdBinary, o as restartLocalSocketSigner, r as migrateLocalSignerKeystoreToMaterialDir, t as configureWalletForOnboarding } from "./onboarding.wallet--7Yu2hFw.js";
@@ -16,14 +16,14 @@ import { a as resolveHostedOnboardingGatewayStartupMode, i as resolveGatewayStar
16
16
  import { d as buildSystemdUnit, r as isSystemdUserServiceAvailable } from "./systemd-B8OPQXFR.js";
17
17
  import { t as resolveGatewayService } from "./service-2JBjv-ge.js";
18
18
  import { n as auditGatewayServiceConfig, t as SERVICE_AUDIT_CODES } from "./service-audit-COK5O0cM.js";
19
- import { a as promptRemoteGatewayConfig, n as getTailscaleMissingBinNoteLines, r as setupSkills, t as validateIPv4AddressInput, u as promptCustomApiConfig } from "./ipv4-DT7rmgG8.js";
20
- import { s as waitForHostedDashboardBrowserPath } from "./health-CdW7K4YP.js";
21
- import { n as warnIfModelConfigLooksOff, r as applyAuthChoice } from "./auth-choice-CN9gyA5O.js";
22
- import { t as promptAuthChoiceGrouped } from "./auth-choice-prompt-DvnUYnyW.js";
19
+ import { a as promptRemoteGatewayConfig, n as getTailscaleMissingBinNoteLines, r as setupSkills, t as validateIPv4AddressInput, u as promptCustomApiConfig } from "./ipv4-BKbsAV5a.js";
20
+ import { s as waitForHostedDashboardBrowserPath } from "./health-CD-e8iEW.js";
21
+ import { n as warnIfModelConfigLooksOff, r as applyAuthChoice } from "./auth-choice-CRcRJvDg.js";
22
+ import { t as promptAuthChoiceGrouped } from "./auth-choice-prompt-CHAO6E_x.js";
23
23
  import { n as logConfigUpdated } from "./logging-DZ32I_SP.js";
24
- import { n as setupChannels } from "./onboard-channels-EXJRjGSu.js";
24
+ import { n as setupChannels } from "./onboard-channels-fJXaj04M.js";
25
25
  import { t as buildWorkspaceHookStatus } from "./hooks-status-DRZciWMZ.js";
26
- import { t as runTui } from "./tui-El8PxPJw.js";
26
+ import { t as runTui } from "./tui-Cvc1YA_t.js";
27
27
  import { spawn, spawnSync } from "node:child_process";
28
28
  import os from "node:os";
29
29
  import path from "node:path";
@@ -1357,7 +1357,7 @@ async function finalizeOnboardingWizard(options) {
1357
1357
  const systemdAvailable = process.platform === "linux" ? await isSystemdUserServiceAvailable() : true;
1358
1358
  if (process.platform === "linux" && !systemdAvailable && !strictVps && flow !== "quickstart") await prompter.note("Systemd user services are unavailable. Skipping lingering checks and user-service install.", "Systemd");
1359
1359
  if (process.platform === "linux" && systemdAvailable && strictVps) {} else if (process.platform === "linux" && systemdAvailable) {
1360
- const { ensureSystemdUserLingerInteractive } = await import("./systemd-linger-BYFLOJbt.js").then((n) => n.r);
1360
+ const { ensureSystemdUserLingerInteractive } = await import("./systemd-linger-BlmGMvvA.js").then((n) => n.r);
1361
1361
  await ensureSystemdUserLingerInteractive({
1362
1362
  runtime,
1363
1363
  prompter: {
@@ -2462,7 +2462,7 @@ async function finalizeOnboardingWizard(options) {
2462
2462
  fallbackHint: !strictVps ? controlUiOpenHint : void 0
2463
2463
  }), "Dashboard ready");
2464
2464
  }
2465
- await prompter.outro(strictVps ? "Setup complete. Use HOSTED ACCESS above: Web UI, SSH, or fallback tunnel." : controlUiOpened ? "Setup complete. Next: Agent > Models, then Chat." : "Setup complete. Use the dashboard link above, then use Agent > Models and Chat.");
2465
+ if (!strictVps) await prompter.outro(controlUiOpened ? "Setup complete. Next: Agent > Models, then Chat." : "Setup complete. Use the dashboard link above, then use Agent > Models and Chat.");
2466
2466
  return { launchedTui };
2467
2467
  }
2468
2468
 
@@ -2746,6 +2746,7 @@ const LOW_MEMORY_SWAP_THRESHOLD_MB = 2304;
2746
2746
  const LOW_MEMORY_HOSTING_SWAP_GB = 4;
2747
2747
  const HOSTING_SWAP_GB = 2;
2748
2748
  const TAILSCALE_INTERACTIVE_TIMEOUT_MS = 120 * 1e3;
2749
+ const TAILSCALE_LOGIN_URL_RE = /https:\/\/login\.tailscale\.com\/a\/[A-Za-z0-9_-]+/i;
2749
2750
  function detectTotalMemoryMb() {
2750
2751
  if (process.platform === "linux") try {
2751
2752
  const match = fs.readFileSync("/proc/meminfo", "utf8").match(/^MemTotal:\s+(\d+)\s+kB/m);
@@ -2778,29 +2779,67 @@ function run(command, logPath) {
2778
2779
  detail: detail || `${command} (exit=${proc.status ?? "unknown"})`
2779
2780
  };
2780
2781
  }
2781
- function runInteractive(command, logPath, options) {
2782
- if (logPath) appendHostSecurityLog(logPath, command, "interactive command started; output shown in terminal");
2783
- const proc = spawnSync("bash", ["-lc", command], {
2784
- stdio: [
2782
+ async function runInteractive(command, logPath, options) {
2783
+ if (logPath) appendHostSecurityLog(logPath, command, "interactive command started; output captured for framed wizard display");
2784
+ return await new Promise((resolve) => {
2785
+ const proc = spawn("bash", ["-lc", command], { stdio: [
2785
2786
  "ignore",
2786
- "inherit",
2787
- "inherit"
2788
- ],
2789
- timeout: options?.timeoutMs,
2790
- killSignal: "SIGINT"
2787
+ "pipe",
2788
+ "pipe"
2789
+ ] });
2790
+ let output = "";
2791
+ let loginUrlShown = false;
2792
+ let timedOut = false;
2793
+ let noteQueue = Promise.resolve();
2794
+ const timer = options?.timeoutMs && options.timeoutMs > 0 ? setTimeout(() => {
2795
+ timedOut = true;
2796
+ proc.kill("SIGINT");
2797
+ }, options.timeoutMs) : null;
2798
+ const maybeShowLoginUrl = (chunk) => {
2799
+ output += chunk;
2800
+ if (loginUrlShown) return;
2801
+ const loginUrl = output.match(TAILSCALE_LOGIN_URL_RE)?.[0];
2802
+ if (!loginUrl) return;
2803
+ loginUrlShown = true;
2804
+ if (options?.prompter) {
2805
+ const message = [
2806
+ noteHeading("Open login URL"),
2807
+ "Open this URL in your local browser:",
2808
+ ...noteCommands([loginUrl]),
2809
+ "Return here after approving this VPS."
2810
+ ].join("\n");
2811
+ noteQueue = noteQueue.then(() => options.prompter?.note(message, options.noteTitle ?? "Tailscale login URL"));
2812
+ }
2813
+ };
2814
+ proc.stdout?.on("data", (chunk) => {
2815
+ maybeShowLoginUrl(String(chunk));
2816
+ });
2817
+ proc.stderr?.on("data", (chunk) => {
2818
+ maybeShowLoginUrl(String(chunk));
2819
+ });
2820
+ proc.on("error", (error) => {
2821
+ output += `\n${error instanceof Error ? error.message : String(error)}`;
2822
+ });
2823
+ proc.on("close", (code) => {
2824
+ if (timer) clearTimeout(timer);
2825
+ const detail = timedOut ? `${command} timed out after ${Math.round((options?.timeoutMs ?? 0) / 1e3)}s\n${output}`.trim() : `${command} (exit=${code ?? "unknown"})\n${output}`.trim();
2826
+ if (logPath) appendHostSecurityLog(logPath, command, detail);
2827
+ noteQueue.then(() => {
2828
+ if (code === 0) {
2829
+ resolve({
2830
+ ok: true,
2831
+ detail
2832
+ });
2833
+ return;
2834
+ }
2835
+ resolve({
2836
+ ok: false,
2837
+ detail,
2838
+ timedOut
2839
+ });
2840
+ });
2841
+ });
2791
2842
  });
2792
- const timedOut = proc.error?.code === "ETIMEDOUT";
2793
- const detail = timedOut ? `${command} timed out after ${Math.round((options?.timeoutMs ?? 0) / 1e3)}s` : `${command} (exit=${proc.status ?? "unknown"})`;
2794
- if (logPath) appendHostSecurityLog(logPath, command, detail);
2795
- if (proc.status === 0) return {
2796
- ok: true,
2797
- detail
2798
- };
2799
- return {
2800
- ok: false,
2801
- detail,
2802
- timedOut
2803
- };
2804
2843
  }
2805
2844
  function buildTailscaleLoginWaitCommand(command) {
2806
2845
  return [
@@ -2827,9 +2866,13 @@ function buildTailscaleLoginWaitCommand(command) {
2827
2866
  "exit 124"
2828
2867
  ].join("\n");
2829
2868
  }
2830
- function runInteractiveTailscaleLogin(command, logPath) {
2831
- if (logPath) appendHostSecurityLog(logPath, command, "interactive Tailscale login started; output shown in terminal");
2832
- const result = runInteractive(buildTailscaleLoginWaitCommand(command), void 0, { timeoutMs: TAILSCALE_INTERACTIVE_TIMEOUT_MS });
2869
+ async function runInteractiveTailscaleLogin(command, logPath, prompter) {
2870
+ if (logPath) appendHostSecurityLog(logPath, command, "interactive Tailscale login started; login URL shown in framed wizard note");
2871
+ const result = await runInteractive(buildTailscaleLoginWaitCommand(command), void 0, {
2872
+ timeoutMs: TAILSCALE_INTERACTIVE_TIMEOUT_MS,
2873
+ prompter,
2874
+ noteTitle: "Tailscale login URL"
2875
+ });
2833
2876
  if (logPath) appendHostSecurityLog(logPath, "tailscale login result", result.ok ? "tailnet IP appeared or tailscale up completed" : result.detail ?? "tailscale login failed");
2834
2877
  if (result.ok) return {
2835
2878
  ok: true,
@@ -3088,7 +3131,7 @@ async function confirmTailnetSshBeforeLockdown(params) {
3088
3131
  return false;
3089
3132
  }
3090
3133
  await prompter.note(formatTailscaleAccountBrowserLoginNote(), "Tailscale login");
3091
- const tsReset = interactiveRunner("sudo -n tailscale logout && sudo -n tailscale up --ssh --accept-routes --reset", logPath);
3134
+ const tsReset = await interactiveRunner("sudo -n tailscale logout && sudo -n tailscale up --ssh --accept-routes --reset", logPath, prompter);
3092
3135
  const acceptedTimedOutLogin = tailscaleTimedOutButReady(tsReset, logPath, runner);
3093
3136
  if (!tsReset.ok && !acceptedTimedOutLogin || !hasTailscaleIp(logPath, runner)) {
3094
3137
  runtime.error("Hosting setup stopped before SSH/firewall lock-down.");
@@ -3245,7 +3288,7 @@ function automaticUpdatesCommand() {
3245
3288
  " sudo -n systemctl enable --now apt-daily.timer apt-daily-upgrade.timer",
3246
3289
  "elif command -v dnf >/dev/null 2>&1 || command -v dnf5 >/dev/null 2>&1; then",
3247
3290
  " (" + packageInstallCommand(["dnf5-plugin-automatic"]) + ") || (" + packageInstallCommand(["dnf-automatic"]) + ")",
3248
- " sudo -n sed -i 's/^apply_updates[[:space:]]*=.*/apply_updates = yes/' /etc/dnf/automatic.conf >/dev/null 2>&1 || true",
3291
+ " sudo -n /usr/local/sbin/fased-host-maintenance enable-dnf-automatic >/dev/null 2>&1 || sudo -n sed -i 's/^apply_updates[[:space:]]*=.*/apply_updates = yes/' /etc/dnf/automatic.conf >/dev/null 2>&1 || true",
3249
3292
  " sudo -n systemctl enable --now dnf5-automatic.timer >/dev/null 2>&1 || sudo -n systemctl enable --now dnf-automatic.timer",
3250
3293
  "elif command -v yum >/dev/null 2>&1; then",
3251
3294
  " (" + packageInstallCommand(["dnf-automatic"]) + ") || (" + packageInstallCommand(["yum-cron"]) + ")",
@@ -3256,6 +3299,17 @@ function automaticUpdatesCommand() {
3256
3299
  "fi"
3257
3300
  ].join("\n");
3258
3301
  }
3302
+ function sshHardeningCommand() {
3303
+ return [
3304
+ "if sudo -n /usr/local/sbin/fased-host-maintenance harden-ssh >/dev/null 2>&1; then",
3305
+ " :",
3306
+ "else",
3307
+ " sudo -n sed -i 's/^#\\?PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config",
3308
+ " sudo -n sed -i 's/^#\\?PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config",
3309
+ " sudo -n systemctl restart ssh || sudo -n systemctl restart sshd",
3310
+ "fi"
3311
+ ].join("\n");
3312
+ }
3259
3313
  function failOrContinue(params) {
3260
3314
  const { opts, runtime, step, detail } = params;
3261
3315
  const body = detail ? `${step}: ${detail}` : step;
@@ -3301,7 +3355,7 @@ async function applyHostingSecurity(params) {
3301
3355
  })).trim();
3302
3356
  else await prompter.note(formatTailscaleBrowserLoginNote(), "Tailscale login");
3303
3357
  const resetCommand = tsAuthkey ? `sudo -n tailscale logout && sudo -n tailscale up --ssh --accept-routes --reset --authkey ${JSON.stringify(tsAuthkey)}` : "sudo -n tailscale logout && sudo -n tailscale up --ssh --accept-routes --reset";
3304
- const tsReset = tsAuthkey ? run(resetCommand, logPath) : runInteractiveTailscaleLogin(resetCommand, logPath);
3358
+ const tsReset = tsAuthkey ? run(resetCommand, logPath) : await runInteractiveTailscaleLogin(resetCommand, logPath, prompter);
3305
3359
  if (!tsReset.ok && !tailscaleTimedOutButReady(tsReset, logPath)) return {
3306
3360
  ok: false,
3307
3361
  detail: tsReset.detail ?? "tailscale account switch failed"
@@ -3433,7 +3487,7 @@ async function applyHostingSecurity(params) {
3433
3487
  initialValue: false
3434
3488
  })) {
3435
3489
  if (prompter) await prompter.note(formatTailscaleBrowserLoginNote(), "Tailscale login");
3436
- const tsReset = runInteractiveTailscaleLogin("sudo -n tailscale logout && sudo -n tailscale up --ssh --accept-routes --reset", logPath);
3490
+ const tsReset = await runInteractiveTailscaleLogin("sudo -n tailscale logout && sudo -n tailscale up --ssh --accept-routes --reset", logPath, prompter);
3437
3491
  if (!tsReset.ok && !tailscaleTimedOutButReady(tsReset, logPath)) {
3438
3492
  checks.push({
3439
3493
  name: "tailscale",
@@ -3520,7 +3574,7 @@ async function applyHostingSecurity(params) {
3520
3574
  };
3521
3575
  } else {
3522
3576
  if (prompter) await prompter.note(formatTailscaleBrowserLoginNote(), "Tailscale login");
3523
- const tsUp = runInteractiveTailscaleLogin("sudo -n tailscale up --ssh", logPath);
3577
+ const tsUp = await runInteractiveTailscaleLogin("sudo -n tailscale up --ssh", logPath, prompter);
3524
3578
  if (!tsUp.ok && !tailscaleTimedOutButReady(tsUp, logPath)) {
3525
3579
  checks.push({
3526
3580
  name: "tailscale",
@@ -3647,7 +3701,7 @@ async function applyHostingSecurity(params) {
3647
3701
  ok: true,
3648
3702
  detail: "default-deny public ingress with tailnet SSH/HTTPS access"
3649
3703
  });
3650
- const sshRes = run("sudo -n sed -i 's/^#\\?PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config; sudo -n sed -i 's/^#\\?PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config; sudo -n systemctl restart ssh || sudo -n systemctl restart sshd", logPath);
3704
+ const sshRes = run(sshHardeningCommand(), logPath);
3651
3705
  if (!sshRes.ok) {
3652
3706
  checks.push({
3653
3707
  name: "ssh",
@@ -3722,7 +3776,7 @@ async function applyHostingSecurity(params) {
3722
3776
  ok: true,
3723
3777
  detail: "automatic security updates enabled"
3724
3778
  });
3725
- runtime.log("Hosting host hardening complete.");
3779
+ appendHostSecurityLog(logPath, "hosting host hardening complete", "enforced");
3726
3780
  return {
3727
3781
  profile,
3728
3782
  checks,
@@ -4214,7 +4268,6 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
4214
4268
  await installPrivateGoForOnboarding();
4215
4269
  };
4216
4270
  printWizardHeader(runtime);
4217
- await prompter.intro("FASED Setup");
4218
4271
  await requireRiskAcknowledgement({
4219
4272
  opts,
4220
4273
  prompter
@@ -2,13 +2,13 @@ import { Ui as logWarn, wa as defaultRuntime } from "./agent-scope-Cb1u7HE7.js";
2
2
  import "./github-copilot-token-DYrFvncE.js";
3
3
  import "./send-vR6HwT94.js";
4
4
  import "./send-BQMxv218.js";
5
- import { $ as emitAgentEvent, B as DEFAULT_INPUT_IMAGE_MIMES, G as normalizeMimeList, H as DEFAULT_INPUT_TIMEOUT_MS, K as resolveInputFileLimits, U as extractFileContentFromSource, V as DEFAULT_INPUT_MAX_REDIRECTS, W as extractImageContentFromSource, a as agentCommand, at as setSseHeaders, et as onAgentEvent, i as resolveAssistantStreamDeltaText, it as sendJson, n as handleGatewayPostJsonEndpoint, nt as resolveAgentIdForRequest, ot as writeDone, r as buildAgentMessageFromConversationEntries, rt as resolveSessionKey, tt as createDefaultDeps, z as DEFAULT_INPUT_IMAGE_MAX_BYTES } from "./pi-embedded-BZv4Mjvw.js";
5
+ import { $ as emitAgentEvent, B as DEFAULT_INPUT_IMAGE_MIMES, G as normalizeMimeList, H as DEFAULT_INPUT_TIMEOUT_MS, K as resolveInputFileLimits, U as extractFileContentFromSource, V as DEFAULT_INPUT_MAX_REDIRECTS, W as extractImageContentFromSource, a as agentCommand, at as setSseHeaders, et as onAgentEvent, i as resolveAssistantStreamDeltaText, it as sendJson, n as handleGatewayPostJsonEndpoint, nt as resolveAgentIdForRequest, ot as writeDone, r as buildAgentMessageFromConversationEntries, rt as resolveSessionKey, tt as createDefaultDeps, z as DEFAULT_INPUT_IMAGE_MAX_BYTES } from "./pi-embedded-Dtw2m41q.js";
6
6
  import "./diagnostic-D6XQAXl4.js";
7
7
  import "./diagnostic-session-state-CexmAKza.js";
8
8
  import "./send-Da1hCe1A.js";
9
9
  import "./media-DUBmlR9u.js";
10
10
  import "./pi-model-discovery-DYwyxntg.js";
11
- import "./paths-D2Fac7_V.js";
11
+ import "./paths-BGX-IMoI.js";
12
12
  import "./ssrf-DYsl9qoS.js";
13
13
  import "./reply-prefix-DwrVxkMY.js";
14
14
  import "./path-alias-guards--dquYHnR.js";