@fased/fased 0.1.21 → 0.1.23

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 (248) hide show
  1. package/README.md +9 -2
  2. package/dist/{active-listener-B_AAz_Nv.js → active-listener-CILIY2ox.js} +1 -1
  3. package/dist/{agent-scope-Cb1u7HE7.js → agent-scope-DwKyukUg.js} +124 -124
  4. package/dist/{agents-BwDWbvDH.js → agents-J1fRpMRy.js} +8 -8
  5. package/dist/{attachment-normalize-C9F-gS4-.js → attachment-normalize-CJWQWDbC.js} +1 -1
  6. package/dist/{attachment-normalize-C9w24bkb.js → attachment-normalize-Din9M1Y4.js} +1 -1
  7. package/dist/{audio-preflight-DGoGnRdo.js → audio-preflight-CiHBO6op.js} +31 -31
  8. package/dist/{audio-preflight-Dg10mePo.js → audio-preflight-D3I9e121.js} +2 -2
  9. package/dist/{audio-preflight-QMOvUkXH.js → audio-preflight-Dpmj_mYE.js} +1 -1
  10. package/dist/{audio-preflight-DnHScDmF.js → audio-preflight-fOBO0I4S.js} +2 -2
  11. package/dist/{audio-preflight-CTs9Ta27.js → audio-preflight-tHKngO6z.js} +1 -1
  12. package/dist/{audit-DJOyIBeV.js → audit-BGrhx_IL.js} +1 -1
  13. package/dist/{audit-DmYUk4AC.js → audit-DQyLAEfl.js} +1 -1
  14. package/dist/{auth-7Dkf1_CI.js → auth-C4Rs_Ca4.js} +5 -5
  15. package/dist/{auth-choice-D9LWnNpF.js → auth-choice-BTahePAl.js} +1 -1
  16. package/dist/{auth-choice-DbTYwdGn.js → auth-choice-ioJ3htvR.js} +1 -1
  17. package/dist/{auth-choice-prompt-D5YuCYf7.js → auth-choice-prompt-Cigxs_6f.js} +1 -1
  18. package/dist/{auth-choice-prompt-DFyVEU7J.js → auth-choice-prompt-Db0yW_LH.js} +1 -1
  19. package/dist/build-info.json +3 -3
  20. package/dist/bundled/boot-md/handler.js +31 -31
  21. package/dist/bundled/bootstrap-extra-files/handler.js +3 -3
  22. package/dist/bundled/command-logger/handler.js +2 -2
  23. package/dist/bundled/session-memory/handler.js +31 -31
  24. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  25. package/dist/{channel-activity-DY_GHJwO.js → channel-activity-D17GYsMz.js} +1 -1
  26. package/dist/{channel-web-CAJ_OiB2.js → channel-web-CclBHrhb.js} +1 -1
  27. package/dist/{channel-web-X3OJcLB2.js → channel-web-DIRVjokt.js} +1 -1
  28. package/dist/{channels-D9Oj681h.js → channels-A880gMB8.js} +6 -6
  29. package/dist/{channels-BqOjEy1R.js → channels-DWuoO75L.js} +6 -6
  30. package/dist/{channels-cli-DKRuJbjY.js → channels-cli-54FnZFBp.js} +5 -5
  31. package/dist/{channels-cli-D5hZAzoE.js → channels-cli-HVr7lRa7.js} +5 -5
  32. package/dist/{chunk-Cj87uJLo.js → chunk-DfA5CGzI.js} +1 -1
  33. package/dist/cli/daemon-cli.js +1 -1
  34. package/dist/{cli-ClS8EuDK.js → cli-C8OGL6Ju.js} +2 -2
  35. package/dist/{cli-Dm0682Gu.js → cli-cnJ-Fwbu.js} +2 -2
  36. package/dist/{command-registry-C2wqEo64.js → command-registry-BHCwSxmh.js} +9 -9
  37. package/dist/{commands-registry-Du1VUNqv.js → commands-registry-ShBrc7Zz.js} +1 -1
  38. package/dist/{completion-cli-B9mW_que.js → completion-cli-BsgojaxZ.js} +2 -2
  39. package/dist/{completion-cli-DCvm9Xp-.js → completion-cli-DuqDB42S.js} +1 -1
  40. package/dist/{config-cli-680jTQ3-.js → config-cli-B62owpbq.js} +1 -1
  41. package/dist/{config-cli-1SYvQdhO.js → config-cli-nRzwa31Y.js} +1 -1
  42. package/dist/{config-eval-BVvNsPGB.js → config-eval-B5XXAbrm.js} +3 -3
  43. package/dist/{configure-BfhVLgNf.js → configure-ByLqSsRA.js} +12 -12
  44. package/dist/{configure-DQLQp2nb.js → configure-CbMYLFUm.js} +12 -12
  45. package/dist/control-ui/assets/app-DXYMrRJ9.js.map +1 -1
  46. package/dist/{cron-cli-C4hgRvYJ.js → cron-cli-CLNLFdxi.js} +2 -2
  47. package/dist/{cron-cli-DQjdHktC.js → cron-cli-CM9CM1GR.js} +2 -2
  48. package/dist/{daemon-cli-DWhAXx5H.js → daemon-cli-9ids8mMV.js} +1 -1
  49. package/dist/{daemon-cli-B3OUkSy6.js → daemon-cli-w15TQchq.js} +1 -1
  50. package/dist/daemon-cli.js +1 -1
  51. package/dist/{deps-RXAe1X5s.js → deps-BVNeN6gT.js} +1 -1
  52. package/dist/{deps-DdP-Hmxc.js → deps-Uo5boHSY.js} +1 -1
  53. package/dist/{diagnostic-D6XQAXl4.js → diagnostic-B4NKiC20.js} +1 -1
  54. package/dist/entry.js +1 -1
  55. package/dist/extensionAPI.js +1 -1
  56. package/dist/{fetch-BKzFOgku.js → fetch-BH7uURYM.js} +1 -1
  57. package/dist/{fetch-guard-B3bzvmt4.js → fetch-guard-DqpQMLwE.js} +1 -1
  58. package/dist/{filesystem-manager-CrDoOIOx.js → filesystem-manager-DKU5F0fA.js} +4 -4
  59. package/dist/{fs-safe-DcQcXS6I.js → fs-safe-CwUdejUJ.js} +2 -2
  60. package/dist/{gateway-cli-Y450jJFF.js → gateway-cli-C9Os2Z5s.js} +27 -27
  61. package/dist/{gateway-cli-CHukRtBG.js → gateway-cli-CLFeYf4s.js} +27 -27
  62. package/dist/{github-copilot-token-DYrFvncE.js → github-copilot-token-eyrRGmGp.js} +8 -8
  63. package/dist/{health-Db548DTY.js → health-CghndVpq.js} +2 -2
  64. package/dist/{health-C-AsEUPg.js → health-GSYUFoyr.js} +2 -2
  65. package/dist/{heartbeat-runner-CE9O7xVk.js → heartbeat-runner-1b23y_3_.js} +1 -1
  66. package/dist/{heartbeat-runner-DAPP5ojq.js → heartbeat-runner-DPtasJ9O.js} +1 -1
  67. package/dist/{hooks-cli-DpllVSSB.js → hooks-cli-BXZ0yiOV.js} +3 -3
  68. package/dist/{hooks-cli-ApL31lTH.js → hooks-cli-_VHugcqb.js} +3 -3
  69. package/dist/index.js +7 -7
  70. package/dist/{internal-B3yITtDC.js → internal-CU3wrcPl.js} +3 -3
  71. package/dist/{ipv4-Bh1H98-c.js → ipv4-Cb1Ofo1o.js} +2 -2
  72. package/dist/{ipv4-D88X6kcK.js → ipv4-h9TrAq_w.js} +2 -2
  73. package/dist/{lifecycle-D2VlrxY8.js → lifecycle-CBewhyXk.js} +1 -1
  74. package/dist/{lifecycle-C5O_poBp.js → lifecycle-CV1zHjpj.js} +1 -1
  75. package/dist/{list.auth-overview-DQUc2B2l.js → list.auth-overview-C8izvpBJ.js} +1 -1
  76. package/dist/{list.auth-overview-N9tbnvNE.js → list.auth-overview-CvPcpBIP.js} +1 -1
  77. package/dist/llm-slug-generator.js +31 -31
  78. package/dist/{login-BPi6GEMh.js → login-DmSOJJZh.js} +2 -2
  79. package/dist/{login-qr-BaJ9M5z6.js → login-qr-gY230e9k.js} +3 -3
  80. package/dist/{manager-C05ypUW3.js → manager-Cxjfnksb.js} +8 -8
  81. package/dist/{markdown-tables-CBLut_ie.js → markdown-tables-DFtTedxN.js} +1 -1
  82. package/dist/{media-DUBmlR9u.js → media-DZj8v0oe.js} +5 -5
  83. package/dist/{memory-search-tdsFhtIi.js → memory-search-BxRjHrXP.js} +2 -2
  84. package/dist/{model-catalog-BQ5G4eK6.js → model-catalog-Iu_LUOVA.js} +6 -6
  85. package/dist/{models-BObC-MWx.js → models-DqMgO-Ak.js} +4 -4
  86. package/dist/{models-cli-Bcjaf4CI.js → models-cli-C7WASQac.js} +4 -4
  87. package/dist/{models-cli-r2llwGBO.js → models-cli-D6H_Kt3i.js} +5 -5
  88. package/dist/{node-cli-B5TpzQ6U.js → node-cli-B8DI8VK2.js} +2 -2
  89. package/dist/{node-cli-B8V8ar0H.js → node-cli-CGwktXpe.js} +2 -2
  90. package/dist/{onboard-C6Z7OaQ8.js → onboard-BR6vBv2I.js} +6 -6
  91. package/dist/{onboard-D8EOxPOn.js → onboard-C-fjU4uC.js} +6 -6
  92. package/dist/{onboard-channels-C4gBvkYQ.js → onboard-channels-B3tCPpRS.js} +2 -2
  93. package/dist/{onboard-channels-CDr6F5Rc.js → onboard-channels-C1UyGFfb.js} +2 -2
  94. package/dist/{onboard-search-BzpbxIgm.js → onboard-search-CjU6w3Sm.js} +5 -5
  95. package/dist/{onboard-search-BDLus6nY.js → onboard-search-Ds5KeCF_.js} +5 -5
  96. package/dist/{onboarding-CIjqOjDq.js → onboarding-BL3becPO.js} +181 -35
  97. package/dist/{onboarding-DjXH2-ro.js → onboarding-DGAQeYgr.js} +181 -35
  98. package/dist/{openresponses-http-C9x0SEG6.js → openresponses-http-Bcy1YyQY.js} +2 -2
  99. package/dist/{openresponses-http-eMouHu_v.js → openresponses-http-DIR_t4i1.js} +31 -31
  100. package/dist/{openresponses-http-DU9S_V_8.js → openresponses-http-DxsL0uBk.js} +1 -1
  101. package/dist/{openresponses-http-NFMdHWOs.js → openresponses-http-IVnQ_wz0.js} +2 -2
  102. package/dist/{openresponses-http-BA2nkk7t.js → openresponses-http-Qb_KOtcX.js} +1 -1
  103. package/dist/{outbound-BF3W1nJQ.js → outbound-BtgGTj4E.js} +6 -6
  104. package/dist/{outbound-attachment-CZV6JZkx.js → outbound-attachment-NKTzAe-U.js} +2 -2
  105. package/dist/{parent-default-help-zu6kW9Un.js → parent-default-help-BJGqN88G.js} +1 -1
  106. package/dist/{parent-default-help-k4GD2-UF.js → parent-default-help-XXsayZks.js} +1 -1
  107. package/dist/{path-alias-guards--dquYHnR.js → path-alias-guards-BgsM3Cb3.js} +1 -1
  108. package/dist/{paths-BGX-IMoI.js → paths-57KGLbK2.js} +22 -22
  109. package/dist/{pi-embedded-DPElH0OZ.js → pi-embedded-CZAiurHo.js} +5 -5
  110. package/dist/{pi-embedded-Pkm2p81t.js → pi-embedded-qk5CdQmR.js} +239 -239
  111. package/dist/{pi-model-discovery-DYwyxntg.js → pi-model-discovery-CfcnLOyX.js} +7 -7
  112. package/dist/pi-model-discovery-runtime-D85aZCOu.js +5 -0
  113. package/dist/{plugin-registry-DEewJtHt.js → plugin-registry-Bw0a_OGC.js} +1 -1
  114. package/dist/{plugin-registry-DfO1RfZv.js → plugin-registry-Dqk6vxYj.js} +1 -1
  115. package/dist/plugin-sdk/{audio-preflight-a_1hr0Eg.js → audio-preflight-BO8XDtTk.js} +1 -1
  116. package/dist/plugin-sdk/{audio-preflight-L8bE2tgB.js → audio-preflight-DK-6iXZY.js} +1 -1
  117. package/dist/plugin-sdk/channel-plugin-common.js +1 -1
  118. package/dist/plugin-sdk/{channel-web-BNlpZrWA.js → channel-web-DgXfvJo-.js} +1 -1
  119. package/dist/plugin-sdk/command-status.js +1 -1
  120. package/dist/plugin-sdk/index.js +2 -2
  121. package/dist/plugin-sdk/{openresponses-http-DuRGQn_a.js → openresponses-http-DBFqruTK.js} +1 -1
  122. package/dist/plugin-sdk/{openresponses-http-BBdkt744.js → openresponses-http-RBdNxv8F.js} +1 -1
  123. package/dist/plugin-sdk/{pi-model-discovery-runtime-FgSYY3zE.js → pi-model-discovery-runtime-BWcaNxzp.js} +1 -1
  124. package/dist/plugin-sdk/{registry-DyRgZdL8.js → registry-DXXOSq_V.js} +8 -8
  125. package/dist/plugin-sdk/{reply-DclM907b.js → reply-Bb9pzXn4.js} +5 -5
  126. package/dist/plugin-sdk/src/brand.d.ts +2 -2
  127. package/dist/plugin-sdk/{status-EnvYKAtO.js → status-CHo58oXD.js} +5 -5
  128. package/dist/plugin-sdk/{web-C0nKlODk.js → web-B-fwFsth.js} +1 -1
  129. package/dist/plugin-sdk/{web-BrtGwPHN.js → web-BIIifta2.js} +2 -2
  130. package/dist/{plugins-cli-BU7lm9mm.js → plugins-cli-BKlKaixI.js} +5 -5
  131. package/dist/{plugins-cli-Be4GLYdI.js → plugins-cli-dvRFoJCC.js} +5 -5
  132. package/dist/{program-B78oSJVp.js → program-P-9mYfYw.js} +7 -7
  133. package/dist/{program-context-DpABaPXE.js → program-context-DZ2qDI4u.js} +24 -24
  134. package/dist/{prompt-select-styled-DI5ODziX.js → prompt-select-styled-CdVuqLJH.js} +4 -4
  135. package/dist/{prompt-select-styled-DmcQ0_hv.js → prompt-select-styled-DHjjwvXl.js} +4 -4
  136. package/dist/{pw-ai-42y3optV.js → pw-ai-CmgZwdpF.js} +5 -5
  137. package/dist/{qmd-manager-BPz-XVY5.js → qmd-manager-B4jAaAzx.js} +5 -5
  138. package/dist/{qmd-scope-D2okAldm.js → qmd-scope-BdblEj4C.js} +1 -1
  139. package/dist/{query-expansion-f4DE13gJ.js → query-expansion-JhTilyB1.js} +2 -2
  140. package/dist/{register.agent-FC9A__Az.js → register.agent-Be3pMMEj.js} +8 -8
  141. package/dist/{register.agent-DOychJ9q.js → register.agent-rgc26ryI.js} +9 -9
  142. package/dist/{register.configure-ybGicOMR.js → register.configure-BKYZzj-a.js} +12 -12
  143. package/dist/{register.configure-i3gbc5Cc.js → register.configure-DUgwZXRG.js} +12 -12
  144. package/dist/{register.maintenance-CYX_k6x1.js → register.maintenance-CEB2_x4K.js} +8 -8
  145. package/dist/{register.maintenance-MPPzwTam.js → register.maintenance-OE1jM64G.js} +9 -9
  146. package/dist/{register.message-D6NFTigk.js → register.message-CUE4ZFjr.js} +3 -3
  147. package/dist/{register.message-C_Q6o32_.js → register.message-vxrokTGv.js} +3 -3
  148. package/dist/{register.onboard-DqR_m0_p.js → register.onboard-Cyymwvc3.js} +14 -14
  149. package/dist/{register.onboard-PbsAD-eY.js → register.onboard-Dg3786vL.js} +14 -14
  150. package/dist/{register.setup-COidGsw2.js → register.setup-B6uH9Fkv.js} +14 -14
  151. package/dist/{register.setup-DMqotP6N.js → register.setup-BNk3o4bu.js} +14 -14
  152. package/dist/{register.status-health-sessions-CeY5Pzgk.js → register.status-health-sessions-DXgm8jTd.js} +6 -6
  153. package/dist/{register.status-health-sessions-CPBz-3k7.js → register.status-health-sessions-n5YTxXMt.js} +6 -6
  154. package/dist/{register.subclis-Dxe0Sco3.js → register.subclis-h2rwp41b.js} +16 -16
  155. package/dist/{replies-Bn06Bh1x.js → replies-afs2sQ1G.js} +2 -2
  156. package/dist/{reply-701mJB_S.js → reply-C6zXCUnw.js} +6 -6
  157. package/dist/{reply-prefix-DwrVxkMY.js → reply-prefix-CG0zciBg.js} +1 -1
  158. package/dist/{resolve-route-B4dOoe-E.js → resolve-route-DZkIcri6.js} +1 -1
  159. package/dist/{run-main-BvouUOJB.js → run-main-BW1xk67k.js} +14 -14
  160. package/dist/{runtime-helper-grants-CjDNw01t.js → runtime-helper-grants-BotyKHoQ.js} +1 -1
  161. package/dist/{runtime-helper-grants-B5q5llgE.js → runtime-helper-grants-DlthXnch.js} +1 -1
  162. package/dist/{sandbox-cli-MNviI01s.js → sandbox-cli-B74LKmmu.js} +2 -2
  163. package/dist/{sandbox-cli-DKUHq66f.js → sandbox-cli-DVrOgz6X.js} +2 -2
  164. package/dist/{security-cli-C4J7sHdd.js → security-cli-B_v3gSPc.js} +3 -3
  165. package/dist/{security-cli-D2jFeCER.js → security-cli-DUh-3-R1.js} +3 -3
  166. package/dist/{send-vR6HwT94.js → send-CABrQiXU.js} +4 -4
  167. package/dist/{send-BQMxv218.js → send-CUYy-rA3.js} +7 -7
  168. package/dist/{send-kLcLFjb8.js → send-DE1no-h6.js} +5 -5
  169. package/dist/{send-BsajjIj8.js → send-iIy3frXq.js} +5 -5
  170. package/dist/{send-Da1hCe1A.js → send-lQXOUIaW.js} +18 -18
  171. package/dist/{server-CvQUqV31.js → server-BWmtB5RG.js} +2 -2
  172. package/dist/{server-BRsV4GHd.js → server-CVXoSpqC.js} +2 -2
  173. package/dist/{server-cron-BV2pPZ-O.js → server-cron-D0oLzDes.js} +2 -2
  174. package/dist/{server-cron-C-3djfm_.js → server-cron-DBSvrOWz.js} +2 -2
  175. package/dist/{server-node-events-Ce-RXuis.js → server-node-events-BGkUHSkq.js} +3 -3
  176. package/dist/{server-node-events-Bi8FQeYu.js → server-node-events-TmYB-LGW.js} +3 -3
  177. package/dist/{session-ZMAktQw4.js → session-TK9Idt8g.js} +5 -5
  178. package/dist/{skill-commands-BP6zVlmg.js → skill-commands-CCjZMCdx.js} +24 -24
  179. package/dist/{status-DoLjTnlQ.js → status-C1qehkux.js} +1 -1
  180. package/dist/{status-CIb_4gfm.js → status-CGYle9wh.js} +4 -4
  181. package/dist/{status-D9As1GK-.js → status-DVTZ42Xi.js} +1 -1
  182. package/dist/{status-BiHSisy7.js → status-hNS_-DU5.js} +4 -4
  183. package/dist/{tables-DMwrn7NN.js → tables-H4kq3TrS.js} +1 -1
  184. package/dist/{target-errors-CR_hozUt.js → target-errors-9BsSMzQY.js} +2 -2
  185. package/dist/{tool-loop-detection-DZ-oTJiQ.js → tool-loop-detection-D4MYRJWP.js} +2 -2
  186. package/dist/{tui-BpbyDMEE.js → tui-ARPlmctm.js} +1 -1
  187. package/dist/{tui-D9armVLc.js → tui-D6_aw9hu.js} +1 -1
  188. package/dist/{tui-cli-lN5CL6pA.js → tui-cli-CDBUp2y3.js} +3 -3
  189. package/dist/{tui-cli-A_j8l8a3.js → tui-cli-CYkhnUmj.js} +3 -3
  190. package/dist/{update-cli-DRefGXK8.js → update-cli-CVPEyzw1.js} +10 -10
  191. package/dist/{update-cli-B8_evObo.js → update-cli-ChNYv3li.js} +9 -9
  192. package/dist/{update-runner-DnLLf66O.js → update-runner-CMe4a4QF.js} +1 -1
  193. package/dist/{update-runner-Bd7n68kz.js → update-runner-dCQywbJs.js} +1 -1
  194. package/dist/{web-D-SMykKz.js → web-BIREWy8I.js} +35 -35
  195. package/dist/{web-778GrijN.js → web-Bly-ch0b.js} +1 -1
  196. package/dist/{web-CPKh7bSP.js → web-BvK9MRcp.js} +1 -1
  197. package/dist/{web-DEuBtNld.js → web-CCLojlog.js} +3 -3
  198. package/dist/{web-Z5JZl5Nc.js → web-CvJzsQ59.js} +3 -3
  199. package/dist/{web-search-providers.runtime-AAOfSU2b.js → web-search-providers.runtime-BCjJQLBJ.js} +1 -1
  200. package/dist/{web-search-providers.runtime-DcgcyEiV.js → web-search-providers.runtime-DCy32Tl0.js} +1 -1
  201. package/dist/{whatsapp-actions-favixTth.js → whatsapp-actions-C0w9GEJM.js} +12 -12
  202. package/docs/install/index.md +8 -1
  203. package/docs/install/installer.md +9 -6
  204. package/docs/install/vps.md +9 -2
  205. package/docs/start/wizard.md +9 -2
  206. package/extensions/acpx/package.json +1 -1
  207. package/extensions/bluebubbles/package.json +1 -1
  208. package/extensions/copilot-proxy/package.json +1 -1
  209. package/extensions/diagnostics-otel/package.json +1 -1
  210. package/extensions/discord/package.json +1 -1
  211. package/extensions/fased-federation/package.json +1 -1
  212. package/extensions/feishu/package.json +1 -1
  213. package/extensions/google-gemini-cli-auth/package.json +1 -1
  214. package/extensions/googlechat/package.json +1 -1
  215. package/extensions/imessage/package.json +1 -1
  216. package/extensions/irc/package.json +1 -1
  217. package/extensions/line/package.json +1 -1
  218. package/extensions/llm-task/package.json +1 -1
  219. package/extensions/lobster/package.json +1 -1
  220. package/extensions/matrix/CHANGELOG.md +12 -0
  221. package/extensions/matrix/package.json +1 -1
  222. package/extensions/mattermost/package.json +1 -1
  223. package/extensions/memory-core/package.json +1 -1
  224. package/extensions/memory-lancedb/package.json +1 -1
  225. package/extensions/minimax-portal-auth/package.json +1 -1
  226. package/extensions/msteams/CHANGELOG.md +12 -0
  227. package/extensions/msteams/package.json +1 -1
  228. package/extensions/nextcloud-talk/package.json +1 -1
  229. package/extensions/nostr/CHANGELOG.md +12 -0
  230. package/extensions/nostr/package.json +1 -1
  231. package/extensions/open-prose/package.json +1 -1
  232. package/extensions/sat-mining/package.json +1 -1
  233. package/extensions/signal/package.json +1 -1
  234. package/extensions/slack/package.json +1 -1
  235. package/extensions/synology-chat/package.json +1 -1
  236. package/extensions/telegram/package.json +1 -1
  237. package/extensions/tlon/package.json +1 -1
  238. package/extensions/twitch/CHANGELOG.md +12 -0
  239. package/extensions/twitch/package.json +1 -1
  240. package/extensions/voice-call/CHANGELOG.md +12 -0
  241. package/extensions/voice-call/package.json +1 -1
  242. package/extensions/whatsapp/package.json +1 -1
  243. package/extensions/zalo/CHANGELOG.md +12 -0
  244. package/extensions/zalo/package.json +1 -1
  245. package/extensions/zalouser/CHANGELOG.md +12 -0
  246. package/extensions/zalouser/package.json +1 -1
  247. package/package.json +1 -1
  248. package/dist/pi-model-discovery-runtime-BhaI9PU2.js +0 -5
