@seanhogg/builderforce-agents 2026.9.5 → 2026.9.6

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 (205) hide show
  1. package/dist/{agent-CBRDuLO-.js → agent-59_cdTZl.js} +1 -1
  2. package/dist/{agent-CCY1r5YW.js → agent-CvMM49lm.js} +1 -1
  3. package/dist/{agents-DW3hte-y.js → agents-2d7A-Uwz.js} +1 -1
  4. package/dist/{agents-Ce4bN10e.js → agents-BdOgv61S.js} +1 -1
  5. package/dist/{audio-preflight-BvzGdNYy.js → audio-preflight-CmX2XJ3N.js} +1 -1
  6. package/dist/{audio-preflight-BYMboYmW.js → audio-preflight-Dnw3oDJr.js} +1 -1
  7. package/dist/{audio-preflight-CEOxJosQ.js → audio-preflight-HcRdB0oH.js} +1 -1
  8. package/dist/{audio-preflight-CswNxppe.js → audio-preflight-Sh649dxR.js} +1 -1
  9. package/dist/{auth-choice-DSLN0TLU.js → auth-choice-D06_TWBf.js} +1 -1
  10. package/dist/{auth-choice-BTrUlYmE.js → auth-choice-DyxxR025.js} +1 -1
  11. package/dist/{auth-choice.apply-BZ7E08Yb.js → auth-choice.apply-CUuLdlQd.js} +1 -1
  12. package/dist/{auth-choice.apply-D3EY1pZ3.js → auth-choice.apply-CfFhu_Vk.js} +1 -1
  13. package/dist/{auth-choice.apply-5dpCNO0l.js → auth-choice.apply-D57XA_d9.js} +1 -1
  14. package/dist/{auth-choice.apply-3tPFL-eH.js → auth-choice.apply-s_rOXFVz.js} +1 -1
  15. package/dist/{auth-choice.apply.transformers-B_Q6e8Yk.js → auth-choice.apply.transformers-CqQSUnsx.js} +1 -1
  16. package/dist/{auth-choice.apply.transformers-D1EzC906.js → auth-choice.apply.transformers-DXBWOilg.js} +1 -1
  17. package/dist/{auth-choice.apply.transformers-BJbpyCWs.js → auth-choice.apply.transformers-DizfkAmz.js} +1 -1
  18. package/dist/{auth-choice.apply.transformers-vLzCo5ew.js → auth-choice.apply.transformers-vyvtAxcX.js} +1 -1
  19. package/dist/{banner-DVNoUX5I.js → banner-BXpp_pEd.js} +1 -1
  20. package/dist/build-info.json +3 -3
  21. package/dist/{builderforce-Bs_G8kBN.js → builderforce-BdJAOfvE.js} +2 -2
  22. package/dist/{builderforce-BN_So1di.js → builderforce-BrFUSx35.js} +2 -2
  23. package/dist/{builderforce-directory-sync-BCZK4FYJ.js → builderforce-directory-sync-CFiQew6N.js} +1 -1
  24. package/dist/{builderforce-directory-sync-DHfiUf2g.js → builderforce-directory-sync-DIQQT09l.js} +1 -1
  25. package/dist/{builderforce-onboarding-Bbjz8F-r.js → builderforce-onboarding-CoGJY95Q.js} +1 -1
  26. package/dist/{builderforce-onboarding-8lL2bgtL.js → builderforce-onboarding-DyYM_cib.js} +1 -1
  27. package/dist/{builderforcellm-syscheck-CyZiwcdF.js → builderforcellm-syscheck-CfFrfeV2.js} +1 -1
  28. package/dist/{builderforcellm-syscheck-DMjMJNFI.js → builderforcellm-syscheck-DGZKIwPC.js} +1 -1
  29. package/dist/bundled/boot-md/handler.js +1 -1
  30. package/dist/bundled/session-memory/handler.js +1 -1
  31. package/dist/{channel-options-Zk5QnNPR.js → channel-options--DZ4jYy9.js} +1 -1
  32. package/dist/{channel-options-Cbz6vcgo.js → channel-options-xVK4amr4.js} +1 -1
  33. package/dist/{channel-web-1xD-Ad2T.js → channel-web-9vO41fn2.js} +1 -1
  34. package/dist/{channels-cli-CiVlP8_q.js → channels-cli-Ch1sZ58k.js} +1 -1
  35. package/dist/{channels-cli-BOcpgY_W.js → channels-cli-YMSOJUmp.js} +1 -1
  36. package/dist/chrome-Bi-3xZj-.js +4 -0
  37. package/dist/chrome-C6oWWmHX.js +4 -0
  38. package/dist/{cli-6znoaKr2.js → cli-gsxv7DrZ.js} +1 -1
  39. package/dist/{cli-BPwpRE1j.js → cli-zC5qoRAp.js} +1 -1
  40. package/dist/{command-registry-BTxAGdlS.js → command-registry-BXLjR3kb.js} +1 -1
  41. package/dist/{command-registry-BZINHmI9.js → command-registry-I83E6HLw.js} +1 -1
  42. package/dist/{completion-cli-BwCfUaHz.js → completion-cli-BQCxFDqY.js} +1 -1
  43. package/dist/{completion-cli-vR4Sx9zB.js → completion-cli-CDy8f_Fg.js} +1 -1
  44. package/dist/{completion-cli-C8kMJ401.js → completion-cli-DbIxXK1B.js} +1 -1
  45. package/dist/{completion-cli-D8WkqtSU.js → completion-cli-ydxyAE7J.js} +1 -1
  46. package/dist/{config-cli-BYFA4Nin.js → config-cli-5ZSrACPR.js} +1 -1
  47. package/dist/{config-cli-DVpEv0oj.js → config-cli-BvJso6op.js} +1 -1
  48. package/dist/{configure-COeSbyyP.js → configure-1e4C38zp.js} +1 -1
  49. package/dist/{configure-CW2bJ91q.js → configure-B_oI_bg-.js} +1 -1
  50. package/dist/{configure-B_juJzVi.js → configure-Dp71zeJI.js} +1 -1
  51. package/dist/{configure-CgkUUUpM.js → configure-NxmuXXEd.js} +1 -1
  52. package/dist/{deliver-qM1Zkf4i.js → deliver-C6HTqnzY.js} +1 -1
  53. package/dist/{deliver-BNMupwo6.js → deliver-CdwCHH01.js} +1 -1
  54. package/dist/{deliver-Bs-FVPQ4.js → deliver-DFhj1d_t.js} +1 -1
  55. package/dist/{deliver-C5lVQcrs.js → deliver-XGIFv80r.js} +1 -1
  56. package/dist/{deps-DWFMK9Xg.js → deps-C4YVdrEi.js} +1 -1
  57. package/dist/{doctor-completion-s5vcMc-C.js → doctor-completion-DhIR9uqB.js} +1 -1
  58. package/dist/{doctor-completion-BdMxCat-.js → doctor-completion-Dpy-8HV9.js} +1 -1
  59. package/dist/{embedded-CRoX1qTh.js → embedded-Cw4g0mzl.js} +7 -7
  60. package/dist/{embedded-DpSS2q2a.js → embedded-DG3sEMyg.js} +7 -7
  61. package/dist/{embedded-helpers-BrfnCpCe.js → embedded-helpers-3FEGD_4b.js} +1 -1
  62. package/dist/{embedded-helpers-Q5h1lA6D.js → embedded-helpers-DGDYymYx.js} +1 -1
  63. package/dist/entry.js +1 -1
  64. package/dist/extensionAPI.js +1 -1
  65. package/dist/{gateway-cli-oSSOT67p.js → gateway-cli-BBu6KI7r.js} +4 -4
  66. package/dist/{gateway-cli-DzxNTkvL.js → gateway-cli-CSmbpS6n.js} +4 -4
  67. package/dist/{health-_L8Avf4v.js → health-AOM42u9C.js} +1 -1
  68. package/dist/{health-hXlukqbf.js → health-CRIXA8je.js} +1 -1
  69. package/dist/{health-B_qWRpsT.js → health-Cuh0tZl2.js} +1 -1
  70. package/dist/{hooks-cli-C-vbyL2y.js → hooks-cli-BeqvyPiX.js} +1 -1
  71. package/dist/{hooks-cli-7gBXRQ81.js → hooks-cli-CYI9ZvNI.js} +1 -1
  72. package/dist/index.js +2 -2
  73. package/dist/{ink-session-DpO3VOYc.js → ink-session-MNcfJzij.js} +1 -1
  74. package/dist/{ink-session-CZj35xTR.js → ink-session-VqYNJYzq.js} +1 -1
  75. package/dist/llm-slug-generator.js +1 -1
  76. package/dist/{mamba-state-engine-CFwb8DcP.js → mamba-state-engine-BYmUnYwn.js} +1 -1
  77. package/dist/{mamba-state-engine-Ck2JCfL6.js → mamba-state-engine-BloJzrxU.js} +1 -1
  78. package/dist/{models-PPv9KRbb.js → models-B6kkCBLd.js} +1 -1
  79. package/dist/{models-cli-btaamH96.js → models-cli-C7u8eLls.js} +1 -1
  80. package/dist/{models-cli-BUDSwmIY.js → models-cli-DpbpZwjy.js} +1 -1
  81. package/dist/{models-DMrs_Zsc.js → models-hEa3avo7.js} +1 -1
  82. package/dist/{onboard-4JByma4r.js → onboard-BHlI_UVY.js} +2 -2
  83. package/dist/{onboard-Dq_XQQXY.js → onboard-BW5J0Ym8.js} +2 -2
  84. package/dist/{onboard-channels-Dzyeem1L.js → onboard-channels-BkrhZ79I.js} +1 -1
  85. package/dist/{onboard-channels-D4g6xuSC.js → onboard-channels-DXIqdoto.js} +1 -1
  86. package/dist/{onboard-channels-Dir2EguP.js → onboard-channels-V51s9X-h.js} +1 -1
  87. package/dist/{onboard-channels-UZOCuxN7.js → onboard-channels-fyGQ1v4S.js} +1 -1
  88. package/dist/{onboard-interactive-DvNhkCNr.js → onboard-interactive-ClPMlCIl.js} +1 -1
  89. package/dist/{onboard-interactive-DyyEDd9a.js → onboard-interactive-D6IBBU8m.js} +1 -1
  90. package/dist/{onboard-interactive-CwNfYxGe.js → onboard-interactive-DEeqmoeW.js} +1 -1
  91. package/dist/{onboard-interactive-Co2bcd7g.js → onboard-interactive-DSZak3YX.js} +1 -1
  92. package/dist/{onboarding-DBL-H1Qu.js → onboarding-CYOfGpd5.js} +3 -3
  93. package/dist/{onboarding-CIxLpuFP.js → onboarding-DIxm_q7P.js} +3 -3
  94. package/dist/{onboarding.finalize-CGGbkAOL.js → onboarding.finalize-Co5L0rNp.js} +1 -1
  95. package/dist/{onboarding.finalize-R3TfibWY.js → onboarding.finalize-DAwpQa7n.js} +1 -1
  96. package/dist/{outbound-send-deps-CsJgGsii.js → outbound-send-deps-Cys_MtmC.js} +1 -1
  97. package/dist/{plugin-registry-Ty9w94Rd.js → plugin-registry-BM1-sG-e.js} +1 -1
  98. package/dist/{plugin-registry-BkGhcUDV.js → plugin-registry-CAy3I1K1.js} +1 -1
  99. package/dist/{plugin-registry-BenvgIsJ.js → plugin-registry-DjmzOS3n.js} +1 -1
  100. package/dist/{plugin-registry-DZirturB.js → plugin-registry-l2iN7_1l.js} +1 -1
  101. package/dist/plugin-sdk/agent-runtime/src/builderforce/ports.d.ts +1 -1
  102. package/dist/plugin-sdk/agent-runtime/src/infra/limbic-system-service.d.ts +2 -3
  103. package/dist/plugin-sdk/{audio-preflight-lhP946UF.js → audio-preflight-BbtfbLzo.js} +1 -1
  104. package/dist/plugin-sdk/{channel-web-CzXHQXgb.js → channel-web-BHose9yJ.js} +1 -1
  105. package/dist/plugin-sdk/index.js +1 -1
  106. package/dist/plugin-sdk/packages/agent-tools/src/index.d.ts +0 -1
  107. package/dist/plugin-sdk/packages/agent-tools/src/psychometric-dims.d.ts +2 -2
  108. package/dist/plugin-sdk/packages/agent-tools/src/psychometrics.d.ts +38 -5
  109. package/dist/plugin-sdk/packages/agent-tools/src/spec.d.ts +3 -1
  110. package/dist/plugin-sdk/{reply-DkmZ32IH.js → reply-V98uAjNN.js} +5 -5
  111. package/dist/plugin-sdk/{runner-DeqVi2ay.js → runner-BpFNG45j.js} +1 -1
  112. package/dist/plugin-sdk/{src-yVjde9hC.js → src-pvdIxmTY.js} +2 -2
  113. package/dist/plugin-sdk/{tool-loop-detection-AO2R09bJ.js → tool-loop-detection-Bjiit8CZ.js} +1 -1
  114. package/dist/plugin-sdk/{web-D-h3WpSq.js → web-Bq6nGRsB.js} +1 -1
  115. package/dist/{plugins-r-hGfiMK.js → plugins-BbovMu2g.js} +1 -1
  116. package/dist/{plugins-ChYVZuHy.js → plugins-DrkC1ANW.js} +1 -1
  117. package/dist/{plugins-cli-CKQ2X7tA.js → plugins-cli-CqtTn-Gv.js} +1 -1
  118. package/dist/{plugins-cli-CB7e9eCK.js → plugins-cli-DWlQnRpV.js} +1 -1
  119. package/dist/{program-D71K23KC.js → program-DOGUG9Uz.js} +2 -2
  120. package/dist/{program-context-B9V62ZJg.js → program-context-DBtTOKkf.js} +1 -1
  121. package/dist/{project-context-Cnqfr64Z.js → project-context-C5KLsMTc.js} +1 -1
  122. package/dist/{project-context-DXP12xhk.js → project-context-Cg0S9eFT.js} +1 -1
  123. package/dist/project-context-DbBD_r4v.js +1 -0
  124. package/dist/project-context-nIzFswHk.js +1 -0
  125. package/dist/project-context-store-B96x1Lfk.js +1 -0
  126. package/dist/{project-context-store-C8TROXjr.js → project-context-store-BS994lZX.js} +1 -1
  127. package/dist/{project-context-store-ClFt-YDL.js → project-context-store-BSIWJD6S.js} +1 -1
  128. package/dist/project-context-store-BzX1YdMP.js +1 -0
  129. package/dist/{prompt-select-styled-Cect8vJu.js → prompt-select-styled-2q_0LOx1.js} +1 -1
  130. package/dist/{prompt-select-styled-CJBJZiX_.js → prompt-select-styled-D31D9EIl.js} +1 -1
  131. package/dist/{provider-auth-helpers-DItSj71N.js → provider-auth-helpers-9Ut-MHV9.js} +1 -1
  132. package/dist/{provider-auth-helpers-ByvJdQT3.js → provider-auth-helpers-u1GAP4Bi.js} +1 -1
  133. package/dist/{provider-dispatcher-E-RjX6WG.js → provider-dispatcher-4KsB_bCw.js} +1 -1
  134. package/dist/{provider-dispatcher-D6-kUWf8.js → provider-dispatcher-CG7kSp65.js} +1 -1
  135. package/dist/{push-apns-B6YfFR5s.js → push-apns-CEzi4ars.js} +1 -1
  136. package/dist/{push-apns-n8P3oclR.js → push-apns-oUAHr48A.js} +1 -1
  137. package/dist/{pw-ai-BpY-eMJT.js → pw-ai-CfV_5FWo.js} +1 -1
  138. package/dist/{pw-ai-Bu1w-1rC.js → pw-ai-Dx8XRyPq.js} +1 -1
  139. package/dist/{register.agent-CAsV5dRf.js → register.agent-C84ud-cS.js} +1 -1
  140. package/dist/{register.agent-DQ4zQymV.js → register.agent-Db9SzkZg.js} +1 -1
  141. package/dist/{register.configure-HcPL-Na2.js → register.configure-BfPiEcFk.js} +1 -1
  142. package/dist/{register.configure-B-xRsB-s.js → register.configure-WYMz_fwM.js} +1 -1
  143. package/dist/{register.connect-BcZeAJ1s.js → register.connect-CMN7lqC5.js} +1 -1
  144. package/dist/{register.connect-ChZQOiYF.js → register.connect-Dqhd81kK.js} +1 -1
  145. package/dist/{register.maintenance-C-7Arpam.js → register.maintenance-BpQE-3eC.js} +1 -1
  146. package/dist/{register.maintenance-Jdfg2LKA.js → register.maintenance-DjKxt-jl.js} +1 -1
  147. package/dist/{register.message-D1IU3K0a.js → register.message-C4Gf388m.js} +1 -1
  148. package/dist/{register.message-C3cFBIXY.js → register.message-D5A7-_wN.js} +1 -1
  149. package/dist/{register.onboard-DJ2QNnOi.js → register.onboard-BF5tXr7K.js} +1 -1
  150. package/dist/{register.onboard-DjrhC3jh.js → register.onboard-BO_OtYg9.js} +1 -1
  151. package/dist/{register.setup-BNUqkiVa.js → register.setup-BzDbYjEw.js} +1 -1
  152. package/dist/{register.setup-C8XgG5Zt.js → register.setup-CaWt1bhf.js} +1 -1
  153. package/dist/{register.status-health-sessions-DcqlqAhs.js → register.status-health-sessions-BbYzFw1X.js} +1 -1
  154. package/dist/{register.status-health-sessions-CBTZZ0Rh.js → register.status-health-sessions-CDD6Eoxf.js} +1 -1
  155. package/dist/{register.subclis-CqVl0uO4.js → register.subclis-Cfb5FUTI.js} +1 -1
  156. package/dist/{register.subclis-Meewq2dj.js → register.subclis-yYbEKj9a.js} +1 -1
  157. package/dist/{reply-BsRbeUhd.js → reply-CpGH-3If.js} +8 -8
  158. package/dist/{run-main-CFVoPcgN.js → run-main-B82VAQTQ.js} +1 -1
  159. package/dist/{runner-68-X3KHf.js → runner-BLCTET8O.js} +2 -2
  160. package/dist/{runner-CfNJMPWu.js → runner-C651oVfk.js} +2 -2
  161. package/dist/{runner-BgUG2-RV.js → runner-DCn9sBTn.js} +3 -3
  162. package/dist/{runner-BKHYCYMH.js → runner-xF3_-mDL.js} +3 -3
  163. package/dist/{server-node-events-DusCxrVm.js → server-node-events-Bam08x5E.js} +1 -1
  164. package/dist/{server-node-events-BahizW3Z.js → server-node-events-kbTUUaAA.js} +1 -1
  165. package/dist/{session-dirs-RIA98OsG.js → session-dirs-BBGuanHN.js} +1 -1
  166. package/dist/{session-dirs-Cutn9srI.js → session-dirs-DV-c-o7M.js} +1 -1
  167. package/dist/{src-BRo9ywDM.js → src-BM8G-tIl.js} +3 -3
  168. package/dist/{src-DxNC0IHE.js → src-D2-7sOAX.js} +3 -3
  169. package/dist/{src-NJhXretA.js → src-D5vOHX9i.js} +2 -2
  170. package/dist/{src-Enbbh3hH.js → src-Dptpvd0V.js} +2 -2
  171. package/dist/{status-DPza6sZ1.js → status-BcT4AI8l.js} +1 -1
  172. package/dist/{status-CMdPdaSM.js → status-C9D1ex2G.js} +1 -1
  173. package/dist/{status-CFDh5snF.js → status-D_YsiWpP.js} +1 -1
  174. package/dist/{status-SyaizSN6.js → status-V8zvPBOv.js} +1 -1
  175. package/dist/{status-C1toWVvJ.js → status-i_sJ6Ikx.js} +1 -1
  176. package/dist/{subagent-registry-oB_F2U2W.js → subagent-registry-BUKplZi1.js} +8 -8
  177. package/dist/{subagent-registry-DFzwOGge.js → subagent-registry-BgUoQjBB.js} +1 -1
  178. package/dist/{subagent-registry-C1opJIrJ.js → subagent-registry-DrrF3JoH.js} +1 -1
  179. package/dist/{tool-loop-detection-DxqiqYam.js → tool-loop-detection-Bv0aRyd6.js} +1 -1
  180. package/dist/{tool-loop-detection-3W6bLEza.js → tool-loop-detection-CgUkrbCZ.js} +1 -1
  181. package/dist/{tool-loop-detection-C3z1wqgV.js → tool-loop-detection-CshVZIOE.js} +1 -1
  182. package/dist/{tool-loop-detection-DNM8YCNW.js → tool-loop-detection-bpZ-S3A1.js} +1 -1
  183. package/dist/{tui-Dy1FnApe.js → tui-CdYI5f3k.js} +2 -2
  184. package/dist/{tui-lng2vIp3.js → tui-DgBGTw2s.js} +2 -2
  185. package/dist/{tui-cli-BTFEL897.js → tui-cli-BNeRzoEe.js} +1 -1
  186. package/dist/{tui-cli-D-cDh9DV.js → tui-cli-BZ--mp9s.js} +1 -1
  187. package/dist/{tui-stream-assembler-B_AQD4Kg.js → tui-stream-assembler-BNJE9PoS.js} +1 -1
  188. package/dist/{tui-stream-assembler-Bn1WXUGG.js → tui-stream-assembler-xFcJqFJ9.js} +1 -1
  189. package/dist/{update-cli-BdT4-P_D.js → update-cli-BATUCF7p.js} +1 -1
  190. package/dist/{update-cli-DMMSWPXh.js → update-cli-BRBoX_97.js} +1 -1
  191. package/dist/{web-BiSkmACr.js → web-BdYyXjsX.js} +1 -1
  192. package/dist/{web-CXrAweDC.js → web-C5hfXVCy.js} +1 -1
  193. package/dist/{web-BS6WUf7c.js → web-CsWqmV_E.js} +1 -1
  194. package/dist/{web-CfYUd-lX.js → web-fg3nA4Qq.js} +1 -1
  195. package/dist/{workflow-cli-Du4IfE1A.js → workflow-cli-D-o_-jfU.js} +1 -1
  196. package/dist/{workflow-cli-BuEKJ4ut.js → workflow-cli-DDWSXyi0.js} +1 -1
  197. package/package.json +6 -5
  198. package/dist/chrome-C6fODzE5.js +0 -4
  199. package/dist/chrome-Cm-kVyuA.js +0 -4
  200. package/dist/plugin-sdk/agent-runtime/src/builderforce/limbic.d.ts +0 -14
  201. package/dist/plugin-sdk/packages/agent-tools/src/limbic.d.ts +0 -104
  202. package/dist/project-context-DS52UwJZ.js +0 -1
  203. package/dist/project-context-PiiAmwVd.js +0 -1
  204. package/dist/project-context-store-B2GYSwld.js +0 -1
  205. package/dist/project-context-store-DNx9ScQ_.js +0 -1
