@fased/fased 0.1.19 → 0.1.21

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 (202) hide show
  1. package/dist/{agents-ET0n9FED.js → agents-BwDWbvDH.js} +10 -10
  2. package/dist/{attachment-normalize-DMabJMU0.js → attachment-normalize-C9F-gS4-.js} +1 -1
  3. package/dist/{attachment-normalize-CDK3Kj-a.js → attachment-normalize-C9w24bkb.js} +1 -1
  4. package/dist/{audio-preflight-CK4s7Cpe.js → audio-preflight-CTs9Ta27.js} +1 -1
  5. package/dist/{audio-preflight-CKsWKtOL.js → audio-preflight-DGoGnRdo.js} +1 -1
  6. package/dist/{audio-preflight-DnxL2DTu.js → audio-preflight-Dg10mePo.js} +4 -4
  7. package/dist/{audio-preflight-D4ml3rER.js → audio-preflight-DnHScDmF.js} +4 -4
  8. package/dist/{audio-preflight-CtOWrCYT.js → audio-preflight-QMOvUkXH.js} +1 -1
  9. package/dist/{audit-Cw2GhO1l.js → audit-DJOyIBeV.js} +1 -1
  10. package/dist/{audit-DBfVTWuR.js → audit-DmYUk4AC.js} +1 -1
  11. package/dist/{auth-D6aXaEgt.js → auth-7Dkf1_CI.js} +5 -5
  12. package/dist/{auth-choice-DCd_rmJr.js → auth-choice-D9LWnNpF.js} +1 -1
  13. package/dist/{auth-choice-CRcRJvDg.js → auth-choice-DbTYwdGn.js} +1 -1
  14. package/dist/{auth-choice-prompt-CHAO6E_x.js → auth-choice-prompt-D5YuCYf7.js} +1 -1
  15. package/dist/{auth-choice-prompt-BBY8vO5H.js → auth-choice-prompt-DFyVEU7J.js} +1 -1
  16. package/dist/build-info.json +3 -3
  17. package/dist/bundled/boot-md/handler.js +1 -1
  18. package/dist/bundled/session-memory/handler.js +1 -1
  19. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  20. package/dist/{channel-web-B90TOW9f.js → channel-web-CAJ_OiB2.js} +1 -1
  21. package/dist/{channel-web-rogzKqNR.js → channel-web-X3OJcLB2.js} +1 -1
  22. package/dist/{channels-CIVRD15I.js → channels-BqOjEy1R.js} +8 -8
  23. package/dist/{channels-BDdw6tRB.js → channels-D9Oj681h.js} +8 -8
  24. package/dist/{channels-cli-BlinY5L-.js → channels-cli-D5hZAzoE.js} +7 -7
  25. package/dist/{channels-cli-nB_AyrYg.js → channels-cli-DKRuJbjY.js} +7 -7
  26. package/dist/cli/daemon-cli.js +1 -1
  27. package/dist/{cli-BkrcbFie.js → cli-ClS8EuDK.js} +4 -4
  28. package/dist/{cli-DWyf6Ez0.js → cli-Dm0682Gu.js} +4 -4
  29. package/dist/{command-registry-D0xhHn9Z.js → command-registry-C2wqEo64.js} +10 -10
  30. package/dist/{completion-cli-BDgp9s2D.js → completion-cli-B9mW_que.js} +2 -2
  31. package/dist/{completion-cli-BpN_WF59.js → completion-cli-DCvm9Xp-.js} +1 -1
  32. package/dist/{config-cli-D51JAiE2.js → config-cli-1SYvQdhO.js} +1 -1
  33. package/dist/{config-cli-Di8fNvh8.js → config-cli-680jTQ3-.js} +1 -1
  34. package/dist/{configure-ZAJqoe8C.js → configure-BfhVLgNf.js} +14 -14
  35. package/dist/{configure-CLUalzZB.js → configure-DQLQp2nb.js} +14 -14
  36. package/dist/control-ui/assets/app-DXYMrRJ9.js.map +1 -1
  37. package/dist/{cron-cli-CCfMl1ch.js → cron-cli-C4hgRvYJ.js} +2 -2
  38. package/dist/{cron-cli-COETwgMD.js → cron-cli-DQjdHktC.js} +2 -2
  39. package/dist/{daemon-cli-DUfzwrLw.js → daemon-cli-B3OUkSy6.js} +1 -1
  40. package/dist/{daemon-cli-BwMJ_sub.js → daemon-cli-DWhAXx5H.js} +1 -1
  41. package/dist/daemon-cli.js +1 -1
  42. package/dist/{deps-BoCGz3bU.js → deps-DdP-Hmxc.js} +1 -1
  43. package/dist/{deps-vuWHR8ix.js → deps-RXAe1X5s.js} +1 -1
  44. package/dist/entry.js +1 -1
  45. package/dist/extensionAPI.js +1 -1
  46. package/dist/{gateway-cli-DAaMYDEy.js → gateway-cli-CHukRtBG.js} +30 -30
  47. package/dist/{gateway-cli-DcooukDx.js → gateway-cli-Y450jJFF.js} +30 -30
  48. package/dist/{health-c7sJIXY9.js → health-C-AsEUPg.js} +2 -2
  49. package/dist/{health-CD-e8iEW.js → health-Db548DTY.js} +2 -2
  50. package/dist/{heartbeat-runner-DZuApcd1.js → heartbeat-runner-CE9O7xVk.js} +1 -1
  51. package/dist/{heartbeat-runner-BTRTcwja.js → heartbeat-runner-DAPP5ojq.js} +1 -1
  52. package/dist/{hooks-cli-Bq6e41xH.js → hooks-cli-ApL31lTH.js} +5 -5
  53. package/dist/{hooks-cli--azOmGId.js → hooks-cli-DpllVSSB.js} +5 -5
  54. package/dist/index.js +9 -9
  55. package/dist/{ipv4-Bxa3Ql2B.js → ipv4-Bh1H98-c.js} +2 -2
  56. package/dist/{ipv4-BKbsAV5a.js → ipv4-D88X6kcK.js} +2 -2
  57. package/dist/{lifecycle-DE4kux0k.js → lifecycle-C5O_poBp.js} +1 -1
  58. package/dist/{lifecycle-DKOezW7h.js → lifecycle-D2VlrxY8.js} +1 -1
  59. package/dist/{list.auth-overview-DQlFpghW.js → list.auth-overview-DQUc2B2l.js} +1 -1
  60. package/dist/{list.auth-overview-SasQirvR.js → list.auth-overview-N9tbnvNE.js} +1 -1
  61. package/dist/llm-slug-generator.js +1 -1
  62. package/dist/{model-catalog-DHRVUWBf.js → model-catalog-BQ5G4eK6.js} +10 -10
  63. package/dist/{models-CIAvUTl5.js → models-BObC-MWx.js} +6 -6
  64. package/dist/{models-cli-CxRv-tjs.js → models-cli-Bcjaf4CI.js} +6 -6
  65. package/dist/{models-cli-BW4m-HHk.js → models-cli-r2llwGBO.js} +7 -7
  66. package/dist/{node-cli-CsYpYqHF.js → node-cli-B5TpzQ6U.js} +4 -4
  67. package/dist/{node-cli--1sHB0Pz.js → node-cli-B8V8ar0H.js} +4 -4
  68. package/dist/{onboard-lbl9C2gj.js → onboard-C6Z7OaQ8.js} +7 -7
  69. package/dist/{onboard-BoT3D8J9.js → onboard-D8EOxPOn.js} +7 -7
  70. package/dist/{onboard-channels-BREKCcFf.js → onboard-channels-C4gBvkYQ.js} +2 -2
  71. package/dist/{onboard-channels-fJXaj04M.js → onboard-channels-CDr6F5Rc.js} +2 -2
  72. package/dist/{onboard-search-C6A1sfph.js → onboard-search-BDLus6nY.js} +7 -7
  73. package/dist/{onboard-search-D-tM9Xrg.js → onboard-search-BzpbxIgm.js} +7 -7
  74. package/dist/{onboarding-Bejkgd8a.js → onboarding-CIjqOjDq.js} +56 -47
  75. package/dist/{onboarding-C8AUR3x1.js → onboarding-DjXH2-ro.js} +56 -47
  76. package/dist/{onboarding.wallet--7Yu2hFw.js → onboarding.wallet-B87UVKiT.js} +16 -10
  77. package/dist/{onboarding.wallet-CQG8MiG_.js → onboarding.wallet-BFJRJg77.js} +16 -10
  78. package/dist/{openresponses-http-BYKqYqIr.js → openresponses-http-BA2nkk7t.js} +1 -1
  79. package/dist/{openresponses-http-DNXaz2VR.js → openresponses-http-C9x0SEG6.js} +4 -4
  80. package/dist/{openresponses-http-CyP-RUzR.js → openresponses-http-DU9S_V_8.js} +1 -1
  81. package/dist/{openresponses-http-C8H-a3KL.js → openresponses-http-NFMdHWOs.js} +4 -4
  82. package/dist/{openresponses-http-BR0xNXbf.js → openresponses-http-eMouHu_v.js} +1 -1
  83. package/dist/{parent-default-help-B57KLY1o.js → parent-default-help-k4GD2-UF.js} +1 -1
  84. package/dist/{parent-default-help-B9-EyEJR.js → parent-default-help-zu6kW9Un.js} +1 -1
  85. package/dist/{pi-embedded-G-VYb-eT.js → pi-embedded-DPElH0OZ.js} +5 -5
  86. package/dist/{pi-embedded-Dtw2m41q.js → pi-embedded-Pkm2p81t.js} +5 -5
  87. package/dist/{plugin-registry-Dr7BDkEc.js → plugin-registry-DEewJtHt.js} +1 -1
  88. package/dist/{plugin-registry-C5c96kNk.js → plugin-registry-DfO1RfZv.js} +1 -1
  89. package/dist/plugin-sdk/{audio-preflight-jaSZX_On.js → audio-preflight-L8bE2tgB.js} +1 -1
  90. package/dist/plugin-sdk/{audio-preflight-Bf83dqiV.js → audio-preflight-a_1hr0Eg.js} +1 -1
  91. package/dist/plugin-sdk/{channel-web-Bu6Y92kC.js → channel-web-BNlpZrWA.js} +1 -1
  92. package/dist/plugin-sdk/command-status.js +1 -1
  93. package/dist/plugin-sdk/index.js +2 -2
  94. package/dist/plugin-sdk/{openresponses-http-gCxCNpHu.js → openresponses-http-BBdkt744.js} +1 -1
  95. package/dist/plugin-sdk/{openresponses-http-M74cHGFJ.js → openresponses-http-DuRGQn_a.js} +1 -1
  96. package/dist/plugin-sdk/{reply-Bu9GXy54.js → reply-DclM907b.js} +5 -5
  97. package/dist/plugin-sdk/src/brand.d.ts +2 -2
  98. package/dist/plugin-sdk/{status-DLh4u6pb.js → status-EnvYKAtO.js} +5 -5
  99. package/dist/plugin-sdk/{web-BLZesoTn.js → web-BrtGwPHN.js} +2 -2
  100. package/dist/plugin-sdk/{web-BqmhQeOi.js → web-C0nKlODk.js} +1 -1
  101. package/dist/{plugins-cli-CpElRRGB.js → plugins-cli-BU7lm9mm.js} +7 -7
  102. package/dist/{plugins-cli-hFcodPhF.js → plugins-cli-Be4GLYdI.js} +7 -7
  103. package/dist/{program-ByNjbwln.js → program-B78oSJVp.js} +9 -9
  104. package/dist/{program-context-BJ6EvoUW.js → program-context-DpABaPXE.js} +25 -25
  105. package/dist/{prompt-select-styled-DyUwhQR0.js → prompt-select-styled-DI5ODziX.js} +4 -4
  106. package/dist/{prompt-select-styled-yZlzGWDe.js → prompt-select-styled-DmcQ0_hv.js} +4 -4
  107. package/dist/{register.agent-DYThb3Qq.js → register.agent-DOychJ9q.js} +11 -11
  108. package/dist/{register.agent-QbjX69Zq.js → register.agent-FC9A__Az.js} +10 -10
  109. package/dist/{register.configure-CXn_6bwZ.js → register.configure-i3gbc5Cc.js} +14 -14
  110. package/dist/{register.configure-CGzVdNRF.js → register.configure-ybGicOMR.js} +14 -14
  111. package/dist/{register.maintenance-CiSlTmn6.js → register.maintenance-CYX_k6x1.js} +10 -10
  112. package/dist/{register.maintenance-Cf-qQw2A.js → register.maintenance-MPPzwTam.js} +11 -11
  113. package/dist/{register.message-CxejzCev.js → register.message-C_Q6o32_.js} +5 -5
  114. package/dist/{register.message-Bz8Q1BDo.js → register.message-D6NFTigk.js} +5 -5
  115. package/dist/{register.onboard-DUvd2gzi.js → register.onboard-DqR_m0_p.js} +16 -16
  116. package/dist/{register.onboard-D-DkLJKD.js → register.onboard-PbsAD-eY.js} +16 -16
  117. package/dist/{register.setup-CzJsqVIe.js → register.setup-COidGsw2.js} +16 -16
  118. package/dist/{register.setup-BotpXpFX.js → register.setup-DMqotP6N.js} +16 -16
  119. package/dist/{register.status-health-sessions-C9Zx-J4Y.js → register.status-health-sessions-CPBz-3k7.js} +8 -8
  120. package/dist/{register.status-health-sessions-IUpygKVu.js → register.status-health-sessions-CeY5Pzgk.js} +8 -8
  121. package/dist/{register.subclis-BtJ07gvR.js → register.subclis-Dxe0Sco3.js} +16 -16
  122. package/dist/{reply-BRoR6TOO.js → reply-701mJB_S.js} +10 -10
  123. package/dist/{run-main-J8mnTN8L.js → run-main-BvouUOJB.js} +16 -16
  124. package/dist/{runtime-helper-grants-CkoxSD6G.js → runtime-helper-grants-B5q5llgE.js} +1 -1
  125. package/dist/{runtime-helper-grants-DMNl5B0x.js → runtime-helper-grants-CjDNw01t.js} +1 -1
  126. package/dist/{sandbox-cli-CNyUbQKy.js → sandbox-cli-DKUHq66f.js} +4 -4
  127. package/dist/{sandbox-cli-DfarPDi7.js → sandbox-cli-MNviI01s.js} +4 -4
  128. package/dist/{security-cli-DYUEfOxV.js → security-cli-C4J7sHdd.js} +5 -5
  129. package/dist/{security-cli-DfH_yEpS.js → security-cli-D2jFeCER.js} +5 -5
  130. package/dist/{server-OnS0sRn3.js → server-BRsV4GHd.js} +4 -4
  131. package/dist/{server-3-CquHGG.js → server-CvQUqV31.js} +4 -4
  132. package/dist/{server-cron-BclI8dUt.js → server-cron-BV2pPZ-O.js} +2 -2
  133. package/dist/{server-cron-CB9ay7nN.js → server-cron-C-3djfm_.js} +2 -2
  134. package/dist/{server-node-events-B3wjSbTf.js → server-node-events-Bi8FQeYu.js} +5 -5
  135. package/dist/{server-node-events-CHH1pmQi.js → server-node-events-Ce-RXuis.js} +5 -5
  136. package/dist/{status-SrKDBHd_.js → status-BiHSisy7.js} +4 -4
  137. package/dist/{status-kfsSxAsl.js → status-CIb_4gfm.js} +4 -4
  138. package/dist/{status-Cf-x3WJB.js → status-D9As1GK-.js} +1 -1
  139. package/dist/{status-DhGsqqOx.js → status-DoLjTnlQ.js} +1 -1
  140. package/dist/{tui-Cvc1YA_t.js → tui-BpbyDMEE.js} +1 -1
  141. package/dist/{tui-CIzUfHHB.js → tui-D9armVLc.js} +1 -1
  142. package/dist/{tui-cli-BxyfSTll.js → tui-cli-A_j8l8a3.js} +5 -5
  143. package/dist/{tui-cli-D8ECRV-M.js → tui-cli-lN5CL6pA.js} +5 -5
  144. package/dist/{update-cli-C1i3_uQZ.js → update-cli-B8_evObo.js} +11 -11
  145. package/dist/{update-cli-TMwGWZhI.js → update-cli-DRefGXK8.js} +12 -12
  146. package/dist/{update-runner-C6krqlIN.js → update-runner-Bd7n68kz.js} +1 -1
  147. package/dist/{update-runner-ChBrrXIl.js → update-runner-DnLLf66O.js} +1 -1
  148. package/dist/{wallet-C95r3fvu.js → wallet-CJdBRqTq.js} +1 -1
  149. package/dist/{wallet-BguV7zPF.js → wallet-DZA0r3pV.js} +1 -1
  150. package/dist/{web-l7WkPuq4.js → web-778GrijN.js} +1 -1
  151. package/dist/{web-CnR4rHHv.js → web-CPKh7bSP.js} +1 -1
  152. package/dist/{web-CoSbILfi.js → web-D-SMykKz.js} +1 -1
  153. package/dist/{web-CjKdghAZ.js → web-DEuBtNld.js} +5 -5
  154. package/dist/{web-vOcMOS29.js → web-Z5JZl5Nc.js} +5 -5
  155. package/dist/{web-search-providers.runtime-BC_EmT37.js → web-search-providers.runtime-AAOfSU2b.js} +1 -1
  156. package/dist/{web-search-providers.runtime-B09rLDoa.js → web-search-providers.runtime-DcgcyEiV.js} +1 -1
  157. package/docs/install/installer.md +11 -11
  158. package/docs/install/node.md +9 -0
  159. package/docs/security/baseline-checklist.md +7 -2
  160. package/extensions/acpx/package.json +1 -1
  161. package/extensions/bluebubbles/package.json +1 -1
  162. package/extensions/copilot-proxy/package.json +1 -1
  163. package/extensions/diagnostics-otel/package.json +1 -1
  164. package/extensions/discord/package.json +1 -1
  165. package/extensions/fased-federation/package.json +1 -1
  166. package/extensions/feishu/package.json +1 -1
  167. package/extensions/google-gemini-cli-auth/package.json +1 -1
  168. package/extensions/googlechat/package.json +1 -1
  169. package/extensions/imessage/package.json +1 -1
  170. package/extensions/irc/package.json +1 -1
  171. package/extensions/line/package.json +1 -1
  172. package/extensions/llm-task/package.json +1 -1
  173. package/extensions/lobster/package.json +1 -1
  174. package/extensions/matrix/CHANGELOG.md +12 -0
  175. package/extensions/matrix/package.json +1 -1
  176. package/extensions/mattermost/package.json +1 -1
  177. package/extensions/memory-core/package.json +1 -1
  178. package/extensions/memory-lancedb/package.json +1 -1
  179. package/extensions/minimax-portal-auth/package.json +1 -1
  180. package/extensions/msteams/CHANGELOG.md +12 -0
  181. package/extensions/msteams/package.json +1 -1
  182. package/extensions/nextcloud-talk/package.json +1 -1
  183. package/extensions/nostr/CHANGELOG.md +12 -0
  184. package/extensions/nostr/package.json +1 -1
  185. package/extensions/open-prose/package.json +1 -1
  186. package/extensions/sat-mining/package.json +1 -1
  187. package/extensions/signal/package.json +1 -1
  188. package/extensions/slack/package.json +1 -1
  189. package/extensions/synology-chat/package.json +1 -1
  190. package/extensions/telegram/package.json +1 -1
  191. package/extensions/tlon/package.json +1 -1
  192. package/extensions/twitch/CHANGELOG.md +12 -0
  193. package/extensions/twitch/package.json +1 -1
  194. package/extensions/voice-call/CHANGELOG.md +12 -0
  195. package/extensions/voice-call/package.json +1 -1
  196. package/extensions/whatsapp/package.json +1 -1
  197. package/extensions/zalo/CHANGELOG.md +12 -0
  198. package/extensions/zalo/package.json +1 -1
  199. package/extensions/zalouser/CHANGELOG.md +12 -0
  200. package/extensions/zalouser/package.json +1 -1
  201. package/package.json +1 -1
  202. package/scripts/start-managed.sh +11 -6