@@ -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-BQ5G4eK6.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-Iu_LUOVA.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,12 +8,12 @@ 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-D88X6kcK.js";
12
- import { i as healthCommand } from "./health-Db548DTY.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-DbTYwdGn.js";
14
- import { a as normalizeLegacyOnboardAuthChoice, i as isDeprecatedAuthChoice, r as resolveOnboardProviderAuthFlags } from "./auth-choice-prompt-D5YuCYf7.js";
11
+ import { d as resolveCustomProviderId, l as parseNonInteractiveCustomApiFlags, o as CustomApiError, s as applyCustomApiConfig } from "./ipv4-h9TrAq_w.js";
12
+ import { i as healthCommand } from "./health-CghndVpq.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-ioJ3htvR.js";
14
+ import { a as normalizeLegacyOnboardAuthChoice, i as isDeprecatedAuthChoice, r as resolveOnboardProviderAuthFlags } from "./auth-choice-prompt-Cigxs_6f.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-DjXH2-ro.js";
16
+ import { a as applyRecommendedInternalHooks, i as isHostedSecurityCapableSession, n as applyHostingSecurity, o as applyOnboardingLocalWorkspaceConfig, r as configureFederationForOnboarding, t as runOnboardingWizard } from "./onboarding-DGAQeYgr.js";
17
17
  import { t as WizardCancelledError } from "./prompts-DdS4bZNt.js";