@@ -1,10 +1,10 @@
1
- import{u as resolveGatewayPort}from"./paths-BHg-VHB4.js";import{S as shortenHomePath,y as resolveUserPath}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import{It as resolveEnvApiKey,L as normalizeProviderId,Rt as normalizeOptionalSecretInput,b as ensureAuthProfileStore,s as resolveApiKeyForProfile,t as resolveAuthProfileOrder,v as upsertAuthProfile,zt as normalizeSecretInput}from"./auth-profiles-BARnVAUE.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{a as upsertSharedEnvVar}from"./env-file-BIKVpYUN.js";import{a as readConfigFileSnapshot,c as writeConfigFile,y as parseDurationMs}from"./io-BySzqKzT.js";import{a as ensureWorkspaceAndSessions,b as waitForGatewayReachable,c as handleReset,g as resolveControlUiLinks,m as randomToken,n as applyWizardMetadata,t as DEFAULT_WORKSPACE}from"./onboard-helpers-Di5OXlap.js";import{a as gatewayInstallErrorHint,i as buildGatewayInstallPlan,r as isGatewayDaemonRuntime,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-Ddsn0FJm.js";import{t as assertSupportedRuntime}from"./runtime-guard-BThrXAmT.js";import{r as isSystemdUserServiceAvailable}from"./systemd-DpT8tcbh.js";import{t as resolveGatewayService}from"./service-ugwM110q.js";import{r as healthCommand}from"./health-hXlukqbf.js";import{C as setXaiApiKey,S as setVercelAiGatewayApiKey,T as setZaiApiKey,_ as setOpenrouterApiKey,b as setTogetherApiKey,c as setAnthropicApiKey,d as setHuggingfaceApiKey,f as setKimiCodingApiKey,g as setOpencodeZenApiKey,h as setMoonshotApiKey,l as setCloudflareAiGatewayConfig,m as setMinimaxApiKey,p as setLitellmApiKey,u as setGeminiApiKey,v as setQianfanApiKey,w as setXiaomiApiKey,x as setVeniceApiKey,y as setSyntheticApiKey}from"./onboard-auth.credentials-BSSFRvb0.js";import{A as applyXaiConfig,B as applyVercelAiGatewayConfig,E as applyTogetherConfig,H as applyAgentDefaultModelPrimary,I as applyLitellmConfig,M as applyXiaomiConfig,O as applyVeniceConfig,P as applyZaiConfig,R as applyCloudflareAiGatewayConfig,S as applyQianfanConfig,_ as applyMoonshotConfigCn,a as applyMinimaxApiConfig,b as applyOpenrouterConfig,d as applyAuthProfileConfig,f as applyHuggingfaceConfig,g as applyMoonshotConfig,l as applyMinimaxConfig,m as applyKimiCodeConfig,n as validateAnthropicSetupToken,o as applyMinimaxApiConfigCn,r as applyOpencodeZenConfig,t as buildTokenProfileId,w as applySyntheticConfig}from"./auth-token-DGaO7TMn.js";import{n as logConfigUpdated}from"./logging-CRzk-5ye.js";import{n as isDeprecatedAuthChoice,r as normalizeLegacyOnboardAuthChoice}from"./auth-choice-legacy-D8kixNBH.js";import{i as detectZaiEndpoint,n as applyOpenAIConfig,o as applyGoogleGeminiModelDefault}from"./openai-model-default-DIE-Ey58.js";import{n as ensureSystemdUserLingerNonInteractive}from"./systemd-linger-CuzOv-tn.js";import{a as resolveCustomProviderId,n as applyCustomApiConfig,r as parseNonInteractiveCustomApiFlags,t as CustomApiError}from"./onboard-custom-BIT8LAFx.js";import{t as runInteractiveOnboarding}from"./onboard-interactive-DvNhkCNr.js";import{t as applyOnboardingLocalWorkspaceConfig}from"./onboard-config-C8ZqMy-Y.js";const ONBOARD_PROVIDER_AUTH_FLAGS=[{optionKey:`anthropicApiKey`,authChoice:`apiKey`,cliFlag:`--anthropic-api-key`,cliOption:`--anthropic-api-key <key>`,description:`Anthropic API key`},{optionKey:`openaiApiKey`,authChoice:`openai-api-key`,cliFlag:`--openai-api-key`,cliOption:`--openai-api-key <key>`,description:`OpenAI API key`},{optionKey:`openrouterApiKey`,authChoice:`openrouter-api-key`,cliFlag:`--openrouter-api-key`,cliOption:`--openrouter-api-key <key>`,description:`OpenRouter API key`},{optionKey:`aiGatewayApiKey`,authChoice:`ai-gateway-api-key`,cliFlag:`--ai-gateway-api-key`,cliOption:`--ai-gateway-api-key <key>`,description:`Vercel AI Gateway API key`},{optionKey:`cloudflareAiGatewayApiKey`,authChoice:`cloudflare-ai-gateway-api-key`,cliFlag:`--cloudflare-ai-gateway-api-key`,cliOption:`--cloudflare-ai-gateway-api-key <key>`,description:`Cloudflare AI Gateway API key`},{optionKey:`moonshotApiKey`,authChoice:`moonshot-api-key`,cliFlag:`--moonshot-api-key`,cliOption:`--moonshot-api-key <key>`,description:`Moonshot API key`},{optionKey:`kimiCodeApiKey`,authChoice:`kimi-code-api-key`,cliFlag:`--kimi-code-api-key`,cliOption:`--kimi-code-api-key <key>`,description:`Kimi Coding API key`},{optionKey:`geminiApiKey`,authChoice:`gemini-api-key`,cliFlag:`--gemini-api-key`,cliOption:`--gemini-api-key <key>`,description:`Gemini API key`},{optionKey:`zaiApiKey`,authChoice:`zai-api-key`,cliFlag:`--zai-api-key`,cliOption:`--zai-api-key <key>`,description:`Z.AI API key`},{optionKey:`xiaomiApiKey`,authChoice:`xiaomi-api-key`,cliFlag:`--xiaomi-api-key`,cliOption:`--xiaomi-api-key <key>`,description:`Xiaomi API key`},{optionKey:`minimaxApiKey`,authChoice:`minimax-api`,cliFlag:`--minimax-api-key`,cliOption:`--minimax-api-key <key>`,description:`MiniMax API key`},{optionKey:`syntheticApiKey`,authChoice:`synthetic-api-key`,cliFlag:`--synthetic-api-key`,cliOption:`--synthetic-api-key <key>`,description:`Synthetic API key`},{optionKey:`veniceApiKey`,authChoice:`venice-api-key`,cliFlag:`--venice-api-key`,cliOption:`--venice-api-key <key>`,description:`Venice API key`},{optionKey:`togetherApiKey`,authChoice:`together-api-key`,cliFlag:`--together-api-key`,cliOption:`--together-api-key <key>`,description:`Together AI API key`},{optionKey:`huggingfaceApiKey`,authChoice:`huggingface-api-key`,cliFlag:`--huggingface-api-key`,cliOption:`--huggingface-api-key <key>`,description:`Hugging Face API key (HF token)`},{optionKey:`opencodeZenApiKey`,authChoice:`opencode-zen`,cliFlag:`--opencode-zen-api-key`,cliOption:`--opencode-zen-api-key <key>`,description:`OpenCode Zen API key`},{optionKey:`xaiApiKey`,authChoice:`xai-api-key`,cliFlag:`--xai-api-key`,cliOption:`--xai-api-key <key>`,description:`xAI API key`},{optionKey:`litellmApiKey`,authChoice:`litellm-api-key`,cliFlag:`--litellm-api-key`,cliOption:`--litellm-api-key <key>`,description:`LiteLLM API key`},{optionKey:`qianfanApiKey`,authChoice:`qianfan-api-key`,cliFlag:`--qianfan-api-key`,cliOption:`--qianfan-api-key <key>`,description:`QIANFAN API key`}];function hasStringValue(value){return typeof value==`string`?value.trim().length>0:!!value}function inferAuthChoiceFromFlags(opts){let matches=ONBOARD_PROVIDER_AUTH_FLAGS.filter(({optionKey})=>hasStringValue(opts[optionKey])).map(flag=>({optionKey:flag.optionKey,authChoice:flag.authChoice,label:flag.cliFlag}));return(hasStringValue(opts.customBaseUrl)||hasStringValue(opts.customModelId)||hasStringValue(opts.customApiKey))&&matches.push({optionKey:`customBaseUrl`,authChoice:`custom-api-key`,label:`--custom-base-url/--custom-model-id/--custom-api-key`}),{choice:matches[0]?.authChoice,matches}}async function resolveApiKeyFromProfiles(params){let store=await ensureAuthProfileStore(params.agentDir),order=resolveAuthProfileOrder({cfg:params.cfg,store,provider:params.provider});for(let profileId of order){if(store.profiles[profileId]?.type!==`api_key`)continue;let resolved=await resolveApiKeyForProfile({cfg:params.cfg,store,profileId,agentDir:params.agentDir});if(resolved?.apiKey)return resolved.apiKey}return null}async function resolveNonInteractiveApiKey(params){let flagKey=normalizeOptionalSecretInput(params.flagValue);if(flagKey)return{key:flagKey,source:`flag`};let envResolved=resolveEnvApiKey(params.provider);if(envResolved?.apiKey)return{key:envResolved.apiKey,source:`env`};let explicitEnvVar=params.envVarName?.trim();if(explicitEnvVar){let explicitEnvKey=normalizeOptionalSecretInput(process.env[explicitEnvVar]);if(explicitEnvKey)return{key:explicitEnvKey,source:`env`}}if(params.allowProfile??!0){let profileKey=await resolveApiKeyFromProfiles({provider:params.provider,cfg:params.cfg,agentDir:params.agentDir});if(profileKey)return{key:profileKey,source:`profile`}}if(params.required===!1)return null;let profileHint=params.allowProfile===!1?``:`, or existing ${params.provider} API-key profile`;return params.runtime.error(`Missing ${params.flagName} (or ${params.envVar} in env${profileHint}).`),params.runtime.exit(1),null}async function applyNonInteractiveAuthChoice(params){let{authChoice,opts,runtime,baseConfig}=params,nextConfig=params.nextConfig;if(authChoice===`claude-cli`||authChoice===`codex-cli`)return runtime.error([`Auth choice "${authChoice}" is deprecated.`,`Use "--auth-choice builderforcellm" (recommended default), "--auth-choice token" (Anthropic setup-token), or "--auth-choice openai-codex".`].join(`
1
+ import{u as resolveGatewayPort}from"./paths-BHg-VHB4.js";import{S as shortenHomePath,y as resolveUserPath}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import{It as resolveEnvApiKey,L as normalizeProviderId,Rt as normalizeOptionalSecretInput,b as ensureAuthProfileStore,s as resolveApiKeyForProfile,t as resolveAuthProfileOrder,v as upsertAuthProfile,zt as normalizeSecretInput}from"./auth-profiles-BARnVAUE.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{a as upsertSharedEnvVar}from"./env-file-BIKVpYUN.js";import{a as readConfigFileSnapshot,c as writeConfigFile,y as parseDurationMs}from"./io-BySzqKzT.js";import{a as ensureWorkspaceAndSessions,b as waitForGatewayReachable,c as handleReset,g as resolveControlUiLinks,m as randomToken,n as applyWizardMetadata,t as DEFAULT_WORKSPACE}from"./onboard-helpers-Di5OXlap.js";import{a as gatewayInstallErrorHint,i as buildGatewayInstallPlan,r as isGatewayDaemonRuntime,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-Ddsn0FJm.js";import{t as assertSupportedRuntime}from"./runtime-guard-BThrXAmT.js";import{r as isSystemdUserServiceAvailable}from"./systemd-DpT8tcbh.js";import{t as resolveGatewayService}from"./service-ugwM110q.js";import{r as healthCommand}from"./health-CRIXA8je.js";import{C as setXaiApiKey,S as setVercelAiGatewayApiKey,T as setZaiApiKey,_ as setOpenrouterApiKey,b as setTogetherApiKey,c as setAnthropicApiKey,d as setHuggingfaceApiKey,f as setKimiCodingApiKey,g as setOpencodeZenApiKey,h as setMoonshotApiKey,l as setCloudflareAiGatewayConfig,m as setMinimaxApiKey,p as setLitellmApiKey,u as setGeminiApiKey,v as setQianfanApiKey,w as setXiaomiApiKey,x as setVeniceApiKey,y as setSyntheticApiKey}from"./onboard-auth.credentials-BSSFRvb0.js";import{A as applyXaiConfig,B as applyVercelAiGatewayConfig,E as applyTogetherConfig,H as applyAgentDefaultModelPrimary,I as applyLitellmConfig,M as applyXiaomiConfig,O as applyVeniceConfig,P as applyZaiConfig,R as applyCloudflareAiGatewayConfig,S as applyQianfanConfig,_ as applyMoonshotConfigCn,a as applyMinimaxApiConfig,b as applyOpenrouterConfig,d as applyAuthProfileConfig,f as applyHuggingfaceConfig,g as applyMoonshotConfig,l as applyMinimaxConfig,m as applyKimiCodeConfig,n as validateAnthropicSetupToken,o as applyMinimaxApiConfigCn,r as applyOpencodeZenConfig,t as buildTokenProfileId,w as applySyntheticConfig}from"./auth-token-DGaO7TMn.js";import{n as logConfigUpdated}from"./logging-CRzk-5ye.js";import{n as isDeprecatedAuthChoice,r as normalizeLegacyOnboardAuthChoice}from"./auth-choice-legacy-D8kixNBH.js";import{i as detectZaiEndpoint,n as applyOpenAIConfig,o as applyGoogleGeminiModelDefault}from"./openai-model-default-DIE-Ey58.js";import{n as ensureSystemdUserLingerNonInteractive}from"./systemd-linger-CuzOv-tn.js";import{a as resolveCustomProviderId,n as applyCustomApiConfig,r as parseNonInteractiveCustomApiFlags,t as CustomApiError}from"./onboard-custom-BIT8LAFx.js";import{t as runInteractiveOnboarding}from"./onboard-interactive-ClPMlCIl.js";import{t as applyOnboardingLocalWorkspaceConfig}from"./onboard-config-C8ZqMy-Y.js";const ONBOARD_PROVIDER_AUTH_FLAGS=[{optionKey:`anthropicApiKey`,authChoice:`apiKey`,cliFlag:`--anthropic-api-key`,cliOption:`--anthropic-api-key <key>`,description:`Anthropic API key`},{optionKey:`openaiApiKey`,authChoice:`openai-api-key`,cliFlag:`--openai-api-key`,cliOption:`--openai-api-key <key>`,description:`OpenAI API key`},{optionKey:`openrouterApiKey`,authChoice:`openrouter-api-key`,cliFlag:`--openrouter-api-key`,cliOption:`--openrouter-api-key <key>`,description:`OpenRouter API key`},{optionKey:`aiGatewayApiKey`,authChoice:`ai-gateway-api-key`,cliFlag:`--ai-gateway-api-key`,cliOption:`--ai-gateway-api-key <key>`,description:`Vercel AI Gateway API key`},{optionKey:`cloudflareAiGatewayApiKey`,authChoice:`cloudflare-ai-gateway-api-key`,cliFlag:`--cloudflare-ai-gateway-api-key`,cliOption:`--cloudflare-ai-gateway-api-key <key>`,description:`Cloudflare AI Gateway API key`},{optionKey:`moonshotApiKey`,authChoice:`moonshot-api-key`,cliFlag:`--moonshot-api-key`,cliOption:`--moonshot-api-key <key>`,description:`Moonshot API key`},{optionKey:`kimiCodeApiKey`,authChoice:`kimi-code-api-key`,cliFlag:`--kimi-code-api-key`,cliOption:`--kimi-code-api-key <key>`,description:`Kimi Coding API key`},{optionKey:`geminiApiKey`,authChoice:`gemini-api-key`,cliFlag:`--gemini-api-key`,cliOption:`--gemini-api-key <key>`,description:`Gemini API key`},{optionKey:`zaiApiKey`,authChoice:`zai-api-key`,cliFlag:`--zai-api-key`,cliOption:`--zai-api-key <key>`,description:`Z.AI API key`},{optionKey:`xiaomiApiKey`,authChoice:`xiaomi-api-key`,cliFlag:`--xiaomi-api-key`,cliOption:`--xiaomi-api-key <key>`,description:`Xiaomi API key`},{optionKey:`minimaxApiKey`,authChoice:`minimax-api`,cliFlag:`--minimax-api-key`,cliOption:`--minimax-api-key <key>`,description:`MiniMax API key`},{optionKey:`syntheticApiKey`,authChoice:`synthetic-api-key`,cliFlag:`--synthetic-api-key`,cliOption:`--synthetic-api-key <key>`,description:`Synthetic API key`},{optionKey:`veniceApiKey`,authChoice:`venice-api-key`,cliFlag:`--venice-api-key`,cliOption:`--venice-api-key <key>`,description:`Venice API key`},{optionKey:`togetherApiKey`,authChoice:`together-api-key`,cliFlag:`--together-api-key`,cliOption:`--together-api-key <key>`,description:`Together AI API key`},{optionKey:`huggingfaceApiKey`,authChoice:`huggingface-api-key`,cliFlag:`--huggingface-api-key`,cliOption:`--huggingface-api-key <key>`,description:`Hugging Face API key (HF token)`},{optionKey:`opencodeZenApiKey`,authChoice:`opencode-zen`,cliFlag:`--opencode-zen-api-key`,cliOption:`--opencode-zen-api-key <key>`,description:`OpenCode Zen API key`},{optionKey:`xaiApiKey`,authChoice:`xai-api-key`,cliFlag:`--xai-api-key`,cliOption:`--xai-api-key <key>`,description:`xAI API key`},{optionKey:`litellmApiKey`,authChoice:`litellm-api-key`,cliFlag:`--litellm-api-key`,cliOption:`--litellm-api-key <key>`,description:`LiteLLM API key`},{optionKey:`qianfanApiKey`,authChoice:`qianfan-api-key`,cliFlag:`--qianfan-api-key`,cliOption:`--qianfan-api-key <key>`,description:`QIANFAN API key`}];function hasStringValue(value){return typeof value==`string`?value.trim().length>0:!!value}function inferAuthChoiceFromFlags(opts){let matches=ONBOARD_PROVIDER_AUTH_FLAGS.filter(({optionKey})=>hasStringValue(opts[optionKey])).map(flag=>({optionKey:flag.optionKey,authChoice:flag.authChoice,label:flag.cliFlag}));return(hasStringValue(opts.customBaseUrl)||hasStringValue(opts.customModelId)||hasStringValue(opts.customApiKey))&&matches.push({optionKey:`customBaseUrl`,authChoice:`custom-api-key`,label:`--custom-base-url/--custom-model-id/--custom-api-key`}),{choice:matches[0]?.authChoice,matches}}async function resolveApiKeyFromProfiles(params){let store=await ensureAuthProfileStore(params.agentDir),order=resolveAuthProfileOrder({cfg:params.cfg,store,provider:params.provider});for(let profileId of order){if(store.profiles[profileId]?.type!==`api_key`)continue;let resolved=await resolveApiKeyForProfile({cfg:params.cfg,store,profileId,agentDir:params.agentDir});if(resolved?.apiKey)return resolved.apiKey}return null}async function resolveNonInteractiveApiKey(params){let flagKey=normalizeOptionalSecretInput(params.flagValue);if(flagKey)return{key:flagKey,source:`flag`};let envResolved=resolveEnvApiKey(params.provider);if(envResolved?.apiKey)return{key:envResolved.apiKey,source:`env`};let explicitEnvVar=params.envVarName?.trim();if(explicitEnvVar){let explicitEnvKey=normalizeOptionalSecretInput(process.env[explicitEnvVar]);if(explicitEnvKey)return{key:explicitEnvKey,source:`env`}}if(params.allowProfile??!0){let profileKey=await resolveApiKeyFromProfiles({provider:params.provider,cfg:params.cfg,agentDir:params.agentDir});if(profileKey)return{key:profileKey,source:`profile`}}if(params.required===!1)return null;let profileHint=params.allowProfile===!1?``:`, or existing ${params.provider} API-key profile`;return params.runtime.error(`Missing ${params.flagName} (or ${params.envVar} in env${profileHint}).`),params.runtime.exit(1),null}async function applyNonInteractiveAuthChoice(params){let{authChoice,opts,runtime,baseConfig}=params,nextConfig=params.nextConfig;if(authChoice===`claude-cli`||authChoice===`codex-cli`)return runtime.error([`Auth choice "${authChoice}" is deprecated.`,`Use "--auth-choice builderforcellm" (recommended default), "--auth-choice token" (Anthropic setup-token), or "--auth-choice openai-codex".`].join(`
2
2
  `)),runtime.exit(1),null;if(authChoice===`setup-token`)return runtime.error([`Auth choice "setup-token" requires interactive mode.`,`Use "--auth-choice token" with --token and --token-provider anthropic.`].join(`
3
3
  `)),runtime.exit(1),null;if(authChoice===`local`)return runtime.error([`Auth choice "local" requires interactive mode.`,`Use interactive onboard/configure for guided local Ollama or llama.cpp/vLLM setup.`].join(`
4
4
  `)),runtime.exit(1),null;if(authChoice===`vllm`)return runtime.error([`Auth choice "vllm" requires interactive mode.`,`Use interactive onboard/configure to enter base URL, API key, and model ID.`].join(`
5
5
  `)),runtime.exit(1),null;if(authChoice===`builderforcellm`)return runtime.log(`Using default BuilderForceAgentsLLM provider (builderforcellm/auto).`),applyAgentDefaultModelPrimary(nextConfig,`builderforcellm/auto`);if(authChoice===`apiKey`){let resolved=await resolveNonInteractiveApiKey({provider:`anthropic`,cfg:baseConfig,flagValue:opts.anthropicApiKey,flagName:`--anthropic-api-key`,envVar:`ANTHROPIC_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setAnthropicApiKey(resolved.key),applyAuthProfileConfig(nextConfig,{profileId:`anthropic:default`,provider:`anthropic`,mode:`api_key`})):null}if(authChoice===`token`){let providerRaw=opts.tokenProvider?.trim();if(!providerRaw)return runtime.error(`Missing --token-provider for --auth-choice token.`),runtime.exit(1),null;let provider=normalizeProviderId(providerRaw);if(provider!==`anthropic`)return runtime.error(`Only --token-provider anthropic is supported for --auth-choice token.`),runtime.exit(1),null;let tokenRaw=normalizeSecretInput(opts.token);if(!tokenRaw)return runtime.error(`Missing --token for --auth-choice token.`),runtime.exit(1),null;let tokenError=validateAnthropicSetupToken(tokenRaw);if(tokenError)return runtime.error(tokenError),runtime.exit(1),null;let expires,expiresInRaw=opts.tokenExpiresIn?.trim();if(expiresInRaw)try{expires=Date.now()+parseDurationMs(expiresInRaw,{defaultUnit:`d`})}catch(err){return runtime.error(`Invalid --token-expires-in: ${String(err)}`),runtime.exit(1),null}let profileId=opts.tokenProfileId?.trim()||buildTokenProfileId({provider,name:``});return upsertAuthProfile({profileId,credential:{type:`token`,provider,token:tokenRaw.trim(),...expires?{expires}:{}}}),applyAuthProfileConfig(nextConfig,{profileId,provider,mode:`token`})}if(authChoice===`gemini-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`google`,cfg:baseConfig,flagValue:opts.geminiApiKey,flagName:`--gemini-api-key`,envVar:`GEMINI_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setGeminiApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`google:default`,provider:`google`,mode:`api_key`}),applyGoogleGeminiModelDefault(nextConfig).next):null}if(authChoice===`zai-api-key`||authChoice===`zai-coding-global`||authChoice===`zai-coding-cn`||authChoice===`zai-global`||authChoice===`zai-cn`){let resolved=await resolveNonInteractiveApiKey({provider:`zai`,cfg:baseConfig,flagValue:opts.zaiApiKey,flagName:`--zai-api-key`,envVar:`ZAI_API_KEY`,runtime});if(!resolved)return null;resolved.source!==`profile`&&await setZaiApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`zai:default`,provider:`zai`,mode:`api_key`});let endpoint,modelIdOverride;if(authChoice===`zai-coding-global`)endpoint=`coding-global`;else if(authChoice===`zai-coding-cn`)endpoint=`coding-cn`;else if(authChoice===`zai-global`)endpoint=`global`;else if(authChoice===`zai-cn`)endpoint=`cn`;else{let detected=await detectZaiEndpoint({apiKey:resolved.key});detected?(endpoint=detected.endpoint,modelIdOverride=detected.modelId):endpoint=`global`}return applyZaiConfig(nextConfig,{endpoint,...modelIdOverride?{modelId:modelIdOverride}:{}})}if(authChoice===`xiaomi-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`xiaomi`,cfg:baseConfig,flagValue:opts.xiaomiApiKey,flagName:`--xiaomi-api-key`,envVar:`XIAOMI_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setXiaomiApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`xiaomi:default`,provider:`xiaomi`,mode:`api_key`}),applyXiaomiConfig(nextConfig)):null}if(authChoice===`xai-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`xai`,cfg:baseConfig,flagValue:opts.xaiApiKey,flagName:`--xai-api-key`,envVar:`XAI_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setXaiApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`xai:default`,provider:`xai`,mode:`api_key`}),applyXaiConfig(nextConfig)):null}if(authChoice===`qianfan-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`qianfan`,cfg:baseConfig,flagValue:opts.qianfanApiKey,flagName:`--qianfan-api-key`,envVar:`QIANFAN_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setQianfanApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`qianfan:default`,provider:`qianfan`,mode:`api_key`}),applyQianfanConfig(nextConfig)):null}if(authChoice===`openai-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`openai`,cfg:baseConfig,flagValue:opts.openaiApiKey,flagName:`--openai-api-key`,envVar:`OPENAI_API_KEY`,runtime,allowProfile:!1});if(!resolved)return null;let key=resolved.key,result=upsertSharedEnvVar({key:`OPENAI_API_KEY`,value:key});return process.env.OPENAI_API_KEY=key,runtime.log(`Saved OPENAI_API_KEY to ${shortenHomePath(result.path)}`),applyOpenAIConfig(nextConfig)}if(authChoice===`openrouter-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`openrouter`,cfg:baseConfig,flagValue:opts.openrouterApiKey,flagName:`--openrouter-api-key`,envVar:`OPENROUTER_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setOpenrouterApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`openrouter:default`,provider:`openrouter`,mode:`api_key`}),applyOpenrouterConfig(nextConfig)):null}if(authChoice===`litellm-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`litellm`,cfg:baseConfig,flagValue:opts.litellmApiKey,flagName:`--litellm-api-key`,envVar:`LITELLM_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setLitellmApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`litellm:default`,provider:`litellm`,mode:`api_key`}),applyLitellmConfig(nextConfig)):null}if(authChoice===`ai-gateway-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`vercel-ai-gateway`,cfg:baseConfig,flagValue:opts.aiGatewayApiKey,flagName:`--ai-gateway-api-key`,envVar:`AI_GATEWAY_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setVercelAiGatewayApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`vercel-ai-gateway:default`,provider:`vercel-ai-gateway`,mode:`api_key`}),applyVercelAiGatewayConfig(nextConfig)):null}if(authChoice===`cloudflare-ai-gateway-api-key`){let accountId=opts.cloudflareAiGatewayAccountId?.trim()??``,gatewayId=opts.cloudflareAiGatewayGatewayId?.trim()??``;if(!accountId||!gatewayId)return runtime.error([`Auth choice "cloudflare-ai-gateway-api-key" requires Account ID and Gateway ID.`,`Use --cloudflare-ai-gateway-account-id and --cloudflare-ai-gateway-gateway-id.`].join(`
6
6
  `)),runtime.exit(1),null;let resolved=await resolveNonInteractiveApiKey({provider:`cloudflare-ai-gateway`,cfg:baseConfig,flagValue:opts.cloudflareAiGatewayApiKey,flagName:`--cloudflare-ai-gateway-api-key`,envVar:`CLOUDFLARE_AI_GATEWAY_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setCloudflareAiGatewayConfig(accountId,gatewayId,resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`cloudflare-ai-gateway:default`,provider:`cloudflare-ai-gateway`,mode:`api_key`}),applyCloudflareAiGatewayConfig(nextConfig,{accountId,gatewayId})):null}let applyMoonshotApiKeyChoice=async applyConfig=>{let resolved=await resolveNonInteractiveApiKey({provider:`moonshot`,cfg:baseConfig,flagValue:opts.moonshotApiKey,flagName:`--moonshot-api-key`,envVar:`MOONSHOT_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setMoonshotApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`moonshot:default`,provider:`moonshot`,mode:`api_key`}),applyConfig(nextConfig)):null};if(authChoice===`moonshot-api-key`)return await applyMoonshotApiKeyChoice(applyMoonshotConfig);if(authChoice===`moonshot-api-key-cn`)return await applyMoonshotApiKeyChoice(applyMoonshotConfigCn);if(authChoice===`kimi-code-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`kimi-coding`,cfg:baseConfig,flagValue:opts.kimiCodeApiKey,flagName:`--kimi-code-api-key`,envVar:`KIMI_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setKimiCodingApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`kimi-coding:default`,provider:`kimi-coding`,mode:`api_key`}),applyKimiCodeConfig(nextConfig)):null}if(authChoice===`synthetic-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`synthetic`,cfg:baseConfig,flagValue:opts.syntheticApiKey,flagName:`--synthetic-api-key`,envVar:`SYNTHETIC_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setSyntheticApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`synthetic:default`,provider:`synthetic`,mode:`api_key`}),applySyntheticConfig(nextConfig)):null}if(authChoice===`venice-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`venice`,cfg:baseConfig,flagValue:opts.veniceApiKey,flagName:`--venice-api-key`,envVar:`VENICE_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setVeniceApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`venice:default`,provider:`venice`,mode:`api_key`}),applyVeniceConfig(nextConfig)):null}if(authChoice===`minimax-cloud`||authChoice===`minimax-api`||authChoice===`minimax-api-key-cn`||authChoice===`minimax-api-lightning`){let isCn=authChoice===`minimax-api-key-cn`,providerId=isCn?`minimax-cn`:`minimax`,profileId=`${providerId}:default`,resolved=await resolveNonInteractiveApiKey({provider:providerId,cfg:baseConfig,flagValue:opts.minimaxApiKey,flagName:`--minimax-api-key`,envVar:`MINIMAX_API_KEY`,runtime});if(!resolved)return null;resolved.source!==`profile`&&await setMinimaxApiKey(resolved.key,void 0,profileId),nextConfig=applyAuthProfileConfig(nextConfig,{profileId,provider:providerId,mode:`api_key`});let modelId=authChoice===`minimax-api-lightning`?`MiniMax-M2.5-Lightning`:`MiniMax-M2.5`;return isCn?applyMinimaxApiConfigCn(nextConfig,modelId):applyMinimaxApiConfig(nextConfig,modelId)}if(authChoice===`minimax`)return applyMinimaxConfig(nextConfig);if(authChoice===`opencode-zen`){let resolved=await resolveNonInteractiveApiKey({provider:`opencode`,cfg:baseConfig,flagValue:opts.opencodeZenApiKey,flagName:`--opencode-zen-api-key`,envVar:`OPENCODE_API_KEY (or OPENCODE_ZEN_API_KEY)`,runtime});return resolved?(resolved.source!==`profile`&&await setOpencodeZenApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`opencode:default`,provider:`opencode`,mode:`api_key`}),applyOpencodeZenConfig(nextConfig)):null}if(authChoice===`together-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`together`,cfg:baseConfig,flagValue:opts.togetherApiKey,flagName:`--together-api-key`,envVar:`TOGETHER_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setTogetherApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`together:default`,provider:`together`,mode:`api_key`}),applyTogetherConfig(nextConfig)):null}if(authChoice===`huggingface-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`huggingface`,cfg:baseConfig,flagValue:opts.huggingfaceApiKey,flagName:`--huggingface-api-key`,envVar:`HF_TOKEN`,runtime});return resolved?(resolved.source!==`profile`&&await setHuggingfaceApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`huggingface:default`,provider:`huggingface`,mode:`api_key`}),applyHuggingfaceConfig(nextConfig)):null}if(authChoice===`custom-api-key`)try{let customAuth=parseNonInteractiveCustomApiFlags({baseUrl:opts.customBaseUrl,modelId:opts.customModelId,compatibility:opts.customCompatibility,apiKey:opts.customApiKey,providerId:opts.customProviderId}),resolvedCustomApiKey=await resolveNonInteractiveApiKey({provider:resolveCustomProviderId({config:nextConfig,baseUrl:customAuth.baseUrl,providerId:customAuth.providerId}).providerId,cfg:baseConfig,flagValue:customAuth.apiKey,flagName:`--custom-api-key`,envVar:`CUSTOM_API_KEY`,envVarName:`CUSTOM_API_KEY`,runtime,required:!1}),result=applyCustomApiConfig({config:nextConfig,baseUrl:customAuth.baseUrl,modelId:customAuth.modelId,compatibility:customAuth.compatibility,apiKey:resolvedCustomApiKey?.key,providerId:customAuth.providerId});return result.providerIdRenamedFrom&&result.providerId&&runtime.log(`Custom provider ID "${result.providerIdRenamedFrom}" already exists for a different base URL. Using "${result.providerId}".`),result.config}catch(err){if(err instanceof CustomApiError){switch(err.code){case`missing_required`:case`invalid_compatibility`:runtime.error(err.message);break;default:runtime.error(`Invalid custom provider config: ${err.message}`);break}return runtime.exit(1),null}let reason=err instanceof Error?err.message:String(err);return runtime.error(`Invalid custom provider config: ${reason}`),runtime.exit(1),null}return authChoice===`oauth`||authChoice===`chutes`||authChoice===`openai-codex`||authChoice===`qwen-portal`||authChoice===`minimax-portal`?(runtime.error(`OAuth requires interactive mode.`),runtime.exit(1),null):nextConfig}async function installGatewayDaemonNonInteractive(params){let{opts,runtime,port,gatewayToken}=params;if(!opts.installDaemon)return;let daemonRuntimeRaw=opts.daemonRuntime??DEFAULT_GATEWAY_DAEMON_RUNTIME,systemdAvailable=process.platform===`linux`?await isSystemdUserServiceAvailable():!0;if(process.platform===`linux`&&!systemdAvailable){runtime.log(`Systemd user services are unavailable; skipping service install.`);return}if(!isGatewayDaemonRuntime(daemonRuntimeRaw)){runtime.error(`Invalid --daemon-runtime (use node or bun)`),runtime.exit(1);return}let service=resolveGatewayService(),{programArguments,workingDirectory,environment}=await buildGatewayInstallPlan({env:process.env,port,token:gatewayToken,runtime:daemonRuntimeRaw,warn:message=>runtime.log(message),config:params.nextConfig});try{await service.install({env:process.env,stdout:process.stdout,programArguments,workingDirectory,environment})}catch(err){runtime.error(`Gateway service install failed: ${String(err)}`),runtime.log(gatewayInstallErrorHint());return}await ensureSystemdUserLingerNonInteractive({runtime})}function applyNonInteractiveGatewayConfig(params){let{opts,runtime}=params,hasGatewayPort=opts.gatewayPort!==void 0;if(hasGatewayPort&&(!Number.isFinite(opts.gatewayPort)||(opts.gatewayPort??0)<=0))return runtime.error(`Invalid --gateway-port`),runtime.exit(1),null;let port=hasGatewayPort?opts.gatewayPort:params.defaultPort,bind=opts.gatewayBind??`loopback`,authModeRaw=opts.gatewayAuth??`token`;if(authModeRaw!==`token`&&authModeRaw!==`password`)return runtime.error(`Invalid --gateway-auth (use token|password).`),runtime.exit(1),null;let authMode=authModeRaw,tailscaleMode=opts.tailscale??`off`,tailscaleResetOnExit=!!opts.tailscaleResetOnExit;tailscaleMode!==`off`&&bind!==`loopback`&&(bind=`loopback`),tailscaleMode===`funnel`&&authMode!==`password`&&(authMode=`password`);let nextConfig=params.nextConfig,gatewayToken=opts.gatewayToken?.trim()||void 0;if(authMode===`token`&&(gatewayToken||=randomToken(),nextConfig={...nextConfig,gateway:{...nextConfig.gateway,auth:{...nextConfig.gateway?.auth,mode:`token`,token:gatewayToken}}}),authMode===`password`){let password=opts.gatewayPassword?.trim();if(!password)return runtime.error(`Missing --gateway-password for password auth.`),runtime.exit(1),null;nextConfig={...nextConfig,gateway:{...nextConfig.gateway,auth:{...nextConfig.gateway?.auth,mode:`password`,password}}}}return nextConfig={...nextConfig,gateway:{...nextConfig.gateway,port,bind,tailscale:{...nextConfig.gateway?.tailscale,mode:tailscaleMode,resetOnExit:tailscaleResetOnExit}}},{nextConfig,port,bind,authMode,tailscaleMode,tailscaleResetOnExit,gatewayToken}}function logNonInteractiveOnboardingJson(params){params.opts.json&&params.runtime.log(JSON.stringify({mode:params.mode,workspace:params.workspaceDir,authChoice:params.authChoice,gateway:params.gateway,installDaemon:!!params.installDaemon,daemonRuntime:params.daemonRuntime,skipSkills:!!params.skipSkills,skipHealth:!!params.skipHealth},null,2))}function applyNonInteractiveSkillsConfig(params){let{nextConfig,opts,runtime}=params;if(opts.skipSkills)return nextConfig;let nodeManager=opts.nodeManager??`npm`;return[`npm`,`pnpm`,`bun`].includes(nodeManager)?{...nextConfig,skills:{...nextConfig.skills,install:{...nextConfig.skills?.install,nodeManager}}}:(runtime.error(`Invalid --node-manager (use npm, pnpm, or bun)`),runtime.exit(1),nextConfig)}function resolveNonInteractiveWorkspaceDir(params){return resolveUserPath((params.opts.workspace??params.baseConfig.agents?.defaults?.workspace??params.defaultWorkspaceDir).trim())}async function runNonInteractiveOnboardingLocal(params){let{opts,runtime,baseConfig}=params,mode=`local`,workspaceDir=resolveNonInteractiveWorkspaceDir({opts,baseConfig,defaultWorkspaceDir:DEFAULT_WORKSPACE}),nextConfig=applyOnboardingLocalWorkspaceConfig(baseConfig,workspaceDir),inferredAuthChoice=inferAuthChoiceFromFlags(opts);if(!opts.authChoice&&inferredAuthChoice.matches.length>1){runtime.error([`Multiple API key flags were provided for non-interactive onboarding.`,`Use a single provider flag or pass --auth-choice explicitly.`,`Flags: ${inferredAuthChoice.matches.map(match=>match.label).join(`, `)}`].join(`
7
- `)),runtime.exit(1);return}let authChoice=opts.authChoice??inferredAuthChoice.choice??`builderforcellm`,nextConfigAfterAuth=await applyNonInteractiveAuthChoice({nextConfig,authChoice,opts,runtime,baseConfig});if(!nextConfigAfterAuth)return;nextConfig=nextConfigAfterAuth;let gatewayBasePort=resolveGatewayPort(baseConfig),gatewayResult=applyNonInteractiveGatewayConfig({nextConfig,opts,runtime,defaultPort:gatewayBasePort});if(!gatewayResult)return;nextConfig=gatewayResult.nextConfig,nextConfig=applyNonInteractiveSkillsConfig({nextConfig,opts,runtime}),nextConfig=applyWizardMetadata(nextConfig,{command:`onboard`,mode}),await writeConfigFile(nextConfig),logConfigUpdated(runtime),await ensureWorkspaceAndSessions(workspaceDir,runtime,{skipBootstrap:!!nextConfig.agents?.defaults?.skipBootstrap});let{isBuilderForceAgentsProject,initializeBuilderForceAgentsProject}=await import(`./project-context-PiiAmwVd.js`);await isBuilderForceAgentsProject(workspaceDir)||(await initializeBuilderForceAgentsProject(workspaceDir),runtime.log(`Initialised .builderforce/ project directory`)),await installGatewayDaemonNonInteractive({nextConfig,opts,runtime,port:gatewayResult.port,gatewayToken:gatewayResult.gatewayToken});let daemonRuntimeRaw=opts.daemonRuntime??DEFAULT_GATEWAY_DAEMON_RUNTIME;opts.skipHealth||(await waitForGatewayReachable({url:resolveControlUiLinks({bind:gatewayResult.bind,port:gatewayResult.port,customBindHost:nextConfig.gateway?.customBindHost,basePath:void 0}).wsUrl,token:gatewayResult.gatewayToken,deadlineMs:15e3}),await healthCommand({json:!1,timeoutMs:1e4},runtime)),logNonInteractiveOnboardingJson({opts,runtime,mode,workspaceDir,authChoice,gateway:{port:gatewayResult.port,bind:gatewayResult.bind,authMode:gatewayResult.authMode,tailscaleMode:gatewayResult.tailscaleMode},installDaemon:!!opts.installDaemon,daemonRuntime:opts.installDaemon?daemonRuntimeRaw:void 0,skipSkills:!!opts.skipSkills,skipHealth:!!opts.skipHealth}),opts.json||runtime.log(`Tip: run \`${formatCliCommand(`builderforce configure --section web`)}\` to store your Brave API key for web_search. Docs: https://docs.builderforce.ai/tools/web`)}async function runNonInteractiveOnboardingRemote(params){let{opts,runtime,baseConfig}=params,mode=`remote`,remoteUrl=opts.remoteUrl?.trim();if(!remoteUrl){runtime.error(`Missing --remote-url for remote mode.`),runtime.exit(1);return}let nextConfig={...baseConfig,gateway:{...baseConfig.gateway,mode:`remote`,remote:{url:remoteUrl,token:opts.remoteToken?.trim()||void 0}}};nextConfig=applyWizardMetadata(nextConfig,{command:`onboard`,mode}),await writeConfigFile(nextConfig),logConfigUpdated(runtime);let payload={mode,remoteUrl,auth:opts.remoteToken?`token`:`none`};opts.json?runtime.log(JSON.stringify(payload,null,2)):(runtime.log(`Remote gateway: ${remoteUrl}`),runtime.log(`Auth: ${payload.auth}`),runtime.log(`Tip: run \`${formatCliCommand(`builderforce configure --section web`)}\` to store your Brave API key for web_search. Docs: https://docs.builderforce.ai/tools/web`))}async function runNonInteractiveOnboarding(opts,runtime=defaultRuntime){let snapshot=await readConfigFileSnapshot();if(snapshot.exists&&!snapshot.valid){runtime.error(`Config invalid. Run \`${formatCliCommand(`builderforce doctor`)}\` to repair it, then re-run onboarding.`),runtime.exit(1);return}let baseConfig=snapshot.valid?snapshot.config:{},mode=opts.mode??`local`;if(mode!==`local`&&mode!==`remote`){runtime.error(`Invalid --mode "${String(mode)}" (use local|remote).`),runtime.exit(1);return}if(mode===`remote`){await runNonInteractiveOnboardingRemote({opts,runtime,baseConfig});return}await runNonInteractiveOnboardingLocal({opts,runtime,baseConfig})}async function onboardCommand(opts,runtime=defaultRuntime){assertSupportedRuntime(runtime);let originalAuthChoice=opts.authChoice,normalizedAuthChoice=normalizeLegacyOnboardAuthChoice(originalAuthChoice);if(opts.nonInteractive&&isDeprecatedAuthChoice(originalAuthChoice)){runtime.error([`Auth choice "${String(originalAuthChoice)}" is deprecated.`,`Use "--auth-choice builderforcellm" (recommended default), "--auth-choice token" (Anthropic setup-token), or "--auth-choice openai-codex".`].join(`
7
+ `)),runtime.exit(1);return}let authChoice=opts.authChoice??inferredAuthChoice.choice??`builderforcellm`,nextConfigAfterAuth=await applyNonInteractiveAuthChoice({nextConfig,authChoice,opts,runtime,baseConfig});if(!nextConfigAfterAuth)return;nextConfig=nextConfigAfterAuth;let gatewayBasePort=resolveGatewayPort(baseConfig),gatewayResult=applyNonInteractiveGatewayConfig({nextConfig,opts,runtime,defaultPort:gatewayBasePort});if(!gatewayResult)return;nextConfig=gatewayResult.nextConfig,nextConfig=applyNonInteractiveSkillsConfig({nextConfig,opts,runtime}),nextConfig=applyWizardMetadata(nextConfig,{command:`onboard`,mode}),await writeConfigFile(nextConfig),logConfigUpdated(runtime),await ensureWorkspaceAndSessions(workspaceDir,runtime,{skipBootstrap:!!nextConfig.agents?.defaults?.skipBootstrap});let{isBuilderForceAgentsProject,initializeBuilderForceAgentsProject}=await import(`./project-context-nIzFswHk.js`);await isBuilderForceAgentsProject(workspaceDir)||(await initializeBuilderForceAgentsProject(workspaceDir),runtime.log(`Initialised .builderforce/ project directory`)),await installGatewayDaemonNonInteractive({nextConfig,opts,runtime,port:gatewayResult.port,gatewayToken:gatewayResult.gatewayToken});let daemonRuntimeRaw=opts.daemonRuntime??DEFAULT_GATEWAY_DAEMON_RUNTIME;opts.skipHealth||(await waitForGatewayReachable({url:resolveControlUiLinks({bind:gatewayResult.bind,port:gatewayResult.port,customBindHost:nextConfig.gateway?.customBindHost,basePath:void 0}).wsUrl,token:gatewayResult.gatewayToken,deadlineMs:15e3}),await healthCommand({json:!1,timeoutMs:1e4},runtime)),logNonInteractiveOnboardingJson({opts,runtime,mode,workspaceDir,authChoice,gateway:{port:gatewayResult.port,bind:gatewayResult.bind,authMode:gatewayResult.authMode,tailscaleMode:gatewayResult.tailscaleMode},installDaemon:!!opts.installDaemon,daemonRuntime:opts.installDaemon?daemonRuntimeRaw:void 0,skipSkills:!!opts.skipSkills,skipHealth:!!opts.skipHealth}),opts.json||runtime.log(`Tip: run \`${formatCliCommand(`builderforce configure --section web`)}\` to store your Brave API key for web_search. Docs: https://docs.builderforce.ai/tools/web`)}async function runNonInteractiveOnboardingRemote(params){let{opts,runtime,baseConfig}=params,mode=`remote`,remoteUrl=opts.remoteUrl?.trim();if(!remoteUrl){runtime.error(`Missing --remote-url for remote mode.`),runtime.exit(1);return}let nextConfig={...baseConfig,gateway:{...baseConfig.gateway,mode:`remote`,remote:{url:remoteUrl,token:opts.remoteToken?.trim()||void 0}}};nextConfig=applyWizardMetadata(nextConfig,{command:`onboard`,mode}),await writeConfigFile(nextConfig),logConfigUpdated(runtime);let payload={mode,remoteUrl,auth:opts.remoteToken?`token`:`none`};opts.json?runtime.log(JSON.stringify(payload,null,2)):(runtime.log(`Remote gateway: ${remoteUrl}`),runtime.log(`Auth: ${payload.auth}`),runtime.log(`Tip: run \`${formatCliCommand(`builderforce configure --section web`)}\` to store your Brave API key for web_search. Docs: https://docs.builderforce.ai/tools/web`))}async function runNonInteractiveOnboarding(opts,runtime=defaultRuntime){let snapshot=await readConfigFileSnapshot();if(snapshot.exists&&!snapshot.valid){runtime.error(`Config invalid. Run \`${formatCliCommand(`builderforce doctor`)}\` to repair it, then re-run onboarding.`),runtime.exit(1);return}let baseConfig=snapshot.valid?snapshot.config:{},mode=opts.mode??`local`;if(mode!==`local`&&mode!==`remote`){runtime.error(`Invalid --mode "${String(mode)}" (use local|remote).`),runtime.exit(1);return}if(mode===`remote`){await runNonInteractiveOnboardingRemote({opts,runtime,baseConfig});return}await runNonInteractiveOnboardingLocal({opts,runtime,baseConfig})}async function onboardCommand(opts,runtime=defaultRuntime){assertSupportedRuntime(runtime);let originalAuthChoice=opts.authChoice,normalizedAuthChoice=normalizeLegacyOnboardAuthChoice(originalAuthChoice);if(opts.nonInteractive&&isDeprecatedAuthChoice(originalAuthChoice)){runtime.error([`Auth choice "${String(originalAuthChoice)}" is deprecated.`,`Use "--auth-choice builderforcellm" (recommended default), "--auth-choice token" (Anthropic setup-token), or "--auth-choice openai-codex".`].join(`
8
8
  `)),runtime.exit(1);return}originalAuthChoice===`claude-cli`&&runtime.log(`Auth choice "claude-cli" is deprecated; using setup-token flow instead.`),originalAuthChoice===`codex-cli`&&runtime.log(`Auth choice "codex-cli" is deprecated; using OpenAI Codex OAuth instead.`);let flow=opts.flow===`manual`?`advanced`:opts.flow,normalizedOpts=normalizedAuthChoice===opts.authChoice&&flow===opts.flow?opts:{...opts,authChoice:normalizedAuthChoice,flow};if(normalizedOpts.nonInteractive&&normalizedOpts.acceptRisk!==!0){runtime.error([`Non-interactive onboarding requires explicit risk acknowledgement.`,`Read: https://docs.builderforce.ai/security`,`Re-run with: ${formatCliCommand(`builderforce onboard --non-interactive --accept-risk ...`)}`].join(`
9
9
  `)),runtime.exit(1);return}if(normalizedOpts.reset){let snapshot=await readConfigFileSnapshot(),baseConfig=snapshot.valid?snapshot.config:{};await handleReset(`full`,resolveUserPath(normalizedOpts.workspace??baseConfig.agents?.defaults?.workspace??DEFAULT_WORKSPACE),runtime)}if(process.platform===`win32`&&runtime.log([`Windows detected — BuilderForceAgents runs great on WSL2!`,`Native Windows might be trickier.`,`Quick setup: wsl --install (one command, one reboot)`,`Guide: https://docs.builderforce.ai/windows`].join(`
10
10
  `)),normalizedOpts.nonInteractive){await runNonInteractiveOnboarding(normalizedOpts,runtime);return}await runInteractiveOnboarding(normalizedOpts,runtime)}export{ONBOARD_PROVIDER_AUTH_FLAGS as n,onboardCommand as t};