@@ -1,6 +1,6 @@
1
1
  import { _ as normalizeE164, i as CONFIG_DIR, v as pathExists } from "./agent-paths-DmOVZE7g.js";
2
2
  import { $l as runCommandWithTimeout, B as listChatChannels, Bd as listDiscordAccountIds, Dd as listSlackAccountIds, F as createSubsystemLogger, Fd as resolveSignalAccount, Hd as resolveDefaultDiscordAccountId, Hu as resolveDefaultWhatsAppAccountId, Id as listIMessageAccountIds, L as formatChannelPrimerLine, Ld as resolveDefaultIMessageAccountId, Mu as getChannelPlugin, Nd as listSignalAccountIds, Nu as listChannelPlugins, Od as resolveDefaultSlackAccountId, Pd as resolveDefaultSignalAccountId, R as formatChannelSelectionLine, Rd as resolveIMessageAccount, Ud as resolveDiscordAccount, Vu as listWhatsAppAccountIds, Wu as resolveWhatsAppAuthDir, _d as resolveDefaultTelegramAccountId, d as resolveDefaultAgentId, dd as formatCliCommand, gd as listTelegramAccountIds, kd as resolveSlackAccount, ld as stripAnsi, mo as resolveFasedAgentPackageRootSync, ou as extractArchive, u as resolveAgentWorkspaceDir, vd as resolveTelegramAccount, wl as installPluginFromNpmSpec } from "./agent-scope-DHrLr5OF.js";