18
18
  import { t as createClackPrompter } from "./clack-prompter-DhFjwbXA.js";
19
19
  import { n as ensureSystemdUserLingerNonInteractive } from "./systemd-linger-BlmGMvvA.js";
@@ -1,7 +1,7 @@
1
1
  import { u as resolveGatewayPort } from "./paths-C9FmTW1x.js";
2
2
  import { S as resolveUserPath } from "./agent-paths-DmOVZE7g.js";
3
3
  import { Ga as ensureAuthProfileStore, Hi as resolveEnvApiKey, Jn as parseDurationMs, Mn as writeConfigFile, Ta as resolveDefaultSecretProviderAlias, Ua as upsertAuthProfile, ao as loadPluginManifestRegistry, bo as normalizeSecretInput, dd as formatCliCommand, di as normalizeProviderId, kn as readConfigFileSnapshot, oa as resolveAuthProfileOrder, oo as assertSupportedRuntime, pa as resolveApiKeyForProfile, yo as normalizeOptionalSecretInput } from "./agent-scope-DHrLr5OF.js";
4
- import { Lt as DEFAULT_WORKSPACE, Mt as resolvePluginProviders, Qt as resolveControlUiLinks, Rt as applyWizardMetadata, Vt as ensureWorkspaceAndSessions, Wt as handleOnboardingRepair, Zt as randomToken, nn as waitForGatewayReachable } from "./reply-701mJB_S.js";
4
+ import { Lt as DEFAULT_WORKSPACE, Mt as resolvePluginProviders, Qt as resolveControlUiLinks, Rt as applyWizardMetadata, Vt as ensureWorkspaceAndSessions, Wt as handleOnboardingRepair, Zt as randomToken, nn as waitForGatewayReachable } from "./reply-C6zXCUnw.js";
5
5
  import { d as defaultRuntime, f as restoreTerminalState } from "./errors-Dx3S3Nrp.js";