@@ -1,10 +1,10 @@
1
- import{u as resolveGatewayPort}from"./paths-5FcIFMsj.js";import{C as shortenHomePath,b as resolveUserPath}from"./utils-DbaBVFaK.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import{Et as resolveAuthProfileOrder,Gt as ensureAuthProfileStore,Mt as resolveApiKeyForProfile,Ut as upsertAuthProfile,ct as resolveEnvApiKey,en as normalizeOptionalSecretInput,l as normalizeProviderId,tn as normalizeSecretInput}from"./model-selection-DX_WOc2P.js";import{t as formatCliCommand}from"./command-format-Dd7BgZsg.js";import{a as upsertSharedEnvVar}from"./env-file-BI2jpOmF.js";import{a as readConfigFileSnapshot,c as writeConfigFile,y as parseDurationMs}from"./io-YzT_09GD.js";import{a as ensureWorkspaceAndSessions,b as waitForGatewayReachable,c as handleReset,g as resolveControlUiLinks,m as randomToken,n as applyWizardMetadata,t as DEFAULT_WORKSPACE}from"./onboard-helpers-CPmBeDvt.js";import{t as assertSupportedRuntime}from"./runtime-guard-BiPTd1ED.js";import{a as gatewayInstallErrorHint,i as buildGatewayInstallPlan,r as isGatewayDaemonRuntime,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-CHo7loUb.js";import{r as isSystemdUserServiceAvailable}from"./systemd-CTHIdkg9.js";import{t as resolveGatewayService}from"./service-BXrSjb3e.js";import{r as healthCommand}from"./health-B_qWRpsT.js";import{C as setXaiApiKey,S as setVercelAiGatewayApiKey,T as setZaiApiKey,_ as setOpenrouterApiKey,b as setTogetherApiKey,c as setAnthropicApiKey,d as setHuggingfaceApiKey,f as setKimiCodingApiKey,g as setOpencodeZenApiKey,h as setMoonshotApiKey,l as setCloudflareAiGatewayConfig,m as setMinimaxApiKey,p as setLitellmApiKey,u as setGeminiApiKey,v as setQianfanApiKey,w as setXiaomiApiKey,x as setVeniceApiKey,y as setSyntheticApiKey}from"./onboard-auth.credentials-YrdiGOgn.js";import{A as applyXaiConfig,B as applyVercelAiGatewayConfig,E as applyTogetherConfig,H as applyAgentDefaultModelPrimary,I as applyLitellmConfig,M as applyXiaomiConfig,O as applyVeniceConfig,P as applyZaiConfig,R as applyCloudflareAiGatewayConfig,S as applyQianfanConfig,_ as applyMoonshotConfigCn,a as applyMinimaxApiConfig,b as applyOpenrouterConfig,d as applyAuthProfileConfig,f as applyHuggingfaceConfig,g as applyMoonshotConfig,l as applyMinimaxConfig,m as applyKimiCodeConfig,n as validateAnthropicSetupToken,o as applyMinimaxApiConfigCn,r as applyOpencodeZenConfig,t as buildTokenProfileId,w as applySyntheticConfig}from"./auth-token-CWT7TW8z.js";import{n as logConfigUpdated}from"./logging-9jbJihk2.js";import{n as isDeprecatedAuthChoice,r as normalizeLegacyOnboardAuthChoice}from"./auth-choice-legacy-CSkQvI_z.js";import{i as detectZaiEndpoint,n as applyOpenAIConfig,o as applyGoogleGeminiModelDefault}from"./openai-model-default-DR3m7RLi.js";import{n as ensureSystemdUserLingerNonInteractive}from"./systemd-linger-RhNkOjuf.js";import{a as resolveCustomProviderId,n as applyCustomApiConfig,r as parseNonInteractiveCustomApiFlags,t as CustomApiError}from"./onboard-custom-B3GdG4Gx.js";import{t as runInteractiveOnboarding}from"./onboard-interactive-DyyEDd9a.js";import{t as applyOnboardingLocalWorkspaceConfig}from"./onboard-config-CtCCQvtb.js";const ONBOARD_PROVIDER_AUTH_FLAGS=[{optionKey:`anthropicApiKey`,authChoice:`apiKey`,cliFlag:`--anthropic-api-key`,cliOption:`--anthropic-api-key <key>`,description:`Anthropic API key`},{optionKey:`openaiApiKey`,authChoice:`openai-api-key`,cliFlag:`--openai-api-key`,cliOption:`--openai-api-key <key>`,description:`OpenAI API key`},{optionKey:`openrouterApiKey`,authChoice:`openrouter-api-key`,cliFlag:`--openrouter-api-key`,cliOption:`--openrouter-api-key <key>`,description:`OpenRouter API key`},{optionKey:`aiGatewayApiKey`,authChoice:`ai-gateway-api-key`,cliFlag:`--ai-gateway-api-key`,cliOption:`--ai-gateway-api-key <key>`,description:`Vercel AI Gateway API key`},{optionKey:`cloudflareAiGatewayApiKey`,authChoice:`cloudflare-ai-gateway-api-key`,cliFlag:`--cloudflare-ai-gateway-api-key`,cliOption:`--cloudflare-ai-gateway-api-key <key>`,description:`Cloudflare AI Gateway API key`},{optionKey:`moonshotApiKey`,authChoice:`moonshot-api-key`,cliFlag:`--moonshot-api-key`,cliOption:`--moonshot-api-key <key>`,description:`Moonshot API key`},{optionKey:`kimiCodeApiKey`,authChoice:`kimi-code-api-key`,cliFlag:`--kimi-code-api-key`,cliOption:`--kimi-code-api-key <key>`,description:`Kimi Coding API key`},{optionKey:`geminiApiKey`,authChoice:`gemini-api-key`,cliFlag:`--gemini-api-key`,cliOption:`--gemini-api-key <key>`,description:`Gemini API key`},{optionKey:`zaiApiKey`,authChoice:`zai-api-key`,cliFlag:`--zai-api-key`,cliOption:`--zai-api-key <key>`,description:`Z.AI API key`},{optionKey:`xiaomiApiKey`,authChoice:`xiaomi-api-key`,cliFlag:`--xiaomi-api-key`,cliOption:`--xiaomi-api-key <key>`,description:`Xiaomi API key`},{optionKey:`minimaxApiKey`,authChoice:`minimax-api`,cliFlag:`--minimax-api-key`,cliOption:`--minimax-api-key <key>`,description:`MiniMax API key`},{optionKey:`syntheticApiKey`,authChoice:`synthetic-api-key`,cliFlag:`--synthetic-api-key`,cliOption:`--synthetic-api-key <key>`,description:`Synthetic API key`},{optionKey:`veniceApiKey`,authChoice:`venice-api-key`,cliFlag:`--venice-api-key`,cliOption:`--venice-api-key <key>`,description:`Venice API key`},{optionKey:`togetherApiKey`,authChoice:`together-api-key`,cliFlag:`--together-api-key`,cliOption:`--together-api-key <key>`,description:`Together AI API key`},{optionKey:`huggingfaceApiKey`,authChoice:`huggingface-api-key`,cliFlag:`--huggingface-api-key`,cliOption:`--huggingface-api-key <key>`,description:`Hugging Face API key (HF token)`},{optionKey:`opencodeZenApiKey`,authChoice:`opencode-zen`,cliFlag:`--opencode-zen-api-key`,cliOption:`--opencode-zen-api-key <key>`,description:`OpenCode Zen API key`},{optionKey:`xaiApiKey`,authChoice:`xai-api-key`,cliFlag:`--xai-api-key`,cliOption:`--xai-api-key <key>`,description:`xAI API key`},{optionKey:`litellmApiKey`,authChoice:`litellm-api-key`,cliFlag:`--litellm-api-key`,cliOption:`--litellm-api-key <key>`,description:`LiteLLM API key`},{optionKey:`qianfanApiKey`,authChoice:`qianfan-api-key`,cliFlag:`--qianfan-api-key`,cliOption:`--qianfan-api-key <key>`,description:`QIANFAN API key`}];function hasStringValue(value){return typeof value==`string`?value.trim().length>0:!!value}function inferAuthChoiceFromFlags(opts){let matches=ONBOARD_PROVIDER_AUTH_FLAGS.filter(({optionKey})=>hasStringValue(opts[optionKey])).map(flag=>({optionKey:flag.optionKey,authChoice:flag.authChoice,label:flag.cliFlag}));return(hasStringValue(opts.customBaseUrl)||hasStringValue(opts.customModelId)||hasStringValue(opts.customApiKey))&&matches.push({optionKey:`customBaseUrl`,authChoice:`custom-api-key`,label:`--custom-base-url/--custom-model-id/--custom-api-key`}),{choice:matches[0]?.authChoice,matches}}async function resolveApiKeyFromProfiles(params){let store=await ensureAuthProfileStore(params.agentDir),order=resolveAuthProfileOrder({cfg:params.cfg,store,provider:params.provider});for(let profileId of order){if(store.profiles[profileId]?.type!==`api_key`)continue;let resolved=await resolveApiKeyForProfile({cfg:params.cfg,store,profileId,agentDir:params.agentDir});if(resolved?.apiKey)return resolved.apiKey}return null}async function resolveNonInteractiveApiKey(params){let flagKey=normalizeOptionalSecretInput(params.flagValue);if(flagKey)return{key:flagKey,source:`flag`};let envResolved=resolveEnvApiKey(params.provider);if(envResolved?.apiKey)return{key:envResolved.apiKey,source:`env`};let explicitEnvVar=params.envVarName?.trim();if(explicitEnvVar){let explicitEnvKey=normalizeOptionalSecretInput(process.env[explicitEnvVar]);if(explicitEnvKey)return{key:explicitEnvKey,source:`env`}}if(params.allowProfile??!0){let profileKey=await resolveApiKeyFromProfiles({provider:params.provider,cfg:params.cfg,agentDir:params.agentDir});if(profileKey)return{key:profileKey,source:`profile`}}if(params.required===!1)return null;let profileHint=params.allowProfile===!1?``:`, or existing ${params.provider} API-key profile`;return params.runtime.error(`Missing ${params.flagName} (or ${params.envVar} in env${profileHint}).`),params.runtime.exit(1),null}async function applyNonInteractiveAuthChoice(params){let{authChoice,opts,runtime,baseConfig}=params,nextConfig=params.nextConfig;if(authChoice===`claude-cli`||authChoice===`codex-cli`)return runtime.error([`Auth choice "${authChoice}" is deprecated.`,`Use "--auth-choice builderforcellm" (recommended default), "--auth-choice token" (Anthropic setup-token), or "--auth-choice openai-codex".`].join(`
1
+ import{u as resolveGatewayPort}from"./paths-5FcIFMsj.js";import{C as shortenHomePath,b as resolveUserPath}from"./utils-DbaBVFaK.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import{Et as resolveAuthProfileOrder,Gt as ensureAuthProfileStore,Mt as resolveApiKeyForProfile,Ut as upsertAuthProfile,ct as resolveEnvApiKey,en as normalizeOptionalSecretInput,l as normalizeProviderId,tn as normalizeSecretInput}from"./model-selection-DX_WOc2P.js";import{t as formatCliCommand}from"./command-format-Dd7BgZsg.js";import{a as upsertSharedEnvVar}from"./env-file-BI2jpOmF.js";import{a as readConfigFileSnapshot,c as writeConfigFile,y as parseDurationMs}from"./io-YzT_09GD.js";import{a as ensureWorkspaceAndSessions,b as waitForGatewayReachable,c as handleReset,g as resolveControlUiLinks,m as randomToken,n as applyWizardMetadata,t as DEFAULT_WORKSPACE}from"./onboard-helpers-CPmBeDvt.js";import{t as assertSupportedRuntime}from"./runtime-guard-BiPTd1ED.js";import{a as gatewayInstallErrorHint,i as buildGatewayInstallPlan,r as isGatewayDaemonRuntime,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-CHo7loUb.js";import{r as isSystemdUserServiceAvailable}from"./systemd-CTHIdkg9.js";import{t as resolveGatewayService}from"./service-BXrSjb3e.js";import{r as healthCommand}from"./health-Cuh0tZl2.js";import{C as setXaiApiKey,S as setVercelAiGatewayApiKey,T as setZaiApiKey,_ as setOpenrouterApiKey,b as setTogetherApiKey,c as setAnthropicApiKey,d as setHuggingfaceApiKey,f as setKimiCodingApiKey,g as setOpencodeZenApiKey,h as setMoonshotApiKey,l as setCloudflareAiGatewayConfig,m as setMinimaxApiKey,p as setLitellmApiKey,u as setGeminiApiKey,v as setQianfanApiKey,w as setXiaomiApiKey,x as setVeniceApiKey,y as setSyntheticApiKey}from"./onboard-auth.credentials-YrdiGOgn.js";import{A as applyXaiConfig,B as applyVercelAiGatewayConfig,E as applyTogetherConfig,H as applyAgentDefaultModelPrimary,I as applyLitellmConfig,M as applyXiaomiConfig,O as applyVeniceConfig,P as applyZaiConfig,R as applyCloudflareAiGatewayConfig,S as applyQianfanConfig,_ as applyMoonshotConfigCn,a as applyMinimaxApiConfig,b as applyOpenrouterConfig,d as applyAuthProfileConfig,f as applyHuggingfaceConfig,g as applyMoonshotConfig,l as applyMinimaxConfig,m as applyKimiCodeConfig,n as validateAnthropicSetupToken,o as applyMinimaxApiConfigCn,r as applyOpencodeZenConfig,t as buildTokenProfileId,w as applySyntheticConfig}from"./auth-token-CWT7TW8z.js";import{n as logConfigUpdated}from"./logging-9jbJihk2.js";import{n as isDeprecatedAuthChoice,r as normalizeLegacyOnboardAuthChoice}from"./auth-choice-legacy-CSkQvI_z.js";import{i as detectZaiEndpoint,n as applyOpenAIConfig,o as applyGoogleGeminiModelDefault}from"./openai-model-default-DR3m7RLi.js";import{n as ensureSystemdUserLingerNonInteractive}from"./systemd-linger-RhNkOjuf.js";import{a as resolveCustomProviderId,n as applyCustomApiConfig,r as parseNonInteractiveCustomApiFlags,t as CustomApiError}from"./onboard-custom-B3GdG4Gx.js";import{t as runInteractiveOnboarding}from"./onboard-interactive-D6IBBU8m.js";import{t as applyOnboardingLocalWorkspaceConfig}from"./onboard-config-CtCCQvtb.js";const ONBOARD_PROVIDER_AUTH_FLAGS=[{optionKey:`anthropicApiKey`,authChoice:`apiKey`,cliFlag:`--anthropic-api-key`,cliOption:`--anthropic-api-key <key>`,description:`Anthropic API key`},{optionKey:`openaiApiKey`,authChoice:`openai-api-key`,cliFlag:`--openai-api-key`,cliOption:`--openai-api-key <key>`,description:`OpenAI API key`},{optionKey:`openrouterApiKey`,authChoice:`openrouter-api-key`,cliFlag:`--openrouter-api-key`,cliOption:`--openrouter-api-key <key>`,description:`OpenRouter API key`},{optionKey:`aiGatewayApiKey`,authChoice:`ai-gateway-api-key`,cliFlag:`--ai-gateway-api-key`,cliOption:`--ai-gateway-api-key <key>`,description:`Vercel AI Gateway API key`},{optionKey:`cloudflareAiGatewayApiKey`,authChoice:`cloudflare-ai-gateway-api-key`,cliFlag:`--cloudflare-ai-gateway-api-key`,cliOption:`--cloudflare-ai-gateway-api-key <key>`,description:`Cloudflare AI Gateway API key`},{optionKey:`moonshotApiKey`,authChoice:`moonshot-api-key`,cliFlag:`--moonshot-api-key`,cliOption:`--moonshot-api-key <key>`,description:`Moonshot API key`},{optionKey:`kimiCodeApiKey`,authChoice:`kimi-code-api-key`,cliFlag:`--kimi-code-api-key`,cliOption:`--kimi-code-api-key <key>`,description:`Kimi Coding API key`},{optionKey:`geminiApiKey`,authChoice:`gemini-api-key`,cliFlag:`--gemini-api-key`,cliOption:`--gemini-api-key <key>`,description:`Gemini API key`},{optionKey:`zaiApiKey`,authChoice:`zai-api-key`,cliFlag:`--zai-api-key`,cliOption:`--zai-api-key <key>`,description:`Z.AI API key`},{optionKey:`xiaomiApiKey`,authChoice:`xiaomi-api-key`,cliFlag:`--xiaomi-api-key`,cliOption:`--xiaomi-api-key <key>`,description:`Xiaomi API key`},{optionKey:`minimaxApiKey`,authChoice:`minimax-api`,cliFlag:`--minimax-api-key`,cliOption:`--minimax-api-key <key>`,description:`MiniMax API key`},{optionKey:`syntheticApiKey`,authChoice:`synthetic-api-key`,cliFlag:`--synthetic-api-key`,cliOption:`--synthetic-api-key <key>`,description:`Synthetic API key`},{optionKey:`veniceApiKey`,authChoice:`venice-api-key`,cliFlag:`--venice-api-key`,cliOption:`--venice-api-key <key>`,description:`Venice API key`},{optionKey:`togetherApiKey`,authChoice:`together-api-key`,cliFlag:`--together-api-key`,cliOption:`--together-api-key <key>`,description:`Together AI API key`},{optionKey:`huggingfaceApiKey`,authChoice:`huggingface-api-key`,cliFlag:`--huggingface-api-key`,cliOption:`--huggingface-api-key <key>`,description:`Hugging Face API key (HF token)`},{optionKey:`opencodeZenApiKey`,authChoice:`opencode-zen`,cliFlag:`--opencode-zen-api-key`,cliOption:`--opencode-zen-api-key <key>`,description:`OpenCode Zen API key`},{optionKey:`xaiApiKey`,authChoice:`xai-api-key`,cliFlag:`--xai-api-key`,cliOption:`--xai-api-key <key>`,description:`xAI API key`},{optionKey:`litellmApiKey`,authChoice:`litellm-api-key`,cliFlag:`--litellm-api-key`,cliOption:`--litellm-api-key <key>`,description:`LiteLLM API key`},{optionKey:`qianfanApiKey`,authChoice:`qianfan-api-key`,cliFlag:`--qianfan-api-key`,cliOption:`--qianfan-api-key <key>`,description:`QIANFAN API key`}];function hasStringValue(value){return typeof value==`string`?value.trim().length>0:!!value}function inferAuthChoiceFromFlags(opts){let matches=ONBOARD_PROVIDER_AUTH_FLAGS.filter(({optionKey})=>hasStringValue(opts[optionKey])).map(flag=>({optionKey:flag.optionKey,authChoice:flag.authChoice,label:flag.cliFlag}));return(hasStringValue(opts.customBaseUrl)||hasStringValue(opts.customModelId)||hasStringValue(opts.customApiKey))&&matches.push({optionKey:`customBaseUrl`,authChoice:`custom-api-key`,label:`--custom-base-url/--custom-model-id/--custom-api-key`}),{choice:matches[0]?.authChoice,matches}}async function resolveApiKeyFromProfiles(params){let store=await ensureAuthProfileStore(params.agentDir),order=resolveAuthProfileOrder({cfg:params.cfg,store,provider:params.provider});for(let profileId of order){if(store.profiles[profileId]?.type!==`api_key`)continue;let resolved=await resolveApiKeyForProfile({cfg:params.cfg,store,profileId,agentDir:params.agentDir});if(resolved?.apiKey)return resolved.apiKey}return null}async function resolveNonInteractiveApiKey(params){let flagKey=normalizeOptionalSecretInput(params.flagValue);if(flagKey)return{key:flagKey,source:`flag`};let envResolved=resolveEnvApiKey(params.provider);if(envResolved?.apiKey)return{key:envResolved.apiKey,source:`env`};let explicitEnvVar=params.envVarName?.trim();if(explicitEnvVar){let explicitEnvKey=normalizeOptionalSecretInput(process.env[explicitEnvVar]);if(explicitEnvKey)return{key:explicitEnvKey,source:`env`}}if(params.allowProfile??!0){let profileKey=await resolveApiKeyFromProfiles({provider:params.provider,cfg:params.cfg,agentDir:params.agentDir});if(profileKey)return{key:profileKey,source:`profile`}}if(params.required===!1)return null;let profileHint=params.allowProfile===!1?``:`, or existing ${params.provider} API-key profile`;return params.runtime.error(`Missing ${params.flagName} (or ${params.envVar} in env${profileHint}).`),params.runtime.exit(1),null}async function applyNonInteractiveAuthChoice(params){let{authChoice,opts,runtime,baseConfig}=params,nextConfig=params.nextConfig;if(authChoice===`claude-cli`||authChoice===`codex-cli`)return runtime.error([`Auth choice "${authChoice}" is deprecated.`,`Use "--auth-choice builderforcellm" (recommended default), "--auth-choice token" (Anthropic setup-token), or "--auth-choice openai-codex".`].join(`
2
2
  `)),runtime.exit(1),null;if(authChoice===`setup-token`)return runtime.error([`Auth choice "setup-token" requires interactive mode.`,`Use "--auth-choice token" with --token and --token-provider anthropic.`].join(`
3
3
  `)),runtime.exit(1),null;if(authChoice===`local`)return runtime.error([`Auth choice "local" requires interactive mode.`,`Use interactive onboard/configure for guided local Ollama or llama.cpp/vLLM setup.`].join(`
4
4
  `)),runtime.exit(1),null;if(authChoice===`vllm`)return runtime.error([`Auth choice "vllm" requires interactive mode.`,`Use interactive onboard/configure to enter base URL, API key, and model ID.`].join(`
5
5
  `)),runtime.exit(1),null;if(authChoice===`builderforcellm`)return runtime.log(`Using default BuilderForceAgentsLLM provider (builderforcellm/auto).`),applyAgentDefaultModelPrimary(nextConfig,`builderforcellm/auto`);if(authChoice===`apiKey`){let resolved=await resolveNonInteractiveApiKey({provider:`anthropic`,cfg:baseConfig,flagValue:opts.anthropicApiKey,flagName:`--anthropic-api-key`,envVar:`ANTHROPIC_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setAnthropicApiKey(resolved.key),applyAuthProfileConfig(nextConfig,{profileId:`anthropic:default`,provider:`anthropic`,mode:`api_key`})):null}if(authChoice===`token`){let providerRaw=opts.tokenProvider?.trim();if(!providerRaw)return runtime.error(`Missing --token-provider for --auth-choice token.`),runtime.exit(1),null;let provider=normalizeProviderId(providerRaw);if(provider!==`anthropic`)return runtime.error(`Only --token-provider anthropic is supported for --auth-choice token.`),runtime.exit(1),null;let tokenRaw=normalizeSecretInput(opts.token);if(!tokenRaw)return runtime.error(`Missing --token for --auth-choice token.`),runtime.exit(1),null;let tokenError=validateAnthropicSetupToken(tokenRaw);if(tokenError)return runtime.error(tokenError),runtime.exit(1),null;let expires,expiresInRaw=opts.tokenExpiresIn?.trim();if(expiresInRaw)try{expires=Date.now()+parseDurationMs(expiresInRaw,{defaultUnit:`d`})}catch(err){return runtime.error(`Invalid --token-expires-in: ${String(err)}`),runtime.exit(1),null}let profileId=opts.tokenProfileId?.trim()||buildTokenProfileId({provider,name:``});return upsertAuthProfile({profileId,credential:{type:`token`,provider,token:tokenRaw.trim(),...expires?{expires}:{}}}),applyAuthProfileConfig(nextConfig,{profileId,provider,mode:`token`})}if(authChoice===`gemini-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`google`,cfg:baseConfig,flagValue:opts.geminiApiKey,flagName:`--gemini-api-key`,envVar:`GEMINI_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setGeminiApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`google:default`,provider:`google`,mode:`api_key`}),applyGoogleGeminiModelDefault(nextConfig).next):null}if(authChoice===`zai-api-key`||authChoice===`zai-coding-global`||authChoice===`zai-coding-cn`||authChoice===`zai-global`||authChoice===`zai-cn`){let resolved=await resolveNonInteractiveApiKey({provider:`zai`,cfg:baseConfig,flagValue:opts.zaiApiKey,flagName:`--zai-api-key`,envVar:`ZAI_API_KEY`,runtime});if(!resolved)return null;resolved.source!==`profile`&&await setZaiApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`zai:default`,provider:`zai`,mode:`api_key`});let endpoint,modelIdOverride;if(authChoice===`zai-coding-global`)endpoint=`coding-global`;else if(authChoice===`zai-coding-cn`)endpoint=`coding-cn`;else if(authChoice===`zai-global`)endpoint=`global`;else if(authChoice===`zai-cn`)endpoint=`cn`;else{let detected=await detectZaiEndpoint({apiKey:resolved.key});detected?(endpoint=detected.endpoint,modelIdOverride=detected.modelId):endpoint=`global`}return applyZaiConfig(nextConfig,{endpoint,...modelIdOverride?{modelId:modelIdOverride}:{}})}if(authChoice===`xiaomi-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`xiaomi`,cfg:baseConfig,flagValue:opts.xiaomiApiKey,flagName:`--xiaomi-api-key`,envVar:`XIAOMI_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setXiaomiApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`xiaomi:default`,provider:`xiaomi`,mode:`api_key`}),applyXiaomiConfig(nextConfig)):null}if(authChoice===`xai-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`xai`,cfg:baseConfig,flagValue:opts.xaiApiKey,flagName:`--xai-api-key`,envVar:`XAI_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setXaiApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`xai:default`,provider:`xai`,mode:`api_key`}),applyXaiConfig(nextConfig)):null}if(authChoice===`qianfan-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`qianfan`,cfg:baseConfig,flagValue:opts.qianfanApiKey,flagName:`--qianfan-api-key`,envVar:`QIANFAN_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setQianfanApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`qianfan:default`,provider:`qianfan`,mode:`api_key`}),applyQianfanConfig(nextConfig)):null}if(authChoice===`openai-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`openai`,cfg:baseConfig,flagValue:opts.openaiApiKey,flagName:`--openai-api-key`,envVar:`OPENAI_API_KEY`,runtime,allowProfile:!1});if(!resolved)return null;let key=resolved.key,result=upsertSharedEnvVar({key:`OPENAI_API_KEY`,value:key});return process.env.OPENAI_API_KEY=key,runtime.log(`Saved OPENAI_API_KEY to ${shortenHomePath(result.path)}`),applyOpenAIConfig(nextConfig)}if(authChoice===`openrouter-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`openrouter`,cfg:baseConfig,flagValue:opts.openrouterApiKey,flagName:`--openrouter-api-key`,envVar:`OPENROUTER_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setOpenrouterApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`openrouter:default`,provider:`openrouter`,mode:`api_key`}),applyOpenrouterConfig(nextConfig)):null}if(authChoice===`litellm-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`litellm`,cfg:baseConfig,flagValue:opts.litellmApiKey,flagName:`--litellm-api-key`,envVar:`LITELLM_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setLitellmApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`litellm:default`,provider:`litellm`,mode:`api_key`}),applyLitellmConfig(nextConfig)):null}if(authChoice===`ai-gateway-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`vercel-ai-gateway`,cfg:baseConfig,flagValue:opts.aiGatewayApiKey,flagName:`--ai-gateway-api-key`,envVar:`AI_GATEWAY_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setVercelAiGatewayApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`vercel-ai-gateway:default`,provider:`vercel-ai-gateway`,mode:`api_key`}),applyVercelAiGatewayConfig(nextConfig)):null}if(authChoice===`cloudflare-ai-gateway-api-key`){let accountId=opts.cloudflareAiGatewayAccountId?.trim()??``,gatewayId=opts.cloudflareAiGatewayGatewayId?.trim()??``;if(!accountId||!gatewayId)return runtime.error([`Auth choice "cloudflare-ai-gateway-api-key" requires Account ID and Gateway ID.`,`Use --cloudflare-ai-gateway-account-id and --cloudflare-ai-gateway-gateway-id.`].join(`
6
6
  `)),runtime.exit(1),null;let resolved=await resolveNonInteractiveApiKey({provider:`cloudflare-ai-gateway`,cfg:baseConfig,flagValue:opts.cloudflareAiGatewayApiKey,flagName:`--cloudflare-ai-gateway-api-key`,envVar:`CLOUDFLARE_AI_GATEWAY_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setCloudflareAiGatewayConfig(accountId,gatewayId,resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`cloudflare-ai-gateway:default`,provider:`cloudflare-ai-gateway`,mode:`api_key`}),applyCloudflareAiGatewayConfig(nextConfig,{accountId,gatewayId})):null}let applyMoonshotApiKeyChoice=async applyConfig=>{let resolved=await resolveNonInteractiveApiKey({provider:`moonshot`,cfg:baseConfig,flagValue:opts.moonshotApiKey,flagName:`--moonshot-api-key`,envVar:`MOONSHOT_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setMoonshotApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`moonshot:default`,provider:`moonshot`,mode:`api_key`}),applyConfig(nextConfig)):null};if(authChoice===`moonshot-api-key`)return await applyMoonshotApiKeyChoice(applyMoonshotConfig);if(authChoice===`moonshot-api-key-cn`)return await applyMoonshotApiKeyChoice(applyMoonshotConfigCn);if(authChoice===`kimi-code-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`kimi-coding`,cfg:baseConfig,flagValue:opts.kimiCodeApiKey,flagName:`--kimi-code-api-key`,envVar:`KIMI_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setKimiCodingApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`kimi-coding:default`,provider:`kimi-coding`,mode:`api_key`}),applyKimiCodeConfig(nextConfig)):null}if(authChoice===`synthetic-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`synthetic`,cfg:baseConfig,flagValue:opts.syntheticApiKey,flagName:`--synthetic-api-key`,envVar:`SYNTHETIC_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setSyntheticApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`synthetic:default`,provider:`synthetic`,mode:`api_key`}),applySyntheticConfig(nextConfig)):null}if(authChoice===`venice-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`venice`,cfg:baseConfig,flagValue:opts.veniceApiKey,flagName:`--venice-api-key`,envVar:`VENICE_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setVeniceApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`venice:default`,provider:`venice`,mode:`api_key`}),applyVeniceConfig(nextConfig)):null}if(authChoice===`minimax-cloud`||authChoice===`minimax-api`||authChoice===`minimax-api-key-cn`||authChoice===`minimax-api-lightning`){let isCn=authChoice===`minimax-api-key-cn`,providerId=isCn?`minimax-cn`:`minimax`,profileId=`${providerId}:default`,resolved=await resolveNonInteractiveApiKey({provider:providerId,cfg:baseConfig,flagValue:opts.minimaxApiKey,flagName:`--minimax-api-key`,envVar:`MINIMAX_API_KEY`,runtime});if(!resolved)return null;resolved.source!==`profile`&&await setMinimaxApiKey(resolved.key,void 0,profileId),nextConfig=applyAuthProfileConfig(nextConfig,{profileId,provider:providerId,mode:`api_key`});let modelId=authChoice===`minimax-api-lightning`?`MiniMax-M2.5-Lightning`:`MiniMax-M2.5`;return isCn?applyMinimaxApiConfigCn(nextConfig,modelId):applyMinimaxApiConfig(nextConfig,modelId)}if(authChoice===`minimax`)return applyMinimaxConfig(nextConfig);if(authChoice===`opencode-zen`){let resolved=await resolveNonInteractiveApiKey({provider:`opencode`,cfg:baseConfig,flagValue:opts.opencodeZenApiKey,flagName:`--opencode-zen-api-key`,envVar:`OPENCODE_API_KEY (or OPENCODE_ZEN_API_KEY)`,runtime});return resolved?(resolved.source!==`profile`&&await setOpencodeZenApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`opencode:default`,provider:`opencode`,mode:`api_key`}),applyOpencodeZenConfig(nextConfig)):null}if(authChoice===`together-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`together`,cfg:baseConfig,flagValue:opts.togetherApiKey,flagName:`--together-api-key`,envVar:`TOGETHER_API_KEY`,runtime});return resolved?(resolved.source!==`profile`&&await setTogetherApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`together:default`,provider:`together`,mode:`api_key`}),applyTogetherConfig(nextConfig)):null}if(authChoice===`huggingface-api-key`){let resolved=await resolveNonInteractiveApiKey({provider:`huggingface`,cfg:baseConfig,flagValue:opts.huggingfaceApiKey,flagName:`--huggingface-api-key`,envVar:`HF_TOKEN`,runtime});return resolved?(resolved.source!==`profile`&&await setHuggingfaceApiKey(resolved.key),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`huggingface:default`,provider:`huggingface`,mode:`api_key`}),applyHuggingfaceConfig(nextConfig)):null}if(authChoice===`custom-api-key`)try{let customAuth=parseNonInteractiveCustomApiFlags({baseUrl:opts.customBaseUrl,modelId:opts.customModelId,compatibility:opts.customCompatibility,apiKey:opts.customApiKey,providerId:opts.customProviderId}),resolvedCustomApiKey=await resolveNonInteractiveApiKey({provider:resolveCustomProviderId({config:nextConfig,baseUrl:customAuth.baseUrl,providerId:customAuth.providerId}).providerId,cfg:baseConfig,flagValue:customAuth.apiKey,flagName:`--custom-api-key`,envVar:`CUSTOM_API_KEY`,envVarName:`CUSTOM_API_KEY`,runtime,required:!1}),result=applyCustomApiConfig({config:nextConfig,baseUrl:customAuth.baseUrl,modelId:customAuth.modelId,compatibility:customAuth.compatibility,apiKey:resolvedCustomApiKey?.key,providerId:customAuth.providerId});return result.providerIdRenamedFrom&&result.providerId&&runtime.log(`Custom provider ID "${result.providerIdRenamedFrom}" already exists for a different base URL. Using "${result.providerId}".`),result.config}catch(err){if(err instanceof CustomApiError){switch(err.code){case`missing_required`:case`invalid_compatibility`:runtime.error(err.message);break;default:runtime.error(`Invalid custom provider config: ${err.message}`);break}return runtime.exit(1),null}let reason=err instanceof Error?err.message:String(err);return runtime.error(`Invalid custom provider config: ${reason}`),runtime.exit(1),null}return authChoice===`oauth`||authChoice===`chutes`||authChoice===`openai-codex`||authChoice===`qwen-portal`||authChoice===`minimax-portal`?(runtime.error(`OAuth requires interactive mode.`),runtime.exit(1),null):nextConfig}async function installGatewayDaemonNonInteractive(params){let{opts,runtime,port,gatewayToken}=params;if(!opts.installDaemon)return;let daemonRuntimeRaw=opts.daemonRuntime??DEFAULT_GATEWAY_DAEMON_RUNTIME,systemdAvailable=process.platform===`linux`?await isSystemdUserServiceAvailable():!0;if(process.platform===`linux`&&!systemdAvailable){runtime.log(`Systemd user services are unavailable; skipping service install.`);return}if(!isGatewayDaemonRuntime(daemonRuntimeRaw)){runtime.error(`Invalid --daemon-runtime (use node or bun)`),runtime.exit(1);return}let service=resolveGatewayService(),{programArguments,workingDirectory,environment}=await buildGatewayInstallPlan({env:process.env,port,token:gatewayToken,runtime:daemonRuntimeRaw,warn:message=>runtime.log(message),config:params.nextConfig});try{await service.install({env:process.env,stdout:process.stdout,programArguments,workingDirectory,environment})}catch(err){runtime.error(`Gateway service install failed: ${String(err)}`),runtime.log(gatewayInstallErrorHint());return}await ensureSystemdUserLingerNonInteractive({runtime})}function applyNonInteractiveGatewayConfig(params){let{opts,runtime}=params,hasGatewayPort=opts.gatewayPort!==void 0;if(hasGatewayPort&&(!Number.isFinite(opts.gatewayPort)||(opts.gatewayPort??0)<=0))return runtime.error(`Invalid --gateway-port`),runtime.exit(1),null;let port=hasGatewayPort?opts.gatewayPort:params.defaultPort,bind=opts.gatewayBind??`loopback`,authModeRaw=opts.gatewayAuth??`token`;if(authModeRaw!==`token`&&authModeRaw!==`password`)return runtime.error(`Invalid --gateway-auth (use token|password).`),runtime.exit(1),null;let authMode=authModeRaw,tailscaleMode=opts.tailscale??`off`,tailscaleResetOnExit=!!opts.tailscaleResetOnExit;tailscaleMode!==`off`&&bind!==`loopback`&&(bind=`loopback`),tailscaleMode===`funnel`&&authMode!==`password`&&(authMode=`password`);let nextConfig=params.nextConfig,gatewayToken=opts.gatewayToken?.trim()||void 0;if(authMode===`token`&&(gatewayToken||=randomToken(),nextConfig={...nextConfig,gateway:{...nextConfig.gateway,auth:{...nextConfig.gateway?.auth,mode:`token`,token:gatewayToken}}}),authMode===`password`){let password=opts.gatewayPassword?.trim();if(!password)return runtime.error(`Missing --gateway-password for password auth.`),runtime.exit(1),null;nextConfig={...nextConfig,gateway:{...nextConfig.gateway,auth:{...nextConfig.gateway?.auth,mode:`password`,password}}}}return nextConfig={...nextConfig,gateway:{...nextConfig.gateway,port,bind,tailscale:{...nextConfig.gateway?.tailscale,mode:tailscaleMode,resetOnExit:tailscaleResetOnExit}}},{nextConfig,port,bind,authMode,tailscaleMode,tailscaleResetOnExit,gatewayToken}}function logNonInteractiveOnboardingJson(params){params.opts.json&&params.runtime.log(JSON.stringify({mode:params.mode,workspace:params.workspaceDir,authChoice:params.authChoice,gateway:params.gateway,installDaemon:!!params.installDaemon,daemonRuntime:params.daemonRuntime,skipSkills:!!params.skipSkills,skipHealth:!!params.skipHealth},null,2))}function applyNonInteractiveSkillsConfig(params){let{nextConfig,opts,runtime}=params;if(opts.skipSkills)return nextConfig;let nodeManager=opts.nodeManager??`npm`;return[`npm`,`pnpm`,`bun`].includes(nodeManager)?{...nextConfig,skills:{...nextConfig.skills,install:{...nextConfig.skills?.install,nodeManager}}}:(runtime.error(`Invalid --node-manager (use npm, pnpm, or bun)`),runtime.exit(1),nextConfig)}function resolveNonInteractiveWorkspaceDir(params){return resolveUserPath((params.opts.workspace??params.baseConfig.agents?.defaults?.workspace??params.defaultWorkspaceDir).trim())}async function runNonInteractiveOnboardingLocal(params){let{opts,runtime,baseConfig}=params,mode=`local`,workspaceDir=resolveNonInteractiveWorkspaceDir({opts,baseConfig,defaultWorkspaceDir:DEFAULT_WORKSPACE}),nextConfig=applyOnboardingLocalWorkspaceConfig(baseConfig,workspaceDir),inferredAuthChoice=inferAuthChoiceFromFlags(opts);if(!opts.authChoice&&inferredAuthChoice.matches.length>1){runtime.error([`Multiple API key flags were provided for non-interactive onboarding.`,`Use a single provider flag or pass --auth-choice explicitly.`,`Flags: ${inferredAuthChoice.matches.map(match=>match.label).join(`, `)}`].join(`
7
- `)),runtime.exit(1);return}let authChoice=opts.authChoice??inferredAuthChoice.choice??`builderforcellm`,nextConfigAfterAuth=await applyNonInteractiveAuthChoice({nextConfig,authChoice,opts,runtime,baseConfig});if(!nextConfigAfterAuth)return;nextConfig=nextConfigAfterAuth;let gatewayBasePort=resolveGatewayPort(baseConfig),gatewayResult=applyNonInteractiveGatewayConfig({nextConfig,opts,runtime,defaultPort:gatewayBasePort});if(!gatewayResult)return;nextConfig=gatewayResult.nextConfig,nextConfig=applyNonInteractiveSkillsConfig({nextConfig,opts,runtime}),nextConfig=applyWizardMetadata(nextConfig,{command:`onboard`,mode}),await writeConfigFile(nextConfig),logConfigUpdated(runtime),await ensureWorkspaceAndSessions(workspaceDir,runtime,{skipBootstrap:!!nextConfig.agents?.defaults?.skipBootstrap});let{isBuilderForceAgentsProject,initializeBuilderForceAgentsProject}=await import(`./project-context-DS52UwJZ.js`);await isBuilderForceAgentsProject(workspaceDir)||(await initializeBuilderForceAgentsProject(workspaceDir),runtime.log(`Initialised .builderforce/ project directory`)),await installGatewayDaemonNonInteractive({nextConfig,opts,runtime,port:gatewayResult.port,gatewayToken:gatewayResult.gatewayToken});let daemonRuntimeRaw=opts.daemonRuntime??DEFAULT_GATEWAY_DAEMON_RUNTIME;opts.skipHealth||(await waitForGatewayReachable({url:resolveControlUiLinks({bind:gatewayResult.bind,port:gatewayResult.port,customBindHost:nextConfig.gateway?.customBindHost,basePath:void 0}).wsUrl,token:gatewayResult.gatewayToken,deadlineMs:15e3}),await healthCommand({json:!1,timeoutMs:1e4},runtime)),logNonInteractiveOnboardingJson({opts,runtime,mode,workspaceDir,authChoice,gateway:{port:gatewayResult.port,bind:gatewayResult.bind,authMode:gatewayResult.authMode,tailscaleMode:gatewayResult.tailscaleMode},installDaemon:!!opts.installDaemon,daemonRuntime:opts.installDaemon?daemonRuntimeRaw:void 0,skipSkills:!!opts.skipSkills,skipHealth:!!opts.skipHealth}),opts.json||runtime.log(`Tip: run \`${formatCliCommand(`builderforce configure --section web`)}\` to store your Brave API key for web_search. Docs: https://docs.builderforce.ai/tools/web`)}async function runNonInteractiveOnboardingRemote(params){let{opts,runtime,baseConfig}=params,mode=`remote`,remoteUrl=opts.remoteUrl?.trim();if(!remoteUrl){runtime.error(`Missing --remote-url for remote mode.`),runtime.exit(1);return}let nextConfig={...baseConfig,gateway:{...baseConfig.gateway,mode:`remote`,remote:{url:remoteUrl,token:opts.remoteToken?.trim()||void 0}}};nextConfig=applyWizardMetadata(nextConfig,{command:`onboard`,mode}),await writeConfigFile(nextConfig),logConfigUpdated(runtime);let payload={mode,remoteUrl,auth:opts.remoteToken?`token`:`none`};opts.json?runtime.log(JSON.stringify(payload,null,2)):(runtime.log(`Remote gateway: ${remoteUrl}`),runtime.log(`Auth: ${payload.auth}`),runtime.log(`Tip: run \`${formatCliCommand(`builderforce configure --section web`)}\` to store your Brave API key for web_search. Docs: https://docs.builderforce.ai/tools/web`))}async function runNonInteractiveOnboarding(opts,runtime=defaultRuntime){let snapshot=await readConfigFileSnapshot();if(snapshot.exists&&!snapshot.valid){runtime.error(`Config invalid. Run \`${formatCliCommand(`builderforce doctor`)}\` to repair it, then re-run onboarding.`),runtime.exit(1);return}let baseConfig=snapshot.valid?snapshot.config:{},mode=opts.mode??`local`;if(mode!==`local`&&mode!==`remote`){runtime.error(`Invalid --mode "${String(mode)}" (use local|remote).`),runtime.exit(1);return}if(mode===`remote`){await runNonInteractiveOnboardingRemote({opts,runtime,baseConfig});return}await runNonInteractiveOnboardingLocal({opts,runtime,baseConfig})}async function onboardCommand(opts,runtime=defaultRuntime){assertSupportedRuntime(runtime);let originalAuthChoice=opts.authChoice,normalizedAuthChoice=normalizeLegacyOnboardAuthChoice(originalAuthChoice);if(opts.nonInteractive&&isDeprecatedAuthChoice(originalAuthChoice)){runtime.error([`Auth choice "${String(originalAuthChoice)}" is deprecated.`,`Use "--auth-choice builderforcellm" (recommended default), "--auth-choice token" (Anthropic setup-token), or "--auth-choice openai-codex".`].join(`
7
+ `)),runtime.exit(1);return}let authChoice=opts.authChoice??inferredAuthChoice.choice??`builderforcellm`,nextConfigAfterAuth=await applyNonInteractiveAuthChoice({nextConfig,authChoice,opts,runtime,baseConfig});if(!nextConfigAfterAuth)return;nextConfig=nextConfigAfterAuth;let gatewayBasePort=resolveGatewayPort(baseConfig),gatewayResult=applyNonInteractiveGatewayConfig({nextConfig,opts,runtime,defaultPort:gatewayBasePort});if(!gatewayResult)return;nextConfig=gatewayResult.nextConfig,nextConfig=applyNonInteractiveSkillsConfig({nextConfig,opts,runtime}),nextConfig=applyWizardMetadata(nextConfig,{command:`onboard`,mode}),await writeConfigFile(nextConfig),logConfigUpdated(runtime),await ensureWorkspaceAndSessions(workspaceDir,runtime,{skipBootstrap:!!nextConfig.agents?.defaults?.skipBootstrap});let{isBuilderForceAgentsProject,initializeBuilderForceAgentsProject}=await import(`./project-context-DbBD_r4v.js`);await isBuilderForceAgentsProject(workspaceDir)||(await initializeBuilderForceAgentsProject(workspaceDir),runtime.log(`Initialised .builderforce/ project directory`)),await installGatewayDaemonNonInteractive({nextConfig,opts,runtime,port:gatewayResult.port,gatewayToken:gatewayResult.gatewayToken});let daemonRuntimeRaw=opts.daemonRuntime??DEFAULT_GATEWAY_DAEMON_RUNTIME;opts.skipHealth||(await waitForGatewayReachable({url:resolveControlUiLinks({bind:gatewayResult.bind,port:gatewayResult.port,customBindHost:nextConfig.gateway?.customBindHost,basePath:void 0}).wsUrl,token:gatewayResult.gatewayToken,deadlineMs:15e3}),await healthCommand({json:!1,timeoutMs:1e4},runtime)),logNonInteractiveOnboardingJson({opts,runtime,mode,workspaceDir,authChoice,gateway:{port:gatewayResult.port,bind:gatewayResult.bind,authMode:gatewayResult.authMode,tailscaleMode:gatewayResult.tailscaleMode},installDaemon:!!opts.installDaemon,daemonRuntime:opts.installDaemon?daemonRuntimeRaw:void 0,skipSkills:!!opts.skipSkills,skipHealth:!!opts.skipHealth}),opts.json||runtime.log(`Tip: run \`${formatCliCommand(`builderforce configure --section web`)}\` to store your Brave API key for web_search. Docs: https://docs.builderforce.ai/tools/web`)}async function runNonInteractiveOnboardingRemote(params){let{opts,runtime,baseConfig}=params,mode=`remote`,remoteUrl=opts.remoteUrl?.trim();if(!remoteUrl){runtime.error(`Missing --remote-url for remote mode.`),runtime.exit(1);return}let nextConfig={...baseConfig,gateway:{...baseConfig.gateway,mode:`remote`,remote:{url:remoteUrl,token:opts.remoteToken?.trim()||void 0}}};nextConfig=applyWizardMetadata(nextConfig,{command:`onboard`,mode}),await writeConfigFile(nextConfig),logConfigUpdated(runtime);let payload={mode,remoteUrl,auth:opts.remoteToken?`token`:`none`};opts.json?runtime.log(JSON.stringify(payload,null,2)):(runtime.log(`Remote gateway: ${remoteUrl}`),runtime.log(`Auth: ${payload.auth}`),runtime.log(`Tip: run \`${formatCliCommand(`builderforce configure --section web`)}\` to store your Brave API key for web_search. Docs: https://docs.builderforce.ai/tools/web`))}async function runNonInteractiveOnboarding(opts,runtime=defaultRuntime){let snapshot=await readConfigFileSnapshot();if(snapshot.exists&&!snapshot.valid){runtime.error(`Config invalid. Run \`${formatCliCommand(`builderforce doctor`)}\` to repair it, then re-run onboarding.`),runtime.exit(1);return}let baseConfig=snapshot.valid?snapshot.config:{},mode=opts.mode??`local`;if(mode!==`local`&&mode!==`remote`){runtime.error(`Invalid --mode "${String(mode)}" (use local|remote).`),runtime.exit(1);return}if(mode===`remote`){await runNonInteractiveOnboardingRemote({opts,runtime,baseConfig});return}await runNonInteractiveOnboardingLocal({opts,runtime,baseConfig})}async function onboardCommand(opts,runtime=defaultRuntime){assertSupportedRuntime(runtime);let originalAuthChoice=opts.authChoice,normalizedAuthChoice=normalizeLegacyOnboardAuthChoice(originalAuthChoice);if(opts.nonInteractive&&isDeprecatedAuthChoice(originalAuthChoice)){runtime.error([`Auth choice "${String(originalAuthChoice)}" is deprecated.`,`Use "--auth-choice builderforcellm" (recommended default), "--auth-choice token" (Anthropic setup-token), or "--auth-choice openai-codex".`].join(`
8
8
  `)),runtime.exit(1);return}originalAuthChoice===`claude-cli`&&runtime.log(`Auth choice "claude-cli" is deprecated; using setup-token flow instead.`),originalAuthChoice===`codex-cli`&&runtime.log(`Auth choice "codex-cli" is deprecated; using OpenAI Codex OAuth instead.`);let flow=opts.flow===`manual`?`advanced`:opts.flow,normalizedOpts=normalizedAuthChoice===opts.authChoice&&flow===opts.flow?opts:{...opts,authChoice:normalizedAuthChoice,flow};if(normalizedOpts.nonInteractive&&normalizedOpts.acceptRisk!==!0){runtime.error([`Non-interactive onboarding requires explicit risk acknowledgement.`,`Read: https://docs.builderforce.ai/security`,`Re-run with: ${formatCliCommand(`builderforce onboard --non-interactive --accept-risk ...`)}`].join(`
9
9
  `)),runtime.exit(1);return}if(normalizedOpts.reset){let snapshot=await readConfigFileSnapshot(),baseConfig=snapshot.valid?snapshot.config:{};await handleReset(`full`,resolveUserPath(normalizedOpts.workspace??baseConfig.agents?.defaults?.workspace??DEFAULT_WORKSPACE),runtime)}if(process.platform===`win32`&&runtime.log([`Windows detected — BuilderForceAgents runs great on WSL2!`,`Native Windows might be trickier.`,`Quick setup: wsl --install (one command, one reboot)`,`Guide: https://docs.builderforce.ai/windows`].join(`
10
10
  `)),normalizedOpts.nonInteractive){await runNonInteractiveOnboarding(normalizedOpts,runtime);return}await runInteractiveOnboarding(normalizedOpts,runtime)}export{ONBOARD_PROVIDER_AUTH_FLAGS as n,onboardCommand as t};