3
- import { Ft as resolveSlackUserAllowlist, It as resolveSlackChannelAllowlist, Nt as loadFasedAgentPlugins, la as createPluginLoaderLogger, mn as resolveDiscordChannelAllowlist, pn as resolveDiscordUserAllowlist, zt as detectBinary } from "./reply-BRoR6TOO.js";
3
+ import { Ft as resolveSlackUserAllowlist, It as resolveSlackChannelAllowlist, Nt as loadFasedAgentPlugins, la as createPluginLoaderLogger, mn as resolveDiscordChannelAllowlist, pn as resolveDiscordUserAllowlist, zt as detectBinary } from "./reply-701mJB_S.js";
4
4
  import { h as normalizeAccountId, m as DEFAULT_ACCOUNT_ID } from "./session-key-LmCHAJTQ.js";
5
5
  import { dt as normalizeDiscordSlug } from "./send-jxmRy65D.js";
6
6
  import { i as isBlockedHostnameOrIp } from "./ssrf-Blf4NrHS.js";
@@ -12,7 +12,7 @@ import { t as resolveBrewExecutable } from "./brew-C52GeCeh.js";
12
12
  import { t as resolveChannelDefaultAccountId } from "./helpers-BvDnvwsE.js";
13
13
  import { t as enablePluginInConfig } from "./enable-D3_YPNIT.js";