6
6
  import { a as readWalletProviderRegistry, f as setWalletProvidersEnabled, t as WALLET_PROVIDER_IDS } from "./wallet-provider-registry-ax0NJo0F.js";
7
7
  import { or as clearDeviceAuthStore } from "./call-DDALpDwS.js";
@@ -9,12 +9,12 @@ import { r as isGatewayDaemonRuntime, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from
9
9
  import { a as resolveHostedOnboardingGatewayStartupMode, n as gatewayInstallErrorHint, t as buildGatewayInstallPlan } from "./daemon-install-helpers-xM3QqMXu.js";
10
10
  import { r as isSystemdUserServiceAvailable } from "./systemd-CmxDYXvt.js";
11
11
  import { t as resolveGatewayService } from "./service-Bsg622jp.js";
12
- import { d as resolveCustomProviderId, l as parseNonInteractiveCustomApiFlags, o as CustomApiError, s as applyCustomApiConfig } from "./ipv4-Bh1H98-c.js";
13
- import { i as healthCommand } from "./health-C-AsEUPg.js";
14
- 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-D9LWnNpF.js";
15
- import { a as normalizeLegacyOnboardAuthChoice, i as isDeprecatedAuthChoice, r as resolveOnboardProviderAuthFlags } from "./auth-choice-prompt-DFyVEU7J.js";
12
+ import { d as resolveCustomProviderId, l as parseNonInteractiveCustomApiFlags, o as CustomApiError, s as applyCustomApiConfig } from "./ipv4-Cb1Ofo1o.js";
13
+ import { i as healthCommand } from "./health-GSYUFoyr.js";
14
+ 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-BTahePAl.js";
15
+ import { a as normalizeLegacyOnboardAuthChoice, i as isDeprecatedAuthChoice, r as resolveOnboardProviderAuthFlags } from "./auth-choice-prompt-Db0yW_LH.js";
16
16
  import { n as logConfigUpdated } from "./logging-Dv2wthF_.js";
17
- import { a as applyRecommendedInternalHooks, i as isHostedSecurityCapableSession, n as applyHostingSecurity, o as applyOnboardingLocalWorkspaceConfig, r as configureFederationForOnboarding, t as runOnboardingWizard } from "./onboarding-CIjqOjDq.js";
17
+ import { a as applyRecommendedInternalHooks, i as isHostedSecurityCapableSession, n as applyHostingSecurity, o as applyOnboardingLocalWorkspaceConfig, r as configureFederationForOnboarding, t as runOnboardingWizard } from "./onboarding-BL3becPO.js";
18
18
  import { t as WizardCancelledError } from "./prompts-CbbpEiEO.js";
19
19
  import { t as createClackPrompter } from "./clack-prompter-Q_PN4iLX.js";
20
20
  import { n as ensureSystemdUserLingerNonInteractive } from "./systemd-linger-BTw_D-6k.js";
@@ -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-701mJB_S.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-C6zXCUnw.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-D2VlrxY8.js";
15
+ import { o as finalizeInstalledPluginConfig } from "./lifecycle-CBewhyXk.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-BQ5G4eK6.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-Iu_LUOVA.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-C5O_poBp.js";
15
+ import { o as finalizeInstalledPluginConfig } from "./lifecycle-CV1zHjpj.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 "./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-701mJB_S.js";
5
+ import "./reply-C6zXCUnw.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-RXAe1X5s.js";
40
+ import "./deps-BVNeN6gT.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-D9As1GK-.js";
81
+ import "./status-DVTZ42Xi.js";
82
82
  import "./update-Dew6hqdf.js";
83
- import { o as finalizeInstalledPluginConfig } from "./lifecycle-D2VlrxY8.js";
84
- import { t as resolvePluginWebSearchProviders } from "./web-search-providers.runtime-DcgcyEiV.js";
83
+ import { o as finalizeInstalledPluginConfig } from "./lifecycle-CBewhyXk.js";
84
+ import { t as resolvePluginWebSearchProviders } from "./web-search-providers.runtime-DCy32Tl0.js";
85
85
  import fs from "node:fs";
86
86
  import path from "node:path";
87
87
 
@@ -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-BQ5G4eK6.js";
5
+ import "./model-catalog-Iu_LUOVA.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-DdP-Hmxc.js";
47
+ import "./deps-Uo5boHSY.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-DoLjTnlQ.js";
78
+ import "./status-C1qehkux.js";
79
79
  import "./update-D4rhRm3D.js";
80
- import { o as finalizeInstalledPluginConfig } from "./lifecycle-C5O_poBp.js";
81
- import { t as resolvePluginWebSearchProviders } from "./web-search-providers.runtime-AAOfSU2b.js";
80
+ import { o as finalizeInstalledPluginConfig } from "./lifecycle-CV1zHjpj.js";
81
+ import { t as resolvePluginWebSearchProviders } from "./web-search-providers.runtime-BCjJQLBJ.js";
82
82
  import path from "node:path";
83
83
  import fs from "node:fs";
84
84
 
@@ -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-701mJB_S.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-C6zXCUnw.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-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";
@@ -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-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";
20
+ import { a as promptRemoteGatewayConfig, n as getTailscaleMissingBinNoteLines, r as setupSkills, t as validateIPv4AddressInput, u as promptCustomApiConfig } from "./ipv4-Cb1Ofo1o.js";
21
+ import { o as waitForHostedDashboardBrowserPath } from "./health-GSYUFoyr.js";
22
+ import { n as warnIfModelConfigLooksOff, r as applyAuthChoice } from "./auth-choice-BTahePAl.js";
23
+ import { t as promptAuthChoiceGrouped } from "./auth-choice-prompt-Db0yW_LH.js";
24
24
  import { n as logConfigUpdated } from "./logging-Dv2wthF_.js";
25
- import { n as setupChannels } from "./onboard-channels-C4gBvkYQ.js";
25
+ import { n as setupChannels } from "./onboard-channels-B3tCPpRS.js";
26
26
  import { t as buildWorkspaceHookStatus } from "./hooks-status-BielXMUB.js";
27
- import { t as runTui } from "./tui-D9armVLc.js";
27
+ import { t as runTui } from "./tui-D6_aw9hu.js";
28
28
  import fs from "node:fs";
29
29
  import os from "node:os";
30
30
  import path from "node:path";
@@ -32,6 +32,7 @@ import fs$1 from "node:fs/promises";
32
32
  import { spawn, spawnSync } from "node:child_process";
33
33
  import { Writable } from "node:stream";
34
34
  import net from "node:net";
35
+ import { Buffer as Buffer$1 } from "node:buffer";
35
36
 
36
37
  //#region src/commands/onboard-config.ts
37
38
  const ONBOARDING_DEFAULT_DM_SCOPE = "per-channel-peer";
@@ -3001,9 +3002,10 @@ function formatLocalDeviceTailnetRequirementNote() {
3001
3002
  ""
3002
3003
  ].join("\n");
3003
3004
  }