@@ -1 +1 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-BARnVAUE.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./model-discovery-DxpimsRF.js";import"./model-catalog-wcISK04b.js";import"./frontmatter-DgRc5y_l.js";import"./skills-W00EPvKR.js";import"./plugin-skills-BSUncenp.js";import"./refresh-bgGvF0aF.js";import"./client-DeQ0LbP9.js";import"./call-CjC3SRPv.js";import"./message-channel-C-yw5fZm.js";import"./subagent-registry-oB_F2U2W.js";import"./sessions-ko0LxxGk.js";import"./src-BRo9ywDM.js";import"./project-context-store-ClFt-YDL.js";import"./tokens-BNwTTeJb.js";import"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import"./send-gG3CFJwv.js";import"./send-DqJCViFb.js";import"./with-timeout-By0c7Ur9.js";import"./deliver-Bs-FVPQ4.js";import"./accounts-DoJYLMfS.js";import"./send-mCN63Hkn.js";import"./image-ops-Bg9yFwjX.js";import"./redact-bWj_-q3j.js";import"./errors-t5wHPcwh.js";import"./embedded-helpers-Q5h1lA6D.js";import"./sandbox-BcH7kS1y.js";import"./chrome-IJYO1tSE.js";import"./tailscale-CgCG7AVQ.js";import"./auth-B4Kn3eee.js";import"./server-context-D3iiIzvV.js";import"./routes-7QTsp3sA.js";import"./paths-GamzES41.js";import"./ssrf-BiSQzdcA.js";import"./store-C5LmVaEC.js";import"./ports-LqFTyTSK.js";import"./trash-zs6gNxed.js";import"./accounts-BT-NzzBc.js";import"./paths-BQ9W7Bs0.js";import"./tool-images-DV2HMmx4.js";import"./workspace-Cz9mCy0P.js";import"./reply-prefix-9hmbzubX.js";import"./sqlite-BEgCClMz.js";import"./memory-cli-COgt0ROi.js";import"./manager-Cob4Ofzr.js";import"./gemini-auth-BZgBIY0M.js";import"./retry-Cc6xusE8.js";import"./common-BRdxH-uH.js";import"./runner-68-X3KHf.js";import"./tool-display-BIswnHaq.js";import"./chunk-UPhdkZNp.js";import"./markdown-tables-CpqWBduK.js";import"./fetch-guard-CoGEds8D.js";import"./fetch-CUsKv8oj.js";import"./ir-6L-eU4id.js";import"./render-1ABBE2Y6.js";import"./builderforcellm-syscheck-CyZiwcdF.js";import"./session-utils-VCGKYbgW.js";import"./coding-tools.policy-DIeVRurg.js";import"./pairing-store-tegvJa08.js";import"./fetch-CrbOFvsL.js";import"./exec-approvals-Cn0K-HtJ.js";import"./nodes-screen-OI7tHqlU.js";import"./session-cost-usage-BgZfN_WR.js";import"./provider-usage-BLkm6ojE.js";import"./send-BIR1Jhc5.js";import"./outbound-attachment-3GZbMqo1.js";import"./delivery-queue-DQXq7KUU.js";import"./project-context-DXP12xhk.js";import"./control-service-Cml__v8i.js";import"./stagger-CUH5rlmS.js";import"./channel-selection-DFf_nAm7.js";import"./send-9rUcCK7O.js";import"./resolve-route-D3X-bXU-.js";import"./channel-activity-By7lsk7N.js";import"./tables-DZSV6me6.js";import"./links-B6LU5cXN.js";import"./cli-utils-ByV85M53.js";import"./help-format-DIDk_7gh.js";import"./progress-BQMO_-7I.js";import"./replies-CL0uQgU7.js";import"./onboard-helpers-Di5OXlap.js";import"./prompt-style-CZOeG0sw.js";import"./pairing-labels-DofkNLS2.js";import"./active-listener-BC31MA4v.js";import"./mamba-state-engine-CFwb8DcP.js";import"./transformers-stream-nSL4Xu31.js";import"./catalog-CEJqw4s-.js";import"./helpers-DDS6DSK4.js";import"./plugin-auto-enable-tSxWjjZC.js";import"./install-safe-path-BxCb3BJW.js";import"./npm-registry-spec-DXx5hKYJ.js";import"./skill-scanner-YCbLEfNS.js";import"./installs-BBKikcCJ.js";import{n as setupChannels}from"./onboard-channels-Dir2EguP.js";export{setupChannels};
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-BARnVAUE.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./model-discovery-DxpimsRF.js";import"./model-catalog-wcISK04b.js";import"./frontmatter-DgRc5y_l.js";import"./skills-W00EPvKR.js";import"./plugin-skills-BSUncenp.js";import"./refresh-bgGvF0aF.js";import"./client-DeQ0LbP9.js";import"./call-CjC3SRPv.js";import"./message-channel-C-yw5fZm.js";import"./subagent-registry-BUKplZi1.js";import"./sessions-ko0LxxGk.js";import"./src-BM8G-tIl.js";import"./project-context-store-BSIWJD6S.js";import"./tokens-BNwTTeJb.js";import"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import"./send-gG3CFJwv.js";import"./send-DqJCViFb.js";import"./with-timeout-By0c7Ur9.js";import"./deliver-DFhj1d_t.js";import"./accounts-DoJYLMfS.js";import"./send-mCN63Hkn.js";import"./image-ops-Bg9yFwjX.js";import"./redact-bWj_-q3j.js";import"./errors-t5wHPcwh.js";import"./embedded-helpers-DGDYymYx.js";import"./sandbox-BcH7kS1y.js";import"./chrome-IJYO1tSE.js";import"./tailscale-CgCG7AVQ.js";import"./auth-B4Kn3eee.js";import"./server-context-D3iiIzvV.js";import"./routes-7QTsp3sA.js";import"./paths-GamzES41.js";import"./ssrf-BiSQzdcA.js";import"./store-C5LmVaEC.js";import"./ports-LqFTyTSK.js";import"./trash-zs6gNxed.js";import"./accounts-BT-NzzBc.js";import"./paths-BQ9W7Bs0.js";import"./tool-images-DV2HMmx4.js";import"./workspace-Cz9mCy0P.js";import"./reply-prefix-9hmbzubX.js";import"./sqlite-BEgCClMz.js";import"./memory-cli-COgt0ROi.js";import"./manager-Cob4Ofzr.js";import"./gemini-auth-BZgBIY0M.js";import"./retry-Cc6xusE8.js";import"./common-BRdxH-uH.js";import"./runner-BLCTET8O.js";import"./tool-display-BIswnHaq.js";import"./chunk-UPhdkZNp.js";import"./markdown-tables-CpqWBduK.js";import"./fetch-guard-CoGEds8D.js";import"./fetch-CUsKv8oj.js";import"./ir-6L-eU4id.js";import"./render-1ABBE2Y6.js";import"./builderforcellm-syscheck-CfFrfeV2.js";import"./session-utils-VCGKYbgW.js";import"./coding-tools.policy-DIeVRurg.js";import"./pairing-store-tegvJa08.js";import"./fetch-CrbOFvsL.js";import"./exec-approvals-Cn0K-HtJ.js";import"./nodes-screen-OI7tHqlU.js";import"./session-cost-usage-BgZfN_WR.js";import"./provider-usage-BLkm6ojE.js";import"./send-BIR1Jhc5.js";import"./outbound-attachment-3GZbMqo1.js";import"./delivery-queue-DQXq7KUU.js";import"./project-context-C5KLsMTc.js";import"./control-service-Cml__v8i.js";import"./stagger-CUH5rlmS.js";import"./channel-selection-DFf_nAm7.js";import"./send-9rUcCK7O.js";import"./resolve-route-D3X-bXU-.js";import"./channel-activity-By7lsk7N.js";import"./tables-DZSV6me6.js";import"./links-B6LU5cXN.js";import"./cli-utils-ByV85M53.js";import"./help-format-DIDk_7gh.js";import"./progress-BQMO_-7I.js";import"./replies-CL0uQgU7.js";import"./onboard-helpers-Di5OXlap.js";import"./prompt-style-CZOeG0sw.js";import"./pairing-labels-DofkNLS2.js";import"./active-listener-BC31MA4v.js";import"./mamba-state-engine-BYmUnYwn.js";import"./transformers-stream-nSL4Xu31.js";import"./catalog-CEJqw4s-.js";import"./helpers-DDS6DSK4.js";import"./plugin-auto-enable-tSxWjjZC.js";import"./install-safe-path-BxCb3BJW.js";import"./npm-registry-spec-DXx5hKYJ.js";import"./skill-scanner-YCbLEfNS.js";import"./installs-BBKikcCJ.js";import{n as setupChannels}from"./onboard-channels-V51s9X-h.js";export{setupChannels};
@@ -1,4 +1,4 @@
1
- import{At as loadBuilderForceAgentsPlugins,kt as createPluginLoaderLogger}from"./reply-BsRbeUhd.js";import{n as DEFAULT_ACCOUNT_ID,u as normalizeAccountId}from"./session-key-EoB0qaG9.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{a as formatChannelSelectionLine,i as formatChannelPrimerLine,s as listChatChannels}from"./registry-TdK-aV05.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-DPtjOxzp.js";import{t as formatCliCommand}from"./command-format-Dd7BgZsg.js";import{n as listChannelPlugins,t as getChannelPlugin}from"./plugins-COtQnUML.js";import{t as formatDocsLink}from"./links-CYRGsVCu.js";import{r as listChannelPluginCatalogEntries}from"./catalog-BsxosmSt.js";import{t as resolveChannelDefaultAccountId}from"./helpers-_XD3UAOf.js";import{n as isChannelConfigured}from"./plugin-auto-enable-CFshBQKJ.js";import{t as enablePluginInConfig}from"./enable-fuhbpGov.js";import{n as installPluginFromNpmSpec,t as recordPluginInstall}from"./installs-D6Sfl7VX.js";import fs from"node:fs";import path from"node:path";function hasGitWorkspace(workspaceDir){let candidates=new Set;candidates.add(path.join(process.cwd(),`.git`)),workspaceDir&&workspaceDir!==process.cwd()&&candidates.add(path.join(workspaceDir,`.git`));for(let candidate of candidates)if(fs.existsSync(candidate))return!0;return!1}function resolveLocalPath(entry,workspaceDir,allowLocal){if(!allowLocal)return null;let raw=entry.install.localPath?.trim();if(!raw)return null;let candidates=new Set;candidates.add(path.resolve(process.cwd(),raw)),workspaceDir&&workspaceDir!==process.cwd()&&candidates.add(path.resolve(workspaceDir,raw));for(let candidate of candidates)if(fs.existsSync(candidate))return candidate;return null}function addPluginLoadPath(cfg,pluginPath){let existing=cfg.plugins?.load?.paths??[],merged=Array.from(new Set([...existing,pluginPath]));return{...cfg,plugins:{...cfg.plugins,load:{...cfg.plugins?.load,paths:merged}}}}async function promptInstallChoice(params){let{entry,localPath,prompter,defaultChoice}=params,localOptions=localPath?[{value:`local`,label:`Use local plugin path`,hint:localPath}]:[],options=[{value:`npm`,label:`Download from npm (${entry.install.npmSpec})`},...localOptions,{value:`skip`,label:`Skip for now`}],initialValue=defaultChoice===`local`&&!localPath?`npm`:defaultChoice;return await prompter.select({message:`Install ${entry.meta.label} plugin?`,options,initialValue})}function resolveInstallDefaultChoice(params){let{cfg,entry,localPath}=params,updateChannel=cfg.update?.channel;if(updateChannel===`dev`)return localPath?`local`:`npm`;if(updateChannel===`stable`||updateChannel===`beta`)return`npm`;let entryDefault=entry.install.defaultChoice;return entryDefault===`local`?localPath?`local`:`npm`:entryDefault===`npm`?`npm`:localPath?`local`:`npm`}async function ensureOnboardingPluginInstalled(params){let{entry,prompter,runtime,workspaceDir}=params,next=params.cfg,localPath=resolveLocalPath(entry,workspaceDir,hasGitWorkspace(workspaceDir)),choice=await promptInstallChoice({entry,localPath,defaultChoice:resolveInstallDefaultChoice({cfg:next,entry,localPath}),prompter});if(choice===`skip`)return{cfg:next,installed:!1};if(choice===`local`&&localPath)return next=addPluginLoadPath(next,localPath),next=enablePluginInConfig(next,entry.id).config,{cfg:next,installed:!0};let result=await installPluginFromNpmSpec({spec:entry.install.npmSpec,logger:{info:msg=>runtime.log?.(msg),warn:msg=>runtime.log?.(msg)}});return result.ok?(next=enablePluginInConfig(next,result.pluginId).config,next=recordPluginInstall(next,{pluginId:result.pluginId,source:`npm`,spec:entry.install.npmSpec,installPath:result.targetDir,version:result.version}),{cfg:next,installed:!0}):(await prompter.note(`Failed to install ${entry.install.npmSpec}: ${result.error}`,`Plugin install`),localPath&&await prompter.confirm({message:`Use local plugin path instead? (${localPath})`,initialValue:!0})?(next=addPluginLoadPath(next,localPath),next=enablePluginInConfig(next,entry.id).config,{cfg:next,installed:!0}):(runtime.error?.(`Plugin install failed: ${result.error}`),{cfg:next,installed:!1}))}function reloadOnboardingPluginRegistry(params){let workspaceDir=params.workspaceDir??resolveAgentWorkspaceDir(params.cfg,resolveDefaultAgentId(params.cfg)),log=createSubsystemLogger(`plugins`);loadBuilderForceAgentsPlugins({config:params.cfg,workspaceDir,cache:!1,logger:createPluginLoaderLogger(log)})}const CHANNEL_ONBOARDING_ADAPTERS=()=>new Map(listChannelPlugins().map(plugin=>plugin.onboarding?[plugin.id,plugin.onboarding]:null).filter(entry=>!!entry));function getChannelOnboardingAdapter(channel){return CHANNEL_ONBOARDING_ADAPTERS().get(channel)}function listChannelOnboardingAdapters(){return Array.from(CHANNEL_ONBOARDING_ADAPTERS().values())}function formatAccountLabel(accountId){return accountId===DEFAULT_ACCOUNT_ID?`default (primary)`:accountId}async function promptConfiguredAction(params){let{prompter,label,supportsDisable,supportsDelete}=params,updateOption={value:`update`,label:`Modify settings`},disableOption={value:`disable`,label:`Disable (keeps config)`},deleteOption={value:`delete`,label:`Delete config`},skipOption={value:`skip`,label:`Skip (leave as-is)`},options=[updateOption,...supportsDisable?[disableOption]:[],...supportsDelete?[deleteOption]:[],skipOption];return await prompter.select({message:`${label} already configured. What do you want to do?`,options,initialValue:`update`})}async function promptRemovalAccountId(params){let{cfg,prompter,label,channel}=params,plugin=getChannelPlugin(channel);if(!plugin)return DEFAULT_ACCOUNT_ID;let accountIds=plugin.config.listAccountIds(cfg).filter(Boolean),defaultAccountId=resolveChannelDefaultAccountId({plugin,cfg,accountIds});return accountIds.length<=1?defaultAccountId:normalizeAccountId(await prompter.select({message:`${label} account`,options:accountIds.map(accountId=>({value:accountId,label:formatAccountLabel(accountId)})),initialValue:defaultAccountId}))??defaultAccountId}async function collectChannelStatus(params){let installedPlugins=listChannelPlugins(),installedIds=new Set(installedPlugins.map(plugin=>plugin.id)),catalogEntries=listChannelPluginCatalogEntries({workspaceDir:resolveAgentWorkspaceDir(params.cfg,resolveDefaultAgentId(params.cfg))}).filter(entry=>!installedIds.has(entry.id)),statusEntries=await Promise.all(listChannelOnboardingAdapters().map(adapter=>adapter.getStatus({cfg:params.cfg,options:params.options,accountOverrides:params.accountOverrides}))),statusByChannel=new Map(statusEntries.map(entry=>[entry.channel,entry])),fallbackStatuses=listChatChannels().filter(meta=>!statusByChannel.has(meta.id)).map(meta=>{let configured=isChannelConfigured(params.cfg,meta.id),statusLabel=configured?`configured (plugin disabled)`:`not configured`;return{channel:meta.id,configured,statusLines:[`${meta.label}: ${statusLabel}`],selectionHint:configured?`configured · plugin disabled`:`not configured`,quickstartScore:0}}),catalogStatuses=catalogEntries.map(entry=>({channel:entry.id,configured:!1,statusLines:[`${entry.meta.label}: install plugin to enable`],selectionHint:`plugin · install`,quickstartScore:0})),combinedStatuses=[...statusEntries,...fallbackStatuses,...catalogStatuses];return{installedPlugins,catalogEntries,statusByChannel:new Map(combinedStatuses.map(entry=>[entry.channel,entry])),statusLines:combinedStatuses.flatMap(entry=>entry.statusLines)}}async function noteChannelStatus(params){let{statusLines}=await collectChannelStatus({cfg:params.cfg,options:params.options,accountOverrides:params.accountOverrides??{}});statusLines.length>0&&await params.prompter.note(statusLines.join(`
1
+ import{At as loadBuilderForceAgentsPlugins,kt as createPluginLoaderLogger}from"./reply-CpGH-3If.js";import{n as DEFAULT_ACCOUNT_ID,u as normalizeAccountId}from"./session-key-EoB0qaG9.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{a as formatChannelSelectionLine,i as formatChannelPrimerLine,s as listChatChannels}from"./registry-TdK-aV05.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-DPtjOxzp.js";import{t as formatCliCommand}from"./command-format-Dd7BgZsg.js";import{n as listChannelPlugins,t as getChannelPlugin}from"./plugins-COtQnUML.js";import{t as formatDocsLink}from"./links-CYRGsVCu.js";import{r as listChannelPluginCatalogEntries}from"./catalog-BsxosmSt.js";import{t as resolveChannelDefaultAccountId}from"./helpers-_XD3UAOf.js";import{n as isChannelConfigured}from"./plugin-auto-enable-CFshBQKJ.js";import{t as enablePluginInConfig}from"./enable-fuhbpGov.js";import{n as installPluginFromNpmSpec,t as recordPluginInstall}from"./installs-D6Sfl7VX.js";import fs from"node:fs";import path from"node:path";function hasGitWorkspace(workspaceDir){let candidates=new Set;candidates.add(path.join(process.cwd(),`.git`)),workspaceDir&&workspaceDir!==process.cwd()&&candidates.add(path.join(workspaceDir,`.git`));for(let candidate of candidates)if(fs.existsSync(candidate))return!0;return!1}function resolveLocalPath(entry,workspaceDir,allowLocal){if(!allowLocal)return null;let raw=entry.install.localPath?.trim();if(!raw)return null;let candidates=new Set;candidates.add(path.resolve(process.cwd(),raw)),workspaceDir&&workspaceDir!==process.cwd()&&candidates.add(path.resolve(workspaceDir,raw));for(let candidate of candidates)if(fs.existsSync(candidate))return candidate;return null}function addPluginLoadPath(cfg,pluginPath){let existing=cfg.plugins?.load?.paths??[],merged=Array.from(new Set([...existing,pluginPath]));return{...cfg,plugins:{...cfg.plugins,load:{...cfg.plugins?.load,paths:merged}}}}async function promptInstallChoice(params){let{entry,localPath,prompter,defaultChoice}=params,localOptions=localPath?[{value:`local`,label:`Use local plugin path`,hint:localPath}]:[],options=[{value:`npm`,label:`Download from npm (${entry.install.npmSpec})`},...localOptions,{value:`skip`,label:`Skip for now`}],initialValue=defaultChoice===`local`&&!localPath?`npm`:defaultChoice;return await prompter.select({message:`Install ${entry.meta.label} plugin?`,options,initialValue})}function resolveInstallDefaultChoice(params){let{cfg,entry,localPath}=params,updateChannel=cfg.update?.channel;if(updateChannel===`dev`)return localPath?`local`:`npm`;if(updateChannel===`stable`||updateChannel===`beta`)return`npm`;let entryDefault=entry.install.defaultChoice;return entryDefault===`local`?localPath?`local`:`npm`:entryDefault===`npm`?`npm`:localPath?`local`:`npm`}async function ensureOnboardingPluginInstalled(params){let{entry,prompter,runtime,workspaceDir}=params,next=params.cfg,localPath=resolveLocalPath(entry,workspaceDir,hasGitWorkspace(workspaceDir)),choice=await promptInstallChoice({entry,localPath,defaultChoice:resolveInstallDefaultChoice({cfg:next,entry,localPath}),prompter});if(choice===`skip`)return{cfg:next,installed:!1};if(choice===`local`&&localPath)return next=addPluginLoadPath(next,localPath),next=enablePluginInConfig(next,entry.id).config,{cfg:next,installed:!0};let result=await installPluginFromNpmSpec({spec:entry.install.npmSpec,logger:{info:msg=>runtime.log?.(msg),warn:msg=>runtime.log?.(msg)}});return result.ok?(next=enablePluginInConfig(next,result.pluginId).config,next=recordPluginInstall(next,{pluginId:result.pluginId,source:`npm`,spec:entry.install.npmSpec,installPath:result.targetDir,version:result.version}),{cfg:next,installed:!0}):(await prompter.note(`Failed to install ${entry.install.npmSpec}: ${result.error}`,`Plugin install`),localPath&&await prompter.confirm({message:`Use local plugin path instead? (${localPath})`,initialValue:!0})?(next=addPluginLoadPath(next,localPath),next=enablePluginInConfig(next,entry.id).config,{cfg:next,installed:!0}):(runtime.error?.(`Plugin install failed: ${result.error}`),{cfg:next,installed:!1}))}function reloadOnboardingPluginRegistry(params){let workspaceDir=params.workspaceDir??resolveAgentWorkspaceDir(params.cfg,resolveDefaultAgentId(params.cfg)),log=createSubsystemLogger(`plugins`);loadBuilderForceAgentsPlugins({config:params.cfg,workspaceDir,cache:!1,logger:createPluginLoaderLogger(log)})}const CHANNEL_ONBOARDING_ADAPTERS=()=>new Map(listChannelPlugins().map(plugin=>plugin.onboarding?[plugin.id,plugin.onboarding]:null).filter(entry=>!!entry));function getChannelOnboardingAdapter(channel){return CHANNEL_ONBOARDING_ADAPTERS().get(channel)}function listChannelOnboardingAdapters(){return Array.from(CHANNEL_ONBOARDING_ADAPTERS().values())}function formatAccountLabel(accountId){return accountId===DEFAULT_ACCOUNT_ID?`default (primary)`:accountId}async function promptConfiguredAction(params){let{prompter,label,supportsDisable,supportsDelete}=params,updateOption={value:`update`,label:`Modify settings`},disableOption={value:`disable`,label:`Disable (keeps config)`},deleteOption={value:`delete`,label:`Delete config`},skipOption={value:`skip`,label:`Skip (leave as-is)`},options=[updateOption,...supportsDisable?[disableOption]:[],...supportsDelete?[deleteOption]:[],skipOption];return await prompter.select({message:`${label} already configured. What do you want to do?`,options,initialValue:`update`})}async function promptRemovalAccountId(params){let{cfg,prompter,label,channel}=params,plugin=getChannelPlugin(channel);if(!plugin)return DEFAULT_ACCOUNT_ID;let accountIds=plugin.config.listAccountIds(cfg).filter(Boolean),defaultAccountId=resolveChannelDefaultAccountId({plugin,cfg,accountIds});return accountIds.length<=1?defaultAccountId:normalizeAccountId(await prompter.select({message:`${label} account`,options:accountIds.map(accountId=>({value:accountId,label:formatAccountLabel(accountId)})),initialValue:defaultAccountId}))??defaultAccountId}async function collectChannelStatus(params){let installedPlugins=listChannelPlugins(),installedIds=new Set(installedPlugins.map(plugin=>plugin.id)),catalogEntries=listChannelPluginCatalogEntries({workspaceDir:resolveAgentWorkspaceDir(params.cfg,resolveDefaultAgentId(params.cfg))}).filter(entry=>!installedIds.has(entry.id)),statusEntries=await Promise.all(listChannelOnboardingAdapters().map(adapter=>adapter.getStatus({cfg:params.cfg,options:params.options,accountOverrides:params.accountOverrides}))),statusByChannel=new Map(statusEntries.map(entry=>[entry.channel,entry])),fallbackStatuses=listChatChannels().filter(meta=>!statusByChannel.has(meta.id)).map(meta=>{let configured=isChannelConfigured(params.cfg,meta.id),statusLabel=configured?`configured (plugin disabled)`:`not configured`;return{channel:meta.id,configured,statusLines:[`${meta.label}: ${statusLabel}`],selectionHint:configured?`configured · plugin disabled`:`not configured`,quickstartScore:0}}),catalogStatuses=catalogEntries.map(entry=>({channel:entry.id,configured:!1,statusLines:[`${entry.meta.label}: install plugin to enable`],selectionHint:`plugin · install`,quickstartScore:0})),combinedStatuses=[...statusEntries,...fallbackStatuses,...catalogStatuses];return{installedPlugins,catalogEntries,statusByChannel:new Map(combinedStatuses.map(entry=>[entry.channel,entry])),statusLines:combinedStatuses.flatMap(entry=>entry.statusLines)}}async function noteChannelStatus(params){let{statusLines}=await collectChannelStatus({cfg:params.cfg,options:params.options,accountOverrides:params.accountOverrides??{}});statusLines.length>0&&await params.prompter.note(statusLines.join(`
2
2
  `),`Channel status`)}async function noteChannelPrimer(prompter,channels){let channelLines=channels.map(channel=>formatChannelPrimerLine({id:channel.id,label:channel.label,selectionLabel:channel.label,docsPath:`/`,blurb:channel.blurb}));await prompter.note([`DM security: default is pairing; unknown DMs get a pairing code.`,`Approve with: ${formatCliCommand(`builderforce pairing approve <channel> <code>`)}`,`Public DMs require dmPolicy="open" + allowFrom=["*"].`,`Multi-user DMs: run: `+formatCliCommand(`builderforce config set session.dmScope "per-channel-peer"`)+` (or "per-account-channel-peer" for multi-account channels) to isolate sessions.`,`Docs: ${formatDocsLink(`/start/pairing`,`start/pairing`)}`,``,...channelLines].join(`