14
14
  import { t as buildNpmResolutionInstallFields } from "./installs-DDbnXe4x.js";
15
- import { o as finalizeInstalledPluginConfig } from "./lifecycle-DKOezW7h.js";
15
+ import { o as finalizeInstalledPluginConfig } from "./lifecycle-D2VlrxY8.js";
16
16
  import { t as fetchTelegramChatId } from "./api-DLdLLQm_.js";
17
17
  import fs, { createWriteStream, readFileSync } from "node:fs";
18
18
  import os from "node:os";
@@ -1,7 +1,7 @@
1
1
  import { $c as installPluginFromNpmSpec, $d as resolveDiscordAccount, $l as listWhatsAppAccountIds, Au as resolveTelegramAccount, Cu as formatCliCommand, Gd as resolveSignalAccount, Gl as listChannelPlugins, Gu as resolveDefaultAgentId, Jd as resolveIMessageAccount, Kd as listIMessageAccountIds, Ld as listSlackAccountIds, Ou as listTelegramAccountIds, Qd as resolveDefaultDiscordAccountId, Rd as resolveDefaultSlackAccountId, Ud as listSignalAccountIds, Wd as resolveDefaultSignalAccountId, Wl as getChannelPlugin, Wu as resolveAgentWorkspaceDir, Xd as listDiscordAccountIds, a as createSubsystemLogger, c as formatChannelSelectionLine, eu as resolveDefaultWhatsAppAccountId, ku as resolveDefaultTelegramAccountId, md as runCommandWithTimeout, nu as resolveWhatsAppAuthDir, pd as resolveFasedAgentPackageRootSync, qd as resolveDefaultIMessageAccountId, s as formatChannelPrimerLine, u as listChatChannels, xl as extractArchive, xu as stripAnsi, zd as resolveSlackAccount } from "./env-C77feXxI.js";
2
2
  import { _ as pathExists, g as normalizeE164, i as CONFIG_DIR } from "./agent-paths-BI1hx-tF.js";
3
3
  import { dt as normalizeDiscordSlug } from "./send-BFEd4vCM.js";
4
- import { Oi as createPluginLoaderLogger, Qt as resolveDiscordUserAllowlist, V as resolveDiscordChannelAllowlist, Zt as resolveSlackUserAllowlist, c as loadFasedAgentPlugins, p as detectBinary, u as resolveSlackChannelAllowlist } from "./model-catalog-DHRVUWBf.js";
4
+ import { Oi as createPluginLoaderLogger, Qt as resolveDiscordUserAllowlist, V as resolveDiscordChannelAllowlist, Zt as resolveSlackUserAllowlist, c as loadFasedAgentPlugins, p as detectBinary, u as resolveSlackChannelAllowlist } from "./model-catalog-BQ5G4eK6.js";
5
5
  import { J as DEFAULT_ACCOUNT_ID, Y as normalizeAccountId } from "./entry.js";
6
6
  import { i as isBlockedHostnameOrIp } from "./ssrf-CqV2hisj.js";
7
7
  import { d as listChannelPluginCatalogEntries, f as resolveChannelPluginExpectedPluginIds, l as formatChannelPluginCatalogSelectionHint, s as isChannelConfigured, u as formatChannelPluginCatalogStatusLine } from "./dangerous-name-matching-CFRKz8Uq.js";
@@ -12,7 +12,7 @@ import { t as loginWeb } from "./login-CuawnITW.js";
12
12
  import { t as resolveChannelDefaultAccountId } from "./helpers-BfdkoReO.js";
13
13
  import { t as enablePluginInConfig } from "./enable-C4xB2A3x.js";
14
14
  import { t as buildNpmResolutionInstallFields } from "./installs-Cha8QIzO.js";
15
- import { o as finalizeInstalledPluginConfig } from "./lifecycle-DE4kux0k.js";
15
+ import { o as finalizeInstalledPluginConfig } from "./lifecycle-C5O_poBp.js";
16
16
  import { t as fetchTelegramChatId } from "./api-uvDKewCP.js";
17
17
  import { spawn } from "node:child_process";
18
18
  import os from "node:os";
@@ -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-DHRVUWBf.js";
5
+ import "./model-catalog-BQ5G4eK6.js";
6
6
  import "./github-copilot-token-A9DiaCB0.js";
7
7
  import "./reply-prefix-TUhpEtvr.js";
8
8
  import "./memory-2keYbXkc.js";
@@ -30,10 +30,10 @@ import "./dangerous-tools-CusV9bcr.js";
30
30
  import "./chrome-bxkNKPA7.js";
31
31
  import "./pairing-token-C2iKEhFc.js";
32
32
  import "./ws-DiFJ3zRB.js";
33
- import "./onboarding.wallet--7Yu2hFw.js";
33
+ import "./onboarding.wallet-B87UVKiT.js";
34
34
  import "./wallet-runtime-config-TjiNNY9x.js";
35
35
  import "./wallet-provider-registry-CFNtQ2ZR.js";
36
- import "./wallet-C95r3fvu.js";
36
+ import "./wallet-CJdBRqTq.js";
37
37
  import "./wallet-approval-auth-BaVTLG5r.js";
38
38
  import "./runtime-DXHXAPJA.js";
39
39
  import "./device-identity-ZHUQ6a8N.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-BoCGz3bU.js";
