@seanhogg/builderforce-agents 2026.10.9 → 2026.10.11

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 (437) hide show
  1. package/dist/{acp-cli-DcKpPsJa.js → acp-cli-C23mmrQt.js} +1 -1
  2. package/dist/{acp-cli-BxH-eUDl.js → acp-cli-D6F-D5JB.js} +1 -1
  3. package/dist/{agent-cXF-aL0g.js → agent-B-2r1Lr_.js} +1 -1
  4. package/dist/{agent-wJmvciTM.js → agent-BI9qSnSp.js} +1 -1
  5. package/dist/{agentbot-cli-Cub3Abbt.js → agentbot-cli-Cyrhr5jX.js} +1 -1
  6. package/dist/{agentbot-cli-CTRvEfBp.js → agentbot-cli-sC55m-XS.js} +1 -1
  7. package/dist/{agents-Cr7WO73I.js → agents-CMThT_Bj.js} +1 -1
  8. package/dist/agents-Chz9nfm2.js +1 -0
  9. package/dist/{api-key-rotation-CHBjUwUJ.js → api-key-rotation-CyCi-UqR.js} +1 -1
  10. package/dist/{audio-preflight-CWFuqbao.js → audio-preflight-B411b2-y.js} +1 -1
  11. package/dist/{audio-preflight-F2e3Y4CW.js → audio-preflight-Cs4eUjQk.js} +1 -1
  12. package/dist/{audit-DGnEhZYe.js → audit-B-USV03V.js} +1 -1
  13. package/dist/{audit-DBjjjW93.js → audit-SKNPS-K2.js} +1 -1
  14. package/dist/auth-choice-CChsMy-F.js +1 -0
  15. package/dist/{auth-choice-9gZuOvPS.js → auth-choice-CCib_yVL.js} +1 -1
  16. package/dist/auth-choice-DSnpkrMc.js +1 -0
  17. package/dist/{auth-choice-BoZFVmEa.js → auth-choice-DzBqqq7i.js} +1 -1
  18. package/dist/auth-choice.apply-6f3Jb_lS.js +1 -0
  19. package/dist/{auth-choice.apply-CcatXiNo.js → auth-choice.apply-BgOXoS8X.js} +1 -1
  20. package/dist/{auth-choice.apply-BHLQeym9.js → auth-choice.apply-DBuvopiF.js} +1 -1
  21. package/dist/auth-choice.apply-DeXnLwVS.js +1 -0
  22. package/dist/auth-choice.apply.transformers-CZDuBaOr.js +1 -0
  23. package/dist/{auth-choice.apply.transformers-CIn3fs7K.js → auth-choice.apply.transformers-Df9l_jRz.js} +2 -2
  24. package/dist/{auth-choice.apply.transformers-1plI0MUg.js → auth-choice.apply.transformers-DmdxpHGz.js} +2 -2
  25. package/dist/{auth-choice.apply.transformers-D5OrjEHo.js → auth-choice.apply.transformers-dn7l6XyJ.js} +1 -1
  26. package/dist/{auth-json-D1ite-pW.js → auth-json-BB-VBn5E.js} +1 -1
  27. package/dist/{auth-json-CN3MWw57.js → auth-json-BVyos95N.js} +1 -1
  28. package/dist/{auth-json-HGu227VM.js → auth-json-CoOe4tEg.js} +1 -1
  29. package/dist/{auth-json-DZ7E50Y1.js → auth-json-wrKixZxh.js} +1 -1
  30. package/dist/{auth-profiles-C1VbcUOm.js → auth-profiles-pt7Tr4HA.js} +1 -1
  31. package/dist/{auth-token-CyVfNEQb.js → auth-token-BE67qxLw.js} +1 -1
  32. package/dist/{auth-token-CoQ5ePPl.js → auth-token-BPHeoBAW.js} +1 -1
  33. package/dist/{banner-DY-L7_eI.js → banner-ErBINvbk.js} +1 -1
  34. package/dist/{browser-cli-D2O94twn.js → browser-cli-BZc64-Xx.js} +1 -1
  35. package/dist/{browser-cli-CoRx_4iM.js → browser-cli-CoxVKdon.js} +1 -1
  36. package/dist/build-info.json +3 -3
  37. package/dist/{builderforce-BmrsVdFw.js → builderforce-B9187Tm9.js} +4 -4
  38. package/dist/{builderforce-Bwyw0GJ6.js → builderforce-BLqHwgeu.js} +4 -4
  39. package/dist/builderforce-api-DKgXl8BH.js +1 -0
  40. package/dist/builderforce-api-DcPAGsla.js +1 -0
  41. package/dist/builderforce-onboarding-CaPJZSvw.js +24 -0
  42. package/dist/builderforce-onboarding-RXFb0gct.js +24 -0
  43. package/dist/{builderforcellm-syscheck-CprBhARf.js → builderforcellm-syscheck-9ksvqHYX.js} +1 -1
  44. package/dist/{builderforcellm-syscheck-DrFJ638L.js → builderforcellm-syscheck-F5JMAr3p.js} +1 -1
  45. package/dist/{call-DxPWzV-k.js → call-BnAs_SER.js} +1 -1
  46. package/dist/{call-DFjBq0H2.js → call-D1Opj5ev.js} +1 -1
  47. package/dist/{call-DmAU4cRX.js → call-Du2LiaX6.js} +1 -1
  48. package/dist/{call-BbRf8gFM.js → call-T8ciwMTA.js} +1 -1
  49. package/dist/{channel-options-d4EwVQD0.js → channel-options-B7sRMp2v.js} +1 -1
  50. package/dist/{channel-options-CDixz6dT.js → channel-options-rhDBCtlp.js} +1 -1
  51. package/dist/{channel-web-DJa8JC9W.js → channel-web-CcCqUQrJ.js} +1 -1
  52. package/dist/{channels-cli-BgKy0MbE.js → channels-cli-BjnLW14T.js} +1 -1
  53. package/dist/{channels-cli-nNW0ezPM.js → channels-cli-DVWUBsmc.js} +1 -1
  54. package/dist/{chrome-BnEbJV3D.js → chrome-CFmcixaE.js} +1 -1
  55. package/dist/{chrome-a3X9_-nf.js → chrome-DXt86tmV.js} +1 -1
  56. package/dist/cli/daemon-cli.js +1 -1
  57. package/dist/{cli-DkWt7p2x.js → cli-BUqtALJK.js} +1 -1
  58. package/dist/{cli-C5MbcECQ.js → cli-K4reS6IS.js} +1 -1
  59. package/dist/{coding-tools.policy-NEPm7Mz1.js → coding-tools.policy-D9Ba8eDh.js} +1 -1
  60. package/dist/{coding-tools.policy-6qh9acJy.js → coding-tools.policy-ZhOdlcEI.js} +1 -1
  61. package/dist/{command-registry-COUcUWby.js → command-registry-B7uAoROP.js} +1 -1
  62. package/dist/{command-registry-4_K-lfW5.js → command-registry-CW16Mk2Y.js} +1 -1
  63. package/dist/{completion-cli-DlvHqL86.js → completion-cli-ZvXrCQqk.js} +1 -1
  64. package/dist/{completion-cli-B2qcVd6q.js → completion-cli-gyvx5ZXu.js} +1 -1
  65. package/dist/{completion-cli-DpFvU4Qn.js → completion-cli-n8UsdT91.js} +1 -1
  66. package/dist/{completion-cli-SdcQ-kQj.js → completion-cli-sKReGv3d.js} +1 -1
  67. package/dist/{config-_1Ca6jGb.js → config-BgV_FYSq.js} +1 -1
  68. package/dist/{config-toczWD3q.js → config-BpChMIJ6.js} +1 -1
  69. package/dist/{config-BTWlKwtB.js → config-D01EgOky.js} +1 -1
  70. package/dist/{config-27_FNba3.js → config-Dsnbi-a3.js} +1 -1
  71. package/dist/{config-cli-DeiQz5sY.js → config-cli-Bpo74mE5.js} +1 -1
  72. package/dist/{config-cli-CfczShaZ.js → config-cli-CF31O_5s.js} +1 -1
  73. package/dist/{config-guard-CD-Wq8kk.js → config-guard-BRUOk5YL.js} +1 -1
  74. package/dist/{config-guard-ClVl2FvD.js → config-guard-BUpQiSTW.js} +1 -1
  75. package/dist/{config-guard-B4in8l8I.js → config-guard-USCN-dq0.js} +1 -1
  76. package/dist/{config-validation-jpeXzoU3.js → config-validation-BGpSeNbh.js} +1 -1
  77. package/dist/{config-validation-C6u-z9bJ.js → config-validation-CdBJ-tZq.js} +1 -1
  78. package/dist/{configure-3W9C5LiT.js → configure-CWr61Ph2.js} +1 -1
  79. package/dist/configure-DhazB2qh.js +1 -0
  80. package/dist/{configure-BtXQW7ue.js → configure-DlcO1tWx.js} +1 -1
  81. package/dist/configure-MXheujvX.js +1 -0
  82. package/dist/{control-service-CJuuqNOE.js → control-service-2PkCt256.js} +1 -1
  83. package/dist/{control-service-qKfWP7VD.js → control-service-CcsbseZS.js} +1 -1
  84. package/dist/{control-service-izGyCWQs.js → control-service-qK1oboMo.js} +1 -1
  85. package/dist/{control-service-BbsswoMy.js → control-service-y3GYvIBg.js} +1 -1
  86. package/dist/{cron-cli-BrOM4s6N.js → cron-cli-BYu_lA8i.js} +1 -1
  87. package/dist/{cron-cli-CwtTX6pg.js → cron-cli-D_Og20iB.js} +1 -1
  88. package/dist/{daemon-cli-DyVsMf8p.js → daemon-cli-BNzthScZ.js} +1 -1
  89. package/dist/{daemon-cli-DlwOVDbt.js → daemon-cli-Bh3p0hui.js} +1 -1
  90. package/dist/{daemon-cli-Br0wu9xQ.js → daemon-cli-DxxKiKVN.js} +1 -1
  91. package/dist/{daemon-cli-DmicpZED.js → daemon-cli-emNxLkIw.js} +1 -1
  92. package/dist/{daemon-runtime-CtOr1ncS.js → daemon-runtime-9XitJmIL.js} +1 -1
  93. package/dist/{daemon-runtime-B4UjqdyJ.js → daemon-runtime-Dx800VUt.js} +1 -1
  94. package/dist/{deliver-BpLm3ktn.js → deliver--6OBF3LL.js} +1 -1
  95. package/dist/{deliver-9o_SE4ZK.js → deliver-ADpnRGRf.js} +1 -1
  96. package/dist/{deliver-D2VAVelb.js → deliver-BM6-damm.js} +1 -1
  97. package/dist/{deliver-BuZu68tp.js → deliver-CsG0cHbZ.js} +1 -1
  98. package/dist/{deps-CkJiJ6wc.js → deps-Dg_9rfXK.js} +1 -1
  99. package/dist/{devices-cli-BfXeDnbx.js → devices-cli-B8DXzcRP.js} +1 -1
  100. package/dist/{devices-cli-B9G6YOsS.js → devices-cli-BZkdWSx-.js} +1 -1
  101. package/dist/{directory-cli-BRCaiGOn.js → directory-cli-B78pAVI_.js} +1 -1
  102. package/dist/{directory-cli-D5ciZ5fY.js → directory-cli-CSaRkkL8.js} +1 -1
  103. package/dist/{dm-policy-shared-CRZpjRv0.js → dm-policy-shared-B9lW-AsK.js} +1 -1
  104. package/dist/{dm-policy-shared-Dhw9_6mi.js → dm-policy-shared-DYZ_T-az.js} +1 -1
  105. package/dist/{dns-cli-CgZ7oMcT.js → dns-cli-CLPGOFA1.js} +1 -1
  106. package/dist/{dns-cli-C4f4Tyij.js → dns-cli-dr5dHzfI.js} +1 -1
  107. package/dist/{doctor-completion-BSotFS6p.js → doctor-completion-94zme499.js} +1 -1
  108. package/dist/{doctor-completion-DVxbs-74.js → doctor-completion-CbF34DIH.js} +1 -1
  109. package/dist/{embedded-helpers-CEsr3aQ0.js → embedded-helpers-C9jpiwlw.js} +1 -1
  110. package/dist/{embedded-helpers-DK8_apW0.js → embedded-helpers-DdU30lmt.js} +1 -1
  111. package/dist/entry.js +1 -1
  112. package/dist/{exec-approvals-cli-YuOu7mVg.js → exec-approvals-cli-CS_uabo7.js} +1 -1
  113. package/dist/{exec-approvals-cli-BPFi82B0.js → exec-approvals-cli-ktB7M7WE.js} +1 -1
  114. package/dist/{gateway-cli-D2Bg1Um6.js → gateway-cli-CKcoLVMA.js} +5 -5
  115. package/dist/{gateway-cli-DFEo8C0z.js → gateway-cli-CuXBDBWe.js} +5 -5
  116. package/dist/{gateway-rpc-BXR_lVIx.js → gateway-rpc-B02y0PnE.js} +1 -1
  117. package/dist/{gateway-rpc-ByUcnQ7W.js → gateway-rpc-ff1RVb0_.js} +1 -1
  118. package/dist/{gemini-auth-CkD5jCPh.js → gemini-auth-DDR12zst.js} +1 -1
  119. package/dist/health-D0DZmCmh.js +1 -0
  120. package/dist/{health-yS3NRKvY.js → health-FO8MG5Ur.js} +1 -1
  121. package/dist/{health-DVo8a9yg.js → health-zrsgFZmR.js} +1 -1
  122. package/dist/{hooks-cli-B0lVee-j.js → hooks-cli-5Y4hnSX9.js} +1 -1
  123. package/dist/{hooks-cli-DsVmrQAG.js → hooks-cli-DpHZzRo2.js} +1 -1
  124. package/dist/index.js +2 -2
  125. package/dist/{ink-session-BitZ1wcY.js → ink-session-Dt9Q4iH-.js} +2 -2
  126. package/dist/{ink-session-CyAqXDla.js → ink-session-N8wCBzwk.js} +2 -2
  127. package/dist/{installs-CWd54ARy.js → installs-B_t2YXgq.js} +1 -1
  128. package/dist/{installs-C9A8QFiF.js → installs-DFiF4lGy.js} +1 -1
  129. package/dist/{io-3R_ZyUxB.js → io-BLBq4T2o.js} +1 -1
  130. package/dist/{io-DSIGyPrT.js → io-CXN4uLS2.js} +1 -1
  131. package/dist/{io-6jLoKffb.js → io-Ckd4NlvH.js} +1 -1
  132. package/dist/{io-CohJffHG.js → io-D9hC2aG0.js} +1 -1
  133. package/dist/{lifecycle-core-BpMvDXy1.js → lifecycle-core-D9Dg5Qps.js} +1 -1
  134. package/dist/{lifecycle-core-Dwb4gHjZ.js → lifecycle-core-uxjxTzFv.js} +1 -1
  135. package/dist/login-B3sDAgHb.js +1 -0
  136. package/dist/{login-C_ZdMOvv.js → login-CwwuaXtb.js} +1 -1
  137. package/dist/{login-DtDUyFO3.js → login-D1bVUPlv.js} +1 -1
  138. package/dist/{login-CEnjUo5c.js → login-GLDax56V.js} +1 -1
  139. package/dist/{login-qr-B9lyIZVD.js → login-qr-CbiUcBLy.js} +1 -1
  140. package/dist/{login-qr-BCBsxwhT.js → login-qr-Cp0YqK4e.js} +1 -1
  141. package/dist/{logs-cli-CdM5W3HE.js → logs-cli-Cy11HfSG.js} +1 -1
  142. package/dist/{logs-cli-jh5Xn3TD.js → logs-cli-nD36c-Y1.js} +1 -1
  143. package/dist/{manager-CRba8roB.js → manager-BeohB4-8.js} +1 -1
  144. package/dist/{manager-B3IJ_IKf.js → manager-CTTXDBt3.js} +1 -1
  145. package/dist/{manager-TGVy_fAb.js → manager-CoQMlcrf.js} +1 -1
  146. package/dist/{manager-DwywI_5-.js → manager-DSz61dXv.js} +1 -1
  147. package/dist/{memory-cli-BlayFTAM.js → memory-cli-BpAiRntI.js} +1 -1
  148. package/dist/{memory-cli-DRz4wtHk.js → memory-cli-CbkWGjRn.js} +1 -1
  149. package/dist/{memory-cli-PdyTQ84w.js → memory-cli-CrBMLM2P.js} +1 -1
  150. package/dist/{memory-cli-ivAs7q7v.js → memory-cli-CveeVOWH.js} +1 -1
  151. package/dist/{model-catalog-CQOdhMUY.js → model-catalog-B29yeBYS.js} +1 -1
  152. package/dist/{model-catalog-CiiFJX77.js → model-catalog-BeBXvbFm.js} +1 -1
  153. package/dist/model-catalog-CMKHKuBL.js +1 -0
  154. package/dist/{model-catalog-C6UrZ0uG.js → model-catalog-DjNiebr7.js} +1 -1
  155. package/dist/{model-discovery-C9Xm95uL.js → model-discovery-D0i1JpiL.js} +1 -1
  156. package/dist/{model-picker-swoSwauV.js → model-picker-CGDNPRPc.js} +1 -1
  157. package/dist/model-picker-CGEF8yhc.js +1 -0
  158. package/dist/model-picker-DeUNOC78.js +1 -0
  159. package/dist/{model-picker-BUePD7Zg.js → model-picker-EIhpfOZa.js} +1 -1
  160. package/dist/{model-selection-9bRFKBI_.js → model-selection-DG9J_VTz.js} +1 -1
  161. package/dist/{models-BNivsd2o.js → models-BjIzVQYX.js} +2 -2
  162. package/dist/{models-DQeSIY6M.js → models-JoqOgEF5.js} +1 -1
  163. package/dist/{models-cli-KokGgWeP.js → models-cli-B2zbchgs.js} +1 -1
  164. package/dist/{models-cli-BcNxU4P_.js → models-cli-CkFdc8NN.js} +2 -2
  165. package/dist/{node-cli-DIMh3X2F.js → node-cli-CXnuxiBq.js} +1 -1
  166. package/dist/{node-cli-EmTU-Gh0.js → node-cli-oVyjVnb7.js} +1 -1
  167. package/dist/{nodes-cli-BX8TznFK.js → nodes-cli-BBVotxNt.js} +1 -1
  168. package/dist/{nodes-cli-DyHovdAc.js → nodes-cli-DVMBSUhK.js} +1 -1
  169. package/dist/{onboard-DfMVh1bM.js → onboard-BItclJp0.js} +1 -1
  170. package/dist/{onboard-BVmZ4jMw.js → onboard-CqvHIvKj.js} +1 -1
  171. package/dist/{onboard-auth.credentials-yagR-VMG.js → onboard-auth.credentials-DneFSdYg.js} +1 -1
  172. package/dist/{onboard-auth.credentials-BuT-etnE.js → onboard-auth.credentials-DpitLlzw.js} +1 -1
  173. package/dist/onboard-channels-B91m5S3w.js +1 -0
  174. package/dist/onboard-channels-BOoPtYbF.js +1 -0
  175. package/dist/{onboard-channels-B6QDFkkK.js → onboard-channels-Dn0u5C-C.js} +1 -1
  176. package/dist/{onboard-channels-C8FCFn29.js → onboard-channels-vhtccaIV.js} +1 -1
  177. package/dist/onboard-custom-BN0uzSq_.js +1 -0
  178. package/dist/{onboard-custom-D1nd8Hlu.js → onboard-custom-BYIza2e7.js} +1 -1
  179. package/dist/onboard-custom-CCFthqto.js +1 -0
  180. package/dist/{onboard-custom-C_BI0ZXn.js → onboard-custom-Ckf0xKXY.js} +1 -1
  181. package/dist/{onboard-helpers-CGlLpagb.js → onboard-helpers-B8I5AVyb.js} +1 -1
  182. package/dist/{onboard-helpers-CckrS8_K.js → onboard-helpers-Ce_c4Raj.js} +1 -1
  183. package/dist/{onboard-helpers-Cf5dNq7-.js → onboard-helpers-CiHzTaFX.js} +1 -1
  184. package/dist/{onboard-helpers-BvIZ4-R5.js → onboard-helpers-DC-nMl-V.js} +1 -1
  185. package/dist/{onboard-interactive-DYJttZ2w.js → onboard-interactive-Cl2K3EYn.js} +1 -1
  186. package/dist/{onboard-interactive-zgjmwJz-.js → onboard-interactive-JNux9zfA.js} +1 -1
  187. package/dist/{onboard-interactive-B3-KBZbZ.js → onboard-interactive-J_ObFzeW.js} +1 -1
  188. package/dist/{onboard-interactive-Dc_7URYb.js → onboard-interactive-OUNsvlh0.js} +1 -1
  189. package/dist/{onboard-remote-D5lR2lVm.js → onboard-remote-0-q7MG9t.js} +1 -1
  190. package/dist/{onboard-remote-BmSyHww1.js → onboard-remote-CgAAEZpq.js} +1 -1
  191. package/dist/{onboard-remote-CzzQMZ3X.js → onboard-remote-DKXHDdBD.js} +1 -1
  192. package/dist/{onboard-remote-DcuX8b2g.js → onboard-remote-cB8j9RG-.js} +1 -1
  193. package/dist/{onboard-skills-ILHIeg1R.js → onboard-skills-47upVdA2.js} +1 -1
  194. package/dist/{onboard-skills-BPlNN_-T.js → onboard-skills-9Um4TL2x.js} +1 -1
  195. package/dist/{onboard-skills-DIhjDMom.js → onboard-skills-DhCmvhJY.js} +1 -1
  196. package/dist/{onboard-skills-CI1OtWsE.js → onboard-skills-mI2kfvdT.js} +1 -1
  197. package/dist/{onboarding-D4-HDbmU.js → onboarding-BSENgR9C.js} +5 -5
  198. package/dist/{onboarding-CP9rrz8y.js → onboarding-CIaZLNc1.js} +5 -5
  199. package/dist/{onboarding.finalize-C2kZi7F0.js → onboarding.finalize-BwOpvoPE.js} +1 -1
  200. package/dist/{onboarding.finalize-BfWXPgX7.js → onboarding.finalize-yMK-g7Uy.js} +1 -1
  201. package/dist/{onboarding.gateway-config-Cd7_bXVs.js → onboarding.gateway-config-Kn1O-QFl.js} +1 -1
  202. package/dist/{onboarding.gateway-config-Bd8HJkso.js → onboarding.gateway-config-huOjFf8D.js} +1 -1
  203. package/dist/{openai-model-default-Cp3nf21W.js → openai-model-default-CH2-2Hvk.js} +1 -1
  204. package/dist/{openai-model-default-BMRrqTmH.js → openai-model-default-pfoEzWYJ.js} +1 -1
  205. package/dist/{outbound-BRInCJD9.js → outbound-BdeHcMAo.js} +1 -1
  206. package/dist/{outbound-CAtBpFoD.js → outbound-BylJYD7n.js} +1 -1
  207. package/dist/{outbound-OI-t5zZ0.js → outbound-CAirtWr1.js} +1 -1
  208. package/dist/{outbound-CnIvOJlU.js → outbound-VNcvF2MG.js} +1 -1
  209. package/dist/{outbound-send-deps-m6DqOma_.js → outbound-send-deps-B3Lg-uqF.js} +1 -1
  210. package/dist/{pairing-cli-CEr0yEsc.js → pairing-cli-5RtPvz2i.js} +1 -1
  211. package/dist/{pairing-cli-Dxfoni-F.js → pairing-cli-C_Mj6Dy4.js} +1 -1
  212. package/dist/{pairing-labels-3j_iRYOO.js → pairing-labels-BJPrScRl.js} +1 -1
  213. package/dist/{pairing-labels-BW5jQZlr.js → pairing-labels-oA-nKTaW.js} +1 -1
  214. package/dist/{pairing-store-QDb6lhIU.js → pairing-store-YRy7EBgI.js} +1 -1
  215. package/dist/{pairing-store-CbvMJhD3.js → pairing-store-ti3FEkmr.js} +1 -1
  216. package/dist/{plugin-auto-enable-BV9K9Vhr.js → plugin-auto-enable-Cupr4wbt.js} +1 -1
  217. package/dist/{plugin-auto-enable-DDry2fA6.js → plugin-auto-enable-D8gKiE3F.js} +1 -1
  218. package/dist/plugin-registry-BEfyc2f_.js +1 -0
  219. package/dist/{plugin-registry-C-_GA65s.js → plugin-registry-BoPaef5I.js} +1 -1
  220. package/dist/{plugin-registry-SAdxNUwm.js → plugin-registry-CxnuHO_n.js} +1 -1
  221. package/dist/plugin-registry-D0tIqo8L.js +1 -0
  222. package/dist/plugin-sdk/{accounts-Cy3WCbWg.js → accounts-BwreSNAR.js} +1 -1
  223. package/dist/plugin-sdk/{active-listener-DVWVNlT9.js → active-listener-DpQ7aGYd.js} +1 -1
  224. package/dist/plugin-sdk/agent-runtime/src/infra/workflow-telemetry.d.ts +12 -1
  225. package/dist/plugin-sdk/{agent-scope-DgKN27hJ.js → agent-scope-BQByW0cD.js} +1 -1
  226. package/dist/plugin-sdk/{api-key-rotation-ftXf7mBZ.js → api-key-rotation-7YdImWrh.js} +1 -1
  227. package/dist/plugin-sdk/{audio-preflight-CfTmmeS-.js → audio-preflight-EbkaATDO.js} +1 -1
  228. package/dist/plugin-sdk/{auth-json-BrNBg87n.js → auth-json-DK6qod1_.js} +1 -1
  229. package/dist/plugin-sdk/{bindings-CH-YLOLC.js → bindings-CDEzl4kl.js} +1 -1
  230. package/dist/plugin-sdk/{channel-web-B6rg0Rbf.js → channel-web-D2KuONp0.js} +1 -1
  231. package/dist/plugin-sdk/{chrome-CuXP-hes.js → chrome-SOXFIkUM.js} +1 -1
  232. package/dist/plugin-sdk/{chunk-C94IAOuf.js → chunk-cW0POl22.js} +1 -1
  233. package/dist/plugin-sdk/{command-format-B3XMq_73.js → command-format-CAX9XFjI.js} +1 -1
  234. package/dist/plugin-sdk/{common-n0l_XN-S.js → common-BxEWhN2X.js} +1 -1
  235. package/dist/plugin-sdk/{config-DsXZsCkJ.js → config-v1EU9Ll8.js} +2 -2
  236. package/dist/plugin-sdk/{fetch-B-GxSYRO.js → fetch-DH0Y8iyO.js} +1 -1
  237. package/dist/plugin-sdk/index.js +1 -1
  238. package/dist/plugin-sdk/{login-_my8QwPP.js → login-d1zBgykF.js} +1 -1
  239. package/dist/plugin-sdk/{login-qr-BaePtXuG.js → login-qr-B6exvQnN.js} +1 -1
  240. package/dist/plugin-sdk/{manager-BsC-4ymy.js → manager-BH_bmGds.js} +1 -1
  241. package/dist/plugin-sdk/{markdown-tables-BUfhHgfs.js → markdown-tables-Epim9b-0.js} +1 -1
  242. package/dist/plugin-sdk/{message-channel-CuZ2xOAM.js → message-channel-sBPQc_-T.js} +1 -1
  243. package/dist/plugin-sdk/{model-catalog-yuiXVcmw.js → model-catalog-cXsza5GU.js} +1 -1
  244. package/dist/plugin-sdk/{model-selection-BtgvnqB5.js → model-selection-K82MAGlL.js} +1 -1
  245. package/dist/plugin-sdk/{outbound-D_attiyO.js → outbound-Chn_H1O7.js} +1 -1
  246. package/dist/plugin-sdk/{plugins-BdkC9v5E.js → plugins-CaUOZBVb.js} +1 -1
  247. package/dist/plugin-sdk/{pw-ai-A7Rathx6.js → pw-ai-BIiJF7ZD.js} +1 -1
  248. package/dist/plugin-sdk/{qmd-manager-Dxn0jCpE.js → qmd-manager-BRe5fGZw.js} +1 -1
  249. package/dist/plugin-sdk/{registry-CZHRcH-q.js → registry-DJq2Cvo9.js} +1 -1
  250. package/dist/plugin-sdk/{render-CuA_WRX5.js → render-BUCRXPIk.js} +1 -1
  251. package/dist/plugin-sdk/{replies-DmLfO-pg.js → replies-Cz5OD3qN.js} +1 -1
  252. package/dist/plugin-sdk/{reply-3-ne-N_7.js → reply-D5Uk7pUv.js} +9 -9
  253. package/dist/plugin-sdk/{reply-prefix-w7kAvH11.js → reply-prefix-CCymsmsP.js} +1 -1
  254. package/dist/plugin-sdk/{resolve-route-0sbvl4ZN.js → resolve-route-DN1J7Wyc.js} +1 -1
  255. package/dist/plugin-sdk/{runner-4UfrAQnx.js → runner-CYkuO7Fh.js} +4 -4
  256. package/dist/plugin-sdk/{session-BB-yfDWx.js → session-D5jHDo78.js} +1 -1
  257. package/dist/plugin-sdk/{sqlite-JjFgDV-H.js → sqlite-BlMLqMl8.js} +1 -1
  258. package/dist/plugin-sdk/{subsystem-D0Ril4rt.js → subsystem-COTa5Ly_.js} +1 -1
  259. package/dist/plugin-sdk/{tool-images-WRTP95FT.js → tool-images-DSpchb4x.js} +1 -1
  260. package/dist/plugin-sdk/{tool-loop-detection-sC_rhJfb.js → tool-loop-detection-BP6u-mbh.js} +1 -1
  261. package/dist/plugin-sdk/web-BbganhKi.js +1 -0
  262. package/dist/plugin-sdk/{whatsapp-actions-ThxQ5niy.js → whatsapp-actions-CZUqxmP1.js} +1 -1
  263. package/dist/{plugins-BIG8NDB9.js → plugins-Cx29kkDj.js} +1 -1
  264. package/dist/{plugins-iAq-Gr8l.js → plugins-DJqou2hi.js} +1 -1
  265. package/dist/{plugins-cli-CpaVUv_r.js → plugins-cli-Bu-A8aGy.js} +1 -1
  266. package/dist/{plugins-cli-CPkSgvdL.js → plugins-cli-CGFsQDVW.js} +1 -1
  267. package/dist/{program-context-BCwL3wlM.js → program-context-ClBa4lUj.js} +1 -1
  268. package/dist/{program-2w7Ue902.js → program-vVCzU0cH.js} +2 -2
  269. package/dist/{prompt-select-styled-hB_nLOn1.js → prompt-select-styled-BJPGccTJ.js} +1 -1
  270. package/dist/{prompt-select-styled-Dd5swW2b.js → prompt-select-styled-BK74z6FF.js} +1 -1
  271. package/dist/{provider-auth-helpers-BpTnp2Yr.js → provider-auth-helpers-B84m5VMc.js} +1 -1
  272. package/dist/{provider-auth-helpers-CJTG_tVx.js → provider-auth-helpers-hNwpK_hl.js} +1 -1
  273. package/dist/{provider-dispatcher-TWwBT2aH.js → provider-dispatcher-BjR5DE3O.js} +1 -1
  274. package/dist/provider-dispatcher-DgOeVjcL.js +1 -0
  275. package/dist/{provider-usage-BdrU4cIE.js → provider-usage-B-wPVN_j.js} +1 -1
  276. package/dist/{provider-usage-Bn4ZrnU7.js → provider-usage-B8lFHp0K.js} +1 -1
  277. package/dist/{push-apns-C4sJnHbO.js → push-apns-BTPPvY81.js} +1 -1
  278. package/dist/{push-apns-CiD3rrVv.js → push-apns-CscYUS0D.js} +1 -1
  279. package/dist/{pw-ai-DSEj1QrV.js → pw-ai-CLS_VZ8p.js} +1 -1
  280. package/dist/{pw-ai-dNZY-qBs.js → pw-ai-D5og_rIf.js} +1 -1
  281. package/dist/{qr-cli-qr-SFLZW.js → qr-cli-CAquM1Zk.js} +1 -1
  282. package/dist/{qr-cli-B45dCV0o.js → qr-cli-GsR8n1cm.js} +1 -1
  283. package/dist/{qr-cli-CMlAIzrD.js → qr-cli-kAKgaL-T.js} +1 -1
  284. package/dist/{qr-cli-CySNSEFj.js → qr-cli-uyxNf-cQ.js} +1 -1
  285. package/dist/{register.agent-BA6LIJSb.js → register.agent-BwTCfyeJ.js} +1 -1
  286. package/dist/{register.agent-D2uCH8jZ.js → register.agent-Dhdo3_7k.js} +1 -1
  287. package/dist/register.configure-B0m0G3ot.js +1 -0
  288. package/dist/register.configure-D3cbjmTz.js +1 -0
  289. package/dist/{register.maintenance-BELfCO_C.js → register.maintenance-C6ocMld2.js} +1 -1
  290. package/dist/{register.maintenance-DukWFS_D.js → register.maintenance-CbE2zSyc.js} +1 -1
  291. package/dist/{register.message-DiZRRAE5.js → register.message-Jn4u533_.js} +1 -1
  292. package/dist/{register.message-8iGDhO8h.js → register.message-Tu1hlM0m.js} +1 -1
  293. package/dist/{register.onboard-B9DMNfHE.js → register.onboard-B34211N6.js} +1 -1
  294. package/dist/{register.onboard-Dt7rzAq-.js → register.onboard-S1d2WAE4.js} +1 -1
  295. package/dist/{register.setup-CSF-2ImP.js → register.setup-CJPyAwCQ.js} +1 -1
  296. package/dist/{register.setup-BRRVPrx7.js → register.setup-Sg8f3nsH.js} +1 -1
  297. package/dist/{register.status-health-sessions-D6wdwPwV.js → register.status-health-sessions-BlgVxoZ4.js} +1 -1
  298. package/dist/{register.status-health-sessions-ZSufYw5j.js → register.status-health-sessions-DwADQJ74.js} +1 -1
  299. package/dist/{register.subclis-4eDV9jKH.js → register.subclis-C9V_M-Lk.js} +1 -1
  300. package/dist/{register.subclis-Cr9DoYcv.js → register.subclis-pWn9XObB.js} +1 -1
  301. package/dist/{replies-DbkT_5BV.js → replies-BOGMDhSN.js} +1 -1
  302. package/dist/{replies-CzV-RFUG.js → replies-BXbV02ik.js} +1 -1
  303. package/dist/{replies-DIBQzxGp.js → replies-CUv671JF.js} +1 -1
  304. package/dist/{replies-Bd2RPZwQ.js → replies-DokbEfJD.js} +1 -1
  305. package/dist/{reply-Cd3vVnD7.js → reply-GY1C8tcv.js} +10 -10
  306. package/dist/{routes-BzfLvF8W.js → routes-DZntyPY6.js} +1 -1
  307. package/dist/{routes-lclJHOYY.js → routes-_iZdG1Fo.js} +1 -1
  308. package/dist/{rpc-BLqXRn5R.js → rpc-CbUnwStf.js} +1 -1
  309. package/dist/{rpc-DcQNGQlj.js → rpc-Cwm4gchc.js} +1 -1
  310. package/dist/{run-main-DLcDEJgv.js → run-main-DQMbgbcF.js} +1 -1
  311. package/dist/{runner-DwWmciCt.js → runner-Cu9NJouV.js} +1 -1
  312. package/dist/{runner-SxCr9kXD.js → runner-eTTUbLAK.js} +1 -1
  313. package/dist/{sandbox-BZibn6PX.js → sandbox-C4AKi2EX.js} +1 -1
  314. package/dist/{sandbox-z9t_PRf9.js → sandbox-DvKMuAXL.js} +1 -1
  315. package/dist/{sandbox-cli-BtGs0dBR.js → sandbox-cli-C0LhzYq_.js} +1 -1
  316. package/dist/{sandbox-cli-B8FpLgyY.js → sandbox-cli-De0iaoHB.js} +1 -1
  317. package/dist/{security-cli-D8Q8I7fn.js → security-cli-BvEfiO8m.js} +1 -1
  318. package/dist/{security-cli-IIMR7Pb4.js → security-cli-BzsQ0XQh.js} +1 -1
  319. package/dist/{send-DnMzjS7L.js → send-2dRKMWtl.js} +1 -1
  320. package/dist/{send-DerUBvXW.js → send-Aw8wK3vK.js} +1 -1
  321. package/dist/{send-BvroeIQ6.js → send-B7H8Ae5j.js} +1 -1
  322. package/dist/{send-4d9NswaD.js → send-BP5osGBo.js} +1 -1
  323. package/dist/{send-BU_-BGmf.js → send-BVal50Bi.js} +1 -1
  324. package/dist/{send-CxG2suVM.js → send-Bbo7TXLx.js} +1 -1
  325. package/dist/{send-CBBziNqM.js → send-BxoVLIy1.js} +1 -1
  326. package/dist/{send-dDpSBSBo.js → send-COKUbcqs.js} +1 -1
  327. package/dist/{send--12DIueA.js → send-CTw3PqN4.js} +1 -1
  328. package/dist/{send-UFtylOiq.js → send-CYGOPcKq.js} +1 -1
  329. package/dist/{send-DyF1Xy9K.js → send-ChGpVO3O.js} +1 -1
  330. package/dist/{send-Q-uTkSFE.js → send-Cqea2UFo.js} +1 -1
  331. package/dist/{send-j15662lv.js → send-CrFWgJKx.js} +1 -1
  332. package/dist/{send-gDb60Hk-.js → send-CwK8QBR3.js} +1 -1
  333. package/dist/{send-CceNWtYE.js → send-DqR7Rxzm.js} +1 -1
  334. package/dist/{send-CJHXQvVl.js → send-DxwfUIN-.js} +1 -1
  335. package/dist/{send-ByCVQQVz.js → send-KgN1P41U.js} +1 -1
  336. package/dist/{send-B1rJLLpr.js → send-bNp87SIq.js} +1 -1
  337. package/dist/{send-B_1BtyfA.js → send-kkm_zrHQ.js} +1 -1
  338. package/dist/{send-BJDzwYJN.js → send-l3ge4wkC.js} +1 -1
  339. package/dist/{server-context-DJZT7Upf.js → server-context-CQ2v4BAx.js} +1 -1
  340. package/dist/{server-context-owOmmyUM.js → server-context-CttALzrW.js} +1 -1
  341. package/dist/{server-node-events-54d8Rmjl.js → server-node-events-CIMO6Vae.js} +1 -1
  342. package/dist/{server-node-events-CSFVqgxX.js → server-node-events-iCF2ngcN.js} +1 -1
  343. package/dist/{session-BzQdcCqN.js → session-BJHsjD3z.js} +1 -1
  344. package/dist/{session-4FpEJvkE.js → session-C_b1ttHJ.js} +1 -1
  345. package/dist/{session-dirs-OxQuIvJW.js → session-dirs-Bvbgw0GC.js} +1 -1
  346. package/dist/{session-dirs-D_ARkyw0.js → session-dirs-DHaoq7zc.js} +1 -1
  347. package/dist/{session-utils-GMvum00v.js → session-utils-Dxou8SbO.js} +1 -1
  348. package/dist/{sessions-Bl1wwotX.js → sessions-BA8Se_bT.js} +1 -1
  349. package/dist/{sessions-CdanN_ZI.js → sessions-BuZVmOWt.js} +1 -1
  350. package/dist/{sessions-B5dwRhUC.js → sessions-DvbW0FNJ.js} +1 -1
  351. package/dist/{sessions-B1t7qeEn.js → sessions-DvqsIg0M.js} +1 -1
  352. package/dist/{shared-xj-xaKFi.js → shared-BBOiNdjf.js} +1 -1
  353. package/dist/{shared-BPN3qd7G.js → shared-C2orjbTD.js} +1 -1
  354. package/dist/{skill-scanner-U3AJgjqc.js → skill-scanner-BEvov9QH.js} +1 -1
  355. package/dist/{skill-scanner-DEmbPsRh.js → skill-scanner-OTLeRZ_p.js} +1 -1
  356. package/dist/{skills-cli-CIdnXa3B.js → skills-cli-C1BOgB3y.js} +1 -1
  357. package/dist/{skills-cli-BXbGr7vl.js → skills-cli-CFT2Aq5R.js} +1 -1
  358. package/dist/{skills-install-Btw_GHbI.js → skills-install-LlKntDHa.js} +1 -1
  359. package/dist/{skills-install-DMHQRpIl.js → skills-install-tx5Mahav.js} +1 -1
  360. package/dist/{status-DXaDS_0w.js → status-Bh8V7kjv.js} +1 -1
  361. package/dist/{status-BxeKmkVr.js → status-BtBHmhQh.js} +1 -1
  362. package/dist/{status-BkcmeZg6.js → status-CpwD4y9B.js} +1 -1
  363. package/dist/status-CqaTmyih.js +1 -0
  364. package/dist/{status-DouJcFzf.js → status-yXz8PUbL.js} +1 -1
  365. package/dist/{status.update-C9iy31xr.js → status.update-CdgsLBPg.js} +1 -1
  366. package/dist/{status.update-KYyRSDZY.js → status.update-hzMro-BT.js} +1 -1
  367. package/dist/{subagent-registry-Dr20nzwk.js → subagent-registry-CaRUNwCj.js} +1 -1
  368. package/dist/{subagent-registry-CyGxu3kP.js → subagent-registry-DDEN4oJi.js} +10 -10
  369. package/dist/{subagent-registry-BiXkIDeh.js → subagent-registry-DYYfeIc3.js} +1 -1
  370. package/dist/{system-cli-b4YgXPHv.js → system-cli-4aii1JYf.js} +1 -1
  371. package/dist/{system-cli-C7YzJeP4.js → system-cli-CfkDD3FV.js} +1 -1
  372. package/dist/{tui-DylWbrDx.js → tui-DnVRxfI8.js} +2 -2
  373. package/dist/{tui-BwWMByVp.js → tui-JfWoLGIV.js} +2 -2
  374. package/dist/{tui-cli-C_TTgabr.js → tui-cli-CGjg2Eb5.js} +1 -1
  375. package/dist/{tui-cli-Bh1V8-w9.js → tui-cli-cd7Efw5u.js} +1 -1
  376. package/dist/{tui-setup-check-DJZCJokQ.js → tui-setup-check-BEHm9wwo.js} +1 -1
  377. package/dist/{tui-setup-check-BABAyl-e.js → tui-setup-check-DK8vdhLI.js} +1 -1
  378. package/dist/{tui-stream-assembler-ign_cPkv.js → tui-stream-assembler-8ud9oyMK.js} +1 -1
  379. package/dist/{tui-stream-assembler-q9GANTDr.js → tui-stream-assembler-Br15rhRH.js} +1 -1
  380. package/dist/{update-BUzcmoDf.js → update-B5yKFeGO.js} +1 -1
  381. package/dist/{update-D6U-V8Au.js → update-DodoQDCk.js} +1 -1
  382. package/dist/{update-cli-DUrUIrYQ.js → update-cli-CfJJcSUS.js} +1 -1
  383. package/dist/{update-cli-CA3LuuJ7.js → update-cli-x8Ocbf-0.js} +1 -1
  384. package/dist/{usage-cli-CfEg1_NZ.js → usage-cli-CN7L1YRG.js} +1 -1
  385. package/dist/{usage-cli-CpbYMXxS.js → usage-cli-CQmokGkG.js} +1 -1
  386. package/dist/{web-D-NSyF6b.js → web-BXLk9UT2.js} +1 -1
  387. package/dist/web-Btgs8oWv.js +1 -0
  388. package/dist/{webhooks-cli-B_f61rq7.js → webhooks-cli-DIo8p3lk.js} +1 -1
  389. package/dist/{webhooks-cli-Bi0t3w6P.js → webhooks-cli-DhxEtiFt.js} +1 -1
  390. package/dist/{whatsapp-actions-JbF2MrTV.js → whatsapp-actions-B7r9AyZN.js} +1 -1
  391. package/dist/{whatsapp-actions-BkCMhD9X.js → whatsapp-actions-DX2QU6Gs.js} +1 -1
  392. package/dist/{with-timeout-T07SJo4N.js → with-timeout-B_p5pWDv.js} +1 -1
  393. package/dist/{with-timeout-Bwq-GyUQ.js → with-timeout-GDLpcjW7.js} +1 -1
  394. package/dist/workflow-telemetry-BMTg5lPd.js +1 -0
  395. package/dist/workflow-telemetry-Bg8MVUr_.js +2 -0
  396. package/dist/workflow-telemetry-Do1UsYwM.js +1 -0
  397. package/dist/workflow-telemetry-DqBPhVL4.js +2 -0
  398. package/package.json +1 -1
  399. package/dist/agents-DsZ5vLKE.js +0 -1
  400. package/dist/auth-choice-Btd2Rxxd.js +0 -1
  401. package/dist/auth-choice-CVV9wRFN.js +0 -1
  402. package/dist/auth-choice.apply-BOK9XRCQ.js +0 -1
  403. package/dist/auth-choice.apply-Cv-BiV5Q.js +0 -1
  404. package/dist/auth-choice.apply.transformers-CXywS3GZ.js +0 -1
  405. package/dist/builderforce-onboarding-Dq6VUSKZ.js +0 -24
  406. package/dist/builderforce-onboarding-DuUfZ6oL.js +0 -24
  407. package/dist/configure-CWBBFk3F.js +0 -1
  408. package/dist/configure-fHVOAucW.js +0 -1
  409. package/dist/health-GLcAfqDz.js +0 -1
  410. package/dist/login-CPyEf5h6.js +0 -1
  411. package/dist/model-catalog-J7R-tJDu.js +0 -1
  412. package/dist/model-picker-D2bcWrtu.js +0 -1
  413. package/dist/model-picker-DO1HtEEm.js +0 -1
  414. package/dist/onboard-channels-CmqKsAoW.js +0 -1
  415. package/dist/onboard-channels-Db0P4iWl.js +0 -1
  416. package/dist/onboard-custom-BABqIYa4.js +0 -1
  417. package/dist/onboard-custom-VpW3UC8u.js +0 -1
  418. package/dist/plugin-registry-B-UOeWqM.js +0 -1
  419. package/dist/plugin-registry-BjMr3yXM.js +0 -1
  420. package/dist/plugin-sdk/web-CThgoHQp.js +0 -1
  421. package/dist/provider-dispatcher-C4nHaNqn.js +0 -1
  422. package/dist/register.configure-DAL38e7r.js +0 -1
  423. package/dist/register.configure-DZG7-WVi.js +0 -1
  424. package/dist/status-BTYqHVha.js +0 -1
  425. package/dist/web-P6QsgmSD.js +0 -1
  426. package/dist/workflow-telemetry-B8Im0mPk.js +0 -1
  427. package/dist/workflow-telemetry-DLEnm5TI.js +0 -2
  428. package/dist/workflow-telemetry-Dc_oseV7.js +0 -2
  429. package/dist/workflow-telemetry-Dkm3mofI.js +0 -1
  430. /package/dist/{devtools-CI7JyCXv.js → devtools-Cg4F-l9O.js} +0 -0
  431. /package/dist/{devtools-eMFaIsAT.js → devtools-Dl2DACSO.js} +0 -0
  432. /package/dist/{github-copilot-token-D3gHtNUu.js → github-copilot-token-BlyiXyTy.js} +0 -0
  433. /package/dist/{github-copilot-token-DHP2kAiN.js → github-copilot-token-D5sB2AUI.js} +0 -0
  434. /package/dist/{onboard-hooks-Cenav0eW.js → onboard-hooks-BaOSgxs9.js} +0 -0
  435. /package/dist/{onboard-hooks-Ce20rwpW.js → onboard-hooks-fO5eeDe_.js} +0 -0
  436. /package/dist/{qmd-manager-DVd_aWEV.js → qmd-manager-BgplOjHN.js} +0 -0
  437. /package/dist/{qmd-manager-keHvLmvP.js → qmd-manager-COUi_Fqb.js} +0 -0