3
3
  `),`How channels work`)}function resolveQuickstartDefault(statusByChannel){let best=null;for(let[channel,status]of statusByChannel)status.quickstartScore!=null&&(!best||status.quickstartScore>best.score)&&(best={channel,score:status.quickstartScore});return best?.channel}async function maybeConfigureDmPolicies(params){let{selection,prompter,accountIdsByChannel}=params,dmPolicies=selection.map(channel=>getChannelOnboardingAdapter(channel)?.dmPolicy).filter(Boolean);if(dmPolicies.length===0||!await prompter.confirm({message:`Configure DM access policies now? (default: pairing)`,initialValue:!1}))return params.cfg;let cfg=params.cfg,selectPolicy=async policy=>(await prompter.note([`Default: pairing (unknown DMs get a pairing code).`,`Approve: ${formatCliCommand(`builderforce pairing approve ${policy.channel} <code>`)}`,`Allowlist DMs: ${policy.policyKey}="allowlist" + ${policy.allowFromKey} entries.`,`Public DMs: ${policy.policyKey}="open" + ${policy.allowFromKey} includes "*".`,`Multi-user DMs: run: `+formatCliCommand(`builderforce config set session.dmScope "per-channel-peer"`)+` (or "per-account-channel-peer" for multi-account channels) to isolate sessions.`,`Docs: ${formatDocsLink(`/start/pairing`,`start/pairing`)}`].join(`