47
+ import "./deps-DdP-Hmxc.js";
48
48
  import "./frontmatter-D2UNJikU.js";
49
49
  import "./skills-Dis31awJ.js";
50
50
  import "./skills-remote-CIAB0AXm.js";
@@ -75,10 +75,10 @@ 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-DhGsqqOx.js";
78
+ import "./status-DoLjTnlQ.js";
79
79
  import "./update-D4rhRm3D.js";
80
- import { o as finalizeInstalledPluginConfig } from "./lifecycle-DE4kux0k.js";
81
- import { t as resolvePluginWebSearchProviders } from "./web-search-providers.runtime-BC_EmT37.js";
80
+ import { o as finalizeInstalledPluginConfig } from "./lifecycle-C5O_poBp.js";
81
+ import { t as resolvePluginWebSearchProviders } from "./web-search-providers.runtime-AAOfSU2b.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-BRoR6TOO.js";
5
+ import "./reply-701mJB_S.js";
6
6
  import "./errors-Dx3S3Nrp.js";
7
7
  import "./send-C5_fB8YQ.js";
8
8
  import "./send-jxmRy65D.js";
@@ -14,10 +14,10 @@ import "./chrome-mXtDMFyZ.js";
14
14
  import "./pairing-token-BFGorDQo.js";
15
15
  import "./ip-D_T5zbZS.js";
16
16
  import "./ws-cvQhrVP3.js";
17
- import "./onboarding.wallet-CQG8MiG_.js";
17
+ import "./onboarding.wallet-BFJRJg77.js";
18
18
  import "./wallet-runtime-config-BlRWvEER.js";
19
19
  import "./wallet-provider-registry-ax0NJo0F.js";
20
- import "./wallet-BguV7zPF.js";
20
+ import "./wallet-DZA0r3pV.js";
21
21
  import "./wallet-approval-auth-DT-vofLs.js";
22
22
  import "./reply-prefix-C2EEc3pc.js";
23
23
  import "./media-C5BIKO-v.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-vuWHR8ix.js";
40
+ import "./deps-RXAe1X5s.js";
41
41
  import "./memory-DDpj0IVA.js";
42
42
  import "./memory-search-BwYkW6_V.js";
43
43
  import "./manager-BmONwMiP.js";
@@ -78,10 +78,10 @@ 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-Cf-x3WJB.js";
81
+ import "./status-D9As1GK-.js";
82
82
  import "./update-Dew6hqdf.js";
83
- import { o as finalizeInstalledPluginConfig } from "./lifecycle-DKOezW7h.js";
84
- import { t as resolvePluginWebSearchProviders } from "./web-search-providers.runtime-B09rLDoa.js";
83
+ import { o as finalizeInstalledPluginConfig } from "./lifecycle-D2VlrxY8.js";
84
+ import { t as resolvePluginWebSearchProviders } from "./web-search-providers.runtime-DcgcyEiV.js";
85
85
  import fs from "node:fs";
86
86
  import path from "node:path";
87
87
 
@@ -1,13 +1,13 @@
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-BRoR6TOO.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-701mJB_S.js";
5
5
  import { d as defaultRuntime, f as restoreTerminalState, s as redactSensitiveText } from "./errors-Dx3S3Nrp.js";
6
- import { a as resolveSignerdBinaryPath, n as installSignerdBinary, o as restartLocalSocketSigner, r as migrateLocalSignerKeystoreToMaterialDir, t as configureWalletForOnboarding } from "./onboarding.wallet-CQG8MiG_.js";
6
+ import { a as resolveSignerdBinaryPath, n as installSignerdBinary, o as restartLocalSocketSigner, r as migrateLocalSignerKeystoreToMaterialDir, t as configureWalletForOnboarding } from "./onboarding.wallet-BFJRJg77.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";
8
8
  import { a as readWalletProviderRegistry, l as setDefaultWallet, n as checkNamedWalletDeletionSafety, p as upsertNamedWallet, r as deleteNamedWallet, s as resolveWalletUserRole, u as setNamedWalletRole } from "./wallet-provider-registry-ax0NJo0F.js";
9
9
  import { n as redactSensitiveUrlLikeString } from "./redact-sensitive-url-B0RJQqO7.js";
10
- import { C as walletSetupCommand, k as readWalletStatusSnapshot, t as collectWalletSignerDoctorReport } from "./wallet-BguV7zPF.js";
10
+ import { C as walletSetupCommand, k as readWalletStatusSnapshot, t as collectWalletSignerDoctorReport } from "./wallet-DZA0r3pV.js";
11
11
  import { c as loadPersistedFederationToken, i as resolveFederationBaseUrl, o as resolveFederationHandle, t as DEFAULT_FEDERATION_BASE_URL } from "./runtime-bsvPuEXH.js";
12
12
  import { t as readManagedFederationTokenSummary } from "./federation-BrNm7xtG.js";
13
13
  import { or as clearDeviceAuthStore } from "./call-DDALpDwS.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-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";
20
+ import { a as promptRemoteGatewayConfig, n as getTailscaleMissingBinNoteLines, r as setupSkills, t as validateIPv4AddressInput, u as promptCustomApiConfig } from "./ipv4-Bh1H98-c.js";
21
+ import { o as waitForHostedDashboardBrowserPath } from "./health-C-AsEUPg.js";
22
+ import { n as warnIfModelConfigLooksOff, r as applyAuthChoice } from "./auth-choice-D9LWnNpF.js";
23
+ import { t as promptAuthChoiceGrouped } from "./auth-choice-prompt-DFyVEU7J.js";
24
24
  import { n as logConfigUpdated } from "./logging-Dv2wthF_.js";
25
- import { n as setupChannels } from "./onboard-channels-BREKCcFf.js";
25
+ import { n as setupChannels } from "./onboard-channels-C4gBvkYQ.js";
26
26
  import { t as buildWorkspaceHookStatus } from "./hooks-status-BielXMUB.js";
27
- import { t as runTui } from "./tui-CIzUfHHB.js";
27
+ import { t as runTui } from "./tui-D9armVLc.js";
28
28
  import fs from "node:fs";
29
29
  import os from "node:os";
30
30
  import path from "node:path";
@@ -169,7 +169,7 @@ function isHostedSecurityCapableSession(explicitFlag = false) {
169
169
  const sudoersPath = path.join("/etc/sudoers.d", `fased-host-maintenance-${currentUser}`);
170
170
  if (fs.existsSync(sudoersPath)) return true;
171
171
  }
172
- return canRunHostedMaintenanceCommand("sudo -n tailscale status >/dev/null 2>&1") || canRunHostedMaintenanceCommand("sudo -n ufw status >/dev/null 2>&1") || canRunHostedMaintenanceCommand("sudo -n firewall-cmd --state >/dev/null 2>&1") || canRunHostedMaintenanceCommand("sudo -n systemctl is-active --quiet firewalld >/dev/null 2>&1") || canRunHostedMaintenanceCommand("sudo -n systemctl status fased-gateway.service >/dev/null 2>&1");
172
+ return canRunHostedMaintenanceCommand("sudo -n /usr/local/sbin/fased-host-maintenance tailscale-status >/dev/null 2>&1") || canRunHostedMaintenanceCommand("sudo -n /usr/local/sbin/fased-host-maintenance tailnet-ssh-ingress >/dev/null 2>&1") || canRunHostedMaintenanceCommand("sudo -n /usr/local/sbin/fased-host-maintenance firewall-baseline >/dev/null 2>&1") || canRunHostedMaintenanceCommand("sudo -n systemctl status fased-gateway.service >/dev/null 2>&1");
173
173
  }