@@ -0,0 +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-pt7Tr4HA.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import"./model-discovery-D0i1JpiL.js";import"./model-catalog-BeBXvbFm.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./skills-status-CGlKz1D1.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-Du2LiaX6.js";import"./message-channel-z5YRpR2d.js";import"./subagent-registry-DDEN4oJi.js";import"./sessions-BA8Se_bT.js";import"./project-context-store-CIUcwUP_.js";import"./tokens-CFKkpUIu.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-B7H8Ae5j.js";import"./send-DqR7Rxzm.js";import"./with-timeout-B_p5pWDv.js";import"./deliver-CsG0cHbZ.js";import"./accounts-Cx82nj4E.js";import"./send-KgN1P41U.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-DdU30lmt.js";import"./sandbox-DvKMuAXL.js";import"./chrome-CFmcixaE.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-CttALzrW.js";import"./routes-_iZdG1Fo.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./workspace-waBqRxiy.js";import"./reply-prefix-Cg7AqaK0.js";import"./sqlite-CIGM1WKg.js";import"./memory-cli-CveeVOWH.js";import"./manager-BeohB4-8.js";import"./gemini-auth-DDR12zst.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import"./runner-Cu9NJouV.js";import"./tool-display-Cs4hDP1f.js";import"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-9ksvqHYX.js";import"./session-utils-Dxou8SbO.js";import"./coding-tools.policy-D9Ba8eDh.js";import"./pairing-store-YRy7EBgI.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-B8lFHp0K.js";import"./send-kkm_zrHQ.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-D3Mx4maV.js";import"./control-service-2PkCt256.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-CYGOPcKq.js";import"./resolve-route-DEIW5uKy.js";import"./channel-activity-DX36RadH.js";import"./tables-CojSfTth.js";import"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-BOGMDhSN.js";import"./onboard-helpers-Ce_c4Raj.js";import"./prompt-style-BMWmaqSC.js";import"./pairing-labels-BJPrScRl.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-CV4nDcCk.js";import"./transformers-stream-Buj40qHl.js";import"./catalog-li4bSIE2.js";import"./note-DgDXuE0F.js";import"./clack-prompter-B52CP7eY.js";import"./helpers-DPPVplyk.js";import"./plugin-auto-enable-Cupr4wbt.js";import"./install-safe-path-ObPl6zIf.js";import"./npm-registry-spec-BV1VDmuN.js";import"./skill-scanner-OTLeRZ_p.js";import"./installs-B_t2YXgq.js";import"./onboard-channels-Dn0u5C-C.js";import"./daemon-runtime-Dx800VUt.js";import"./runtime-guard-Bi8k55v9.js";import"./systemd-DdVd5Yet.js";import"./service-EKJG69M3.js";import"./widearea-dns-DvQozd9v.js";import"./bonjour-discovery-CViQz7cm.js";import"./health-zrsgFZmR.js";import"./control-ui-assets-BxgWcomx.js";import"./skills-install-tx5Mahav.js";import"./shared-BBOiNdjf.js";import"./onboard-auth.credentials-DneFSdYg.js";import"./auth-token-BPHeoBAW.js";import"./logging-ayt7F7vy.js";import"./provider-auth-helpers-hNwpK_hl.js";import"./auth-choice.apply-BgOXoS8X.js";import"./openai-model-default-pfoEzWYJ.js";import"./model-picker-CGDNPRPc.js";import"./auth-choice.apply.transformers-DmdxpHGz.js";import"./auth-choice-DzBqqq7i.js";import{n as configureCommandFromSectionsArg}from"./configure-CWr61Ph2.js";import"./systemd-linger-CPKngdUf.js";import"./onboard-custom-BYIza2e7.js";import"./health-format-D4MaIjaG.js";import"./onboard-remote-0-q7MG9t.js";import"./onboard-skills-9Um4TL2x.js";export{configureCommandFromSectionsArg};
@@ -1,4 +1,4 @@
1
- import{t as CONFIG_PATH,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{in as ensureAuthProfileStore}from"./model-selection-9bRFKBI_.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{a as readConfigFileSnapshot,c as writeConfigFile,r as loadConfig}from"./io-3R_ZyUxB.js";import{a as findTailscaleBinary}from"./tailscale-DLkpGquM.js";import{n as listChannelPlugins,t as getChannelPlugin}from"./plugins-D5zP6ENo.js";import{n as withProgress}from"./progress-BfOtdN6b.js";import{a as ensureWorkspaceAndSessions,b as waitForGatewayReachable,f as printWizardHeader,g as resolveControlUiLinks,m as randomToken,n as applyWizardMetadata,p as probeGatewayReachable,s as guardCancel,t as DEFAULT_WORKSPACE,u as normalizeGatewayTokenInput,v as summarizeExistingConfig,y as validateGatewayPasswordInput}from"./onboard-helpers-Cf5dNq7-.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BpVK43GK.js";import{t as note$1}from"./note-B6NtFdXt.js";import{t as WizardCancelledError}from"./prompts-Bchzq3K0.js";import{t as createClackPrompter}from"./clack-prompter-Dg23_riR.js";import{n as setupChannels,t as noteChannelStatus}from"./onboard-channels-C8FCFn29.js";import{a as gatewayInstallErrorHint,i as buildGatewayInstallPlan,n as GATEWAY_DAEMON_RUNTIME_OPTIONS,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-CtOr1ncS.js";import{t as resolveGatewayService}from"./service-D-NLDyK3.js";import{r as healthCommand}from"./health-yS3NRKvY.js";import{t as ensureControlUiAssetsBuilt}from"./control-ui-assets-CWgH1Tda.js";import{n as logConfigUpdated}from"./logging-DHa3jQN3.js";import{t as promptAuthChoiceGrouped}from"./auth-choice-prompt-wkrUXDfB.js";import{t as applyAuthChoice}from"./auth-choice.apply-BHLQeym9.js";import{a as promptModelAllowlist,i as promptDefaultModel,n as applyModelFallbacksFromSelection,r as applyPrimaryModel,t as applyModelAllowlist}from"./model-picker-BUePD7Zg.js";import{t as resolvePreferredProviderForAuthChoice}from"./auth-choice-9gZuOvPS.js";import{t as ensureSystemdUserLingerInteractive}from"./systemd-linger-CT-VHPB3.js";import{i as promptCustomApiConfig}from"./onboard-custom-C_BI0ZXn.js";import{i as TAILSCALE_MISSING_BIN_NOTE_LINES,n as TAILSCALE_DOCS_LINES,r as TAILSCALE_EXPOSURE_OPTIONS,t as validateIPv4AddressInput}from"./ipv4-Brrhx_sr.js";import{t as formatHealthCheckFailure}from"./health-format-iE_KYEwP.js";import{t as promptRemoteGatewayConfig}from"./onboard-remote-BmSyHww1.js";import{t as setupSkills}from"./onboard-skills-CI1OtWsE.js";import{confirm,intro,outro,select,text}from"@clack/prompts";const CONFIGURE_WIZARD_SECTIONS=[`workspace`,`model`,`web`,`gateway`,`daemon`,`channels`,`skills`,`health`];function parseConfigureWizardSections(raw){let sectionsRaw=Array.isArray(raw)?raw.map(value=>typeof value==`string`?value.trim():``).filter(Boolean):[];if(sectionsRaw.length===0)return{sections:[],invalid:[]};let invalid=sectionsRaw.filter(s=>!CONFIGURE_WIZARD_SECTIONS.includes(s));return{sections:sectionsRaw.filter(s=>CONFIGURE_WIZARD_SECTIONS.includes(s)),invalid}}const CONFIGURE_SECTION_OPTIONS=[{value:`workspace`,label:`Workspace`,hint:`Set workspace + sessions`},{value:`model`,label:`Model`,hint:`Pick provider + credentials`},{value:`web`,label:`Web tools`,hint:`Configure Brave search + fetch`},{value:`gateway`,label:`Gateway`,hint:`Port, bind, auth, tailscale`},{value:`daemon`,label:`Daemon`,hint:`Install/manage the background service`},{value:`channels`,label:`Channels`,hint:`Link WhatsApp/Telegram/etc and defaults`},{value:`skills`,label:`Skills`,hint:`Install/enable workspace skills`},{value:`health`,label:`Health check`,hint:`Run gateway + channel checks`}],intro$1=message=>intro(stylePromptTitle(message)??message),outro$1=message=>outro(stylePromptTitle(message)??message),text$1=params=>text({...params,message:stylePromptMessage(params.message)}),confirm$1=params=>confirm({...params,message:stylePromptMessage(params.message)}),select$1=params=>select({...params,message:stylePromptMessage(params.message),options:params.options.map(opt=>opt.hint===void 0?opt:{...opt,hint:stylePromptHint(opt.hint)})});async function removeChannelConfigWizard(cfg,runtime){let next={...cfg},listConfiguredChannels=()=>listChannelPlugins().map(plugin=>plugin.meta).filter(meta=>next.channels?.[meta.id]!==void 0);for(;;){let configured=listConfiguredChannels();if(configured.length===0)return note$1([`No channel config found in builderforce.json.`,`Tip: \`${formatCliCommand(`builderforce channels status`)}\` shows what is configured and enabled.`].join(`
1
+ import{t as CONFIG_PATH,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{in as ensureAuthProfileStore}from"./model-selection-DG9J_VTz.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{a as readConfigFileSnapshot,c as writeConfigFile,r as loadConfig}from"./io-BLBq4T2o.js";import{a as findTailscaleBinary}from"./tailscale-DLkpGquM.js";import{n as listChannelPlugins,t as getChannelPlugin}from"./plugins-D5zP6ENo.js";import{n as withProgress}from"./progress-BfOtdN6b.js";import{a as ensureWorkspaceAndSessions,b as waitForGatewayReachable,f as printWizardHeader,g as resolveControlUiLinks,m as randomToken,n as applyWizardMetadata,p as probeGatewayReachable,s as guardCancel,t as DEFAULT_WORKSPACE,u as normalizeGatewayTokenInput,v as summarizeExistingConfig,y as validateGatewayPasswordInput}from"./onboard-helpers-CiHzTaFX.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BpVK43GK.js";import{t as note$1}from"./note-B6NtFdXt.js";import{t as WizardCancelledError}from"./prompts-Bchzq3K0.js";import{t as createClackPrompter}from"./clack-prompter-Dg23_riR.js";import{n as setupChannels,t as noteChannelStatus}from"./onboard-channels-vhtccaIV.js";import{a as gatewayInstallErrorHint,i as buildGatewayInstallPlan,n as GATEWAY_DAEMON_RUNTIME_OPTIONS,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-9XitJmIL.js";import{t as resolveGatewayService}from"./service-D-NLDyK3.js";import{r as healthCommand}from"./health-FO8MG5Ur.js";import{t as ensureControlUiAssetsBuilt}from"./control-ui-assets-CWgH1Tda.js";import{n as logConfigUpdated}from"./logging-DHa3jQN3.js";import{t as promptAuthChoiceGrouped}from"./auth-choice-prompt-wkrUXDfB.js";import{t as applyAuthChoice}from"./auth-choice.apply-DBuvopiF.js";import{a as promptModelAllowlist,i as promptDefaultModel,n as applyModelFallbacksFromSelection,r as applyPrimaryModel,t as applyModelAllowlist}from"./model-picker-EIhpfOZa.js";import{t as resolvePreferredProviderForAuthChoice}from"./auth-choice-CCib_yVL.js";import{t as ensureSystemdUserLingerInteractive}from"./systemd-linger-CT-VHPB3.js";import{i as promptCustomApiConfig}from"./onboard-custom-Ckf0xKXY.js";import{i as TAILSCALE_MISSING_BIN_NOTE_LINES,n as TAILSCALE_DOCS_LINES,r as TAILSCALE_EXPOSURE_OPTIONS,t as validateIPv4AddressInput}from"./ipv4-Brrhx_sr.js";import{t as formatHealthCheckFailure}from"./health-format-iE_KYEwP.js";import{t as promptRemoteGatewayConfig}from"./onboard-remote-CgAAEZpq.js";import{t as setupSkills}from"./onboard-skills-mI2kfvdT.js";import{confirm,intro,outro,select,text}from"@clack/prompts";const CONFIGURE_WIZARD_SECTIONS=[`workspace`,`model`,`web`,`gateway`,`daemon`,`channels`,`skills`,`health`];function parseConfigureWizardSections(raw){let sectionsRaw=Array.isArray(raw)?raw.map(value=>typeof value==`string`?value.trim():``).filter(Boolean):[];if(sectionsRaw.length===0)return{sections:[],invalid:[]};let invalid=sectionsRaw.filter(s=>!CONFIGURE_WIZARD_SECTIONS.includes(s));return{sections:sectionsRaw.filter(s=>CONFIGURE_WIZARD_SECTIONS.includes(s)),invalid}}const CONFIGURE_SECTION_OPTIONS=[{value:`workspace`,label:`Workspace`,hint:`Set workspace + sessions`},{value:`model`,label:`Model`,hint:`Pick provider + credentials`},{value:`web`,label:`Web tools`,hint:`Configure Brave search + fetch`},{value:`gateway`,label:`Gateway`,hint:`Port, bind, auth, tailscale`},{value:`daemon`,label:`Daemon`,hint:`Install/manage the background service`},{value:`channels`,label:`Channels`,hint:`Link WhatsApp/Telegram/etc and defaults`},{value:`skills`,label:`Skills`,hint:`Install/enable workspace skills`},{value:`health`,label:`Health check`,hint:`Run gateway + channel checks`}],intro$1=message=>intro(stylePromptTitle(message)??message),outro$1=message=>outro(stylePromptTitle(message)??message),text$1=params=>text({...params,message:stylePromptMessage(params.message)}),confirm$1=params=>confirm({...params,message:stylePromptMessage(params.message)}),select$1=params=>select({...params,message:stylePromptMessage(params.message),options:params.options.map(opt=>opt.hint===void 0?opt:{...opt,hint:stylePromptHint(opt.hint)})});async function removeChannelConfigWizard(cfg,runtime){let next={...cfg},listConfiguredChannels=()=>listChannelPlugins().map(plugin=>plugin.meta).filter(meta=>next.channels?.[meta.id]!==void 0);for(;;){let configured=listConfiguredChannels();if(configured.length===0)return note$1([`No channel config found in builderforce.json.`,`Tip: \`${formatCliCommand(`builderforce channels status`)}\` shows what is configured and enabled.`].join(`
2
2
  `),`Remove channel`),next;let channel=guardCancel(await select$1({message:`Remove which channel config?`,options:[...configured.map(meta=>({value:meta.id,label:meta.label,hint:`Deletes tokens + settings from config (credentials stay on disk)`})),{value:`done`,label:`Done`}]}),runtime);if(channel===`done`)return next;let label=getChannelPlugin(channel)?.meta.label??channel;if(!guardCancel(await confirm$1({message:`Delete ${label} configuration from ${shortenHomePath(CONFIG_PATH)}?`,initialValue:!1}),runtime))continue;let nextChannels={...next.channels};delete nextChannels[channel],next={...next,channels:Object.keys(nextChannels).length?nextChannels:void 0},note$1([`${label} removed from config.`,`Note: credentials/sessions on disk are unchanged.`].join(`
3
3
  `),`Channel removed`)}}async function maybeInstallDaemon(params){let service=resolveGatewayService(),loaded=await service.isLoaded({env:process.env}),shouldCheckLinger=!1,shouldInstall=!0,daemonRuntime=params.daemonRuntime??DEFAULT_GATEWAY_DAEMON_RUNTIME;if(loaded){let action=guardCancel(await select$1({message:`Gateway service already installed`,options:[{value:`restart`,label:`Restart`},{value:`reinstall`,label:`Reinstall`},{value:`skip`,label:`Skip`}]}),params.runtime);if(action===`restart`&&(await withProgress({label:`Gateway service`,indeterminate:!0,delayMs:0},async progress=>{progress.setLabel(`Restarting Gateway service…`),await service.restart({env:process.env,stdout:process.stdout}),progress.setLabel(`Gateway service restarted.`)}),shouldCheckLinger=!0,shouldInstall=!1),action===`skip`)return;action===`reinstall`&&await withProgress({label:`Gateway service`,indeterminate:!0,delayMs:0},async progress=>{progress.setLabel(`Uninstalling Gateway service…`),await service.uninstall({env:process.env,stdout:process.stdout}),progress.setLabel(`Gateway service uninstalled.`)})}if(shouldInstall){let installError=null;if(params.daemonRuntime||(daemonRuntime=GATEWAY_DAEMON_RUNTIME_OPTIONS.length===1?GATEWAY_DAEMON_RUNTIME_OPTIONS[0]?.value??DEFAULT_GATEWAY_DAEMON_RUNTIME:guardCancel(await select$1({message:`Gateway service runtime`,options:GATEWAY_DAEMON_RUNTIME_OPTIONS,initialValue:DEFAULT_GATEWAY_DAEMON_RUNTIME}),params.runtime)),await withProgress({label:`Gateway service`,indeterminate:!0,delayMs:0},async progress=>{progress.setLabel(`Preparing Gateway service…`);let cfg=loadConfig(),{programArguments,workingDirectory,environment}=await buildGatewayInstallPlan({env:process.env,port:params.port,token:params.gatewayToken,runtime:daemonRuntime,warn:(message,title)=>note$1(message,title),config:cfg});progress.setLabel(`Installing Gateway service…`);try{await service.install({env:process.env,stdout:process.stdout,programArguments,workingDirectory,environment}),progress.setLabel(`Gateway service installed.`)}catch(err){installError=err instanceof Error?err.message:String(err),progress.setLabel(`Gateway service install failed.`)}}),installError){note$1(`Gateway service install failed: `+installError,`Gateway`),note$1(gatewayInstallErrorHint(),`Gateway`);return}shouldCheckLinger=!0}shouldCheckLinger&&await ensureSystemdUserLingerInteractive({runtime:params.runtime,prompter:{confirm:async p=>guardCancel(await confirm$1(p),params.runtime),note:note$1},reason:`Linux installs use a systemd user service. Without lingering, systemd stops the user session on logout/idle and kills the Gateway.`,requireConfirm:!0})}function sanitizeTokenValue(value){if(typeof value!=`string`)return;let trimmed=value.trim();if(!(!trimmed||trimmed===`undefined`||trimmed===`null`))return trimmed}const ANTHROPIC_OAUTH_MODEL_KEYS=[`anthropic/claude-sonnet-4-6`,`anthropic/claude-opus-4-6`,`anthropic/claude-opus-4-5`,`anthropic/claude-sonnet-4-5`,`anthropic/claude-haiku-4-5`];function buildGatewayAuthConfig(params){let allowTailscale=params.existing?.allowTailscale,base={};if(typeof allowTailscale==`boolean`&&(base.allowTailscale=allowTailscale),params.mode===`token`){let token=sanitizeTokenValue(params.token)??randomToken();return{...base,mode:`token`,token}}if(params.mode===`password`){let password=params.password?.trim();return{...base,mode:`password`,...password&&{password}}}if(params.mode===`trusted-proxy`){if(!params.trustedProxy)throw Error(`trustedProxy config is required when mode is trusted-proxy`);return{...base,mode:`trusted-proxy`,trustedProxy:params.trustedProxy}}return base}async function promptAuthConfig(cfg,runtime,prompter){let authChoice=await promptAuthChoiceGrouped({prompter,store:await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1}),includeSkip:!0}),next=cfg;if(authChoice===`custom-api-key`)next=(await promptCustomApiConfig({prompter,runtime,config:next})).config;else if(authChoice!==`skip`)next=(await applyAuthChoice({authChoice,config:next,prompter,runtime,setDefaultModel:!0})).config;else{let modelSelection=await promptDefaultModel({config:next,prompter,allowKeep:!0,ignoreAllowlist:!0,preferredProvider:resolvePreferredProviderForAuthChoice(authChoice)});modelSelection.config&&(next=modelSelection.config),modelSelection.model&&(next=applyPrimaryModel(next,modelSelection.model))}let anthropicOAuth=authChoice===`setup-token`||authChoice===`token`||authChoice===`oauth`;if(authChoice!==`custom-api-key`){let allowlistSelection=await promptModelAllowlist({config:next,prompter,allowedKeys:anthropicOAuth?ANTHROPIC_OAUTH_MODEL_KEYS:void 0,initialSelections:anthropicOAuth?[`anthropic/claude-sonnet-4-6`]:void 0,message:anthropicOAuth?`Anthropic OAuth models`:void 0});allowlistSelection.models&&(next=applyModelAllowlist(next,allowlistSelection.models),next=applyModelFallbacksFromSelection(next,allowlistSelection.models))}return next}async function promptGatewayConfig(cfg,runtime){let portRaw=guardCancel(await text$1({message:`Gateway port`,initialValue:String(resolveGatewayPort(cfg)),validate:value=>Number.isFinite(Number(value))?void 0:`Invalid port`}),runtime),port=Number.parseInt(String(portRaw),10),bind=guardCancel(await select$1({message:`Gateway bind mode`,options:[{value:`loopback`,label:`Loopback (Local only)`,hint:`Bind to 127.0.0.1 - secure, local-only access`},{value:`tailnet`,label:`Tailnet (Tailscale IP)`,hint:`Bind to your Tailscale IP only (100.x.x.x)`},{value:`auto`,label:`Auto (Loopback → LAN)`,hint:`Prefer loopback; fall back to all interfaces if unavailable`},{value:`lan`,label:`LAN (All interfaces)`,hint:`Bind to 0.0.0.0 - accessible from anywhere on your network`},{value:`custom`,label:`Custom IP`,hint:`Specify a specific IP address, with 0.0.0.0 fallback if unavailable`}]}),runtime),customBindHost;if(bind===`custom`){let input=guardCancel(await text$1({message:`Custom IP address`,placeholder:`192.168.1.100`,validate:validateIPv4AddressInput}),runtime);customBindHost=typeof input==`string`?input:void 0}let authMode=guardCancel(await select$1({message:`Gateway auth`,options:[{value:`token`,label:`Token`,hint:`Recommended default`},{value:`password`,label:`Password`},{value:`trusted-proxy`,label:`Trusted Proxy`,hint:`Behind reverse proxy (Pomerium, Caddy, Traefik, etc.)`}],initialValue:`token`}),runtime),tailscaleMode=guardCancel(await select$1({message:`Tailscale exposure`,options:[...TAILSCALE_EXPOSURE_OPTIONS]}),runtime);tailscaleMode!==`off`&&(await findTailscaleBinary()||note$1(TAILSCALE_MISSING_BIN_NOTE_LINES.join(`
4
4
  `),`Tailscale Warning`));let tailscaleResetOnExit=!1;tailscaleMode!==`off`&&(note$1(TAILSCALE_DOCS_LINES.join(`
@@ -0,0 +1 @@
1
+ import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-C9jpiwlw.js";import"./reply-GY1C8tcv.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"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./runner-eTTUbLAK.js";import"./model-catalog-DjNiebr7.js";import"./sandbox-C4AKi2EX.js";import"./chrome-DXt86tmV.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-CQ2v4BAx.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-DZntyPY6.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-BuZVmOWt.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-Aw8wK3vK.js";import"./send-ChGpVO3O.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-CyCi-UqR.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-wcq7lXuI.js";import"./with-timeout-GDLpcjW7.js";import"./deliver--6OBF3LL.js";import"./send-BxoVLIy1.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import"./memory-cli-CbkWGjRn.js";import"./manager-DSz61dXv.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-T8ciwMTA.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-F5JMAr3p.js";import"./send-BP5osGBo.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-ti3FEkmr.js";import"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import"./resolve-route-D49haUnv.js";import"./replies-DokbEfJD.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-ZhOdlcEI.js";import"./send-l3ge4wkC.js";import"./onboard-helpers-CiHzTaFX.js";import"./prompt-style-BpVK43GK.js";import"./pairing-labels-oA-nKTaW.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-B-wPVN_j.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-CJj0Inz-.js";import"./control-service-y3GYvIBg.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-CoGqoBTH.js";import"./transformers-stream-D7nRu4Qu.js";import"./runtime-guard-DhksRHci.js";import"./catalog-rgiY__UQ.js";import"./skills-status-vWC0PU8J.js";import"./note-B6NtFdXt.js";import"./clack-prompter-Dg23_riR.js";import"./helpers-DTDCy17p.js";import"./plugin-auto-enable-D8gKiE3F.js";import"./install-safe-path-DsLq2BUJ.js";import"./npm-registry-spec-DIW6RsGN.js";import"./skill-scanner-BEvov9QH.js";import"./installs-DFiF4lGy.js";import"./onboard-channels-vhtccaIV.js";import"./daemon-runtime-9XitJmIL.js";import"./systemd-BG3_QT6W.js";import"./service-D-NLDyK3.js";import"./widearea-dns-CZR56vQb.js";import"./bonjour-discovery-Dq1G1iS-.js";import"./health-FO8MG5Ur.js";import"./control-ui-assets-CWgH1Tda.js";import"./skills-install-LlKntDHa.js";import"./shared-C2orjbTD.js";import"./onboard-auth.credentials-DpitLlzw.js";import"./auth-token-BE67qxLw.js";import"./logging-DHa3jQN3.js";import"./provider-auth-helpers-B84m5VMc.js";import"./auth-choice.apply-DBuvopiF.js";import"./openai-model-default-CH2-2Hvk.js";import"./model-picker-EIhpfOZa.js";import"./auth-choice.apply.transformers-Df9l_jRz.js";import"./auth-choice-CCib_yVL.js";import{n as configureCommandFromSectionsArg}from"./configure-DlcO1tWx.js";import"./systemd-linger-CT-VHPB3.js";import"./onboard-custom-Ckf0xKXY.js";import"./health-format-iE_KYEwP.js";import"./onboard-remote-CgAAEZpq.js";import"./onboard-skills-mI2kfvdT.js";export{configureCommandFromSectionsArg};
@@ -1 +1 @@
1
- import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{r as loadConfig}from"./io-CohJffHG.js";import{v as ensureChromeExtensionRelayServer}from"./chrome-BnEbJV3D.js";import{a as resolveProfile,i as resolveBrowserConfig,n as listKnownProfileNames,p as ensureBrowserControlAuth,t as createBrowserRouteContext}from"./server-context-owOmmyUM.js";async function ensureExtensionRelayForProfiles(params){for(let name of Object.keys(params.resolved.profiles)){let profile=resolveProfile(params.resolved,name);!profile||profile.driver!==`extension`||await ensureChromeExtensionRelayServer({cdpUrl:profile.cdpUrl}).catch(err=>{params.onWarn(`Chrome extension relay init failed for profile "${name}": ${String(err)}`)})}}async function stopKnownBrowserProfiles(params){let current=params.getState();if(!current)return;let ctx=createBrowserRouteContext({getState:params.getState,refreshConfigFromDisk:!0});try{for(let name of listKnownProfileNames(current))try{await ctx.forProfile(name).stopRunningBrowser()}catch{}}catch(err){params.onWarn(`builderforce browser stop failed: ${String(err)}`)}}let state=null;const logService=createSubsystemLogger(`browser`).child(`service`);function getBrowserControlState(){return state}function createBrowserControlContext(){return createBrowserRouteContext({getState:()=>state,refreshConfigFromDisk:!0})}async function startBrowserControlServiceFromConfig(){if(state)return state;let cfg=loadConfig(),resolved=resolveBrowserConfig(cfg.browser,cfg);if(!resolved.enabled)return null;try{(await ensureBrowserControlAuth({cfg})).generatedToken&&logService.info(`No browser auth configured; generated gateway.auth.token automatically.`)}catch(err){logService.warn(`failed to auto-configure browser auth: ${String(err)}`)}return state={server:null,port:resolved.controlPort,resolved,profiles:new Map},await ensureExtensionRelayForProfiles({resolved,onWarn:message=>logService.warn(message)}),logService.info(`Browser control service ready (profiles=${Object.keys(resolved.profiles).length})`),state}async function stopBrowserControlService(){if(state){await stopKnownBrowserProfiles({getState:()=>state,onWarn:message=>logService.warn(message)}),state=null;try{await(await import(`./pw-ai-DSEj1QrV.js`)).closePlaywrightBrowserConnection()}catch{}}}export{stopBrowserControlService as i,getBrowserControlState as n,startBrowserControlServiceFromConfig as r,createBrowserControlContext as t};
1
+ import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{r as loadConfig}from"./io-D9hC2aG0.js";import{v as ensureChromeExtensionRelayServer}from"./chrome-CFmcixaE.js";import{a as resolveProfile,i as resolveBrowserConfig,n as listKnownProfileNames,p as ensureBrowserControlAuth,t as createBrowserRouteContext}from"./server-context-CttALzrW.js";async function ensureExtensionRelayForProfiles(params){for(let name of Object.keys(params.resolved.profiles)){let profile=resolveProfile(params.resolved,name);!profile||profile.driver!==`extension`||await ensureChromeExtensionRelayServer({cdpUrl:profile.cdpUrl}).catch(err=>{params.onWarn(`Chrome extension relay init failed for profile "${name}": ${String(err)}`)})}}async function stopKnownBrowserProfiles(params){let current=params.getState();if(!current)return;let ctx=createBrowserRouteContext({getState:params.getState,refreshConfigFromDisk:!0});try{for(let name of listKnownProfileNames(current))try{await ctx.forProfile(name).stopRunningBrowser()}catch{}}catch(err){params.onWarn(`builderforce browser stop failed: ${String(err)}`)}}let state=null;const logService=createSubsystemLogger(`browser`).child(`service`);function getBrowserControlState(){return state}function createBrowserControlContext(){return createBrowserRouteContext({getState:()=>state,refreshConfigFromDisk:!0})}async function startBrowserControlServiceFromConfig(){if(state)return state;let cfg=loadConfig(),resolved=resolveBrowserConfig(cfg.browser,cfg);if(!resolved.enabled)return null;try{(await ensureBrowserControlAuth({cfg})).generatedToken&&logService.info(`No browser auth configured; generated gateway.auth.token automatically.`)}catch(err){logService.warn(`failed to auto-configure browser auth: ${String(err)}`)}return state={server:null,port:resolved.controlPort,resolved,profiles:new Map},await ensureExtensionRelayForProfiles({resolved,onWarn:message=>logService.warn(message)}),logService.info(`Browser control service ready (profiles=${Object.keys(resolved.profiles).length})`),state}async function stopBrowserControlService(){if(state){await stopKnownBrowserProfiles({getState:()=>state,onWarn:message=>logService.warn(message)}),state=null;try{await(await import(`./pw-ai-CLS_VZ8p.js`)).closePlaywrightBrowserConnection()}catch{}}}export{stopBrowserControlService as i,getBrowserControlState as n,startBrowserControlServiceFromConfig as r,createBrowserControlContext 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-C1VbcUOm.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./chrome-BnEbJV3D.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-owOmmyUM.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import{i as stopBrowserControlService,n as getBrowserControlState,r as startBrowserControlServiceFromConfig,t as createBrowserControlContext}from"./control-service-CJuuqNOE.js";export{createBrowserControlContext,getBrowserControlState,startBrowserControlServiceFromConfig,stopBrowserControlService};
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-pt7Tr4HA.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./chrome-CFmcixaE.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-CttALzrW.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import{i as stopBrowserControlService,n as getBrowserControlState,r as startBrowserControlServiceFromConfig,t as createBrowserControlContext}from"./control-service-2PkCt256.js";export{createBrowserControlContext,getBrowserControlState,startBrowserControlServiceFromConfig,stopBrowserControlService};
@@ -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"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./chrome-a3X9_-nf.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DJZT7Upf.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import{i as stopBrowserControlService,n as getBrowserControlState,r as startBrowserControlServiceFromConfig,t as createBrowserControlContext}from"./control-service-BbsswoMy.js";export{createBrowserControlContext,getBrowserControlState,startBrowserControlServiceFromConfig,stopBrowserControlService};
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"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./chrome-DXt86tmV.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-CQ2v4BAx.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import{i as stopBrowserControlService,n as getBrowserControlState,r as startBrowserControlServiceFromConfig,t as createBrowserControlContext}from"./control-service-y3GYvIBg.js";export{createBrowserControlContext,getBrowserControlState,startBrowserControlServiceFromConfig,stopBrowserControlService};
@@ -1 +1 @@
1
- import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{r as loadConfig}from"./io-3R_ZyUxB.js";import{v as ensureChromeExtensionRelayServer}from"./chrome-a3X9_-nf.js";import{a as resolveProfile,i as resolveBrowserConfig,n as listKnownProfileNames,p as ensureBrowserControlAuth,t as createBrowserRouteContext}from"./server-context-DJZT7Upf.js";async function ensureExtensionRelayForProfiles(params){for(let name of Object.keys(params.resolved.profiles)){let profile=resolveProfile(params.resolved,name);!profile||profile.driver!==`extension`||await ensureChromeExtensionRelayServer({cdpUrl:profile.cdpUrl}).catch(err=>{params.onWarn(`Chrome extension relay init failed for profile "${name}": ${String(err)}`)})}}async function stopKnownBrowserProfiles(params){let current=params.getState();if(!current)return;let ctx=createBrowserRouteContext({getState:params.getState,refreshConfigFromDisk:!0});try{for(let name of listKnownProfileNames(current))try{await ctx.forProfile(name).stopRunningBrowser()}catch{}}catch(err){params.onWarn(`builderforce browser stop failed: ${String(err)}`)}}let state=null;const logService=createSubsystemLogger(`browser`).child(`service`);function getBrowserControlState(){return state}function createBrowserControlContext(){return createBrowserRouteContext({getState:()=>state,refreshConfigFromDisk:!0})}async function startBrowserControlServiceFromConfig(){if(state)return state;let cfg=loadConfig(),resolved=resolveBrowserConfig(cfg.browser,cfg);if(!resolved.enabled)return null;try{(await ensureBrowserControlAuth({cfg})).generatedToken&&logService.info(`No browser auth configured; generated gateway.auth.token automatically.`)}catch(err){logService.warn(`failed to auto-configure browser auth: ${String(err)}`)}return state={server:null,port:resolved.controlPort,resolved,profiles:new Map},await ensureExtensionRelayForProfiles({resolved,onWarn:message=>logService.warn(message)}),logService.info(`Browser control service ready (profiles=${Object.keys(resolved.profiles).length})`),state}async function stopBrowserControlService(){if(state){await stopKnownBrowserProfiles({getState:()=>state,onWarn:message=>logService.warn(message)}),state=null;try{await(await import(`./pw-ai-dNZY-qBs.js`)).closePlaywrightBrowserConnection()}catch{}}}export{stopBrowserControlService as i,getBrowserControlState as n,startBrowserControlServiceFromConfig as r,createBrowserControlContext as t};
1
+ import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{r as loadConfig}from"./io-BLBq4T2o.js";import{v as ensureChromeExtensionRelayServer}from"./chrome-DXt86tmV.js";import{a as resolveProfile,i as resolveBrowserConfig,n as listKnownProfileNames,p as ensureBrowserControlAuth,t as createBrowserRouteContext}from"./server-context-CQ2v4BAx.js";async function ensureExtensionRelayForProfiles(params){for(let name of Object.keys(params.resolved.profiles)){let profile=resolveProfile(params.resolved,name);!profile||profile.driver!==`extension`||await ensureChromeExtensionRelayServer({cdpUrl:profile.cdpUrl}).catch(err=>{params.onWarn(`Chrome extension relay init failed for profile "${name}": ${String(err)}`)})}}async function stopKnownBrowserProfiles(params){let current=params.getState();if(!current)return;let ctx=createBrowserRouteContext({getState:params.getState,refreshConfigFromDisk:!0});try{for(let name of listKnownProfileNames(current))try{await ctx.forProfile(name).stopRunningBrowser()}catch{}}catch(err){params.onWarn(`builderforce browser stop failed: ${String(err)}`)}}let state=null;const logService=createSubsystemLogger(`browser`).child(`service`);function getBrowserControlState(){return state}function createBrowserControlContext(){return createBrowserRouteContext({getState:()=>state,refreshConfigFromDisk:!0})}async function startBrowserControlServiceFromConfig(){if(state)return state;let cfg=loadConfig(),resolved=resolveBrowserConfig(cfg.browser,cfg);if(!resolved.enabled)return null;try{(await ensureBrowserControlAuth({cfg})).generatedToken&&logService.info(`No browser auth configured; generated gateway.auth.token automatically.`)}catch(err){logService.warn(`failed to auto-configure browser auth: ${String(err)}`)}return state={server:null,port:resolved.controlPort,resolved,profiles:new Map},await ensureExtensionRelayForProfiles({resolved,onWarn:message=>logService.warn(message)}),logService.info(`Browser control service ready (profiles=${Object.keys(resolved.profiles).length})`),state}async function stopBrowserControlService(){if(state){await stopKnownBrowserProfiles({getState:()=>state,onWarn:message=>logService.warn(message)}),state=null;try{await(await import(`./pw-ai-D5og_rIf.js`)).closePlaywrightBrowserConnection()}catch{}}}export{stopBrowserControlService as i,getBrowserControlState as n,startBrowserControlServiceFromConfig as r,createBrowserControlContext as t};
@@ -1,2 +1,2 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{D as danger,L as colorize,R as isRich,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-C1VbcUOm.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import{h as sanitizeAgentId}from"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./client-CGgp3zkQ.js";import"./call-DmAU4cRX.js";import"./message-channel-z5YRpR2d.js";import{n as listChannelPlugins}from"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import{n as formatDurationHuman}from"./format-duration-HN2dpHE0.js";import{i as parseAbsoluteTimeMs,n as resolveCronStaggerMs}from"./stagger-CRe77dWL.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import"./progress-Cqb-jAjT.js";import{n as callGatewayFromCli,t as addGatewayClientOptions}from"./gateway-rpc-ByUcnQ7W.js";import{n as parsePositiveIntOrUndefined}from"./helpers-DPw5_6PJ.js";const getCronChannelOptions=()=>[`last`,...listChannelPlugins().map(plugin=>plugin.id)].join(`|`);async function warnIfCronSchedulerDisabled(opts){try{let res=await callGatewayFromCli(`cron.status`,opts,{});if(res?.enabled===!0)return;let store=typeof res?.storePath==`string`?res.storePath:``;defaultRuntime.error([`warning: cron scheduler is disabled in the Gateway; jobs are saved but will not run automatically.`,"Re-enable with `cron.enabled: true` (or remove `cron.enabled: false`) and restart the Gateway.",store?`store: ${store}`:``].filter(Boolean).join(`
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{D as danger,L as colorize,R as isRich,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-pt7Tr4HA.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import{h as sanitizeAgentId}from"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import"./client-CGgp3zkQ.js";import"./call-Du2LiaX6.js";import"./message-channel-z5YRpR2d.js";import{n as listChannelPlugins}from"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import{n as formatDurationHuman}from"./format-duration-HN2dpHE0.js";import{i as parseAbsoluteTimeMs,n as resolveCronStaggerMs}from"./stagger-CRe77dWL.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import"./progress-Cqb-jAjT.js";import{n as callGatewayFromCli,t as addGatewayClientOptions}from"./gateway-rpc-ff1RVb0_.js";import{n as parsePositiveIntOrUndefined}from"./helpers-DPw5_6PJ.js";const getCronChannelOptions=()=>[`last`,...listChannelPlugins().map(plugin=>plugin.id)].join(`|`);async function warnIfCronSchedulerDisabled(opts){try{let res=await callGatewayFromCli(`cron.status`,opts,{});if(res?.enabled===!0)return;let store=typeof res?.storePath==`string`?res.storePath:``;defaultRuntime.error([`warning: cron scheduler is disabled in the Gateway; jobs are saved but will not run automatically.`,"Re-enable with `cron.enabled: true` (or remove `cron.enabled: false`) and restart the Gateway.",store?`store: ${store}`:``].filter(Boolean).join(`
2
2
  `))}catch{}}function parseDurationMs(input){let raw=input.trim();if(!raw)return null;let match=raw.match(/^(\d+(?:\.\d+)?)(ms|s|m|h|d)$/i);if(!match)return null;let n=Number.parseFloat(match[1]??``);if(!Number.isFinite(n)||n<=0)return null;let unit=(match[2]??``).toLowerCase(),factor=unit===`ms`?1:unit===`s`?1e3:unit===`m`?6e4:unit===`h`?36e5:864e5;return Math.floor(n*factor)}function parseAt(input){let raw=input.trim();if(!raw)return null;let absolute=parseAbsoluteTimeMs(raw);if(absolute!==null)return new Date(absolute).toISOString();let dur=parseDurationMs(raw);return dur===null?null:new Date(Date.now()+dur).toISOString()}const pad=(value,width)=>value.padEnd(width),truncate=(value,width)=>value.length<=width?value:width<=3?value.slice(0,width):`${value.slice(0,width-3)}...`,formatIsoMinute=iso=>{let parsed=parseAbsoluteTimeMs(iso),d=new Date(parsed??NaN);if(Number.isNaN(d.getTime()))return`-`;let isoStr=d.toISOString();return`${isoStr.slice(0,10)} ${isoStr.slice(11,16)}Z`},formatSpan=ms=>ms<6e4?`<1m`:ms<36e5?`${Math.round(ms/6e4)}m`:ms<864e5?`${Math.round(ms/36e5)}h`:`${Math.round(ms/864e5)}d`,formatRelative=(ms,nowMs)=>{if(!ms)return`-`;let delta=ms-nowMs,label=formatSpan(Math.abs(delta));return delta>=0?`in ${label}`:`${label} ago`},formatSchedule=schedule=>{if(schedule.kind===`at`)return`at ${formatIsoMinute(schedule.at)}`;if(schedule.kind===`every`)return`every ${formatDurationHuman(schedule.everyMs)}`;let base=schedule.tz?`cron ${schedule.expr} @ ${schedule.tz}`:`cron ${schedule.expr}`,staggerMs=resolveCronStaggerMs(schedule);return staggerMs<=0?`${base} (exact)`:`${base} (stagger ${formatDurationHuman(staggerMs)})`},formatStatus=job=>job.enabled?job.state.runningAtMs?`running`:job.state.lastStatus??`idle`:`disabled`;function printCronList(jobs,runtime=defaultRuntime){if(jobs.length===0){runtime.log(`No cron jobs.`);return}let rich=isRich(),header=[pad(`ID`,36),pad(`Name`,24),pad(`Schedule`,32),pad(`Next`,10),pad(`Last`,10),pad(`Status`,9),pad(`Target`,9),pad(`Agent`,10)].join(` `);runtime.log(rich?theme.heading(header):header);let now=Date.now();for(let job of jobs){let idLabel=pad(job.id,36),nameLabel=pad(truncate(job.name,24),24),scheduleLabel=pad(truncate(formatSchedule(job.schedule),32),32),nextLabel=pad(job.enabled?formatRelative(job.state.nextRunAtMs,now):`-`,10),lastLabel=pad(formatRelative(job.state.lastRunAtMs,now),10),statusRaw=formatStatus(job),statusLabel=pad(statusRaw,9),targetLabel=pad(job.sessionTarget??`-`,9),agentLabel=pad(truncate(job.agentId??`default`,10),10),coloredStatus=statusRaw===`ok`?colorize(rich,theme.success,statusLabel):statusRaw===`error`?colorize(rich,theme.error,statusLabel):statusRaw===`running`?colorize(rich,theme.warn,statusLabel):colorize(rich,theme.muted,statusLabel),coloredTarget=job.sessionTarget===`isolated`?colorize(rich,theme.accentBright,targetLabel):colorize(rich,theme.accent,targetLabel),coloredAgent=job.agentId?colorize(rich,theme.info,agentLabel):colorize(rich,theme.muted,agentLabel),line=[colorize(rich,theme.accent,idLabel),colorize(rich,theme.info,nameLabel),colorize(rich,theme.info,scheduleLabel),colorize(rich,theme.muted,nextLabel),colorize(rich,theme.muted,lastLabel),coloredStatus,coloredTarget,coloredAgent].join(` `);runtime.log(line.trimEnd())}}function registerCronStatusCommand(cron){addGatewayClientOptions(cron.command(`status`).description(`Show cron scheduler status`).option(`--json`,`Output JSON`,!1).action(async opts=>{try{let res=await callGatewayFromCli(`cron.status`,opts,{});defaultRuntime.log(JSON.stringify(res,null,2))}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}}))}function registerCronListCommand(cron){addGatewayClientOptions(cron.command(`list`).description(`List cron jobs`).option(`--all`,`Include disabled jobs`,!1).option(`--json`,`Output JSON`,!1).action(async opts=>{try{let res=await callGatewayFromCli(`cron.list`,opts,{includeDisabled:!!opts.all});if(opts.json){defaultRuntime.log(JSON.stringify(res,null,2));return}printCronList(res?.jobs??[],defaultRuntime)}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}}))}function registerCronAddCommand(cron){addGatewayClientOptions(cron.command(`add`).alias(`create`).description(`Add a cron job`).requiredOption(`--name <name>`,`Job name`).option(`--description <text>`,`Optional description`).option(`--disabled`,`Create job disabled`,!1).option(`--delete-after-run`,`Delete one-shot job after it succeeds`,!1).option(`--keep-after-run`,`Keep one-shot job after it succeeds`,!1).option(`--agent <id>`,`Agent id for this job`).option(`--session <target>`,`Session target (main|isolated)`).option(`--wake <mode>`,`Wake mode (now|next-heartbeat)`,`now`).option(`--at <when>`,`Run once at time (ISO) or +duration (e.g. 20m)`).option(`--every <duration>`,`Run every duration (e.g. 10m, 1h)`).option(`--cron <expr>`,`Cron expression (5-field or 6-field with seconds)`).option(`--tz <iana>`,`Timezone for cron expressions (IANA)`,``).option(`--stagger <duration>`,`Cron stagger window (e.g. 30s, 5m)`).option(`--exact`,`Disable cron staggering (set stagger to 0)`,!1).option(`--system-event <text>`,`System event payload (main session)`).option(`--message <text>`,`Agent message payload`).option(`--thinking <level>`,`Thinking level for agent jobs (off|minimal|low|medium|high)`).option(`--model <model>`,`Model override for agent jobs (provider/model or alias)`).option(`--timeout-seconds <n>`,`Timeout seconds for agent jobs`).option(`--announce`,`Announce summary to a chat (subagent-style)`,!1).option(`--deliver`,`Deprecated (use --announce). Announces a summary to a chat.`).option(`--no-deliver`,`Disable announce delivery and skip main-session summary`).option(`--channel <channel>`,`Delivery channel (${getCronChannelOptions()})`,`last`).option(`--to <dest>`,`Delivery destination (E.164, Telegram chatId, or Discord channel/user)`).option(`--best-effort-deliver`,`Do not fail the job if delivery fails`,!1).option(`--json`,`Output JSON`,!1).action(async(opts,cmd)=>{try{let staggerRaw=typeof opts.stagger==`string`?opts.stagger.trim():``,useExact=!!opts.exact;if(staggerRaw&&useExact)throw Error(`Choose either --stagger or --exact, not both`);let schedule=(()=>{let at=typeof opts.at==`string`?opts.at:``,every=typeof opts.every==`string`?opts.every:``,cronExpr=typeof opts.cron==`string`?opts.cron:``;if([!!at,!!every,!!cronExpr].filter(Boolean).length!==1)throw Error(`Choose exactly one schedule: --at, --every, or --cron`);if((useExact||staggerRaw)&&!cronExpr)throw Error(`--stagger/--exact are only valid with --cron`);if(at){let atIso=parseAt(at);if(!atIso)throw Error(`Invalid --at; use ISO time or duration like 20m`);return{kind:`at`,at:atIso}}if(every){let everyMs=parseDurationMs(every);if(!everyMs)throw Error(`Invalid --every; use e.g. 10m, 1h, 1d`);return{kind:`every`,everyMs}}let staggerMs=(()=>{if(useExact)return 0;if(!staggerRaw)return;let parsed=parseDurationMs(staggerRaw);if(!parsed)throw Error(`Invalid --stagger; use e.g. 30s, 1m, 5m`);return parsed})();return{kind:`cron`,expr:cronExpr,tz:typeof opts.tz==`string`&&opts.tz.trim()?opts.tz.trim():void 0,staggerMs}})(),wakeMode=(typeof opts.wake==`string`?opts.wake:`now`).trim()||`now`;if(wakeMode!==`now`&&wakeMode!==`next-heartbeat`)throw Error(`--wake must be now or next-heartbeat`);let agentId=typeof opts.agent==`string`&&opts.agent.trim()?sanitizeAgentId(opts.agent.trim()):void 0,hasAnnounce=!!opts.announce||opts.deliver===!0,hasNoDeliver=opts.deliver===!1;if([hasAnnounce,hasNoDeliver].filter(Boolean).length>1)throw Error(`Choose at most one of --announce or --no-deliver`);let payload=(()=>{let systemEvent=typeof opts.systemEvent==`string`?opts.systemEvent.trim():``,message=typeof opts.message==`string`?opts.message.trim():``;if([!!systemEvent,!!message].filter(Boolean).length!==1)throw Error(`Choose exactly one payload: --system-event or --message`);if(systemEvent)return{kind:`systemEvent`,text:systemEvent};let timeoutSeconds=parsePositiveIntOrUndefined(opts.timeoutSeconds);return{kind:`agentTurn`,message,model:typeof opts.model==`string`&&opts.model.trim()?opts.model.trim():void 0,thinking:typeof opts.thinking==`string`&&opts.thinking.trim()?opts.thinking.trim():void 0,timeoutSeconds:timeoutSeconds&&Number.isFinite(timeoutSeconds)?timeoutSeconds:void 0}})(),sessionSource=(typeof cmd?.getOptionValueSource==`function`?name=>cmd.getOptionValueSource(name):()=>void 0)(`session`),sessionTargetRaw=typeof opts.session==`string`?opts.session.trim():``,inferredSessionTarget=payload.kind===`agentTurn`?`isolated`:`main`,sessionTarget=sessionSource===`cli`?sessionTargetRaw||``:inferredSessionTarget;if(sessionTarget!==`main`&&sessionTarget!==`isolated`)throw Error(`--session must be main or isolated`);if(opts.deleteAfterRun&&opts.keepAfterRun)throw Error(`Choose --delete-after-run or --keep-after-run, not both`);if(sessionTarget===`main`&&payload.kind!==`systemEvent`)throw Error(`Main jobs require --system-event (systemEvent).`);if(sessionTarget===`isolated`&&payload.kind!==`agentTurn`)throw Error(`Isolated jobs require --message (agentTurn).`);if((opts.announce||typeof opts.deliver==`boolean`)&&(sessionTarget!==`isolated`||payload.kind!==`agentTurn`))throw Error(`--announce/--no-deliver require --session isolated.`);let deliveryMode=sessionTarget===`isolated`&&payload.kind===`agentTurn`?hasAnnounce?`announce`:hasNoDeliver?`none`:`announce`:void 0,name=(typeof opts.name==`string`?opts.name:``).trim();if(!name)throw Error(`--name is required`);let res=await callGatewayFromCli(`cron.add`,opts,{name,description:typeof opts.description==`string`&&opts.description.trim()?opts.description.trim():void 0,enabled:!opts.disabled,deleteAfterRun:opts.deleteAfterRun?!0:opts.keepAfterRun?!1:void 0,agentId,schedule,sessionTarget,wakeMode,payload,delivery:deliveryMode?{mode:deliveryMode,channel:typeof opts.channel==`string`&&opts.channel.trim()?opts.channel.trim():void 0,to:typeof opts.to==`string`&&opts.to.trim()?opts.to.trim():void 0,bestEffort:opts.bestEffortDeliver?!0:void 0}:void 0});defaultRuntime.log(JSON.stringify(res,null,2)),await warnIfCronSchedulerDisabled(opts)}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}}))}const assignIf=(target,key,value,shouldAssign)=>{shouldAssign&&(target[key]=value)};function registerCronEditCommand(cron){addGatewayClientOptions(cron.command(`edit`).description(`Edit a cron job (patch fields)`).argument(`<id>`,`Job id`).option(`--name <name>`,`Set name`).option(`--description <text>`,`Set description`).option(`--enable`,`Enable job`,!1).option(`--disable`,`Disable job`,!1).option(`--delete-after-run`,`Delete one-shot job after it succeeds`,!1).option(`--keep-after-run`,`Keep one-shot job after it succeeds`,!1).option(`--session <target>`,`Session target (main|isolated)`).option(`--agent <id>`,`Set agent id`).option(`--clear-agent`,`Unset agent and use default`,!1).option(`--wake <mode>`,`Wake mode (now|next-heartbeat)`).option(`--at <when>`,`Set one-shot time (ISO) or duration like 20m`).option(`--every <duration>`,`Set interval duration like 10m`).option(`--cron <expr>`,`Set cron expression`).option(`--tz <iana>`,`Timezone for cron expressions (IANA)`).option(`--stagger <duration>`,`Cron stagger window (e.g. 30s, 5m)`).option(`--exact`,`Disable cron staggering (set stagger to 0)`).option(`--system-event <text>`,`Set systemEvent payload`).option(`--message <text>`,`Set agentTurn payload message`).option(`--thinking <level>`,`Thinking level for agent jobs`).option(`--model <model>`,`Model override for agent jobs`).option(`--timeout-seconds <n>`,`Timeout seconds for agent jobs`).option(`--announce`,`Announce summary to a chat (subagent-style)`).option(`--deliver`,`Deprecated (use --announce). Announces a summary to a chat.`).option(`--no-deliver`,`Disable announce delivery`).option(`--channel <channel>`,`Delivery channel (${getCronChannelOptions()})`).option(`--to <dest>`,`Delivery destination (E.164, Telegram chatId, or Discord channel/user)`).option(`--best-effort-deliver`,`Do not fail job if delivery fails`).option(`--no-best-effort-deliver`,`Fail job when delivery fails`).action(async(id,opts)=>{try{if(opts.session===`main`&&opts.message)throw Error(`Main jobs cannot use --message; use --system-event or --session isolated.`);if(opts.session===`isolated`&&opts.systemEvent)throw Error(`Isolated jobs cannot use --system-event; use --message or --session main.`);if(opts.announce&&typeof opts.deliver==`boolean`)throw Error(`Choose --announce or --no-deliver (not multiple).`);let staggerRaw=typeof opts.stagger==`string`?opts.stagger.trim():``,useExact=!!opts.exact;if(staggerRaw&&useExact)throw Error(`Choose either --stagger or --exact, not both`);let requestedStaggerMs=(()=>{if(useExact)return 0;if(!staggerRaw)return;let parsed=parseDurationMs(staggerRaw);if(!parsed)throw Error(`Invalid --stagger; use e.g. 30s, 1m, 5m`);return parsed})(),patch={};if(typeof opts.name==`string`&&(patch.name=opts.name),typeof opts.description==`string`&&(patch.description=opts.description),opts.enable&&opts.disable)throw Error(`Choose --enable or --disable, not both`);if(opts.enable&&(patch.enabled=!0),opts.disable&&(patch.enabled=!1),opts.deleteAfterRun&&opts.keepAfterRun)throw Error(`Choose --delete-after-run or --keep-after-run, not both`);if(opts.deleteAfterRun&&(patch.deleteAfterRun=!0),opts.keepAfterRun&&(patch.deleteAfterRun=!1),typeof opts.session==`string`&&(patch.sessionTarget=opts.session),typeof opts.wake==`string`&&(patch.wakeMode=opts.wake),opts.agent&&opts.clearAgent)throw Error(`Use --agent or --clear-agent, not both`);if(typeof opts.agent==`string`&&opts.agent.trim()&&(patch.agentId=sanitizeAgentId(opts.agent.trim())),opts.clearAgent&&(patch.agentId=null),[opts.at,opts.every,opts.cron].filter(Boolean).length>1)throw Error(`Choose at most one schedule change`);if((requestedStaggerMs!==void 0||typeof opts.tz==`string`)&&(opts.at||opts.every))throw Error(`--stagger/--exact/--tz are only valid for cron schedules`);if(opts.at){let atIso=parseAt(String(opts.at));if(!atIso)throw Error(`Invalid --at`);patch.schedule={kind:`at`,at:atIso}}else if(opts.every){let everyMs=parseDurationMs(String(opts.every));if(!everyMs)throw Error(`Invalid --every`);patch.schedule={kind:`every`,everyMs}}else if(opts.cron)patch.schedule={kind:`cron`,expr:String(opts.cron),tz:typeof opts.tz==`string`&&opts.tz.trim()?opts.tz.trim():void 0,staggerMs:requestedStaggerMs};else if(requestedStaggerMs!==void 0||typeof opts.tz==`string`){let existing=((await callGatewayFromCli(`cron.list`,opts,{includeDisabled:!0}))?.jobs??[]).find(job=>job.id===id);if(!existing)throw Error(`unknown cron job id: ${id}`);if(existing.schedule.kind!==`cron`)throw Error(`Current job is not a cron schedule; use --cron to convert first`);let tz=typeof opts.tz==`string`?opts.tz.trim()||void 0:existing.schedule.tz;patch.schedule={kind:`cron`,expr:existing.schedule.expr,tz,staggerMs:requestedStaggerMs===void 0?existing.schedule.staggerMs:requestedStaggerMs}}let hasSystemEventPatch=typeof opts.systemEvent==`string`,model=typeof opts.model==`string`&&opts.model.trim()?opts.model.trim():void 0,thinking=typeof opts.thinking==`string`&&opts.thinking.trim()?opts.thinking.trim():void 0,timeoutSeconds=opts.timeoutSeconds?Number.parseInt(String(opts.timeoutSeconds),10):void 0,hasTimeoutSeconds=!!(timeoutSeconds&&Number.isFinite(timeoutSeconds)),hasDeliveryModeFlag=opts.announce||typeof opts.deliver==`boolean`,hasDeliveryTarget=typeof opts.channel==`string`||typeof opts.to==`string`,hasBestEffort=typeof opts.bestEffortDeliver==`boolean`,hasAgentTurnPatch=typeof opts.message==`string`||!!model||!!thinking||hasTimeoutSeconds||hasDeliveryModeFlag||hasDeliveryTarget||hasBestEffort;if(hasSystemEventPatch&&hasAgentTurnPatch)throw Error(`Choose at most one payload change`);if(hasSystemEventPatch)patch.payload={kind:`systemEvent`,text:String(opts.systemEvent)};else if(hasAgentTurnPatch){let payload={kind:`agentTurn`};assignIf(payload,`message`,String(opts.message),typeof opts.message==`string`),assignIf(payload,`model`,model,!!model),assignIf(payload,`thinking`,thinking,!!thinking),assignIf(payload,`timeoutSeconds`,timeoutSeconds,hasTimeoutSeconds),patch.payload=payload}if(hasDeliveryModeFlag||hasDeliveryTarget||hasBestEffort){let delivery={mode:opts.announce||opts.deliver===!0?`announce`:opts.deliver===!1?`none`:`announce`};typeof opts.channel==`string`&&(delivery.channel=opts.channel.trim()||void 0),typeof opts.to==`string`&&(delivery.to=opts.to.trim()||void 0),typeof opts.bestEffortDeliver==`boolean`&&(delivery.bestEffort=opts.bestEffortDeliver),patch.delivery=delivery}let res=await callGatewayFromCli(`cron.update`,opts,{id,patch});defaultRuntime.log(JSON.stringify(res,null,2)),await warnIfCronSchedulerDisabled(opts)}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}}))}function registerCronToggleCommand(params){addGatewayClientOptions(params.cron.command(params.name).description(params.description).argument(`<id>`,`Job id`).action(async(id,opts)=>{try{let res=await callGatewayFromCli(`cron.update`,opts,{id,patch:{enabled:params.enabled}});defaultRuntime.log(JSON.stringify(res,null,2)),await warnIfCronSchedulerDisabled(opts)}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}}))}function registerCronSimpleCommands(cron){addGatewayClientOptions(cron.command(`rm`).alias(`remove`).alias(`delete`).description(`Remove a cron job`).argument(`<id>`,`Job id`).option(`--json`,`Output JSON`,!1).action(async(id,opts)=>{try{let res=await callGatewayFromCli(`cron.remove`,opts,{id});defaultRuntime.log(JSON.stringify(res,null,2))}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}})),registerCronToggleCommand({cron,name:`enable`,description:`Enable a cron job`,enabled:!0}),registerCronToggleCommand({cron,name:`disable`,description:`Disable a cron job`,enabled:!1}),addGatewayClientOptions(cron.command(`runs`).description(`Show cron run history (JSONL-backed)`).requiredOption(`--id <id>`,`Job id`).option(`--limit <n>`,`Max entries (default 50)`,`50`).action(async opts=>{try{let limitRaw=Number.parseInt(String(opts.limit??`50`),10),limit=Number.isFinite(limitRaw)&&limitRaw>0?limitRaw:50,res=await callGatewayFromCli(`cron.runs`,opts,{id:String(opts.id),limit});defaultRuntime.log(JSON.stringify(res,null,2))}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}})),addGatewayClientOptions(cron.command(`run`).description(`Run a cron job now (debug)`).argument(`<id>`,`Job id`).option(`--due`,`Run only when due (default behavior in older versions)`,!1).action(async(id,opts)=>{try{let res=await callGatewayFromCli(`cron.run`,opts,{id,mode:opts.due?`due`:`force`});defaultRuntime.log(JSON.stringify(res,null,2))}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}}))}function registerCronCli(program){let cron=program.command(`cron`).description(`Manage cron jobs (via Gateway)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/cron`,`docs.builderforce.ai/cli/cron`)}\n`);registerCronStatusCommand(cron),registerCronListCommand(cron),registerCronAddCommand(cron),registerCronSimpleCommands(cron),registerCronEditCommand(cron)}export{registerCronCli};
@@ -1,2 +1,2 @@
1
- import"./paths-5FcIFMsj.js";import{B as theme,O as danger,R as colorize,z as isRich}from"./utils-DbaBVFaK.js";import{h as sanitizeAgentId}from"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./message-channel-D_jXxXQj.js";import{n as listChannelPlugins}from"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./bindings-DR59065T.js";import"./client-xfoidwPI.js";import"./call-BbRf8gFM.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import"./progress-BfOtdN6b.js";import{n as formatDurationHuman}from"./format-duration-HN2dpHE0.js";import{i as parseAbsoluteTimeMs,n as resolveCronStaggerMs}from"./stagger-8EkqkqJv.js";import{n as parsePositiveIntOrUndefined}from"./helpers-CESJCicC.js";import{n as callGatewayFromCli,t as addGatewayClientOptions}from"./gateway-rpc-BXR_lVIx.js";const getCronChannelOptions=()=>[`last`,...listChannelPlugins().map(plugin=>plugin.id)].join(`|`);async function warnIfCronSchedulerDisabled(opts){try{let res=await callGatewayFromCli(`cron.status`,opts,{});if(res?.enabled===!0)return;let store=typeof res?.storePath==`string`?res.storePath:``;defaultRuntime.error([`warning: cron scheduler is disabled in the Gateway; jobs are saved but will not run automatically.`,"Re-enable with `cron.enabled: true` (or remove `cron.enabled: false`) and restart the Gateway.",store?`store: ${store}`:``].filter(Boolean).join(`
1
+ import"./paths-5FcIFMsj.js";import{B as theme,O as danger,R as colorize,z as isRich}from"./utils-DbaBVFaK.js";import{h as sanitizeAgentId}from"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./message-channel-D_jXxXQj.js";import{n as listChannelPlugins}from"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./bindings-DR59065T.js";import"./client-xfoidwPI.js";import"./call-T8ciwMTA.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import"./progress-BfOtdN6b.js";import{n as formatDurationHuman}from"./format-duration-HN2dpHE0.js";import{i as parseAbsoluteTimeMs,n as resolveCronStaggerMs}from"./stagger-8EkqkqJv.js";import{n as parsePositiveIntOrUndefined}from"./helpers-CESJCicC.js";import{n as callGatewayFromCli,t as addGatewayClientOptions}from"./gateway-rpc-B02y0PnE.js";const getCronChannelOptions=()=>[`last`,...listChannelPlugins().map(plugin=>plugin.id)].join(`|`);async function warnIfCronSchedulerDisabled(opts){try{let res=await callGatewayFromCli(`cron.status`,opts,{});if(res?.enabled===!0)return;let store=typeof res?.storePath==`string`?res.storePath:``;defaultRuntime.error([`warning: cron scheduler is disabled in the Gateway; jobs are saved but will not run automatically.`,"Re-enable with `cron.enabled: true` (or remove `cron.enabled: false`) and restart the Gateway.",store?`store: ${store}`:``].filter(Boolean).join(`
2
2
  `))}catch{}}function parseDurationMs(input){let raw=input.trim();if(!raw)return null;let match=raw.match(/^(\d+(?:\.\d+)?)(ms|s|m|h|d)$/i);if(!match)return null;let n=Number.parseFloat(match[1]??``);if(!Number.isFinite(n)||n<=0)return null;let unit=(match[2]??``).toLowerCase(),factor=unit===`ms`?1:unit===`s`?1e3:unit===`m`?6e4:unit===`h`?36e5:864e5;return Math.floor(n*factor)}function parseAt(input){let raw=input.trim();if(!raw)return null;let absolute=parseAbsoluteTimeMs(raw);if(absolute!==null)return new Date(absolute).toISOString();let dur=parseDurationMs(raw);return dur===null?null:new Date(Date.now()+dur).toISOString()}const pad=(value,width)=>value.padEnd(width),truncate=(value,width)=>value.length<=width?value:width<=3?value.slice(0,width):`${value.slice(0,width-3)}...`,formatIsoMinute=iso=>{let parsed=parseAbsoluteTimeMs(iso),d=new Date(parsed??NaN);if(Number.isNaN(d.getTime()))return`-`;let isoStr=d.toISOString();return`${isoStr.slice(0,10)} ${isoStr.slice(11,16)}Z`},formatSpan=ms=>ms<6e4?`<1m`:ms<36e5?`${Math.round(ms/6e4)}m`:ms<864e5?`${Math.round(ms/36e5)}h`:`${Math.round(ms/864e5)}d`,formatRelative=(ms,nowMs)=>{if(!ms)return`-`;let delta=ms-nowMs,label=formatSpan(Math.abs(delta));return delta>=0?`in ${label}`:`${label} ago`},formatSchedule=schedule=>{if(schedule.kind===`at`)return`at ${formatIsoMinute(schedule.at)}`;if(schedule.kind===`every`)return`every ${formatDurationHuman(schedule.everyMs)}`;let base=schedule.tz?`cron ${schedule.expr} @ ${schedule.tz}`:`cron ${schedule.expr}`,staggerMs=resolveCronStaggerMs(schedule);return staggerMs<=0?`${base} (exact)`:`${base} (stagger ${formatDurationHuman(staggerMs)})`},formatStatus=job=>job.enabled?job.state.runningAtMs?`running`:job.state.lastStatus??`idle`:`disabled`;function printCronList(jobs,runtime=defaultRuntime){if(jobs.length===0){runtime.log(`No cron jobs.`);return}let rich=isRich(),header=[pad(`ID`,36),pad(`Name`,24),pad(`Schedule`,32),pad(`Next`,10),pad(`Last`,10),pad(`Status`,9),pad(`Target`,9),pad(`Agent`,10)].join(` `);runtime.log(rich?theme.heading(header):header);let now=Date.now();for(let job of jobs){let idLabel=pad(job.id,36),nameLabel=pad(truncate(job.name,24),24),scheduleLabel=pad(truncate(formatSchedule(job.schedule),32),32),nextLabel=pad(job.enabled?formatRelative(job.state.nextRunAtMs,now):`-`,10),lastLabel=pad(formatRelative(job.state.lastRunAtMs,now),10),statusRaw=formatStatus(job),statusLabel=pad(statusRaw,9),targetLabel=pad(job.sessionTarget??`-`,9),agentLabel=pad(truncate(job.agentId??`default`,10),10),coloredStatus=statusRaw===`ok`?colorize(rich,theme.success,statusLabel):statusRaw===`error`?colorize(rich,theme.error,statusLabel):statusRaw===`running`?colorize(rich,theme.warn,statusLabel):colorize(rich,theme.muted,statusLabel),coloredTarget=job.sessionTarget===`isolated`?colorize(rich,theme.accentBright,targetLabel):colorize(rich,theme.accent,targetLabel),coloredAgent=job.agentId?colorize(rich,theme.info,agentLabel):colorize(rich,theme.muted,agentLabel),line=[colorize(rich,theme.accent,idLabel),colorize(rich,theme.info,nameLabel),colorize(rich,theme.info,scheduleLabel),colorize(rich,theme.muted,nextLabel),colorize(rich,theme.muted,lastLabel),coloredStatus,coloredTarget,coloredAgent].join(` `);runtime.log(line.trimEnd())}}function registerCronStatusCommand(cron){addGatewayClientOptions(cron.command(`status`).description(`Show cron scheduler status`).option(`--json`,`Output JSON`,!1).action(async opts=>{try{let res=await callGatewayFromCli(`cron.status`,opts,{});defaultRuntime.log(JSON.stringify(res,null,2))}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}}))}function registerCronListCommand(cron){addGatewayClientOptions(cron.command(`list`).description(`List cron jobs`).option(`--all`,`Include disabled jobs`,!1).option(`--json`,`Output JSON`,!1).action(async opts=>{try{let res=await callGatewayFromCli(`cron.list`,opts,{includeDisabled:!!opts.all});if(opts.json){defaultRuntime.log(JSON.stringify(res,null,2));return}printCronList(res?.jobs??[],defaultRuntime)}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}}))}function registerCronAddCommand(cron){addGatewayClientOptions(cron.command(`add`).alias(`create`).description(`Add a cron job`).requiredOption(`--name <name>`,`Job name`).option(`--description <text>`,`Optional description`).option(`--disabled`,`Create job disabled`,!1).option(`--delete-after-run`,`Delete one-shot job after it succeeds`,!1).option(`--keep-after-run`,`Keep one-shot job after it succeeds`,!1).option(`--agent <id>`,`Agent id for this job`).option(`--session <target>`,`Session target (main|isolated)`).option(`--wake <mode>`,`Wake mode (now|next-heartbeat)`,`now`).option(`--at <when>`,`Run once at time (ISO) or +duration (e.g. 20m)`).option(`--every <duration>`,`Run every duration (e.g. 10m, 1h)`).option(`--cron <expr>`,`Cron expression (5-field or 6-field with seconds)`).option(`--tz <iana>`,`Timezone for cron expressions (IANA)`,``).option(`--stagger <duration>`,`Cron stagger window (e.g. 30s, 5m)`).option(`--exact`,`Disable cron staggering (set stagger to 0)`,!1).option(`--system-event <text>`,`System event payload (main session)`).option(`--message <text>`,`Agent message payload`).option(`--thinking <level>`,`Thinking level for agent jobs (off|minimal|low|medium|high)`).option(`--model <model>`,`Model override for agent jobs (provider/model or alias)`).option(`--timeout-seconds <n>`,`Timeout seconds for agent jobs`).option(`--announce`,`Announce summary to a chat (subagent-style)`,!1).option(`--deliver`,`Deprecated (use --announce). Announces a summary to a chat.`).option(`--no-deliver`,`Disable announce delivery and skip main-session summary`).option(`--channel <channel>`,`Delivery channel (${getCronChannelOptions()})`,`last`).option(`--to <dest>`,`Delivery destination (E.164, Telegram chatId, or Discord channel/user)`).option(`--best-effort-deliver`,`Do not fail the job if delivery fails`,!1).option(`--json`,`Output JSON`,!1).action(async(opts,cmd)=>{try{let staggerRaw=typeof opts.stagger==`string`?opts.stagger.trim():``,useExact=!!opts.exact;if(staggerRaw&&useExact)throw Error(`Choose either --stagger or --exact, not both`);let schedule=(()=>{let at=typeof opts.at==`string`?opts.at:``,every=typeof opts.every==`string`?opts.every:``,cronExpr=typeof opts.cron==`string`?opts.cron:``;if([!!at,!!every,!!cronExpr].filter(Boolean).length!==1)throw Error(`Choose exactly one schedule: --at, --every, or --cron`);if((useExact||staggerRaw)&&!cronExpr)throw Error(`--stagger/--exact are only valid with --cron`);if(at){let atIso=parseAt(at);if(!atIso)throw Error(`Invalid --at; use ISO time or duration like 20m`);return{kind:`at`,at:atIso}}if(every){let everyMs=parseDurationMs(every);if(!everyMs)throw Error(`Invalid --every; use e.g. 10m, 1h, 1d`);return{kind:`every`,everyMs}}let staggerMs=(()=>{if(useExact)return 0;if(!staggerRaw)return;let parsed=parseDurationMs(staggerRaw);if(!parsed)throw Error(`Invalid --stagger; use e.g. 30s, 1m, 5m`);return parsed})();return{kind:`cron`,expr:cronExpr,tz:typeof opts.tz==`string`&&opts.tz.trim()?opts.tz.trim():void 0,staggerMs}})(),wakeMode=(typeof opts.wake==`string`?opts.wake:`now`).trim()||`now`;if(wakeMode!==`now`&&wakeMode!==`next-heartbeat`)throw Error(`--wake must be now or next-heartbeat`);let agentId=typeof opts.agent==`string`&&opts.agent.trim()?sanitizeAgentId(opts.agent.trim()):void 0,hasAnnounce=!!opts.announce||opts.deliver===!0,hasNoDeliver=opts.deliver===!1;if([hasAnnounce,hasNoDeliver].filter(Boolean).length>1)throw Error(`Choose at most one of --announce or --no-deliver`);let payload=(()=>{let systemEvent=typeof opts.systemEvent==`string`?opts.systemEvent.trim():``,message=typeof opts.message==`string`?opts.message.trim():``;if([!!systemEvent,!!message].filter(Boolean).length!==1)throw Error(`Choose exactly one payload: --system-event or --message`);if(systemEvent)return{kind:`systemEvent`,text:systemEvent};let timeoutSeconds=parsePositiveIntOrUndefined(opts.timeoutSeconds);return{kind:`agentTurn`,message,model:typeof opts.model==`string`&&opts.model.trim()?opts.model.trim():void 0,thinking:typeof opts.thinking==`string`&&opts.thinking.trim()?opts.thinking.trim():void 0,timeoutSeconds:timeoutSeconds&&Number.isFinite(timeoutSeconds)?timeoutSeconds:void 0}})(),sessionSource=(typeof cmd?.getOptionValueSource==`function`?name=>cmd.getOptionValueSource(name):()=>void 0)(`session`),sessionTargetRaw=typeof opts.session==`string`?opts.session.trim():``,inferredSessionTarget=payload.kind===`agentTurn`?`isolated`:`main`,sessionTarget=sessionSource===`cli`?sessionTargetRaw||``:inferredSessionTarget;if(sessionTarget!==`main`&&sessionTarget!==`isolated`)throw Error(`--session must be main or isolated`);if(opts.deleteAfterRun&&opts.keepAfterRun)throw Error(`Choose --delete-after-run or --keep-after-run, not both`);if(sessionTarget===`main`&&payload.kind!==`systemEvent`)throw Error(`Main jobs require --system-event (systemEvent).`);if(sessionTarget===`isolated`&&payload.kind!==`agentTurn`)throw Error(`Isolated jobs require --message (agentTurn).`);if((opts.announce||typeof opts.deliver==`boolean`)&&(sessionTarget!==`isolated`||payload.kind!==`agentTurn`))throw Error(`--announce/--no-deliver require --session isolated.`);let deliveryMode=sessionTarget===`isolated`&&payload.kind===`agentTurn`?hasAnnounce?`announce`:hasNoDeliver?`none`:`announce`:void 0,name=(typeof opts.name==`string`?opts.name:``).trim();if(!name)throw Error(`--name is required`);let res=await callGatewayFromCli(`cron.add`,opts,{name,description:typeof opts.description==`string`&&opts.description.trim()?opts.description.trim():void 0,enabled:!opts.disabled,deleteAfterRun:opts.deleteAfterRun?!0:opts.keepAfterRun?!1:void 0,agentId,schedule,sessionTarget,wakeMode,payload,delivery:deliveryMode?{mode:deliveryMode,channel:typeof opts.channel==`string`&&opts.channel.trim()?opts.channel.trim():void 0,to:typeof opts.to==`string`&&opts.to.trim()?opts.to.trim():void 0,bestEffort:opts.bestEffortDeliver?!0:void 0}:void 0});defaultRuntime.log(JSON.stringify(res,null,2)),await warnIfCronSchedulerDisabled(opts)}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}}))}const assignIf=(target,key,value,shouldAssign)=>{shouldAssign&&(target[key]=value)};function registerCronEditCommand(cron){addGatewayClientOptions(cron.command(`edit`).description(`Edit a cron job (patch fields)`).argument(`<id>`,`Job id`).option(`--name <name>`,`Set name`).option(`--description <text>`,`Set description`).option(`--enable`,`Enable job`,!1).option(`--disable`,`Disable job`,!1).option(`--delete-after-run`,`Delete one-shot job after it succeeds`,!1).option(`--keep-after-run`,`Keep one-shot job after it succeeds`,!1).option(`--session <target>`,`Session target (main|isolated)`).option(`--agent <id>`,`Set agent id`).option(`--clear-agent`,`Unset agent and use default`,!1).option(`--wake <mode>`,`Wake mode (now|next-heartbeat)`).option(`--at <when>`,`Set one-shot time (ISO) or duration like 20m`).option(`--every <duration>`,`Set interval duration like 10m`).option(`--cron <expr>`,`Set cron expression`).option(`--tz <iana>`,`Timezone for cron expressions (IANA)`).option(`--stagger <duration>`,`Cron stagger window (e.g. 30s, 5m)`).option(`--exact`,`Disable cron staggering (set stagger to 0)`).option(`--system-event <text>`,`Set systemEvent payload`).option(`--message <text>`,`Set agentTurn payload message`).option(`--thinking <level>`,`Thinking level for agent jobs`).option(`--model <model>`,`Model override for agent jobs`).option(`--timeout-seconds <n>`,`Timeout seconds for agent jobs`).option(`--announce`,`Announce summary to a chat (subagent-style)`).option(`--deliver`,`Deprecated (use --announce). Announces a summary to a chat.`).option(`--no-deliver`,`Disable announce delivery`).option(`--channel <channel>`,`Delivery channel (${getCronChannelOptions()})`).option(`--to <dest>`,`Delivery destination (E.164, Telegram chatId, or Discord channel/user)`).option(`--best-effort-deliver`,`Do not fail job if delivery fails`).option(`--no-best-effort-deliver`,`Fail job when delivery fails`).action(async(id,opts)=>{try{if(opts.session===`main`&&opts.message)throw Error(`Main jobs cannot use --message; use --system-event or --session isolated.`);if(opts.session===`isolated`&&opts.systemEvent)throw Error(`Isolated jobs cannot use --system-event; use --message or --session main.`);if(opts.announce&&typeof opts.deliver==`boolean`)throw Error(`Choose --announce or --no-deliver (not multiple).`);let staggerRaw=typeof opts.stagger==`string`?opts.stagger.trim():``,useExact=!!opts.exact;if(staggerRaw&&useExact)throw Error(`Choose either --stagger or --exact, not both`);let requestedStaggerMs=(()=>{if(useExact)return 0;if(!staggerRaw)return;let parsed=parseDurationMs(staggerRaw);if(!parsed)throw Error(`Invalid --stagger; use e.g. 30s, 1m, 5m`);return parsed})(),patch={};if(typeof opts.name==`string`&&(patch.name=opts.name),typeof opts.description==`string`&&(patch.description=opts.description),opts.enable&&opts.disable)throw Error(`Choose --enable or --disable, not both`);if(opts.enable&&(patch.enabled=!0),opts.disable&&(patch.enabled=!1),opts.deleteAfterRun&&opts.keepAfterRun)throw Error(`Choose --delete-after-run or --keep-after-run, not both`);if(opts.deleteAfterRun&&(patch.deleteAfterRun=!0),opts.keepAfterRun&&(patch.deleteAfterRun=!1),typeof opts.session==`string`&&(patch.sessionTarget=opts.session),typeof opts.wake==`string`&&(patch.wakeMode=opts.wake),opts.agent&&opts.clearAgent)throw Error(`Use --agent or --clear-agent, not both`);if(typeof opts.agent==`string`&&opts.agent.trim()&&(patch.agentId=sanitizeAgentId(opts.agent.trim())),opts.clearAgent&&(patch.agentId=null),[opts.at,opts.every,opts.cron].filter(Boolean).length>1)throw Error(`Choose at most one schedule change`);if((requestedStaggerMs!==void 0||typeof opts.tz==`string`)&&(opts.at||opts.every))throw Error(`--stagger/--exact/--tz are only valid for cron schedules`);if(opts.at){let atIso=parseAt(String(opts.at));if(!atIso)throw Error(`Invalid --at`);patch.schedule={kind:`at`,at:atIso}}else if(opts.every){let everyMs=parseDurationMs(String(opts.every));if(!everyMs)throw Error(`Invalid --every`);patch.schedule={kind:`every`,everyMs}}else if(opts.cron)patch.schedule={kind:`cron`,expr:String(opts.cron),tz:typeof opts.tz==`string`&&opts.tz.trim()?opts.tz.trim():void 0,staggerMs:requestedStaggerMs};else if(requestedStaggerMs!==void 0||typeof opts.tz==`string`){let existing=((await callGatewayFromCli(`cron.list`,opts,{includeDisabled:!0}))?.jobs??[]).find(job=>job.id===id);if(!existing)throw Error(`unknown cron job id: ${id}`);if(existing.schedule.kind!==`cron`)throw Error(`Current job is not a cron schedule; use --cron to convert first`);let tz=typeof opts.tz==`string`?opts.tz.trim()||void 0:existing.schedule.tz;patch.schedule={kind:`cron`,expr:existing.schedule.expr,tz,staggerMs:requestedStaggerMs===void 0?existing.schedule.staggerMs:requestedStaggerMs}}let hasSystemEventPatch=typeof opts.systemEvent==`string`,model=typeof opts.model==`string`&&opts.model.trim()?opts.model.trim():void 0,thinking=typeof opts.thinking==`string`&&opts.thinking.trim()?opts.thinking.trim():void 0,timeoutSeconds=opts.timeoutSeconds?Number.parseInt(String(opts.timeoutSeconds),10):void 0,hasTimeoutSeconds=!!(timeoutSeconds&&Number.isFinite(timeoutSeconds)),hasDeliveryModeFlag=opts.announce||typeof opts.deliver==`boolean`,hasDeliveryTarget=typeof opts.channel==`string`||typeof opts.to==`string`,hasBestEffort=typeof opts.bestEffortDeliver==`boolean`,hasAgentTurnPatch=typeof opts.message==`string`||!!model||!!thinking||hasTimeoutSeconds||hasDeliveryModeFlag||hasDeliveryTarget||hasBestEffort;if(hasSystemEventPatch&&hasAgentTurnPatch)throw Error(`Choose at most one payload change`);if(hasSystemEventPatch)patch.payload={kind:`systemEvent`,text:String(opts.systemEvent)};else if(hasAgentTurnPatch){let payload={kind:`agentTurn`};assignIf(payload,`message`,String(opts.message),typeof opts.message==`string`),assignIf(payload,`model`,model,!!model),assignIf(payload,`thinking`,thinking,!!thinking),assignIf(payload,`timeoutSeconds`,timeoutSeconds,hasTimeoutSeconds),patch.payload=payload}if(hasDeliveryModeFlag||hasDeliveryTarget||hasBestEffort){let delivery={mode:opts.announce||opts.deliver===!0?`announce`:opts.deliver===!1?`none`:`announce`};typeof opts.channel==`string`&&(delivery.channel=opts.channel.trim()||void 0),typeof opts.to==`string`&&(delivery.to=opts.to.trim()||void 0),typeof opts.bestEffortDeliver==`boolean`&&(delivery.bestEffort=opts.bestEffortDeliver),patch.delivery=delivery}let res=await callGatewayFromCli(`cron.update`,opts,{id,patch});defaultRuntime.log(JSON.stringify(res,null,2)),await warnIfCronSchedulerDisabled(opts)}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}}))}function registerCronToggleCommand(params){addGatewayClientOptions(params.cron.command(params.name).description(params.description).argument(`<id>`,`Job id`).action(async(id,opts)=>{try{let res=await callGatewayFromCli(`cron.update`,opts,{id,patch:{enabled:params.enabled}});defaultRuntime.log(JSON.stringify(res,null,2)),await warnIfCronSchedulerDisabled(opts)}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}}))}function registerCronSimpleCommands(cron){addGatewayClientOptions(cron.command(`rm`).alias(`remove`).alias(`delete`).description(`Remove a cron job`).argument(`<id>`,`Job id`).option(`--json`,`Output JSON`,!1).action(async(id,opts)=>{try{let res=await callGatewayFromCli(`cron.remove`,opts,{id});defaultRuntime.log(JSON.stringify(res,null,2))}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}})),registerCronToggleCommand({cron,name:`enable`,description:`Enable a cron job`,enabled:!0}),registerCronToggleCommand({cron,name:`disable`,description:`Disable a cron job`,enabled:!1}),addGatewayClientOptions(cron.command(`runs`).description(`Show cron run history (JSONL-backed)`).requiredOption(`--id <id>`,`Job id`).option(`--limit <n>`,`Max entries (default 50)`,`50`).action(async opts=>{try{let limitRaw=Number.parseInt(String(opts.limit??`50`),10),limit=Number.isFinite(limitRaw)&&limitRaw>0?limitRaw:50,res=await callGatewayFromCli(`cron.runs`,opts,{id:String(opts.id),limit});defaultRuntime.log(JSON.stringify(res,null,2))}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}})),addGatewayClientOptions(cron.command(`run`).description(`Run a cron job now (debug)`).argument(`<id>`,`Job id`).option(`--due`,`Run only when due (default behavior in older versions)`,!1).action(async(id,opts)=>{try{let res=await callGatewayFromCli(`cron.run`,opts,{id,mode:opts.due?`due`:`force`});defaultRuntime.log(JSON.stringify(res,null,2))}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}}))}function registerCronCli(program){let cron=program.command(`cron`).description(`Manage cron jobs (via Gateway)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/cron`,`docs.builderforce.ai/cli/cron`)}\n`);registerCronStatusCommand(cron),registerCronListCommand(cron),registerCronAddCommand(cron),registerCronSimpleCommands(cron),registerCronEditCommand(cron)}export{registerCronCli};
@@ -1 +1 @@
1
- import{d as resolveIsNixMode,g as resolveStateDir,o as resolveConfigPath,u as resolveGatewayPort}from"./paths-BHg-VHB4.js";import{L as colorize,R as isRich,S as shortenHomePath,W as getResolvedLoggerSettings,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{a as readConfigFileSnapshot,c as writeConfigFile,n as createConfigIO,r as loadConfig}from"./io-CohJffHG.js";import{n as pickPrimaryTailnetIPv4}from"./tailnet-B0Q5E6lZ.js";import{n as callGateway}from"./call-DmAU4cRX.js";import{h as GATEWAY_CLIENT_NAMES,m as GATEWAY_CLIENT_MODES}from"./message-channel-z5YRpR2d.js";import{l as resolveGatewayBindHost}from"./net-DtnXq2dW.js";import{i as resolveGatewayAuth}from"./auth-ChecwOXS.js";import{a as formatPortDiagnostics,i as classifyPortListener,n as inspectPortUsage}from"./ports-DTku9NSx.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName,n as GATEWAY_SERVICE_KIND,r as GATEWAY_SERVICE_MARKER}from"./constants-D2th5NXV.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import{n as withProgress}from"./progress-Cqb-jAjT.js";import{g as resolveControlUiLinks,m as randomToken}from"./onboard-helpers-CckrS8_K.js";import{n as isWSLEnv}from"./wsl-BO1sLIB6.js";import{n as inheritOptionFromParent}from"./command-options-DbMbMxM2.js";import{i as buildGatewayInstallPlan,r as isGatewayDaemonRuntime,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-B4UjqdyJ.js";import{n as execSchtasks,s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-EKJG69M3.js";import{S as installDaemonServiceAndEmit,_ as resolveRuntimeStatusColor,a as isSystemdUnavailableDetail,b as buildDaemonServiceSnapshot,c as auditGatewayServiceConfig,d as filterDaemonEnv,f as normalizeListenerAddress,g as renderRuntimeHints,h as renderGatewayServiceStartHints,i as runServiceUninstall,m as pickProbeHostForBind,n as runServiceStart,o as renderSystemdUnavailableHints,p as parsePortFromArgs,r as runServiceStop,t as runServiceRestart,u as createCliStatusTextStyles,v as safeDaemonEnv,x as createDaemonActionContext,y as formatRuntimeStatus}from"./lifecycle-core-BpMvDXy1.js";import{t as readLastGatewayErrorLine}from"./diagnostics-DamNPi4e.js";import{t as parsePort}from"./parse-port-FgIKmqqb.js";import path from"node:path";import fs from"node:fs/promises";async function runDaemonInstall(opts){let json=!!opts.json,{stdout,warnings,emit,fail}=createDaemonActionContext({action:`install`,json});if(resolveIsNixMode(process.env)){fail(`Nix mode detected; service install is disabled.`);return}let cfg=loadConfig(),portOverride=parsePort(opts.port);if(opts.port!==void 0&&portOverride===null){fail(`Invalid port`);return}let port=portOverride??resolveGatewayPort(cfg);if(!Number.isFinite(port)||port<=0){fail(`Invalid port`);return}let runtimeRaw=opts.runtime?String(opts.runtime):DEFAULT_GATEWAY_DAEMON_RUNTIME;if(!isGatewayDaemonRuntime(runtimeRaw)){fail(`Invalid --runtime (use "node" or "bun")`);return}let service=resolveGatewayService(),loaded=!1;try{loaded=await service.isLoaded({env:process.env})}catch(err){fail(`Gateway service check failed: ${String(err)}`);return}if(loaded&&!opts.force){emit({ok:!0,result:`already-installed`,message:`Gateway service already ${service.loadedText}.`,service:buildDaemonServiceSnapshot(service,loaded)}),json||(defaultRuntime.log(`Gateway service already ${service.loadedText}.`),defaultRuntime.log(`Reinstall with: ${formatCliCommand(`builderforce gateway install --force`)}`));return}let resolvedAuth=resolveGatewayAuth({authConfig:cfg.gateway?.auth,tailscaleMode:cfg.gateway?.tailscale?.mode??`off`}),needsToken=resolvedAuth.mode===`token`&&!resolvedAuth.token&&!resolvedAuth.allowTailscale,token=opts.token||cfg.gateway?.auth?.token||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN;if(!token&&needsToken){token=randomToken();let warnMsg=`No gateway token found. Auto-generated one and saving to config.`;json?warnings.push(warnMsg):defaultRuntime.log(warnMsg);try{let snapshot=await readConfigFileSnapshot();if(snapshot.exists&&!snapshot.valid){let msg=`Warning: config file exists but is invalid; skipping token persistence.`;json?warnings.push(msg):defaultRuntime.log(msg)}else{let baseConfig=snapshot.exists?snapshot.config:{};baseConfig.gateway?.auth?.token?token=baseConfig.gateway.auth.token:await writeConfigFile({...baseConfig,gateway:{...baseConfig.gateway,auth:{...baseConfig.gateway?.auth,mode:baseConfig.gateway?.auth?.mode??`token`,token}}})}}catch(err){let msg=`Warning: could not persist token to config: ${String(err)}`;json?warnings.push(msg):defaultRuntime.log(msg)}}if(opts.noCron)try{let snapshot=await readConfigFileSnapshot();if(snapshot.exists&&!snapshot.valid){let msg=`Warning: config file exists but is invalid; skipping cron.enabled persistence.`;json?warnings.push(msg):defaultRuntime.log(msg)}else{let baseConfig=snapshot.exists?snapshot.config:{},currentCron=baseConfig.cron;currentCron?.enabled!==!1&&(await writeConfigFile({...baseConfig,cron:{...currentCron,enabled:!1}}),json||defaultRuntime.log(`Set cron.enabled: false in config (scheduled jobs disabled).`))}}catch(err){let msg=`Warning: could not persist cron.enabled: ${String(err)}`;json?warnings.push(msg):defaultRuntime.log(msg)}let{programArguments,workingDirectory,environment}=await buildGatewayInstallPlan({env:process.env,port,token,runtime:runtimeRaw,warn:message=>{json?warnings.push(message):defaultRuntime.log(message)},config:cfg});await installDaemonServiceAndEmit({serviceNoun:`Gateway`,service,warnings,emit,fail,install:async()=>{await service.install({env:process.env,stdout,programArguments,workingDirectory,environment})}})}async function probeGatewayStatus(opts){try{return await withProgress({label:`Checking gateway status...`,indeterminate:!0,enabled:opts.json!==!0},async()=>await callGateway({url:opts.url,token:opts.token,password:opts.password,method:`status`,timeoutMs:opts.timeoutMs,clientName:GATEWAY_CLIENT_NAMES.CLI,mode:GATEWAY_CLIENT_MODES.CLI,...opts.configPath?{configPath:opts.configPath}:{}})),{ok:!0}}catch(err){return{ok:!1,error:err instanceof Error?err.message:String(err)}}}async function probeGatewayHealth(){try{let cfg=loadConfig(),bindMode=cfg.gateway?.bind??`loopback`,customBindHost=typeof cfg.gateway?.customBindHost==`string`?cfg.gateway.customBindHost:void 0,probeHost=pickProbeHostForBind(bindMode,pickPrimaryTailnetIPv4(),customBindHost),port=resolveGatewayPort(cfg,process.env),resolvedBindHost=await resolveGatewayBindHost(bindMode,customBindHost);return(await probeGatewayStatus({url:`ws://${probeHost||resolvedBindHost}:${port}`,token:cfg.gateway?.auth?.token||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN,password:cfg.gateway?.auth?.password||process.env.BUILDERFORCE_AGENTS_GATEWAY_PASSWORD,timeoutMs:2e3,json:!0,configPath:process.env.BUILDERFORCE_AGENTS_CONFIG_PATH})).ok}catch{return!1}}function sleep(ms){return new Promise(resolve=>setTimeout(resolve,ms))}async function clearStaleGatewayProcessIfNeeded(){if((await resolveGatewayService().readRuntime(process.env).catch(()=>null))?.status===`running`)return;let port=resolveGatewayPort(loadConfig(),process.env),diagnostics=await inspectPortUsage(port).catch(()=>null);if(!diagnostics||diagnostics.status!==`busy`)return;let staleListeners=diagnostics.listeners.filter(listener=>typeof listener.pid==`number`&&classifyPortListener(listener,port)===`gateway`);if(staleListeners.length===0)return;for(let listener of staleListeners)process.kill(listener.pid);let deadline=Date.now()+5e3;for(;Date.now()<deadline;){let next=await inspectPortUsage(port).catch(()=>null);if(!(next?.status===`busy`&&next.listeners.some(listener=>typeof listener.pid==`number`&&staleListeners.some(stale=>stale.pid===listener.pid)&&classifyPortListener(listener,port)===`gateway`)))return;await sleep(100)}throw Error(`Gateway restart cleanup failed: stale listener(s) on port ${port} did not exit: ${staleListeners.map(listener=>listener.pid).join(`, `)}`)}async function runDaemonUninstall(opts={}){return await runServiceUninstall({serviceNoun:`Gateway`,service:resolveGatewayService(),opts,stopBeforeUninstall:!0,assertNotLoadedAfterUninstall:!0})}async function runDaemonStart(opts={}){return await clearStaleGatewayProcessIfNeeded(),await runServiceStart({serviceNoun:`Gateway`,service:resolveGatewayService(),renderStartHints:renderGatewayServiceStartHints,opts,waitUntilHealthy:probeGatewayHealth})}async function runDaemonStop(opts={}){return await runServiceStop({serviceNoun:`Gateway`,service:resolveGatewayService(),opts})}async function runDaemonRestart(opts={}){return await clearStaleGatewayProcessIfNeeded(),await runServiceRestart({serviceNoun:`Gateway`,service:resolveGatewayService(),renderStartHints:renderGatewayServiceStartHints,opts,checkTokenDrift:!0,waitUntilHealthy:probeGatewayHealth})}const EXTRA_MARKERS=[`builderforce`,`builderforce`,`builderforce`];function renderGatewayServiceCleanupHints(env=process.env){let profile=env.BUILDERFORCE_AGENTS_PROFILE;switch(process.platform){case`darwin`:{let label=resolveGatewayLaunchAgentLabel(profile);return[`launchctl bootout gui/$UID/${label}`,`rm ~/Library/LaunchAgents/${label}.plist`]}case`linux`:{let unit=resolveGatewaySystemdServiceName(profile);return[`systemctl --user disable --now ${unit}.service`,`rm ~/.config/systemd/user/${unit}.service`]}case`win32`:return[`schtasks /Delete /TN "${resolveGatewayWindowsTaskName(profile)}" /F`];default:return[]}}function resolveHomeDir(env){let home=env.HOME?.trim()||env.USERPROFILE?.trim();if(!home)throw Error(`Missing HOME`);return home}function detectMarker(content){let lower=content.toLowerCase();for(let marker of EXTRA_MARKERS)if(lower.includes(marker))return marker;return null}function hasGatewayServiceMarker(content){let lower=content.toLowerCase(),markerKeys=[`builderforce_service_marker`],kindKeys=[`builderforce_service_kind`],markerValues=[GATEWAY_SERVICE_MARKER.toLowerCase()],hasMarkerKey=markerKeys.some(key=>lower.includes(key)),hasKindKey=kindKeys.some(key=>lower.includes(key)),hasMarkerValue=markerValues.some(value=>lower.includes(value));return hasMarkerKey&&hasKindKey&&hasMarkerValue&&lower.includes(GATEWAY_SERVICE_KIND.toLowerCase())}function isBuilderForceAgentsGatewayLaunchdService(label,contents){return hasGatewayServiceMarker(contents)?!0:contents.toLowerCase().includes(`gateway`)?label.startsWith(`ai.builderforce.`):!1}function isBuilderForceAgentsGatewaySystemdService(name,contents){return hasGatewayServiceMarker(contents)?!0:name.startsWith(`builderforce-gateway`)?contents.toLowerCase().includes(`gateway`):!1}function isBuilderForceAgentsGatewayTaskName(name){let normalized=name.trim().toLowerCase();return normalized?normalized===resolveGatewayWindowsTaskName().toLowerCase()||normalized.startsWith(`builderforce gateway`):!1}function tryExtractPlistLabel(contents){let match=contents.match(/<key>Label<\/key>\s*<string>([\s\S]*?)<\/string>/i);return match&&match[1]?.trim()||null}function isIgnoredLaunchdLabel(label){return label===resolveGatewayLaunchAgentLabel()}function isIgnoredSystemdName(name){return name===resolveGatewaySystemdServiceName()}function isLegacyLabel(label){let lower=label.toLowerCase();return lower.includes(`builderforce`)||lower.includes(`builderforce`)}async function readDirEntries(dir){try{return await fs.readdir(dir)}catch{return[]}}async function readUtf8File(filePath){try{return await fs.readFile(filePath,`utf8`)}catch{return null}}async function scanLaunchdDir(params){let results=[],entries=await readDirEntries(params.dir);for(let entry of entries){if(!entry.endsWith(`.plist`))continue;let labelFromName=entry.replace(/\.plist$/,``);if(isIgnoredLaunchdLabel(labelFromName))continue;let fullPath=path.join(params.dir,entry),contents=await readUtf8File(fullPath);if(contents===null)continue;let marker=detectMarker(contents),label=tryExtractPlistLabel(contents)??labelFromName;if(!marker){if(!(isLegacyLabel(labelFromName)||isLegacyLabel(label)))continue;results.push({platform:`darwin`,label,detail:`plist: ${fullPath}`,scope:params.scope,marker:(isLegacyLabel(label),`builderforce`),legacy:!0});continue}isIgnoredLaunchdLabel(label)||marker===`builderforce`&&isBuilderForceAgentsGatewayLaunchdService(label,contents)||results.push({platform:`darwin`,label,detail:`plist: ${fullPath}`,scope:params.scope,marker,legacy:marker!==`builderforce`||isLegacyLabel(label)})}return results}async function scanSystemdDir(params){let results=[],entries=await readDirEntries(params.dir);for(let entry of entries){if(!entry.endsWith(`.service`))continue;let name=entry.replace(/\.service$/,``);if(isIgnoredSystemdName(name))continue;let fullPath=path.join(params.dir,entry),contents=await readUtf8File(fullPath);if(contents===null)continue;let marker=detectMarker(contents);marker&&(marker===`builderforce`&&isBuilderForceAgentsGatewaySystemdService(name,contents)||results.push({platform:`linux`,label:entry,detail:`unit: ${fullPath}`,scope:params.scope,marker,legacy:marker!==`builderforce`}))}return results}function parseSchtasksList(output){let tasks=[],current=null;for(let rawLine of output.split(/\r?\n/)){let line=rawLine.trim();if(!line){current&&=(tasks.push(current),null);continue}let idx=line.indexOf(`:`);if(idx<=0)continue;let key=line.slice(0,idx).trim().toLowerCase(),value=line.slice(idx+1).trim();if(value){if(key===`taskname`){current&&tasks.push(current),current={name:value};continue}current&&key===`task to run`&&(current.taskToRun=value)}}return current&&tasks.push(current),tasks}async function findExtraGatewayServices(env,opts={}){let results=[],seen=new Set,push=svc=>{let key=`${svc.platform}:${svc.label}:${svc.detail}:${svc.scope}`;seen.has(key)||(seen.add(key),results.push(svc))};if(process.platform===`darwin`){try{let home=resolveHomeDir(env),userDir=path.join(home,`Library`,`LaunchAgents`);for(let svc of await scanLaunchdDir({dir:userDir,scope:`user`}))push(svc);if(opts.deep){for(let svc of await scanLaunchdDir({dir:path.join(path.sep,`Library`,`LaunchAgents`),scope:`system`}))push(svc);for(let svc of await scanLaunchdDir({dir:path.join(path.sep,`Library`,`LaunchDaemons`),scope:`system`}))push(svc)}}catch{return results}return results}if(process.platform===`linux`){try{let home=resolveHomeDir(env),userDir=path.join(home,`.config`,`systemd`,`user`);for(let svc of await scanSystemdDir({dir:userDir,scope:`user`}))push(svc);if(opts.deep)for(let dir of[`/etc/systemd/system`,`/usr/lib/systemd/system`,`/lib/systemd/system`])for(let svc of await scanSystemdDir({dir,scope:`system`}))push(svc)}catch{return results}return results}if(process.platform===`win32`){if(!opts.deep)return results;let res=await execSchtasks([`/Query`,`/FO`,`LIST`,`/V`]);if(res.code!==0)return results;let tasks=parseSchtasksList(res.stdout);for(let task of tasks){let name=task.name.trim();if(!name||isBuilderForceAgentsGatewayTaskName(name))continue;let lowerName=name.toLowerCase(),lowerCommand=task.taskToRun?.toLowerCase()??``,marker=null;for(let candidate of EXTRA_MARKERS)if(lowerName.includes(candidate)||lowerCommand.includes(candidate)){marker=candidate;break}marker&&push({platform:`win32`,label:name,detail:task.taskToRun?`task: ${name}, run: ${task.taskToRun}`:name,scope:`system`,marker,legacy:marker!==`builderforce`})}return results}return results}function shouldReportPortUsage(status,rpcOk){return!(status!==`busy`||rpcOk===!0)}async function gatherDaemonStatus(opts){let service=resolveGatewayService(),[loaded,command,runtime]=await Promise.all([service.isLoaded({env:process.env}).catch(()=>!1),service.readCommand(process.env).catch(()=>null),service.readRuntime(process.env).catch(err=>({status:`unknown`,detail:String(err)}))]),configAudit=await auditGatewayServiceConfig({env:process.env,command}),serviceEnv=command?.environment??void 0,mergedDaemonEnv={...process.env,...serviceEnv??void 0},cliConfigPath=resolveConfigPath(process.env,resolveStateDir(process.env)),daemonConfigPath=resolveConfigPath(mergedDaemonEnv,resolveStateDir(mergedDaemonEnv)),cliIO=createConfigIO({env:process.env,configPath:cliConfigPath}),daemonIO=createConfigIO({env:mergedDaemonEnv,configPath:daemonConfigPath}),[cliSnapshot,daemonSnapshot]=await Promise.all([cliIO.readConfigFileSnapshot().catch(()=>null),daemonIO.readConfigFileSnapshot().catch(()=>null)]),cliCfg=cliIO.loadConfig(),daemonCfg=daemonIO.loadConfig(),cliConfigSummary={path:cliSnapshot?.path??cliConfigPath,exists:cliSnapshot?.exists??!1,valid:cliSnapshot?.valid??!0,...cliSnapshot?.issues?.length?{issues:cliSnapshot.issues}:{},controlUi:cliCfg.gateway?.controlUi},daemonConfigSummary={path:daemonSnapshot?.path??daemonConfigPath,exists:daemonSnapshot?.exists??!1,valid:daemonSnapshot?.valid??!0,...daemonSnapshot?.issues?.length?{issues:daemonSnapshot.issues}:{},controlUi:daemonCfg.gateway?.controlUi},configMismatch=cliConfigSummary.path!==daemonConfigSummary.path,portFromArgs=parsePortFromArgs(command?.programArguments),daemonPort=portFromArgs??resolveGatewayPort(daemonCfg,mergedDaemonEnv),portSource=portFromArgs?`service args`:`env/config`,bindMode=daemonCfg.gateway?.bind??`loopback`,customBindHost=daemonCfg.gateway?.customBindHost,bindHost=await resolveGatewayBindHost(bindMode,customBindHost),probeHost=pickProbeHostForBind(bindMode,pickPrimaryTailnetIPv4(),customBindHost),probeUrlOverride=typeof opts.rpc.url==`string`&&opts.rpc.url.trim().length>0?opts.rpc.url.trim():null,probeUrl=probeUrlOverride??`ws://${probeHost}:${daemonPort}`,probeNote=!probeUrlOverride&&bindMode===`lan`?`bind=lan listens on 0.0.0.0 (all interfaces); probing via ${probeHost}.`:!probeUrlOverride&&bindMode===`loopback`?`Loopback-only gateway; only local clients can connect.`:void 0,cliPort=resolveGatewayPort(cliCfg,process.env),[portDiagnostics,portCliDiagnostics]=await Promise.all([inspectPortUsage(daemonPort).catch(()=>null),cliPort===daemonPort?null:inspectPortUsage(cliPort).catch(()=>null)]),portStatus=portDiagnostics?{port:portDiagnostics.port,status:portDiagnostics.status,listeners:portDiagnostics.listeners,hints:portDiagnostics.hints}:void 0,portCliStatus=portCliDiagnostics?{port:portCliDiagnostics.port,status:portCliDiagnostics.status,listeners:portCliDiagnostics.listeners,hints:portCliDiagnostics.hints}:void 0,extraServices=await findExtraGatewayServices(process.env,{deep:!!opts.deep}).catch(()=>[]),timeoutMsRaw=Number.parseInt(String(opts.rpc.timeout??`10000`),10),timeoutMs=Number.isFinite(timeoutMsRaw)&&timeoutMsRaw>0?timeoutMsRaw:1e4,rpc=opts.probe?await probeGatewayStatus({url:probeUrl,token:opts.rpc.token||mergedDaemonEnv.BUILDERFORCE_AGENTS_GATEWAY_TOKEN||daemonCfg.gateway?.auth?.token,password:opts.rpc.password||mergedDaemonEnv.BUILDERFORCE_AGENTS_GATEWAY_PASSWORD||daemonCfg.gateway?.auth?.password,timeoutMs,json:opts.rpc.json,configPath:daemonConfigSummary.path}):void 0,lastError;return loaded&&runtime?.status===`running`&&portStatus&&portStatus.status!==`busy`&&(lastError=await readLastGatewayErrorLine(mergedDaemonEnv)??void 0),{service:{label:service.label,loaded,loadedText:service.loadedText,notLoadedText:service.notLoadedText,command,runtime,configAudit},config:{cli:cliConfigSummary,daemon:daemonConfigSummary,...configMismatch?{mismatch:!0}:{}},gateway:{bindMode,bindHost,customBindHost,port:daemonPort,portSource,probeUrl,...probeNote?{probeNote}:{}},port:portStatus,...portCliStatus?{portCli:portCliStatus}:{},lastError,...rpc?{rpc:{...rpc,url:probeUrl}}:{},extraServices}}function renderPortDiagnosticsForCli(status,rpcOk){return!status.port||!shouldReportPortUsage(status.port.status,rpcOk)?[]:formatPortDiagnostics({port:status.port.port,status:status.port.status,listeners:status.port.listeners,hints:status.port.hints})}function resolvePortListeningAddresses(status){return Array.from(new Set(status.port?.listeners?.map(l=>l.address?normalizeListenerAddress(l.address):``).filter(v=>!!v)??[]))}function sanitizeDaemonStatusForJson(status){let command=status.service.command;if(!command?.environment)return status;let safeEnv=filterDaemonEnv(command.environment),nextCommand={...command,environment:Object.keys(safeEnv).length>0?safeEnv:void 0};return{...status,service:{...status.service,command:nextCommand}}}function printDaemonStatus(status,opts){if(opts.json){let sanitized=sanitizeDaemonStatusForJson(status);defaultRuntime.log(JSON.stringify(sanitized,null,2));return}let{rich,label,accent,infoText,okText,warnText,errorText}=createCliStatusTextStyles(),spacer=()=>defaultRuntime.log(``),{service,rpc,extraServices}=status,serviceStatus=service.loaded?okText(service.loadedText):warnText(service.notLoadedText);defaultRuntime.log(`${label(`Service:`)} ${accent(service.label)} (${serviceStatus})`);try{let logFile=getResolvedLoggerSettings().file;defaultRuntime.log(`${label(`File logs:`)} ${infoText(shortenHomePath(logFile))}`)}catch{}service.command?.programArguments?.length&&defaultRuntime.log(`${label(`Command:`)} ${infoText(service.command.programArguments.join(` `))}`),service.command?.sourcePath&&defaultRuntime.log(`${label(`Service file:`)} ${infoText(shortenHomePath(service.command.sourcePath))}`),service.command?.workingDirectory&&defaultRuntime.log(`${label(`Working dir:`)} ${infoText(shortenHomePath(service.command.workingDirectory))}`);let daemonEnvLines=safeDaemonEnv(service.command?.environment);if(daemonEnvLines.length>0&&defaultRuntime.log(`${label(`Service env:`)} ${daemonEnvLines.join(` `)}`),spacer(),service.configAudit?.issues.length){defaultRuntime.error(warnText(`Service config looks out of date or non-standard.`));for(let issue of service.configAudit.issues){let detail=issue.detail?` (${issue.detail})`:``;defaultRuntime.error(`${warnText(`Service config issue:`)} ${issue.message}${detail}`)}defaultRuntime.error(warnText(`Recommendation: run "${formatCliCommand(`builderforce doctor`)}" (or "${formatCliCommand(`builderforce doctor --repair`)}").`))}if(status.config){let cliCfg=`${shortenHomePath(status.config.cli.path)}${status.config.cli.exists?``:` (missing)`}${status.config.cli.valid?``:` (invalid)`}`;if(defaultRuntime.log(`${label(`Config (cli):`)} ${infoText(cliCfg)}`),!status.config.cli.valid&&status.config.cli.issues?.length)for(let issue of status.config.cli.issues.slice(0,5))defaultRuntime.error(`${errorText(`Config issue:`)} ${issue.path||`<root>`}: ${issue.message}`);if(status.config.daemon){let daemonCfg=`${shortenHomePath(status.config.daemon.path)}${status.config.daemon.exists?``:` (missing)`}${status.config.daemon.valid?``:` (invalid)`}`;if(defaultRuntime.log(`${label(`Config (service):`)} ${infoText(daemonCfg)}`),!status.config.daemon.valid&&status.config.daemon.issues?.length)for(let issue of status.config.daemon.issues.slice(0,5))defaultRuntime.error(`${errorText(`Service config issue:`)} ${issue.path||`<root>`}: ${issue.message}`)}status.config.mismatch&&(defaultRuntime.error(errorText(`Root cause: CLI and service are using different config paths (likely a profile/state-dir mismatch).`)),defaultRuntime.error(errorText(`Fix: rerun \`${formatCliCommand(`builderforce gateway install --force`)}\` from the same --profile / BUILDERFORCE_AGENTS_STATE_DIR you expect.`))),spacer()}if(status.gateway){let bindHost=status.gateway.bindHost??`n/a`;if(defaultRuntime.log(`${label(`Gateway:`)} bind=${infoText(status.gateway.bindMode)} (${infoText(bindHost)}), port=${infoText(String(status.gateway.port))} (${infoText(status.gateway.portSource)})`),defaultRuntime.log(`${label(`Probe target:`)} ${infoText(status.gateway.probeUrl)}`),!(status.config?.daemon?.controlUi?.enabled??!0))defaultRuntime.log(`${label(`Dashboard:`)} ${warnText(`disabled`)}`);else{let links=resolveControlUiLinks({port:status.gateway.port,bind:status.gateway.bindMode,customBindHost:status.gateway.customBindHost,basePath:status.config?.daemon?.controlUi?.basePath});defaultRuntime.log(`${label(`Dashboard:`)} ${infoText(links.httpUrl)}`)}status.gateway.probeNote&&defaultRuntime.log(`${label(`Probe note:`)} ${infoText(status.gateway.probeNote)}`),spacer()}let runtimeLine=formatRuntimeStatus(service.runtime);if(runtimeLine){let runtimeColor=resolveRuntimeStatusColor(service.runtime?.status);defaultRuntime.log(`${label(`Runtime:`)} ${colorize(rich,runtimeColor,runtimeLine)}`)}if(rpc&&!rpc.ok&&service.loaded&&service.runtime?.status===`running`&&defaultRuntime.log(warnText(`Warm-up: launch agents can take a few seconds. Try again shortly.`)),rpc){if(rpc.ok)defaultRuntime.log(`${label(`RPC probe:`)} ${okText(`ok`)}`);else{defaultRuntime.error(`${label(`RPC probe:`)} ${errorText(`failed`)}`),rpc.url&&defaultRuntime.error(`${label(`RPC target:`)} ${rpc.url}`);let lines=String(rpc.error??`unknown`).split(/\r?\n/).filter(Boolean);for(let line of lines.slice(0,12))defaultRuntime.error(` ${errorText(line)}`)}spacer()}if(process.platform===`linux`&&isSystemdUnavailableDetail(service.runtime?.detail)){defaultRuntime.error(errorText(`systemd user services unavailable.`));for(let hint of renderSystemdUnavailableHints({wsl:isWSLEnv()}))defaultRuntime.error(errorText(hint));spacer()}if(service.runtime?.missingUnit){defaultRuntime.error(errorText(`Service unit not found.`));for(let hint of renderRuntimeHints(service.runtime))defaultRuntime.error(errorText(hint))}else if(service.loaded&&service.runtime?.status===`stopped`){defaultRuntime.error(errorText(`Service is loaded but not running (likely exited immediately).`));for(let hint of renderRuntimeHints(service.runtime,service.command?.environment??process.env))defaultRuntime.error(errorText(hint));spacer()}if(service.runtime?.cachedLabel){let labelValue=resolveGatewayLaunchAgentLabel((service.command?.environment??process.env).BUILDERFORCE_AGENTS_PROFILE);defaultRuntime.error(errorText(`LaunchAgent label cached but plist missing. Clear with: launchctl bootout gui/$UID/${labelValue}`)),defaultRuntime.error(errorText(`Then reinstall: ${formatCliCommand(`builderforce gateway install`)}`)),spacer()}for(let line of renderPortDiagnosticsForCli(status,rpc?.ok))defaultRuntime.error(errorText(line));if(status.port){let addrs=resolvePortListeningAddresses(status);addrs.length>0&&defaultRuntime.log(`${label(`Listening:`)} ${infoText(addrs.join(`, `))}`)}if(status.portCli&&status.portCli.port!==status.port?.port&&defaultRuntime.log(`${label(`Note:`)} CLI config resolves gateway port=${status.portCli.port} (${status.portCli.status}).`),service.loaded&&service.runtime?.status===`running`&&status.port&&status.port.status!==`busy`){if(defaultRuntime.error(errorText(`Gateway port ${status.port.port} is not listening (service appears running).`)),status.lastError&&defaultRuntime.error(`${errorText(`Last gateway error:`)} ${status.lastError}`),process.platform===`linux`){let unit=resolveGatewaySystemdServiceName((service.command?.environment??process.env).BUILDERFORCE_AGENTS_PROFILE);defaultRuntime.error(errorText(`Logs: journalctl --user -u ${unit}.service -n 200 --no-pager`))}else if(process.platform===`darwin`){let logs=resolveGatewayLogPaths(service.command?.environment??process.env);defaultRuntime.error(`${errorText(`Logs:`)} ${shortenHomePath(logs.stdoutPath)}`),defaultRuntime.error(`${errorText(`Errors:`)} ${shortenHomePath(logs.stderrPath)}`)}spacer()}if(extraServices.length>0){defaultRuntime.error(errorText(`Other gateway-like services detected (best effort):`));for(let svc of extraServices)defaultRuntime.error(`- ${errorText(svc.label)} (${svc.scope}, ${svc.detail})`);for(let hint of renderGatewayServiceCleanupHints())defaultRuntime.error(`${errorText(`Cleanup hint:`)} ${hint}`);spacer()}extraServices.length>0&&(defaultRuntime.error(errorText(`Recommendation: run a single gateway per machine for most setups. One gateway supports multiple agents (see docs: /gateway#multiple-gateways-same-host).`)),defaultRuntime.error(errorText(`If you need multiple gateways (e.g., a rescue bot on the same host), isolate ports + config/state (see docs: /gateway#multiple-gateways-same-host).`)),spacer()),defaultRuntime.log(`${label(`Troubles:`)} run ${formatCliCommand(`builderforce status`)}`),defaultRuntime.log(`${label(`Troubleshooting:`)} https://docs.builderforce.ai/troubleshooting`)}async function runDaemonStatus(opts){try{printDaemonStatus(await gatherDaemonStatus({rpc:opts.rpc,probe:!!opts.probe,deep:!!opts.deep}),{json:!!opts.json})}catch(err){let rich=isRich();defaultRuntime.error(colorize(rich,theme.error,`Gateway status failed: ${String(err)}`)),defaultRuntime.exit(1)}}function resolveInstallOptions(cmdOpts,command){let parentForce=inheritOptionFromParent(command,`force`),parentPort=inheritOptionFromParent(command,`port`),parentToken=inheritOptionFromParent(command,`token`),parentCron=inheritOptionFromParent(command,`cron`);return{...cmdOpts,force:!!(cmdOpts.force||parentForce),port:cmdOpts.port??parentPort,token:cmdOpts.token??parentToken,noCron:cmdOpts.cron===!1||parentCron===!1}}function resolveRpcOptions(cmdOpts,command){let parentToken=inheritOptionFromParent(command,`token`),parentPassword=inheritOptionFromParent(command,`password`);return{...cmdOpts,token:cmdOpts.token??parentToken,password:cmdOpts.password??parentPassword}}function addGatewayServiceCommands(parent,opts){parent.command(`status`).description(opts?.statusDescription??`Show gateway service status + probe the Gateway`).option(`--url <url>`,`Gateway WebSocket URL (defaults to config/remote/local)`).option(`--token <token>`,`Gateway token (if required)`).option(`--password <password>`,`Gateway password (password auth)`).option(`--timeout <ms>`,`Timeout in ms`,`10000`).option(`--no-probe`,`Skip RPC probe`).option(`--deep`,`Scan system-level services`,!1).option(`--json`,`Output JSON`,!1).action(async(cmdOpts,command)=>{await runDaemonStatus({rpc:resolveRpcOptions(cmdOpts,command),probe:!!cmdOpts.probe,deep:!!cmdOpts.deep,json:!!cmdOpts.json})}),parent.command(`install`).description(`Install the Gateway service (launchd/systemd/schtasks)`).option(`--port <port>`,`Gateway port`).option(`--runtime <runtime>`,`Daemon runtime (node|bun). Default: node`).option(`--token <token>`,`Gateway token (token auth)`).option(`--no-cron`,`Disable cron scheduler (cron.enabled: false) to reduce gateway activity`,!0).option(`--force`,`Reinstall/overwrite if already installed`,!1).option(`--json`,`Output JSON`,!1).action(async(cmdOpts,command)=>{await runDaemonInstall(resolveInstallOptions(cmdOpts,command))}),parent.command(`uninstall`).description(`Uninstall the Gateway service (launchd/systemd/schtasks)`).option(`--json`,`Output JSON`,!1).action(async cmdOpts=>{await runDaemonUninstall(cmdOpts)}),parent.command(`start`).description(`Start the Gateway service (launchd/systemd/schtasks)`).option(`--json`,`Output JSON`,!1).action(async cmdOpts=>{await runDaemonStart(cmdOpts)}),parent.command(`stop`).description(`Stop the Gateway service (launchd/systemd/schtasks)`).option(`--json`,`Output JSON`,!1).action(async cmdOpts=>{await runDaemonStop(cmdOpts)}),parent.command(`restart`).description(`Restart the Gateway service (launchd/systemd/schtasks)`).option(`--json`,`Output JSON`,!1).action(async cmdOpts=>{await runDaemonRestart(cmdOpts)})}function registerDaemonCli(program){addGatewayServiceCommands(program.command(`daemon`).description(`Manage the Gateway service (launchd/systemd/schtasks)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/gateway`,`docs.builderforce.ai/cli/gateway`)}\n`),{statusDescription:`Show service install status + probe the Gateway`})}export{renderGatewayServiceCleanupHints as a,runDaemonStop as c,findExtraGatewayServices as i,runDaemonUninstall as l,addGatewayServiceCommands as n,runDaemonRestart as o,runDaemonStatus as r,runDaemonStart as s,registerDaemonCli as t,runDaemonInstall as u};
1
+ import{d as resolveIsNixMode,g as resolveStateDir,o as resolveConfigPath,u as resolveGatewayPort}from"./paths-BHg-VHB4.js";import{L as colorize,R as isRich,S as shortenHomePath,W as getResolvedLoggerSettings,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{a as readConfigFileSnapshot,c as writeConfigFile,n as createConfigIO,r as loadConfig}from"./io-D9hC2aG0.js";import{n as pickPrimaryTailnetIPv4}from"./tailnet-B0Q5E6lZ.js";import{n as callGateway}from"./call-Du2LiaX6.js";import{h as GATEWAY_CLIENT_NAMES,m as GATEWAY_CLIENT_MODES}from"./message-channel-z5YRpR2d.js";import{l as resolveGatewayBindHost}from"./net-DtnXq2dW.js";import{i as resolveGatewayAuth}from"./auth-ChecwOXS.js";import{a as formatPortDiagnostics,i as classifyPortListener,n as inspectPortUsage}from"./ports-DTku9NSx.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName,n as GATEWAY_SERVICE_KIND,r as GATEWAY_SERVICE_MARKER}from"./constants-D2th5NXV.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import{n as withProgress}from"./progress-Cqb-jAjT.js";import{g as resolveControlUiLinks,m as randomToken}from"./onboard-helpers-Ce_c4Raj.js";import{n as isWSLEnv}from"./wsl-BO1sLIB6.js";import{n as inheritOptionFromParent}from"./command-options-DbMbMxM2.js";import{i as buildGatewayInstallPlan,r as isGatewayDaemonRuntime,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-Dx800VUt.js";import{n as execSchtasks,s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-EKJG69M3.js";import{S as installDaemonServiceAndEmit,_ as resolveRuntimeStatusColor,a as isSystemdUnavailableDetail,b as buildDaemonServiceSnapshot,c as auditGatewayServiceConfig,d as filterDaemonEnv,f as normalizeListenerAddress,g as renderRuntimeHints,h as renderGatewayServiceStartHints,i as runServiceUninstall,m as pickProbeHostForBind,n as runServiceStart,o as renderSystemdUnavailableHints,p as parsePortFromArgs,r as runServiceStop,t as runServiceRestart,u as createCliStatusTextStyles,v as safeDaemonEnv,x as createDaemonActionContext,y as formatRuntimeStatus}from"./lifecycle-core-D9Dg5Qps.js";import{t as readLastGatewayErrorLine}from"./diagnostics-DamNPi4e.js";import{t as parsePort}from"./parse-port-FgIKmqqb.js";import path from"node:path";import fs from"node:fs/promises";async function runDaemonInstall(opts){let json=!!opts.json,{stdout,warnings,emit,fail}=createDaemonActionContext({action:`install`,json});if(resolveIsNixMode(process.env)){fail(`Nix mode detected; service install is disabled.`);return}let cfg=loadConfig(),portOverride=parsePort(opts.port);if(opts.port!==void 0&&portOverride===null){fail(`Invalid port`);return}let port=portOverride??resolveGatewayPort(cfg);if(!Number.isFinite(port)||port<=0){fail(`Invalid port`);return}let runtimeRaw=opts.runtime?String(opts.runtime):DEFAULT_GATEWAY_DAEMON_RUNTIME;if(!isGatewayDaemonRuntime(runtimeRaw)){fail(`Invalid --runtime (use "node" or "bun")`);return}let service=resolveGatewayService(),loaded=!1;try{loaded=await service.isLoaded({env:process.env})}catch(err){fail(`Gateway service check failed: ${String(err)}`);return}if(loaded&&!opts.force){emit({ok:!0,result:`already-installed`,message:`Gateway service already ${service.loadedText}.`,service:buildDaemonServiceSnapshot(service,loaded)}),json||(defaultRuntime.log(`Gateway service already ${service.loadedText}.`),defaultRuntime.log(`Reinstall with: ${formatCliCommand(`builderforce gateway install --force`)}`));return}let resolvedAuth=resolveGatewayAuth({authConfig:cfg.gateway?.auth,tailscaleMode:cfg.gateway?.tailscale?.mode??`off`}),needsToken=resolvedAuth.mode===`token`&&!resolvedAuth.token&&!resolvedAuth.allowTailscale,token=opts.token||cfg.gateway?.auth?.token||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN;if(!token&&needsToken){token=randomToken();let warnMsg=`No gateway token found. Auto-generated one and saving to config.`;json?warnings.push(warnMsg):defaultRuntime.log(warnMsg);try{let snapshot=await readConfigFileSnapshot();if(snapshot.exists&&!snapshot.valid){let msg=`Warning: config file exists but is invalid; skipping token persistence.`;json?warnings.push(msg):defaultRuntime.log(msg)}else{let baseConfig=snapshot.exists?snapshot.config:{};baseConfig.gateway?.auth?.token?token=baseConfig.gateway.auth.token:await writeConfigFile({...baseConfig,gateway:{...baseConfig.gateway,auth:{...baseConfig.gateway?.auth,mode:baseConfig.gateway?.auth?.mode??`token`,token}}})}}catch(err){let msg=`Warning: could not persist token to config: ${String(err)}`;json?warnings.push(msg):defaultRuntime.log(msg)}}if(opts.noCron)try{let snapshot=await readConfigFileSnapshot();if(snapshot.exists&&!snapshot.valid){let msg=`Warning: config file exists but is invalid; skipping cron.enabled persistence.`;json?warnings.push(msg):defaultRuntime.log(msg)}else{let baseConfig=snapshot.exists?snapshot.config:{},currentCron=baseConfig.cron;currentCron?.enabled!==!1&&(await writeConfigFile({...baseConfig,cron:{...currentCron,enabled:!1}}),json||defaultRuntime.log(`Set cron.enabled: false in config (scheduled jobs disabled).`))}}catch(err){let msg=`Warning: could not persist cron.enabled: ${String(err)}`;json?warnings.push(msg):defaultRuntime.log(msg)}let{programArguments,workingDirectory,environment}=await buildGatewayInstallPlan({env:process.env,port,token,runtime:runtimeRaw,warn:message=>{json?warnings.push(message):defaultRuntime.log(message)},config:cfg});await installDaemonServiceAndEmit({serviceNoun:`Gateway`,service,warnings,emit,fail,install:async()=>{await service.install({env:process.env,stdout,programArguments,workingDirectory,environment})}})}async function probeGatewayStatus(opts){try{return await withProgress({label:`Checking gateway status...`,indeterminate:!0,enabled:opts.json!==!0},async()=>await callGateway({url:opts.url,token:opts.token,password:opts.password,method:`status`,timeoutMs:opts.timeoutMs,clientName:GATEWAY_CLIENT_NAMES.CLI,mode:GATEWAY_CLIENT_MODES.CLI,...opts.configPath?{configPath:opts.configPath}:{}})),{ok:!0}}catch(err){return{ok:!1,error:err instanceof Error?err.message:String(err)}}}async function probeGatewayHealth(){try{let cfg=loadConfig(),bindMode=cfg.gateway?.bind??`loopback`,customBindHost=typeof cfg.gateway?.customBindHost==`string`?cfg.gateway.customBindHost:void 0,probeHost=pickProbeHostForBind(bindMode,pickPrimaryTailnetIPv4(),customBindHost),port=resolveGatewayPort(cfg,process.env),resolvedBindHost=await resolveGatewayBindHost(bindMode,customBindHost);return(await probeGatewayStatus({url:`ws://${probeHost||resolvedBindHost}:${port}`,token:cfg.gateway?.auth?.token||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN,password:cfg.gateway?.auth?.password||process.env.BUILDERFORCE_AGENTS_GATEWAY_PASSWORD,timeoutMs:2e3,json:!0,configPath:process.env.BUILDERFORCE_AGENTS_CONFIG_PATH})).ok}catch{return!1}}function sleep(ms){return new Promise(resolve=>setTimeout(resolve,ms))}async function clearStaleGatewayProcessIfNeeded(){if((await resolveGatewayService().readRuntime(process.env).catch(()=>null))?.status===`running`)return;let port=resolveGatewayPort(loadConfig(),process.env),diagnostics=await inspectPortUsage(port).catch(()=>null);if(!diagnostics||diagnostics.status!==`busy`)return;let staleListeners=diagnostics.listeners.filter(listener=>typeof listener.pid==`number`&&classifyPortListener(listener,port)===`gateway`);if(staleListeners.length===0)return;for(let listener of staleListeners)process.kill(listener.pid);let deadline=Date.now()+5e3;for(;Date.now()<deadline;){let next=await inspectPortUsage(port).catch(()=>null);if(!(next?.status===`busy`&&next.listeners.some(listener=>typeof listener.pid==`number`&&staleListeners.some(stale=>stale.pid===listener.pid)&&classifyPortListener(listener,port)===`gateway`)))return;await sleep(100)}throw Error(`Gateway restart cleanup failed: stale listener(s) on port ${port} did not exit: ${staleListeners.map(listener=>listener.pid).join(`, `)}`)}async function runDaemonUninstall(opts={}){return await runServiceUninstall({serviceNoun:`Gateway`,service:resolveGatewayService(),opts,stopBeforeUninstall:!0,assertNotLoadedAfterUninstall:!0})}async function runDaemonStart(opts={}){return await clearStaleGatewayProcessIfNeeded(),await runServiceStart({serviceNoun:`Gateway`,service:resolveGatewayService(),renderStartHints:renderGatewayServiceStartHints,opts,waitUntilHealthy:probeGatewayHealth})}async function runDaemonStop(opts={}){return await runServiceStop({serviceNoun:`Gateway`,service:resolveGatewayService(),opts})}async function runDaemonRestart(opts={}){return await clearStaleGatewayProcessIfNeeded(),await runServiceRestart({serviceNoun:`Gateway`,service:resolveGatewayService(),renderStartHints:renderGatewayServiceStartHints,opts,checkTokenDrift:!0,waitUntilHealthy:probeGatewayHealth})}const EXTRA_MARKERS=[`builderforce`,`builderforce`,`builderforce`];function renderGatewayServiceCleanupHints(env=process.env){let profile=env.BUILDERFORCE_AGENTS_PROFILE;switch(process.platform){case`darwin`:{let label=resolveGatewayLaunchAgentLabel(profile);return[`launchctl bootout gui/$UID/${label}`,`rm ~/Library/LaunchAgents/${label}.plist`]}case`linux`:{let unit=resolveGatewaySystemdServiceName(profile);return[`systemctl --user disable --now ${unit}.service`,`rm ~/.config/systemd/user/${unit}.service`]}case`win32`:return[`schtasks /Delete /TN "${resolveGatewayWindowsTaskName(profile)}" /F`];default:return[]}}function resolveHomeDir(env){let home=env.HOME?.trim()||env.USERPROFILE?.trim();if(!home)throw Error(`Missing HOME`);return home}function detectMarker(content){let lower=content.toLowerCase();for(let marker of EXTRA_MARKERS)if(lower.includes(marker))return marker;return null}function hasGatewayServiceMarker(content){let lower=content.toLowerCase(),markerKeys=[`builderforce_service_marker`],kindKeys=[`builderforce_service_kind`],markerValues=[GATEWAY_SERVICE_MARKER.toLowerCase()],hasMarkerKey=markerKeys.some(key=>lower.includes(key)),hasKindKey=kindKeys.some(key=>lower.includes(key)),hasMarkerValue=markerValues.some(value=>lower.includes(value));return hasMarkerKey&&hasKindKey&&hasMarkerValue&&lower.includes(GATEWAY_SERVICE_KIND.toLowerCase())}function isBuilderForceAgentsGatewayLaunchdService(label,contents){return hasGatewayServiceMarker(contents)?!0:contents.toLowerCase().includes(`gateway`)?label.startsWith(`ai.builderforce.`):!1}function isBuilderForceAgentsGatewaySystemdService(name,contents){return hasGatewayServiceMarker(contents)?!0:name.startsWith(`builderforce-gateway`)?contents.toLowerCase().includes(`gateway`):!1}function isBuilderForceAgentsGatewayTaskName(name){let normalized=name.trim().toLowerCase();return normalized?normalized===resolveGatewayWindowsTaskName().toLowerCase()||normalized.startsWith(`builderforce gateway`):!1}function tryExtractPlistLabel(contents){let match=contents.match(/<key>Label<\/key>\s*<string>([\s\S]*?)<\/string>/i);return match&&match[1]?.trim()||null}function isIgnoredLaunchdLabel(label){return label===resolveGatewayLaunchAgentLabel()}function isIgnoredSystemdName(name){return name===resolveGatewaySystemdServiceName()}function isLegacyLabel(label){let lower=label.toLowerCase();return lower.includes(`builderforce`)||lower.includes(`builderforce`)}async function readDirEntries(dir){try{return await fs.readdir(dir)}catch{return[]}}async function readUtf8File(filePath){try{return await fs.readFile(filePath,`utf8`)}catch{return null}}async function scanLaunchdDir(params){let results=[],entries=await readDirEntries(params.dir);for(let entry of entries){if(!entry.endsWith(`.plist`))continue;let labelFromName=entry.replace(/\.plist$/,``);if(isIgnoredLaunchdLabel(labelFromName))continue;let fullPath=path.join(params.dir,entry),contents=await readUtf8File(fullPath);if(contents===null)continue;let marker=detectMarker(contents),label=tryExtractPlistLabel(contents)??labelFromName;if(!marker){if(!(isLegacyLabel(labelFromName)||isLegacyLabel(label)))continue;results.push({platform:`darwin`,label,detail:`plist: ${fullPath}`,scope:params.scope,marker:(isLegacyLabel(label),`builderforce`),legacy:!0});continue}isIgnoredLaunchdLabel(label)||marker===`builderforce`&&isBuilderForceAgentsGatewayLaunchdService(label,contents)||results.push({platform:`darwin`,label,detail:`plist: ${fullPath}`,scope:params.scope,marker,legacy:marker!==`builderforce`||isLegacyLabel(label)})}return results}async function scanSystemdDir(params){let results=[],entries=await readDirEntries(params.dir);for(let entry of entries){if(!entry.endsWith(`.service`))continue;let name=entry.replace(/\.service$/,``);if(isIgnoredSystemdName(name))continue;let fullPath=path.join(params.dir,entry),contents=await readUtf8File(fullPath);if(contents===null)continue;let marker=detectMarker(contents);marker&&(marker===`builderforce`&&isBuilderForceAgentsGatewaySystemdService(name,contents)||results.push({platform:`linux`,label:entry,detail:`unit: ${fullPath}`,scope:params.scope,marker,legacy:marker!==`builderforce`}))}return results}function parseSchtasksList(output){let tasks=[],current=null;for(let rawLine of output.split(/\r?\n/)){let line=rawLine.trim();if(!line){current&&=(tasks.push(current),null);continue}let idx=line.indexOf(`:`);if(idx<=0)continue;let key=line.slice(0,idx).trim().toLowerCase(),value=line.slice(idx+1).trim();if(value){if(key===`taskname`){current&&tasks.push(current),current={name:value};continue}current&&key===`task to run`&&(current.taskToRun=value)}}return current&&tasks.push(current),tasks}async function findExtraGatewayServices(env,opts={}){let results=[],seen=new Set,push=svc=>{let key=`${svc.platform}:${svc.label}:${svc.detail}:${svc.scope}`;seen.has(key)||(seen.add(key),results.push(svc))};if(process.platform===`darwin`){try{let home=resolveHomeDir(env),userDir=path.join(home,`Library`,`LaunchAgents`);for(let svc of await scanLaunchdDir({dir:userDir,scope:`user`}))push(svc);if(opts.deep){for(let svc of await scanLaunchdDir({dir:path.join(path.sep,`Library`,`LaunchAgents`),scope:`system`}))push(svc);for(let svc of await scanLaunchdDir({dir:path.join(path.sep,`Library`,`LaunchDaemons`),scope:`system`}))push(svc)}}catch{return results}return results}if(process.platform===`linux`){try{let home=resolveHomeDir(env),userDir=path.join(home,`.config`,`systemd`,`user`);for(let svc of await scanSystemdDir({dir:userDir,scope:`user`}))push(svc);if(opts.deep)for(let dir of[`/etc/systemd/system`,`/usr/lib/systemd/system`,`/lib/systemd/system`])for(let svc of await scanSystemdDir({dir,scope:`system`}))push(svc)}catch{return results}return results}if(process.platform===`win32`){if(!opts.deep)return results;let res=await execSchtasks([`/Query`,`/FO`,`LIST`,`/V`]);if(res.code!==0)return results;let tasks=parseSchtasksList(res.stdout);for(let task of tasks){let name=task.name.trim();if(!name||isBuilderForceAgentsGatewayTaskName(name))continue;let lowerName=name.toLowerCase(),lowerCommand=task.taskToRun?.toLowerCase()??``,marker=null;for(let candidate of EXTRA_MARKERS)if(lowerName.includes(candidate)||lowerCommand.includes(candidate)){marker=candidate;break}marker&&push({platform:`win32`,label:name,detail:task.taskToRun?`task: ${name}, run: ${task.taskToRun}`:name,scope:`system`,marker,legacy:marker!==`builderforce`})}return results}return results}function shouldReportPortUsage(status,rpcOk){return!(status!==`busy`||rpcOk===!0)}async function gatherDaemonStatus(opts){let service=resolveGatewayService(),[loaded,command,runtime]=await Promise.all([service.isLoaded({env:process.env}).catch(()=>!1),service.readCommand(process.env).catch(()=>null),service.readRuntime(process.env).catch(err=>({status:`unknown`,detail:String(err)}))]),configAudit=await auditGatewayServiceConfig({env:process.env,command}),serviceEnv=command?.environment??void 0,mergedDaemonEnv={...process.env,...serviceEnv??void 0},cliConfigPath=resolveConfigPath(process.env,resolveStateDir(process.env)),daemonConfigPath=resolveConfigPath(mergedDaemonEnv,resolveStateDir(mergedDaemonEnv)),cliIO=createConfigIO({env:process.env,configPath:cliConfigPath}),daemonIO=createConfigIO({env:mergedDaemonEnv,configPath:daemonConfigPath}),[cliSnapshot,daemonSnapshot]=await Promise.all([cliIO.readConfigFileSnapshot().catch(()=>null),daemonIO.readConfigFileSnapshot().catch(()=>null)]),cliCfg=cliIO.loadConfig(),daemonCfg=daemonIO.loadConfig(),cliConfigSummary={path:cliSnapshot?.path??cliConfigPath,exists:cliSnapshot?.exists??!1,valid:cliSnapshot?.valid??!0,...cliSnapshot?.issues?.length?{issues:cliSnapshot.issues}:{},controlUi:cliCfg.gateway?.controlUi},daemonConfigSummary={path:daemonSnapshot?.path??daemonConfigPath,exists:daemonSnapshot?.exists??!1,valid:daemonSnapshot?.valid??!0,...daemonSnapshot?.issues?.length?{issues:daemonSnapshot.issues}:{},controlUi:daemonCfg.gateway?.controlUi},configMismatch=cliConfigSummary.path!==daemonConfigSummary.path,portFromArgs=parsePortFromArgs(command?.programArguments),daemonPort=portFromArgs??resolveGatewayPort(daemonCfg,mergedDaemonEnv),portSource=portFromArgs?`service args`:`env/config`,bindMode=daemonCfg.gateway?.bind??`loopback`,customBindHost=daemonCfg.gateway?.customBindHost,bindHost=await resolveGatewayBindHost(bindMode,customBindHost),probeHost=pickProbeHostForBind(bindMode,pickPrimaryTailnetIPv4(),customBindHost),probeUrlOverride=typeof opts.rpc.url==`string`&&opts.rpc.url.trim().length>0?opts.rpc.url.trim():null,probeUrl=probeUrlOverride??`ws://${probeHost}:${daemonPort}`,probeNote=!probeUrlOverride&&bindMode===`lan`?`bind=lan listens on 0.0.0.0 (all interfaces); probing via ${probeHost}.`:!probeUrlOverride&&bindMode===`loopback`?`Loopback-only gateway; only local clients can connect.`:void 0,cliPort=resolveGatewayPort(cliCfg,process.env),[portDiagnostics,portCliDiagnostics]=await Promise.all([inspectPortUsage(daemonPort).catch(()=>null),cliPort===daemonPort?null:inspectPortUsage(cliPort).catch(()=>null)]),portStatus=portDiagnostics?{port:portDiagnostics.port,status:portDiagnostics.status,listeners:portDiagnostics.listeners,hints:portDiagnostics.hints}:void 0,portCliStatus=portCliDiagnostics?{port:portCliDiagnostics.port,status:portCliDiagnostics.status,listeners:portCliDiagnostics.listeners,hints:portCliDiagnostics.hints}:void 0,extraServices=await findExtraGatewayServices(process.env,{deep:!!opts.deep}).catch(()=>[]),timeoutMsRaw=Number.parseInt(String(opts.rpc.timeout??`10000`),10),timeoutMs=Number.isFinite(timeoutMsRaw)&&timeoutMsRaw>0?timeoutMsRaw:1e4,rpc=opts.probe?await probeGatewayStatus({url:probeUrl,token:opts.rpc.token||mergedDaemonEnv.BUILDERFORCE_AGENTS_GATEWAY_TOKEN||daemonCfg.gateway?.auth?.token,password:opts.rpc.password||mergedDaemonEnv.BUILDERFORCE_AGENTS_GATEWAY_PASSWORD||daemonCfg.gateway?.auth?.password,timeoutMs,json:opts.rpc.json,configPath:daemonConfigSummary.path}):void 0,lastError;return loaded&&runtime?.status===`running`&&portStatus&&portStatus.status!==`busy`&&(lastError=await readLastGatewayErrorLine(mergedDaemonEnv)??void 0),{service:{label:service.label,loaded,loadedText:service.loadedText,notLoadedText:service.notLoadedText,command,runtime,configAudit},config:{cli:cliConfigSummary,daemon:daemonConfigSummary,...configMismatch?{mismatch:!0}:{}},gateway:{bindMode,bindHost,customBindHost,port:daemonPort,portSource,probeUrl,...probeNote?{probeNote}:{}},port:portStatus,...portCliStatus?{portCli:portCliStatus}:{},lastError,...rpc?{rpc:{...rpc,url:probeUrl}}:{},extraServices}}function renderPortDiagnosticsForCli(status,rpcOk){return!status.port||!shouldReportPortUsage(status.port.status,rpcOk)?[]:formatPortDiagnostics({port:status.port.port,status:status.port.status,listeners:status.port.listeners,hints:status.port.hints})}function resolvePortListeningAddresses(status){return Array.from(new Set(status.port?.listeners?.map(l=>l.address?normalizeListenerAddress(l.address):``).filter(v=>!!v)??[]))}function sanitizeDaemonStatusForJson(status){let command=status.service.command;if(!command?.environment)return status;let safeEnv=filterDaemonEnv(command.environment),nextCommand={...command,environment:Object.keys(safeEnv).length>0?safeEnv:void 0};return{...status,service:{...status.service,command:nextCommand}}}function printDaemonStatus(status,opts){if(opts.json){let sanitized=sanitizeDaemonStatusForJson(status);defaultRuntime.log(JSON.stringify(sanitized,null,2));return}let{rich,label,accent,infoText,okText,warnText,errorText}=createCliStatusTextStyles(),spacer=()=>defaultRuntime.log(``),{service,rpc,extraServices}=status,serviceStatus=service.loaded?okText(service.loadedText):warnText(service.notLoadedText);defaultRuntime.log(`${label(`Service:`)} ${accent(service.label)} (${serviceStatus})`);try{let logFile=getResolvedLoggerSettings().file;defaultRuntime.log(`${label(`File logs:`)} ${infoText(shortenHomePath(logFile))}`)}catch{}service.command?.programArguments?.length&&defaultRuntime.log(`${label(`Command:`)} ${infoText(service.command.programArguments.join(` `))}`),service.command?.sourcePath&&defaultRuntime.log(`${label(`Service file:`)} ${infoText(shortenHomePath(service.command.sourcePath))}`),service.command?.workingDirectory&&defaultRuntime.log(`${label(`Working dir:`)} ${infoText(shortenHomePath(service.command.workingDirectory))}`);let daemonEnvLines=safeDaemonEnv(service.command?.environment);if(daemonEnvLines.length>0&&defaultRuntime.log(`${label(`Service env:`)} ${daemonEnvLines.join(` `)}`),spacer(),service.configAudit?.issues.length){defaultRuntime.error(warnText(`Service config looks out of date or non-standard.`));for(let issue of service.configAudit.issues){let detail=issue.detail?` (${issue.detail})`:``;defaultRuntime.error(`${warnText(`Service config issue:`)} ${issue.message}${detail}`)}defaultRuntime.error(warnText(`Recommendation: run "${formatCliCommand(`builderforce doctor`)}" (or "${formatCliCommand(`builderforce doctor --repair`)}").`))}if(status.config){let cliCfg=`${shortenHomePath(status.config.cli.path)}${status.config.cli.exists?``:` (missing)`}${status.config.cli.valid?``:` (invalid)`}`;if(defaultRuntime.log(`${label(`Config (cli):`)} ${infoText(cliCfg)}`),!status.config.cli.valid&&status.config.cli.issues?.length)for(let issue of status.config.cli.issues.slice(0,5))defaultRuntime.error(`${errorText(`Config issue:`)} ${issue.path||`<root>`}: ${issue.message}`);if(status.config.daemon){let daemonCfg=`${shortenHomePath(status.config.daemon.path)}${status.config.daemon.exists?``:` (missing)`}${status.config.daemon.valid?``:` (invalid)`}`;if(defaultRuntime.log(`${label(`Config (service):`)} ${infoText(daemonCfg)}`),!status.config.daemon.valid&&status.config.daemon.issues?.length)for(let issue of status.config.daemon.issues.slice(0,5))defaultRuntime.error(`${errorText(`Service config issue:`)} ${issue.path||`<root>`}: ${issue.message}`)}status.config.mismatch&&(defaultRuntime.error(errorText(`Root cause: CLI and service are using different config paths (likely a profile/state-dir mismatch).`)),defaultRuntime.error(errorText(`Fix: rerun \`${formatCliCommand(`builderforce gateway install --force`)}\` from the same --profile / BUILDERFORCE_AGENTS_STATE_DIR you expect.`))),spacer()}if(status.gateway){let bindHost=status.gateway.bindHost??`n/a`;if(defaultRuntime.log(`${label(`Gateway:`)} bind=${infoText(status.gateway.bindMode)} (${infoText(bindHost)}), port=${infoText(String(status.gateway.port))} (${infoText(status.gateway.portSource)})`),defaultRuntime.log(`${label(`Probe target:`)} ${infoText(status.gateway.probeUrl)}`),!(status.config?.daemon?.controlUi?.enabled??!0))defaultRuntime.log(`${label(`Dashboard:`)} ${warnText(`disabled`)}`);else{let links=resolveControlUiLinks({port:status.gateway.port,bind:status.gateway.bindMode,customBindHost:status.gateway.customBindHost,basePath:status.config?.daemon?.controlUi?.basePath});defaultRuntime.log(`${label(`Dashboard:`)} ${infoText(links.httpUrl)}`)}status.gateway.probeNote&&defaultRuntime.log(`${label(`Probe note:`)} ${infoText(status.gateway.probeNote)}`),spacer()}let runtimeLine=formatRuntimeStatus(service.runtime);if(runtimeLine){let runtimeColor=resolveRuntimeStatusColor(service.runtime?.status);defaultRuntime.log(`${label(`Runtime:`)} ${colorize(rich,runtimeColor,runtimeLine)}`)}if(rpc&&!rpc.ok&&service.loaded&&service.runtime?.status===`running`&&defaultRuntime.log(warnText(`Warm-up: launch agents can take a few seconds. Try again shortly.`)),rpc){if(rpc.ok)defaultRuntime.log(`${label(`RPC probe:`)} ${okText(`ok`)}`);else{defaultRuntime.error(`${label(`RPC probe:`)} ${errorText(`failed`)}`),rpc.url&&defaultRuntime.error(`${label(`RPC target:`)} ${rpc.url}`);let lines=String(rpc.error??`unknown`).split(/\r?\n/).filter(Boolean);for(let line of lines.slice(0,12))defaultRuntime.error(` ${errorText(line)}`)}spacer()}if(process.platform===`linux`&&isSystemdUnavailableDetail(service.runtime?.detail)){defaultRuntime.error(errorText(`systemd user services unavailable.`));for(let hint of renderSystemdUnavailableHints({wsl:isWSLEnv()}))defaultRuntime.error(errorText(hint));spacer()}if(service.runtime?.missingUnit){defaultRuntime.error(errorText(`Service unit not found.`));for(let hint of renderRuntimeHints(service.runtime))defaultRuntime.error(errorText(hint))}else if(service.loaded&&service.runtime?.status===`stopped`){defaultRuntime.error(errorText(`Service is loaded but not running (likely exited immediately).`));for(let hint of renderRuntimeHints(service.runtime,service.command?.environment??process.env))defaultRuntime.error(errorText(hint));spacer()}if(service.runtime?.cachedLabel){let labelValue=resolveGatewayLaunchAgentLabel((service.command?.environment??process.env).BUILDERFORCE_AGENTS_PROFILE);defaultRuntime.error(errorText(`LaunchAgent label cached but plist missing. Clear with: launchctl bootout gui/$UID/${labelValue}`)),defaultRuntime.error(errorText(`Then reinstall: ${formatCliCommand(`builderforce gateway install`)}`)),spacer()}for(let line of renderPortDiagnosticsForCli(status,rpc?.ok))defaultRuntime.error(errorText(line));if(status.port){let addrs=resolvePortListeningAddresses(status);addrs.length>0&&defaultRuntime.log(`${label(`Listening:`)} ${infoText(addrs.join(`, `))}`)}if(status.portCli&&status.portCli.port!==status.port?.port&&defaultRuntime.log(`${label(`Note:`)} CLI config resolves gateway port=${status.portCli.port} (${status.portCli.status}).`),service.loaded&&service.runtime?.status===`running`&&status.port&&status.port.status!==`busy`){if(defaultRuntime.error(errorText(`Gateway port ${status.port.port} is not listening (service appears running).`)),status.lastError&&defaultRuntime.error(`${errorText(`Last gateway error:`)} ${status.lastError}`),process.platform===`linux`){let unit=resolveGatewaySystemdServiceName((service.command?.environment??process.env).BUILDERFORCE_AGENTS_PROFILE);defaultRuntime.error(errorText(`Logs: journalctl --user -u ${unit}.service -n 200 --no-pager`))}else if(process.platform===`darwin`){let logs=resolveGatewayLogPaths(service.command?.environment??process.env);defaultRuntime.error(`${errorText(`Logs:`)} ${shortenHomePath(logs.stdoutPath)}`),defaultRuntime.error(`${errorText(`Errors:`)} ${shortenHomePath(logs.stderrPath)}`)}spacer()}if(extraServices.length>0){defaultRuntime.error(errorText(`Other gateway-like services detected (best effort):`));for(let svc of extraServices)defaultRuntime.error(`- ${errorText(svc.label)} (${svc.scope}, ${svc.detail})`);for(let hint of renderGatewayServiceCleanupHints())defaultRuntime.error(`${errorText(`Cleanup hint:`)} ${hint}`);spacer()}extraServices.length>0&&(defaultRuntime.error(errorText(`Recommendation: run a single gateway per machine for most setups. One gateway supports multiple agents (see docs: /gateway#multiple-gateways-same-host).`)),defaultRuntime.error(errorText(`If you need multiple gateways (e.g., a rescue bot on the same host), isolate ports + config/state (see docs: /gateway#multiple-gateways-same-host).`)),spacer()),defaultRuntime.log(`${label(`Troubles:`)} run ${formatCliCommand(`builderforce status`)}`),defaultRuntime.log(`${label(`Troubleshooting:`)} https://docs.builderforce.ai/troubleshooting`)}async function runDaemonStatus(opts){try{printDaemonStatus(await gatherDaemonStatus({rpc:opts.rpc,probe:!!opts.probe,deep:!!opts.deep}),{json:!!opts.json})}catch(err){let rich=isRich();defaultRuntime.error(colorize(rich,theme.error,`Gateway status failed: ${String(err)}`)),defaultRuntime.exit(1)}}function resolveInstallOptions(cmdOpts,command){let parentForce=inheritOptionFromParent(command,`force`),parentPort=inheritOptionFromParent(command,`port`),parentToken=inheritOptionFromParent(command,`token`),parentCron=inheritOptionFromParent(command,`cron`);return{...cmdOpts,force:!!(cmdOpts.force||parentForce),port:cmdOpts.port??parentPort,token:cmdOpts.token??parentToken,noCron:cmdOpts.cron===!1||parentCron===!1}}function resolveRpcOptions(cmdOpts,command){let parentToken=inheritOptionFromParent(command,`token`),parentPassword=inheritOptionFromParent(command,`password`);return{...cmdOpts,token:cmdOpts.token??parentToken,password:cmdOpts.password??parentPassword}}function addGatewayServiceCommands(parent,opts){parent.command(`status`).description(opts?.statusDescription??`Show gateway service status + probe the Gateway`).option(`--url <url>`,`Gateway WebSocket URL (defaults to config/remote/local)`).option(`--token <token>`,`Gateway token (if required)`).option(`--password <password>`,`Gateway password (password auth)`).option(`--timeout <ms>`,`Timeout in ms`,`10000`).option(`--no-probe`,`Skip RPC probe`).option(`--deep`,`Scan system-level services`,!1).option(`--json`,`Output JSON`,!1).action(async(cmdOpts,command)=>{await runDaemonStatus({rpc:resolveRpcOptions(cmdOpts,command),probe:!!cmdOpts.probe,deep:!!cmdOpts.deep,json:!!cmdOpts.json})}),parent.command(`install`).description(`Install the Gateway service (launchd/systemd/schtasks)`).option(`--port <port>`,`Gateway port`).option(`--runtime <runtime>`,`Daemon runtime (node|bun). Default: node`).option(`--token <token>`,`Gateway token (token auth)`).option(`--no-cron`,`Disable cron scheduler (cron.enabled: false) to reduce gateway activity`,!0).option(`--force`,`Reinstall/overwrite if already installed`,!1).option(`--json`,`Output JSON`,!1).action(async(cmdOpts,command)=>{await runDaemonInstall(resolveInstallOptions(cmdOpts,command))}),parent.command(`uninstall`).description(`Uninstall the Gateway service (launchd/systemd/schtasks)`).option(`--json`,`Output JSON`,!1).action(async cmdOpts=>{await runDaemonUninstall(cmdOpts)}),parent.command(`start`).description(`Start the Gateway service (launchd/systemd/schtasks)`).option(`--json`,`Output JSON`,!1).action(async cmdOpts=>{await runDaemonStart(cmdOpts)}),parent.command(`stop`).description(`Stop the Gateway service (launchd/systemd/schtasks)`).option(`--json`,`Output JSON`,!1).action(async cmdOpts=>{await runDaemonStop(cmdOpts)}),parent.command(`restart`).description(`Restart the Gateway service (launchd/systemd/schtasks)`).option(`--json`,`Output JSON`,!1).action(async cmdOpts=>{await runDaemonRestart(cmdOpts)})}function registerDaemonCli(program){addGatewayServiceCommands(program.command(`daemon`).description(`Manage the Gateway service (launchd/systemd/schtasks)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/gateway`,`docs.builderforce.ai/cli/gateway`)}\n`),{statusDescription:`Show service install status + probe the Gateway`})}export{renderGatewayServiceCleanupHints as a,runDaemonStop as c,findExtraGatewayServices as i,runDaemonUninstall as l,addGatewayServiceCommands as n,runDaemonRestart as o,runDaemonStatus as r,runDaemonStart as s,registerDaemonCli as t,runDaemonInstall as u};
@@ -1 +1 @@
1
- import{d as resolveIsNixMode,g as resolveStateDir,o as resolveConfigPath,u as resolveGatewayPort}from"./paths-5FcIFMsj.js";import{B as theme,C as shortenHomePath,G as getResolvedLoggerSettings,R as colorize,z as isRich}from"./utils-DbaBVFaK.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{a as readConfigFileSnapshot,c as writeConfigFile,n as createConfigIO,r as loadConfig}from"./io-3R_ZyUxB.js";import{i as resolveGatewayAuth}from"./auth-lebUHrkd.js";import{n as pickPrimaryTailnetIPv4}from"./tailnet-CTj65CYb.js";import{u as resolveGatewayBindHost}from"./ws-Bbu03j3h.js";import{a as inspectPortUsage,c as formatPortDiagnostics,s as classifyPortListener}from"./ports-DgmEDNOm.js";import{h as GATEWAY_CLIENT_NAMES,m as GATEWAY_CLIENT_MODES}from"./message-channel-D_jXxXQj.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName,n as GATEWAY_SERVICE_KIND,r as GATEWAY_SERVICE_MARKER}from"./constants-BBbGeL3t.js";import{n as callGateway}from"./call-BbRf8gFM.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import{n as withProgress}from"./progress-BfOtdN6b.js";import{g as resolveControlUiLinks,m as randomToken}from"./onboard-helpers-Cf5dNq7-.js";import{n as isWSLEnv}from"./wsl-DkYsHmN5.js";import{n as inheritOptionFromParent}from"./command-options-DzGFCQYs.js";import{i as buildGatewayInstallPlan,r as isGatewayDaemonRuntime,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-CtOr1ncS.js";import{n as execSchtasks,s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-D-NLDyK3.js";import{S as installDaemonServiceAndEmit,_ as resolveRuntimeStatusColor,a as isSystemdUnavailableDetail,b as buildDaemonServiceSnapshot,c as auditGatewayServiceConfig,d as filterDaemonEnv,f as normalizeListenerAddress,g as renderRuntimeHints,h as renderGatewayServiceStartHints,i as runServiceUninstall,m as pickProbeHostForBind,n as runServiceStart,o as renderSystemdUnavailableHints,p as parsePortFromArgs,r as runServiceStop,t as runServiceRestart,u as createCliStatusTextStyles,v as safeDaemonEnv,x as createDaemonActionContext,y as formatRuntimeStatus}from"./lifecycle-core-Dwb4gHjZ.js";import{t as readLastGatewayErrorLine}from"./diagnostics-DCjg0nBH.js";import{t as parsePort}from"./parse-port-nw1R44xn.js";import path from"node:path";import fs from"node:fs/promises";async function runDaemonInstall(opts){let json=!!opts.json,{stdout,warnings,emit,fail}=createDaemonActionContext({action:`install`,json});if(resolveIsNixMode(process.env)){fail(`Nix mode detected; service install is disabled.`);return}let cfg=loadConfig(),portOverride=parsePort(opts.port);if(opts.port!==void 0&&portOverride===null){fail(`Invalid port`);return}let port=portOverride??resolveGatewayPort(cfg);if(!Number.isFinite(port)||port<=0){fail(`Invalid port`);return}let runtimeRaw=opts.runtime?String(opts.runtime):DEFAULT_GATEWAY_DAEMON_RUNTIME;if(!isGatewayDaemonRuntime(runtimeRaw)){fail(`Invalid --runtime (use "node" or "bun")`);return}let service=resolveGatewayService(),loaded=!1;try{loaded=await service.isLoaded({env:process.env})}catch(err){fail(`Gateway service check failed: ${String(err)}`);return}if(loaded&&!opts.force){emit({ok:!0,result:`already-installed`,message:`Gateway service already ${service.loadedText}.`,service:buildDaemonServiceSnapshot(service,loaded)}),json||(defaultRuntime.log(`Gateway service already ${service.loadedText}.`),defaultRuntime.log(`Reinstall with: ${formatCliCommand(`builderforce gateway install --force`)}`));return}let resolvedAuth=resolveGatewayAuth({authConfig:cfg.gateway?.auth,tailscaleMode:cfg.gateway?.tailscale?.mode??`off`}),needsToken=resolvedAuth.mode===`token`&&!resolvedAuth.token&&!resolvedAuth.allowTailscale,token=opts.token||cfg.gateway?.auth?.token||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN;if(!token&&needsToken){token=randomToken();let warnMsg=`No gateway token found. Auto-generated one and saving to config.`;json?warnings.push(warnMsg):defaultRuntime.log(warnMsg);try{let snapshot=await readConfigFileSnapshot();if(snapshot.exists&&!snapshot.valid){let msg=`Warning: config file exists but is invalid; skipping token persistence.`;json?warnings.push(msg):defaultRuntime.log(msg)}else{let baseConfig=snapshot.exists?snapshot.config:{};baseConfig.gateway?.auth?.token?token=baseConfig.gateway.auth.token:await writeConfigFile({...baseConfig,gateway:{...baseConfig.gateway,auth:{...baseConfig.gateway?.auth,mode:baseConfig.gateway?.auth?.mode??`token`,token}}})}}catch(err){let msg=`Warning: could not persist token to config: ${String(err)}`;json?warnings.push(msg):defaultRuntime.log(msg)}}if(opts.noCron)try{let snapshot=await readConfigFileSnapshot();if(snapshot.exists&&!snapshot.valid){let msg=`Warning: config file exists but is invalid; skipping cron.enabled persistence.`;json?warnings.push(msg):defaultRuntime.log(msg)}else{let baseConfig=snapshot.exists?snapshot.config:{},currentCron=baseConfig.cron;currentCron?.enabled!==!1&&(await writeConfigFile({...baseConfig,cron:{...currentCron,enabled:!1}}),json||defaultRuntime.log(`Set cron.enabled: false in config (scheduled jobs disabled).`))}}catch(err){let msg=`Warning: could not persist cron.enabled: ${String(err)}`;json?warnings.push(msg):defaultRuntime.log(msg)}let{programArguments,workingDirectory,environment}=await buildGatewayInstallPlan({env:process.env,port,token,runtime:runtimeRaw,warn:message=>{json?warnings.push(message):defaultRuntime.log(message)},config:cfg});await installDaemonServiceAndEmit({serviceNoun:`Gateway`,service,warnings,emit,fail,install:async()=>{await service.install({env:process.env,stdout,programArguments,workingDirectory,environment})}})}async function probeGatewayStatus(opts){try{return await withProgress({label:`Checking gateway status...`,indeterminate:!0,enabled:opts.json!==!0},async()=>await callGateway({url:opts.url,token:opts.token,password:opts.password,method:`status`,timeoutMs:opts.timeoutMs,clientName:GATEWAY_CLIENT_NAMES.CLI,mode:GATEWAY_CLIENT_MODES.CLI,...opts.configPath?{configPath:opts.configPath}:{}})),{ok:!0}}catch(err){return{ok:!1,error:err instanceof Error?err.message:String(err)}}}async function probeGatewayHealth(){try{let cfg=loadConfig(),bindMode=cfg.gateway?.bind??`loopback`,customBindHost=typeof cfg.gateway?.customBindHost==`string`?cfg.gateway.customBindHost:void 0,probeHost=pickProbeHostForBind(bindMode,pickPrimaryTailnetIPv4(),customBindHost),port=resolveGatewayPort(cfg,process.env),resolvedBindHost=await resolveGatewayBindHost(bindMode,customBindHost);return(await probeGatewayStatus({url:`ws://${probeHost||resolvedBindHost}:${port}`,token:cfg.gateway?.auth?.token||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN,password:cfg.gateway?.auth?.password||process.env.BUILDERFORCE_AGENTS_GATEWAY_PASSWORD,timeoutMs:2e3,json:!0,configPath:process.env.BUILDERFORCE_AGENTS_CONFIG_PATH})).ok}catch{return!1}}function sleep(ms){return new Promise(resolve=>setTimeout(resolve,ms))}async function clearStaleGatewayProcessIfNeeded(){if((await resolveGatewayService().readRuntime(process.env).catch(()=>null))?.status===`running`)return;let port=resolveGatewayPort(loadConfig(),process.env),diagnostics=await inspectPortUsage(port).catch(()=>null);if(!diagnostics||diagnostics.status!==`busy`)return;let staleListeners=diagnostics.listeners.filter(listener=>typeof listener.pid==`number`&&classifyPortListener(listener,port)===`gateway`);if(staleListeners.length===0)return;for(let listener of staleListeners)process.kill(listener.pid);let deadline=Date.now()+5e3;for(;Date.now()<deadline;){let next=await inspectPortUsage(port).catch(()=>null);if(!(next?.status===`busy`&&next.listeners.some(listener=>typeof listener.pid==`number`&&staleListeners.some(stale=>stale.pid===listener.pid)&&classifyPortListener(listener,port)===`gateway`)))return;await sleep(100)}throw Error(`Gateway restart cleanup failed: stale listener(s) on port ${port} did not exit: ${staleListeners.map(listener=>listener.pid).join(`, `)}`)}async function runDaemonUninstall(opts={}){return await runServiceUninstall({serviceNoun:`Gateway`,service:resolveGatewayService(),opts,stopBeforeUninstall:!0,assertNotLoadedAfterUninstall:!0})}async function runDaemonStart(opts={}){return await clearStaleGatewayProcessIfNeeded(),await runServiceStart({serviceNoun:`Gateway`,service:resolveGatewayService(),renderStartHints:renderGatewayServiceStartHints,opts,waitUntilHealthy:probeGatewayHealth})}async function runDaemonStop(opts={}){return await runServiceStop({serviceNoun:`Gateway`,service:resolveGatewayService(),opts})}async function runDaemonRestart(opts={}){return await clearStaleGatewayProcessIfNeeded(),await runServiceRestart({serviceNoun:`Gateway`,service:resolveGatewayService(),renderStartHints:renderGatewayServiceStartHints,opts,checkTokenDrift:!0,waitUntilHealthy:probeGatewayHealth})}const EXTRA_MARKERS=[`builderforce`,`builderforce`,`builderforce`];function renderGatewayServiceCleanupHints(env=process.env){let profile=env.BUILDERFORCE_AGENTS_PROFILE;switch(process.platform){case`darwin`:{let label=resolveGatewayLaunchAgentLabel(profile);return[`launchctl bootout gui/$UID/${label}`,`rm ~/Library/LaunchAgents/${label}.plist`]}case`linux`:{let unit=resolveGatewaySystemdServiceName(profile);return[`systemctl --user disable --now ${unit}.service`,`rm ~/.config/systemd/user/${unit}.service`]}case`win32`:return[`schtasks /Delete /TN "${resolveGatewayWindowsTaskName(profile)}" /F`];default:return[]}}function resolveHomeDir(env){let home=env.HOME?.trim()||env.USERPROFILE?.trim();if(!home)throw Error(`Missing HOME`);return home}function detectMarker(content){let lower=content.toLowerCase();for(let marker of EXTRA_MARKERS)if(lower.includes(marker))return marker;return null}function hasGatewayServiceMarker(content){let lower=content.toLowerCase(),markerKeys=[`builderforce_service_marker`],kindKeys=[`builderforce_service_kind`],markerValues=[GATEWAY_SERVICE_MARKER.toLowerCase()],hasMarkerKey=markerKeys.some(key=>lower.includes(key)),hasKindKey=kindKeys.some(key=>lower.includes(key)),hasMarkerValue=markerValues.some(value=>lower.includes(value));return hasMarkerKey&&hasKindKey&&hasMarkerValue&&lower.includes(GATEWAY_SERVICE_KIND.toLowerCase())}function isBuilderForceAgentsGatewayLaunchdService(label,contents){return hasGatewayServiceMarker(contents)?!0:contents.toLowerCase().includes(`gateway`)?label.startsWith(`ai.builderforce.`):!1}function isBuilderForceAgentsGatewaySystemdService(name,contents){return hasGatewayServiceMarker(contents)?!0:name.startsWith(`builderforce-gateway`)?contents.toLowerCase().includes(`gateway`):!1}function isBuilderForceAgentsGatewayTaskName(name){let normalized=name.trim().toLowerCase();return normalized?normalized===resolveGatewayWindowsTaskName().toLowerCase()||normalized.startsWith(`builderforce gateway`):!1}function tryExtractPlistLabel(contents){let match=contents.match(/<key>Label<\/key>\s*<string>([\s\S]*?)<\/string>/i);return match&&match[1]?.trim()||null}function isIgnoredLaunchdLabel(label){return label===resolveGatewayLaunchAgentLabel()}function isIgnoredSystemdName(name){return name===resolveGatewaySystemdServiceName()}function isLegacyLabel(label){let lower=label.toLowerCase();return lower.includes(`builderforce`)||lower.includes(`builderforce`)}async function readDirEntries(dir){try{return await fs.readdir(dir)}catch{return[]}}async function readUtf8File(filePath){try{return await fs.readFile(filePath,`utf8`)}catch{return null}}async function scanLaunchdDir(params){let results=[],entries=await readDirEntries(params.dir);for(let entry of entries){if(!entry.endsWith(`.plist`))continue;let labelFromName=entry.replace(/\.plist$/,``);if(isIgnoredLaunchdLabel(labelFromName))continue;let fullPath=path.join(params.dir,entry),contents=await readUtf8File(fullPath);if(contents===null)continue;let marker=detectMarker(contents),label=tryExtractPlistLabel(contents)??labelFromName;if(!marker){if(!(isLegacyLabel(labelFromName)||isLegacyLabel(label)))continue;results.push({platform:`darwin`,label,detail:`plist: ${fullPath}`,scope:params.scope,marker:(isLegacyLabel(label),`builderforce`),legacy:!0});continue}isIgnoredLaunchdLabel(label)||marker===`builderforce`&&isBuilderForceAgentsGatewayLaunchdService(label,contents)||results.push({platform:`darwin`,label,detail:`plist: ${fullPath}`,scope:params.scope,marker,legacy:marker!==`builderforce`||isLegacyLabel(label)})}return results}async function scanSystemdDir(params){let results=[],entries=await readDirEntries(params.dir);for(let entry of entries){if(!entry.endsWith(`.service`))continue;let name=entry.replace(/\.service$/,``);if(isIgnoredSystemdName(name))continue;let fullPath=path.join(params.dir,entry),contents=await readUtf8File(fullPath);if(contents===null)continue;let marker=detectMarker(contents);marker&&(marker===`builderforce`&&isBuilderForceAgentsGatewaySystemdService(name,contents)||results.push({platform:`linux`,label:entry,detail:`unit: ${fullPath}`,scope:params.scope,marker,legacy:marker!==`builderforce`}))}return results}function parseSchtasksList(output){let tasks=[],current=null;for(let rawLine of output.split(/\r?\n/)){let line=rawLine.trim();if(!line){current&&=(tasks.push(current),null);continue}let idx=line.indexOf(`:`);if(idx<=0)continue;let key=line.slice(0,idx).trim().toLowerCase(),value=line.slice(idx+1).trim();if(value){if(key===`taskname`){current&&tasks.push(current),current={name:value};continue}current&&key===`task to run`&&(current.taskToRun=value)}}return current&&tasks.push(current),tasks}async function findExtraGatewayServices(env,opts={}){let results=[],seen=new Set,push=svc=>{let key=`${svc.platform}:${svc.label}:${svc.detail}:${svc.scope}`;seen.has(key)||(seen.add(key),results.push(svc))};if(process.platform===`darwin`){try{let home=resolveHomeDir(env),userDir=path.join(home,`Library`,`LaunchAgents`);for(let svc of await scanLaunchdDir({dir:userDir,scope:`user`}))push(svc);if(opts.deep){for(let svc of await scanLaunchdDir({dir:path.join(path.sep,`Library`,`LaunchAgents`),scope:`system`}))push(svc);for(let svc of await scanLaunchdDir({dir:path.join(path.sep,`Library`,`LaunchDaemons`),scope:`system`}))push(svc)}}catch{return results}return results}if(process.platform===`linux`){try{let home=resolveHomeDir(env),userDir=path.join(home,`.config`,`systemd`,`user`);for(let svc of await scanSystemdDir({dir:userDir,scope:`user`}))push(svc);if(opts.deep)for(let dir of[`/etc/systemd/system`,`/usr/lib/systemd/system`,`/lib/systemd/system`])for(let svc of await scanSystemdDir({dir,scope:`system`}))push(svc)}catch{return results}return results}if(process.platform===`win32`){if(!opts.deep)return results;let res=await execSchtasks([`/Query`,`/FO`,`LIST`,`/V`]);if(res.code!==0)return results;let tasks=parseSchtasksList(res.stdout);for(let task of tasks){let name=task.name.trim();if(!name||isBuilderForceAgentsGatewayTaskName(name))continue;let lowerName=name.toLowerCase(),lowerCommand=task.taskToRun?.toLowerCase()??``,marker=null;for(let candidate of EXTRA_MARKERS)if(lowerName.includes(candidate)||lowerCommand.includes(candidate)){marker=candidate;break}marker&&push({platform:`win32`,label:name,detail:task.taskToRun?`task: ${name}, run: ${task.taskToRun}`:name,scope:`system`,marker,legacy:marker!==`builderforce`})}return results}return results}function shouldReportPortUsage(status,rpcOk){return!(status!==`busy`||rpcOk===!0)}async function gatherDaemonStatus(opts){let service=resolveGatewayService(),[loaded,command,runtime]=await Promise.all([service.isLoaded({env:process.env}).catch(()=>!1),service.readCommand(process.env).catch(()=>null),service.readRuntime(process.env).catch(err=>({status:`unknown`,detail:String(err)}))]),configAudit=await auditGatewayServiceConfig({env:process.env,command}),serviceEnv=command?.environment??void 0,mergedDaemonEnv={...process.env,...serviceEnv??void 0},cliConfigPath=resolveConfigPath(process.env,resolveStateDir(process.env)),daemonConfigPath=resolveConfigPath(mergedDaemonEnv,resolveStateDir(mergedDaemonEnv)),cliIO=createConfigIO({env:process.env,configPath:cliConfigPath}),daemonIO=createConfigIO({env:mergedDaemonEnv,configPath:daemonConfigPath}),[cliSnapshot,daemonSnapshot]=await Promise.all([cliIO.readConfigFileSnapshot().catch(()=>null),daemonIO.readConfigFileSnapshot().catch(()=>null)]),cliCfg=cliIO.loadConfig(),daemonCfg=daemonIO.loadConfig(),cliConfigSummary={path:cliSnapshot?.path??cliConfigPath,exists:cliSnapshot?.exists??!1,valid:cliSnapshot?.valid??!0,...cliSnapshot?.issues?.length?{issues:cliSnapshot.issues}:{},controlUi:cliCfg.gateway?.controlUi},daemonConfigSummary={path:daemonSnapshot?.path??daemonConfigPath,exists:daemonSnapshot?.exists??!1,valid:daemonSnapshot?.valid??!0,...daemonSnapshot?.issues?.length?{issues:daemonSnapshot.issues}:{},controlUi:daemonCfg.gateway?.controlUi},configMismatch=cliConfigSummary.path!==daemonConfigSummary.path,portFromArgs=parsePortFromArgs(command?.programArguments),daemonPort=portFromArgs??resolveGatewayPort(daemonCfg,mergedDaemonEnv),portSource=portFromArgs?`service args`:`env/config`,bindMode=daemonCfg.gateway?.bind??`loopback`,customBindHost=daemonCfg.gateway?.customBindHost,bindHost=await resolveGatewayBindHost(bindMode,customBindHost),probeHost=pickProbeHostForBind(bindMode,pickPrimaryTailnetIPv4(),customBindHost),probeUrlOverride=typeof opts.rpc.url==`string`&&opts.rpc.url.trim().length>0?opts.rpc.url.trim():null,probeUrl=probeUrlOverride??`ws://${probeHost}:${daemonPort}`,probeNote=!probeUrlOverride&&bindMode===`lan`?`bind=lan listens on 0.0.0.0 (all interfaces); probing via ${probeHost}.`:!probeUrlOverride&&bindMode===`loopback`?`Loopback-only gateway; only local clients can connect.`:void 0,cliPort=resolveGatewayPort(cliCfg,process.env),[portDiagnostics,portCliDiagnostics]=await Promise.all([inspectPortUsage(daemonPort).catch(()=>null),cliPort===daemonPort?null:inspectPortUsage(cliPort).catch(()=>null)]),portStatus=portDiagnostics?{port:portDiagnostics.port,status:portDiagnostics.status,listeners:portDiagnostics.listeners,hints:portDiagnostics.hints}:void 0,portCliStatus=portCliDiagnostics?{port:portCliDiagnostics.port,status:portCliDiagnostics.status,listeners:portCliDiagnostics.listeners,hints:portCliDiagnostics.hints}:void 0,extraServices=await findExtraGatewayServices(process.env,{deep:!!opts.deep}).catch(()=>[]),timeoutMsRaw=Number.parseInt(String(opts.rpc.timeout??`10000`),10),timeoutMs=Number.isFinite(timeoutMsRaw)&&timeoutMsRaw>0?timeoutMsRaw:1e4,rpc=opts.probe?await probeGatewayStatus({url:probeUrl,token:opts.rpc.token||mergedDaemonEnv.BUILDERFORCE_AGENTS_GATEWAY_TOKEN||daemonCfg.gateway?.auth?.token,password:opts.rpc.password||mergedDaemonEnv.BUILDERFORCE_AGENTS_GATEWAY_PASSWORD||daemonCfg.gateway?.auth?.password,timeoutMs,json:opts.rpc.json,configPath:daemonConfigSummary.path}):void 0,lastError;return loaded&&runtime?.status===`running`&&portStatus&&portStatus.status!==`busy`&&(lastError=await readLastGatewayErrorLine(mergedDaemonEnv)??void 0),{service:{label:service.label,loaded,loadedText:service.loadedText,notLoadedText:service.notLoadedText,command,runtime,configAudit},config:{cli:cliConfigSummary,daemon:daemonConfigSummary,...configMismatch?{mismatch:!0}:{}},gateway:{bindMode,bindHost,customBindHost,port:daemonPort,portSource,probeUrl,...probeNote?{probeNote}:{}},port:portStatus,...portCliStatus?{portCli:portCliStatus}:{},lastError,...rpc?{rpc:{...rpc,url:probeUrl}}:{},extraServices}}function renderPortDiagnosticsForCli(status,rpcOk){return!status.port||!shouldReportPortUsage(status.port.status,rpcOk)?[]:formatPortDiagnostics({port:status.port.port,status:status.port.status,listeners:status.port.listeners,hints:status.port.hints})}function resolvePortListeningAddresses(status){return Array.from(new Set(status.port?.listeners?.map(l=>l.address?normalizeListenerAddress(l.address):``).filter(v=>!!v)??[]))}function sanitizeDaemonStatusForJson(status){let command=status.service.command;if(!command?.environment)return status;let safeEnv=filterDaemonEnv(command.environment),nextCommand={...command,environment:Object.keys(safeEnv).length>0?safeEnv:void 0};return{...status,service:{...status.service,command:nextCommand}}}function printDaemonStatus(status,opts){if(opts.json){let sanitized=sanitizeDaemonStatusForJson(status);defaultRuntime.log(JSON.stringify(sanitized,null,2));return}let{rich,label,accent,infoText,okText,warnText,errorText}=createCliStatusTextStyles(),spacer=()=>defaultRuntime.log(``),{service,rpc,extraServices}=status,serviceStatus=service.loaded?okText(service.loadedText):warnText(service.notLoadedText);defaultRuntime.log(`${label(`Service:`)} ${accent(service.label)} (${serviceStatus})`);try{let logFile=getResolvedLoggerSettings().file;defaultRuntime.log(`${label(`File logs:`)} ${infoText(shortenHomePath(logFile))}`)}catch{}service.command?.programArguments?.length&&defaultRuntime.log(`${label(`Command:`)} ${infoText(service.command.programArguments.join(` `))}`),service.command?.sourcePath&&defaultRuntime.log(`${label(`Service file:`)} ${infoText(shortenHomePath(service.command.sourcePath))}`),service.command?.workingDirectory&&defaultRuntime.log(`${label(`Working dir:`)} ${infoText(shortenHomePath(service.command.workingDirectory))}`);let daemonEnvLines=safeDaemonEnv(service.command?.environment);if(daemonEnvLines.length>0&&defaultRuntime.log(`${label(`Service env:`)} ${daemonEnvLines.join(` `)}`),spacer(),service.configAudit?.issues.length){defaultRuntime.error(warnText(`Service config looks out of date or non-standard.`));for(let issue of service.configAudit.issues){let detail=issue.detail?` (${issue.detail})`:``;defaultRuntime.error(`${warnText(`Service config issue:`)} ${issue.message}${detail}`)}defaultRuntime.error(warnText(`Recommendation: run "${formatCliCommand(`builderforce doctor`)}" (or "${formatCliCommand(`builderforce doctor --repair`)}").`))}if(status.config){let cliCfg=`${shortenHomePath(status.config.cli.path)}${status.config.cli.exists?``:` (missing)`}${status.config.cli.valid?``:` (invalid)`}`;if(defaultRuntime.log(`${label(`Config (cli):`)} ${infoText(cliCfg)}`),!status.config.cli.valid&&status.config.cli.issues?.length)for(let issue of status.config.cli.issues.slice(0,5))defaultRuntime.error(`${errorText(`Config issue:`)} ${issue.path||`<root>`}: ${issue.message}`);if(status.config.daemon){let daemonCfg=`${shortenHomePath(status.config.daemon.path)}${status.config.daemon.exists?``:` (missing)`}${status.config.daemon.valid?``:` (invalid)`}`;if(defaultRuntime.log(`${label(`Config (service):`)} ${infoText(daemonCfg)}`),!status.config.daemon.valid&&status.config.daemon.issues?.length)for(let issue of status.config.daemon.issues.slice(0,5))defaultRuntime.error(`${errorText(`Service config issue:`)} ${issue.path||`<root>`}: ${issue.message}`)}status.config.mismatch&&(defaultRuntime.error(errorText(`Root cause: CLI and service are using different config paths (likely a profile/state-dir mismatch).`)),defaultRuntime.error(errorText(`Fix: rerun \`${formatCliCommand(`builderforce gateway install --force`)}\` from the same --profile / BUILDERFORCE_AGENTS_STATE_DIR you expect.`))),spacer()}if(status.gateway){let bindHost=status.gateway.bindHost??`n/a`;if(defaultRuntime.log(`${label(`Gateway:`)} bind=${infoText(status.gateway.bindMode)} (${infoText(bindHost)}), port=${infoText(String(status.gateway.port))} (${infoText(status.gateway.portSource)})`),defaultRuntime.log(`${label(`Probe target:`)} ${infoText(status.gateway.probeUrl)}`),!(status.config?.daemon?.controlUi?.enabled??!0))defaultRuntime.log(`${label(`Dashboard:`)} ${warnText(`disabled`)}`);else{let links=resolveControlUiLinks({port:status.gateway.port,bind:status.gateway.bindMode,customBindHost:status.gateway.customBindHost,basePath:status.config?.daemon?.controlUi?.basePath});defaultRuntime.log(`${label(`Dashboard:`)} ${infoText(links.httpUrl)}`)}status.gateway.probeNote&&defaultRuntime.log(`${label(`Probe note:`)} ${infoText(status.gateway.probeNote)}`),spacer()}let runtimeLine=formatRuntimeStatus(service.runtime);if(runtimeLine){let runtimeColor=resolveRuntimeStatusColor(service.runtime?.status);defaultRuntime.log(`${label(`Runtime:`)} ${colorize(rich,runtimeColor,runtimeLine)}`)}if(rpc&&!rpc.ok&&service.loaded&&service.runtime?.status===`running`&&defaultRuntime.log(warnText(`Warm-up: launch agents can take a few seconds. Try again shortly.`)),rpc){if(rpc.ok)defaultRuntime.log(`${label(`RPC probe:`)} ${okText(`ok`)}`);else{defaultRuntime.error(`${label(`RPC probe:`)} ${errorText(`failed`)}`),rpc.url&&defaultRuntime.error(`${label(`RPC target:`)} ${rpc.url}`);let lines=String(rpc.error??`unknown`).split(/\r?\n/).filter(Boolean);for(let line of lines.slice(0,12))defaultRuntime.error(` ${errorText(line)}`)}spacer()}if(process.platform===`linux`&&isSystemdUnavailableDetail(service.runtime?.detail)){defaultRuntime.error(errorText(`systemd user services unavailable.`));for(let hint of renderSystemdUnavailableHints({wsl:isWSLEnv()}))defaultRuntime.error(errorText(hint));spacer()}if(service.runtime?.missingUnit){defaultRuntime.error(errorText(`Service unit not found.`));for(let hint of renderRuntimeHints(service.runtime))defaultRuntime.error(errorText(hint))}else if(service.loaded&&service.runtime?.status===`stopped`){defaultRuntime.error(errorText(`Service is loaded but not running (likely exited immediately).`));for(let hint of renderRuntimeHints(service.runtime,service.command?.environment??process.env))defaultRuntime.error(errorText(hint));spacer()}if(service.runtime?.cachedLabel){let labelValue=resolveGatewayLaunchAgentLabel((service.command?.environment??process.env).BUILDERFORCE_AGENTS_PROFILE);defaultRuntime.error(errorText(`LaunchAgent label cached but plist missing. Clear with: launchctl bootout gui/$UID/${labelValue}`)),defaultRuntime.error(errorText(`Then reinstall: ${formatCliCommand(`builderforce gateway install`)}`)),spacer()}for(let line of renderPortDiagnosticsForCli(status,rpc?.ok))defaultRuntime.error(errorText(line));if(status.port){let addrs=resolvePortListeningAddresses(status);addrs.length>0&&defaultRuntime.log(`${label(`Listening:`)} ${infoText(addrs.join(`, `))}`)}if(status.portCli&&status.portCli.port!==status.port?.port&&defaultRuntime.log(`${label(`Note:`)} CLI config resolves gateway port=${status.portCli.port} (${status.portCli.status}).`),service.loaded&&service.runtime?.status===`running`&&status.port&&status.port.status!==`busy`){if(defaultRuntime.error(errorText(`Gateway port ${status.port.port} is not listening (service appears running).`)),status.lastError&&defaultRuntime.error(`${errorText(`Last gateway error:`)} ${status.lastError}`),process.platform===`linux`){let unit=resolveGatewaySystemdServiceName((service.command?.environment??process.env).BUILDERFORCE_AGENTS_PROFILE);defaultRuntime.error(errorText(`Logs: journalctl --user -u ${unit}.service -n 200 --no-pager`))}else if(process.platform===`darwin`){let logs=resolveGatewayLogPaths(service.command?.environment??process.env);defaultRuntime.error(`${errorText(`Logs:`)} ${shortenHomePath(logs.stdoutPath)}`),defaultRuntime.error(`${errorText(`Errors:`)} ${shortenHomePath(logs.stderrPath)}`)}spacer()}if(extraServices.length>0){defaultRuntime.error(errorText(`Other gateway-like services detected (best effort):`));for(let svc of extraServices)defaultRuntime.error(`- ${errorText(svc.label)} (${svc.scope}, ${svc.detail})`);for(let hint of renderGatewayServiceCleanupHints())defaultRuntime.error(`${errorText(`Cleanup hint:`)} ${hint}`);spacer()}extraServices.length>0&&(defaultRuntime.error(errorText(`Recommendation: run a single gateway per machine for most setups. One gateway supports multiple agents (see docs: /gateway#multiple-gateways-same-host).`)),defaultRuntime.error(errorText(`If you need multiple gateways (e.g., a rescue bot on the same host), isolate ports + config/state (see docs: /gateway#multiple-gateways-same-host).`)),spacer()),defaultRuntime.log(`${label(`Troubles:`)} run ${formatCliCommand(`builderforce status`)}`),defaultRuntime.log(`${label(`Troubleshooting:`)} https://docs.builderforce.ai/troubleshooting`)}async function runDaemonStatus(opts){try{printDaemonStatus(await gatherDaemonStatus({rpc:opts.rpc,probe:!!opts.probe,deep:!!opts.deep}),{json:!!opts.json})}catch(err){let rich=isRich();defaultRuntime.error(colorize(rich,theme.error,`Gateway status failed: ${String(err)}`)),defaultRuntime.exit(1)}}function resolveInstallOptions(cmdOpts,command){let parentForce=inheritOptionFromParent(command,`force`),parentPort=inheritOptionFromParent(command,`port`),parentToken=inheritOptionFromParent(command,`token`),parentCron=inheritOptionFromParent(command,`cron`);return{...cmdOpts,force:!!(cmdOpts.force||parentForce),port:cmdOpts.port??parentPort,token:cmdOpts.token??parentToken,noCron:cmdOpts.cron===!1||parentCron===!1}}function resolveRpcOptions(cmdOpts,command){let parentToken=inheritOptionFromParent(command,`token`),parentPassword=inheritOptionFromParent(command,`password`);return{...cmdOpts,token:cmdOpts.token??parentToken,password:cmdOpts.password??parentPassword}}function addGatewayServiceCommands(parent,opts){parent.command(`status`).description(opts?.statusDescription??`Show gateway service status + probe the Gateway`).option(`--url <url>`,`Gateway WebSocket URL (defaults to config/remote/local)`).option(`--token <token>`,`Gateway token (if required)`).option(`--password <password>`,`Gateway password (password auth)`).option(`--timeout <ms>`,`Timeout in ms`,`10000`).option(`--no-probe`,`Skip RPC probe`).option(`--deep`,`Scan system-level services`,!1).option(`--json`,`Output JSON`,!1).action(async(cmdOpts,command)=>{await runDaemonStatus({rpc:resolveRpcOptions(cmdOpts,command),probe:!!cmdOpts.probe,deep:!!cmdOpts.deep,json:!!cmdOpts.json})}),parent.command(`install`).description(`Install the Gateway service (launchd/systemd/schtasks)`).option(`--port <port>`,`Gateway port`).option(`--runtime <runtime>`,`Daemon runtime (node|bun). Default: node`).option(`--token <token>`,`Gateway token (token auth)`).option(`--no-cron`,`Disable cron scheduler (cron.enabled: false) to reduce gateway activity`,!0).option(`--force`,`Reinstall/overwrite if already installed`,!1).option(`--json`,`Output JSON`,!1).action(async(cmdOpts,command)=>{await runDaemonInstall(resolveInstallOptions(cmdOpts,command))}),parent.command(`uninstall`).description(`Uninstall the Gateway service (launchd/systemd/schtasks)`).option(`--json`,`Output JSON`,!1).action(async cmdOpts=>{await runDaemonUninstall(cmdOpts)}),parent.command(`start`).description(`Start the Gateway service (launchd/systemd/schtasks)`).option(`--json`,`Output JSON`,!1).action(async cmdOpts=>{await runDaemonStart(cmdOpts)}),parent.command(`stop`).description(`Stop the Gateway service (launchd/systemd/schtasks)`).option(`--json`,`Output JSON`,!1).action(async cmdOpts=>{await runDaemonStop(cmdOpts)}),parent.command(`restart`).description(`Restart the Gateway service (launchd/systemd/schtasks)`).option(`--json`,`Output JSON`,!1).action(async cmdOpts=>{await runDaemonRestart(cmdOpts)})}function registerDaemonCli(program){addGatewayServiceCommands(program.command(`daemon`).description(`Manage the Gateway service (launchd/systemd/schtasks)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/gateway`,`docs.builderforce.ai/cli/gateway`)}\n`),{statusDescription:`Show service install status + probe the Gateway`})}export{renderGatewayServiceCleanupHints as a,runDaemonStop as c,findExtraGatewayServices as i,runDaemonUninstall as l,addGatewayServiceCommands as n,runDaemonRestart as o,runDaemonStatus as r,runDaemonStart as s,registerDaemonCli as t,runDaemonInstall as u};
1
+ import{d as resolveIsNixMode,g as resolveStateDir,o as resolveConfigPath,u as resolveGatewayPort}from"./paths-5FcIFMsj.js";import{B as theme,C as shortenHomePath,G as getResolvedLoggerSettings,R as colorize,z as isRich}from"./utils-DbaBVFaK.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{a as readConfigFileSnapshot,c as writeConfigFile,n as createConfigIO,r as loadConfig}from"./io-BLBq4T2o.js";import{i as resolveGatewayAuth}from"./auth-lebUHrkd.js";import{n as pickPrimaryTailnetIPv4}from"./tailnet-CTj65CYb.js";import{u as resolveGatewayBindHost}from"./ws-Bbu03j3h.js";import{a as inspectPortUsage,c as formatPortDiagnostics,s as classifyPortListener}from"./ports-DgmEDNOm.js";import{h as GATEWAY_CLIENT_NAMES,m as GATEWAY_CLIENT_MODES}from"./message-channel-D_jXxXQj.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName,n as GATEWAY_SERVICE_KIND,r as GATEWAY_SERVICE_MARKER}from"./constants-BBbGeL3t.js";import{n as callGateway}from"./call-T8ciwMTA.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import{n as withProgress}from"./progress-BfOtdN6b.js";import{g as resolveControlUiLinks,m as randomToken}from"./onboard-helpers-CiHzTaFX.js";import{n as isWSLEnv}from"./wsl-DkYsHmN5.js";import{n as inheritOptionFromParent}from"./command-options-DzGFCQYs.js";import{i as buildGatewayInstallPlan,r as isGatewayDaemonRuntime,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-9XitJmIL.js";import{n as execSchtasks,s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-D-NLDyK3.js";import{S as installDaemonServiceAndEmit,_ as resolveRuntimeStatusColor,a as isSystemdUnavailableDetail,b as buildDaemonServiceSnapshot,c as auditGatewayServiceConfig,d as filterDaemonEnv,f as normalizeListenerAddress,g as renderRuntimeHints,h as renderGatewayServiceStartHints,i as runServiceUninstall,m as pickProbeHostForBind,n as runServiceStart,o as renderSystemdUnavailableHints,p as parsePortFromArgs,r as runServiceStop,t as runServiceRestart,u as createCliStatusTextStyles,v as safeDaemonEnv,x as createDaemonActionContext,y as formatRuntimeStatus}from"./lifecycle-core-uxjxTzFv.js";import{t as readLastGatewayErrorLine}from"./diagnostics-DCjg0nBH.js";import{t as parsePort}from"./parse-port-nw1R44xn.js";import path from"node:path";import fs from"node:fs/promises";async function runDaemonInstall(opts){let json=!!opts.json,{stdout,warnings,emit,fail}=createDaemonActionContext({action:`install`,json});if(resolveIsNixMode(process.env)){fail(`Nix mode detected; service install is disabled.`);return}let cfg=loadConfig(),portOverride=parsePort(opts.port);if(opts.port!==void 0&&portOverride===null){fail(`Invalid port`);return}let port=portOverride??resolveGatewayPort(cfg);if(!Number.isFinite(port)||port<=0){fail(`Invalid port`);return}let runtimeRaw=opts.runtime?String(opts.runtime):DEFAULT_GATEWAY_DAEMON_RUNTIME;if(!isGatewayDaemonRuntime(runtimeRaw)){fail(`Invalid --runtime (use "node" or "bun")`);return}let service=resolveGatewayService(),loaded=!1;try{loaded=await service.isLoaded({env:process.env})}catch(err){fail(`Gateway service check failed: ${String(err)}`);return}if(loaded&&!opts.force){emit({ok:!0,result:`already-installed`,message:`Gateway service already ${service.loadedText}.`,service:buildDaemonServiceSnapshot(service,loaded)}),json||(defaultRuntime.log(`Gateway service already ${service.loadedText}.`),defaultRuntime.log(`Reinstall with: ${formatCliCommand(`builderforce gateway install --force`)}`));return}let resolvedAuth=resolveGatewayAuth({authConfig:cfg.gateway?.auth,tailscaleMode:cfg.gateway?.tailscale?.mode??`off`}),needsToken=resolvedAuth.mode===`token`&&!resolvedAuth.token&&!resolvedAuth.allowTailscale,token=opts.token||cfg.gateway?.auth?.token||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN;if(!token&&needsToken){token=randomToken();let warnMsg=`No gateway token found. Auto-generated one and saving to config.`;json?warnings.push(warnMsg):defaultRuntime.log(warnMsg);try{let snapshot=await readConfigFileSnapshot();if(snapshot.exists&&!snapshot.valid){let msg=`Warning: config file exists but is invalid; skipping token persistence.`;json?warnings.push(msg):defaultRuntime.log(msg)}else{let baseConfig=snapshot.exists?snapshot.config:{};baseConfig.gateway?.auth?.token?token=baseConfig.gateway.auth.token:await writeConfigFile({...baseConfig,gateway:{...baseConfig.gateway,auth:{...baseConfig.gateway?.auth,mode:baseConfig.gateway?.auth?.mode??`token`,token}}})}}catch(err){let msg=`Warning: could not persist token to config: ${String(err)}`;json?warnings.push(msg):defaultRuntime.log(msg)}}if(opts.noCron)try{let snapshot=await readConfigFileSnapshot();if(snapshot.exists&&!snapshot.valid){let msg=`Warning: config file exists but is invalid; skipping cron.enabled persistence.`;json?warnings.push(msg):defaultRuntime.log(msg)}else{let baseConfig=snapshot.exists?snapshot.config:{},currentCron=baseConfig.cron;currentCron?.enabled!==!1&&(await writeConfigFile({...baseConfig,cron:{...currentCron,enabled:!1}}),json||defaultRuntime.log(`Set cron.enabled: false in config (scheduled jobs disabled).`))}}catch(err){let msg=`Warning: could not persist cron.enabled: ${String(err)}`;json?warnings.push(msg):defaultRuntime.log(msg)}let{programArguments,workingDirectory,environment}=await buildGatewayInstallPlan({env:process.env,port,token,runtime:runtimeRaw,warn:message=>{json?warnings.push(message):defaultRuntime.log(message)},config:cfg});await installDaemonServiceAndEmit({serviceNoun:`Gateway`,service,warnings,emit,fail,install:async()=>{await service.install({env:process.env,stdout,programArguments,workingDirectory,environment})}})}async function probeGatewayStatus(opts){try{return await withProgress({label:`Checking gateway status...`,indeterminate:!0,enabled:opts.json!==!0},async()=>await callGateway({url:opts.url,token:opts.token,password:opts.password,method:`status`,timeoutMs:opts.timeoutMs,clientName:GATEWAY_CLIENT_NAMES.CLI,mode:GATEWAY_CLIENT_MODES.CLI,...opts.configPath?{configPath:opts.configPath}:{}})),{ok:!0}}catch(err){return{ok:!1,error:err instanceof Error?err.message:String(err)}}}async function probeGatewayHealth(){try{let cfg=loadConfig(),bindMode=cfg.gateway?.bind??`loopback`,customBindHost=typeof cfg.gateway?.customBindHost==`string`?cfg.gateway.customBindHost:void 0,probeHost=pickProbeHostForBind(bindMode,pickPrimaryTailnetIPv4(),customBindHost),port=resolveGatewayPort(cfg,process.env),resolvedBindHost=await resolveGatewayBindHost(bindMode,customBindHost);return(await probeGatewayStatus({url:`ws://${probeHost||resolvedBindHost}:${port}`,token:cfg.gateway?.auth?.token||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN,password:cfg.gateway?.auth?.password||process.env.BUILDERFORCE_AGENTS_GATEWAY_PASSWORD,timeoutMs:2e3,json:!0,configPath:process.env.BUILDERFORCE_AGENTS_CONFIG_PATH})).ok}catch{return!1}}function sleep(ms){return new Promise(resolve=>setTimeout(resolve,ms))}async function clearStaleGatewayProcessIfNeeded(){if((await resolveGatewayService().readRuntime(process.env).catch(()=>null))?.status===`running`)return;let port=resolveGatewayPort(loadConfig(),process.env),diagnostics=await inspectPortUsage(port).catch(()=>null);if(!diagnostics||diagnostics.status!==`busy`)return;let staleListeners=diagnostics.listeners.filter(listener=>typeof listener.pid==`number`&&classifyPortListener(listener,port)===`gateway`);if(staleListeners.length===0)return;for(let listener of staleListeners)process.kill(listener.pid);let deadline=Date.now()+5e3;for(;Date.now()<deadline;){let next=await inspectPortUsage(port).catch(()=>null);if(!(next?.status===`busy`&&next.listeners.some(listener=>typeof listener.pid==`number`&&staleListeners.some(stale=>stale.pid===listener.pid)&&classifyPortListener(listener,port)===`gateway`)))return;await sleep(100)}throw Error(`Gateway restart cleanup failed: stale listener(s) on port ${port} did not exit: ${staleListeners.map(listener=>listener.pid).join(`, `)}`)}async function runDaemonUninstall(opts={}){return await runServiceUninstall({serviceNoun:`Gateway`,service:resolveGatewayService(),opts,stopBeforeUninstall:!0,assertNotLoadedAfterUninstall:!0})}async function runDaemonStart(opts={}){return await clearStaleGatewayProcessIfNeeded(),await runServiceStart({serviceNoun:`Gateway`,service:resolveGatewayService(),renderStartHints:renderGatewayServiceStartHints,opts,waitUntilHealthy:probeGatewayHealth})}async function runDaemonStop(opts={}){return await runServiceStop({serviceNoun:`Gateway`,service:resolveGatewayService(),opts})}async function runDaemonRestart(opts={}){return await clearStaleGatewayProcessIfNeeded(),await runServiceRestart({serviceNoun:`Gateway`,service:resolveGatewayService(),renderStartHints:renderGatewayServiceStartHints,opts,checkTokenDrift:!0,waitUntilHealthy:probeGatewayHealth})}const EXTRA_MARKERS=[`builderforce`,`builderforce`,`builderforce`];function renderGatewayServiceCleanupHints(env=process.env){let profile=env.BUILDERFORCE_AGENTS_PROFILE;switch(process.platform){case`darwin`:{let label=resolveGatewayLaunchAgentLabel(profile);return[`launchctl bootout gui/$UID/${label}`,`rm ~/Library/LaunchAgents/${label}.plist`]}case`linux`:{let unit=resolveGatewaySystemdServiceName(profile);return[`systemctl --user disable --now ${unit}.service`,`rm ~/.config/systemd/user/${unit}.service`]}case`win32`:return[`schtasks /Delete /TN "${resolveGatewayWindowsTaskName(profile)}" /F`];default:return[]}}function resolveHomeDir(env){let home=env.HOME?.trim()||env.USERPROFILE?.trim();if(!home)throw Error(`Missing HOME`);return home}function detectMarker(content){let lower=content.toLowerCase();for(let marker of EXTRA_MARKERS)if(lower.includes(marker))return marker;return null}function hasGatewayServiceMarker(content){let lower=content.toLowerCase(),markerKeys=[`builderforce_service_marker`],kindKeys=[`builderforce_service_kind`],markerValues=[GATEWAY_SERVICE_MARKER.toLowerCase()],hasMarkerKey=markerKeys.some(key=>lower.includes(key)),hasKindKey=kindKeys.some(key=>lower.includes(key)),hasMarkerValue=markerValues.some(value=>lower.includes(value));return hasMarkerKey&&hasKindKey&&hasMarkerValue&&lower.includes(GATEWAY_SERVICE_KIND.toLowerCase())}function isBuilderForceAgentsGatewayLaunchdService(label,contents){return hasGatewayServiceMarker(contents)?!0:contents.toLowerCase().includes(`gateway`)?label.startsWith(`ai.builderforce.`):!1}function isBuilderForceAgentsGatewaySystemdService(name,contents){return hasGatewayServiceMarker(contents)?!0:name.startsWith(`builderforce-gateway`)?contents.toLowerCase().includes(`gateway`):!1}function isBuilderForceAgentsGatewayTaskName(name){let normalized=name.trim().toLowerCase();return normalized?normalized===resolveGatewayWindowsTaskName().toLowerCase()||normalized.startsWith(`builderforce gateway`):!1}function tryExtractPlistLabel(contents){let match=contents.match(/<key>Label<\/key>\s*<string>([\s\S]*?)<\/string>/i);return match&&match[1]?.trim()||null}function isIgnoredLaunchdLabel(label){return label===resolveGatewayLaunchAgentLabel()}function isIgnoredSystemdName(name){return name===resolveGatewaySystemdServiceName()}function isLegacyLabel(label){let lower=label.toLowerCase();return lower.includes(`builderforce`)||lower.includes(`builderforce`)}async function readDirEntries(dir){try{return await fs.readdir(dir)}catch{return[]}}async function readUtf8File(filePath){try{return await fs.readFile(filePath,`utf8`)}catch{return null}}async function scanLaunchdDir(params){let results=[],entries=await readDirEntries(params.dir);for(let entry of entries){if(!entry.endsWith(`.plist`))continue;let labelFromName=entry.replace(/\.plist$/,``);if(isIgnoredLaunchdLabel(labelFromName))continue;let fullPath=path.join(params.dir,entry),contents=await readUtf8File(fullPath);if(contents===null)continue;let marker=detectMarker(contents),label=tryExtractPlistLabel(contents)??labelFromName;if(!marker){if(!(isLegacyLabel(labelFromName)||isLegacyLabel(label)))continue;results.push({platform:`darwin`,label,detail:`plist: ${fullPath}`,scope:params.scope,marker:(isLegacyLabel(label),`builderforce`),legacy:!0});continue}isIgnoredLaunchdLabel(label)||marker===`builderforce`&&isBuilderForceAgentsGatewayLaunchdService(label,contents)||results.push({platform:`darwin`,label,detail:`plist: ${fullPath}`,scope:params.scope,marker,legacy:marker!==`builderforce`||isLegacyLabel(label)})}return results}async function scanSystemdDir(params){let results=[],entries=await readDirEntries(params.dir);for(let entry of entries){if(!entry.endsWith(`.service`))continue;let name=entry.replace(/\.service$/,``);if(isIgnoredSystemdName(name))continue;let fullPath=path.join(params.dir,entry),contents=await readUtf8File(fullPath);if(contents===null)continue;let marker=detectMarker(contents);marker&&(marker===`builderforce`&&isBuilderForceAgentsGatewaySystemdService(name,contents)||results.push({platform:`linux`,label:entry,detail:`unit: ${fullPath}`,scope:params.scope,marker,legacy:marker!==`builderforce`}))}return results}function parseSchtasksList(output){let tasks=[],current=null;for(let rawLine of output.split(/\r?\n/)){let line=rawLine.trim();if(!line){current&&=(tasks.push(current),null);continue}let idx=line.indexOf(`:`);if(idx<=0)continue;let key=line.slice(0,idx).trim().toLowerCase(),value=line.slice(idx+1).trim();if(value){if(key===`taskname`){current&&tasks.push(current),current={name:value};continue}current&&key===`task to run`&&(current.taskToRun=value)}}return current&&tasks.push(current),tasks}async function findExtraGatewayServices(env,opts={}){let results=[],seen=new Set,push=svc=>{let key=`${svc.platform}:${svc.label}:${svc.detail}:${svc.scope}`;seen.has(key)||(seen.add(key),results.push(svc))};if(process.platform===`darwin`){try{let home=resolveHomeDir(env),userDir=path.join(home,`Library`,`LaunchAgents`);for(let svc of await scanLaunchdDir({dir:userDir,scope:`user`}))push(svc);if(opts.deep){for(let svc of await scanLaunchdDir({dir:path.join(path.sep,`Library`,`LaunchAgents`),scope:`system`}))push(svc);for(let svc of await scanLaunchdDir({dir:path.join(path.sep,`Library`,`LaunchDaemons`),scope:`system`}))push(svc)}}catch{return results}return results}if(process.platform===`linux`){try{let home=resolveHomeDir(env),userDir=path.join(home,`.config`,`systemd`,`user`);for(let svc of await scanSystemdDir({dir:userDir,scope:`user`}))push(svc);if(opts.deep)for(let dir of[`/etc/systemd/system`,`/usr/lib/systemd/system`,`/lib/systemd/system`])for(let svc of await scanSystemdDir({dir,scope:`system`}))push(svc)}catch{return results}return results}if(process.platform===`win32`){if(!opts.deep)return results;let res=await execSchtasks([`/Query`,`/FO`,`LIST`,`/V`]);if(res.code!==0)return results;let tasks=parseSchtasksList(res.stdout);for(let task of tasks){let name=task.name.trim();if(!name||isBuilderForceAgentsGatewayTaskName(name))continue;let lowerName=name.toLowerCase(),lowerCommand=task.taskToRun?.toLowerCase()??``,marker=null;for(let candidate of EXTRA_MARKERS)if(lowerName.includes(candidate)||lowerCommand.includes(candidate)){marker=candidate;break}marker&&push({platform:`win32`,label:name,detail:task.taskToRun?`task: ${name}, run: ${task.taskToRun}`:name,scope:`system`,marker,legacy:marker!==`builderforce`})}return results}return results}function shouldReportPortUsage(status,rpcOk){return!(status!==`busy`||rpcOk===!0)}async function gatherDaemonStatus(opts){let service=resolveGatewayService(),[loaded,command,runtime]=await Promise.all([service.isLoaded({env:process.env}).catch(()=>!1),service.readCommand(process.env).catch(()=>null),service.readRuntime(process.env).catch(err=>({status:`unknown`,detail:String(err)}))]),configAudit=await auditGatewayServiceConfig({env:process.env,command}),serviceEnv=command?.environment??void 0,mergedDaemonEnv={...process.env,...serviceEnv??void 0},cliConfigPath=resolveConfigPath(process.env,resolveStateDir(process.env)),daemonConfigPath=resolveConfigPath(mergedDaemonEnv,resolveStateDir(mergedDaemonEnv)),cliIO=createConfigIO({env:process.env,configPath:cliConfigPath}),daemonIO=createConfigIO({env:mergedDaemonEnv,configPath:daemonConfigPath}),[cliSnapshot,daemonSnapshot]=await Promise.all([cliIO.readConfigFileSnapshot().catch(()=>null),daemonIO.readConfigFileSnapshot().catch(()=>null)]),cliCfg=cliIO.loadConfig(),daemonCfg=daemonIO.loadConfig(),cliConfigSummary={path:cliSnapshot?.path??cliConfigPath,exists:cliSnapshot?.exists??!1,valid:cliSnapshot?.valid??!0,...cliSnapshot?.issues?.length?{issues:cliSnapshot.issues}:{},controlUi:cliCfg.gateway?.controlUi},daemonConfigSummary={path:daemonSnapshot?.path??daemonConfigPath,exists:daemonSnapshot?.exists??!1,valid:daemonSnapshot?.valid??!0,...daemonSnapshot?.issues?.length?{issues:daemonSnapshot.issues}:{},controlUi:daemonCfg.gateway?.controlUi},configMismatch=cliConfigSummary.path!==daemonConfigSummary.path,portFromArgs=parsePortFromArgs(command?.programArguments),daemonPort=portFromArgs??resolveGatewayPort(daemonCfg,mergedDaemonEnv),portSource=portFromArgs?`service args`:`env/config`,bindMode=daemonCfg.gateway?.bind??`loopback`,customBindHost=daemonCfg.gateway?.customBindHost,bindHost=await resolveGatewayBindHost(bindMode,customBindHost),probeHost=pickProbeHostForBind(bindMode,pickPrimaryTailnetIPv4(),customBindHost),probeUrlOverride=typeof opts.rpc.url==`string`&&opts.rpc.url.trim().length>0?opts.rpc.url.trim():null,probeUrl=probeUrlOverride??`ws://${probeHost}:${daemonPort}`,probeNote=!probeUrlOverride&&bindMode===`lan`?`bind=lan listens on 0.0.0.0 (all interfaces); probing via ${probeHost}.`:!probeUrlOverride&&bindMode===`loopback`?`Loopback-only gateway; only local clients can connect.`:void 0,cliPort=resolveGatewayPort(cliCfg,process.env),[portDiagnostics,portCliDiagnostics]=await Promise.all([inspectPortUsage(daemonPort).catch(()=>null),cliPort===daemonPort?null:inspectPortUsage(cliPort).catch(()=>null)]),portStatus=portDiagnostics?{port:portDiagnostics.port,status:portDiagnostics.status,listeners:portDiagnostics.listeners,hints:portDiagnostics.hints}:void 0,portCliStatus=portCliDiagnostics?{port:portCliDiagnostics.port,status:portCliDiagnostics.status,listeners:portCliDiagnostics.listeners,hints:portCliDiagnostics.hints}:void 0,extraServices=await findExtraGatewayServices(process.env,{deep:!!opts.deep}).catch(()=>[]),timeoutMsRaw=Number.parseInt(String(opts.rpc.timeout??`10000`),10),timeoutMs=Number.isFinite(timeoutMsRaw)&&timeoutMsRaw>0?timeoutMsRaw:1e4,rpc=opts.probe?await probeGatewayStatus({url:probeUrl,token:opts.rpc.token||mergedDaemonEnv.BUILDERFORCE_AGENTS_GATEWAY_TOKEN||daemonCfg.gateway?.auth?.token,password:opts.rpc.password||mergedDaemonEnv.BUILDERFORCE_AGENTS_GATEWAY_PASSWORD||daemonCfg.gateway?.auth?.password,timeoutMs,json:opts.rpc.json,configPath:daemonConfigSummary.path}):void 0,lastError;return loaded&&runtime?.status===`running`&&portStatus&&portStatus.status!==`busy`&&(lastError=await readLastGatewayErrorLine(mergedDaemonEnv)??void 0),{service:{label:service.label,loaded,loadedText:service.loadedText,notLoadedText:service.notLoadedText,command,runtime,configAudit},config:{cli:cliConfigSummary,daemon:daemonConfigSummary,...configMismatch?{mismatch:!0}:{}},gateway:{bindMode,bindHost,customBindHost,port:daemonPort,portSource,probeUrl,...probeNote?{probeNote}:{}},port:portStatus,...portCliStatus?{portCli:portCliStatus}:{},lastError,...rpc?{rpc:{...rpc,url:probeUrl}}:{},extraServices}}function renderPortDiagnosticsForCli(status,rpcOk){return!status.port||!shouldReportPortUsage(status.port.status,rpcOk)?[]:formatPortDiagnostics({port:status.port.port,status:status.port.status,listeners:status.port.listeners,hints:status.port.hints})}function resolvePortListeningAddresses(status){return Array.from(new Set(status.port?.listeners?.map(l=>l.address?normalizeListenerAddress(l.address):``).filter(v=>!!v)??[]))}function sanitizeDaemonStatusForJson(status){let command=status.service.command;if(!command?.environment)return status;let safeEnv=filterDaemonEnv(command.environment),nextCommand={...command,environment:Object.keys(safeEnv).length>0?safeEnv:void 0};return{...status,service:{...status.service,command:nextCommand}}}function printDaemonStatus(status,opts){if(opts.json){let sanitized=sanitizeDaemonStatusForJson(status);defaultRuntime.log(JSON.stringify(sanitized,null,2));return}let{rich,label,accent,infoText,okText,warnText,errorText}=createCliStatusTextStyles(),spacer=()=>defaultRuntime.log(``),{service,rpc,extraServices}=status,serviceStatus=service.loaded?okText(service.loadedText):warnText(service.notLoadedText);defaultRuntime.log(`${label(`Service:`)} ${accent(service.label)} (${serviceStatus})`);try{let logFile=getResolvedLoggerSettings().file;defaultRuntime.log(`${label(`File logs:`)} ${infoText(shortenHomePath(logFile))}`)}catch{}service.command?.programArguments?.length&&defaultRuntime.log(`${label(`Command:`)} ${infoText(service.command.programArguments.join(` `))}`),service.command?.sourcePath&&defaultRuntime.log(`${label(`Service file:`)} ${infoText(shortenHomePath(service.command.sourcePath))}`),service.command?.workingDirectory&&defaultRuntime.log(`${label(`Working dir:`)} ${infoText(shortenHomePath(service.command.workingDirectory))}`);let daemonEnvLines=safeDaemonEnv(service.command?.environment);if(daemonEnvLines.length>0&&defaultRuntime.log(`${label(`Service env:`)} ${daemonEnvLines.join(` `)}`),spacer(),service.configAudit?.issues.length){defaultRuntime.error(warnText(`Service config looks out of date or non-standard.`));for(let issue of service.configAudit.issues){let detail=issue.detail?` (${issue.detail})`:``;defaultRuntime.error(`${warnText(`Service config issue:`)} ${issue.message}${detail}`)}defaultRuntime.error(warnText(`Recommendation: run "${formatCliCommand(`builderforce doctor`)}" (or "${formatCliCommand(`builderforce doctor --repair`)}").`))}if(status.config){let cliCfg=`${shortenHomePath(status.config.cli.path)}${status.config.cli.exists?``:` (missing)`}${status.config.cli.valid?``:` (invalid)`}`;if(defaultRuntime.log(`${label(`Config (cli):`)} ${infoText(cliCfg)}`),!status.config.cli.valid&&status.config.cli.issues?.length)for(let issue of status.config.cli.issues.slice(0,5))defaultRuntime.error(`${errorText(`Config issue:`)} ${issue.path||`<root>`}: ${issue.message}`);if(status.config.daemon){let daemonCfg=`${shortenHomePath(status.config.daemon.path)}${status.config.daemon.exists?``:` (missing)`}${status.config.daemon.valid?``:` (invalid)`}`;if(defaultRuntime.log(`${label(`Config (service):`)} ${infoText(daemonCfg)}`),!status.config.daemon.valid&&status.config.daemon.issues?.length)for(let issue of status.config.daemon.issues.slice(0,5))defaultRuntime.error(`${errorText(`Service config issue:`)} ${issue.path||`<root>`}: ${issue.message}`)}status.config.mismatch&&(defaultRuntime.error(errorText(`Root cause: CLI and service are using different config paths (likely a profile/state-dir mismatch).`)),defaultRuntime.error(errorText(`Fix: rerun \`${formatCliCommand(`builderforce gateway install --force`)}\` from the same --profile / BUILDERFORCE_AGENTS_STATE_DIR you expect.`))),spacer()}if(status.gateway){let bindHost=status.gateway.bindHost??`n/a`;if(defaultRuntime.log(`${label(`Gateway:`)} bind=${infoText(status.gateway.bindMode)} (${infoText(bindHost)}), port=${infoText(String(status.gateway.port))} (${infoText(status.gateway.portSource)})`),defaultRuntime.log(`${label(`Probe target:`)} ${infoText(status.gateway.probeUrl)}`),!(status.config?.daemon?.controlUi?.enabled??!0))defaultRuntime.log(`${label(`Dashboard:`)} ${warnText(`disabled`)}`);else{let links=resolveControlUiLinks({port:status.gateway.port,bind:status.gateway.bindMode,customBindHost:status.gateway.customBindHost,basePath:status.config?.daemon?.controlUi?.basePath});defaultRuntime.log(`${label(`Dashboard:`)} ${infoText(links.httpUrl)}`)}status.gateway.probeNote&&defaultRuntime.log(`${label(`Probe note:`)} ${infoText(status.gateway.probeNote)}`),spacer()}let runtimeLine=formatRuntimeStatus(service.runtime);if(runtimeLine){let runtimeColor=resolveRuntimeStatusColor(service.runtime?.status);defaultRuntime.log(`${label(`Runtime:`)} ${colorize(rich,runtimeColor,runtimeLine)}`)}if(rpc&&!rpc.ok&&service.loaded&&service.runtime?.status===`running`&&defaultRuntime.log(warnText(`Warm-up: launch agents can take a few seconds. Try again shortly.`)),rpc){if(rpc.ok)defaultRuntime.log(`${label(`RPC probe:`)} ${okText(`ok`)}`);else{defaultRuntime.error(`${label(`RPC probe:`)} ${errorText(`failed`)}`),rpc.url&&defaultRuntime.error(`${label(`RPC target:`)} ${rpc.url}`);let lines=String(rpc.error??`unknown`).split(/\r?\n/).filter(Boolean);for(let line of lines.slice(0,12))defaultRuntime.error(` ${errorText(line)}`)}spacer()}if(process.platform===`linux`&&isSystemdUnavailableDetail(service.runtime?.detail)){defaultRuntime.error(errorText(`systemd user services unavailable.`));for(let hint of renderSystemdUnavailableHints({wsl:isWSLEnv()}))defaultRuntime.error(errorText(hint));spacer()}if(service.runtime?.missingUnit){defaultRuntime.error(errorText(`Service unit not found.`));for(let hint of renderRuntimeHints(service.runtime))defaultRuntime.error(errorText(hint))}else if(service.loaded&&service.runtime?.status===`stopped`){defaultRuntime.error(errorText(`Service is loaded but not running (likely exited immediately).`));for(let hint of renderRuntimeHints(service.runtime,service.command?.environment??process.env))defaultRuntime.error(errorText(hint));spacer()}if(service.runtime?.cachedLabel){let labelValue=resolveGatewayLaunchAgentLabel((service.command?.environment??process.env).BUILDERFORCE_AGENTS_PROFILE);defaultRuntime.error(errorText(`LaunchAgent label cached but plist missing. Clear with: launchctl bootout gui/$UID/${labelValue}`)),defaultRuntime.error(errorText(`Then reinstall: ${formatCliCommand(`builderforce gateway install`)}`)),spacer()}for(let line of renderPortDiagnosticsForCli(status,rpc?.ok))defaultRuntime.error(errorText(line));if(status.port){let addrs=resolvePortListeningAddresses(status);addrs.length>0&&defaultRuntime.log(`${label(`Listening:`)} ${infoText(addrs.join(`, `))}`)}if(status.portCli&&status.portCli.port!==status.port?.port&&defaultRuntime.log(`${label(`Note:`)} CLI config resolves gateway port=${status.portCli.port} (${status.portCli.status}).`),service.loaded&&service.runtime?.status===`running`&&status.port&&status.port.status!==`busy`){if(defaultRuntime.error(errorText(`Gateway port ${status.port.port} is not listening (service appears running).`)),status.lastError&&defaultRuntime.error(`${errorText(`Last gateway error:`)} ${status.lastError}`),process.platform===`linux`){let unit=resolveGatewaySystemdServiceName((service.command?.environment??process.env).BUILDERFORCE_AGENTS_PROFILE);defaultRuntime.error(errorText(`Logs: journalctl --user -u ${unit}.service -n 200 --no-pager`))}else if(process.platform===`darwin`){let logs=resolveGatewayLogPaths(service.command?.environment??process.env);defaultRuntime.error(`${errorText(`Logs:`)} ${shortenHomePath(logs.stdoutPath)}`),defaultRuntime.error(`${errorText(`Errors:`)} ${shortenHomePath(logs.stderrPath)}`)}spacer()}if(extraServices.length>0){defaultRuntime.error(errorText(`Other gateway-like services detected (best effort):`));for(let svc of extraServices)defaultRuntime.error(`- ${errorText(svc.label)} (${svc.scope}, ${svc.detail})`);for(let hint of renderGatewayServiceCleanupHints())defaultRuntime.error(`${errorText(`Cleanup hint:`)} ${hint}`);spacer()}extraServices.length>0&&(defaultRuntime.error(errorText(`Recommendation: run a single gateway per machine for most setups. One gateway supports multiple agents (see docs: /gateway#multiple-gateways-same-host).`)),defaultRuntime.error(errorText(`If you need multiple gateways (e.g., a rescue bot on the same host), isolate ports + config/state (see docs: /gateway#multiple-gateways-same-host).`)),spacer()),defaultRuntime.log(`${label(`Troubles:`)} run ${formatCliCommand(`builderforce status`)}`),defaultRuntime.log(`${label(`Troubleshooting:`)} https://docs.builderforce.ai/troubleshooting`)}async function runDaemonStatus(opts){try{printDaemonStatus(await gatherDaemonStatus({rpc:opts.rpc,probe:!!opts.probe,deep:!!opts.deep}),{json:!!opts.json})}catch(err){let rich=isRich();defaultRuntime.error(colorize(rich,theme.error,`Gateway status failed: ${String(err)}`)),defaultRuntime.exit(1)}}function resolveInstallOptions(cmdOpts,command){let parentForce=inheritOptionFromParent(command,`force`),parentPort=inheritOptionFromParent(command,`port`),parentToken=inheritOptionFromParent(command,`token`),parentCron=inheritOptionFromParent(command,`cron`);return{...cmdOpts,force:!!(cmdOpts.force||parentForce),port:cmdOpts.port??parentPort,token:cmdOpts.token??parentToken,noCron:cmdOpts.cron===!1||parentCron===!1}}function resolveRpcOptions(cmdOpts,command){let parentToken=inheritOptionFromParent(command,`token`),parentPassword=inheritOptionFromParent(command,`password`);return{...cmdOpts,token:cmdOpts.token??parentToken,password:cmdOpts.password??parentPassword}}function addGatewayServiceCommands(parent,opts){parent.command(`status`).description(opts?.statusDescription??`Show gateway service status + probe the Gateway`).option(`--url <url>`,`Gateway WebSocket URL (defaults to config/remote/local)`).option(`--token <token>`,`Gateway token (if required)`).option(`--password <password>`,`Gateway password (password auth)`).option(`--timeout <ms>`,`Timeout in ms`,`10000`).option(`--no-probe`,`Skip RPC probe`).option(`--deep`,`Scan system-level services`,!1).option(`--json`,`Output JSON`,!1).action(async(cmdOpts,command)=>{await runDaemonStatus({rpc:resolveRpcOptions(cmdOpts,command),probe:!!cmdOpts.probe,deep:!!cmdOpts.deep,json:!!cmdOpts.json})}),parent.command(`install`).description(`Install the Gateway service (launchd/systemd/schtasks)`).option(`--port <port>`,`Gateway port`).option(`--runtime <runtime>`,`Daemon runtime (node|bun). Default: node`).option(`--token <token>`,`Gateway token (token auth)`).option(`--no-cron`,`Disable cron scheduler (cron.enabled: false) to reduce gateway activity`,!0).option(`--force`,`Reinstall/overwrite if already installed`,!1).option(`--json`,`Output JSON`,!1).action(async(cmdOpts,command)=>{await runDaemonInstall(resolveInstallOptions(cmdOpts,command))}),parent.command(`uninstall`).description(`Uninstall the Gateway service (launchd/systemd/schtasks)`).option(`--json`,`Output JSON`,!1).action(async cmdOpts=>{await runDaemonUninstall(cmdOpts)}),parent.command(`start`).description(`Start the Gateway service (launchd/systemd/schtasks)`).option(`--json`,`Output JSON`,!1).action(async cmdOpts=>{await runDaemonStart(cmdOpts)}),parent.command(`stop`).description(`Stop the Gateway service (launchd/systemd/schtasks)`).option(`--json`,`Output JSON`,!1).action(async cmdOpts=>{await runDaemonStop(cmdOpts)}),parent.command(`restart`).description(`Restart the Gateway service (launchd/systemd/schtasks)`).option(`--json`,`Output JSON`,!1).action(async cmdOpts=>{await runDaemonRestart(cmdOpts)})}function registerDaemonCli(program){addGatewayServiceCommands(program.command(`daemon`).description(`Manage the Gateway service (launchd/systemd/schtasks)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/gateway`,`docs.builderforce.ai/cli/gateway`)}\n`),{statusDescription:`Show service install status + probe the Gateway`})}export{renderGatewayServiceCleanupHints as a,runDaemonStop as c,findExtraGatewayServices as i,runDaemonUninstall as l,addGatewayServiceCommands as n,runDaemonRestart as o,runDaemonStatus as r,runDaemonStart as s,registerDaemonCli as t,runDaemonInstall as u};
@@ -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"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./ports-DgmEDNOm.js";import"./sessions-CdanN_ZI.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./paths-DJ6rztqJ.js";import"./client-xfoidwPI.js";import"./call-BbRf8gFM.js";import"./links-BgWWaaOT.js";import"./progress-BfOtdN6b.js";import"./onboard-helpers-Cf5dNq7-.js";import"./prompt-style-BpVK43GK.js";import"./runtime-guard-DhksRHci.js";import"./daemon-runtime-CtOr1ncS.js";import"./systemd-BG3_QT6W.js";import"./service-D-NLDyK3.js";import"./lifecycle-core-Dwb4gHjZ.js";import"./diagnostics-DCjg0nBH.js";import{t as registerDaemonCli}from"./daemon-cli-DlwOVDbt.js";export{registerDaemonCli};
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"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./ports-DgmEDNOm.js";import"./sessions-BuZVmOWt.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./paths-DJ6rztqJ.js";import"./client-xfoidwPI.js";import"./call-T8ciwMTA.js";import"./links-BgWWaaOT.js";import"./progress-BfOtdN6b.js";import"./onboard-helpers-CiHzTaFX.js";import"./prompt-style-BpVK43GK.js";import"./runtime-guard-DhksRHci.js";import"./daemon-runtime-9XitJmIL.js";import"./systemd-BG3_QT6W.js";import"./service-D-NLDyK3.js";import"./lifecycle-core-uxjxTzFv.js";import"./diagnostics-DCjg0nBH.js";import{t as registerDaemonCli}from"./daemon-cli-Bh3p0hui.js";export{registerDaemonCli};