4
4
  `),`${policy.label} DM access`),await prompter.select({message:`${policy.label} DM policy`,options:[{value:`pairing`,label:`Pairing (recommended)`},{value:`allowlist`,label:`Allowlist (specific users only)`},{value:`open`,label:`Open (public inbound DMs)`},{value:`disabled`,label:`Disabled (ignore DMs)`}]}));for(let policy of dmPolicies){let current=policy.getCurrent(cfg),nextPolicy=await selectPolicy(policy);nextPolicy!==current&&(cfg=policy.setPolicy(cfg,nextPolicy)),nextPolicy===`allowlist`&&policy.promptAllowFrom&&(cfg=await policy.promptAllowFrom({cfg,prompter,accountId:accountIdsByChannel?.get(policy.channel)}))}return cfg}async function setupChannels(cfg,runtime,prompter,options){let next=cfg,forceAllowFromChannels=new Set(options?.forceAllowFromChannels??[]),accountOverrides={...options?.accountIds};options?.whatsappAccountId?.trim()&&(accountOverrides.whatsapp=options.whatsappAccountId.trim());let{installedPlugins,catalogEntries,statusByChannel,statusLines}=await collectChannelStatus({cfg:next,options,accountOverrides});if(!options?.skipStatusNote&&statusLines.length>0&&await prompter.note(statusLines.join(`