3004
- function formatTailnetSshVerificationNote(target) {
3005
+ function formatTailnetSshVerificationNote(target, method = "ssh-key") {
3005
3006
  const pingTargets = [target.host, target.ipv4 && target.ipv4 !== target.host ? target.ipv4 : void 0].filter((value) => Boolean(value));
3006
3007
  const sshTargets = pingTargets;
3008
+ const sshCommands = method === "tailscale-ssh" ? sshTargets.map((host) => `tailscale ssh ${target.user}@${host}`) : sshTargets.map((host) => `ssh ${target.user}@${host}`);
3007
3009
  return [
3008
3010
  noteStep(1, "Check visibility"),
3009
3011
  "Run on your own computer:",
@@ -3016,32 +3018,150 @@ function formatTailnetSshVerificationNote(target) {
3016
3018
  "",
3017
3019
  noteStep(2, "SSH into VPS"),
3018
3020
  "Run one command:",
3019
- ...noteCommands(sshTargets.map((host) => `ssh ${target.user}@${host}`)),
3021
+ ...method === "tailscale-ssh" ? ["No app SSH key was found on this VPS.", "Use Tailscale SSH from your own Tailscale-connected computer:"] : [],
3022
+ ...noteCommands(sshCommands),
3020
3023
  `Continue only after SSH opens in ${target.repoDir}.`,
3021
3024
  "",
3022
3025
  noteHeading("Fallback"),
3023
- noteWarn("If hostname lookup fails, keep the other VPN off and use the `100.x.x.x` command.")
3026
+ noteWarn(method === "tailscale-ssh" ? "If Tailscale SSH is unavailable in your tailnet, choose the SSH public key fallback." : "If hostname lookup fails, keep the other VPN off and use the `100.x.x.x` command.")
3024
3027
  ].join("\n");
3025
3028
  }
3029
+ function formatTailnetSshPublicKeyNote(target) {
3030
+ return [
3031
+ noteStep(1, "Find your public key"),
3032
+ "Use this fallback only when Tailscale SSH is unavailable in your tailnet.",
3033
+ "Do this on your own computer while this VPS installer stays open.",
3034
+ ...noteCommands(["cat ~/.ssh/id_ed25519.pub", "type $env:USERPROFILE\\.ssh\\id_ed25519.pub"]),
3035
+ noteWarn("Paste a `.pub` key only. Never paste a private key."),
3036
+ "",
3037
+ noteStep(2, "Create one if needed"),
3038
+ "Run this on your own computer, then paste the `.pub` line here:",
3039
+ ...noteCommands(["ssh-keygen -t ed25519 -C \"fased-vps\" -f ~/.ssh/id_ed25519"]),
3040
+ "",
3041
+ noteStep(3, "What Fased will do"),
3042
+ `Install that public key for ${target.user} at /home/${target.user}/.ssh/authorized_keys.`,
3043
+ "Then you will test regular SSH over Tailscale before root/password access is locked down."
3044
+ ].join("\n");
3045
+ }
3046
+ function normalizeSshPublicKeys(input) {
3047
+ const acceptedTypes = new Set([
3048
+ "ecdsa-sha2-nistp256",
3049
+ "ecdsa-sha2-nistp384",
3050
+ "ecdsa-sha2-nistp521",
3051
+ "sk-ecdsa-sha2-nistp256@openssh.com",
3052
+ "sk-ssh-ed25519@openssh.com",
3053
+ "ssh-ed25519",
3054
+ "ssh-rsa"
3055
+ ]);
3056
+ const lines = input.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
3057
+ if (lines.length === 0) return {
3058
+ ok: false,
3059
+ keys: [],
3060
+ detail: "Paste one SSH public key line."
3061
+ };
3062
+ if (lines.some((line) => /^-{5}BEGIN\b/i.test(line) || /PRIVATE KEY/i.test(line))) return {
3063
+ ok: false,
3064
+ keys: [],
3065
+ detail: "That looks like a private key. Paste the `.pub` key only."
3066
+ };
3067
+ const normalized = [];
3068
+ for (const line of lines) {
3069
+ const parts = line.split(/\s+/);
3070
+ const keyType = parts[0] ?? "";
3071
+ const keyBody = parts[1] ?? "";
3072
+ if (!acceptedTypes.has(keyType) || !/^[A-Za-z0-9+/]+={0,3}$/.test(keyBody)) return {
3073
+ ok: false,
3074
+ keys: [],
3075
+ detail: "Paste a valid OpenSSH public key, for example `ssh-ed25519 AAAA... user@computer`."
3076
+ };
3077
+ normalized.push(parts.join(" "));
3078
+ }
3079
+ return {
3080
+ ok: true,
3081
+ keys: Array.from(new Set(normalized))
3082
+ };
3083
+ }
3084
+ function buildInstallTailnetSshAuthorizedKeysCommand(target, keys) {
3085
+ const sshDir = `/home/${target.user}/.ssh`;
3086
+ const authorizedKeys = `${sshDir}/authorized_keys`;
3087
+ const encodedKeys = Buffer$1.from(`${keys.join("\n")}\n`, "utf8").toString("base64");
3088
+ return [
3089
+ "set -e",
3090
+ "umask 077",
3091
+ `mkdir -p ${shellQuote(sshDir)}`,
3092
+ "tmp_keys=\"$(mktemp)\"",
3093
+ "tmp_merged=\"$(mktemp)\"",
3094
+ `printf '%s' ${shellQuote(encodedKeys)} | base64 -d > "$tmp_keys"`,
3095
+ `{ cat ${shellQuote(authorizedKeys)} 2>/dev/null || true; cat "$tmp_keys"; } | awk 'NF { print }' | sort -u > "$tmp_merged"`,
3096
+ `install -m 600 "$tmp_merged" ${shellQuote(authorizedKeys)}`,
3097
+ `chmod 700 ${shellQuote(sshDir)}`,
3098
+ `chmod 600 ${shellQuote(authorizedKeys)}`,
3099
+ "rm -f \"$tmp_keys\" \"$tmp_merged\""
3100
+ ].join("\n");
3101
+ }
3102
+ async function ensureTailnetSshAuthorizedKeys(params) {
3103
+ const { target, logPath, runtime, prompter, runner } = params;
3104
+ const authorizedKeys = `/home/${target.user}/.ssh/authorized_keys`;
3105
+ if (runner(`test -s ${shellQuote(authorizedKeys)}`, logPath).ok) return true;
3106
+ await prompter.note(formatTailnetSshPublicKeyNote(target), "SSH key fallback");
3107
+ const parsed = normalizeSshPublicKeys(await prompter.text({
3108
+ message: `Paste the SSH public key to install for ${target.user}`,
3109
+ placeholder: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... user@computer",
3110
+ validate: (value) => {
3111
+ const parsed = normalizeSshPublicKeys(value);
3112
+ return parsed.ok ? void 0 : parsed.detail;
3113
+ }
3114
+ }));
3115
+ if (!parsed.ok) {
3116
+ runtime.error("Hosting setup stopped before SSH/firewall lock-down.");
3117
+ runtime.error(parsed.detail);
3118
+ runtime.error(`Host hardening log: ${logPath}`);
3119
+ runtime.exit(1);
3120
+ return false;
3121
+ }
3122
+ const installResult = runner(buildInstallTailnetSshAuthorizedKeysCommand(target, parsed.keys), logPath);
3123
+ if (!installResult.ok) {
3124
+ runtime.error("Hosting setup stopped before SSH/firewall lock-down.");
3125
+ runtime.error(`Could not install SSH public key for ${target.user}: ${authorizedKeys}`);
3126
+ runtime.error(installResult.detail ?? "unknown SSH key install error");
3127
+ runtime.error(`Host hardening log: ${logPath}`);
3128
+ runtime.exit(1);
3129
+ return false;
3130
+ }
3131
+ if (!runner(`test -s ${shellQuote(authorizedKeys)}`, logPath).ok) {
3132
+ runtime.error("Hosting setup stopped before SSH/firewall lock-down.");
3133
+ runtime.error(`SSH public key was not written for ${target.user}: ${authorizedKeys}`);
3134
+ runtime.error(`Host hardening log: ${logPath}`);
3135
+ runtime.exit(1);
3136
+ return false;
3137
+ }
3138
+ appendHostSecurityLog(logPath, "tailnet ssh public key installed", `installed ${parsed.keys.length} public key(s) for ${target.user}: ${authorizedKeys}`);
3139
+ return true;
3140
+ }
3026
3141
  function verifyTailnetSshServerPrerequisites(params) {
3027
3142
  const runner = params.runner ?? run;
3028
3143
  const target = params.target;
3029
3144
  const checks = [];
3030
3145
  const failures = [];
3146
+ let method = "tailscale-ssh";
3031
3147
  if (runner(`test -d ${shellQuote(target.repoDir)}`, params.logPath).ok) checks.push(`repo directory ready: ${target.repoDir}`);
3032
3148
  else failures.push(`missing app repo directory: ${target.repoDir}`);
3033
3149
  const authorizedKeys = `/home/${target.user}/.ssh/authorized_keys`;
3034
- if (runner(`test -s ${shellQuote(authorizedKeys)}`, params.logPath).ok) checks.push(`SSH keys ready: ${authorizedKeys}`);
3035
- else failures.push(`missing SSH public keys for ${target.user}: ${authorizedKeys}. The root bootstrap should copy your current authorized_keys; if you used password-only SSH, add a public key before hosting lock-down.`);
3036
- if (runner("systemctl is-active --quiet ssh || systemctl is-active --quiet sshd || sudo -n systemctl is-active --quiet ssh || sudo -n systemctl is-active --quiet sshd", params.logPath).ok) checks.push("OS SSH service active");
3037
- else failures.push("OS SSH service is not active");
3150
+ if (runner(`test -s ${shellQuote(authorizedKeys)}`, params.logPath).ok) {
3151
+ method = "ssh-key";
3152
+ checks.push(`SSH keys ready: ${authorizedKeys}`);
3153
+ if (runner("systemctl is-active --quiet ssh || systemctl is-active --quiet sshd || sudo -n systemctl is-active --quiet ssh || sudo -n systemctl is-active --quiet sshd", params.logPath).ok) checks.push("OS SSH service active");
3154
+ else failures.push("OS SSH service is not active");
3155
+ } else checks.push(`no app SSH keys at ${authorizedKeys}; using Tailscale SSH`);
3038
3156
  if (failures.length > 0) return {
3039
3157
  ok: false,
3040
- detail: failures.join("\n")
3158
+ detail: failures.join("\n"),
3159
+ method
3041
3160
  };
3042
3161
  return {
3043
3162
  ok: true,
3044
- detail: checks.join("\n")
3163
+ detail: checks.join("\n"),
3164
+ method
3045
3165
  };
3046
3166
  }
3047
3167
  function ensureTailnetSshIngressForVerification(params) {
@@ -3075,8 +3195,9 @@ function hasExplicitTailnetSshConfirmation(env = process.env) {
3075
3195
  }
3076
3196
  function failTailnetSshConfirmation(params) {
3077
3197
  const { runtime, logPath, target } = params;
3198
+ const commandPrefix = params.method === "tailscale-ssh" ? "tailscale ssh" : "ssh";
3078
3199
  runtime.error("Hosting setup stopped before SSH/firewall lock-down.");
3079
- runtime.error(`Confirm SSH over Tailscale first: ssh ${target.user}@${target.host}`);
3200
+ runtime.error(`Confirm SSH over Tailscale first: ${commandPrefix} ${target.user}@${target.host}`);
3080
3201
  runtime.error(`Expected app repo directory after login: ${target.repoDir}`);
3081
3202
  runtime.error(`Host hardening log: ${logPath}`);
3082
3203
  runtime.exit(1);
@@ -3095,10 +3216,16 @@ async function confirmTailnetSshBeforeLockdown(params) {
3095
3216
  return true;
3096
3217
  }
3097
3218
  if (!prompter || opts.nonInteractive === true) {
3219
+ const serverPrereqs = verifyTailnetSshServerPrerequisites({
3220
+ target,
3221
+ logPath,
3222
+ runner
3223
+ });
3098
3224
  failTailnetSshConfirmation({
3099
3225
  runtime,
3100
3226
  logPath,
3101
- target
3227
+ target,
3228
+ method: serverPrereqs.method
3102
3229
  });
3103
3230
  return false;
3104
3231
  }
@@ -3116,20 +3243,22 @@ async function confirmTailnetSshBeforeLockdown(params) {
3116
3243
  return false;
3117
3244
  }
3118
3245
  appendHostSecurityLog(logPath, "tailnet ssh server prerequisites", serverPrereqs.detail);
3119
- const ingress = ensureTailnetSshIngressForVerification({
3120
- logPath,
3121
- runner
3122
- });
3123
- if (!ingress.ok) {
3124
- runtime.error("Hosting setup stopped before SSH/firewall lock-down.");
3125
- runtime.error("Could not prepare the tailnet-only SSH firewall rule required for verification.");
3126
- runtime.error(ingress.detail ?? "unknown firewall error");
3127
- runtime.error(`Host hardening log: ${logPath}`);
3128
- runtime.exit(1);
3129
- return false;
3130
- }
3131
- appendHostSecurityLog(logPath, "tailnet ssh ingress prepared for verification", ingress.detail);
3132
- await prompter.note(formatTailnetSshVerificationNote(target), "Verify SSH over Tailscale");
3246
+ if (serverPrereqs.method === "ssh-key") {
3247
+ const ingress = ensureTailnetSshIngressForVerification({
3248
+ logPath,
3249
+ runner
3250
+ });
3251
+ if (!ingress.ok) {
3252
+ runtime.error("Hosting setup stopped before SSH/firewall lock-down.");
3253
+ runtime.error("Could not prepare the tailnet-only SSH firewall rule required for verification.");
3254
+ runtime.error(ingress.detail ?? "unknown firewall error");
3255
+ runtime.error(`Host hardening log: ${logPath}`);
3256
+ runtime.exit(1);
3257
+ return false;
3258
+ }
3259
+ appendHostSecurityLog(logPath, "tailnet ssh ingress prepared for verification", ingress.detail);
3260
+ } else appendHostSecurityLog(logPath, "tailnet ssh verification mode", "using Tailscale SSH because app authorized_keys is empty");
3261
+ await prompter.note(formatTailnetSshVerificationNote(target, serverPrereqs.method), "Verify SSH over Tailscale");
3133
3262
  if (!await prompter.confirm({
3134
3263
  message: "Did tailscale ping find this VPS from your own computer?",
3135
3264
  initialValue: false
@@ -3141,7 +3270,8 @@ async function confirmTailnetSshBeforeLockdown(params) {
3141
3270
  failTailnetSshConfirmation({
3142
3271
  runtime,
3143
3272
  logPath,
3144
- target
3273
+ target,
3274
+ method: serverPrereqs.method
3145
3275
  });
3146
3276
  return false;
3147
3277
  }
@@ -3164,13 +3294,29 @@ async function confirmTailnetSshBeforeLockdown(params) {
3164
3294
  continue;
3165
3295
  }
3166
3296
  if (!await prompter.confirm({
3167
- message: `Did SSH over Tailscale connect as ${target.user} and open ${target.repoDir}?`,
3297
+ message: serverPrereqs.method === "tailscale-ssh" ? `Did Tailscale SSH connect as ${target.user} and open ${target.repoDir}?` : `Did SSH over Tailscale connect as ${target.user} and open ${target.repoDir}?`,
3168
3298
  initialValue: false
3169
3299
  })) {
3300
+ if (serverPrereqs.method === "tailscale-ssh") {
3301
+ if (await prompter.confirm({
3302
+ message: "Use SSH public key fallback instead?",
3303
+ initialValue: false
3304
+ })) {
3305
+ if (!await ensureTailnetSshAuthorizedKeys({
3306
+ target,
3307
+ logPath,
3308
+ runtime,
3309
+ prompter,
3310
+ runner
3311
+ })) return false;
3312
+ continue;
3313
+ }
3314
+ }
3170
3315
  failTailnetSshConfirmation({
3171
3316
  runtime,
3172
3317
  logPath,
3173
- target
3318
+ target,
3319
+ method: serverPrereqs.method
3174
3320
  });
3175
3321
  return false;
3176
3322
  }