174
174
 
175
175
  //#endregion
@@ -547,16 +547,18 @@ async function installRootServiceMaintenanceAccess(params) {
547
547
  const sudoers = [
548
548
  `${safeUser} ALL=(root) NOPASSWD: /usr/bin/systemctl restart ${safeServiceName}.service`,
549
549
  `${safeUser} ALL=(root) NOPASSWD: /usr/bin/systemctl restart --no-block ${safeServiceName}.service`,
550
+ `${safeUser} ALL=(root) NOPASSWD: /usr/bin/systemctl start --no-block ${safeServiceName}.service`,
551
+ `${safeUser} ALL=(root) NOPASSWD: /usr/bin/systemctl enable --now ${safeServiceName}.service`,
550
552
  `${safeUser} ALL=(root) NOPASSWD: /usr/bin/systemctl status ${safeServiceName}.service`,
551
- `${safeUser} ALL=(root) NOPASSWD: /usr/bin/systemctl status ${safeServiceName}.service *`,
552
- `${safeUser} ALL=(root) NOPASSWD: /usr/bin/systemctl status ${safeServiceName} *`,
553
+ `${safeUser} ALL=(root) NOPASSWD: /usr/bin/systemctl status ${safeServiceName}.service --no-pager`,
553
554
  `${safeUser} ALL=(root) NOPASSWD: /usr/bin/systemctl is-active ${safeServiceName}.service`,
554
- `${safeUser} ALL=(root) NOPASSWD: /usr/bin/systemctl is-active ${safeServiceName}.service *`,
555
- `${safeUser} ALL=(root) NOPASSWD: /usr/bin/systemctl is-active ${safeServiceName} *`,
556
- `${safeUser} ALL=(root) NOPASSWD: /usr/bin/systemctl show ${safeServiceName}.service *`,
557
- `${safeUser} ALL=(root) NOPASSWD: /usr/bin/systemctl show ${safeServiceName} *`,
558
- `${safeUser} ALL=(root) NOPASSWD: /usr/bin/journalctl -u ${safeServiceName}.service *`,
559
- `${safeUser} ALL=(root) NOPASSWD: /usr/bin/journalctl -u ${safeServiceName} *`
555
+ `${safeUser} ALL=(root) NOPASSWD: /usr/bin/systemctl is-active ${safeServiceName}`,
556
+ `${safeUser} ALL=(root) NOPASSWD: /usr/bin/systemctl show ${safeServiceName}.service -p ActiveState --value`,
557
+ `${safeUser} ALL=(root) NOPASSWD: /usr/bin/systemctl cat ${safeServiceName}.service`,
558
+ `${safeUser} ALL=(root) NOPASSWD: /usr/bin/journalctl -u ${safeServiceName}.service -n 50 --no-pager`,
559
+ `${safeUser} ALL=(root) NOPASSWD: /usr/bin/journalctl -u ${safeServiceName}.service -n 120 --no-pager`,
560
+ `${safeUser} ALL=(root) NOPASSWD: /usr/bin/journalctl -u ${safeServiceName} -n 50 --no-pager`,
561
+ `${safeUser} ALL=(root) NOPASSWD: /usr/bin/journalctl -u ${safeServiceName} -n 120 --no-pager`
560
562
  ].join("\n");
561
563
  return await runShell([
562
564
  `echo '${Buffer.from(`${sudoers}\n`, "utf8").toString("base64")}' | base64 -d | sudo -n tee '${sudoersPath}' >/dev/null`,
@@ -1662,7 +1664,7 @@ async function finalizeOnboardingWizard(options) {
1662
1664
  if (process.platform === "linux") {
1663
1665
  const localSignerSync = resolveLocalSignerSyncForFinalize({ strictVps });
1664
1666
  if (localSignerSync.sync) try {
1665
- const { syncLocalSocketSignerFromConfig } = await import("./onboarding.wallet-CQG8MiG_.js").then((n) => n.i);
1667
+ const { syncLocalSocketSignerFromConfig } = await import("./onboarding.wallet-BFJRJg77.js").then((n) => n.i);
1666
1668
  await syncLocalSocketSignerFromConfig({
1667
1669
  config: nextConfig,
1668
1670
  env: process.env,
@@ -2748,6 +2750,7 @@ const LOW_MEMORY_HOSTING_SWAP_GB = 4;
2748
2750
  const HOSTING_SWAP_GB = 2;
2749
2751
  const TAILSCALE_INTERACTIVE_TIMEOUT_MS = 120 * 1e3;
2750
2752
  const TAILSCALE_LOGIN_URL_RE = /https:\/\/login\.tailscale\.com\/a\/[A-Za-z0-9_-]+/i;
2753
+ const HOST_MAINTENANCE_HELPER = "/usr/local/sbin/fased-host-maintenance";
2751
2754
  function detectTotalMemoryMb() {
2752
2755
  if (process.platform === "linux") try {
2753
2756
  const match = fs.readFileSync("/proc/meminfo", "utf8").match(/^MemTotal:\s+(\d+)\s+kB/m);
@@ -2848,7 +2851,7 @@ function buildTailscaleLoginWaitCommand(command) {
2848
2851
  `bash -lc ${shellQuote(command)} &`,
2849
2852
  "ts_pid=$!",
2850
2853
  "for _ in $(seq 1 55); do",
2851
- " if tailscale ip -4 >/dev/null 2>&1 || sudo -n tailscale ip -4 >/dev/null 2>&1; then",
2854
+ ` if tailscale ip -4 >/dev/null 2>&1 || ${hostMaintenanceCommand("tailscale-ip4")} >/dev/null 2>&1 || sudo -n tailscale ip -4 >/dev/null 2>&1; then`,
2852
2855
  " kill -INT \"$ts_pid\" >/dev/null 2>&1 || true",
2853
2856
  " wait \"$ts_pid\" >/dev/null 2>&1 || true",
2854
2857
  " exit 0",
@@ -2861,7 +2864,7 @@ function buildTailscaleLoginWaitCommand(command) {
2861
2864
  "done",
2862
2865
  "kill -INT \"$ts_pid\" >/dev/null 2>&1 || true",
2863
2866
  "wait \"$ts_pid\" >/dev/null 2>&1 || true",
2864
- "if tailscale ip -4 >/dev/null 2>&1 || sudo -n tailscale ip -4 >/dev/null 2>&1; then",
2867
+ `if tailscale ip -4 >/dev/null 2>&1 || ${hostMaintenanceCommand("tailscale-ip4")} >/dev/null 2>&1 || sudo -n tailscale ip -4 >/dev/null 2>&1; then`,
2865
2868
  " exit 0",
2866
2869
  "fi",
2867
2870
  "exit 124"
@@ -2914,21 +2917,29 @@ function tailscaleTimedOutButReady(result, logPath, runner = run) {
2914
2917
  function shellQuote(value) {
2915
2918
  return `'${value.replace(/'/g, "'\\''")}'`;
2916
2919
  }
2920
+ function hostMaintenanceCommand(action) {
2921
+ return `sudo -n ${HOST_MAINTENANCE_HELPER} ${action}`;
2922
+ }
2923
+ function hostMaintenanceCommandWithInput(action, input) {
2924
+ return `printf '%s\\n' ${shellQuote(input)} | ${hostMaintenanceCommand(action)}`;
2925
+ }
2917
2926
  function isTailscaleLoggedIn(logPath, runner = run) {
2918
- return runner("tailscale status >/dev/null 2>&1", logPath).ok || runner("sudo -n tailscale status >/dev/null 2>&1", logPath).ok;
2927
+ return runner("tailscale status >/dev/null 2>&1", logPath).ok || runner(`${hostMaintenanceCommand("tailscale-status")} >/dev/null 2>&1`, logPath).ok || runner("sudo -n tailscale status >/dev/null 2>&1", logPath).ok;
2919
2928
  }
2920
2929
  function hasTailscaleIp(logPath, runner = run) {
2921
- return runner("tailscale ip -4 >/dev/null 2>&1", logPath).ok || runner("sudo -n tailscale ip -4 >/dev/null 2>&1", logPath).ok;
2930
+ return runner("tailscale ip -4 >/dev/null 2>&1", logPath).ok || runner(`${hostMaintenanceCommand("tailscale-ip4")} >/dev/null 2>&1`, logPath).ok || runner("sudo -n tailscale ip -4 >/dev/null 2>&1", logPath).ok;
2922
2931
  }
2923
2932
  function readTailscaleIp(logPath, runner = run) {
2924
2933
  const probe = runner("tailscale ip -4", logPath);
2925
- const sudoProbe = probe.ok ? probe : runner("sudo -n tailscale ip -4", logPath);
2934
+ const helperProbe = probe.ok ? probe : runner(hostMaintenanceCommand("tailscale-ip4"), logPath);
2935
+ const sudoProbe = helperProbe.ok ? helperProbe : runner("sudo -n tailscale ip -4", logPath);
2926
2936
  if (!sudoProbe.ok || !sudoProbe.detail) return;
2927
2937
  return sudoProbe.detail.match(/\b\d{1,3}(?:\.\d{1,3}){3}\b/)?.[0];
2928
2938
  }
2929
2939
  function readTailscaleSelf(logPath, runner = run) {
2930
2940
  const probe = runner("tailscale status --json", logPath);
2931
- const sudoProbe = probe.ok ? probe : runner("sudo -n tailscale status --json", logPath);
2941
+ const helperProbe = probe.ok ? probe : runner(hostMaintenanceCommand("tailscale-status-json"), logPath);
2942
+ const sudoProbe = helperProbe.ok ? helperProbe : runner("sudo -n tailscale status --json", logPath);
2932
2943
  if (!sudoProbe.ok || !sudoProbe.detail) return { ipv4: readTailscaleIp(logPath, runner) };
2933
2944
  try {
2934
2945
  const parsed = JSON.parse(sudoProbe.detail);
@@ -3034,7 +3045,8 @@ function verifyTailnetSshServerPrerequisites(params) {
3034
3045
  };
3035
3046
  }
3036
3047
  function ensureTailnetSshIngressForVerification(params) {
3037
- const result = (params.runner ?? run)([
3048
+ const runner = params.runner ?? run;
3049
+ const command = [
3038
3050
  "if command -v ufw >/dev/null 2>&1; then",
3039
3051
  " if sudo -n ufw status | grep -qi '^Status: active'; then",
3040
3052
  " sudo -n ufw insert 1 allow in on tailscale0 to any port 22 proto tcp || sudo -n ufw allow in on tailscale0 to any port 22 proto tcp",
@@ -3045,7 +3057,9 @@ function ensureTailnetSshIngressForVerification(params) {
3045
3057
  " sudo -n firewall-cmd --permanent --zone=trusted --add-interface=tailscale0 >/dev/null 2>&1 || true",
3046
3058
  " sudo -n firewall-cmd --reload >/dev/null 2>&1 || true",
3047
3059
  "fi"
3048
- ].join("\n"), params.logPath);
3060
+ ].join("\n");
3061
+ const helperResult = runner(hostMaintenanceCommand("tailnet-ssh-ingress"), params.logPath);
3062
+ const result = helperResult.ok ? helperResult : runner(command, params.logPath);
3049
3063
  if (!result.ok) return {
3050
3064
  ok: false,
3051
3065
  detail: result.detail ?? "could not prepare tailnet SSH firewall rule before verification"
@@ -3132,7 +3146,7 @@ async function confirmTailnetSshBeforeLockdown(params) {
3132
3146
  return false;
3133
3147
  }
3134
3148
  await prompter.note(formatTailscaleAccountBrowserLoginNote(), "Tailscale login");
3135
- const tsReset = await interactiveRunner("sudo -n tailscale logout && sudo -n tailscale up --ssh --accept-routes --reset", logPath, prompter);
3149
+ const tsReset = await interactiveRunner(hostMaintenanceCommand("tailscale-up-reset-ssh"), logPath, prompter);
3136
3150
  const acceptedTimedOutLogin = tailscaleTimedOutButReady(tsReset, logPath, runner);
3137
3151
  if (!tsReset.ok && !acceptedTimedOutLogin || !hasTailscaleIp(logPath, runner)) {
3138
3152
  runtime.error("Hosting setup stopped before SSH/firewall lock-down.");
@@ -3176,9 +3190,9 @@ function ensureTailscaleServe(port, logPath) {
3176
3190
  ok: true,
3177
3191
  detail: `tailscale serve --bg -> 127.0.0.1:${port}`
3178
3192
  };
3179
- if (run(`sudo -n tailscale serve --bg http://127.0.0.1:${port}`, logPath).ok) return {
3193
+ if (run(hostMaintenanceCommandWithInput("tailscale-serve", String(port)), logPath).ok) return {
3180
3194
  ok: true,
3181
- detail: `sudo tailscale serve --bg -> 127.0.0.1:${port}`
3195
+ detail: `host maintenance tailscale serve -> 127.0.0.1:${port}`
3182
3196
  };
3183
3197
  if (run(`tailscale serve https / http://127.0.0.1:${port}`, logPath).ok) return {
3184
3198
  ok: true,
@@ -3202,7 +3216,7 @@ function isTailscaleServeReady(port) {
3202
3216
  ],
3203
3217
  encoding: "utf8"
3204
3218
  });
3205
- if ((probe.status ?? 1) !== 0) probe = spawnSync("bash", ["-lc", "sudo -n tailscale serve status"], {
3219
+ if ((probe.status ?? 1) !== 0) probe = spawnSync("bash", ["-lc", hostMaintenanceCommand("tailscale-serve-status")], {
3206
3220
  stdio: [
3207
3221
  "ignore",
3208
3222
  "pipe",
@@ -3235,6 +3249,7 @@ function packageInstallCommand(packages) {
3235
3249
  }
3236
3250
  function tailscaleInstallCommand() {
3237
3251
  return [
3252
+ `${hostMaintenanceCommand("tailscale-install-start")} && exit 0`,
3238
3253
  "if command -v tailscale >/dev/null 2>&1; then",
3239
3254
  " :",
3240
3255
  "elif command -v apt-get >/dev/null 2>&1; then",
@@ -3260,6 +3275,7 @@ function tailscaleInstallCommand() {
3260
3275
  }
3261
3276
  function firewallBaselineCommand() {
3262
3277
  return [
3278
+ `${hostMaintenanceCommand("firewall-baseline")} && exit 0`,
3263
3279
  "if command -v ufw >/dev/null 2>&1 || command -v apt-get >/dev/null 2>&1; then",
3264
3280
  " command -v ufw >/dev/null 2>&1 || { " + packageInstallCommand(["ufw"]) + "; }",
3265
3281
  " sudo -n ufw default deny incoming",
@@ -3283,6 +3299,7 @@ function firewallBaselineCommand() {
3283
3299
  }
3284
3300
  function automaticUpdatesCommand() {
3285
3301
  return [
3302
+ `${hostMaintenanceCommand("automatic-updates")} && exit 0`,
3286
3303
  "if command -v apt-get >/dev/null 2>&1; then",
3287
3304
  " " + packageInstallCommand(["unattended-upgrades"]),
3288
3305
  " sudo -n systemctl enable --now unattended-upgrades >/dev/null 2>&1 || true",
@@ -3301,15 +3318,7 @@ function automaticUpdatesCommand() {
3301
3318
  ].join("\n");
3302
3319
  }
3303
3320
  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");
3321
+ return hostMaintenanceCommand("harden-ssh");
3313
3322
  }
3314
3323
  function failOrContinue(params) {
3315
3324
  const { opts, runtime, step, detail } = params;
@@ -3355,7 +3364,7 @@ async function applyHostingSecurity(params) {
3355
3364
  validate: (value) => value.trim() ? void 0 : "Required"
3356
3365
  })).trim();
3357
3366
  else await prompter.note(formatTailscaleBrowserLoginNote(), "Tailscale login");
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";
3367
+ const resetCommand = tsAuthkey ? hostMaintenanceCommandWithInput("tailscale-up-reset-authkey-ssh", tsAuthkey) : hostMaintenanceCommand("tailscale-up-reset-ssh");
3359
3368
  const tsReset = tsAuthkey ? run(resetCommand, logPath) : await runInteractiveTailscaleLogin(resetCommand, logPath, prompter);
3360
3369
  if (!tsReset.ok && !tailscaleTimedOutButReady(tsReset, logPath)) return {
3361
3370
  ok: false,
@@ -3479,7 +3488,7 @@ async function applyHostingSecurity(params) {
3479
3488
  logPath
3480
3489
  };
3481
3490
  }
3482
- } else if (hasCommand("systemctl")) run("sudo -n systemctl enable --now tailscaled >/dev/null 2>&1 || true", logPath);
3491
+ } else if (hasCommand("systemctl")) run(`${hostMaintenanceCommand("tailscale-install-start")} >/dev/null 2>&1 || sudo -n systemctl enable --now tailscaled >/dev/null 2>&1 || true`, logPath);
3483
3492
  if (prompter && opts.nonInteractive !== true) await prompter.note(formatLocalDeviceTailnetRequirementNote(), "Local device requirement");
3484
3493
  let tsHealthy = isTailscaleLoggedIn(logPath);
3485
3494
  if (tsHealthy && prompter && opts.nonInteractive !== true) {
@@ -3488,7 +3497,7 @@ async function applyHostingSecurity(params) {
3488
3497
  initialValue: false
3489
3498
  })) {
3490
3499
  if (prompter) await prompter.note(formatTailscaleBrowserLoginNote(), "Tailscale login");
3491
- const tsReset = await runInteractiveTailscaleLogin("sudo -n tailscale logout && sudo -n tailscale up --ssh --accept-routes --reset", logPath, prompter);
3500
+ const tsReset = await runInteractiveTailscaleLogin(hostMaintenanceCommand("tailscale-up-reset-ssh"), logPath, prompter);
3492
3501
  if (!tsReset.ok && !tailscaleTimedOutButReady(tsReset, logPath)) {
3493
3502
  checks.push({
3494
3503
  name: "tailscale",
@@ -3531,7 +3540,7 @@ async function applyHostingSecurity(params) {
3531
3540
  })).trim();
3532
3541
  }
3533
3542
  if (tsAuthkey) {
3534
- const tsUp = run(`sudo -n tailscale up --authkey ${JSON.stringify(tsAuthkey)} --ssh`, logPath);
3543
+ const tsUp = run(hostMaintenanceCommandWithInput("tailscale-up-authkey-ssh", tsAuthkey), logPath);
3535
3544
  if (!tsUp.ok) {
3536
3545
  checks.push({
3537
3546
  name: "tailscale",
@@ -3575,7 +3584,7 @@ async function applyHostingSecurity(params) {
3575
3584
  };
3576
3585
  } else {
3577
3586
  if (prompter) await prompter.note(formatTailscaleBrowserLoginNote(), "Tailscale login");
3578
- const tsUp = await runInteractiveTailscaleLogin("sudo -n tailscale up --ssh", logPath, prompter);
3587
+ const tsUp = await runInteractiveTailscaleLogin(hostMaintenanceCommand("tailscale-up-ssh"), logPath, prompter);
3579
3588
  if (!tsUp.ok && !tailscaleTimedOutButReady(tsUp, logPath)) {
3580
3589
  checks.push({
3581
3590
  name: "tailscale",
@@ -3630,7 +3639,7 @@ async function applyHostingSecurity(params) {
3630
3639
  detail: "tailnet IP present; verifying app SSH before lock-down"
3631
3640
  });
3632
3641
  const operatorUser = run("id -u app >/dev/null 2>&1", logPath).ok ? "app" : process.env.SUDO_USER?.trim() || process.env.USER?.trim() || process.env.LOGNAME?.trim();
3633
- if (operatorUser) run(`sudo -n tailscale set --operator='${operatorUser}' >/dev/null 2>&1 || true`, logPath);
3642
+ if (operatorUser) run(`${hostMaintenanceCommand("tailscale-set-operator-self")} >/dev/null 2>&1 || true`, logPath);
3634
3643
  if (!await confirmTailnetSshBeforeLockdown({
3635
3644
  opts,
3636
3645
  runtime,
@@ -3727,7 +3736,7 @@ async function applyHostingSecurity(params) {
3727
3736
  ok: true,
3728
3737
  detail: "password auth/root login disabled and ssh restarted"
3729
3738
  });
3730
- const f2bRes = runHostSetupCommand(`${packageInstallCommand(["fail2ban"])}\nsudo -n systemctl enable --now fail2ban`);
3739
+ const f2bRes = runHostSetupCommand(`${hostMaintenanceCommand("fail2ban-enable")} || (${packageInstallCommand(["fail2ban"])}\nsudo -n systemctl enable --now fail2ban)`);
3731
3740
  if (!f2bRes.ok) {
3732
3741
  checks.push({
3733
3742
  name: "fail2ban",