@@ -1,4 +1,4 @@
1
- import{a as formatChannelSelectionLine,i as formatChannelPrimerLine,s as listChatChannels}from"./registry-Cv7CoWAs.js";import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{n as DEFAULT_ACCOUNT_ID,u as normalizeAccountId}from"./session-key-D--2AEus.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-BcoQBOwz.js";import{C as createPluginLoaderLogger,w as loadBuilderForceAgentsPlugins}from"./subagent-registry-oB_F2U2W.js";import{n as listChannelPlugins,t as getChannelPlugin}from"./plugins-DJGW_fnS.js";import{t as formatDocsLink}from"./links-B6LU5cXN.js";import{r as listChannelPluginCatalogEntries}from"./catalog-CEJqw4s-.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DDS6DSK4.js";import{n as isChannelConfigured}from"./plugin-auto-enable-tSxWjjZC.js";import{t as enablePluginInConfig}from"./enable-BeT47v0c.js";import{n as installPluginFromNpmSpec,t as recordPluginInstall}from"./installs-BBKikcCJ.js";import path from"node:path";import fs from"node:fs";function hasGitWorkspace(workspaceDir){let candidates=new Set;candidates.add(path.join(process.cwd(),`.git`)),workspaceDir&&workspaceDir!==process.cwd()&&candidates.add(path.join(workspaceDir,`.git`));for(let candidate of candidates)if(fs.existsSync(candidate))return!0;return!1}function resolveLocalPath(entry,workspaceDir,allowLocal){if(!allowLocal)return null;let raw=entry.install.localPath?.trim();if(!raw)return null;let candidates=new Set;candidates.add(path.resolve(process.cwd(),raw)),workspaceDir&&workspaceDir!==process.cwd()&&candidates.add(path.resolve(workspaceDir,raw));for(let candidate of candidates)if(fs.existsSync(candidate))return candidate;return null}function addPluginLoadPath(cfg,pluginPath){let existing=cfg.plugins?.load?.paths??[],merged=Array.from(new Set([...existing,pluginPath]));return{...cfg,plugins:{...cfg.plugins,load:{...cfg.plugins?.load,paths:merged}}}}async function promptInstallChoice(params){let{entry,localPath,prompter,defaultChoice}=params,localOptions=localPath?[{value:`local`,label:`Use local plugin path`,hint:localPath}]:[],options=[{value:`npm`,label:`Download from npm (${entry.install.npmSpec})`},...localOptions,{value:`skip`,label:`Skip for now`}],initialValue=defaultChoice===`local`&&!localPath?`npm`:defaultChoice;return await prompter.select({message:`Install ${entry.meta.label} plugin?`,options,initialValue})}function resolveInstallDefaultChoice(params){let{cfg,entry,localPath}=params,updateChannel=cfg.update?.channel;if(updateChannel===`dev`)return localPath?`local`:`npm`;if(updateChannel===`stable`||updateChannel===`beta`)return`npm`;let entryDefault=entry.install.defaultChoice;return entryDefault===`local`?localPath?`local`:`npm`:entryDefault===`npm`?`npm`:localPath?`local`:`npm`}async function ensureOnboardingPluginInstalled(params){let{entry,prompter,runtime,workspaceDir}=params,next=params.cfg,localPath=resolveLocalPath(entry,workspaceDir,hasGitWorkspace(workspaceDir)),choice=await promptInstallChoice({entry,localPath,defaultChoice:resolveInstallDefaultChoice({cfg:next,entry,localPath}),prompter});if(choice===`skip`)return{cfg:next,installed:!1};if(choice===`local`&&localPath)return next=addPluginLoadPath(next,localPath),next=enablePluginInConfig(next,entry.id).config,{cfg:next,installed:!0};let result=await installPluginFromNpmSpec({spec:entry.install.npmSpec,logger:{info:msg=>runtime.log?.(msg),warn:msg=>runtime.log?.(msg)}});return result.ok?(next=enablePluginInConfig(next,result.pluginId).config,next=recordPluginInstall(next,{pluginId:result.pluginId,source:`npm`,spec:entry.install.npmSpec,installPath:result.targetDir,version:result.version}),{cfg:next,installed:!0}):(await prompter.note(`Failed to install ${entry.install.npmSpec}: ${result.error}`,`Plugin install`),localPath&&await prompter.confirm({message:`Use local plugin path instead? (${localPath})`,initialValue:!0})?(next=addPluginLoadPath(next,localPath),next=enablePluginInConfig(next,entry.id).config,{cfg:next,installed:!0}):(runtime.error?.(`Plugin install failed: ${result.error}`),{cfg:next,installed:!1}))}function reloadOnboardingPluginRegistry(params){let workspaceDir=params.workspaceDir??resolveAgentWorkspaceDir(params.cfg,resolveDefaultAgentId(params.cfg)),log=createSubsystemLogger(`plugins`);loadBuilderForceAgentsPlugins({config:params.cfg,workspaceDir,cache:!1,logger:createPluginLoaderLogger(log)})}const CHANNEL_ONBOARDING_ADAPTERS=()=>new Map(listChannelPlugins().map(plugin=>plugin.onboarding?[plugin.id,plugin.onboarding]:null).filter(entry=>!!entry));function getChannelOnboardingAdapter(channel){return CHANNEL_ONBOARDING_ADAPTERS().get(channel)}function listChannelOnboardingAdapters(){return Array.from(CHANNEL_ONBOARDING_ADAPTERS().values())}function formatAccountLabel(accountId){return accountId===DEFAULT_ACCOUNT_ID?`default (primary)`:accountId}async function promptConfiguredAction(params){let{prompter,label,supportsDisable,supportsDelete}=params,updateOption={value:`update`,label:`Modify settings`},disableOption={value:`disable`,label:`Disable (keeps config)`},deleteOption={value:`delete`,label:`Delete config`},skipOption={value:`skip`,label:`Skip (leave as-is)`},options=[updateOption,...supportsDisable?[disableOption]:[],...supportsDelete?[deleteOption]:[],skipOption];return await prompter.select({message:`${label} already configured. What do you want to do?`,options,initialValue:`update`})}async function promptRemovalAccountId(params){let{cfg,prompter,label,channel}=params,plugin=getChannelPlugin(channel);if(!plugin)return DEFAULT_ACCOUNT_ID;let accountIds=plugin.config.listAccountIds(cfg).filter(Boolean),defaultAccountId=resolveChannelDefaultAccountId({plugin,cfg,accountIds});return accountIds.length<=1?defaultAccountId:normalizeAccountId(await prompter.select({message:`${label} account`,options:accountIds.map(accountId=>({value:accountId,label:formatAccountLabel(accountId)})),initialValue:defaultAccountId}))??defaultAccountId}async function collectChannelStatus(params){let installedPlugins=listChannelPlugins(),installedIds=new Set(installedPlugins.map(plugin=>plugin.id)),catalogEntries=listChannelPluginCatalogEntries({workspaceDir:resolveAgentWorkspaceDir(params.cfg,resolveDefaultAgentId(params.cfg))}).filter(entry=>!installedIds.has(entry.id)),statusEntries=await Promise.all(listChannelOnboardingAdapters().map(adapter=>adapter.getStatus({cfg:params.cfg,options:params.options,accountOverrides:params.accountOverrides}))),statusByChannel=new Map(statusEntries.map(entry=>[entry.channel,entry])),fallbackStatuses=listChatChannels().filter(meta=>!statusByChannel.has(meta.id)).map(meta=>{let configured=isChannelConfigured(params.cfg,meta.id),statusLabel=configured?`configured (plugin disabled)`:`not configured`;return{channel:meta.id,configured,statusLines:[`${meta.label}: ${statusLabel}`],selectionHint:configured?`configured · plugin disabled`:`not configured`,quickstartScore:0}}),catalogStatuses=catalogEntries.map(entry=>({channel:entry.id,configured:!1,statusLines:[`${entry.meta.label}: install plugin to enable`],selectionHint:`plugin · install`,quickstartScore:0})),combinedStatuses=[...statusEntries,...fallbackStatuses,...catalogStatuses];return{installedPlugins,catalogEntries,statusByChannel:new Map(combinedStatuses.map(entry=>[entry.channel,entry])),statusLines:combinedStatuses.flatMap(entry=>entry.statusLines)}}async function noteChannelStatus(params){let{statusLines}=await collectChannelStatus({cfg:params.cfg,options:params.options,accountOverrides:params.accountOverrides??{}});statusLines.length>0&&await params.prompter.note(statusLines.join(`
1
+ import{a as formatChannelSelectionLine,i as formatChannelPrimerLine,s as listChatChannels}from"./registry-Cv7CoWAs.js";import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{n as DEFAULT_ACCOUNT_ID,u as normalizeAccountId}from"./session-key-D--2AEus.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-BcoQBOwz.js";import{C as createPluginLoaderLogger,w as loadBuilderForceAgentsPlugins}from"./subagent-registry-BUKplZi1.js";import{n as listChannelPlugins,t as getChannelPlugin}from"./plugins-DJGW_fnS.js";import{t as formatDocsLink}from"./links-B6LU5cXN.js";import{r as listChannelPluginCatalogEntries}from"./catalog-CEJqw4s-.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DDS6DSK4.js";import{n as isChannelConfigured}from"./plugin-auto-enable-tSxWjjZC.js";import{t as enablePluginInConfig}from"./enable-BeT47v0c.js";import{n as installPluginFromNpmSpec,t as recordPluginInstall}from"./installs-BBKikcCJ.js";import path from"node:path";import fs from"node:fs";function hasGitWorkspace(workspaceDir){let candidates=new Set;candidates.add(path.join(process.cwd(),`.git`)),workspaceDir&&workspaceDir!==process.cwd()&&candidates.add(path.join(workspaceDir,`.git`));for(let candidate of candidates)if(fs.existsSync(candidate))return!0;return!1}function resolveLocalPath(entry,workspaceDir,allowLocal){if(!allowLocal)return null;let raw=entry.install.localPath?.trim();if(!raw)return null;let candidates=new Set;candidates.add(path.resolve(process.cwd(),raw)),workspaceDir&&workspaceDir!==process.cwd()&&candidates.add(path.resolve(workspaceDir,raw));for(let candidate of candidates)if(fs.existsSync(candidate))return candidate;return null}function addPluginLoadPath(cfg,pluginPath){let existing=cfg.plugins?.load?.paths??[],merged=Array.from(new Set([...existing,pluginPath]));return{...cfg,plugins:{...cfg.plugins,load:{...cfg.plugins?.load,paths:merged}}}}async function promptInstallChoice(params){let{entry,localPath,prompter,defaultChoice}=params,localOptions=localPath?[{value:`local`,label:`Use local plugin path`,hint:localPath}]:[],options=[{value:`npm`,label:`Download from npm (${entry.install.npmSpec})`},...localOptions,{value:`skip`,label:`Skip for now`}],initialValue=defaultChoice===`local`&&!localPath?`npm`:defaultChoice;return await prompter.select({message:`Install ${entry.meta.label} plugin?`,options,initialValue})}function resolveInstallDefaultChoice(params){let{cfg,entry,localPath}=params,updateChannel=cfg.update?.channel;if(updateChannel===`dev`)return localPath?`local`:`npm`;if(updateChannel===`stable`||updateChannel===`beta`)return`npm`;let entryDefault=entry.install.defaultChoice;return entryDefault===`local`?localPath?`local`:`npm`:entryDefault===`npm`?`npm`:localPath?`local`:`npm`}async function ensureOnboardingPluginInstalled(params){let{entry,prompter,runtime,workspaceDir}=params,next=params.cfg,localPath=resolveLocalPath(entry,workspaceDir,hasGitWorkspace(workspaceDir)),choice=await promptInstallChoice({entry,localPath,defaultChoice:resolveInstallDefaultChoice({cfg:next,entry,localPath}),prompter});if(choice===`skip`)return{cfg:next,installed:!1};if(choice===`local`&&localPath)return next=addPluginLoadPath(next,localPath),next=enablePluginInConfig(next,entry.id).config,{cfg:next,installed:!0};let result=await installPluginFromNpmSpec({spec:entry.install.npmSpec,logger:{info:msg=>runtime.log?.(msg),warn:msg=>runtime.log?.(msg)}});return result.ok?(next=enablePluginInConfig(next,result.pluginId).config,next=recordPluginInstall(next,{pluginId:result.pluginId,source:`npm`,spec:entry.install.npmSpec,installPath:result.targetDir,version:result.version}),{cfg:next,installed:!0}):(await prompter.note(`Failed to install ${entry.install.npmSpec}: ${result.error}`,`Plugin install`),localPath&&await prompter.confirm({message:`Use local plugin path instead? (${localPath})`,initialValue:!0})?(next=addPluginLoadPath(next,localPath),next=enablePluginInConfig(next,entry.id).config,{cfg:next,installed:!0}):(runtime.error?.(`Plugin install failed: ${result.error}`),{cfg:next,installed:!1}))}function reloadOnboardingPluginRegistry(params){let workspaceDir=params.workspaceDir??resolveAgentWorkspaceDir(params.cfg,resolveDefaultAgentId(params.cfg)),log=createSubsystemLogger(`plugins`);loadBuilderForceAgentsPlugins({config:params.cfg,workspaceDir,cache:!1,logger:createPluginLoaderLogger(log)})}const CHANNEL_ONBOARDING_ADAPTERS=()=>new Map(listChannelPlugins().map(plugin=>plugin.onboarding?[plugin.id,plugin.onboarding]:null).filter(entry=>!!entry));function getChannelOnboardingAdapter(channel){return CHANNEL_ONBOARDING_ADAPTERS().get(channel)}function listChannelOnboardingAdapters(){return Array.from(CHANNEL_ONBOARDING_ADAPTERS().values())}function formatAccountLabel(accountId){return accountId===DEFAULT_ACCOUNT_ID?`default (primary)`:accountId}async function promptConfiguredAction(params){let{prompter,label,supportsDisable,supportsDelete}=params,updateOption={value:`update`,label:`Modify settings`},disableOption={value:`disable`,label:`Disable (keeps config)`},deleteOption={value:`delete`,label:`Delete config`},skipOption={value:`skip`,label:`Skip (leave as-is)`},options=[updateOption,...supportsDisable?[disableOption]:[],...supportsDelete?[deleteOption]:[],skipOption];return await prompter.select({message:`${label} already configured. What do you want to do?`,options,initialValue:`update`})}async function promptRemovalAccountId(params){let{cfg,prompter,label,channel}=params,plugin=getChannelPlugin(channel);if(!plugin)return DEFAULT_ACCOUNT_ID;let accountIds=plugin.config.listAccountIds(cfg).filter(Boolean),defaultAccountId=resolveChannelDefaultAccountId({plugin,cfg,accountIds});return accountIds.length<=1?defaultAccountId:normalizeAccountId(await prompter.select({message:`${label} account`,options:accountIds.map(accountId=>({value:accountId,label:formatAccountLabel(accountId)})),initialValue:defaultAccountId}))??defaultAccountId}async function collectChannelStatus(params){let installedPlugins=listChannelPlugins(),installedIds=new Set(installedPlugins.map(plugin=>plugin.id)),catalogEntries=listChannelPluginCatalogEntries({workspaceDir:resolveAgentWorkspaceDir(params.cfg,resolveDefaultAgentId(params.cfg))}).filter(entry=>!installedIds.has(entry.id)),statusEntries=await Promise.all(listChannelOnboardingAdapters().map(adapter=>adapter.getStatus({cfg:params.cfg,options:params.options,accountOverrides:params.accountOverrides}))),statusByChannel=new Map(statusEntries.map(entry=>[entry.channel,entry])),fallbackStatuses=listChatChannels().filter(meta=>!statusByChannel.has(meta.id)).map(meta=>{let configured=isChannelConfigured(params.cfg,meta.id),statusLabel=configured?`configured (plugin disabled)`:`not configured`;return{channel:meta.id,configured,statusLines:[`${meta.label}: ${statusLabel}`],selectionHint:configured?`configured · plugin disabled`:`not configured`,quickstartScore:0}}),catalogStatuses=catalogEntries.map(entry=>({channel:entry.id,configured:!1,statusLines:[`${entry.meta.label}: install plugin to enable`],selectionHint:`plugin · install`,quickstartScore:0})),combinedStatuses=[...statusEntries,...fallbackStatuses,...catalogStatuses];return{installedPlugins,catalogEntries,statusByChannel:new Map(combinedStatuses.map(entry=>[entry.channel,entry])),statusLines:combinedStatuses.flatMap(entry=>entry.statusLines)}}async function noteChannelStatus(params){let{statusLines}=await collectChannelStatus({cfg:params.cfg,options:params.options,accountOverrides:params.accountOverrides??{}});statusLines.length>0&&await params.prompter.note(statusLines.join(`
2
2
  `),`Channel status`)}async function noteChannelPrimer(prompter,channels){let channelLines=channels.map(channel=>formatChannelPrimerLine({id:channel.id,label:channel.label,selectionLabel:channel.label,docsPath:`/`,blurb:channel.blurb}));await prompter.note([`DM security: default is pairing; unknown DMs get a pairing code.`,`Approve with: ${formatCliCommand(`builderforce pairing approve <channel> <code>`)}`,`Public DMs require dmPolicy="open" + allowFrom=["*"].`,`Multi-user DMs: run: `+formatCliCommand(`builderforce config set session.dmScope "per-channel-peer"`)+` (or "per-account-channel-peer" for multi-account channels) to isolate sessions.`,`Docs: ${formatDocsLink(`/start/pairing`,`start/pairing`)}`,``,...channelLines].join(`
3
3
  `),`How channels work`)}function resolveQuickstartDefault(statusByChannel){let best=null;for(let[channel,status]of statusByChannel)status.quickstartScore!=null&&(!best||status.quickstartScore>best.score)&&(best={channel,score:status.quickstartScore});return best?.channel}async function maybeConfigureDmPolicies(params){let{selection,prompter,accountIdsByChannel}=params,dmPolicies=selection.map(channel=>getChannelOnboardingAdapter(channel)?.dmPolicy).filter(Boolean);if(dmPolicies.length===0||!await prompter.confirm({message:`Configure DM access policies now? (default: pairing)`,initialValue:!1}))return params.cfg;let cfg=params.cfg,selectPolicy=async policy=>(await prompter.note([`Default: pairing (unknown DMs get a pairing code).`,`Approve: ${formatCliCommand(`builderforce pairing approve ${policy.channel} <code>`)}`,`Allowlist DMs: ${policy.policyKey}="allowlist" + ${policy.allowFromKey} entries.`,`Public DMs: ${policy.policyKey}="open" + ${policy.allowFromKey} includes "*".`,`Multi-user DMs: run: `+formatCliCommand(`builderforce config set session.dmScope "per-channel-peer"`)+` (or "per-account-channel-peer" for multi-account channels) to isolate sessions.`,`Docs: ${formatDocsLink(`/start/pairing`,`start/pairing`)}`].join(`
4
4
  `),`${policy.label} DM access`),await prompter.select({message:`${policy.label} DM policy`,options:[{value:`pairing`,label:`Pairing (recommended)`},{value:`allowlist`,label:`Allowlist (specific users only)`},{value:`open`,label:`Open (public inbound DMs)`},{value:`disabled`,label:`Disabled (ignore DMs)`}]}));for(let policy of dmPolicies){let current=policy.getCurrent(cfg),nextPolicy=await selectPolicy(policy);nextPolicy!==current&&(cfg=policy.setPolicy(cfg,nextPolicy)),nextPolicy===`allowlist`&&policy.promptAllowFrom&&(cfg=await policy.promptAllowFrom({cfg,prompter,accountId:accountIdsByChannel?.get(policy.channel)}))}return cfg}async function setupChannels(cfg,runtime,prompter,options){let next=cfg,forceAllowFromChannels=new Set(options?.forceAllowFromChannels??[]),accountOverrides={...options?.accountIds};options?.whatsappAccountId?.trim()&&(accountOverrides.whatsapp=options.whatsappAccountId.trim());let{installedPlugins,catalogEntries,statusByChannel,statusLines}=await collectChannelStatus({cfg:next,options,accountOverrides});if(!options?.skipStatusNote&&statusLines.length>0&&await prompter.note(statusLines.join(`
@@ -1 +1 @@
1
- import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-BrfnCpCe.js";import"./reply-BsRbeUhd.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./model-selection-DX_WOc2P.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./io-YzT_09GD.js";import"./manifest-registry-BVDm_CP0.js";import"./config-8x9ZIdfF.js";import"./runner-CfNJMPWu.js";import"./model-catalog-C7PdRY6w.js";import"./sandbox-DzuXOMNa.js";import"./chrome-Dk-WNIhp.js";import"./tailscale-B-VKIlWm.js";import"./auth-CDcrUXYB.js";import"./server-context-DsuST81W.js";import"./frontmatter-DyJ2unbL.js";import"./skills-B4r9m770.js";import"./plugin-skills-C39wi4uD.js";import"./routes-DoGqdgOP.js";import"./redact-C3oo7_aY.js";import"./errors-CjmtpPBP.js";import"./paths-C1QKdGJX.js";import"./ssrf-4MnoQ7Sz.js";import"./image-ops-CONrkLJK.js";import"./store-BoTKCB2d.js";import"./ports-BNC_iRpw.js";import"./trash-Czxs8cUf.js";import"./sessions-OZNhnSwZ.js";import"./message-channel-DrfCCUg4.js";import"./plugins-COtQnUML.js";import"./accounts-CTKk3xPO.js";import"./accounts-DFqpWzeU.js";import"./accounts-CbQihLRU.js";import"./bindings-DMDv84HS.js";import"./send-Dmzp1gNF.js";import"./send-DEgD1Cfd.js";import"./paths-CkcK939O.js";import"./src-DxNC0IHE.js";import"./tool-images-DsKy1uNN.js";import"./tool-display-TRKLY-yH.js";import"./fetch-guard-BQuCLA1C.js";import"./api-key-rotation-ChHXb1Pq.js";import"./fetch-CDeJQlzN.js";import"./sqlite-DEiKj1vi.js";import"./tokens-Ct4DyfhX.js";import"./project-context-store-C8TROXjr.js";import"./with-timeout-YbYylXgf.js";import"./deliver-C5lVQcrs.js";import"./send-DlPwTVpG.js";import"./workspace-ChbaDWgp.js";import"./reply-prefix-BwtP84WV.js";import"./memory-cli-DWEtZrJ5.js";import"./manager-VPNjVm0W.js";import"./retry-Jis-ZZfm.js";import"./client-DhlZRznX.js";import"./call-DwWslKWv.js";import"./common-NHQnma5l.js";import"./chunk-h7FZEwW2.js";import"./markdown-tables-DOq8FfUr.js";import"./ir-AM9J0QtO.js";import"./render-CSLaFZoy.js";import"./builderforcellm-syscheck-DMjMJNFI.js";import"./send-DglIOKdS.js";import"./outbound-attachment-TWzrIR9Q.js";import"./fetch-B6_hd7w9.js";import"./delivery-queue-BZWZDdpJ.js";import"./channel-activity-qRD5c3VV.js";import"./tables-DirB1oU7.js";import"./pairing-store-DIpKOfDK.js";import"./links-CYRGsVCu.js";import"./cli-utils-BLNnV_WG.js";import"./help-format-NhTn4dWd.js";import"./progress-OKwbfa23.js";import"./resolve-route-BvfmiLqC.js";import"./replies-BoxyKuBS.js";import"./refresh-DgTiir08.js";import"./coding-tools.policy-BJQuylwM.js";import"./send-BgdpJymE.js";import"./onboard-helpers-CPmBeDvt.js";import"./prompt-style-BwwmGo3-.js";import"./pairing-labels-CELZqNBC.js";import"./session-cost-usage-pgxrRRW4.js";import"./provider-usage-CbH7sm73.js";import"./active-listener-DBdxNyOd.js";import"./exec-approvals-kmxxyvIe.js";import"./nodes-screen-BWDONgPE.js";import"./project-context-Cnqfr64Z.js";import"./control-service-BhSaBRxC.js";import"./stagger-NaB6u1z1.js";import"./channel-selection-CQ5MM7Hi.js";import"./mamba-state-engine-Ck2JCfL6.js";import"./transformers-stream-QS2dnQob.js";import"./catalog-BsxosmSt.js";import"./helpers-_XD3UAOf.js";import"./plugin-auto-enable-CFshBQKJ.js";import"./install-safe-path-BUT0oL1h.js";import"./npm-registry-spec-BKmYHCba.js";import"./skill-scanner-Bf_eBctK.js";import"./installs-D6Sfl7VX.js";import{n as setupChannels}from"./onboard-channels-D4g6xuSC.js";export{setupChannels};
1
+ import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-3FEGD_4b.js";import"./reply-CpGH-3If.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./model-selection-DX_WOc2P.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./io-YzT_09GD.js";import"./manifest-registry-BVDm_CP0.js";import"./config-8x9ZIdfF.js";import"./runner-C651oVfk.js";import"./model-catalog-C7PdRY6w.js";import"./sandbox-DzuXOMNa.js";import"./chrome-Dk-WNIhp.js";import"./tailscale-B-VKIlWm.js";import"./auth-CDcrUXYB.js";import"./server-context-DsuST81W.js";import"./frontmatter-DyJ2unbL.js";import"./skills-B4r9m770.js";import"./plugin-skills-C39wi4uD.js";import"./routes-DoGqdgOP.js";import"./redact-C3oo7_aY.js";import"./errors-CjmtpPBP.js";import"./paths-C1QKdGJX.js";import"./ssrf-4MnoQ7Sz.js";import"./image-ops-CONrkLJK.js";import"./store-BoTKCB2d.js";import"./ports-BNC_iRpw.js";import"./trash-Czxs8cUf.js";import"./sessions-OZNhnSwZ.js";import"./message-channel-DrfCCUg4.js";import"./plugins-COtQnUML.js";import"./accounts-CTKk3xPO.js";import"./accounts-DFqpWzeU.js";import"./accounts-CbQihLRU.js";import"./bindings-DMDv84HS.js";import"./send-Dmzp1gNF.js";import"./send-DEgD1Cfd.js";import"./paths-CkcK939O.js";import"./src-D2-7sOAX.js";import"./tool-images-DsKy1uNN.js";import"./tool-display-TRKLY-yH.js";import"./fetch-guard-BQuCLA1C.js";import"./api-key-rotation-ChHXb1Pq.js";import"./fetch-CDeJQlzN.js";import"./sqlite-DEiKj1vi.js";import"./tokens-Ct4DyfhX.js";import"./project-context-store-BS994lZX.js";import"./with-timeout-YbYylXgf.js";import"./deliver-XGIFv80r.js";import"./send-DlPwTVpG.js";import"./workspace-ChbaDWgp.js";import"./reply-prefix-BwtP84WV.js";import"./memory-cli-DWEtZrJ5.js";import"./manager-VPNjVm0W.js";import"./retry-Jis-ZZfm.js";import"./client-DhlZRznX.js";import"./call-DwWslKWv.js";import"./common-NHQnma5l.js";import"./chunk-h7FZEwW2.js";import"./markdown-tables-DOq8FfUr.js";import"./ir-AM9J0QtO.js";import"./render-CSLaFZoy.js";import"./builderforcellm-syscheck-DGZKIwPC.js";import"./send-DglIOKdS.js";import"./outbound-attachment-TWzrIR9Q.js";import"./fetch-B6_hd7w9.js";import"./delivery-queue-BZWZDdpJ.js";import"./channel-activity-qRD5c3VV.js";import"./tables-DirB1oU7.js";import"./pairing-store-DIpKOfDK.js";import"./links-CYRGsVCu.js";import"./cli-utils-BLNnV_WG.js";import"./help-format-NhTn4dWd.js";import"./progress-OKwbfa23.js";import"./resolve-route-BvfmiLqC.js";import"./replies-BoxyKuBS.js";import"./refresh-DgTiir08.js";import"./coding-tools.policy-BJQuylwM.js";import"./send-BgdpJymE.js";import"./onboard-helpers-CPmBeDvt.js";import"./prompt-style-BwwmGo3-.js";import"./pairing-labels-CELZqNBC.js";import"./session-cost-usage-pgxrRRW4.js";import"./provider-usage-CbH7sm73.js";import"./active-listener-DBdxNyOd.js";import"./exec-approvals-kmxxyvIe.js";import"./nodes-screen-BWDONgPE.js";import"./project-context-Cg0S9eFT.js";import"./control-service-BhSaBRxC.js";import"./stagger-NaB6u1z1.js";import"./channel-selection-CQ5MM7Hi.js";import"./mamba-state-engine-BloJzrxU.js";import"./transformers-stream-QS2dnQob.js";import"./catalog-BsxosmSt.js";import"./helpers-_XD3UAOf.js";import"./plugin-auto-enable-CFshBQKJ.js";import"./install-safe-path-BUT0oL1h.js";import"./npm-registry-spec-BKmYHCba.js";import"./skill-scanner-Bf_eBctK.js";import"./installs-D6Sfl7VX.js";import{n as setupChannels}from"./onboard-channels-DXIqdoto.js";export{setupChannels};
@@ -1 +1 @@
1
- import{t as restoreTerminalState}from"./restore-BdB4wlsZ.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import{t as WizardCancelledError}from"./prompts-BUDxN7ef.js";import{t as createClackPrompter}from"./clack-prompter-ZmHdfPGJ.js";import{t as runOnboardingWizard}from"./onboarding-DBL-H1Qu.js";async function runInteractiveOnboarding(opts,runtime=defaultRuntime){let prompter=createClackPrompter(),exitCode=null;try{await runOnboardingWizard(opts,runtime,prompter)}catch(err){if(err instanceof WizardCancelledError){exitCode=1;return}throw err}finally{restoreTerminalState(`onboarding finish`,{resumeStdinIfPaused:!1}),exitCode!==null&&runtime.exit(exitCode)}}export{runInteractiveOnboarding as t};
1
+ import{t as restoreTerminalState}from"./restore-BdB4wlsZ.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import{t as WizardCancelledError}from"./prompts-BUDxN7ef.js";import{t as createClackPrompter}from"./clack-prompter-ZmHdfPGJ.js";import{t as runOnboardingWizard}from"./onboarding-CYOfGpd5.js";async function runInteractiveOnboarding(opts,runtime=defaultRuntime){let prompter=createClackPrompter(),exitCode=null;try{await runOnboardingWizard(opts,runtime,prompter)}catch(err){if(err instanceof WizardCancelledError){exitCode=1;return}throw err}finally{restoreTerminalState(`onboarding finish`,{resumeStdinIfPaused:!1}),exitCode!==null&&runtime.exit(exitCode)}}export{runInteractiveOnboarding as t};
@@ -1 +1 @@
1
- import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import{t as restoreTerminalState}from"./restore-gPan2ZAn.js";import{t as WizardCancelledError}from"./prompts-Yv4eTTSo.js";import{t as createClackPrompter}from"./clack-prompter-6Booc-eg.js";import{t as runOnboardingWizard}from"./onboarding-CIxLpuFP.js";async function runInteractiveOnboarding(opts,runtime=defaultRuntime){let prompter=createClackPrompter(),exitCode=null;try{await runOnboardingWizard(opts,runtime,prompter)}catch(err){if(err instanceof WizardCancelledError){exitCode=1;return}throw err}finally{restoreTerminalState(`onboarding finish`,{resumeStdinIfPaused:!1}),exitCode!==null&&runtime.exit(exitCode)}}export{runInteractiveOnboarding as t};
1
+ import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import{t as restoreTerminalState}from"./restore-gPan2ZAn.js";import{t as WizardCancelledError}from"./prompts-Yv4eTTSo.js";import{t as createClackPrompter}from"./clack-prompter-6Booc-eg.js";import{t as runOnboardingWizard}from"./onboarding-DIxm_q7P.js";async function runInteractiveOnboarding(opts,runtime=defaultRuntime){let prompter=createClackPrompter(),exitCode=null;try{await runOnboardingWizard(opts,runtime,prompter)}catch(err){if(err instanceof WizardCancelledError){exitCode=1;return}throw err}finally{restoreTerminalState(`onboarding finish`,{resumeStdinIfPaused:!1}),exitCode!==null&&runtime.exit(exitCode)}}export{runInteractiveOnboarding as t};
@@ -1 +1 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-BARnVAUE.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./progress-BQMO_-7I.js";import"./prompt-style-CZOeG0sw.js";import"./note-BvXfFmlu.js";import"./clack-prompter-ZmHdfPGJ.js";import"./onboarding-DBL-H1Qu.js";import{t as runInteractiveOnboarding}from"./onboard-interactive-DvNhkCNr.js";export{runInteractiveOnboarding};
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-BARnVAUE.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./progress-BQMO_-7I.js";import"./prompt-style-CZOeG0sw.js";import"./note-BvXfFmlu.js";import"./clack-prompter-ZmHdfPGJ.js";import"./onboarding-CYOfGpd5.js";import{t as runInteractiveOnboarding}from"./onboard-interactive-ClPMlCIl.js";export{runInteractiveOnboarding};
@@ -1 +1 @@
1
- import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./model-selection-DX_WOc2P.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./io-YzT_09GD.js";import"./manifest-registry-BVDm_CP0.js";import"./config-8x9ZIdfF.js";import"./progress-OKwbfa23.js";import"./prompt-style-BwwmGo3-.js";import"./note-CvzMolLy.js";import"./clack-prompter-6Booc-eg.js";import"./onboarding-CIxLpuFP.js";import{t as runInteractiveOnboarding}from"./onboard-interactive-DyyEDd9a.js";export{runInteractiveOnboarding};
1
+ import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./model-selection-DX_WOc2P.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./io-YzT_09GD.js";import"./manifest-registry-BVDm_CP0.js";import"./config-8x9ZIdfF.js";import"./progress-OKwbfa23.js";import"./prompt-style-BwwmGo3-.js";import"./note-CvzMolLy.js";import"./clack-prompter-6Booc-eg.js";import"./onboarding-DIxm_q7P.js";import{t as runInteractiveOnboarding}from"./onboard-interactive-D6IBBU8m.js";export{runInteractiveOnboarding};
@@ -2,6 +2,6 @@ import{n as DEFAULT_GATEWAY_PORT,u as resolveGatewayPort}from"./paths-BHg-VHB4.j
2
2
  `),`Security`),!await params.prompter.confirm({message:`I understand this is powerful and inherently risky. Continue?`,initialValue:!1})))throw new WizardCancelledError(`risk not accepted`)}function hasConfiguredModelOrAuth(config){let defaultsModel=config.agents?.defaults?.model,hasDefaultModel=typeof defaultsModel?.primary==`string`&&defaultsModel.primary.trim().length>0,hasModelCatalog=!!config.models&&Object.keys(config.models).length>0;return hasDefaultModel||hasModelCatalog}function hasConfiguredChannels(config){let channels=config.channels;return!channels||typeof channels!=`object`?!1:Object.values(channels).some(value=>value==null?!1:typeof value==`boolean`?value:typeof value==`string`?value.trim().length>0:typeof value==`number`?!0:Array.isArray(value)?value.length>0:typeof value==`object`?Object.keys(value).length>0:!1)}async function runOnboardingWizard(opts,runtime=defaultRuntime,prompter){let onboardHelpers=await import(`./onboard-helpers-F6MIUBrc.js`);onboardHelpers.printWizardHeader(runtime),await prompter.intro(`BuilderForceAgents onboarding`),await requireRiskAcknowledgement({opts,prompter});let snapshot=await readConfigFileSnapshot(),baseConfig=snapshot.valid?snapshot.config:{},configHandlingAction=null;if(snapshot.exists&&!snapshot.valid){await prompter.note(onboardHelpers.summarizeExistingConfig(baseConfig),`Invalid config`),snapshot.issues.length>0&&await prompter.note([...snapshot.issues.map(iss=>`- ${iss.path}: ${iss.message}`),``,`Docs: https://docs.builderforce.ai/gateway/configuration`].join(`
3
3
  `),`Config issues`),await prompter.outro(`Config invalid. Run \`${formatCliCommand(`builderforce doctor`)}\` to repair it, then re-run onboarding.`),runtime.exit(1);return}let quickstartHint=`Configure details later via ${formatCliCommand(`builderforce configure`)}.`,explicitFlowRaw=opts.flow?.trim(),normalizedExplicitFlow=explicitFlowRaw===`manual`?`advanced`:explicitFlowRaw;if(normalizedExplicitFlow&&normalizedExplicitFlow!==`quickstart`&&normalizedExplicitFlow!==`advanced`){runtime.error(`Invalid --flow (use quickstart, manual, or advanced).`),runtime.exit(1);return}let flow=(normalizedExplicitFlow===`quickstart`||normalizedExplicitFlow===`advanced`?normalizedExplicitFlow:void 0)??await prompter.select({message:`Onboarding mode`,options:[{value:`quickstart`,label:`QuickStart`,hint:quickstartHint},{value:`advanced`,label:`Manual`,hint:`Configure port, network, Tailscale, and auth options.`}],initialValue:`quickstart`});if(opts.mode===`remote`&&flow===`quickstart`&&(await prompter.note(`QuickStart only supports local gateways. Switching to Manual mode.`,`QuickStart`),flow=`advanced`),snapshot.exists){await prompter.note(onboardHelpers.summarizeExistingConfig(baseConfig),`Existing config detected`);let action=await prompter.select({message:`Config handling
4
4
  (↑/↓ to select, Enter to confirm)`,options:[{value:`keep`,label:`Use existing values`},{value:`modify`,label:`Update values`},{value:`reset`,label:`Reset`}],initialValue:`keep`});if(configHandlingAction=action,action===`reset`){let workspaceDefault=baseConfig.agents?.defaults?.workspace??onboardHelpers.DEFAULT_WORKSPACE,resetScope=await prompter.select({message:`Reset scope`,options:[{value:`config`,label:`Config only`},{value:`config+creds+sessions`,label:`Config + creds + sessions`},{value:`full`,label:`Full reset (config + creds + sessions + workspace)`}]});await onboardHelpers.handleReset(resetScope,resolveUserPath(workspaceDefault),runtime),baseConfig={}}}let keepExistingValues=configHandlingAction===`keep`,quickstartGateway=(()=>{let hasExisting=typeof baseConfig.gateway?.port==`number`||baseConfig.gateway?.bind!==void 0||baseConfig.gateway?.auth?.mode!==void 0||baseConfig.gateway?.auth?.token!==void 0||baseConfig.gateway?.auth?.password!==void 0||baseConfig.gateway?.customBindHost!==void 0||baseConfig.gateway?.tailscale?.mode!==void 0,bindRaw=baseConfig.gateway?.bind,bind=bindRaw===`loopback`||bindRaw===`lan`||bindRaw===`auto`||bindRaw===`custom`||bindRaw===`tailnet`?bindRaw:`loopback`,authMode=`token`;baseConfig.gateway?.auth?.mode===`token`||baseConfig.gateway?.auth?.mode===`password`?authMode=baseConfig.gateway.auth.mode:baseConfig.gateway?.auth?.token?authMode=`token`:baseConfig.gateway?.auth?.password&&(authMode=`password`);let tailscaleRaw=baseConfig.gateway?.tailscale?.mode,tailscaleMode=tailscaleRaw===`off`||tailscaleRaw===`serve`||tailscaleRaw===`funnel`?tailscaleRaw:`off`;return{hasExisting,port:resolveGatewayPort(baseConfig),bind,authMode,tailscaleMode,token:baseConfig.gateway?.auth?.token,password:baseConfig.gateway?.auth?.password,customBindHost:baseConfig.gateway?.customBindHost,tailscaleResetOnExit:baseConfig.gateway?.tailscale?.resetOnExit??!1}})();if(flow===`quickstart`){let formatBind=value=>value===`loopback`?`Loopback (127.0.0.1)`:value===`lan`?`LAN`:value===`custom`?`Custom IP`:value===`tailnet`?`Tailnet (Tailscale IP)`:`Auto`,formatAuth=value=>value===`token`?`Token (default)`:`Password`,formatTailscale=value=>value===`off`?`Off`:value===`serve`?`Serve`:`Funnel`,quickstartLines=quickstartGateway.hasExisting?[`Keeping your current gateway settings:`,`Gateway port: ${quickstartGateway.port}`,`Gateway bind: ${formatBind(quickstartGateway.bind)}`,...quickstartGateway.bind===`custom`&&quickstartGateway.customBindHost?[`Gateway custom IP: ${quickstartGateway.customBindHost}`]:[],`Gateway auth: ${formatAuth(quickstartGateway.authMode)}`,`Tailscale exposure: ${formatTailscale(quickstartGateway.tailscaleMode)}`,`Direct to chat channels.`]:[`Gateway port: ${DEFAULT_GATEWAY_PORT}`,`Gateway bind: Loopback (127.0.0.1)`,`Gateway auth: Token (default)`,`Tailscale exposure: Off`,`Direct to chat channels.`];await prompter.note(quickstartLines.join(`
5
- `),`QuickStart`)}let localPort=resolveGatewayPort(baseConfig),localUrl=`ws://127.0.0.1:${localPort}`,localProbe=await onboardHelpers.probeGatewayReachable({url:localUrl,token:baseConfig.gateway?.auth?.token??process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN,password:baseConfig.gateway?.auth?.password??process.env.BUILDERFORCE_AGENTS_GATEWAY_PASSWORD}),remoteUrl=baseConfig.gateway?.remote?.url?.trim()??``,remoteProbe=remoteUrl?await onboardHelpers.probeGatewayReachable({url:remoteUrl,token:baseConfig.gateway?.remote?.token}):null,mode=opts.mode??(flow===`quickstart`?`local`:await prompter.select({message:`What do you want to set up?`,options:[{value:`local`,label:`Local gateway (this machine)`,hint:localProbe.ok?`Gateway reachable (${localUrl})`:`No gateway detected (${localUrl})`},{value:`remote`,label:`Remote gateway (info-only)`,hint:remoteUrl?remoteProbe?.ok?`Gateway reachable (${remoteUrl})`:`Configured but unreachable (${remoteUrl})`:`No remote URL configured yet`}]}));if(mode===`remote`){let{promptRemoteGatewayConfig}=await import(`./onboard-remote-v50wUib4.js`),{logConfigUpdated}=await import(`./logging-D4Vmeq5J.js`),nextConfig=await promptRemoteGatewayConfig(baseConfig,prompter);nextConfig=onboardHelpers.applyWizardMetadata(nextConfig,{command:`onboard`,mode}),await writeConfigFile(nextConfig),logConfigUpdated(runtime),await prompter.outro(`Remote gateway configured.`);return}let existingWorkspace=baseConfig.agents?.defaults?.workspace??onboardHelpers.DEFAULT_WORKSPACE,workspaceDir=resolveUserPath((opts.workspace??(flow===`quickstart`||keepExistingValues?existingWorkspace:await prompter.text({message:`Workspace directory`,initialValue:existingWorkspace}))).trim()||onboardHelpers.DEFAULT_WORKSPACE),{applyOnboardingLocalWorkspaceConfig}=await import(`./onboard-config-CMPsUvr3.js`),nextConfig=applyOnboardingLocalWorkspaceConfig(baseConfig,workspaceDir),{promptAuthChoiceGrouped}=await import(`./auth-choice-prompt-Cud7to2K.js`),{promptCustomApiConfig}=await import(`./onboard-custom-CyuEuCEI.js`),{applyAuthChoice,resolvePreferredProviderForAuthChoice,warnIfModelConfigLooksOff}=await import(`./auth-choice-BTrUlYmE.js`),{applyPrimaryModel,promptDefaultModel}=await import(`./model-picker-P0i2l0jz.js`);if(keepExistingValues&&hasConfiguredModelOrAuth(nextConfig))await prompter.note(`Keeping existing model/auth configuration.`,`Model/auth provider`);else{let authStore=await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1}),authChoiceFromPrompt=opts.authChoice===void 0,authChoice=opts.authChoice??await promptAuthChoiceGrouped({prompter,store:authStore,includeSkip:!0});if(nextConfig=authChoice===`custom-api-key`?(await promptCustomApiConfig({prompter,runtime,config:nextConfig})).config:(await applyAuthChoice({authChoice,config:nextConfig,prompter,runtime,setDefaultModel:!0,opts:{tokenProvider:opts.tokenProvider,token:opts.authChoice===`apiKey`&&opts.token?opts.token:void 0}})).config,authChoiceFromPrompt&&authChoice!==`custom-api-key`&&authChoice!==`local`&&authChoice!==`builderforcellm`){let modelSelection=await promptDefaultModel({config:nextConfig,prompter,allowKeep:!0,ignoreAllowlist:!0,includeVllm:!0,preferredProvider:resolvePreferredProviderForAuthChoice(authChoice)});modelSelection.config&&(nextConfig=modelSelection.config),modelSelection.model&&(nextConfig=applyPrimaryModel(nextConfig,modelSelection.model))}let primaryModel=typeof nextConfig.agents?.defaults?.model?.primary==`string`?nextConfig.agents.defaults.model.primary.trim().toLowerCase():``;if((primaryModel===`builderforcellm`||primaryModel.startsWith(`builderforcellm/`))&&!(process.env.BUILDERFORCE_API_KEY?.trim()??readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim())){await prompter.note([`BuilderForceAgentsLLM requires Builderforce registration.`,`Complete login/registration now so /model builderforcellm/auto works immediately.`,`You can skip this and connect later — use /setup or: builderforce init --reconnect`].join(`
6
- `),`BuilderForceAgentsLLM`);let{promptBuilderforceOnboarding}=await import(`./builderforce-onboarding-8lL2bgtL.js`);await promptBuilderforceOnboarding({projectRoot:workspaceDir,defaultInstanceName:path.basename(workspaceDir)||`builderforce`,forcePrompt:!0}),(process.env.BUILDERFORCE_API_KEY?.trim()??readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim())||await prompter.note([`BuilderForceAgentsLLM won't work until you connect to Builderforce.`,`You can still use BuilderForceAgents — switch models with /model or connect later.`].join(`
7
- `),`Skipped`)}await warnIfModelConfigLooksOff(nextConfig,prompter)}let alreadyHasLocalBrain=nextConfig.models?.providers?.[`builderforcellm-local`]?.api===`transformers`;if(!opts.skipProviders&&(configHandlingAction!==`keep`||!alreadyHasLocalBrain))if(await prompter.select({message:`Enable local brain (amygdala + hippocampus)?`,options:[{value:`smart`,label:`Enable dual local brain`,hint:`Downloads amygdala (SmolLM2) + hippocampus (Qwen3-0.6B). ~3.5 GB disk.`},{value:`skip`,label:`Skip — use my cortex (configured LLM) only`,hint:`No extra download. Uses whatever model you configured above.`}],initialValue:`skip`})===`smart`){nextConfig={...nextConfig,localBrain:{enabled:!0}};let{downloadAndWireLocalBrain}=await import(`./auth-choice.apply.transformers-B_Q6e8Yk.js`);nextConfig={...(await downloadAndWireLocalBrain({config:nextConfig,prompter})).config}}else nextConfig={...nextConfig,localBrain:{enabled:!1}};let settings;if(keepExistingValues&&quickstartGateway.hasExisting)settings={port:quickstartGateway.port,bind:quickstartGateway.bind,customBindHost:quickstartGateway.bind===`custom`?quickstartGateway.customBindHost:void 0,authMode:quickstartGateway.authMode,gatewayToken:quickstartGateway.authMode===`token`?quickstartGateway.token:void 0,tailscaleMode:quickstartGateway.tailscaleMode,tailscaleResetOnExit:quickstartGateway.tailscaleResetOnExit},await prompter.note(`Keeping existing gateway settings.`,`Gateway`);else{let{configureGatewayForOnboarding}=await import(`./onboarding.gateway-config-BNaqaFo1.js`),gateway=await configureGatewayForOnboarding({flow,baseConfig,nextConfig,localPort,quickstartGateway,prompter,runtime});nextConfig=gateway.nextConfig,settings=gateway.settings}let skipChannelsForKeep=keepExistingValues&&hasConfiguredChannels(nextConfig);if(opts.skipChannels??opts.skipProviders??skipChannelsForKeep)await prompter.note(`Skipping channel setup.`,`Channels`);else{let{listChannelPlugins}=await import(`./plugins-r-hGfiMK.js`),{setupChannels}=await import(`./onboard-channels-Dzyeem1L.js`),quickstartAllowFromChannels=flow===`quickstart`?listChannelPlugins().filter(plugin=>plugin.meta.quickstartAllowFrom).map(plugin=>plugin.id):[];nextConfig=await setupChannels(nextConfig,runtime,prompter,{allowSignalInstall:!0,forceAllowFromChannels:quickstartAllowFromChannels,skipDmPolicyPrompt:flow===`quickstart`,skipConfirm:flow===`quickstart`,quickstartDefaults:flow===`quickstart`})}await writeConfigFile(nextConfig);let{logConfigUpdated}=await import(`./logging-D4Vmeq5J.js`);logConfigUpdated(runtime),await onboardHelpers.ensureWorkspaceAndSessions(workspaceDir,runtime,{skipBootstrap:!!nextConfig.agents?.defaults?.skipBootstrap});let{isBuilderForceAgentsProject,initializeBuilderForceAgentsProject}=await import(`./project-context-PiiAmwVd.js`);if(await isBuilderForceAgentsProject(workspaceDir)||(await initializeBuilderForceAgentsProject(workspaceDir),runtime.log(`Initialised .builderforce/ project directory`)),opts.skipSkills)await prompter.note(`Skipping skills setup.`,`Skills`);else{let{setupSkills}=await import(`./onboard-skills-DlBWAzBP.js`);nextConfig=await setupSkills(nextConfig,workspaceDir,runtime,prompter)}let{setupInternalHooks}=await import(`./onboard-hooks-CrugiBPj.js`);nextConfig=await setupInternalHooks(nextConfig,runtime,prompter),nextConfig=onboardHelpers.applyWizardMetadata(nextConfig,{command:`onboard`,mode}),await writeConfigFile(nextConfig);let{finalizeOnboardingWizard}=await import(`./onboarding.finalize-R3TfibWY.js`),{launchedTui}=await finalizeOnboardingWizard({flow,opts,baseConfig,nextConfig,workspaceDir,settings,prompter,runtime})}export{runOnboardingWizard as t};
5
+ `),`QuickStart`)}let localPort=resolveGatewayPort(baseConfig),localUrl=`ws://127.0.0.1:${localPort}`,localProbe=await onboardHelpers.probeGatewayReachable({url:localUrl,token:baseConfig.gateway?.auth?.token??process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN,password:baseConfig.gateway?.auth?.password??process.env.BUILDERFORCE_AGENTS_GATEWAY_PASSWORD}),remoteUrl=baseConfig.gateway?.remote?.url?.trim()??``,remoteProbe=remoteUrl?await onboardHelpers.probeGatewayReachable({url:remoteUrl,token:baseConfig.gateway?.remote?.token}):null,mode=opts.mode??(flow===`quickstart`?`local`:await prompter.select({message:`What do you want to set up?`,options:[{value:`local`,label:`Local gateway (this machine)`,hint:localProbe.ok?`Gateway reachable (${localUrl})`:`No gateway detected (${localUrl})`},{value:`remote`,label:`Remote gateway (info-only)`,hint:remoteUrl?remoteProbe?.ok?`Gateway reachable (${remoteUrl})`:`Configured but unreachable (${remoteUrl})`:`No remote URL configured yet`}]}));if(mode===`remote`){let{promptRemoteGatewayConfig}=await import(`./onboard-remote-v50wUib4.js`),{logConfigUpdated}=await import(`./logging-D4Vmeq5J.js`),nextConfig=await promptRemoteGatewayConfig(baseConfig,prompter);nextConfig=onboardHelpers.applyWizardMetadata(nextConfig,{command:`onboard`,mode}),await writeConfigFile(nextConfig),logConfigUpdated(runtime),await prompter.outro(`Remote gateway configured.`);return}let existingWorkspace=baseConfig.agents?.defaults?.workspace??onboardHelpers.DEFAULT_WORKSPACE,workspaceDir=resolveUserPath((opts.workspace??(flow===`quickstart`||keepExistingValues?existingWorkspace:await prompter.text({message:`Workspace directory`,initialValue:existingWorkspace}))).trim()||onboardHelpers.DEFAULT_WORKSPACE),{applyOnboardingLocalWorkspaceConfig}=await import(`./onboard-config-CMPsUvr3.js`),nextConfig=applyOnboardingLocalWorkspaceConfig(baseConfig,workspaceDir),{promptAuthChoiceGrouped}=await import(`./auth-choice-prompt-Cud7to2K.js`),{promptCustomApiConfig}=await import(`./onboard-custom-CyuEuCEI.js`),{applyAuthChoice,resolvePreferredProviderForAuthChoice,warnIfModelConfigLooksOff}=await import(`./auth-choice-DyxxR025.js`),{applyPrimaryModel,promptDefaultModel}=await import(`./model-picker-P0i2l0jz.js`);if(keepExistingValues&&hasConfiguredModelOrAuth(nextConfig))await prompter.note(`Keeping existing model/auth configuration.`,`Model/auth provider`);else{let authStore=await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1}),authChoiceFromPrompt=opts.authChoice===void 0,authChoice=opts.authChoice??await promptAuthChoiceGrouped({prompter,store:authStore,includeSkip:!0});if(nextConfig=authChoice===`custom-api-key`?(await promptCustomApiConfig({prompter,runtime,config:nextConfig})).config:(await applyAuthChoice({authChoice,config:nextConfig,prompter,runtime,setDefaultModel:!0,opts:{tokenProvider:opts.tokenProvider,token:opts.authChoice===`apiKey`&&opts.token?opts.token:void 0}})).config,authChoiceFromPrompt&&authChoice!==`custom-api-key`&&authChoice!==`local`&&authChoice!==`builderforcellm`){let modelSelection=await promptDefaultModel({config:nextConfig,prompter,allowKeep:!0,ignoreAllowlist:!0,includeVllm:!0,preferredProvider:resolvePreferredProviderForAuthChoice(authChoice)});modelSelection.config&&(nextConfig=modelSelection.config),modelSelection.model&&(nextConfig=applyPrimaryModel(nextConfig,modelSelection.model))}let primaryModel=typeof nextConfig.agents?.defaults?.model?.primary==`string`?nextConfig.agents.defaults.model.primary.trim().toLowerCase():``;if((primaryModel===`builderforcellm`||primaryModel.startsWith(`builderforcellm/`))&&!(process.env.BUILDERFORCE_API_KEY?.trim()??readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim())){await prompter.note([`BuilderForceAgentsLLM requires Builderforce registration.`,`Complete login/registration now so /model builderforcellm/auto works immediately.`,`You can skip this and connect later — use /setup or: builderforce init --reconnect`].join(`
6
+ `),`BuilderForceAgentsLLM`);let{promptBuilderforceOnboarding}=await import(`./builderforce-onboarding-DyYM_cib.js`);await promptBuilderforceOnboarding({projectRoot:workspaceDir,defaultInstanceName:path.basename(workspaceDir)||`builderforce`,forcePrompt:!0}),(process.env.BUILDERFORCE_API_KEY?.trim()??readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim())||await prompter.note([`BuilderForceAgentsLLM won't work until you connect to Builderforce.`,`You can still use BuilderForceAgents — switch models with /model or connect later.`].join(`
7
+ `),`Skipped`)}await warnIfModelConfigLooksOff(nextConfig,prompter)}let alreadyHasLocalBrain=nextConfig.models?.providers?.[`builderforcellm-local`]?.api===`transformers`;if(!opts.skipProviders&&(configHandlingAction!==`keep`||!alreadyHasLocalBrain))if(await prompter.select({message:`Enable local brain (amygdala + hippocampus)?`,options:[{value:`smart`,label:`Enable dual local brain`,hint:`Downloads amygdala (SmolLM2) + hippocampus (Qwen3-0.6B). ~3.5 GB disk.`},{value:`skip`,label:`Skip — use my cortex (configured LLM) only`,hint:`No extra download. Uses whatever model you configured above.`}],initialValue:`skip`})===`smart`){nextConfig={...nextConfig,localBrain:{enabled:!0}};let{downloadAndWireLocalBrain}=await import(`./auth-choice.apply.transformers-CqQSUnsx.js`);nextConfig={...(await downloadAndWireLocalBrain({config:nextConfig,prompter})).config}}else nextConfig={...nextConfig,localBrain:{enabled:!1}};let settings;if(keepExistingValues&&quickstartGateway.hasExisting)settings={port:quickstartGateway.port,bind:quickstartGateway.bind,customBindHost:quickstartGateway.bind===`custom`?quickstartGateway.customBindHost:void 0,authMode:quickstartGateway.authMode,gatewayToken:quickstartGateway.authMode===`token`?quickstartGateway.token:void 0,tailscaleMode:quickstartGateway.tailscaleMode,tailscaleResetOnExit:quickstartGateway.tailscaleResetOnExit},await prompter.note(`Keeping existing gateway settings.`,`Gateway`);else{let{configureGatewayForOnboarding}=await import(`./onboarding.gateway-config-BNaqaFo1.js`),gateway=await configureGatewayForOnboarding({flow,baseConfig,nextConfig,localPort,quickstartGateway,prompter,runtime});nextConfig=gateway.nextConfig,settings=gateway.settings}let skipChannelsForKeep=keepExistingValues&&hasConfiguredChannels(nextConfig);if(opts.skipChannels??opts.skipProviders??skipChannelsForKeep)await prompter.note(`Skipping channel setup.`,`Channels`);else{let{listChannelPlugins}=await import(`./plugins-BbovMu2g.js`),{setupChannels}=await import(`./onboard-channels-BkrhZ79I.js`),quickstartAllowFromChannels=flow===`quickstart`?listChannelPlugins().filter(plugin=>plugin.meta.quickstartAllowFrom).map(plugin=>plugin.id):[];nextConfig=await setupChannels(nextConfig,runtime,prompter,{allowSignalInstall:!0,forceAllowFromChannels:quickstartAllowFromChannels,skipDmPolicyPrompt:flow===`quickstart`,skipConfirm:flow===`quickstart`,quickstartDefaults:flow===`quickstart`})}await writeConfigFile(nextConfig);let{logConfigUpdated}=await import(`./logging-D4Vmeq5J.js`);logConfigUpdated(runtime),await onboardHelpers.ensureWorkspaceAndSessions(workspaceDir,runtime,{skipBootstrap:!!nextConfig.agents?.defaults?.skipBootstrap});let{isBuilderForceAgentsProject,initializeBuilderForceAgentsProject}=await import(`./project-context-nIzFswHk.js`);if(await isBuilderForceAgentsProject(workspaceDir)||(await initializeBuilderForceAgentsProject(workspaceDir),runtime.log(`Initialised .builderforce/ project directory`)),opts.skipSkills)await prompter.note(`Skipping skills setup.`,`Skills`);else{let{setupSkills}=await import(`./onboard-skills-DlBWAzBP.js`);nextConfig=await setupSkills(nextConfig,workspaceDir,runtime,prompter)}let{setupInternalHooks}=await import(`./onboard-hooks-CrugiBPj.js`);nextConfig=await setupInternalHooks(nextConfig,runtime,prompter),nextConfig=onboardHelpers.applyWizardMetadata(nextConfig,{command:`onboard`,mode}),await writeConfigFile(nextConfig);let{finalizeOnboardingWizard}=await import(`./onboarding.finalize-DAwpQa7n.js`),{launchedTui}=await finalizeOnboardingWizard({flow,opts,baseConfig,nextConfig,workspaceDir,settings,prompter,runtime})}export{runOnboardingWizard as t};
@@ -2,6 +2,6 @@ import{n as DEFAULT_GATEWAY_PORT,u as resolveGatewayPort}from"./paths-5FcIFMsj.j
2
2
  `),`Security`),!await params.prompter.confirm({message:`I understand this is powerful and inherently risky. Continue?`,initialValue:!1})))throw new WizardCancelledError(`risk not accepted`)}function hasConfiguredModelOrAuth(config){let defaultsModel=config.agents?.defaults?.model,hasDefaultModel=typeof defaultsModel?.primary==`string`&&defaultsModel.primary.trim().length>0,hasModelCatalog=!!config.models&&Object.keys(config.models).length>0;return hasDefaultModel||hasModelCatalog}function hasConfiguredChannels(config){let channels=config.channels;return!channels||typeof channels!=`object`?!1:Object.values(channels).some(value=>value==null?!1:typeof value==`boolean`?value:typeof value==`string`?value.trim().length>0:typeof value==`number`?!0:Array.isArray(value)?value.length>0:typeof value==`object`?Object.keys(value).length>0:!1)}async function runOnboardingWizard(opts,runtime=defaultRuntime,prompter){let onboardHelpers=await import(`./onboard-helpers-jnhuZPLE.js`);onboardHelpers.printWizardHeader(runtime),await prompter.intro(`BuilderForceAgents onboarding`),await requireRiskAcknowledgement({opts,prompter});let snapshot=await readConfigFileSnapshot(),baseConfig=snapshot.valid?snapshot.config:{},configHandlingAction=null;if(snapshot.exists&&!snapshot.valid){await prompter.note(onboardHelpers.summarizeExistingConfig(baseConfig),`Invalid config`),snapshot.issues.length>0&&await prompter.note([...snapshot.issues.map(iss=>`- ${iss.path}: ${iss.message}`),``,`Docs: https://docs.builderforce.ai/gateway/configuration`].join(`
3
3
  `),`Config issues`),await prompter.outro(`Config invalid. Run \`${formatCliCommand(`builderforce doctor`)}\` to repair it, then re-run onboarding.`),runtime.exit(1);return}let quickstartHint=`Configure details later via ${formatCliCommand(`builderforce configure`)}.`,explicitFlowRaw=opts.flow?.trim(),normalizedExplicitFlow=explicitFlowRaw===`manual`?`advanced`:explicitFlowRaw;if(normalizedExplicitFlow&&normalizedExplicitFlow!==`quickstart`&&normalizedExplicitFlow!==`advanced`){runtime.error(`Invalid --flow (use quickstart, manual, or advanced).`),runtime.exit(1);return}let flow=(normalizedExplicitFlow===`quickstart`||normalizedExplicitFlow===`advanced`?normalizedExplicitFlow:void 0)??await prompter.select({message:`Onboarding mode`,options:[{value:`quickstart`,label:`QuickStart`,hint:quickstartHint},{value:`advanced`,label:`Manual`,hint:`Configure port, network, Tailscale, and auth options.`}],initialValue:`quickstart`});if(opts.mode===`remote`&&flow===`quickstart`&&(await prompter.note(`QuickStart only supports local gateways. Switching to Manual mode.`,`QuickStart`),flow=`advanced`),snapshot.exists){await prompter.note(onboardHelpers.summarizeExistingConfig(baseConfig),`Existing config detected`);let action=await prompter.select({message:`Config handling
4
4
  (↑/↓ to select, Enter to confirm)`,options:[{value:`keep`,label:`Use existing values`},{value:`modify`,label:`Update values`},{value:`reset`,label:`Reset`}],initialValue:`keep`});if(configHandlingAction=action,action===`reset`){let workspaceDefault=baseConfig.agents?.defaults?.workspace??onboardHelpers.DEFAULT_WORKSPACE,resetScope=await prompter.select({message:`Reset scope`,options:[{value:`config`,label:`Config only`},{value:`config+creds+sessions`,label:`Config + creds + sessions`},{value:`full`,label:`Full reset (config + creds + sessions + workspace)`}]});await onboardHelpers.handleReset(resetScope,resolveUserPath(workspaceDefault),runtime),baseConfig={}}}let keepExistingValues=configHandlingAction===`keep`,quickstartGateway=(()=>{let hasExisting=typeof baseConfig.gateway?.port==`number`||baseConfig.gateway?.bind!==void 0||baseConfig.gateway?.auth?.mode!==void 0||baseConfig.gateway?.auth?.token!==void 0||baseConfig.gateway?.auth?.password!==void 0||baseConfig.gateway?.customBindHost!==void 0||baseConfig.gateway?.tailscale?.mode!==void 0,bindRaw=baseConfig.gateway?.bind,bind=bindRaw===`loopback`||bindRaw===`lan`||bindRaw===`auto`||bindRaw===`custom`||bindRaw===`tailnet`?bindRaw:`loopback`,authMode=`token`;baseConfig.gateway?.auth?.mode===`token`||baseConfig.gateway?.auth?.mode===`password`?authMode=baseConfig.gateway.auth.mode:baseConfig.gateway?.auth?.token?authMode=`token`:baseConfig.gateway?.auth?.password&&(authMode=`password`);let tailscaleRaw=baseConfig.gateway?.tailscale?.mode,tailscaleMode=tailscaleRaw===`off`||tailscaleRaw===`serve`||tailscaleRaw===`funnel`?tailscaleRaw:`off`;return{hasExisting,port:resolveGatewayPort(baseConfig),bind,authMode,tailscaleMode,token:baseConfig.gateway?.auth?.token,password:baseConfig.gateway?.auth?.password,customBindHost:baseConfig.gateway?.customBindHost,tailscaleResetOnExit:baseConfig.gateway?.tailscale?.resetOnExit??!1}})();if(flow===`quickstart`){let formatBind=value=>value===`loopback`?`Loopback (127.0.0.1)`:value===`lan`?`LAN`:value===`custom`?`Custom IP`:value===`tailnet`?`Tailnet (Tailscale IP)`:`Auto`,formatAuth=value=>value===`token`?`Token (default)`:`Password`,formatTailscale=value=>value===`off`?`Off`:value===`serve`?`Serve`:`Funnel`,quickstartLines=quickstartGateway.hasExisting?[`Keeping your current gateway settings:`,`Gateway port: ${quickstartGateway.port}`,`Gateway bind: ${formatBind(quickstartGateway.bind)}`,...quickstartGateway.bind===`custom`&&quickstartGateway.customBindHost?[`Gateway custom IP: ${quickstartGateway.customBindHost}`]:[],`Gateway auth: ${formatAuth(quickstartGateway.authMode)}`,`Tailscale exposure: ${formatTailscale(quickstartGateway.tailscaleMode)}`,`Direct to chat channels.`]:[`Gateway port: ${DEFAULT_GATEWAY_PORT}`,`Gateway bind: Loopback (127.0.0.1)`,`Gateway auth: Token (default)`,`Tailscale exposure: Off`,`Direct to chat channels.`];await prompter.note(quickstartLines.join(`
5
- `),`QuickStart`)}let localPort=resolveGatewayPort(baseConfig),localUrl=`ws://127.0.0.1:${localPort}`,localProbe=await onboardHelpers.probeGatewayReachable({url:localUrl,token:baseConfig.gateway?.auth?.token??process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN,password:baseConfig.gateway?.auth?.password??process.env.BUILDERFORCE_AGENTS_GATEWAY_PASSWORD}),remoteUrl=baseConfig.gateway?.remote?.url?.trim()??``,remoteProbe=remoteUrl?await onboardHelpers.probeGatewayReachable({url:remoteUrl,token:baseConfig.gateway?.remote?.token}):null,mode=opts.mode??(flow===`quickstart`?`local`:await prompter.select({message:`What do you want to set up?`,options:[{value:`local`,label:`Local gateway (this machine)`,hint:localProbe.ok?`Gateway reachable (${localUrl})`:`No gateway detected (${localUrl})`},{value:`remote`,label:`Remote gateway (info-only)`,hint:remoteUrl?remoteProbe?.ok?`Gateway reachable (${remoteUrl})`:`Configured but unreachable (${remoteUrl})`:`No remote URL configured yet`}]}));if(mode===`remote`){let{promptRemoteGatewayConfig}=await import(`./onboard-remote-D6j9TC3k.js`),{logConfigUpdated}=await import(`./logging-w_mSBioQ.js`),nextConfig=await promptRemoteGatewayConfig(baseConfig,prompter);nextConfig=onboardHelpers.applyWizardMetadata(nextConfig,{command:`onboard`,mode}),await writeConfigFile(nextConfig),logConfigUpdated(runtime),await prompter.outro(`Remote gateway configured.`);return}let existingWorkspace=baseConfig.agents?.defaults?.workspace??onboardHelpers.DEFAULT_WORKSPACE,workspaceDir=resolveUserPath((opts.workspace??(flow===`quickstart`||keepExistingValues?existingWorkspace:await prompter.text({message:`Workspace directory`,initialValue:existingWorkspace}))).trim()||onboardHelpers.DEFAULT_WORKSPACE),{applyOnboardingLocalWorkspaceConfig}=await import(`./onboard-config-B3Zn5Npn.js`),nextConfig=applyOnboardingLocalWorkspaceConfig(baseConfig,workspaceDir),{promptAuthChoiceGrouped}=await import(`./auth-choice-prompt-CnzOJKa0.js`),{promptCustomApiConfig}=await import(`./onboard-custom-CEtUttHQ.js`),{applyAuthChoice,resolvePreferredProviderForAuthChoice,warnIfModelConfigLooksOff}=await import(`./auth-choice-DSLN0TLU.js`),{applyPrimaryModel,promptDefaultModel}=await import(`./model-picker-BSKYL_Pa.js`);if(keepExistingValues&&hasConfiguredModelOrAuth(nextConfig))await prompter.note(`Keeping existing model/auth configuration.`,`Model/auth provider`);else{let authStore=await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1}),authChoiceFromPrompt=opts.authChoice===void 0,authChoice=opts.authChoice??await promptAuthChoiceGrouped({prompter,store:authStore,includeSkip:!0});if(nextConfig=authChoice===`custom-api-key`?(await promptCustomApiConfig({prompter,runtime,config:nextConfig})).config:(await applyAuthChoice({authChoice,config:nextConfig,prompter,runtime,setDefaultModel:!0,opts:{tokenProvider:opts.tokenProvider,token:opts.authChoice===`apiKey`&&opts.token?opts.token:void 0}})).config,authChoiceFromPrompt&&authChoice!==`custom-api-key`&&authChoice!==`local`&&authChoice!==`builderforcellm`){let modelSelection=await promptDefaultModel({config:nextConfig,prompter,allowKeep:!0,ignoreAllowlist:!0,includeVllm:!0,preferredProvider:resolvePreferredProviderForAuthChoice(authChoice)});modelSelection.config&&(nextConfig=modelSelection.config),modelSelection.model&&(nextConfig=applyPrimaryModel(nextConfig,modelSelection.model))}let primaryModel=typeof nextConfig.agents?.defaults?.model?.primary==`string`?nextConfig.agents.defaults.model.primary.trim().toLowerCase():``;if((primaryModel===`builderforcellm`||primaryModel.startsWith(`builderforcellm/`))&&!(process.env.BUILDERFORCE_API_KEY?.trim()??readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim())){await prompter.note([`BuilderForceAgentsLLM requires Builderforce registration.`,`Complete login/registration now so /model builderforcellm/auto works immediately.`,`You can skip this and connect later — use /setup or: builderforce init --reconnect`].join(`
6
- `),`BuilderForceAgentsLLM`);let{promptBuilderforceOnboarding}=await import(`./builderforce-onboarding-Bbjz8F-r.js`);await promptBuilderforceOnboarding({projectRoot:workspaceDir,defaultInstanceName:path.basename(workspaceDir)||`builderforce`,forcePrompt:!0}),(process.env.BUILDERFORCE_API_KEY?.trim()??readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim())||await prompter.note([`BuilderForceAgentsLLM won't work until you connect to Builderforce.`,`You can still use BuilderForceAgents — switch models with /model or connect later.`].join(`
7
- `),`Skipped`)}await warnIfModelConfigLooksOff(nextConfig,prompter)}let alreadyHasLocalBrain=nextConfig.models?.providers?.[`builderforcellm-local`]?.api===`transformers`;if(!opts.skipProviders&&(configHandlingAction!==`keep`||!alreadyHasLocalBrain))if(await prompter.select({message:`Enable local brain (amygdala + hippocampus)?`,options:[{value:`smart`,label:`Enable dual local brain`,hint:`Downloads amygdala (SmolLM2) + hippocampus (Qwen3-0.6B). ~3.5 GB disk.`},{value:`skip`,label:`Skip — use my cortex (configured LLM) only`,hint:`No extra download. Uses whatever model you configured above.`}],initialValue:`skip`})===`smart`){nextConfig={...nextConfig,localBrain:{enabled:!0}};let{downloadAndWireLocalBrain}=await import(`./auth-choice.apply.transformers-BJbpyCWs.js`);nextConfig={...(await downloadAndWireLocalBrain({config:nextConfig,prompter})).config}}else nextConfig={...nextConfig,localBrain:{enabled:!1}};let settings;if(keepExistingValues&&quickstartGateway.hasExisting)settings={port:quickstartGateway.port,bind:quickstartGateway.bind,customBindHost:quickstartGateway.bind===`custom`?quickstartGateway.customBindHost:void 0,authMode:quickstartGateway.authMode,gatewayToken:quickstartGateway.authMode===`token`?quickstartGateway.token:void 0,tailscaleMode:quickstartGateway.tailscaleMode,tailscaleResetOnExit:quickstartGateway.tailscaleResetOnExit},await prompter.note(`Keeping existing gateway settings.`,`Gateway`);else{let{configureGatewayForOnboarding}=await import(`./onboarding.gateway-config-CcfuZQS2.js`),gateway=await configureGatewayForOnboarding({flow,baseConfig,nextConfig,localPort,quickstartGateway,prompter,runtime});nextConfig=gateway.nextConfig,settings=gateway.settings}let skipChannelsForKeep=keepExistingValues&&hasConfiguredChannels(nextConfig);if(opts.skipChannels??opts.skipProviders??skipChannelsForKeep)await prompter.note(`Skipping channel setup.`,`Channels`);else{let{listChannelPlugins}=await import(`./plugins-ChYVZuHy.js`),{setupChannels}=await import(`./onboard-channels-UZOCuxN7.js`),quickstartAllowFromChannels=flow===`quickstart`?listChannelPlugins().filter(plugin=>plugin.meta.quickstartAllowFrom).map(plugin=>plugin.id):[];nextConfig=await setupChannels(nextConfig,runtime,prompter,{allowSignalInstall:!0,forceAllowFromChannels:quickstartAllowFromChannels,skipDmPolicyPrompt:flow===`quickstart`,skipConfirm:flow===`quickstart`,quickstartDefaults:flow===`quickstart`})}await writeConfigFile(nextConfig);let{logConfigUpdated}=await import(`./logging-w_mSBioQ.js`);logConfigUpdated(runtime),await onboardHelpers.ensureWorkspaceAndSessions(workspaceDir,runtime,{skipBootstrap:!!nextConfig.agents?.defaults?.skipBootstrap});let{isBuilderForceAgentsProject,initializeBuilderForceAgentsProject}=await import(`./project-context-DS52UwJZ.js`);if(await isBuilderForceAgentsProject(workspaceDir)||(await initializeBuilderForceAgentsProject(workspaceDir),runtime.log(`Initialised .builderforce/ project directory`)),opts.skipSkills)await prompter.note(`Skipping skills setup.`,`Skills`);else{let{setupSkills}=await import(`./onboard-skills-DYFWCGKC.js`);nextConfig=await setupSkills(nextConfig,workspaceDir,runtime,prompter)}let{setupInternalHooks}=await import(`./onboard-hooks-DbJtjUUC.js`);nextConfig=await setupInternalHooks(nextConfig,runtime,prompter),nextConfig=onboardHelpers.applyWizardMetadata(nextConfig,{command:`onboard`,mode}),await writeConfigFile(nextConfig);let{finalizeOnboardingWizard}=await import(`./onboarding.finalize-CGGbkAOL.js`),{launchedTui}=await finalizeOnboardingWizard({flow,opts,baseConfig,nextConfig,workspaceDir,settings,prompter,runtime})}export{runOnboardingWizard as t};
5
+ `),`QuickStart`)}let localPort=resolveGatewayPort(baseConfig),localUrl=`ws://127.0.0.1:${localPort}`,localProbe=await onboardHelpers.probeGatewayReachable({url:localUrl,token:baseConfig.gateway?.auth?.token??process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN,password:baseConfig.gateway?.auth?.password??process.env.BUILDERFORCE_AGENTS_GATEWAY_PASSWORD}),remoteUrl=baseConfig.gateway?.remote?.url?.trim()??``,remoteProbe=remoteUrl?await onboardHelpers.probeGatewayReachable({url:remoteUrl,token:baseConfig.gateway?.remote?.token}):null,mode=opts.mode??(flow===`quickstart`?`local`:await prompter.select({message:`What do you want to set up?`,options:[{value:`local`,label:`Local gateway (this machine)`,hint:localProbe.ok?`Gateway reachable (${localUrl})`:`No gateway detected (${localUrl})`},{value:`remote`,label:`Remote gateway (info-only)`,hint:remoteUrl?remoteProbe?.ok?`Gateway reachable (${remoteUrl})`:`Configured but unreachable (${remoteUrl})`:`No remote URL configured yet`}]}));if(mode===`remote`){let{promptRemoteGatewayConfig}=await import(`./onboard-remote-D6j9TC3k.js`),{logConfigUpdated}=await import(`./logging-w_mSBioQ.js`),nextConfig=await promptRemoteGatewayConfig(baseConfig,prompter);nextConfig=onboardHelpers.applyWizardMetadata(nextConfig,{command:`onboard`,mode}),await writeConfigFile(nextConfig),logConfigUpdated(runtime),await prompter.outro(`Remote gateway configured.`);return}let existingWorkspace=baseConfig.agents?.defaults?.workspace??onboardHelpers.DEFAULT_WORKSPACE,workspaceDir=resolveUserPath((opts.workspace??(flow===`quickstart`||keepExistingValues?existingWorkspace:await prompter.text({message:`Workspace directory`,initialValue:existingWorkspace}))).trim()||onboardHelpers.DEFAULT_WORKSPACE),{applyOnboardingLocalWorkspaceConfig}=await import(`./onboard-config-B3Zn5Npn.js`),nextConfig=applyOnboardingLocalWorkspaceConfig(baseConfig,workspaceDir),{promptAuthChoiceGrouped}=await import(`./auth-choice-prompt-CnzOJKa0.js`),{promptCustomApiConfig}=await import(`./onboard-custom-CEtUttHQ.js`),{applyAuthChoice,resolvePreferredProviderForAuthChoice,warnIfModelConfigLooksOff}=await import(`./auth-choice-D06_TWBf.js`),{applyPrimaryModel,promptDefaultModel}=await import(`./model-picker-BSKYL_Pa.js`);if(keepExistingValues&&hasConfiguredModelOrAuth(nextConfig))await prompter.note(`Keeping existing model/auth configuration.`,`Model/auth provider`);else{let authStore=await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1}),authChoiceFromPrompt=opts.authChoice===void 0,authChoice=opts.authChoice??await promptAuthChoiceGrouped({prompter,store:authStore,includeSkip:!0});if(nextConfig=authChoice===`custom-api-key`?(await promptCustomApiConfig({prompter,runtime,config:nextConfig})).config:(await applyAuthChoice({authChoice,config:nextConfig,prompter,runtime,setDefaultModel:!0,opts:{tokenProvider:opts.tokenProvider,token:opts.authChoice===`apiKey`&&opts.token?opts.token:void 0}})).config,authChoiceFromPrompt&&authChoice!==`custom-api-key`&&authChoice!==`local`&&authChoice!==`builderforcellm`){let modelSelection=await promptDefaultModel({config:nextConfig,prompter,allowKeep:!0,ignoreAllowlist:!0,includeVllm:!0,preferredProvider:resolvePreferredProviderForAuthChoice(authChoice)});modelSelection.config&&(nextConfig=modelSelection.config),modelSelection.model&&(nextConfig=applyPrimaryModel(nextConfig,modelSelection.model))}let primaryModel=typeof nextConfig.agents?.defaults?.model?.primary==`string`?nextConfig.agents.defaults.model.primary.trim().toLowerCase():``;if((primaryModel===`builderforcellm`||primaryModel.startsWith(`builderforcellm/`))&&!(process.env.BUILDERFORCE_API_KEY?.trim()??readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim())){await prompter.note([`BuilderForceAgentsLLM requires Builderforce registration.`,`Complete login/registration now so /model builderforcellm/auto works immediately.`,`You can skip this and connect later — use /setup or: builderforce init --reconnect`].join(`
6
+ `),`BuilderForceAgentsLLM`);let{promptBuilderforceOnboarding}=await import(`./builderforce-onboarding-CoGJY95Q.js`);await promptBuilderforceOnboarding({projectRoot:workspaceDir,defaultInstanceName:path.basename(workspaceDir)||`builderforce`,forcePrompt:!0}),(process.env.BUILDERFORCE_API_KEY?.trim()??readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim())||await prompter.note([`BuilderForceAgentsLLM won't work until you connect to Builderforce.`,`You can still use BuilderForceAgents — switch models with /model or connect later.`].join(`
7
+ `),`Skipped`)}await warnIfModelConfigLooksOff(nextConfig,prompter)}let alreadyHasLocalBrain=nextConfig.models?.providers?.[`builderforcellm-local`]?.api===`transformers`;if(!opts.skipProviders&&(configHandlingAction!==`keep`||!alreadyHasLocalBrain))if(await prompter.select({message:`Enable local brain (amygdala + hippocampus)?`,options:[{value:`smart`,label:`Enable dual local brain`,hint:`Downloads amygdala (SmolLM2) + hippocampus (Qwen3-0.6B). ~3.5 GB disk.`},{value:`skip`,label:`Skip — use my cortex (configured LLM) only`,hint:`No extra download. Uses whatever model you configured above.`}],initialValue:`skip`})===`smart`){nextConfig={...nextConfig,localBrain:{enabled:!0}};let{downloadAndWireLocalBrain}=await import(`./auth-choice.apply.transformers-DizfkAmz.js`);nextConfig={...(await downloadAndWireLocalBrain({config:nextConfig,prompter})).config}}else nextConfig={...nextConfig,localBrain:{enabled:!1}};let settings;if(keepExistingValues&&quickstartGateway.hasExisting)settings={port:quickstartGateway.port,bind:quickstartGateway.bind,customBindHost:quickstartGateway.bind===`custom`?quickstartGateway.customBindHost:void 0,authMode:quickstartGateway.authMode,gatewayToken:quickstartGateway.authMode===`token`?quickstartGateway.token:void 0,tailscaleMode:quickstartGateway.tailscaleMode,tailscaleResetOnExit:quickstartGateway.tailscaleResetOnExit},await prompter.note(`Keeping existing gateway settings.`,`Gateway`);else{let{configureGatewayForOnboarding}=await import(`./onboarding.gateway-config-CcfuZQS2.js`),gateway=await configureGatewayForOnboarding({flow,baseConfig,nextConfig,localPort,quickstartGateway,prompter,runtime});nextConfig=gateway.nextConfig,settings=gateway.settings}let skipChannelsForKeep=keepExistingValues&&hasConfiguredChannels(nextConfig);if(opts.skipChannels??opts.skipProviders??skipChannelsForKeep)await prompter.note(`Skipping channel setup.`,`Channels`);else{let{listChannelPlugins}=await import(`./plugins-DrkC1ANW.js`),{setupChannels}=await import(`./onboard-channels-fyGQ1v4S.js`),quickstartAllowFromChannels=flow===`quickstart`?listChannelPlugins().filter(plugin=>plugin.meta.quickstartAllowFrom).map(plugin=>plugin.id):[];nextConfig=await setupChannels(nextConfig,runtime,prompter,{allowSignalInstall:!0,forceAllowFromChannels:quickstartAllowFromChannels,skipDmPolicyPrompt:flow===`quickstart`,skipConfirm:flow===`quickstart`,quickstartDefaults:flow===`quickstart`})}await writeConfigFile(nextConfig);let{logConfigUpdated}=await import(`./logging-w_mSBioQ.js`);logConfigUpdated(runtime),await onboardHelpers.ensureWorkspaceAndSessions(workspaceDir,runtime,{skipBootstrap:!!nextConfig.agents?.defaults?.skipBootstrap});let{isBuilderForceAgentsProject,initializeBuilderForceAgentsProject}=await import(`./project-context-DbBD_r4v.js`);if(await isBuilderForceAgentsProject(workspaceDir)||(await initializeBuilderForceAgentsProject(workspaceDir),runtime.log(`Initialised .builderforce/ project directory`)),opts.skipSkills)await prompter.note(`Skipping skills setup.`,`Skills`);else{let{setupSkills}=await import(`./onboard-skills-DYFWCGKC.js`);nextConfig=await setupSkills(nextConfig,workspaceDir,runtime,prompter)}let{setupInternalHooks}=await import(`./onboard-hooks-DbJtjUUC.js`);nextConfig=await setupInternalHooks(nextConfig,runtime,prompter),nextConfig=onboardHelpers.applyWizardMetadata(nextConfig,{command:`onboard`,mode}),await writeConfigFile(nextConfig);let{finalizeOnboardingWizard}=await import(`./onboarding.finalize-Co5L0rNp.js`),{launchedTui}=await finalizeOnboardingWizard({flow,opts,baseConfig,nextConfig,workspaceDir,settings,prompter,runtime})}export{runOnboardingWizard as t};