@seanhogg/builderforce-agents 2026.10.10 → 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 (404) 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/{audio-preflight-Dm9zyfJq.js → audio-preflight-CvvHdoWy.js} +1 -1
  13. package/dist/{audit-DGnEhZYe.js → audit-B-USV03V.js} +1 -1
  14. package/dist/{audit-DBjjjW93.js → audit-SKNPS-K2.js} +1 -1
  15. package/dist/auth-choice-CChsMy-F.js +1 -0
  16. package/dist/{auth-choice-9gZuOvPS.js → auth-choice-CCib_yVL.js} +1 -1
  17. package/dist/auth-choice-DSnpkrMc.js +1 -0
  18. package/dist/{auth-choice-BoZFVmEa.js → auth-choice-DzBqqq7i.js} +1 -1
  19. package/dist/auth-choice.apply-6f3Jb_lS.js +1 -0
  20. package/dist/{auth-choice.apply-CcatXiNo.js → auth-choice.apply-BgOXoS8X.js} +1 -1
  21. package/dist/{auth-choice.apply-BHLQeym9.js → auth-choice.apply-DBuvopiF.js} +1 -1
  22. package/dist/auth-choice.apply-DeXnLwVS.js +1 -0
  23. package/dist/auth-choice.apply.transformers-CZDuBaOr.js +1 -0
  24. package/dist/{auth-choice.apply.transformers-CIn3fs7K.js → auth-choice.apply.transformers-Df9l_jRz.js} +2 -2
  25. package/dist/{auth-choice.apply.transformers-1plI0MUg.js → auth-choice.apply.transformers-DmdxpHGz.js} +2 -2
  26. package/dist/{auth-choice.apply.transformers-D5OrjEHo.js → auth-choice.apply.transformers-dn7l6XyJ.js} +1 -1
  27. package/dist/{auth-json-D1ite-pW.js → auth-json-BB-VBn5E.js} +1 -1
  28. package/dist/{auth-json-CN3MWw57.js → auth-json-BVyos95N.js} +1 -1
  29. package/dist/{auth-json-HGu227VM.js → auth-json-CoOe4tEg.js} +1 -1
  30. package/dist/{auth-json-DZ7E50Y1.js → auth-json-wrKixZxh.js} +1 -1
  31. package/dist/{auth-profiles-C1VbcUOm.js → auth-profiles-pt7Tr4HA.js} +1 -1
  32. package/dist/{auth-token-CyVfNEQb.js → auth-token-BE67qxLw.js} +1 -1
  33. package/dist/{auth-token-CoQ5ePPl.js → auth-token-BPHeoBAW.js} +1 -1
  34. package/dist/{banner-DY-L7_eI.js → banner-ErBINvbk.js} +1 -1
  35. package/dist/{browser-cli-D2O94twn.js → browser-cli-BZc64-Xx.js} +1 -1
  36. package/dist/{browser-cli-CoRx_4iM.js → browser-cli-CoxVKdon.js} +1 -1
  37. package/dist/build-info.json +3 -3
  38. package/dist/{builderforce-2EpP2M8q.js → builderforce-B9187Tm9.js} +4 -4
  39. package/dist/{builderforce-Cyg20uU8.js → builderforce-BLqHwgeu.js} +4 -4
  40. package/dist/builderforce-api-DKgXl8BH.js +1 -0
  41. package/dist/builderforce-api-DcPAGsla.js +1 -0
  42. package/dist/builderforce-onboarding-CaPJZSvw.js +24 -0
  43. package/dist/builderforce-onboarding-RXFb0gct.js +24 -0
  44. package/dist/{builderforcellm-syscheck-CprBhARf.js → builderforcellm-syscheck-9ksvqHYX.js} +1 -1
  45. package/dist/{builderforcellm-syscheck-DrFJ638L.js → builderforcellm-syscheck-F5JMAr3p.js} +1 -1
  46. package/dist/{call-DxPWzV-k.js → call-BnAs_SER.js} +1 -1
  47. package/dist/{call-DFjBq0H2.js → call-D1Opj5ev.js} +1 -1
  48. package/dist/{call-DmAU4cRX.js → call-Du2LiaX6.js} +1 -1
  49. package/dist/{call-BbRf8gFM.js → call-T8ciwMTA.js} +1 -1
  50. package/dist/{channel-options-d4EwVQD0.js → channel-options-B7sRMp2v.js} +1 -1
  51. package/dist/{channel-options-CDixz6dT.js → channel-options-rhDBCtlp.js} +1 -1
  52. package/dist/{channel-web-DJa8JC9W.js → channel-web-CcCqUQrJ.js} +1 -1
  53. package/dist/{channels-cli-BgKy0MbE.js → channels-cli-BjnLW14T.js} +1 -1
  54. package/dist/{channels-cli-nNW0ezPM.js → channels-cli-DVWUBsmc.js} +1 -1
  55. package/dist/chrome-Brg9KsB9.js +4 -0
  56. package/dist/{chrome-BnEbJV3D.js → chrome-CFmcixaE.js} +1 -1
  57. package/dist/{chrome-a3X9_-nf.js → chrome-DXt86tmV.js} +1 -1
  58. package/dist/cli/daemon-cli.js +1 -1
  59. package/dist/{cli-DkWt7p2x.js → cli-BUqtALJK.js} +1 -1
  60. package/dist/{cli-C5MbcECQ.js → cli-K4reS6IS.js} +1 -1
  61. package/dist/{coding-tools.policy-NEPm7Mz1.js → coding-tools.policy-D9Ba8eDh.js} +1 -1
  62. package/dist/{coding-tools.policy-6qh9acJy.js → coding-tools.policy-ZhOdlcEI.js} +1 -1
  63. package/dist/{command-registry-CDcuHGpx.js → command-registry-B7uAoROP.js} +1 -1
  64. package/dist/{command-registry-hHegQvBn.js → command-registry-CW16Mk2Y.js} +1 -1
  65. package/dist/{completion-cli-Bqr0W4L6.js → completion-cli-ZvXrCQqk.js} +1 -1
  66. package/dist/{completion-cli-Ch9ozmkg.js → completion-cli-gyvx5ZXu.js} +1 -1
  67. package/dist/{completion-cli-Do4vXo1k.js → completion-cli-n8UsdT91.js} +1 -1
  68. package/dist/{completion-cli-Ck0FTqPT.js → completion-cli-sKReGv3d.js} +1 -1
  69. package/dist/{config-_1Ca6jGb.js → config-BgV_FYSq.js} +1 -1
  70. package/dist/{config-toczWD3q.js → config-BpChMIJ6.js} +1 -1
  71. package/dist/{config-BTWlKwtB.js → config-D01EgOky.js} +1 -1
  72. package/dist/{config-27_FNba3.js → config-Dsnbi-a3.js} +1 -1
  73. package/dist/{config-cli-DeiQz5sY.js → config-cli-Bpo74mE5.js} +1 -1
  74. package/dist/{config-cli-CfczShaZ.js → config-cli-CF31O_5s.js} +1 -1
  75. package/dist/{config-guard-CD-Wq8kk.js → config-guard-BRUOk5YL.js} +1 -1
  76. package/dist/{config-guard-ClVl2FvD.js → config-guard-BUpQiSTW.js} +1 -1
  77. package/dist/{config-guard-B4in8l8I.js → config-guard-USCN-dq0.js} +1 -1
  78. package/dist/{config-validation-jpeXzoU3.js → config-validation-BGpSeNbh.js} +1 -1
  79. package/dist/{config-validation-C6u-z9bJ.js → config-validation-CdBJ-tZq.js} +1 -1
  80. package/dist/{configure-3W9C5LiT.js → configure-CWr61Ph2.js} +1 -1
  81. package/dist/configure-DhazB2qh.js +1 -0
  82. package/dist/{configure-BtXQW7ue.js → configure-DlcO1tWx.js} +1 -1
  83. package/dist/configure-MXheujvX.js +1 -0
  84. package/dist/{control-service-CJuuqNOE.js → control-service-2PkCt256.js} +1 -1
  85. package/dist/{control-service-qKfWP7VD.js → control-service-CcsbseZS.js} +1 -1
  86. package/dist/{control-service-izGyCWQs.js → control-service-qK1oboMo.js} +1 -1
  87. package/dist/{control-service-BbsswoMy.js → control-service-y3GYvIBg.js} +1 -1
  88. package/dist/{cron-cli-BrOM4s6N.js → cron-cli-BYu_lA8i.js} +1 -1
  89. package/dist/{cron-cli-CwtTX6pg.js → cron-cli-D_Og20iB.js} +1 -1
  90. package/dist/{daemon-cli-DyVsMf8p.js → daemon-cli-BNzthScZ.js} +1 -1
  91. package/dist/{daemon-cli-DlwOVDbt.js → daemon-cli-Bh3p0hui.js} +1 -1
  92. package/dist/{daemon-cli-Br0wu9xQ.js → daemon-cli-DxxKiKVN.js} +1 -1
  93. package/dist/{daemon-cli-DmicpZED.js → daemon-cli-emNxLkIw.js} +1 -1
  94. package/dist/{daemon-runtime-CtOr1ncS.js → daemon-runtime-9XitJmIL.js} +1 -1
  95. package/dist/{daemon-runtime-B4UjqdyJ.js → daemon-runtime-Dx800VUt.js} +1 -1
  96. package/dist/{deliver-BpLm3ktn.js → deliver--6OBF3LL.js} +1 -1
  97. package/dist/{deliver-9o_SE4ZK.js → deliver-ADpnRGRf.js} +1 -1
  98. package/dist/{deliver-D2VAVelb.js → deliver-BM6-damm.js} +1 -1
  99. package/dist/{deliver-BuZu68tp.js → deliver-CsG0cHbZ.js} +1 -1
  100. package/dist/{deps-CkJiJ6wc.js → deps-Dg_9rfXK.js} +1 -1
  101. package/dist/{devices-cli-BfXeDnbx.js → devices-cli-B8DXzcRP.js} +1 -1
  102. package/dist/{devices-cli-B9G6YOsS.js → devices-cli-BZkdWSx-.js} +1 -1
  103. package/dist/{directory-cli-BRCaiGOn.js → directory-cli-B78pAVI_.js} +1 -1
  104. package/dist/{directory-cli-D5ciZ5fY.js → directory-cli-CSaRkkL8.js} +1 -1
  105. package/dist/{dm-policy-shared-CRZpjRv0.js → dm-policy-shared-B9lW-AsK.js} +1 -1
  106. package/dist/{dm-policy-shared-Dhw9_6mi.js → dm-policy-shared-DYZ_T-az.js} +1 -1
  107. package/dist/{dns-cli-CgZ7oMcT.js → dns-cli-CLPGOFA1.js} +1 -1
  108. package/dist/{dns-cli-C4f4Tyij.js → dns-cli-dr5dHzfI.js} +1 -1
  109. package/dist/{doctor-completion-BjBTLcoC.js → doctor-completion-94zme499.js} +1 -1
  110. package/dist/{doctor-completion-Ccs-JEvV.js → doctor-completion-CbF34DIH.js} +1 -1
  111. package/dist/{embedded-cvG_LpfQ.js → embedded-D-citLF2.js} +6 -6
  112. package/dist/{embedded-helpers-CEsr3aQ0.js → embedded-helpers-C9jpiwlw.js} +1 -1
  113. package/dist/{embedded-helpers-DK8_apW0.js → embedded-helpers-DdU30lmt.js} +1 -1
  114. package/dist/entry.js +1 -1
  115. package/dist/{exec-approvals-cli-YuOu7mVg.js → exec-approvals-cli-CS_uabo7.js} +1 -1
  116. package/dist/{exec-approvals-cli-BPFi82B0.js → exec-approvals-cli-ktB7M7WE.js} +1 -1
  117. package/dist/extensionAPI.js +1 -1
  118. package/dist/{gateway-cli-CiHNwzdS.js → gateway-cli-CKcoLVMA.js} +5 -5
  119. package/dist/{gateway-cli-z47dfosr.js → gateway-cli-CuXBDBWe.js} +5 -5
  120. package/dist/{gateway-rpc-BXR_lVIx.js → gateway-rpc-B02y0PnE.js} +1 -1
  121. package/dist/{gateway-rpc-ByUcnQ7W.js → gateway-rpc-ff1RVb0_.js} +1 -1
  122. package/dist/{gemini-auth-CkD5jCPh.js → gemini-auth-DDR12zst.js} +1 -1
  123. package/dist/health-D0DZmCmh.js +1 -0
  124. package/dist/{health-yS3NRKvY.js → health-FO8MG5Ur.js} +1 -1
  125. package/dist/{health-DVo8a9yg.js → health-zrsgFZmR.js} +1 -1
  126. package/dist/{hooks-cli-B0lVee-j.js → hooks-cli-5Y4hnSX9.js} +1 -1
  127. package/dist/{hooks-cli-DsVmrQAG.js → hooks-cli-DpHZzRo2.js} +1 -1
  128. package/dist/index.js +2 -2
  129. package/dist/{ink-session-BitZ1wcY.js → ink-session-Dt9Q4iH-.js} +2 -2
  130. package/dist/{ink-session-CyAqXDla.js → ink-session-N8wCBzwk.js} +2 -2
  131. package/dist/{installs-CWd54ARy.js → installs-B_t2YXgq.js} +1 -1
  132. package/dist/{installs-C9A8QFiF.js → installs-DFiF4lGy.js} +1 -1
  133. package/dist/{io-3R_ZyUxB.js → io-BLBq4T2o.js} +1 -1
  134. package/dist/{io-DSIGyPrT.js → io-CXN4uLS2.js} +1 -1
  135. package/dist/{io-6jLoKffb.js → io-Ckd4NlvH.js} +1 -1
  136. package/dist/{io-CohJffHG.js → io-D9hC2aG0.js} +1 -1
  137. package/dist/{lifecycle-core-BpMvDXy1.js → lifecycle-core-D9Dg5Qps.js} +1 -1
  138. package/dist/{lifecycle-core-Dwb4gHjZ.js → lifecycle-core-uxjxTzFv.js} +1 -1
  139. package/dist/login-B3sDAgHb.js +1 -0
  140. package/dist/{login-C_ZdMOvv.js → login-CwwuaXtb.js} +1 -1
  141. package/dist/{login-DtDUyFO3.js → login-D1bVUPlv.js} +1 -1
  142. package/dist/{login-CEnjUo5c.js → login-GLDax56V.js} +1 -1
  143. package/dist/{login-qr-B9lyIZVD.js → login-qr-CbiUcBLy.js} +1 -1
  144. package/dist/{login-qr-BCBsxwhT.js → login-qr-Cp0YqK4e.js} +1 -1
  145. package/dist/{logs-cli-CdM5W3HE.js → logs-cli-Cy11HfSG.js} +1 -1
  146. package/dist/{logs-cli-jh5Xn3TD.js → logs-cli-nD36c-Y1.js} +1 -1
  147. package/dist/{manager-CRba8roB.js → manager-BeohB4-8.js} +1 -1
  148. package/dist/{manager-B3IJ_IKf.js → manager-CTTXDBt3.js} +1 -1
  149. package/dist/{manager-TGVy_fAb.js → manager-CoQMlcrf.js} +1 -1
  150. package/dist/{manager-DwywI_5-.js → manager-DSz61dXv.js} +1 -1
  151. package/dist/{memory-cli-BlayFTAM.js → memory-cli-BpAiRntI.js} +1 -1
  152. package/dist/{memory-cli-DRz4wtHk.js → memory-cli-CbkWGjRn.js} +1 -1
  153. package/dist/{memory-cli-PdyTQ84w.js → memory-cli-CrBMLM2P.js} +1 -1
  154. package/dist/{memory-cli-ivAs7q7v.js → memory-cli-CveeVOWH.js} +1 -1
  155. package/dist/{model-catalog-CQOdhMUY.js → model-catalog-B29yeBYS.js} +1 -1
  156. package/dist/{model-catalog-CiiFJX77.js → model-catalog-BeBXvbFm.js} +1 -1
  157. package/dist/model-catalog-CMKHKuBL.js +1 -0
  158. package/dist/{model-catalog-C6UrZ0uG.js → model-catalog-DjNiebr7.js} +1 -1
  159. package/dist/{model-discovery-C9Xm95uL.js → model-discovery-D0i1JpiL.js} +1 -1
  160. package/dist/{model-picker-swoSwauV.js → model-picker-CGDNPRPc.js} +1 -1
  161. package/dist/model-picker-CGEF8yhc.js +1 -0
  162. package/dist/model-picker-DeUNOC78.js +1 -0
  163. package/dist/{model-picker-BUePD7Zg.js → model-picker-EIhpfOZa.js} +1 -1
  164. package/dist/{model-selection-9bRFKBI_.js → model-selection-DG9J_VTz.js} +1 -1
  165. package/dist/{models-BNivsd2o.js → models-BjIzVQYX.js} +2 -2
  166. package/dist/{models-DQeSIY6M.js → models-JoqOgEF5.js} +1 -1
  167. package/dist/{models-cli-KokGgWeP.js → models-cli-B2zbchgs.js} +1 -1
  168. package/dist/{models-cli-BcNxU4P_.js → models-cli-CkFdc8NN.js} +2 -2
  169. package/dist/{node-cli-DIMh3X2F.js → node-cli-CXnuxiBq.js} +1 -1
  170. package/dist/{node-cli-EmTU-Gh0.js → node-cli-oVyjVnb7.js} +1 -1
  171. package/dist/{nodes-cli-BX8TznFK.js → nodes-cli-BBVotxNt.js} +1 -1
  172. package/dist/{nodes-cli-DyHovdAc.js → nodes-cli-DVMBSUhK.js} +1 -1
  173. package/dist/{onboard-D4uXN5Ec.js → onboard-BItclJp0.js} +1 -1
  174. package/dist/{onboard-cB37uVxy.js → onboard-CqvHIvKj.js} +1 -1
  175. package/dist/{onboard-auth.credentials-yagR-VMG.js → onboard-auth.credentials-DneFSdYg.js} +1 -1
  176. package/dist/{onboard-auth.credentials-BuT-etnE.js → onboard-auth.credentials-DpitLlzw.js} +1 -1
  177. package/dist/onboard-channels-B91m5S3w.js +1 -0
  178. package/dist/onboard-channels-BOoPtYbF.js +1 -0
  179. package/dist/{onboard-channels-B6QDFkkK.js → onboard-channels-Dn0u5C-C.js} +1 -1
  180. package/dist/{onboard-channels-C8FCFn29.js → onboard-channels-vhtccaIV.js} +1 -1
  181. package/dist/onboard-custom-BN0uzSq_.js +1 -0
  182. package/dist/{onboard-custom-D1nd8Hlu.js → onboard-custom-BYIza2e7.js} +1 -1
  183. package/dist/onboard-custom-CCFthqto.js +1 -0
  184. package/dist/{onboard-custom-C_BI0ZXn.js → onboard-custom-Ckf0xKXY.js} +1 -1
  185. package/dist/{onboard-helpers-CGlLpagb.js → onboard-helpers-B8I5AVyb.js} +1 -1
  186. package/dist/{onboard-helpers-CckrS8_K.js → onboard-helpers-Ce_c4Raj.js} +1 -1
  187. package/dist/{onboard-helpers-Cf5dNq7-.js → onboard-helpers-CiHzTaFX.js} +1 -1
  188. package/dist/{onboard-helpers-BvIZ4-R5.js → onboard-helpers-DC-nMl-V.js} +1 -1
  189. package/dist/{onboard-interactive-vwqLS6pe.js → onboard-interactive-Cl2K3EYn.js} +1 -1
  190. package/dist/{onboard-interactive-gvfRcLOt.js → onboard-interactive-JNux9zfA.js} +1 -1
  191. package/dist/{onboard-interactive-CnXgQrpI.js → onboard-interactive-J_ObFzeW.js} +1 -1
  192. package/dist/{onboard-interactive-CoFFuSJT.js → onboard-interactive-OUNsvlh0.js} +1 -1
  193. package/dist/{onboard-remote-D5lR2lVm.js → onboard-remote-0-q7MG9t.js} +1 -1
  194. package/dist/{onboard-remote-BmSyHww1.js → onboard-remote-CgAAEZpq.js} +1 -1
  195. package/dist/{onboard-remote-CzzQMZ3X.js → onboard-remote-DKXHDdBD.js} +1 -1
  196. package/dist/{onboard-remote-DcuX8b2g.js → onboard-remote-cB8j9RG-.js} +1 -1
  197. package/dist/{onboard-skills-ILHIeg1R.js → onboard-skills-47upVdA2.js} +1 -1
  198. package/dist/{onboard-skills-BPlNN_-T.js → onboard-skills-9Um4TL2x.js} +1 -1
  199. package/dist/{onboard-skills-DIhjDMom.js → onboard-skills-DhCmvhJY.js} +1 -1
  200. package/dist/{onboard-skills-CI1OtWsE.js → onboard-skills-mI2kfvdT.js} +1 -1
  201. package/dist/{onboarding-DdKW5K8Y.js → onboarding-BSENgR9C.js} +5 -5
  202. package/dist/{onboarding-B9GqKO5L.js → onboarding-CIaZLNc1.js} +5 -5
  203. package/dist/{onboarding.finalize-CcuO4Yxw.js → onboarding.finalize-BwOpvoPE.js} +1 -1
  204. package/dist/{onboarding.finalize-D3mTpOdc.js → onboarding.finalize-yMK-g7Uy.js} +1 -1
  205. package/dist/{onboarding.gateway-config-Cd7_bXVs.js → onboarding.gateway-config-Kn1O-QFl.js} +1 -1
  206. package/dist/{onboarding.gateway-config-Bd8HJkso.js → onboarding.gateway-config-huOjFf8D.js} +1 -1
  207. package/dist/{openai-model-default-Cp3nf21W.js → openai-model-default-CH2-2Hvk.js} +1 -1
  208. package/dist/{openai-model-default-BMRrqTmH.js → openai-model-default-pfoEzWYJ.js} +1 -1
  209. package/dist/{outbound-BRInCJD9.js → outbound-BdeHcMAo.js} +1 -1
  210. package/dist/{outbound-CAtBpFoD.js → outbound-BylJYD7n.js} +1 -1
  211. package/dist/{outbound-OI-t5zZ0.js → outbound-CAirtWr1.js} +1 -1
  212. package/dist/{outbound-CnIvOJlU.js → outbound-VNcvF2MG.js} +1 -1
  213. package/dist/{outbound-send-deps-m6DqOma_.js → outbound-send-deps-B3Lg-uqF.js} +1 -1
  214. package/dist/{pairing-cli-CEr0yEsc.js → pairing-cli-5RtPvz2i.js} +1 -1
  215. package/dist/{pairing-cli-Dxfoni-F.js → pairing-cli-C_Mj6Dy4.js} +1 -1
  216. package/dist/{pairing-labels-3j_iRYOO.js → pairing-labels-BJPrScRl.js} +1 -1
  217. package/dist/{pairing-labels-BW5jQZlr.js → pairing-labels-oA-nKTaW.js} +1 -1
  218. package/dist/{pairing-store-QDb6lhIU.js → pairing-store-YRy7EBgI.js} +1 -1
  219. package/dist/{pairing-store-CbvMJhD3.js → pairing-store-ti3FEkmr.js} +1 -1
  220. package/dist/{plugin-auto-enable-BV9K9Vhr.js → plugin-auto-enable-Cupr4wbt.js} +1 -1
  221. package/dist/{plugin-auto-enable-DDry2fA6.js → plugin-auto-enable-D8gKiE3F.js} +1 -1
  222. package/dist/plugin-registry-BEfyc2f_.js +1 -0
  223. package/dist/{plugin-registry-C-_GA65s.js → plugin-registry-BoPaef5I.js} +1 -1
  224. package/dist/{plugin-registry-SAdxNUwm.js → plugin-registry-CxnuHO_n.js} +1 -1
  225. package/dist/plugin-registry-D0tIqo8L.js +1 -0
  226. package/dist/plugin-sdk/agent-runtime/src/infra/workflow-telemetry.d.ts +12 -1
  227. package/dist/{plugins-BIG8NDB9.js → plugins-Cx29kkDj.js} +1 -1
  228. package/dist/{plugins-iAq-Gr8l.js → plugins-DJqou2hi.js} +1 -1
  229. package/dist/{plugins-cli-CpaVUv_r.js → plugins-cli-Bu-A8aGy.js} +1 -1
  230. package/dist/{plugins-cli-CPkSgvdL.js → plugins-cli-CGFsQDVW.js} +1 -1
  231. package/dist/{program-context-CpxTJP1m.js → program-context-ClBa4lUj.js} +1 -1
  232. package/dist/{program-BgDciyOQ.js → program-vVCzU0cH.js} +2 -2
  233. package/dist/{prompt-select-styled-Qb0DubNy.js → prompt-select-styled-BJPGccTJ.js} +1 -1
  234. package/dist/{prompt-select-styled-Bu7WPMzB.js → prompt-select-styled-BK74z6FF.js} +1 -1
  235. package/dist/{provider-auth-helpers-BpTnp2Yr.js → provider-auth-helpers-B84m5VMc.js} +1 -1
  236. package/dist/{provider-auth-helpers-CJTG_tVx.js → provider-auth-helpers-hNwpK_hl.js} +1 -1
  237. package/dist/{provider-dispatcher-TWwBT2aH.js → provider-dispatcher-BjR5DE3O.js} +1 -1
  238. package/dist/provider-dispatcher-DgOeVjcL.js +1 -0
  239. package/dist/{provider-usage-BdrU4cIE.js → provider-usage-B-wPVN_j.js} +1 -1
  240. package/dist/{provider-usage-Bn4ZrnU7.js → provider-usage-B8lFHp0K.js} +1 -1
  241. package/dist/{push-apns-C4sJnHbO.js → push-apns-BTPPvY81.js} +1 -1
  242. package/dist/{push-apns-CiD3rrVv.js → push-apns-CscYUS0D.js} +1 -1
  243. package/dist/{pw-ai-DSEj1QrV.js → pw-ai-CLS_VZ8p.js} +1 -1
  244. package/dist/{pw-ai-dNZY-qBs.js → pw-ai-D5og_rIf.js} +1 -1
  245. package/dist/{pw-ai-D8HJAvv-.js → pw-ai-DaxMmaVL.js} +1 -1
  246. package/dist/{qr-cli-qr-SFLZW.js → qr-cli-CAquM1Zk.js} +1 -1
  247. package/dist/{qr-cli-B45dCV0o.js → qr-cli-GsR8n1cm.js} +1 -1
  248. package/dist/{qr-cli-CMlAIzrD.js → qr-cli-kAKgaL-T.js} +1 -1
  249. package/dist/{qr-cli-CySNSEFj.js → qr-cli-uyxNf-cQ.js} +1 -1
  250. package/dist/{register.agent-BA6LIJSb.js → register.agent-BwTCfyeJ.js} +1 -1
  251. package/dist/{register.agent-D2uCH8jZ.js → register.agent-Dhdo3_7k.js} +1 -1
  252. package/dist/register.configure-B0m0G3ot.js +1 -0
  253. package/dist/register.configure-D3cbjmTz.js +1 -0
  254. package/dist/{register.maintenance-CPnm6L-m.js → register.maintenance-C6ocMld2.js} +1 -1
  255. package/dist/{register.maintenance-D8WmeEaD.js → register.maintenance-CbE2zSyc.js} +1 -1
  256. package/dist/{register.message-DiZRRAE5.js → register.message-Jn4u533_.js} +1 -1
  257. package/dist/{register.message-8iGDhO8h.js → register.message-Tu1hlM0m.js} +1 -1
  258. package/dist/{register.onboard-DMfqe2nX.js → register.onboard-B34211N6.js} +1 -1
  259. package/dist/{register.onboard-BoUicPRh.js → register.onboard-S1d2WAE4.js} +1 -1
  260. package/dist/{register.setup-BK6OEvY3.js → register.setup-CJPyAwCQ.js} +1 -1
  261. package/dist/{register.setup-CtcAR3JR.js → register.setup-Sg8f3nsH.js} +1 -1
  262. package/dist/{register.status-health-sessions-D6wdwPwV.js → register.status-health-sessions-BlgVxoZ4.js} +1 -1
  263. package/dist/{register.status-health-sessions-ZSufYw5j.js → register.status-health-sessions-DwADQJ74.js} +1 -1
  264. package/dist/{register.subclis-Dl6jPPsc.js → register.subclis-C9V_M-Lk.js} +1 -1
  265. package/dist/{register.subclis-EScCVgbV.js → register.subclis-pWn9XObB.js} +1 -1
  266. package/dist/{replies-DbkT_5BV.js → replies-BOGMDhSN.js} +1 -1
  267. package/dist/{replies-CzV-RFUG.js → replies-BXbV02ik.js} +1 -1
  268. package/dist/{replies-DIBQzxGp.js → replies-CUv671JF.js} +1 -1
  269. package/dist/{replies-Bd2RPZwQ.js → replies-DokbEfJD.js} +1 -1
  270. package/dist/{reply-Cd3vVnD7.js → reply-GY1C8tcv.js} +10 -10
  271. package/dist/{routes-BzfLvF8W.js → routes-DZntyPY6.js} +1 -1
  272. package/dist/{routes-lclJHOYY.js → routes-_iZdG1Fo.js} +1 -1
  273. package/dist/{rpc-BLqXRn5R.js → rpc-CbUnwStf.js} +1 -1
  274. package/dist/{rpc-DcQNGQlj.js → rpc-Cwm4gchc.js} +1 -1
  275. package/dist/{run-main-C3lmcvyV.js → run-main-DQMbgbcF.js} +1 -1
  276. package/dist/{runner-CviGu3Nk.js → runner-COldX-El.js} +3 -3
  277. package/dist/{runner-DwWmciCt.js → runner-Cu9NJouV.js} +1 -1
  278. package/dist/{runner-SxCr9kXD.js → runner-eTTUbLAK.js} +1 -1
  279. package/dist/{sandbox-BZibn6PX.js → sandbox-C4AKi2EX.js} +1 -1
  280. package/dist/{sandbox-z9t_PRf9.js → sandbox-DvKMuAXL.js} +1 -1
  281. package/dist/{sandbox-cli-BtGs0dBR.js → sandbox-cli-C0LhzYq_.js} +1 -1
  282. package/dist/{sandbox-cli-B8FpLgyY.js → sandbox-cli-De0iaoHB.js} +1 -1
  283. package/dist/{security-cli-D8Q8I7fn.js → security-cli-BvEfiO8m.js} +1 -1
  284. package/dist/{security-cli-IIMR7Pb4.js → security-cli-BzsQ0XQh.js} +1 -1
  285. package/dist/{send-DnMzjS7L.js → send-2dRKMWtl.js} +1 -1
  286. package/dist/{send-DerUBvXW.js → send-Aw8wK3vK.js} +1 -1
  287. package/dist/{send-BvroeIQ6.js → send-B7H8Ae5j.js} +1 -1
  288. package/dist/{send-4d9NswaD.js → send-BP5osGBo.js} +1 -1
  289. package/dist/{send-BU_-BGmf.js → send-BVal50Bi.js} +1 -1
  290. package/dist/{send-CxG2suVM.js → send-Bbo7TXLx.js} +1 -1
  291. package/dist/{send-CBBziNqM.js → send-BxoVLIy1.js} +1 -1
  292. package/dist/{send-dDpSBSBo.js → send-COKUbcqs.js} +1 -1
  293. package/dist/{send--12DIueA.js → send-CTw3PqN4.js} +1 -1
  294. package/dist/{send-UFtylOiq.js → send-CYGOPcKq.js} +1 -1
  295. package/dist/{send-DyF1Xy9K.js → send-ChGpVO3O.js} +1 -1
  296. package/dist/{send-Q-uTkSFE.js → send-Cqea2UFo.js} +1 -1
  297. package/dist/{send-j15662lv.js → send-CrFWgJKx.js} +1 -1
  298. package/dist/{send-gDb60Hk-.js → send-CwK8QBR3.js} +1 -1
  299. package/dist/{send-CceNWtYE.js → send-DqR7Rxzm.js} +1 -1
  300. package/dist/{send-CJHXQvVl.js → send-DxwfUIN-.js} +1 -1
  301. package/dist/{send-ByCVQQVz.js → send-KgN1P41U.js} +1 -1
  302. package/dist/{send-B1rJLLpr.js → send-bNp87SIq.js} +1 -1
  303. package/dist/{send-B_1BtyfA.js → send-kkm_zrHQ.js} +1 -1
  304. package/dist/{send-BJDzwYJN.js → send-l3ge4wkC.js} +1 -1
  305. package/dist/{server-context-DJZT7Upf.js → server-context-CQ2v4BAx.js} +1 -1
  306. package/dist/{server-context-owOmmyUM.js → server-context-CttALzrW.js} +1 -1
  307. package/dist/{server-node-events-54d8Rmjl.js → server-node-events-CIMO6Vae.js} +1 -1
  308. package/dist/{server-node-events-CSFVqgxX.js → server-node-events-iCF2ngcN.js} +1 -1
  309. package/dist/{session-BzQdcCqN.js → session-BJHsjD3z.js} +1 -1
  310. package/dist/{session-4FpEJvkE.js → session-C_b1ttHJ.js} +1 -1
  311. package/dist/{session-dirs-OxQuIvJW.js → session-dirs-Bvbgw0GC.js} +1 -1
  312. package/dist/{session-dirs-D_ARkyw0.js → session-dirs-DHaoq7zc.js} +1 -1
  313. package/dist/{session-utils-GMvum00v.js → session-utils-Dxou8SbO.js} +1 -1
  314. package/dist/{sessions-Bl1wwotX.js → sessions-BA8Se_bT.js} +1 -1
  315. package/dist/{sessions-CdanN_ZI.js → sessions-BuZVmOWt.js} +1 -1
  316. package/dist/{sessions-B5dwRhUC.js → sessions-DvbW0FNJ.js} +1 -1
  317. package/dist/{sessions-B1t7qeEn.js → sessions-DvqsIg0M.js} +1 -1
  318. package/dist/{shared-xj-xaKFi.js → shared-BBOiNdjf.js} +1 -1
  319. package/dist/{shared-BPN3qd7G.js → shared-C2orjbTD.js} +1 -1
  320. package/dist/{skill-scanner-U3AJgjqc.js → skill-scanner-BEvov9QH.js} +1 -1
  321. package/dist/{skill-scanner-DEmbPsRh.js → skill-scanner-OTLeRZ_p.js} +1 -1
  322. package/dist/{skills-cli-CIdnXa3B.js → skills-cli-C1BOgB3y.js} +1 -1
  323. package/dist/{skills-cli-BXbGr7vl.js → skills-cli-CFT2Aq5R.js} +1 -1
  324. package/dist/{skills-install-Btw_GHbI.js → skills-install-LlKntDHa.js} +1 -1
  325. package/dist/{skills-install-DMHQRpIl.js → skills-install-tx5Mahav.js} +1 -1
  326. package/dist/{status-DXaDS_0w.js → status-Bh8V7kjv.js} +1 -1
  327. package/dist/{status-BxeKmkVr.js → status-BtBHmhQh.js} +1 -1
  328. package/dist/{status-BkcmeZg6.js → status-CpwD4y9B.js} +1 -1
  329. package/dist/status-CqaTmyih.js +1 -0
  330. package/dist/{status-DouJcFzf.js → status-yXz8PUbL.js} +1 -1
  331. package/dist/{status.update-C9iy31xr.js → status.update-CdgsLBPg.js} +1 -1
  332. package/dist/{status.update-KYyRSDZY.js → status.update-hzMro-BT.js} +1 -1
  333. package/dist/{subagent-registry-Dr20nzwk.js → subagent-registry-CaRUNwCj.js} +1 -1
  334. package/dist/{subagent-registry-CyGxu3kP.js → subagent-registry-DDEN4oJi.js} +10 -10
  335. package/dist/{subagent-registry-BiXkIDeh.js → subagent-registry-DYYfeIc3.js} +1 -1
  336. package/dist/{system-cli-b4YgXPHv.js → system-cli-4aii1JYf.js} +1 -1
  337. package/dist/{system-cli-C7YzJeP4.js → system-cli-CfkDD3FV.js} +1 -1
  338. package/dist/{tui-D2sTsa4p.js → tui-DnVRxfI8.js} +2 -2
  339. package/dist/{tui-DY2oYbxk.js → tui-JfWoLGIV.js} +2 -2
  340. package/dist/{tui-cli-GW-qybY6.js → tui-cli-CGjg2Eb5.js} +1 -1
  341. package/dist/{tui-cli-wn3DmvUG.js → tui-cli-cd7Efw5u.js} +1 -1
  342. package/dist/{tui-setup-check-DJZCJokQ.js → tui-setup-check-BEHm9wwo.js} +1 -1
  343. package/dist/{tui-setup-check-BABAyl-e.js → tui-setup-check-DK8vdhLI.js} +1 -1
  344. package/dist/{tui-stream-assembler-ign_cPkv.js → tui-stream-assembler-8ud9oyMK.js} +1 -1
  345. package/dist/{tui-stream-assembler-q9GANTDr.js → tui-stream-assembler-Br15rhRH.js} +1 -1
  346. package/dist/{update-BUzcmoDf.js → update-B5yKFeGO.js} +1 -1
  347. package/dist/{update-D6U-V8Au.js → update-DodoQDCk.js} +1 -1
  348. package/dist/{update-cli-K5dGZmg8.js → update-cli-CfJJcSUS.js} +1 -1
  349. package/dist/{update-cli-CN0oxZ_A.js → update-cli-x8Ocbf-0.js} +1 -1
  350. package/dist/{usage-cli-CfEg1_NZ.js → usage-cli-CN7L1YRG.js} +1 -1
  351. package/dist/{usage-cli-CpbYMXxS.js → usage-cli-CQmokGkG.js} +1 -1
  352. package/dist/{web-DONGrYXq.js → web-BQPd6gQJ.js} +1 -1
  353. package/dist/{web-D-NSyF6b.js → web-BXLk9UT2.js} +1 -1
  354. package/dist/web-Btgs8oWv.js +1 -0
  355. package/dist/{webhooks-cli-B_f61rq7.js → webhooks-cli-DIo8p3lk.js} +1 -1
  356. package/dist/{webhooks-cli-Bi0t3w6P.js → webhooks-cli-DhxEtiFt.js} +1 -1
  357. package/dist/{whatsapp-actions-JbF2MrTV.js → whatsapp-actions-B7r9AyZN.js} +1 -1
  358. package/dist/{whatsapp-actions-BkCMhD9X.js → whatsapp-actions-DX2QU6Gs.js} +1 -1
  359. package/dist/{with-timeout-T07SJo4N.js → with-timeout-B_p5pWDv.js} +1 -1
  360. package/dist/{with-timeout-Bwq-GyUQ.js → with-timeout-GDLpcjW7.js} +1 -1
  361. package/dist/workflow-telemetry-BMTg5lPd.js +1 -0
  362. package/dist/workflow-telemetry-Bg8MVUr_.js +2 -0
  363. package/dist/workflow-telemetry-Do1UsYwM.js +1 -0
  364. package/dist/workflow-telemetry-DqBPhVL4.js +2 -0
  365. package/package.json +1 -1
  366. package/dist/agents-DsZ5vLKE.js +0 -1
  367. package/dist/auth-choice-Btd2Rxxd.js +0 -1
  368. package/dist/auth-choice-CVV9wRFN.js +0 -1
  369. package/dist/auth-choice.apply-BOK9XRCQ.js +0 -1
  370. package/dist/auth-choice.apply-Cv-BiV5Q.js +0 -1
  371. package/dist/auth-choice.apply.transformers-CXywS3GZ.js +0 -1
  372. package/dist/builderforce-onboarding-C89jVb-9.js +0 -24
  373. package/dist/builderforce-onboarding-D5A-wEs-.js +0 -24
  374. package/dist/chrome-DUBgoZpO.js +0 -4
  375. package/dist/configure-CWBBFk3F.js +0 -1
  376. package/dist/configure-fHVOAucW.js +0 -1
  377. package/dist/health-GLcAfqDz.js +0 -1
  378. package/dist/login-CPyEf5h6.js +0 -1
  379. package/dist/model-catalog-J7R-tJDu.js +0 -1
  380. package/dist/model-picker-D2bcWrtu.js +0 -1
  381. package/dist/model-picker-DO1HtEEm.js +0 -1
  382. package/dist/onboard-channels-CmqKsAoW.js +0 -1
  383. package/dist/onboard-channels-Db0P4iWl.js +0 -1
  384. package/dist/onboard-custom-BABqIYa4.js +0 -1
  385. package/dist/onboard-custom-VpW3UC8u.js +0 -1
  386. package/dist/plugin-registry-B-UOeWqM.js +0 -1
  387. package/dist/plugin-registry-BjMr3yXM.js +0 -1
  388. package/dist/provider-dispatcher-C4nHaNqn.js +0 -1
  389. package/dist/register.configure-DAL38e7r.js +0 -1
  390. package/dist/register.configure-DZG7-WVi.js +0 -1
  391. package/dist/status-BTYqHVha.js +0 -1
  392. package/dist/web-P6QsgmSD.js +0 -1
  393. package/dist/workflow-telemetry-B8Im0mPk.js +0 -1
  394. package/dist/workflow-telemetry-DLEnm5TI.js +0 -2
  395. package/dist/workflow-telemetry-Dc_oseV7.js +0 -2
  396. package/dist/workflow-telemetry-Dkm3mofI.js +0 -1
  397. /package/dist/{devtools-CI7JyCXv.js → devtools-Cg4F-l9O.js} +0 -0
  398. /package/dist/{devtools-eMFaIsAT.js → devtools-Dl2DACSO.js} +0 -0
  399. /package/dist/{github-copilot-token-D3gHtNUu.js → github-copilot-token-BlyiXyTy.js} +0 -0
  400. /package/dist/{github-copilot-token-DHP2kAiN.js → github-copilot-token-D5sB2AUI.js} +0 -0
  401. /package/dist/{onboard-hooks-Cenav0eW.js → onboard-hooks-BaOSgxs9.js} +0 -0
  402. /package/dist/{onboard-hooks-Ce20rwpW.js → onboard-hooks-fO5eeDe_.js} +0 -0
  403. /package/dist/{qmd-manager-DVd_aWEV.js → qmd-manager-BgplOjHN.js} +0 -0
  404. /package/dist/{qmd-manager-keHvLmvP.js → qmd-manager-COUi_Fqb.js} +0 -0
@@ -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};
@@ -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"./client-CGgp3zkQ.js";import"./call-DmAU4cRX.js";import"./message-channel-z5YRpR2d.js";import"./sessions-Bl1wwotX.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./accounts-Cx82nj4E.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./ports-DTku9NSx.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./links-BKzP7VVP.js";import"./progress-Cqb-jAjT.js";import"./onboard-helpers-CckrS8_K.js";import"./prompt-style-BMWmaqSC.js";import"./daemon-runtime-B4UjqdyJ.js";import"./runtime-guard-Bi8k55v9.js";import"./systemd-DdVd5Yet.js";import"./service-EKJG69M3.js";import"./lifecycle-core-BpMvDXy1.js";import"./diagnostics-DamNPi4e.js";import{t as registerDaemonCli}from"./daemon-cli-DyVsMf8p.js";export{registerDaemonCli};
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"./client-CGgp3zkQ.js";import"./call-Du2LiaX6.js";import"./message-channel-z5YRpR2d.js";import"./sessions-BA8Se_bT.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./accounts-Cx82nj4E.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./ports-DTku9NSx.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./links-BKzP7VVP.js";import"./progress-Cqb-jAjT.js";import"./onboard-helpers-Ce_c4Raj.js";import"./prompt-style-BMWmaqSC.js";import"./daemon-runtime-Dx800VUt.js";import"./runtime-guard-Bi8k55v9.js";import"./systemd-DdVd5Yet.js";import"./service-EKJG69M3.js";import"./lifecycle-core-D9Dg5Qps.js";import"./diagnostics-DamNPi4e.js";import{t as registerDaemonCli}from"./daemon-cli-BNzthScZ.js";export{registerDaemonCli};
@@ -1 +1 @@
1
- import{g as resolveStateDir,y as resolveRequiredHomeDir}from"./paths-5FcIFMsj.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{U as VERSION,z as collectConfigEnvVars}from"./io-3R_ZyUxB.js";import{a as NODE_SERVICE_MARKER,c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,g as resolveNodeWindowsTaskName,h as resolveNodeSystemdServiceName,i as NODE_SERVICE_KIND,m as resolveNodeLaunchAgentLabel,n as GATEWAY_SERVICE_KIND,o as NODE_WINDOWS_TASK_SCRIPT_NAME,r as GATEWAY_SERVICE_MARKER}from"./constants-BBbGeL3t.js";import{n as isSupportedNodeVersion}from"./runtime-guard-DhksRHci.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";import{execFile}from"node:child_process";import{promisify}from"node:util";function isNodeRuntime(execPath){let base=path.basename(execPath).toLowerCase();return base===`node`||base===`node.exe`}function isBunRuntime(execPath){let base=path.basename(execPath).toLowerCase();return base===`bun`||base===`bun.exe`}async function resolveCliEntrypointPathForService(){let argv1=process.argv[1];if(!argv1)throw Error(`Unable to resolve CLI entrypoint path`);let normalized=path.resolve(argv1),resolvedPath=await resolveRealpathSafe(normalized);if(/[/\\]dist[/\\].+\.(cjs|js|mjs)$/.test(resolvedPath)){if(await fs.access(resolvedPath),/[/\\]dist[/\\].+\.(cjs|js|mjs)$/.test(normalized)&&normalized!==resolvedPath)try{return await fs.access(normalized),normalized}catch{}return resolvedPath}let distCandidates=buildDistCandidates(resolvedPath,normalized);for(let candidate of distCandidates)try{return await fs.access(candidate),candidate}catch{}throw Error(`Cannot find built CLI at ${distCandidates.join(` or `)}. Run "pnpm build" first, or use dev mode.`)}async function resolveRealpathSafe(inputPath){try{return await fs.realpath(inputPath)}catch{return inputPath}}function buildDistCandidates(...inputs){let candidates=[],seen=new Set;for(let inputPath of inputs){if(!inputPath)continue;let baseDir=path.dirname(inputPath);appendDistCandidates(candidates,seen,path.resolve(baseDir,`..`)),appendDistCandidates(candidates,seen,baseDir),appendNodeModulesBinCandidates(candidates,seen,inputPath)}return candidates}function appendDistCandidates(candidates,seen,baseDir){let distDir=path.resolve(baseDir,`dist`),distEntries=[path.join(distDir,`index.js`),path.join(distDir,`index.mjs`),path.join(distDir,`entry.js`),path.join(distDir,`entry.mjs`)];for(let entry of distEntries)seen.has(entry)||(seen.add(entry),candidates.push(entry))}function appendNodeModulesBinCandidates(candidates,seen,inputPath){let parts=inputPath.split(path.sep),binIndex=parts.lastIndexOf(`.bin`);if(binIndex<=0||parts[binIndex-1]!==`node_modules`)return;let binName=path.basename(inputPath),nodeModulesDir=parts.slice(0,binIndex).join(path.sep);appendDistCandidates(candidates,seen,path.join(nodeModulesDir,binName))}function resolveRepoRootForDev(){let argv1=process.argv[1];if(!argv1)throw Error(`Unable to resolve repo root`);let parts=path.resolve(argv1).split(path.sep),srcIndex=parts.lastIndexOf(`src`);if(srcIndex===-1)throw Error(`Dev mode requires running from repo (src/index.ts)`);return parts.slice(0,srcIndex).join(path.sep)}async function resolveBunPath(){return await resolveBinaryPath(`bun`)}async function resolveNodePath(){return await resolveBinaryPath(`node`)}async function resolveBinaryPath(binary){let{execSync}=await import(`node:child_process`),cmd=process.platform===`win32`?`where`:`which`;try{let resolved=execSync(`${cmd} ${binary}`,{encoding:`utf8`}).trim().split(/\r?\n/)[0]?.trim();if(!resolved)throw Error(`empty`);return await fs.access(resolved),resolved}catch{throw binary===`bun`?Error(`Bun not found in PATH. Install bun: https://bun.sh`):Error(`Node not found in PATH. Install Node 22+.`)}}async function resolveCliProgramArguments(params){let execPath=process.execPath,runtime=params.runtime??`auto`;if(runtime===`node`)return{programArguments:[params.nodePath??(isNodeRuntime(execPath)?execPath:await resolveNodePath()),await resolveCliEntrypointPathForService(),...params.args]};if(runtime===`bun`){if(params.dev){let repoRoot=resolveRepoRootForDev(),devCliPath=path.join(repoRoot,`src`,`index.ts`);return await fs.access(devCliPath),{programArguments:[isBunRuntime(execPath)?execPath:await resolveBunPath(),devCliPath,...params.args],workingDirectory:repoRoot}}return{programArguments:[isBunRuntime(execPath)?execPath:await resolveBunPath(),await resolveCliEntrypointPathForService(),...params.args]}}if(!params.dev)try{return{programArguments:[execPath,await resolveCliEntrypointPathForService(),...params.args]}}catch(error){if(!isNodeRuntime(execPath))return{programArguments:[execPath,...params.args]};throw error}let repoRoot=resolveRepoRootForDev(),devCliPath=path.join(repoRoot,`src`,`index.ts`);return await fs.access(devCliPath),isBunRuntime(execPath)?{programArguments:[execPath,devCliPath,...params.args],workingDirectory:repoRoot}:{programArguments:[await resolveBunPath(),devCliPath,...params.args],workingDirectory:repoRoot}}async function resolveGatewayProgramArguments(params){return resolveCliProgramArguments({args:[`gateway`,`--port`,String(params.port)],dev:params.dev,runtime:params.runtime,nodePath:params.nodePath})}async function resolveNodeProgramArguments(params){let args=[`node`,`run`,`--host`,params.host,`--port`,String(params.port)];return(params.tls||params.tlsFingerprint)&&args.push(`--tls`),params.tlsFingerprint&&args.push(`--tls-fingerprint`,params.tlsFingerprint),params.nodeId&&args.push(`--node-id`,params.nodeId),params.displayName&&args.push(`--display-name`,params.displayName),resolveCliProgramArguments({args,dev:params.dev,runtime:params.runtime,nodePath:params.nodePath})}const VERSION_MANAGER_MARKERS=[`/.nvm/`,`/.fnm/`,`/.volta/`,`/.asdf/`,`/.n/`,`/.nodenv/`,`/.nodebrew/`,`/nvs/`];function getPathModule(platform){return platform===`win32`?path.win32:path.posix}function isNodeExecPath(execPath,platform){let base=getPathModule(platform).basename(execPath).toLowerCase();return base===`node`||base===`node.exe`}function normalizeForCompare(input,platform){let normalized=getPathModule(platform).normalize(input).replaceAll(`\\`,`/`);return platform===`win32`?normalized.toLowerCase():normalized}function buildSystemNodeCandidates(env,platform){if(platform===`darwin`)return[`/opt/homebrew/bin/node`,`/usr/local/bin/node`,`/usr/bin/node`];if(platform===`linux`)return[`/usr/local/bin/node`,`/usr/bin/node`];if(platform===`win32`){let pathModule=getPathModule(platform),programFiles=env.ProgramFiles??`C:\\Program Files`,programFilesX86=env[`ProgramFiles(x86)`]??`C:\\Program Files (x86)`;return[pathModule.join(programFiles,`nodejs`,`node.exe`),pathModule.join(programFilesX86,`nodejs`,`node.exe`)]}return[]}const execFileAsync=promisify(execFile);async function resolveNodeVersion(nodePath,execFileImpl){try{let{stdout}=await execFileImpl(nodePath,[`-p`,`process.versions.node`],{encoding:`utf8`});return stdout.trim()||null}catch{return null}}function isVersionManagedNodePath(nodePath,platform=process.platform){let normalized=normalizeForCompare(nodePath,platform);return VERSION_MANAGER_MARKERS.some(marker=>normalized.includes(marker))}function isSystemNodePath(nodePath,env=process.env,platform=process.platform){let normalized=normalizeForCompare(nodePath,platform);return buildSystemNodeCandidates(env,platform).some(candidate=>normalized===normalizeForCompare(candidate,platform))}async function resolveSystemNodePath(env=process.env,platform=process.platform){let candidates=buildSystemNodeCandidates(env,platform);for(let candidate of candidates)try{return await fs.access(candidate),candidate}catch{}return null}async function resolveSystemNodeInfo(params){let systemNode=await resolveSystemNodePath(params.env??process.env,params.platform??process.platform);if(!systemNode)return null;let version=await resolveNodeVersion(systemNode,params.execFile??execFileAsync);return{path:systemNode,version,supported:isSupportedNodeVersion(version)}}function renderSystemNodeWarning(systemNode,selectedNodePath){if(!systemNode||systemNode.supported)return null;let versionLabel=systemNode.version??`unknown`,selectedLabel=selectedNodePath?` Using ${selectedNodePath} for the daemon.`:``;return`System Node ${versionLabel} at ${systemNode.path} is below the required Node 22+.${selectedLabel} Install Node 22+ from nodejs.org or Homebrew.`}async function resolvePreferredNodePath(params){if(params.runtime!==`node`)return;let platform=params.platform??process.platform,currentExecPath=params.execPath??process.execPath;if(currentExecPath&&isNodeExecPath(currentExecPath,platform)&&isSupportedNodeVersion(await resolveNodeVersion(currentExecPath,params.execFile??execFileAsync)))return currentExecPath;let systemNode=await resolveSystemNodeInfo(params);if(systemNode?.supported)return systemNode.path}function addNonEmptyDir(dirs,dir){dir&&dirs.push(dir)}function appendSubdir(base,subdir){if(base)return base.endsWith(`/${subdir}`)?base:path.posix.join(base,subdir)}function addCommonUserBinDirs(dirs,home){dirs.push(`${home}/.local/bin`),dirs.push(`${home}/.npm-global/bin`),dirs.push(`${home}/bin`),dirs.push(`${home}/.volta/bin`),dirs.push(`${home}/.asdf/shims`),dirs.push(`${home}/.bun/bin`)}function resolveSystemPathDirs(platform){return platform===`darwin`?[`/opt/homebrew/bin`,`/usr/local/bin`,`/usr/bin`,`/bin`]:platform===`linux`?[`/usr/local/bin`,`/usr/bin`,`/bin`]:[]}function resolveDarwinUserBinDirs(home,env){if(!home)return[];let dirs=[];return addNonEmptyDir(dirs,env?.PNPM_HOME),addNonEmptyDir(dirs,appendSubdir(env?.NPM_CONFIG_PREFIX,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.BUN_INSTALL,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.VOLTA_HOME,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.ASDF_DATA_DIR,`shims`)),addNonEmptyDir(dirs,env?.NVM_DIR),addNonEmptyDir(dirs,appendSubdir(env?.FNM_DIR,`aliases/default/bin`)),addCommonUserBinDirs(dirs,home),dirs.push(`${home}/Library/Application Support/fnm/aliases/default/bin`),dirs.push(`${home}/.fnm/aliases/default/bin`),dirs.push(`${home}/Library/pnpm`),dirs.push(`${home}/.local/share/pnpm`),dirs}function resolveLinuxUserBinDirs(home,env){if(!home)return[];let dirs=[];return addNonEmptyDir(dirs,env?.PNPM_HOME),addNonEmptyDir(dirs,appendSubdir(env?.NPM_CONFIG_PREFIX,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.BUN_INSTALL,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.VOLTA_HOME,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.ASDF_DATA_DIR,`shims`)),addNonEmptyDir(dirs,appendSubdir(env?.NVM_DIR,`current/bin`)),addNonEmptyDir(dirs,appendSubdir(env?.FNM_DIR,`current/bin`)),addCommonUserBinDirs(dirs,home),dirs.push(`${home}/.nvm/current/bin`),dirs.push(`${home}/.fnm/current/bin`),dirs.push(`${home}/.local/share/pnpm`),dirs}function getMinimalServicePathParts(options={}){let platform=options.platform??process.platform;if(platform===`win32`)return[];let parts=[],extraDirs=options.extraDirs??[],systemDirs=resolveSystemPathDirs(platform),userDirs=platform===`linux`?resolveLinuxUserBinDirs(options.home,options.env):platform===`darwin`?resolveDarwinUserBinDirs(options.home,options.env):[],add=dir=>{dir&&(parts.includes(dir)||parts.push(dir))};for(let dir of extraDirs)add(dir);for(let dir of userDirs)add(dir);for(let dir of systemDirs)add(dir);return parts}function getMinimalServicePathPartsFromEnv(options={}){let env=options.env??process.env;return getMinimalServicePathParts({...options,home:options.home??env.HOME,env})}function buildMinimalServicePath(options={}){let env=options.env??process.env;return(options.platform??process.platform)===`win32`?env.PATH??``:getMinimalServicePathPartsFromEnv({...options,env}).join(path.posix.delimiter)}function buildServiceEnvironment(params){let{env,port,token,launchdLabel}=params,profile=env.BUILDERFORCE_AGENTS_PROFILE,resolvedLaunchdLabel=launchdLabel||(process.platform===`darwin`?resolveGatewayLaunchAgentLabel(profile):void 0),systemdUnit=`${resolveGatewaySystemdServiceName(profile)}.service`,stateDir=env.BUILDERFORCE_AGENTS_STATE_DIR?.trim()||resolveStateDir(env),configPath=env.BUILDERFORCE_AGENTS_CONFIG_PATH?.trim()||(stateDir?path.join(stateDir,`builderforce.json`):void 0),tmpDir=env.TMPDIR?.trim()||os.tmpdir();return{HOME:env.HOME,TMPDIR:tmpDir,PATH:buildMinimalServicePath({env}),BUILDERFORCE_AGENTS_PROFILE:profile,BUILDERFORCE_AGENTS_STATE_DIR:stateDir,BUILDERFORCE_AGENTS_CONFIG_PATH:configPath,BUILDERFORCE_AGENTS_GATEWAY_PORT:String(port),BUILDERFORCE_AGENTS_GATEWAY_TOKEN:token,BUILDERFORCE_AGENTS_LAUNCHD_LABEL:resolvedLaunchdLabel,BUILDERFORCE_AGENTS_SYSTEMD_UNIT:systemdUnit,BUILDERFORCE_AGENTS_SERVICE_MARKER:GATEWAY_SERVICE_MARKER,BUILDERFORCE_AGENTS_SERVICE_KIND:GATEWAY_SERVICE_KIND,BUILDERFORCE_AGENTS_SERVICE_VERSION:VERSION}}function buildNodeServiceEnvironment(params){let{env}=params,stateDir=env.BUILDERFORCE_AGENTS_STATE_DIR,configPath=env.BUILDERFORCE_AGENTS_CONFIG_PATH,tmpDir=env.TMPDIR?.trim()||os.tmpdir();return{HOME:env.HOME,TMPDIR:tmpDir,PATH:buildMinimalServicePath({env}),BUILDERFORCE_AGENTS_STATE_DIR:stateDir,BUILDERFORCE_AGENTS_CONFIG_PATH:configPath,BUILDERFORCE_AGENTS_LAUNCHD_LABEL:resolveNodeLaunchAgentLabel(),BUILDERFORCE_AGENTS_SYSTEMD_UNIT:resolveNodeSystemdServiceName(),BUILDERFORCE_AGENTS_WINDOWS_TASK_NAME:resolveNodeWindowsTaskName(),BUILDERFORCE_AGENTS_TASK_SCRIPT_NAME:NODE_WINDOWS_TASK_SCRIPT_NAME,BUILDERFORCE_AGENTS_LOG_PREFIX:`node`,BUILDERFORCE_AGENTS_SERVICE_MARKER:NODE_SERVICE_MARKER,BUILDERFORCE_AGENTS_SERVICE_KIND:NODE_SERVICE_KIND,BUILDERFORCE_AGENTS_SERVICE_VERSION:VERSION}}async function emitNodeRuntimeWarning(params){if(params.runtime!==`node`)return;let warning=renderSystemNodeWarning(await resolveSystemNodeInfo({env:params.env}),params.nodeProgram);warning&&params.warn?.(warning,params.title)}function resolveGatewayDevMode(argv=process.argv){let normalizedEntry=argv[1]?.replaceAll(`\\`,`/`);return!!(normalizedEntry?.includes(`/src/`)&&normalizedEntry.endsWith(`.ts`))}async function buildGatewayInstallPlan(params){let devMode=params.devMode??resolveGatewayDevMode(),nodePath=params.nodePath??await resolvePreferredNodePath({env:params.env,runtime:params.runtime}),{programArguments,workingDirectory}=await resolveGatewayProgramArguments({port:params.port,dev:devMode,runtime:params.runtime,nodePath});!workingDirectory&&process.platform===`win32`&&(workingDirectory=resolveRequiredHomeDir(params.env,os.homedir)),await emitNodeRuntimeWarning({env:params.env,runtime:params.runtime,nodeProgram:programArguments[0],warn:params.warn,title:`Gateway runtime`});let serviceEnvironment=buildServiceEnvironment({env:params.env,port:params.port,token:params.token,launchdLabel:process.platform===`darwin`?resolveGatewayLaunchAgentLabel(params.env.BUILDERFORCE_AGENTS_PROFILE):void 0}),environment={...collectConfigEnvVars(params.config)};return Object.assign(environment,serviceEnvironment),{programArguments,workingDirectory,environment}}function gatewayInstallErrorHint(platform=process.platform){return platform===`win32`?`Tip: rerun from an elevated PowerShell (Start → type PowerShell → right-click → Run as administrator) or skip service install.`:`Tip: rerun \`${formatCliCommand(`builderforce gateway install`)}\` after fixing the error.`}const DEFAULT_GATEWAY_DAEMON_RUNTIME=`node`,GATEWAY_DAEMON_RUNTIME_OPTIONS=[{value:`node`,label:`Node (recommended)`,hint:`Required for WhatsApp + Telegram. Bun can corrupt memory on reconnect.`}];function isGatewayDaemonRuntime(value){return value===`node`||value===`bun`}export{gatewayInstallErrorHint as a,buildNodeServiceEnvironment as c,isVersionManagedNodePath as d,renderSystemNodeWarning as f,resolveNodeProgramArguments as g,resolveSystemNodePath as h,buildGatewayInstallPlan as i,getMinimalServicePathPartsFromEnv as l,resolveSystemNodeInfo as m,GATEWAY_DAEMON_RUNTIME_OPTIONS as n,resolveGatewayDevMode as o,resolvePreferredNodePath as p,isGatewayDaemonRuntime as r,emitNodeRuntimeWarning as s,DEFAULT_GATEWAY_DAEMON_RUNTIME as t,isSystemNodePath as u};
1
+ import{g as resolveStateDir,y as resolveRequiredHomeDir}from"./paths-5FcIFMsj.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{U as VERSION,z as collectConfigEnvVars}from"./io-BLBq4T2o.js";import{a as NODE_SERVICE_MARKER,c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,g as resolveNodeWindowsTaskName,h as resolveNodeSystemdServiceName,i as NODE_SERVICE_KIND,m as resolveNodeLaunchAgentLabel,n as GATEWAY_SERVICE_KIND,o as NODE_WINDOWS_TASK_SCRIPT_NAME,r as GATEWAY_SERVICE_MARKER}from"./constants-BBbGeL3t.js";import{n as isSupportedNodeVersion}from"./runtime-guard-DhksRHci.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";import{execFile}from"node:child_process";import{promisify}from"node:util";function isNodeRuntime(execPath){let base=path.basename(execPath).toLowerCase();return base===`node`||base===`node.exe`}function isBunRuntime(execPath){let base=path.basename(execPath).toLowerCase();return base===`bun`||base===`bun.exe`}async function resolveCliEntrypointPathForService(){let argv1=process.argv[1];if(!argv1)throw Error(`Unable to resolve CLI entrypoint path`);let normalized=path.resolve(argv1),resolvedPath=await resolveRealpathSafe(normalized);if(/[/\\]dist[/\\].+\.(cjs|js|mjs)$/.test(resolvedPath)){if(await fs.access(resolvedPath),/[/\\]dist[/\\].+\.(cjs|js|mjs)$/.test(normalized)&&normalized!==resolvedPath)try{return await fs.access(normalized),normalized}catch{}return resolvedPath}let distCandidates=buildDistCandidates(resolvedPath,normalized);for(let candidate of distCandidates)try{return await fs.access(candidate),candidate}catch{}throw Error(`Cannot find built CLI at ${distCandidates.join(` or `)}. Run "pnpm build" first, or use dev mode.`)}async function resolveRealpathSafe(inputPath){try{return await fs.realpath(inputPath)}catch{return inputPath}}function buildDistCandidates(...inputs){let candidates=[],seen=new Set;for(let inputPath of inputs){if(!inputPath)continue;let baseDir=path.dirname(inputPath);appendDistCandidates(candidates,seen,path.resolve(baseDir,`..`)),appendDistCandidates(candidates,seen,baseDir),appendNodeModulesBinCandidates(candidates,seen,inputPath)}return candidates}function appendDistCandidates(candidates,seen,baseDir){let distDir=path.resolve(baseDir,`dist`),distEntries=[path.join(distDir,`index.js`),path.join(distDir,`index.mjs`),path.join(distDir,`entry.js`),path.join(distDir,`entry.mjs`)];for(let entry of distEntries)seen.has(entry)||(seen.add(entry),candidates.push(entry))}function appendNodeModulesBinCandidates(candidates,seen,inputPath){let parts=inputPath.split(path.sep),binIndex=parts.lastIndexOf(`.bin`);if(binIndex<=0||parts[binIndex-1]!==`node_modules`)return;let binName=path.basename(inputPath),nodeModulesDir=parts.slice(0,binIndex).join(path.sep);appendDistCandidates(candidates,seen,path.join(nodeModulesDir,binName))}function resolveRepoRootForDev(){let argv1=process.argv[1];if(!argv1)throw Error(`Unable to resolve repo root`);let parts=path.resolve(argv1).split(path.sep),srcIndex=parts.lastIndexOf(`src`);if(srcIndex===-1)throw Error(`Dev mode requires running from repo (src/index.ts)`);return parts.slice(0,srcIndex).join(path.sep)}async function resolveBunPath(){return await resolveBinaryPath(`bun`)}async function resolveNodePath(){return await resolveBinaryPath(`node`)}async function resolveBinaryPath(binary){let{execSync}=await import(`node:child_process`),cmd=process.platform===`win32`?`where`:`which`;try{let resolved=execSync(`${cmd} ${binary}`,{encoding:`utf8`}).trim().split(/\r?\n/)[0]?.trim();if(!resolved)throw Error(`empty`);return await fs.access(resolved),resolved}catch{throw binary===`bun`?Error(`Bun not found in PATH. Install bun: https://bun.sh`):Error(`Node not found in PATH. Install Node 22+.`)}}async function resolveCliProgramArguments(params){let execPath=process.execPath,runtime=params.runtime??`auto`;if(runtime===`node`)return{programArguments:[params.nodePath??(isNodeRuntime(execPath)?execPath:await resolveNodePath()),await resolveCliEntrypointPathForService(),...params.args]};if(runtime===`bun`){if(params.dev){let repoRoot=resolveRepoRootForDev(),devCliPath=path.join(repoRoot,`src`,`index.ts`);return await fs.access(devCliPath),{programArguments:[isBunRuntime(execPath)?execPath:await resolveBunPath(),devCliPath,...params.args],workingDirectory:repoRoot}}return{programArguments:[isBunRuntime(execPath)?execPath:await resolveBunPath(),await resolveCliEntrypointPathForService(),...params.args]}}if(!params.dev)try{return{programArguments:[execPath,await resolveCliEntrypointPathForService(),...params.args]}}catch(error){if(!isNodeRuntime(execPath))return{programArguments:[execPath,...params.args]};throw error}let repoRoot=resolveRepoRootForDev(),devCliPath=path.join(repoRoot,`src`,`index.ts`);return await fs.access(devCliPath),isBunRuntime(execPath)?{programArguments:[execPath,devCliPath,...params.args],workingDirectory:repoRoot}:{programArguments:[await resolveBunPath(),devCliPath,...params.args],workingDirectory:repoRoot}}async function resolveGatewayProgramArguments(params){return resolveCliProgramArguments({args:[`gateway`,`--port`,String(params.port)],dev:params.dev,runtime:params.runtime,nodePath:params.nodePath})}async function resolveNodeProgramArguments(params){let args=[`node`,`run`,`--host`,params.host,`--port`,String(params.port)];return(params.tls||params.tlsFingerprint)&&args.push(`--tls`),params.tlsFingerprint&&args.push(`--tls-fingerprint`,params.tlsFingerprint),params.nodeId&&args.push(`--node-id`,params.nodeId),params.displayName&&args.push(`--display-name`,params.displayName),resolveCliProgramArguments({args,dev:params.dev,runtime:params.runtime,nodePath:params.nodePath})}const VERSION_MANAGER_MARKERS=[`/.nvm/`,`/.fnm/`,`/.volta/`,`/.asdf/`,`/.n/`,`/.nodenv/`,`/.nodebrew/`,`/nvs/`];function getPathModule(platform){return platform===`win32`?path.win32:path.posix}function isNodeExecPath(execPath,platform){let base=getPathModule(platform).basename(execPath).toLowerCase();return base===`node`||base===`node.exe`}function normalizeForCompare(input,platform){let normalized=getPathModule(platform).normalize(input).replaceAll(`\\`,`/`);return platform===`win32`?normalized.toLowerCase():normalized}function buildSystemNodeCandidates(env,platform){if(platform===`darwin`)return[`/opt/homebrew/bin/node`,`/usr/local/bin/node`,`/usr/bin/node`];if(platform===`linux`)return[`/usr/local/bin/node`,`/usr/bin/node`];if(platform===`win32`){let pathModule=getPathModule(platform),programFiles=env.ProgramFiles??`C:\\Program Files`,programFilesX86=env[`ProgramFiles(x86)`]??`C:\\Program Files (x86)`;return[pathModule.join(programFiles,`nodejs`,`node.exe`),pathModule.join(programFilesX86,`nodejs`,`node.exe`)]}return[]}const execFileAsync=promisify(execFile);async function resolveNodeVersion(nodePath,execFileImpl){try{let{stdout}=await execFileImpl(nodePath,[`-p`,`process.versions.node`],{encoding:`utf8`});return stdout.trim()||null}catch{return null}}function isVersionManagedNodePath(nodePath,platform=process.platform){let normalized=normalizeForCompare(nodePath,platform);return VERSION_MANAGER_MARKERS.some(marker=>normalized.includes(marker))}function isSystemNodePath(nodePath,env=process.env,platform=process.platform){let normalized=normalizeForCompare(nodePath,platform);return buildSystemNodeCandidates(env,platform).some(candidate=>normalized===normalizeForCompare(candidate,platform))}async function resolveSystemNodePath(env=process.env,platform=process.platform){let candidates=buildSystemNodeCandidates(env,platform);for(let candidate of candidates)try{return await fs.access(candidate),candidate}catch{}return null}async function resolveSystemNodeInfo(params){let systemNode=await resolveSystemNodePath(params.env??process.env,params.platform??process.platform);if(!systemNode)return null;let version=await resolveNodeVersion(systemNode,params.execFile??execFileAsync);return{path:systemNode,version,supported:isSupportedNodeVersion(version)}}function renderSystemNodeWarning(systemNode,selectedNodePath){if(!systemNode||systemNode.supported)return null;let versionLabel=systemNode.version??`unknown`,selectedLabel=selectedNodePath?` Using ${selectedNodePath} for the daemon.`:``;return`System Node ${versionLabel} at ${systemNode.path} is below the required Node 22+.${selectedLabel} Install Node 22+ from nodejs.org or Homebrew.`}async function resolvePreferredNodePath(params){if(params.runtime!==`node`)return;let platform=params.platform??process.platform,currentExecPath=params.execPath??process.execPath;if(currentExecPath&&isNodeExecPath(currentExecPath,platform)&&isSupportedNodeVersion(await resolveNodeVersion(currentExecPath,params.execFile??execFileAsync)))return currentExecPath;let systemNode=await resolveSystemNodeInfo(params);if(systemNode?.supported)return systemNode.path}function addNonEmptyDir(dirs,dir){dir&&dirs.push(dir)}function appendSubdir(base,subdir){if(base)return base.endsWith(`/${subdir}`)?base:path.posix.join(base,subdir)}function addCommonUserBinDirs(dirs,home){dirs.push(`${home}/.local/bin`),dirs.push(`${home}/.npm-global/bin`),dirs.push(`${home}/bin`),dirs.push(`${home}/.volta/bin`),dirs.push(`${home}/.asdf/shims`),dirs.push(`${home}/.bun/bin`)}function resolveSystemPathDirs(platform){return platform===`darwin`?[`/opt/homebrew/bin`,`/usr/local/bin`,`/usr/bin`,`/bin`]:platform===`linux`?[`/usr/local/bin`,`/usr/bin`,`/bin`]:[]}function resolveDarwinUserBinDirs(home,env){if(!home)return[];let dirs=[];return addNonEmptyDir(dirs,env?.PNPM_HOME),addNonEmptyDir(dirs,appendSubdir(env?.NPM_CONFIG_PREFIX,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.BUN_INSTALL,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.VOLTA_HOME,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.ASDF_DATA_DIR,`shims`)),addNonEmptyDir(dirs,env?.NVM_DIR),addNonEmptyDir(dirs,appendSubdir(env?.FNM_DIR,`aliases/default/bin`)),addCommonUserBinDirs(dirs,home),dirs.push(`${home}/Library/Application Support/fnm/aliases/default/bin`),dirs.push(`${home}/.fnm/aliases/default/bin`),dirs.push(`${home}/Library/pnpm`),dirs.push(`${home}/.local/share/pnpm`),dirs}function resolveLinuxUserBinDirs(home,env){if(!home)return[];let dirs=[];return addNonEmptyDir(dirs,env?.PNPM_HOME),addNonEmptyDir(dirs,appendSubdir(env?.NPM_CONFIG_PREFIX,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.BUN_INSTALL,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.VOLTA_HOME,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.ASDF_DATA_DIR,`shims`)),addNonEmptyDir(dirs,appendSubdir(env?.NVM_DIR,`current/bin`)),addNonEmptyDir(dirs,appendSubdir(env?.FNM_DIR,`current/bin`)),addCommonUserBinDirs(dirs,home),dirs.push(`${home}/.nvm/current/bin`),dirs.push(`${home}/.fnm/current/bin`),dirs.push(`${home}/.local/share/pnpm`),dirs}function getMinimalServicePathParts(options={}){let platform=options.platform??process.platform;if(platform===`win32`)return[];let parts=[],extraDirs=options.extraDirs??[],systemDirs=resolveSystemPathDirs(platform),userDirs=platform===`linux`?resolveLinuxUserBinDirs(options.home,options.env):platform===`darwin`?resolveDarwinUserBinDirs(options.home,options.env):[],add=dir=>{dir&&(parts.includes(dir)||parts.push(dir))};for(let dir of extraDirs)add(dir);for(let dir of userDirs)add(dir);for(let dir of systemDirs)add(dir);return parts}function getMinimalServicePathPartsFromEnv(options={}){let env=options.env??process.env;return getMinimalServicePathParts({...options,home:options.home??env.HOME,env})}function buildMinimalServicePath(options={}){let env=options.env??process.env;return(options.platform??process.platform)===`win32`?env.PATH??``:getMinimalServicePathPartsFromEnv({...options,env}).join(path.posix.delimiter)}function buildServiceEnvironment(params){let{env,port,token,launchdLabel}=params,profile=env.BUILDERFORCE_AGENTS_PROFILE,resolvedLaunchdLabel=launchdLabel||(process.platform===`darwin`?resolveGatewayLaunchAgentLabel(profile):void 0),systemdUnit=`${resolveGatewaySystemdServiceName(profile)}.service`,stateDir=env.BUILDERFORCE_AGENTS_STATE_DIR?.trim()||resolveStateDir(env),configPath=env.BUILDERFORCE_AGENTS_CONFIG_PATH?.trim()||(stateDir?path.join(stateDir,`builderforce.json`):void 0),tmpDir=env.TMPDIR?.trim()||os.tmpdir();return{HOME:env.HOME,TMPDIR:tmpDir,PATH:buildMinimalServicePath({env}),BUILDERFORCE_AGENTS_PROFILE:profile,BUILDERFORCE_AGENTS_STATE_DIR:stateDir,BUILDERFORCE_AGENTS_CONFIG_PATH:configPath,BUILDERFORCE_AGENTS_GATEWAY_PORT:String(port),BUILDERFORCE_AGENTS_GATEWAY_TOKEN:token,BUILDERFORCE_AGENTS_LAUNCHD_LABEL:resolvedLaunchdLabel,BUILDERFORCE_AGENTS_SYSTEMD_UNIT:systemdUnit,BUILDERFORCE_AGENTS_SERVICE_MARKER:GATEWAY_SERVICE_MARKER,BUILDERFORCE_AGENTS_SERVICE_KIND:GATEWAY_SERVICE_KIND,BUILDERFORCE_AGENTS_SERVICE_VERSION:VERSION}}function buildNodeServiceEnvironment(params){let{env}=params,stateDir=env.BUILDERFORCE_AGENTS_STATE_DIR,configPath=env.BUILDERFORCE_AGENTS_CONFIG_PATH,tmpDir=env.TMPDIR?.trim()||os.tmpdir();return{HOME:env.HOME,TMPDIR:tmpDir,PATH:buildMinimalServicePath({env}),BUILDERFORCE_AGENTS_STATE_DIR:stateDir,BUILDERFORCE_AGENTS_CONFIG_PATH:configPath,BUILDERFORCE_AGENTS_LAUNCHD_LABEL:resolveNodeLaunchAgentLabel(),BUILDERFORCE_AGENTS_SYSTEMD_UNIT:resolveNodeSystemdServiceName(),BUILDERFORCE_AGENTS_WINDOWS_TASK_NAME:resolveNodeWindowsTaskName(),BUILDERFORCE_AGENTS_TASK_SCRIPT_NAME:NODE_WINDOWS_TASK_SCRIPT_NAME,BUILDERFORCE_AGENTS_LOG_PREFIX:`node`,BUILDERFORCE_AGENTS_SERVICE_MARKER:NODE_SERVICE_MARKER,BUILDERFORCE_AGENTS_SERVICE_KIND:NODE_SERVICE_KIND,BUILDERFORCE_AGENTS_SERVICE_VERSION:VERSION}}async function emitNodeRuntimeWarning(params){if(params.runtime!==`node`)return;let warning=renderSystemNodeWarning(await resolveSystemNodeInfo({env:params.env}),params.nodeProgram);warning&&params.warn?.(warning,params.title)}function resolveGatewayDevMode(argv=process.argv){let normalizedEntry=argv[1]?.replaceAll(`\\`,`/`);return!!(normalizedEntry?.includes(`/src/`)&&normalizedEntry.endsWith(`.ts`))}async function buildGatewayInstallPlan(params){let devMode=params.devMode??resolveGatewayDevMode(),nodePath=params.nodePath??await resolvePreferredNodePath({env:params.env,runtime:params.runtime}),{programArguments,workingDirectory}=await resolveGatewayProgramArguments({port:params.port,dev:devMode,runtime:params.runtime,nodePath});!workingDirectory&&process.platform===`win32`&&(workingDirectory=resolveRequiredHomeDir(params.env,os.homedir)),await emitNodeRuntimeWarning({env:params.env,runtime:params.runtime,nodeProgram:programArguments[0],warn:params.warn,title:`Gateway runtime`});let serviceEnvironment=buildServiceEnvironment({env:params.env,port:params.port,token:params.token,launchdLabel:process.platform===`darwin`?resolveGatewayLaunchAgentLabel(params.env.BUILDERFORCE_AGENTS_PROFILE):void 0}),environment={...collectConfigEnvVars(params.config)};return Object.assign(environment,serviceEnvironment),{programArguments,workingDirectory,environment}}function gatewayInstallErrorHint(platform=process.platform){return platform===`win32`?`Tip: rerun from an elevated PowerShell (Start → type PowerShell → right-click → Run as administrator) or skip service install.`:`Tip: rerun \`${formatCliCommand(`builderforce gateway install`)}\` after fixing the error.`}const DEFAULT_GATEWAY_DAEMON_RUNTIME=`node`,GATEWAY_DAEMON_RUNTIME_OPTIONS=[{value:`node`,label:`Node (recommended)`,hint:`Required for WhatsApp + Telegram. Bun can corrupt memory on reconnect.`}];function isGatewayDaemonRuntime(value){return value===`node`||value===`bun`}export{gatewayInstallErrorHint as a,buildNodeServiceEnvironment as c,isVersionManagedNodePath as d,renderSystemNodeWarning as f,resolveNodeProgramArguments as g,resolveSystemNodePath as h,buildGatewayInstallPlan as i,getMinimalServicePathPartsFromEnv as l,resolveSystemNodeInfo as m,GATEWAY_DAEMON_RUNTIME_OPTIONS as n,resolveGatewayDevMode as o,resolvePreferredNodePath as p,isGatewayDaemonRuntime as r,emitNodeRuntimeWarning as s,DEFAULT_GATEWAY_DAEMON_RUNTIME as t,isSystemNodePath as u};
@@ -1 +1 @@
1
- import{g as resolveStateDir,y as resolveRequiredHomeDir}from"./paths-BHg-VHB4.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{U as VERSION,z as collectConfigEnvVars}from"./io-CohJffHG.js";import{a as NODE_SERVICE_MARKER,c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,g as resolveNodeWindowsTaskName,h as resolveNodeSystemdServiceName,i as NODE_SERVICE_KIND,m as resolveNodeLaunchAgentLabel,n as GATEWAY_SERVICE_KIND,o as NODE_WINDOWS_TASK_SCRIPT_NAME,r as GATEWAY_SERVICE_MARKER}from"./constants-D2th5NXV.js";import{n as isSupportedNodeVersion}from"./runtime-guard-Bi8k55v9.js";import{execFile}from"node:child_process";import os from"node:os";import path from"node:path";import{promisify}from"node:util";import fs from"node:fs/promises";function isNodeRuntime(execPath){let base=path.basename(execPath).toLowerCase();return base===`node`||base===`node.exe`}function isBunRuntime(execPath){let base=path.basename(execPath).toLowerCase();return base===`bun`||base===`bun.exe`}async function resolveCliEntrypointPathForService(){let argv1=process.argv[1];if(!argv1)throw Error(`Unable to resolve CLI entrypoint path`);let normalized=path.resolve(argv1),resolvedPath=await resolveRealpathSafe(normalized);if(/[/\\]dist[/\\].+\.(cjs|js|mjs)$/.test(resolvedPath)){if(await fs.access(resolvedPath),/[/\\]dist[/\\].+\.(cjs|js|mjs)$/.test(normalized)&&normalized!==resolvedPath)try{return await fs.access(normalized),normalized}catch{}return resolvedPath}let distCandidates=buildDistCandidates(resolvedPath,normalized);for(let candidate of distCandidates)try{return await fs.access(candidate),candidate}catch{}throw Error(`Cannot find built CLI at ${distCandidates.join(` or `)}. Run "pnpm build" first, or use dev mode.`)}async function resolveRealpathSafe(inputPath){try{return await fs.realpath(inputPath)}catch{return inputPath}}function buildDistCandidates(...inputs){let candidates=[],seen=new Set;for(let inputPath of inputs){if(!inputPath)continue;let baseDir=path.dirname(inputPath);appendDistCandidates(candidates,seen,path.resolve(baseDir,`..`)),appendDistCandidates(candidates,seen,baseDir),appendNodeModulesBinCandidates(candidates,seen,inputPath)}return candidates}function appendDistCandidates(candidates,seen,baseDir){let distDir=path.resolve(baseDir,`dist`),distEntries=[path.join(distDir,`index.js`),path.join(distDir,`index.mjs`),path.join(distDir,`entry.js`),path.join(distDir,`entry.mjs`)];for(let entry of distEntries)seen.has(entry)||(seen.add(entry),candidates.push(entry))}function appendNodeModulesBinCandidates(candidates,seen,inputPath){let parts=inputPath.split(path.sep),binIndex=parts.lastIndexOf(`.bin`);if(binIndex<=0||parts[binIndex-1]!==`node_modules`)return;let binName=path.basename(inputPath),nodeModulesDir=parts.slice(0,binIndex).join(path.sep);appendDistCandidates(candidates,seen,path.join(nodeModulesDir,binName))}function resolveRepoRootForDev(){let argv1=process.argv[1];if(!argv1)throw Error(`Unable to resolve repo root`);let parts=path.resolve(argv1).split(path.sep),srcIndex=parts.lastIndexOf(`src`);if(srcIndex===-1)throw Error(`Dev mode requires running from repo (src/index.ts)`);return parts.slice(0,srcIndex).join(path.sep)}async function resolveBunPath(){return await resolveBinaryPath(`bun`)}async function resolveNodePath(){return await resolveBinaryPath(`node`)}async function resolveBinaryPath(binary){let{execSync}=await import(`node:child_process`),cmd=process.platform===`win32`?`where`:`which`;try{let resolved=execSync(`${cmd} ${binary}`,{encoding:`utf8`}).trim().split(/\r?\n/)[0]?.trim();if(!resolved)throw Error(`empty`);return await fs.access(resolved),resolved}catch{throw binary===`bun`?Error(`Bun not found in PATH. Install bun: https://bun.sh`):Error(`Node not found in PATH. Install Node 22+.`)}}async function resolveCliProgramArguments(params){let execPath=process.execPath,runtime=params.runtime??`auto`;if(runtime===`node`)return{programArguments:[params.nodePath??(isNodeRuntime(execPath)?execPath:await resolveNodePath()),await resolveCliEntrypointPathForService(),...params.args]};if(runtime===`bun`){if(params.dev){let repoRoot=resolveRepoRootForDev(),devCliPath=path.join(repoRoot,`src`,`index.ts`);return await fs.access(devCliPath),{programArguments:[isBunRuntime(execPath)?execPath:await resolveBunPath(),devCliPath,...params.args],workingDirectory:repoRoot}}return{programArguments:[isBunRuntime(execPath)?execPath:await resolveBunPath(),await resolveCliEntrypointPathForService(),...params.args]}}if(!params.dev)try{return{programArguments:[execPath,await resolveCliEntrypointPathForService(),...params.args]}}catch(error){if(!isNodeRuntime(execPath))return{programArguments:[execPath,...params.args]};throw error}let repoRoot=resolveRepoRootForDev(),devCliPath=path.join(repoRoot,`src`,`index.ts`);return await fs.access(devCliPath),isBunRuntime(execPath)?{programArguments:[execPath,devCliPath,...params.args],workingDirectory:repoRoot}:{programArguments:[await resolveBunPath(),devCliPath,...params.args],workingDirectory:repoRoot}}async function resolveGatewayProgramArguments(params){return resolveCliProgramArguments({args:[`gateway`,`--port`,String(params.port)],dev:params.dev,runtime:params.runtime,nodePath:params.nodePath})}async function resolveNodeProgramArguments(params){let args=[`node`,`run`,`--host`,params.host,`--port`,String(params.port)];return(params.tls||params.tlsFingerprint)&&args.push(`--tls`),params.tlsFingerprint&&args.push(`--tls-fingerprint`,params.tlsFingerprint),params.nodeId&&args.push(`--node-id`,params.nodeId),params.displayName&&args.push(`--display-name`,params.displayName),resolveCliProgramArguments({args,dev:params.dev,runtime:params.runtime,nodePath:params.nodePath})}const VERSION_MANAGER_MARKERS=[`/.nvm/`,`/.fnm/`,`/.volta/`,`/.asdf/`,`/.n/`,`/.nodenv/`,`/.nodebrew/`,`/nvs/`];function getPathModule(platform){return platform===`win32`?path.win32:path.posix}function isNodeExecPath(execPath,platform){let base=getPathModule(platform).basename(execPath).toLowerCase();return base===`node`||base===`node.exe`}function normalizeForCompare(input,platform){let normalized=getPathModule(platform).normalize(input).replaceAll(`\\`,`/`);return platform===`win32`?normalized.toLowerCase():normalized}function buildSystemNodeCandidates(env,platform){if(platform===`darwin`)return[`/opt/homebrew/bin/node`,`/usr/local/bin/node`,`/usr/bin/node`];if(platform===`linux`)return[`/usr/local/bin/node`,`/usr/bin/node`];if(platform===`win32`){let pathModule=getPathModule(platform),programFiles=env.ProgramFiles??`C:\\Program Files`,programFilesX86=env[`ProgramFiles(x86)`]??`C:\\Program Files (x86)`;return[pathModule.join(programFiles,`nodejs`,`node.exe`),pathModule.join(programFilesX86,`nodejs`,`node.exe`)]}return[]}const execFileAsync=promisify(execFile);async function resolveNodeVersion(nodePath,execFileImpl){try{let{stdout}=await execFileImpl(nodePath,[`-p`,`process.versions.node`],{encoding:`utf8`});return stdout.trim()||null}catch{return null}}function isVersionManagedNodePath(nodePath,platform=process.platform){let normalized=normalizeForCompare(nodePath,platform);return VERSION_MANAGER_MARKERS.some(marker=>normalized.includes(marker))}function isSystemNodePath(nodePath,env=process.env,platform=process.platform){let normalized=normalizeForCompare(nodePath,platform);return buildSystemNodeCandidates(env,platform).some(candidate=>normalized===normalizeForCompare(candidate,platform))}async function resolveSystemNodePath(env=process.env,platform=process.platform){let candidates=buildSystemNodeCandidates(env,platform);for(let candidate of candidates)try{return await fs.access(candidate),candidate}catch{}return null}async function resolveSystemNodeInfo(params){let systemNode=await resolveSystemNodePath(params.env??process.env,params.platform??process.platform);if(!systemNode)return null;let version=await resolveNodeVersion(systemNode,params.execFile??execFileAsync);return{path:systemNode,version,supported:isSupportedNodeVersion(version)}}function renderSystemNodeWarning(systemNode,selectedNodePath){if(!systemNode||systemNode.supported)return null;let versionLabel=systemNode.version??`unknown`,selectedLabel=selectedNodePath?` Using ${selectedNodePath} for the daemon.`:``;return`System Node ${versionLabel} at ${systemNode.path} is below the required Node 22+.${selectedLabel} Install Node 22+ from nodejs.org or Homebrew.`}async function resolvePreferredNodePath(params){if(params.runtime!==`node`)return;let platform=params.platform??process.platform,currentExecPath=params.execPath??process.execPath;if(currentExecPath&&isNodeExecPath(currentExecPath,platform)&&isSupportedNodeVersion(await resolveNodeVersion(currentExecPath,params.execFile??execFileAsync)))return currentExecPath;let systemNode=await resolveSystemNodeInfo(params);if(systemNode?.supported)return systemNode.path}function addNonEmptyDir(dirs,dir){dir&&dirs.push(dir)}function appendSubdir(base,subdir){if(base)return base.endsWith(`/${subdir}`)?base:path.posix.join(base,subdir)}function addCommonUserBinDirs(dirs,home){dirs.push(`${home}/.local/bin`),dirs.push(`${home}/.npm-global/bin`),dirs.push(`${home}/bin`),dirs.push(`${home}/.volta/bin`),dirs.push(`${home}/.asdf/shims`),dirs.push(`${home}/.bun/bin`)}function resolveSystemPathDirs(platform){return platform===`darwin`?[`/opt/homebrew/bin`,`/usr/local/bin`,`/usr/bin`,`/bin`]:platform===`linux`?[`/usr/local/bin`,`/usr/bin`,`/bin`]:[]}function resolveDarwinUserBinDirs(home,env){if(!home)return[];let dirs=[];return addNonEmptyDir(dirs,env?.PNPM_HOME),addNonEmptyDir(dirs,appendSubdir(env?.NPM_CONFIG_PREFIX,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.BUN_INSTALL,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.VOLTA_HOME,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.ASDF_DATA_DIR,`shims`)),addNonEmptyDir(dirs,env?.NVM_DIR),addNonEmptyDir(dirs,appendSubdir(env?.FNM_DIR,`aliases/default/bin`)),addCommonUserBinDirs(dirs,home),dirs.push(`${home}/Library/Application Support/fnm/aliases/default/bin`),dirs.push(`${home}/.fnm/aliases/default/bin`),dirs.push(`${home}/Library/pnpm`),dirs.push(`${home}/.local/share/pnpm`),dirs}function resolveLinuxUserBinDirs(home,env){if(!home)return[];let dirs=[];return addNonEmptyDir(dirs,env?.PNPM_HOME),addNonEmptyDir(dirs,appendSubdir(env?.NPM_CONFIG_PREFIX,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.BUN_INSTALL,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.VOLTA_HOME,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.ASDF_DATA_DIR,`shims`)),addNonEmptyDir(dirs,appendSubdir(env?.NVM_DIR,`current/bin`)),addNonEmptyDir(dirs,appendSubdir(env?.FNM_DIR,`current/bin`)),addCommonUserBinDirs(dirs,home),dirs.push(`${home}/.nvm/current/bin`),dirs.push(`${home}/.fnm/current/bin`),dirs.push(`${home}/.local/share/pnpm`),dirs}function getMinimalServicePathParts(options={}){let platform=options.platform??process.platform;if(platform===`win32`)return[];let parts=[],extraDirs=options.extraDirs??[],systemDirs=resolveSystemPathDirs(platform),userDirs=platform===`linux`?resolveLinuxUserBinDirs(options.home,options.env):platform===`darwin`?resolveDarwinUserBinDirs(options.home,options.env):[],add=dir=>{dir&&(parts.includes(dir)||parts.push(dir))};for(let dir of extraDirs)add(dir);for(let dir of userDirs)add(dir);for(let dir of systemDirs)add(dir);return parts}function getMinimalServicePathPartsFromEnv(options={}){let env=options.env??process.env;return getMinimalServicePathParts({...options,home:options.home??env.HOME,env})}function buildMinimalServicePath(options={}){let env=options.env??process.env;return(options.platform??process.platform)===`win32`?env.PATH??``:getMinimalServicePathPartsFromEnv({...options,env}).join(path.posix.delimiter)}function buildServiceEnvironment(params){let{env,port,token,launchdLabel}=params,profile=env.BUILDERFORCE_AGENTS_PROFILE,resolvedLaunchdLabel=launchdLabel||(process.platform===`darwin`?resolveGatewayLaunchAgentLabel(profile):void 0),systemdUnit=`${resolveGatewaySystemdServiceName(profile)}.service`,stateDir=env.BUILDERFORCE_AGENTS_STATE_DIR?.trim()||resolveStateDir(env),configPath=env.BUILDERFORCE_AGENTS_CONFIG_PATH?.trim()||(stateDir?path.join(stateDir,`builderforce.json`):void 0),tmpDir=env.TMPDIR?.trim()||os.tmpdir();return{HOME:env.HOME,TMPDIR:tmpDir,PATH:buildMinimalServicePath({env}),BUILDERFORCE_AGENTS_PROFILE:profile,BUILDERFORCE_AGENTS_STATE_DIR:stateDir,BUILDERFORCE_AGENTS_CONFIG_PATH:configPath,BUILDERFORCE_AGENTS_GATEWAY_PORT:String(port),BUILDERFORCE_AGENTS_GATEWAY_TOKEN:token,BUILDERFORCE_AGENTS_LAUNCHD_LABEL:resolvedLaunchdLabel,BUILDERFORCE_AGENTS_SYSTEMD_UNIT:systemdUnit,BUILDERFORCE_AGENTS_SERVICE_MARKER:GATEWAY_SERVICE_MARKER,BUILDERFORCE_AGENTS_SERVICE_KIND:GATEWAY_SERVICE_KIND,BUILDERFORCE_AGENTS_SERVICE_VERSION:VERSION}}function buildNodeServiceEnvironment(params){let{env}=params,stateDir=env.BUILDERFORCE_AGENTS_STATE_DIR,configPath=env.BUILDERFORCE_AGENTS_CONFIG_PATH,tmpDir=env.TMPDIR?.trim()||os.tmpdir();return{HOME:env.HOME,TMPDIR:tmpDir,PATH:buildMinimalServicePath({env}),BUILDERFORCE_AGENTS_STATE_DIR:stateDir,BUILDERFORCE_AGENTS_CONFIG_PATH:configPath,BUILDERFORCE_AGENTS_LAUNCHD_LABEL:resolveNodeLaunchAgentLabel(),BUILDERFORCE_AGENTS_SYSTEMD_UNIT:resolveNodeSystemdServiceName(),BUILDERFORCE_AGENTS_WINDOWS_TASK_NAME:resolveNodeWindowsTaskName(),BUILDERFORCE_AGENTS_TASK_SCRIPT_NAME:NODE_WINDOWS_TASK_SCRIPT_NAME,BUILDERFORCE_AGENTS_LOG_PREFIX:`node`,BUILDERFORCE_AGENTS_SERVICE_MARKER:NODE_SERVICE_MARKER,BUILDERFORCE_AGENTS_SERVICE_KIND:NODE_SERVICE_KIND,BUILDERFORCE_AGENTS_SERVICE_VERSION:VERSION}}async function emitNodeRuntimeWarning(params){if(params.runtime!==`node`)return;let warning=renderSystemNodeWarning(await resolveSystemNodeInfo({env:params.env}),params.nodeProgram);warning&&params.warn?.(warning,params.title)}function resolveGatewayDevMode(argv=process.argv){let normalizedEntry=argv[1]?.replaceAll(`\\`,`/`);return!!(normalizedEntry?.includes(`/src/`)&&normalizedEntry.endsWith(`.ts`))}async function buildGatewayInstallPlan(params){let devMode=params.devMode??resolveGatewayDevMode(),nodePath=params.nodePath??await resolvePreferredNodePath({env:params.env,runtime:params.runtime}),{programArguments,workingDirectory}=await resolveGatewayProgramArguments({port:params.port,dev:devMode,runtime:params.runtime,nodePath});!workingDirectory&&process.platform===`win32`&&(workingDirectory=resolveRequiredHomeDir(params.env,os.homedir)),await emitNodeRuntimeWarning({env:params.env,runtime:params.runtime,nodeProgram:programArguments[0],warn:params.warn,title:`Gateway runtime`});let serviceEnvironment=buildServiceEnvironment({env:params.env,port:params.port,token:params.token,launchdLabel:process.platform===`darwin`?resolveGatewayLaunchAgentLabel(params.env.BUILDERFORCE_AGENTS_PROFILE):void 0}),environment={...collectConfigEnvVars(params.config)};return Object.assign(environment,serviceEnvironment),{programArguments,workingDirectory,environment}}function gatewayInstallErrorHint(platform=process.platform){return platform===`win32`?`Tip: rerun from an elevated PowerShell (Start → type PowerShell → right-click → Run as administrator) or skip service install.`:`Tip: rerun \`${formatCliCommand(`builderforce gateway install`)}\` after fixing the error.`}const DEFAULT_GATEWAY_DAEMON_RUNTIME=`node`,GATEWAY_DAEMON_RUNTIME_OPTIONS=[{value:`node`,label:`Node (recommended)`,hint:`Required for WhatsApp + Telegram. Bun can corrupt memory on reconnect.`}];function isGatewayDaemonRuntime(value){return value===`node`||value===`bun`}export{gatewayInstallErrorHint as a,buildNodeServiceEnvironment as c,isVersionManagedNodePath as d,renderSystemNodeWarning as f,resolveNodeProgramArguments as g,resolveSystemNodePath as h,buildGatewayInstallPlan as i,getMinimalServicePathPartsFromEnv as l,resolveSystemNodeInfo as m,GATEWAY_DAEMON_RUNTIME_OPTIONS as n,resolveGatewayDevMode as o,resolvePreferredNodePath as p,isGatewayDaemonRuntime as r,emitNodeRuntimeWarning as s,DEFAULT_GATEWAY_DAEMON_RUNTIME as t,isSystemNodePath as u};
1
+ import{g as resolveStateDir,y as resolveRequiredHomeDir}from"./paths-BHg-VHB4.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{U as VERSION,z as collectConfigEnvVars}from"./io-D9hC2aG0.js";import{a as NODE_SERVICE_MARKER,c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,g as resolveNodeWindowsTaskName,h as resolveNodeSystemdServiceName,i as NODE_SERVICE_KIND,m as resolveNodeLaunchAgentLabel,n as GATEWAY_SERVICE_KIND,o as NODE_WINDOWS_TASK_SCRIPT_NAME,r as GATEWAY_SERVICE_MARKER}from"./constants-D2th5NXV.js";import{n as isSupportedNodeVersion}from"./runtime-guard-Bi8k55v9.js";import{execFile}from"node:child_process";import os from"node:os";import path from"node:path";import{promisify}from"node:util";import fs from"node:fs/promises";function isNodeRuntime(execPath){let base=path.basename(execPath).toLowerCase();return base===`node`||base===`node.exe`}function isBunRuntime(execPath){let base=path.basename(execPath).toLowerCase();return base===`bun`||base===`bun.exe`}async function resolveCliEntrypointPathForService(){let argv1=process.argv[1];if(!argv1)throw Error(`Unable to resolve CLI entrypoint path`);let normalized=path.resolve(argv1),resolvedPath=await resolveRealpathSafe(normalized);if(/[/\\]dist[/\\].+\.(cjs|js|mjs)$/.test(resolvedPath)){if(await fs.access(resolvedPath),/[/\\]dist[/\\].+\.(cjs|js|mjs)$/.test(normalized)&&normalized!==resolvedPath)try{return await fs.access(normalized),normalized}catch{}return resolvedPath}let distCandidates=buildDistCandidates(resolvedPath,normalized);for(let candidate of distCandidates)try{return await fs.access(candidate),candidate}catch{}throw Error(`Cannot find built CLI at ${distCandidates.join(` or `)}. Run "pnpm build" first, or use dev mode.`)}async function resolveRealpathSafe(inputPath){try{return await fs.realpath(inputPath)}catch{return inputPath}}function buildDistCandidates(...inputs){let candidates=[],seen=new Set;for(let inputPath of inputs){if(!inputPath)continue;let baseDir=path.dirname(inputPath);appendDistCandidates(candidates,seen,path.resolve(baseDir,`..`)),appendDistCandidates(candidates,seen,baseDir),appendNodeModulesBinCandidates(candidates,seen,inputPath)}return candidates}function appendDistCandidates(candidates,seen,baseDir){let distDir=path.resolve(baseDir,`dist`),distEntries=[path.join(distDir,`index.js`),path.join(distDir,`index.mjs`),path.join(distDir,`entry.js`),path.join(distDir,`entry.mjs`)];for(let entry of distEntries)seen.has(entry)||(seen.add(entry),candidates.push(entry))}function appendNodeModulesBinCandidates(candidates,seen,inputPath){let parts=inputPath.split(path.sep),binIndex=parts.lastIndexOf(`.bin`);if(binIndex<=0||parts[binIndex-1]!==`node_modules`)return;let binName=path.basename(inputPath),nodeModulesDir=parts.slice(0,binIndex).join(path.sep);appendDistCandidates(candidates,seen,path.join(nodeModulesDir,binName))}function resolveRepoRootForDev(){let argv1=process.argv[1];if(!argv1)throw Error(`Unable to resolve repo root`);let parts=path.resolve(argv1).split(path.sep),srcIndex=parts.lastIndexOf(`src`);if(srcIndex===-1)throw Error(`Dev mode requires running from repo (src/index.ts)`);return parts.slice(0,srcIndex).join(path.sep)}async function resolveBunPath(){return await resolveBinaryPath(`bun`)}async function resolveNodePath(){return await resolveBinaryPath(`node`)}async function resolveBinaryPath(binary){let{execSync}=await import(`node:child_process`),cmd=process.platform===`win32`?`where`:`which`;try{let resolved=execSync(`${cmd} ${binary}`,{encoding:`utf8`}).trim().split(/\r?\n/)[0]?.trim();if(!resolved)throw Error(`empty`);return await fs.access(resolved),resolved}catch{throw binary===`bun`?Error(`Bun not found in PATH. Install bun: https://bun.sh`):Error(`Node not found in PATH. Install Node 22+.`)}}async function resolveCliProgramArguments(params){let execPath=process.execPath,runtime=params.runtime??`auto`;if(runtime===`node`)return{programArguments:[params.nodePath??(isNodeRuntime(execPath)?execPath:await resolveNodePath()),await resolveCliEntrypointPathForService(),...params.args]};if(runtime===`bun`){if(params.dev){let repoRoot=resolveRepoRootForDev(),devCliPath=path.join(repoRoot,`src`,`index.ts`);return await fs.access(devCliPath),{programArguments:[isBunRuntime(execPath)?execPath:await resolveBunPath(),devCliPath,...params.args],workingDirectory:repoRoot}}return{programArguments:[isBunRuntime(execPath)?execPath:await resolveBunPath(),await resolveCliEntrypointPathForService(),...params.args]}}if(!params.dev)try{return{programArguments:[execPath,await resolveCliEntrypointPathForService(),...params.args]}}catch(error){if(!isNodeRuntime(execPath))return{programArguments:[execPath,...params.args]};throw error}let repoRoot=resolveRepoRootForDev(),devCliPath=path.join(repoRoot,`src`,`index.ts`);return await fs.access(devCliPath),isBunRuntime(execPath)?{programArguments:[execPath,devCliPath,...params.args],workingDirectory:repoRoot}:{programArguments:[await resolveBunPath(),devCliPath,...params.args],workingDirectory:repoRoot}}async function resolveGatewayProgramArguments(params){return resolveCliProgramArguments({args:[`gateway`,`--port`,String(params.port)],dev:params.dev,runtime:params.runtime,nodePath:params.nodePath})}async function resolveNodeProgramArguments(params){let args=[`node`,`run`,`--host`,params.host,`--port`,String(params.port)];return(params.tls||params.tlsFingerprint)&&args.push(`--tls`),params.tlsFingerprint&&args.push(`--tls-fingerprint`,params.tlsFingerprint),params.nodeId&&args.push(`--node-id`,params.nodeId),params.displayName&&args.push(`--display-name`,params.displayName),resolveCliProgramArguments({args,dev:params.dev,runtime:params.runtime,nodePath:params.nodePath})}const VERSION_MANAGER_MARKERS=[`/.nvm/`,`/.fnm/`,`/.volta/`,`/.asdf/`,`/.n/`,`/.nodenv/`,`/.nodebrew/`,`/nvs/`];function getPathModule(platform){return platform===`win32`?path.win32:path.posix}function isNodeExecPath(execPath,platform){let base=getPathModule(platform).basename(execPath).toLowerCase();return base===`node`||base===`node.exe`}function normalizeForCompare(input,platform){let normalized=getPathModule(platform).normalize(input).replaceAll(`\\`,`/`);return platform===`win32`?normalized.toLowerCase():normalized}function buildSystemNodeCandidates(env,platform){if(platform===`darwin`)return[`/opt/homebrew/bin/node`,`/usr/local/bin/node`,`/usr/bin/node`];if(platform===`linux`)return[`/usr/local/bin/node`,`/usr/bin/node`];if(platform===`win32`){let pathModule=getPathModule(platform),programFiles=env.ProgramFiles??`C:\\Program Files`,programFilesX86=env[`ProgramFiles(x86)`]??`C:\\Program Files (x86)`;return[pathModule.join(programFiles,`nodejs`,`node.exe`),pathModule.join(programFilesX86,`nodejs`,`node.exe`)]}return[]}const execFileAsync=promisify(execFile);async function resolveNodeVersion(nodePath,execFileImpl){try{let{stdout}=await execFileImpl(nodePath,[`-p`,`process.versions.node`],{encoding:`utf8`});return stdout.trim()||null}catch{return null}}function isVersionManagedNodePath(nodePath,platform=process.platform){let normalized=normalizeForCompare(nodePath,platform);return VERSION_MANAGER_MARKERS.some(marker=>normalized.includes(marker))}function isSystemNodePath(nodePath,env=process.env,platform=process.platform){let normalized=normalizeForCompare(nodePath,platform);return buildSystemNodeCandidates(env,platform).some(candidate=>normalized===normalizeForCompare(candidate,platform))}async function resolveSystemNodePath(env=process.env,platform=process.platform){let candidates=buildSystemNodeCandidates(env,platform);for(let candidate of candidates)try{return await fs.access(candidate),candidate}catch{}return null}async function resolveSystemNodeInfo(params){let systemNode=await resolveSystemNodePath(params.env??process.env,params.platform??process.platform);if(!systemNode)return null;let version=await resolveNodeVersion(systemNode,params.execFile??execFileAsync);return{path:systemNode,version,supported:isSupportedNodeVersion(version)}}function renderSystemNodeWarning(systemNode,selectedNodePath){if(!systemNode||systemNode.supported)return null;let versionLabel=systemNode.version??`unknown`,selectedLabel=selectedNodePath?` Using ${selectedNodePath} for the daemon.`:``;return`System Node ${versionLabel} at ${systemNode.path} is below the required Node 22+.${selectedLabel} Install Node 22+ from nodejs.org or Homebrew.`}async function resolvePreferredNodePath(params){if(params.runtime!==`node`)return;let platform=params.platform??process.platform,currentExecPath=params.execPath??process.execPath;if(currentExecPath&&isNodeExecPath(currentExecPath,platform)&&isSupportedNodeVersion(await resolveNodeVersion(currentExecPath,params.execFile??execFileAsync)))return currentExecPath;let systemNode=await resolveSystemNodeInfo(params);if(systemNode?.supported)return systemNode.path}function addNonEmptyDir(dirs,dir){dir&&dirs.push(dir)}function appendSubdir(base,subdir){if(base)return base.endsWith(`/${subdir}`)?base:path.posix.join(base,subdir)}function addCommonUserBinDirs(dirs,home){dirs.push(`${home}/.local/bin`),dirs.push(`${home}/.npm-global/bin`),dirs.push(`${home}/bin`),dirs.push(`${home}/.volta/bin`),dirs.push(`${home}/.asdf/shims`),dirs.push(`${home}/.bun/bin`)}function resolveSystemPathDirs(platform){return platform===`darwin`?[`/opt/homebrew/bin`,`/usr/local/bin`,`/usr/bin`,`/bin`]:platform===`linux`?[`/usr/local/bin`,`/usr/bin`,`/bin`]:[]}function resolveDarwinUserBinDirs(home,env){if(!home)return[];let dirs=[];return addNonEmptyDir(dirs,env?.PNPM_HOME),addNonEmptyDir(dirs,appendSubdir(env?.NPM_CONFIG_PREFIX,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.BUN_INSTALL,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.VOLTA_HOME,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.ASDF_DATA_DIR,`shims`)),addNonEmptyDir(dirs,env?.NVM_DIR),addNonEmptyDir(dirs,appendSubdir(env?.FNM_DIR,`aliases/default/bin`)),addCommonUserBinDirs(dirs,home),dirs.push(`${home}/Library/Application Support/fnm/aliases/default/bin`),dirs.push(`${home}/.fnm/aliases/default/bin`),dirs.push(`${home}/Library/pnpm`),dirs.push(`${home}/.local/share/pnpm`),dirs}function resolveLinuxUserBinDirs(home,env){if(!home)return[];let dirs=[];return addNonEmptyDir(dirs,env?.PNPM_HOME),addNonEmptyDir(dirs,appendSubdir(env?.NPM_CONFIG_PREFIX,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.BUN_INSTALL,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.VOLTA_HOME,`bin`)),addNonEmptyDir(dirs,appendSubdir(env?.ASDF_DATA_DIR,`shims`)),addNonEmptyDir(dirs,appendSubdir(env?.NVM_DIR,`current/bin`)),addNonEmptyDir(dirs,appendSubdir(env?.FNM_DIR,`current/bin`)),addCommonUserBinDirs(dirs,home),dirs.push(`${home}/.nvm/current/bin`),dirs.push(`${home}/.fnm/current/bin`),dirs.push(`${home}/.local/share/pnpm`),dirs}function getMinimalServicePathParts(options={}){let platform=options.platform??process.platform;if(platform===`win32`)return[];let parts=[],extraDirs=options.extraDirs??[],systemDirs=resolveSystemPathDirs(platform),userDirs=platform===`linux`?resolveLinuxUserBinDirs(options.home,options.env):platform===`darwin`?resolveDarwinUserBinDirs(options.home,options.env):[],add=dir=>{dir&&(parts.includes(dir)||parts.push(dir))};for(let dir of extraDirs)add(dir);for(let dir of userDirs)add(dir);for(let dir of systemDirs)add(dir);return parts}function getMinimalServicePathPartsFromEnv(options={}){let env=options.env??process.env;return getMinimalServicePathParts({...options,home:options.home??env.HOME,env})}function buildMinimalServicePath(options={}){let env=options.env??process.env;return(options.platform??process.platform)===`win32`?env.PATH??``:getMinimalServicePathPartsFromEnv({...options,env}).join(path.posix.delimiter)}function buildServiceEnvironment(params){let{env,port,token,launchdLabel}=params,profile=env.BUILDERFORCE_AGENTS_PROFILE,resolvedLaunchdLabel=launchdLabel||(process.platform===`darwin`?resolveGatewayLaunchAgentLabel(profile):void 0),systemdUnit=`${resolveGatewaySystemdServiceName(profile)}.service`,stateDir=env.BUILDERFORCE_AGENTS_STATE_DIR?.trim()||resolveStateDir(env),configPath=env.BUILDERFORCE_AGENTS_CONFIG_PATH?.trim()||(stateDir?path.join(stateDir,`builderforce.json`):void 0),tmpDir=env.TMPDIR?.trim()||os.tmpdir();return{HOME:env.HOME,TMPDIR:tmpDir,PATH:buildMinimalServicePath({env}),BUILDERFORCE_AGENTS_PROFILE:profile,BUILDERFORCE_AGENTS_STATE_DIR:stateDir,BUILDERFORCE_AGENTS_CONFIG_PATH:configPath,BUILDERFORCE_AGENTS_GATEWAY_PORT:String(port),BUILDERFORCE_AGENTS_GATEWAY_TOKEN:token,BUILDERFORCE_AGENTS_LAUNCHD_LABEL:resolvedLaunchdLabel,BUILDERFORCE_AGENTS_SYSTEMD_UNIT:systemdUnit,BUILDERFORCE_AGENTS_SERVICE_MARKER:GATEWAY_SERVICE_MARKER,BUILDERFORCE_AGENTS_SERVICE_KIND:GATEWAY_SERVICE_KIND,BUILDERFORCE_AGENTS_SERVICE_VERSION:VERSION}}function buildNodeServiceEnvironment(params){let{env}=params,stateDir=env.BUILDERFORCE_AGENTS_STATE_DIR,configPath=env.BUILDERFORCE_AGENTS_CONFIG_PATH,tmpDir=env.TMPDIR?.trim()||os.tmpdir();return{HOME:env.HOME,TMPDIR:tmpDir,PATH:buildMinimalServicePath({env}),BUILDERFORCE_AGENTS_STATE_DIR:stateDir,BUILDERFORCE_AGENTS_CONFIG_PATH:configPath,BUILDERFORCE_AGENTS_LAUNCHD_LABEL:resolveNodeLaunchAgentLabel(),BUILDERFORCE_AGENTS_SYSTEMD_UNIT:resolveNodeSystemdServiceName(),BUILDERFORCE_AGENTS_WINDOWS_TASK_NAME:resolveNodeWindowsTaskName(),BUILDERFORCE_AGENTS_TASK_SCRIPT_NAME:NODE_WINDOWS_TASK_SCRIPT_NAME,BUILDERFORCE_AGENTS_LOG_PREFIX:`node`,BUILDERFORCE_AGENTS_SERVICE_MARKER:NODE_SERVICE_MARKER,BUILDERFORCE_AGENTS_SERVICE_KIND:NODE_SERVICE_KIND,BUILDERFORCE_AGENTS_SERVICE_VERSION:VERSION}}async function emitNodeRuntimeWarning(params){if(params.runtime!==`node`)return;let warning=renderSystemNodeWarning(await resolveSystemNodeInfo({env:params.env}),params.nodeProgram);warning&&params.warn?.(warning,params.title)}function resolveGatewayDevMode(argv=process.argv){let normalizedEntry=argv[1]?.replaceAll(`\\`,`/`);return!!(normalizedEntry?.includes(`/src/`)&&normalizedEntry.endsWith(`.ts`))}async function buildGatewayInstallPlan(params){let devMode=params.devMode??resolveGatewayDevMode(),nodePath=params.nodePath??await resolvePreferredNodePath({env:params.env,runtime:params.runtime}),{programArguments,workingDirectory}=await resolveGatewayProgramArguments({port:params.port,dev:devMode,runtime:params.runtime,nodePath});!workingDirectory&&process.platform===`win32`&&(workingDirectory=resolveRequiredHomeDir(params.env,os.homedir)),await emitNodeRuntimeWarning({env:params.env,runtime:params.runtime,nodeProgram:programArguments[0],warn:params.warn,title:`Gateway runtime`});let serviceEnvironment=buildServiceEnvironment({env:params.env,port:params.port,token:params.token,launchdLabel:process.platform===`darwin`?resolveGatewayLaunchAgentLabel(params.env.BUILDERFORCE_AGENTS_PROFILE):void 0}),environment={...collectConfigEnvVars(params.config)};return Object.assign(environment,serviceEnvironment),{programArguments,workingDirectory,environment}}function gatewayInstallErrorHint(platform=process.platform){return platform===`win32`?`Tip: rerun from an elevated PowerShell (Start → type PowerShell → right-click → Run as administrator) or skip service install.`:`Tip: rerun \`${formatCliCommand(`builderforce gateway install`)}\` after fixing the error.`}const DEFAULT_GATEWAY_DAEMON_RUNTIME=`node`,GATEWAY_DAEMON_RUNTIME_OPTIONS=[{value:`node`,label:`Node (recommended)`,hint:`Required for WhatsApp + Telegram. Bun can corrupt memory on reconnect.`}];function isGatewayDaemonRuntime(value){return value===`node`||value===`bun`}export{gatewayInstallErrorHint as a,buildNodeServiceEnvironment as c,isVersionManagedNodePath as d,renderSystemNodeWarning as f,resolveNodeProgramArguments as g,resolveSystemNodePath as h,buildGatewayInstallPlan as i,getMinimalServicePathPartsFromEnv as l,resolveSystemNodeInfo as m,GATEWAY_DAEMON_RUNTIME_OPTIONS as n,resolveGatewayDevMode as o,resolvePreferredNodePath as p,isGatewayDaemonRuntime as r,emitNodeRuntimeWarning as s,DEFAULT_GATEWAY_DAEMON_RUNTIME as t,isSystemNodePath as u};
@@ -1,4 +1,4 @@
1
- import{i as isMessagingToolDuplicate}from"./embedded-helpers-CEsr3aQ0.js";import{u as normalizeAccountId$1}from"./session-key-EoB0qaG9.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{C as createInternalHookEvent,T as triggerInternalHook,d as getActivePluginRegistry}from"./registry-TdK-aV05.js";import{W as getChannelDock,i as resolveMirroredTranscriptText,r as appendAssistantMessageToSessionTranscript}from"./sessions-CdanN_ZI.js";import{r as normalizeChannelId,t as getChannelPlugin}from"./plugins-D5zP6ENo.js";import{n as SILENT_REPLY_TOKEN,r as isSilentReplyText}from"./tokens-CCU3zO-D.js";import{c as resolveTextChunkLimit,d as parseFenceSpans,i as chunkMarkdownTextWithMode,n as chunkByParagraph,s as resolveChunkMode}from"./chunk-FCBlVOyo.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-P6uoUSFa.js";import{s as getAgentScopedMediaLocalRoots}from"./ir-5BNoIXZm.js";import{c as markdownToSignalTextChunks,t as sendMessageSignal}from"./send-4d9NswaD.js";import{i as enqueueDelivery,n as ackDelivery,o as failDelivery}from"./delivery-queue-CXKynF1P.js";function getHooksForName(registry,hookName){return registry.typedHooks.filter(h=>h.hookName===hookName).toSorted((a,b)=>(b.priority??0)-(a.priority??0))}function createHookRunner(registry,options={}){let logger=options.logger,catchErrors=options.catchErrors??!0,mergeBeforeModelResolve=(acc,next)=>({modelOverride:acc?.modelOverride??next.modelOverride,providerOverride:acc?.providerOverride??next.providerOverride}),mergeBeforePromptBuild=(acc,next)=>({systemPrompt:next.systemPrompt??acc?.systemPrompt,prependContext:acc?.prependContext&&next.prependContext?`${acc.prependContext}\n\n${next.prependContext}`:next.prependContext??acc?.prependContext});async function runVoidHook(hookName,event,ctx){let hooks=getHooksForName(registry,hookName);if(hooks.length===0)return;logger?.debug?.(`[hooks] running ${hookName} (${hooks.length} handlers)`);let promises=hooks.map(async hook=>{try{await hook.handler(event,ctx)}catch(err){let msg=`[hooks] ${hookName} handler from ${hook.pluginId} failed: ${String(err)}`;if(catchErrors)logger?.error(msg);else throw Error(msg,{cause:err})}});await Promise.all(promises)}async function runModifyingHook(hookName,event,ctx,mergeResults){let hooks=getHooksForName(registry,hookName);if(hooks.length===0)return;logger?.debug?.(`[hooks] running ${hookName} (${hooks.length} handlers, sequential)`);let result;for(let hook of hooks)try{let handlerResult=await hook.handler(event,ctx);handlerResult!=null&&(result=mergeResults&&result!==void 0?mergeResults(result,handlerResult):handlerResult)}catch(err){let msg=`[hooks] ${hookName} handler from ${hook.pluginId} failed: ${String(err)}`;if(catchErrors)logger?.error(msg);else throw Error(msg,{cause:err})}return result}async function runBeforeModelResolve(event,ctx){return runModifyingHook(`before_model_resolve`,event,ctx,mergeBeforeModelResolve)}async function runBeforePromptBuild(event,ctx){return runModifyingHook(`before_prompt_build`,event,ctx,mergeBeforePromptBuild)}async function runBeforeAgentStart(event,ctx){return runModifyingHook(`before_agent_start`,event,ctx,(acc,next)=>({...mergeBeforePromptBuild(acc,next),...mergeBeforeModelResolve(acc,next)}))}async function runAgentEnd(event,ctx){return runVoidHook(`agent_end`,event,ctx)}async function runLlmInput(event,ctx){return runVoidHook(`llm_input`,event,ctx)}async function runLlmOutput(event,ctx){return runVoidHook(`llm_output`,event,ctx)}async function runBeforeCompaction(event,ctx){return runVoidHook(`before_compaction`,event,ctx)}async function runAfterCompaction(event,ctx){return runVoidHook(`after_compaction`,event,ctx)}async function runBeforeReset(event,ctx){return runVoidHook(`before_reset`,event,ctx)}async function runMessageReceived(event,ctx){return runVoidHook(`message_received`,event,ctx)}async function runMessageSending(event,ctx){return runModifyingHook(`message_sending`,event,ctx,(acc,next)=>({content:next.content??acc?.content,cancel:next.cancel??acc?.cancel}))}async function runMessageSent(event,ctx){return runVoidHook(`message_sent`,event,ctx)}async function runBeforeToolCall(event,ctx){return runModifyingHook(`before_tool_call`,event,ctx,(acc,next)=>({params:next.params??acc?.params,block:next.block??acc?.block,blockReason:next.blockReason??acc?.blockReason}))}async function runAfterToolCall(event,ctx){return runVoidHook(`after_tool_call`,event,ctx)}function runToolResultPersist(event,ctx){let hooks=getHooksForName(registry,`tool_result_persist`);if(hooks.length===0)return;let current=event.message;for(let hook of hooks)try{let out=hook.handler({...event,message:current},ctx);if(out&&typeof out.then==`function`){let msg=`[hooks] tool_result_persist handler from ${hook.pluginId} returned a Promise; this hook is synchronous and the result was ignored.`;if(catchErrors){logger?.warn?.(msg);continue}throw Error(msg)}let next=out?.message;next&&(current=next)}catch(err){let msg=`[hooks] tool_result_persist handler from ${hook.pluginId} failed: ${String(err)}`;if(catchErrors)logger?.error(msg);else throw Error(msg,{cause:err})}return{message:current}}function runBeforeMessageWrite(event,ctx){let hooks=getHooksForName(registry,`before_message_write`);if(hooks.length===0)return;let current=event.message;for(let hook of hooks)try{let out=hook.handler({...event,message:current},ctx);if(out&&typeof out.then==`function`){let msg=`[hooks] before_message_write handler from ${hook.pluginId} returned a Promise; this hook is synchronous and the result was ignored.`;if(catchErrors){logger?.warn?.(msg);continue}throw Error(msg)}let result=out;if(result?.block)return{block:!0};result?.message&&(current=result.message)}catch(err){let msg=`[hooks] before_message_write handler from ${hook.pluginId} failed: ${String(err)}`;if(catchErrors)logger?.error(msg);else throw Error(msg,{cause:err})}if(current!==event.message)return{message:current}}async function runSessionStart(event,ctx){return runVoidHook(`session_start`,event,ctx)}async function runSessionEnd(event,ctx){return runVoidHook(`session_end`,event,ctx)}async function runGatewayStart(event,ctx){return runVoidHook(`gateway_start`,event,ctx)}async function runGatewayStop(event,ctx){return runVoidHook(`gateway_stop`,event,ctx)}function hasHooks(hookName){return registry.typedHooks.some(h=>h.hookName===hookName)}function getHookCount(hookName){return registry.typedHooks.filter(h=>h.hookName===hookName).length}return{runBeforeModelResolve,runBeforePromptBuild,runBeforeAgentStart,runLlmInput,runLlmOutput,runAgentEnd,runBeforeCompaction,runAfterCompaction,runBeforeReset,runMessageReceived,runMessageSending,runMessageSent,runBeforeToolCall,runAfterToolCall,runToolResultPersist,runBeforeMessageWrite,runSessionStart,runSessionEnd,runGatewayStart,runGatewayStop,hasHooks,getHookCount}}const log=createSubsystemLogger(`plugins`);let globalHookRunner=null;function initializeGlobalHookRunner(registry){globalHookRunner=createHookRunner(registry,{logger:{debug:msg=>log.debug(msg),warn:msg=>log.warn(msg),error:msg=>log.error(msg)},catchErrors:!0});let hookCount=registry.hooks.length;hookCount>0&&log.info(`hook runner initialized with ${hookCount} registered hooks`)}function getGlobalHookRunner(){return globalHookRunner}async function runGlobalGatewayStopSafely(params){let hookRunner=getGlobalHookRunner();if(hookRunner?.hasHooks(`gateway_stop`))try{await hookRunner.runGatewayStop(params.event,params.ctx)}catch(err){if(params.onError){params.onError(err);return}log.warn(`gateway_stop hook failed: ${String(err)}`)}}const MB=1024*1024;function resolveChannelMediaMaxBytes(params){let accountId=normalizeAccountId$1(params.accountId),channelLimit=params.resolveChannelLimitMb({cfg:params.cfg,accountId});if(channelLimit)return channelLimit*MB;if(params.cfg.agents?.defaults?.mediaMaxMb)return params.cfg.agents.defaults.mediaMaxMb*MB}const cache=new Map;let lastRegistry=null;function ensureCacheForRegistry(registry){registry!==lastRegistry&&(cache.clear(),lastRegistry=registry)}async function loadChannelOutboundAdapter(id){let registry=getActivePluginRegistry();ensureCacheForRegistry(registry);let cached=cache.get(id);if(cached)return cached;let outbound=(registry?.channels.find(entry=>entry.plugin.id===id))?.plugin.outbound;if(outbound)return cache.set(id,outbound),outbound}function stripWhatsAppLeadingBlankLines(text){return text.replace(/^(?:[ \t]*\r?\n)+/,``)}function throwIfAborted(abortSignal){if(abortSignal?.aborted){let err=Error(`Operation aborted`);throw err.name=`AbortError`,err}}const AUDIO_TAG_RE=/\[\[\s*audio_as_voice\s*\]\]/gi,REPLY_TAG_RE=/\[\[\s*(?:reply_to_current|reply_to\s*:\s*([^\]\n]+))\s*\]\]/gi;function normalizeDirectiveWhitespace(text){return text.replace(/[ \t]+/g,` `).replace(/[ \t]*\n[ \t]*/g,`
1
+ import{i as isMessagingToolDuplicate}from"./embedded-helpers-C9jpiwlw.js";import{u as normalizeAccountId$1}from"./session-key-EoB0qaG9.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{C as createInternalHookEvent,T as triggerInternalHook,d as getActivePluginRegistry}from"./registry-TdK-aV05.js";import{W as getChannelDock,i as resolveMirroredTranscriptText,r as appendAssistantMessageToSessionTranscript}from"./sessions-BuZVmOWt.js";import{r as normalizeChannelId,t as getChannelPlugin}from"./plugins-D5zP6ENo.js";import{n as SILENT_REPLY_TOKEN,r as isSilentReplyText}from"./tokens-CCU3zO-D.js";import{c as resolveTextChunkLimit,d as parseFenceSpans,i as chunkMarkdownTextWithMode,n as chunkByParagraph,s as resolveChunkMode}from"./chunk-FCBlVOyo.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-P6uoUSFa.js";import{s as getAgentScopedMediaLocalRoots}from"./ir-5BNoIXZm.js";import{c as markdownToSignalTextChunks,t as sendMessageSignal}from"./send-BP5osGBo.js";import{i as enqueueDelivery,n as ackDelivery,o as failDelivery}from"./delivery-queue-CXKynF1P.js";function getHooksForName(registry,hookName){return registry.typedHooks.filter(h=>h.hookName===hookName).toSorted((a,b)=>(b.priority??0)-(a.priority??0))}function createHookRunner(registry,options={}){let logger=options.logger,catchErrors=options.catchErrors??!0,mergeBeforeModelResolve=(acc,next)=>({modelOverride:acc?.modelOverride??next.modelOverride,providerOverride:acc?.providerOverride??next.providerOverride}),mergeBeforePromptBuild=(acc,next)=>({systemPrompt:next.systemPrompt??acc?.systemPrompt,prependContext:acc?.prependContext&&next.prependContext?`${acc.prependContext}\n\n${next.prependContext}`:next.prependContext??acc?.prependContext});async function runVoidHook(hookName,event,ctx){let hooks=getHooksForName(registry,hookName);if(hooks.length===0)return;logger?.debug?.(`[hooks] running ${hookName} (${hooks.length} handlers)`);let promises=hooks.map(async hook=>{try{await hook.handler(event,ctx)}catch(err){let msg=`[hooks] ${hookName} handler from ${hook.pluginId} failed: ${String(err)}`;if(catchErrors)logger?.error(msg);else throw Error(msg,{cause:err})}});await Promise.all(promises)}async function runModifyingHook(hookName,event,ctx,mergeResults){let hooks=getHooksForName(registry,hookName);if(hooks.length===0)return;logger?.debug?.(`[hooks] running ${hookName} (${hooks.length} handlers, sequential)`);let result;for(let hook of hooks)try{let handlerResult=await hook.handler(event,ctx);handlerResult!=null&&(result=mergeResults&&result!==void 0?mergeResults(result,handlerResult):handlerResult)}catch(err){let msg=`[hooks] ${hookName} handler from ${hook.pluginId} failed: ${String(err)}`;if(catchErrors)logger?.error(msg);else throw Error(msg,{cause:err})}return result}async function runBeforeModelResolve(event,ctx){return runModifyingHook(`before_model_resolve`,event,ctx,mergeBeforeModelResolve)}async function runBeforePromptBuild(event,ctx){return runModifyingHook(`before_prompt_build`,event,ctx,mergeBeforePromptBuild)}async function runBeforeAgentStart(event,ctx){return runModifyingHook(`before_agent_start`,event,ctx,(acc,next)=>({...mergeBeforePromptBuild(acc,next),...mergeBeforeModelResolve(acc,next)}))}async function runAgentEnd(event,ctx){return runVoidHook(`agent_end`,event,ctx)}async function runLlmInput(event,ctx){return runVoidHook(`llm_input`,event,ctx)}async function runLlmOutput(event,ctx){return runVoidHook(`llm_output`,event,ctx)}async function runBeforeCompaction(event,ctx){return runVoidHook(`before_compaction`,event,ctx)}async function runAfterCompaction(event,ctx){return runVoidHook(`after_compaction`,event,ctx)}async function runBeforeReset(event,ctx){return runVoidHook(`before_reset`,event,ctx)}async function runMessageReceived(event,ctx){return runVoidHook(`message_received`,event,ctx)}async function runMessageSending(event,ctx){return runModifyingHook(`message_sending`,event,ctx,(acc,next)=>({content:next.content??acc?.content,cancel:next.cancel??acc?.cancel}))}async function runMessageSent(event,ctx){return runVoidHook(`message_sent`,event,ctx)}async function runBeforeToolCall(event,ctx){return runModifyingHook(`before_tool_call`,event,ctx,(acc,next)=>({params:next.params??acc?.params,block:next.block??acc?.block,blockReason:next.blockReason??acc?.blockReason}))}async function runAfterToolCall(event,ctx){return runVoidHook(`after_tool_call`,event,ctx)}function runToolResultPersist(event,ctx){let hooks=getHooksForName(registry,`tool_result_persist`);if(hooks.length===0)return;let current=event.message;for(let hook of hooks)try{let out=hook.handler({...event,message:current},ctx);if(out&&typeof out.then==`function`){let msg=`[hooks] tool_result_persist handler from ${hook.pluginId} returned a Promise; this hook is synchronous and the result was ignored.`;if(catchErrors){logger?.warn?.(msg);continue}throw Error(msg)}let next=out?.message;next&&(current=next)}catch(err){let msg=`[hooks] tool_result_persist handler from ${hook.pluginId} failed: ${String(err)}`;if(catchErrors)logger?.error(msg);else throw Error(msg,{cause:err})}return{message:current}}function runBeforeMessageWrite(event,ctx){let hooks=getHooksForName(registry,`before_message_write`);if(hooks.length===0)return;let current=event.message;for(let hook of hooks)try{let out=hook.handler({...event,message:current},ctx);if(out&&typeof out.then==`function`){let msg=`[hooks] before_message_write handler from ${hook.pluginId} returned a Promise; this hook is synchronous and the result was ignored.`;if(catchErrors){logger?.warn?.(msg);continue}throw Error(msg)}let result=out;if(result?.block)return{block:!0};result?.message&&(current=result.message)}catch(err){let msg=`[hooks] before_message_write handler from ${hook.pluginId} failed: ${String(err)}`;if(catchErrors)logger?.error(msg);else throw Error(msg,{cause:err})}if(current!==event.message)return{message:current}}async function runSessionStart(event,ctx){return runVoidHook(`session_start`,event,ctx)}async function runSessionEnd(event,ctx){return runVoidHook(`session_end`,event,ctx)}async function runGatewayStart(event,ctx){return runVoidHook(`gateway_start`,event,ctx)}async function runGatewayStop(event,ctx){return runVoidHook(`gateway_stop`,event,ctx)}function hasHooks(hookName){return registry.typedHooks.some(h=>h.hookName===hookName)}function getHookCount(hookName){return registry.typedHooks.filter(h=>h.hookName===hookName).length}return{runBeforeModelResolve,runBeforePromptBuild,runBeforeAgentStart,runLlmInput,runLlmOutput,runAgentEnd,runBeforeCompaction,runAfterCompaction,runBeforeReset,runMessageReceived,runMessageSending,runMessageSent,runBeforeToolCall,runAfterToolCall,runToolResultPersist,runBeforeMessageWrite,runSessionStart,runSessionEnd,runGatewayStart,runGatewayStop,hasHooks,getHookCount}}const log=createSubsystemLogger(`plugins`);let globalHookRunner=null;function initializeGlobalHookRunner(registry){globalHookRunner=createHookRunner(registry,{logger:{debug:msg=>log.debug(msg),warn:msg=>log.warn(msg),error:msg=>log.error(msg)},catchErrors:!0});let hookCount=registry.hooks.length;hookCount>0&&log.info(`hook runner initialized with ${hookCount} registered hooks`)}function getGlobalHookRunner(){return globalHookRunner}async function runGlobalGatewayStopSafely(params){let hookRunner=getGlobalHookRunner();if(hookRunner?.hasHooks(`gateway_stop`))try{await hookRunner.runGatewayStop(params.event,params.ctx)}catch(err){if(params.onError){params.onError(err);return}log.warn(`gateway_stop hook failed: ${String(err)}`)}}const MB=1024*1024;function resolveChannelMediaMaxBytes(params){let accountId=normalizeAccountId$1(params.accountId),channelLimit=params.resolveChannelLimitMb({cfg:params.cfg,accountId});if(channelLimit)return channelLimit*MB;if(params.cfg.agents?.defaults?.mediaMaxMb)return params.cfg.agents.defaults.mediaMaxMb*MB}const cache=new Map;let lastRegistry=null;function ensureCacheForRegistry(registry){registry!==lastRegistry&&(cache.clear(),lastRegistry=registry)}async function loadChannelOutboundAdapter(id){let registry=getActivePluginRegistry();ensureCacheForRegistry(registry);let cached=cache.get(id);if(cached)return cached;let outbound=(registry?.channels.find(entry=>entry.plugin.id===id))?.plugin.outbound;if(outbound)return cache.set(id,outbound),outbound}function stripWhatsAppLeadingBlankLines(text){return text.replace(/^(?:[ \t]*\r?\n)+/,``)}function throwIfAborted(abortSignal){if(abortSignal?.aborted){let err=Error(`Operation aborted`);throw err.name=`AbortError`,err}}const AUDIO_TAG_RE=/\[\[\s*audio_as_voice\s*\]\]/gi,REPLY_TAG_RE=/\[\[\s*(?:reply_to_current|reply_to\s*:\s*([^\]\n]+))\s*\]\]/gi;function normalizeDirectiveWhitespace(text){return text.replace(/[ \t]+/g,` `).replace(/[ \t]*\n[ \t]*/g,`
2
2
  `).trim()}function parseInlineDirectives(text,options={}){let{currentMessageId,stripAudioTag=!0,stripReplyTags=!0}=options;if(!text)return{text:``,audioAsVoice:!1,replyToCurrent:!1,hasAudioTag:!1,hasReplyTag:!1};let cleaned=text,audioAsVoice=!1,hasAudioTag=!1,hasReplyTag=!1,sawCurrent=!1,lastExplicitId;cleaned=cleaned.replace(AUDIO_TAG_RE,match=>(audioAsVoice=!0,hasAudioTag=!0,stripAudioTag?` `:match)),cleaned=cleaned.replace(REPLY_TAG_RE,(match,idRaw)=>{if(hasReplyTag=!0,idRaw===void 0)sawCurrent=!0;else{let id=idRaw.trim();id&&(lastExplicitId=id)}return stripReplyTags?` `:match}),cleaned=normalizeDirectiveWhitespace(cleaned);let replyToId=lastExplicitId??(sawCurrent&&currentMessageId?.trim()||void 0);return{text:cleaned,audioAsVoice,replyToId,replyToExplicitId:lastExplicitId,replyToCurrent:sawCurrent,hasAudioTag,hasReplyTag}}function parseAudioTag(text){let result=parseInlineDirectives(text,{stripReplyTags:!1});return{text:result.text,audioAsVoice:result.audioAsVoice,hadTag:result.hasAudioTag}}const MEDIA_TOKEN_RE=/\bMEDIA:\s*`?([^\n]+)`?/gi;function normalizeMediaSource(src){return src.startsWith(`file://`)?src.replace(`file://`,``):src}function cleanCandidate(raw){return raw.replace(/^[`"'[{(]+/,``).replace(/[`"'\\})\],]+$/,``)}const WINDOWS_DRIVE_RE=/^[a-zA-Z]:[\\/]/,SCHEME_RE=/^[a-zA-Z][a-zA-Z0-9+.-]*:/,HAS_FILE_EXT=/\.\w{1,10}$/;function isLikelyLocalPath(candidate){return candidate.startsWith(`/`)||candidate.startsWith(`./`)||candidate.startsWith(`../`)||candidate.startsWith(`~`)||WINDOWS_DRIVE_RE.test(candidate)||candidate.startsWith(`\\\\`)||!SCHEME_RE.test(candidate)&&(candidate.includes(`/`)||candidate.includes(`\\`))}function isValidMedia(candidate,opts){return!candidate||candidate.length>4096||!opts?.allowSpaces&&/\s/.test(candidate)?!1:!!(/^https?:\/\//i.test(candidate)||isLikelyLocalPath(candidate)||opts?.allowBareFilename&&!SCHEME_RE.test(candidate)&&HAS_FILE_EXT.test(candidate))}function unwrapQuoted(value){let trimmed=value.trim();if(trimmed.length<2)return;let first=trimmed[0];if(first===trimmed[trimmed.length-1]&&!(first!==`"`&&first!==`'`&&first!=="`"))return trimmed.slice(1,-1).trim()}function isInsideFence(fenceSpans,offset){return fenceSpans.some(span=>offset>=span.start&&offset<span.end)}function splitMediaFromOutput(raw){let trimmedRaw=raw.trimEnd();if(!trimmedRaw.trim())return{text:``};let media=[],foundMediaToken=!1,fenceSpans=parseFenceSpans(trimmedRaw),lines=trimmedRaw.split(`
3
3
  `),keptLines=[],lineOffset=0;for(let line of lines){if(isInsideFence(fenceSpans,lineOffset)){keptLines.push(line),lineOffset+=line.length+1;continue}if(!line.trimStart().startsWith(`MEDIA:`)){keptLines.push(line),lineOffset+=line.length+1;continue}let matches=Array.from(line.matchAll(MEDIA_TOKEN_RE));if(matches.length===0){keptLines.push(line),lineOffset+=line.length+1;continue}let pieces=[],cursor=0;for(let match of matches){let start=match.index??0;pieces.push(line.slice(cursor,start));let payload=match[1],unwrapped=unwrapQuoted(payload),payloadValue=unwrapped??payload,parts=unwrapped?[unwrapped]:payload.split(/\s+/).filter(Boolean),mediaStartIndex=media.length,validCount=0,invalidParts=[],hasValidMedia=!1;for(let part of parts){let candidate=normalizeMediaSource(cleanCandidate(part));isValidMedia(candidate,unwrapped?{allowSpaces:!0}:void 0)?(media.push(candidate),hasValidMedia=!0,foundMediaToken=!0,validCount+=1):invalidParts.push(part)}let trimmedPayload=payloadValue.trim(),looksLikeLocalPath=isLikelyLocalPath(trimmedPayload)||trimmedPayload.startsWith(`file://`);if(!unwrapped&&validCount===1&&invalidParts.length>0&&/\s/.test(payloadValue)&&looksLikeLocalPath){let fallback=normalizeMediaSource(cleanCandidate(payloadValue));isValidMedia(fallback,{allowSpaces:!0})&&(media.splice(mediaStartIndex,media.length-mediaStartIndex,fallback),hasValidMedia=!0,foundMediaToken=!0,validCount=1,invalidParts.length=0)}if(!hasValidMedia){let fallback=normalizeMediaSource(cleanCandidate(payloadValue));isValidMedia(fallback,{allowSpaces:!0,allowBareFilename:!0})&&(media.push(fallback),hasValidMedia=!0,foundMediaToken=!0,invalidParts.length=0)}hasValidMedia?invalidParts.length>0&&pieces.push(invalidParts.join(` `)):looksLikeLocalPath?foundMediaToken=!0:pieces.push(match[0]),cursor=start+match[0].length}pieces.push(line.slice(cursor));let cleanedLine=pieces.join(``).replace(/[ \t]{2,}/g,` `).trim();cleanedLine&&keptLines.push(cleanedLine),lineOffset+=line.length+1}let cleanedText=keptLines.join(`
4
4
  `).replace(/[ \t]+\n/g,`
@@ -1 +1 @@
1
- import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-CEsr3aQ0.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"./sandbox-BZibn6PX.js";import"./chrome-a3X9_-nf.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DJZT7Upf.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-BzfLvF8W.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-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"./tool-images-B7b_OiMz.js";import"./fetch-guard-8mwt3-hm.js";import"./fetch-BuOLY9KP.js";import"./tokens-CCU3zO-D.js";import{t as deliverOutboundPayloads}from"./deliver-BpLm3ktn.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./send-4d9NswaD.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";export{deliverOutboundPayloads};
1
+ import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-C9jpiwlw.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"./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"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./fetch-guard-8mwt3-hm.js";import"./fetch-BuOLY9KP.js";import"./tokens-CCU3zO-D.js";import{t as deliverOutboundPayloads}from"./deliver--6OBF3LL.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./send-BP5osGBo.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";export{deliverOutboundPayloads};
@@ -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"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./message-channel-z5YRpR2d.js";import"./sessions-Bl1wwotX.js";import"./tokens-CFKkpUIu.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import{t as deliverOutboundPayloads}from"./deliver-BuZu68tp.js";import"./accounts-Cx82nj4E.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-DK8_apW0.js";import"./sandbox-z9t_PRf9.js";import"./chrome-BnEbJV3D.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-owOmmyUM.js";import"./routes-lclJHOYY.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"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./fetch-DnWD6ydH.js";import"./send-B_1BtyfA.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";export{deliverOutboundPayloads};
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"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./message-channel-z5YRpR2d.js";import"./sessions-BA8Se_bT.js";import"./tokens-CFKkpUIu.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import{t as deliverOutboundPayloads}from"./deliver-CsG0cHbZ.js";import"./accounts-Cx82nj4E.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"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./fetch-DnWD6ydH.js";import"./send-kkm_zrHQ.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";export{deliverOutboundPayloads};
@@ -1,4 +1,4 @@
1
- import{C as createInternalHookEvent,T as triggerInternalHook,d as getActivePluginRegistry}from"./registry-Cv7CoWAs.js";import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{u as normalizeAccountId$1}from"./session-key-CksCYipj.js";import{L as getChannelDock,i as resolveMirroredTranscriptText,r as appendAssistantMessageToSessionTranscript}from"./sessions-Bl1wwotX.js";import{n as SILENT_REPLY_TOKEN,r as isSilentReplyText}from"./tokens-CFKkpUIu.js";import{r as normalizeChannelId,t as getChannelPlugin}from"./plugins-1Mn6RiNf.js";import{h as isMessagingToolDuplicate}from"./embedded-helpers-DK8_apW0.js";import{c as resolveTextChunkLimit,d as parseFenceSpans,i as chunkMarkdownTextWithMode,n as chunkByParagraph,s as resolveChunkMode}from"./chunk-Dly7lM4r.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-B1Rx8hv6.js";import{s as getAgentScopedMediaLocalRoots}from"./ir-CSdQJPqu.js";import{c as markdownToSignalTextChunks,t as sendMessageSignal}from"./send-B_1BtyfA.js";import{i as enqueueDelivery,n as ackDelivery,o as failDelivery}from"./delivery-queue-Cp3t4Upn.js";function getHooksForName(registry,hookName){return registry.typedHooks.filter(h=>h.hookName===hookName).toSorted((a,b)=>(b.priority??0)-(a.priority??0))}function createHookRunner(registry,options={}){let logger=options.logger,catchErrors=options.catchErrors??!0,mergeBeforeModelResolve=(acc,next)=>({modelOverride:acc?.modelOverride??next.modelOverride,providerOverride:acc?.providerOverride??next.providerOverride}),mergeBeforePromptBuild=(acc,next)=>({systemPrompt:next.systemPrompt??acc?.systemPrompt,prependContext:acc?.prependContext&&next.prependContext?`${acc.prependContext}\n\n${next.prependContext}`:next.prependContext??acc?.prependContext});async function runVoidHook(hookName,event,ctx){let hooks=getHooksForName(registry,hookName);if(hooks.length===0)return;logger?.debug?.(`[hooks] running ${hookName} (${hooks.length} handlers)`);let promises=hooks.map(async hook=>{try{await hook.handler(event,ctx)}catch(err){let msg=`[hooks] ${hookName} handler from ${hook.pluginId} failed: ${String(err)}`;if(catchErrors)logger?.error(msg);else throw Error(msg,{cause:err})}});await Promise.all(promises)}async function runModifyingHook(hookName,event,ctx,mergeResults){let hooks=getHooksForName(registry,hookName);if(hooks.length===0)return;logger?.debug?.(`[hooks] running ${hookName} (${hooks.length} handlers, sequential)`);let result;for(let hook of hooks)try{let handlerResult=await hook.handler(event,ctx);handlerResult!=null&&(result=mergeResults&&result!==void 0?mergeResults(result,handlerResult):handlerResult)}catch(err){let msg=`[hooks] ${hookName} handler from ${hook.pluginId} failed: ${String(err)}`;if(catchErrors)logger?.error(msg);else throw Error(msg,{cause:err})}return result}async function runBeforeModelResolve(event,ctx){return runModifyingHook(`before_model_resolve`,event,ctx,mergeBeforeModelResolve)}async function runBeforePromptBuild(event,ctx){return runModifyingHook(`before_prompt_build`,event,ctx,mergeBeforePromptBuild)}async function runBeforeAgentStart(event,ctx){return runModifyingHook(`before_agent_start`,event,ctx,(acc,next)=>({...mergeBeforePromptBuild(acc,next),...mergeBeforeModelResolve(acc,next)}))}async function runAgentEnd(event,ctx){return runVoidHook(`agent_end`,event,ctx)}async function runLlmInput(event,ctx){return runVoidHook(`llm_input`,event,ctx)}async function runLlmOutput(event,ctx){return runVoidHook(`llm_output`,event,ctx)}async function runBeforeCompaction(event,ctx){return runVoidHook(`before_compaction`,event,ctx)}async function runAfterCompaction(event,ctx){return runVoidHook(`after_compaction`,event,ctx)}async function runBeforeReset(event,ctx){return runVoidHook(`before_reset`,event,ctx)}async function runMessageReceived(event,ctx){return runVoidHook(`message_received`,event,ctx)}async function runMessageSending(event,ctx){return runModifyingHook(`message_sending`,event,ctx,(acc,next)=>({content:next.content??acc?.content,cancel:next.cancel??acc?.cancel}))}async function runMessageSent(event,ctx){return runVoidHook(`message_sent`,event,ctx)}async function runBeforeToolCall(event,ctx){return runModifyingHook(`before_tool_call`,event,ctx,(acc,next)=>({params:next.params??acc?.params,block:next.block??acc?.block,blockReason:next.blockReason??acc?.blockReason}))}async function runAfterToolCall(event,ctx){return runVoidHook(`after_tool_call`,event,ctx)}function runToolResultPersist(event,ctx){let hooks=getHooksForName(registry,`tool_result_persist`);if(hooks.length===0)return;let current=event.message;for(let hook of hooks)try{let out=hook.handler({...event,message:current},ctx);if(out&&typeof out.then==`function`){let msg=`[hooks] tool_result_persist handler from ${hook.pluginId} returned a Promise; this hook is synchronous and the result was ignored.`;if(catchErrors){logger?.warn?.(msg);continue}throw Error(msg)}let next=out?.message;next&&(current=next)}catch(err){let msg=`[hooks] tool_result_persist handler from ${hook.pluginId} failed: ${String(err)}`;if(catchErrors)logger?.error(msg);else throw Error(msg,{cause:err})}return{message:current}}function runBeforeMessageWrite(event,ctx){let hooks=getHooksForName(registry,`before_message_write`);if(hooks.length===0)return;let current=event.message;for(let hook of hooks)try{let out=hook.handler({...event,message:current},ctx);if(out&&typeof out.then==`function`){let msg=`[hooks] before_message_write handler from ${hook.pluginId} returned a Promise; this hook is synchronous and the result was ignored.`;if(catchErrors){logger?.warn?.(msg);continue}throw Error(msg)}let result=out;if(result?.block)return{block:!0};result?.message&&(current=result.message)}catch(err){let msg=`[hooks] before_message_write handler from ${hook.pluginId} failed: ${String(err)}`;if(catchErrors)logger?.error(msg);else throw Error(msg,{cause:err})}if(current!==event.message)return{message:current}}async function runSessionStart(event,ctx){return runVoidHook(`session_start`,event,ctx)}async function runSessionEnd(event,ctx){return runVoidHook(`session_end`,event,ctx)}async function runGatewayStart(event,ctx){return runVoidHook(`gateway_start`,event,ctx)}async function runGatewayStop(event,ctx){return runVoidHook(`gateway_stop`,event,ctx)}function hasHooks(hookName){return registry.typedHooks.some(h=>h.hookName===hookName)}function getHookCount(hookName){return registry.typedHooks.filter(h=>h.hookName===hookName).length}return{runBeforeModelResolve,runBeforePromptBuild,runBeforeAgentStart,runLlmInput,runLlmOutput,runAgentEnd,runBeforeCompaction,runAfterCompaction,runBeforeReset,runMessageReceived,runMessageSending,runMessageSent,runBeforeToolCall,runAfterToolCall,runToolResultPersist,runBeforeMessageWrite,runSessionStart,runSessionEnd,runGatewayStart,runGatewayStop,hasHooks,getHookCount}}const log=createSubsystemLogger(`plugins`);let globalHookRunner=null;function initializeGlobalHookRunner(registry){globalHookRunner=createHookRunner(registry,{logger:{debug:msg=>log.debug(msg),warn:msg=>log.warn(msg),error:msg=>log.error(msg)},catchErrors:!0});let hookCount=registry.hooks.length;hookCount>0&&log.info(`hook runner initialized with ${hookCount} registered hooks`)}function getGlobalHookRunner(){return globalHookRunner}async function runGlobalGatewayStopSafely(params){let hookRunner=getGlobalHookRunner();if(hookRunner?.hasHooks(`gateway_stop`))try{await hookRunner.runGatewayStop(params.event,params.ctx)}catch(err){if(params.onError){params.onError(err);return}log.warn(`gateway_stop hook failed: ${String(err)}`)}}const MB=1024*1024;function resolveChannelMediaMaxBytes(params){let accountId=normalizeAccountId$1(params.accountId),channelLimit=params.resolveChannelLimitMb({cfg:params.cfg,accountId});if(channelLimit)return channelLimit*MB;if(params.cfg.agents?.defaults?.mediaMaxMb)return params.cfg.agents.defaults.mediaMaxMb*MB}const cache=new Map;let lastRegistry=null;function ensureCacheForRegistry(registry){registry!==lastRegistry&&(cache.clear(),lastRegistry=registry)}async function loadChannelOutboundAdapter(id){let registry=getActivePluginRegistry();ensureCacheForRegistry(registry);let cached=cache.get(id);if(cached)return cached;let outbound=(registry?.channels.find(entry=>entry.plugin.id===id))?.plugin.outbound;if(outbound)return cache.set(id,outbound),outbound}function stripWhatsAppLeadingBlankLines(text){return text.replace(/^(?:[ \t]*\r?\n)+/,``)}function throwIfAborted(abortSignal){if(abortSignal?.aborted){let err=Error(`Operation aborted`);throw err.name=`AbortError`,err}}const AUDIO_TAG_RE=/\[\[\s*audio_as_voice\s*\]\]/gi,REPLY_TAG_RE=/\[\[\s*(?:reply_to_current|reply_to\s*:\s*([^\]\n]+))\s*\]\]/gi;function normalizeDirectiveWhitespace(text){return text.replace(/[ \t]+/g,` `).replace(/[ \t]*\n[ \t]*/g,`
1
+ import{C as createInternalHookEvent,T as triggerInternalHook,d as getActivePluginRegistry}from"./registry-Cv7CoWAs.js";import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{u as normalizeAccountId$1}from"./session-key-CksCYipj.js";import{L as getChannelDock,i as resolveMirroredTranscriptText,r as appendAssistantMessageToSessionTranscript}from"./sessions-BA8Se_bT.js";import{n as SILENT_REPLY_TOKEN,r as isSilentReplyText}from"./tokens-CFKkpUIu.js";import{r as normalizeChannelId,t as getChannelPlugin}from"./plugins-1Mn6RiNf.js";import{h as isMessagingToolDuplicate}from"./embedded-helpers-DdU30lmt.js";import{c as resolveTextChunkLimit,d as parseFenceSpans,i as chunkMarkdownTextWithMode,n as chunkByParagraph,s as resolveChunkMode}from"./chunk-Dly7lM4r.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-B1Rx8hv6.js";import{s as getAgentScopedMediaLocalRoots}from"./ir-CSdQJPqu.js";import{c as markdownToSignalTextChunks,t as sendMessageSignal}from"./send-kkm_zrHQ.js";import{i as enqueueDelivery,n as ackDelivery,o as failDelivery}from"./delivery-queue-Cp3t4Upn.js";function getHooksForName(registry,hookName){return registry.typedHooks.filter(h=>h.hookName===hookName).toSorted((a,b)=>(b.priority??0)-(a.priority??0))}function createHookRunner(registry,options={}){let logger=options.logger,catchErrors=options.catchErrors??!0,mergeBeforeModelResolve=(acc,next)=>({modelOverride:acc?.modelOverride??next.modelOverride,providerOverride:acc?.providerOverride??next.providerOverride}),mergeBeforePromptBuild=(acc,next)=>({systemPrompt:next.systemPrompt??acc?.systemPrompt,prependContext:acc?.prependContext&&next.prependContext?`${acc.prependContext}\n\n${next.prependContext}`:next.prependContext??acc?.prependContext});async function runVoidHook(hookName,event,ctx){let hooks=getHooksForName(registry,hookName);if(hooks.length===0)return;logger?.debug?.(`[hooks] running ${hookName} (${hooks.length} handlers)`);let promises=hooks.map(async hook=>{try{await hook.handler(event,ctx)}catch(err){let msg=`[hooks] ${hookName} handler from ${hook.pluginId} failed: ${String(err)}`;if(catchErrors)logger?.error(msg);else throw Error(msg,{cause:err})}});await Promise.all(promises)}async function runModifyingHook(hookName,event,ctx,mergeResults){let hooks=getHooksForName(registry,hookName);if(hooks.length===0)return;logger?.debug?.(`[hooks] running ${hookName} (${hooks.length} handlers, sequential)`);let result;for(let hook of hooks)try{let handlerResult=await hook.handler(event,ctx);handlerResult!=null&&(result=mergeResults&&result!==void 0?mergeResults(result,handlerResult):handlerResult)}catch(err){let msg=`[hooks] ${hookName} handler from ${hook.pluginId} failed: ${String(err)}`;if(catchErrors)logger?.error(msg);else throw Error(msg,{cause:err})}return result}async function runBeforeModelResolve(event,ctx){return runModifyingHook(`before_model_resolve`,event,ctx,mergeBeforeModelResolve)}async function runBeforePromptBuild(event,ctx){return runModifyingHook(`before_prompt_build`,event,ctx,mergeBeforePromptBuild)}async function runBeforeAgentStart(event,ctx){return runModifyingHook(`before_agent_start`,event,ctx,(acc,next)=>({...mergeBeforePromptBuild(acc,next),...mergeBeforeModelResolve(acc,next)}))}async function runAgentEnd(event,ctx){return runVoidHook(`agent_end`,event,ctx)}async function runLlmInput(event,ctx){return runVoidHook(`llm_input`,event,ctx)}async function runLlmOutput(event,ctx){return runVoidHook(`llm_output`,event,ctx)}async function runBeforeCompaction(event,ctx){return runVoidHook(`before_compaction`,event,ctx)}async function runAfterCompaction(event,ctx){return runVoidHook(`after_compaction`,event,ctx)}async function runBeforeReset(event,ctx){return runVoidHook(`before_reset`,event,ctx)}async function runMessageReceived(event,ctx){return runVoidHook(`message_received`,event,ctx)}async function runMessageSending(event,ctx){return runModifyingHook(`message_sending`,event,ctx,(acc,next)=>({content:next.content??acc?.content,cancel:next.cancel??acc?.cancel}))}async function runMessageSent(event,ctx){return runVoidHook(`message_sent`,event,ctx)}async function runBeforeToolCall(event,ctx){return runModifyingHook(`before_tool_call`,event,ctx,(acc,next)=>({params:next.params??acc?.params,block:next.block??acc?.block,blockReason:next.blockReason??acc?.blockReason}))}async function runAfterToolCall(event,ctx){return runVoidHook(`after_tool_call`,event,ctx)}function runToolResultPersist(event,ctx){let hooks=getHooksForName(registry,`tool_result_persist`);if(hooks.length===0)return;let current=event.message;for(let hook of hooks)try{let out=hook.handler({...event,message:current},ctx);if(out&&typeof out.then==`function`){let msg=`[hooks] tool_result_persist handler from ${hook.pluginId} returned a Promise; this hook is synchronous and the result was ignored.`;if(catchErrors){logger?.warn?.(msg);continue}throw Error(msg)}let next=out?.message;next&&(current=next)}catch(err){let msg=`[hooks] tool_result_persist handler from ${hook.pluginId} failed: ${String(err)}`;if(catchErrors)logger?.error(msg);else throw Error(msg,{cause:err})}return{message:current}}function runBeforeMessageWrite(event,ctx){let hooks=getHooksForName(registry,`before_message_write`);if(hooks.length===0)return;let current=event.message;for(let hook of hooks)try{let out=hook.handler({...event,message:current},ctx);if(out&&typeof out.then==`function`){let msg=`[hooks] before_message_write handler from ${hook.pluginId} returned a Promise; this hook is synchronous and the result was ignored.`;if(catchErrors){logger?.warn?.(msg);continue}throw Error(msg)}let result=out;if(result?.block)return{block:!0};result?.message&&(current=result.message)}catch(err){let msg=`[hooks] before_message_write handler from ${hook.pluginId} failed: ${String(err)}`;if(catchErrors)logger?.error(msg);else throw Error(msg,{cause:err})}if(current!==event.message)return{message:current}}async function runSessionStart(event,ctx){return runVoidHook(`session_start`,event,ctx)}async function runSessionEnd(event,ctx){return runVoidHook(`session_end`,event,ctx)}async function runGatewayStart(event,ctx){return runVoidHook(`gateway_start`,event,ctx)}async function runGatewayStop(event,ctx){return runVoidHook(`gateway_stop`,event,ctx)}function hasHooks(hookName){return registry.typedHooks.some(h=>h.hookName===hookName)}function getHookCount(hookName){return registry.typedHooks.filter(h=>h.hookName===hookName).length}return{runBeforeModelResolve,runBeforePromptBuild,runBeforeAgentStart,runLlmInput,runLlmOutput,runAgentEnd,runBeforeCompaction,runAfterCompaction,runBeforeReset,runMessageReceived,runMessageSending,runMessageSent,runBeforeToolCall,runAfterToolCall,runToolResultPersist,runBeforeMessageWrite,runSessionStart,runSessionEnd,runGatewayStart,runGatewayStop,hasHooks,getHookCount}}const log=createSubsystemLogger(`plugins`);let globalHookRunner=null;function initializeGlobalHookRunner(registry){globalHookRunner=createHookRunner(registry,{logger:{debug:msg=>log.debug(msg),warn:msg=>log.warn(msg),error:msg=>log.error(msg)},catchErrors:!0});let hookCount=registry.hooks.length;hookCount>0&&log.info(`hook runner initialized with ${hookCount} registered hooks`)}function getGlobalHookRunner(){return globalHookRunner}async function runGlobalGatewayStopSafely(params){let hookRunner=getGlobalHookRunner();if(hookRunner?.hasHooks(`gateway_stop`))try{await hookRunner.runGatewayStop(params.event,params.ctx)}catch(err){if(params.onError){params.onError(err);return}log.warn(`gateway_stop hook failed: ${String(err)}`)}}const MB=1024*1024;function resolveChannelMediaMaxBytes(params){let accountId=normalizeAccountId$1(params.accountId),channelLimit=params.resolveChannelLimitMb({cfg:params.cfg,accountId});if(channelLimit)return channelLimit*MB;if(params.cfg.agents?.defaults?.mediaMaxMb)return params.cfg.agents.defaults.mediaMaxMb*MB}const cache=new Map;let lastRegistry=null;function ensureCacheForRegistry(registry){registry!==lastRegistry&&(cache.clear(),lastRegistry=registry)}async function loadChannelOutboundAdapter(id){let registry=getActivePluginRegistry();ensureCacheForRegistry(registry);let cached=cache.get(id);if(cached)return cached;let outbound=(registry?.channels.find(entry=>entry.plugin.id===id))?.plugin.outbound;if(outbound)return cache.set(id,outbound),outbound}function stripWhatsAppLeadingBlankLines(text){return text.replace(/^(?:[ \t]*\r?\n)+/,``)}function throwIfAborted(abortSignal){if(abortSignal?.aborted){let err=Error(`Operation aborted`);throw err.name=`AbortError`,err}}const AUDIO_TAG_RE=/\[\[\s*audio_as_voice\s*\]\]/gi,REPLY_TAG_RE=/\[\[\s*(?:reply_to_current|reply_to\s*:\s*([^\]\n]+))\s*\]\]/gi;function normalizeDirectiveWhitespace(text){return text.replace(/[ \t]+/g,` `).replace(/[ \t]*\n[ \t]*/g,`
2
2
  `).trim()}function parseInlineDirectives(text,options={}){let{currentMessageId,stripAudioTag=!0,stripReplyTags=!0}=options;if(!text)return{text:``,audioAsVoice:!1,replyToCurrent:!1,hasAudioTag:!1,hasReplyTag:!1};let cleaned=text,audioAsVoice=!1,hasAudioTag=!1,hasReplyTag=!1,sawCurrent=!1,lastExplicitId;cleaned=cleaned.replace(AUDIO_TAG_RE,match=>(audioAsVoice=!0,hasAudioTag=!0,stripAudioTag?` `:match)),cleaned=cleaned.replace(REPLY_TAG_RE,(match,idRaw)=>{if(hasReplyTag=!0,idRaw===void 0)sawCurrent=!0;else{let id=idRaw.trim();id&&(lastExplicitId=id)}return stripReplyTags?` `:match}),cleaned=normalizeDirectiveWhitespace(cleaned);let replyToId=lastExplicitId??(sawCurrent&&currentMessageId?.trim()||void 0);return{text:cleaned,audioAsVoice,replyToId,replyToExplicitId:lastExplicitId,replyToCurrent:sawCurrent,hasAudioTag,hasReplyTag}}function parseAudioTag(text){let result=parseInlineDirectives(text,{stripReplyTags:!1});return{text:result.text,audioAsVoice:result.audioAsVoice,hadTag:result.hasAudioTag}}const MEDIA_TOKEN_RE=/\bMEDIA:\s*`?([^\n]+)`?/gi;function normalizeMediaSource(src){return src.startsWith(`file://`)?src.replace(`file://`,``):src}function cleanCandidate(raw){return raw.replace(/^[`"'[{(]+/,``).replace(/[`"'\\})\],]+$/,``)}const WINDOWS_DRIVE_RE=/^[a-zA-Z]:[\\/]/,SCHEME_RE=/^[a-zA-Z][a-zA-Z0-9+.-]*:/,HAS_FILE_EXT=/\.\w{1,10}$/;function isLikelyLocalPath(candidate){return candidate.startsWith(`/`)||candidate.startsWith(`./`)||candidate.startsWith(`../`)||candidate.startsWith(`~`)||WINDOWS_DRIVE_RE.test(candidate)||candidate.startsWith(`\\\\`)||!SCHEME_RE.test(candidate)&&(candidate.includes(`/`)||candidate.includes(`\\`))}function isValidMedia(candidate,opts){return!candidate||candidate.length>4096||!opts?.allowSpaces&&/\s/.test(candidate)?!1:!!(/^https?:\/\//i.test(candidate)||isLikelyLocalPath(candidate)||opts?.allowBareFilename&&!SCHEME_RE.test(candidate)&&HAS_FILE_EXT.test(candidate))}function unwrapQuoted(value){let trimmed=value.trim();if(trimmed.length<2)return;let first=trimmed[0];if(first===trimmed[trimmed.length-1]&&!(first!==`"`&&first!==`'`&&first!=="`"))return trimmed.slice(1,-1).trim()}function isInsideFence(fenceSpans,offset){return fenceSpans.some(span=>offset>=span.start&&offset<span.end)}function splitMediaFromOutput(raw){let trimmedRaw=raw.trimEnd();if(!trimmedRaw.trim())return{text:``};let media=[],foundMediaToken=!1,fenceSpans=parseFenceSpans(trimmedRaw),lines=trimmedRaw.split(`
3
3
  `),keptLines=[],lineOffset=0;for(let line of lines){if(isInsideFence(fenceSpans,lineOffset)){keptLines.push(line),lineOffset+=line.length+1;continue}if(!line.trimStart().startsWith(`MEDIA:`)){keptLines.push(line),lineOffset+=line.length+1;continue}let matches=Array.from(line.matchAll(MEDIA_TOKEN_RE));if(matches.length===0){keptLines.push(line),lineOffset+=line.length+1;continue}let pieces=[],cursor=0;for(let match of matches){let start=match.index??0;pieces.push(line.slice(cursor,start));let payload=match[1],unwrapped=unwrapQuoted(payload),payloadValue=unwrapped??payload,parts=unwrapped?[unwrapped]:payload.split(/\s+/).filter(Boolean),mediaStartIndex=media.length,validCount=0,invalidParts=[],hasValidMedia=!1;for(let part of parts){let candidate=normalizeMediaSource(cleanCandidate(part));isValidMedia(candidate,unwrapped?{allowSpaces:!0}:void 0)?(media.push(candidate),hasValidMedia=!0,foundMediaToken=!0,validCount+=1):invalidParts.push(part)}let trimmedPayload=payloadValue.trim(),looksLikeLocalPath=isLikelyLocalPath(trimmedPayload)||trimmedPayload.startsWith(`file://`);if(!unwrapped&&validCount===1&&invalidParts.length>0&&/\s/.test(payloadValue)&&looksLikeLocalPath){let fallback=normalizeMediaSource(cleanCandidate(payloadValue));isValidMedia(fallback,{allowSpaces:!0})&&(media.splice(mediaStartIndex,media.length-mediaStartIndex,fallback),hasValidMedia=!0,foundMediaToken=!0,validCount=1,invalidParts.length=0)}if(!hasValidMedia){let fallback=normalizeMediaSource(cleanCandidate(payloadValue));isValidMedia(fallback,{allowSpaces:!0,allowBareFilename:!0})&&(media.push(fallback),hasValidMedia=!0,foundMediaToken=!0,invalidParts.length=0)}hasValidMedia?invalidParts.length>0&&pieces.push(invalidParts.join(` `)):looksLikeLocalPath?foundMediaToken=!0:pieces.push(match[0]),cursor=start+match[0].length}pieces.push(line.slice(cursor));let cleanedLine=pieces.join(``).replace(/[ \t]{2,}/g,` `).trim();cleanedLine&&keptLines.push(cleanedLine),lineOffset+=line.length+1}let cleanedText=keptLines.join(`
4
4
  `).replace(/[ \t]+\n/g,`
@@ -1 +1 @@
1
- function createDefaultDeps(){return{sendMessageWhatsApp:async(...args)=>{let{sendMessageWhatsApp}=await import(`./web-P6QsgmSD.js`);return await sendMessageWhatsApp(...args)},sendMessageTelegram:async(...args)=>{let{sendMessageTelegram}=await import(`./send-dDpSBSBo.js`);return await sendMessageTelegram(...args)},sendMessageDiscord:async(...args)=>{let{sendMessageDiscord}=await import(`./send-j15662lv.js`);return await sendMessageDiscord(...args)},sendMessageSlack:async(...args)=>{let{sendMessageSlack}=await import(`./send-gDb60Hk-.js`);return await sendMessageSlack(...args)},sendMessageSignal:async(...args)=>{let{sendMessageSignal}=await import(`./send-CxG2suVM.js`);return await sendMessageSignal(...args)},sendMessageIMessage:async(...args)=>{let{sendMessageIMessage}=await import(`./send--12DIueA.js`);return await sendMessageIMessage(...args)}}}function createOutboundSendDeps(deps){return{sendWhatsApp:deps.sendMessageWhatsApp,sendTelegram:deps.sendMessageTelegram,sendDiscord:deps.sendMessageDiscord,sendSlack:deps.sendMessageSlack,sendSignal:deps.sendMessageSignal,sendIMessage:deps.sendMessageIMessage}}export{createOutboundSendDeps as n,createDefaultDeps as t};
1
+ function createDefaultDeps(){return{sendMessageWhatsApp:async(...args)=>{let{sendMessageWhatsApp}=await import(`./web-Btgs8oWv.js`);return await sendMessageWhatsApp(...args)},sendMessageTelegram:async(...args)=>{let{sendMessageTelegram}=await import(`./send-COKUbcqs.js`);return await sendMessageTelegram(...args)},sendMessageDiscord:async(...args)=>{let{sendMessageDiscord}=await import(`./send-CrFWgJKx.js`);return await sendMessageDiscord(...args)},sendMessageSlack:async(...args)=>{let{sendMessageSlack}=await import(`./send-CwK8QBR3.js`);return await sendMessageSlack(...args)},sendMessageSignal:async(...args)=>{let{sendMessageSignal}=await import(`./send-Bbo7TXLx.js`);return await sendMessageSignal(...args)},sendMessageIMessage:async(...args)=>{let{sendMessageIMessage}=await import(`./send-CTw3PqN4.js`);return await sendMessageIMessage(...args)}}}function createOutboundSendDeps(deps){return{sendWhatsApp:deps.sendMessageWhatsApp,sendTelegram:deps.sendMessageTelegram,sendDiscord:deps.sendMessageDiscord,sendSlack:deps.sendMessageSlack,sendSignal:deps.sendMessageSignal,sendIMessage:deps.sendMessageIMessage}}export{createOutboundSendDeps as n,createDefaultDeps as t};
@@ -1 +1 @@
1
- import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./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{h as GATEWAY_CLIENT_NAMES,m as GATEWAY_CLIENT_MODES}from"./message-channel-D_jXxXQj.js";import"./client-xfoidwPI.js";import{n as callGateway}from"./call-BbRf8gFM.js";import{n as formatTimeAgo}from"./format-relative-niF9gXss.js";import{n as withProgress}from"./progress-BfOtdN6b.js";import{t as renderTable}from"./table-BoCHYKoQ.js";const devicesCallOpts=(cmd,defaults)=>cmd.option(`--url <url>`,`Gateway WebSocket URL (defaults to gateway.remote.url when configured)`).option(`--token <token>`,`Gateway token (if required)`).option(`--password <password>`,`Gateway password (password auth)`).option(`--timeout <ms>`,`Timeout in ms`,String(defaults?.timeoutMs??1e4)).option(`--json`,`Output JSON`,!1),callGatewayCli=async(method,opts,params)=>withProgress({label:`Devices ${method}`,indeterminate:!0,enabled:opts.json!==!0},async()=>await callGateway({url:opts.url,token:opts.token,password:opts.password,method,params,timeoutMs:Number(opts.timeout??1e4),clientName:GATEWAY_CLIENT_NAMES.CLI,mode:GATEWAY_CLIENT_MODES.CLI}));function parseDevicePairingList(value){let obj=typeof value==`object`&&value?value:{};return{pending:Array.isArray(obj.pending)?obj.pending:[],paired:Array.isArray(obj.paired)?obj.paired:[]}}function selectLatestPendingRequest(pending){return pending?.length?pending.reduce((latest,current)=>{let latestTs=typeof latest.ts==`number`?latest.ts:0;return(typeof current.ts==`number`?current.ts:0)>latestTs?current:latest}):null}function formatTokenSummary(tokens){return!tokens||tokens.length===0?`none`:tokens.map(t=>`${t.role}${t.revokedAtMs?` (revoked)`:``}`).toSorted((a,b)=>a.localeCompare(b)).join(`, `)}function resolveRequiredDeviceRole(opts){let deviceId=String(opts.device??``).trim(),role=String(opts.role??``).trim();return deviceId&&role?{deviceId,role}:(defaultRuntime.error(`--device and --role required`),defaultRuntime.exit(1),null)}function registerDevicesCli(program){let devices=program.command(`devices`).description(`Device pairing and auth tokens`);devicesCallOpts(devices.command(`list`).description(`List pending and paired devices`).action(async opts=>{let list=parseDevicePairingList(await callGatewayCli(`device.pair.list`,opts,{}));if(opts.json){defaultRuntime.log(JSON.stringify(list,null,2));return}if(list.pending?.length){let tableWidth=Math.max(60,(process.stdout.columns??120)-1);defaultRuntime.log(`${theme.heading(`Pending`)} ${theme.muted(`(${list.pending.length})`)}`),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Request`,header:`Request`,minWidth:10},{key:`Device`,header:`Device`,minWidth:16,flex:!0},{key:`Role`,header:`Role`,minWidth:8},{key:`IP`,header:`IP`,minWidth:12},{key:`Age`,header:`Age`,minWidth:8},{key:`Flags`,header:`Flags`,minWidth:8}],rows:list.pending.map(req=>({Request:req.requestId,Device:req.displayName||req.deviceId,Role:req.role??``,IP:req.remoteIp??``,Age:typeof req.ts==`number`?formatTimeAgo(Date.now()-req.ts):``,Flags:req.isRepair?`repair`:``}))}).trimEnd())}if(list.paired?.length){let tableWidth=Math.max(60,(process.stdout.columns??120)-1);defaultRuntime.log(`${theme.heading(`Paired`)} ${theme.muted(`(${list.paired.length})`)}`),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Device`,header:`Device`,minWidth:16,flex:!0},{key:`Roles`,header:`Roles`,minWidth:12,flex:!0},{key:`Scopes`,header:`Scopes`,minWidth:12,flex:!0},{key:`Tokens`,header:`Tokens`,minWidth:12,flex:!0},{key:`IP`,header:`IP`,minWidth:12}],rows:list.paired.map(device=>({Device:device.displayName||device.deviceId,Roles:device.roles?.length?device.roles.join(`, `):``,Scopes:device.scopes?.length?device.scopes.join(`, `):``,Tokens:formatTokenSummary(device.tokens),IP:device.remoteIp??``}))}).trimEnd())}!list.pending?.length&&!list.paired?.length&&defaultRuntime.log(theme.muted(`No device pairing entries.`))})),devicesCallOpts(devices.command(`remove`).description(`Remove a paired device entry`).argument(`<deviceId>`,`Paired device id`).action(async(deviceId,opts)=>{let trimmed=deviceId.trim();if(!trimmed){defaultRuntime.error(`deviceId is required`),defaultRuntime.exit(1);return}let result=await callGatewayCli(`device.pair.remove`,opts,{deviceId:trimmed});if(opts.json){defaultRuntime.log(JSON.stringify(result,null,2));return}defaultRuntime.log(`${theme.warn(`Removed`)} ${theme.command(trimmed)}`)})),devicesCallOpts(devices.command(`clear`).description(`Clear paired devices from the gateway table`).option(`--pending`,`Also reject all pending pairing requests`,!1).option(`--yes`,`Confirm destructive clear`,!1).action(async opts=>{if(!opts.yes){defaultRuntime.error(`Refusing to clear pairing table without --yes`),defaultRuntime.exit(1);return}let list=parseDevicePairingList(await callGatewayCli(`device.pair.list`,opts,{})),removedDeviceIds=[],rejectedRequestIds=[],paired=Array.isArray(list.paired)?list.paired:[];for(let device of paired){let deviceId=typeof device.deviceId==`string`?device.deviceId.trim():``;deviceId&&(await callGatewayCli(`device.pair.remove`,opts,{deviceId}),removedDeviceIds.push(deviceId))}if(opts.pending){let pending=Array.isArray(list.pending)?list.pending:[];for(let req of pending){let requestId=typeof req.requestId==`string`?req.requestId.trim():``;requestId&&(await callGatewayCli(`device.pair.reject`,opts,{requestId}),rejectedRequestIds.push(requestId))}}if(opts.json){defaultRuntime.log(JSON.stringify({removedDevices:removedDeviceIds,rejectedPending:rejectedRequestIds},null,2));return}defaultRuntime.log(`${theme.warn(`Cleared`)} ${removedDeviceIds.length} paired device${removedDeviceIds.length===1?``:`s`}`),opts.pending&&defaultRuntime.log(`${theme.warn(`Rejected`)} ${rejectedRequestIds.length} pending request${rejectedRequestIds.length===1?``:`s`}`)})),devicesCallOpts(devices.command(`approve`).description(`Approve a pending device pairing request`).argument(`[requestId]`,`Pending request id`).option(`--latest`,`Approve the most recent pending request`,!1).action(async(requestId,opts)=>{let resolvedRequestId=requestId?.trim();if((!resolvedRequestId||opts.latest)&&(resolvedRequestId=selectLatestPendingRequest(parseDevicePairingList(await callGatewayCli(`device.pair.list`,opts,{})).pending)?.requestId?.trim()),!resolvedRequestId){defaultRuntime.error(`No pending device pairing requests to approve`),defaultRuntime.exit(1);return}let result=await callGatewayCli(`device.pair.approve`,opts,{requestId:resolvedRequestId});if(opts.json){defaultRuntime.log(JSON.stringify(result,null,2));return}let deviceId=result?.device?.deviceId;defaultRuntime.log(`${theme.success(`Approved`)} ${theme.command(deviceId??`ok`)} ${theme.muted(`(${resolvedRequestId})`)}`)})),devicesCallOpts(devices.command(`reject`).description(`Reject a pending device pairing request`).argument(`<requestId>`,`Pending request id`).action(async(requestId,opts)=>{let result=await callGatewayCli(`device.pair.reject`,opts,{requestId});if(opts.json){defaultRuntime.log(JSON.stringify(result,null,2));return}let deviceId=result?.deviceId;defaultRuntime.log(`${theme.warn(`Rejected`)} ${theme.command(deviceId??`ok`)}`)})),devicesCallOpts(devices.command(`rotate`).description(`Rotate a device token for a role`).requiredOption(`--device <id>`,`Device id`).requiredOption(`--role <role>`,`Role name`).option(`--scope <scope...>`,`Scopes to attach to the token (repeatable)`).action(async opts=>{let required=resolveRequiredDeviceRole(opts);if(!required)return;let result=await callGatewayCli(`device.token.rotate`,opts,{deviceId:required.deviceId,role:required.role,scopes:Array.isArray(opts.scope)?opts.scope:void 0});defaultRuntime.log(JSON.stringify(result,null,2))})),devicesCallOpts(devices.command(`revoke`).description(`Revoke a device token for a role`).requiredOption(`--device <id>`,`Device id`).requiredOption(`--role <role>`,`Role name`).action(async opts=>{let required=resolveRequiredDeviceRole(opts);if(!required)return;let result=await callGatewayCli(`device.token.revoke`,opts,{deviceId:required.deviceId,role:required.role});defaultRuntime.log(JSON.stringify(result,null,2))}))}export{registerDevicesCli};
1
+ import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./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{h as GATEWAY_CLIENT_NAMES,m as GATEWAY_CLIENT_MODES}from"./message-channel-D_jXxXQj.js";import"./client-xfoidwPI.js";import{n as callGateway}from"./call-T8ciwMTA.js";import{n as formatTimeAgo}from"./format-relative-niF9gXss.js";import{n as withProgress}from"./progress-BfOtdN6b.js";import{t as renderTable}from"./table-BoCHYKoQ.js";const devicesCallOpts=(cmd,defaults)=>cmd.option(`--url <url>`,`Gateway WebSocket URL (defaults to gateway.remote.url when configured)`).option(`--token <token>`,`Gateway token (if required)`).option(`--password <password>`,`Gateway password (password auth)`).option(`--timeout <ms>`,`Timeout in ms`,String(defaults?.timeoutMs??1e4)).option(`--json`,`Output JSON`,!1),callGatewayCli=async(method,opts,params)=>withProgress({label:`Devices ${method}`,indeterminate:!0,enabled:opts.json!==!0},async()=>await callGateway({url:opts.url,token:opts.token,password:opts.password,method,params,timeoutMs:Number(opts.timeout??1e4),clientName:GATEWAY_CLIENT_NAMES.CLI,mode:GATEWAY_CLIENT_MODES.CLI}));function parseDevicePairingList(value){let obj=typeof value==`object`&&value?value:{};return{pending:Array.isArray(obj.pending)?obj.pending:[],paired:Array.isArray(obj.paired)?obj.paired:[]}}function selectLatestPendingRequest(pending){return pending?.length?pending.reduce((latest,current)=>{let latestTs=typeof latest.ts==`number`?latest.ts:0;return(typeof current.ts==`number`?current.ts:0)>latestTs?current:latest}):null}function formatTokenSummary(tokens){return!tokens||tokens.length===0?`none`:tokens.map(t=>`${t.role}${t.revokedAtMs?` (revoked)`:``}`).toSorted((a,b)=>a.localeCompare(b)).join(`, `)}function resolveRequiredDeviceRole(opts){let deviceId=String(opts.device??``).trim(),role=String(opts.role??``).trim();return deviceId&&role?{deviceId,role}:(defaultRuntime.error(`--device and --role required`),defaultRuntime.exit(1),null)}function registerDevicesCli(program){let devices=program.command(`devices`).description(`Device pairing and auth tokens`);devicesCallOpts(devices.command(`list`).description(`List pending and paired devices`).action(async opts=>{let list=parseDevicePairingList(await callGatewayCli(`device.pair.list`,opts,{}));if(opts.json){defaultRuntime.log(JSON.stringify(list,null,2));return}if(list.pending?.length){let tableWidth=Math.max(60,(process.stdout.columns??120)-1);defaultRuntime.log(`${theme.heading(`Pending`)} ${theme.muted(`(${list.pending.length})`)}`),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Request`,header:`Request`,minWidth:10},{key:`Device`,header:`Device`,minWidth:16,flex:!0},{key:`Role`,header:`Role`,minWidth:8},{key:`IP`,header:`IP`,minWidth:12},{key:`Age`,header:`Age`,minWidth:8},{key:`Flags`,header:`Flags`,minWidth:8}],rows:list.pending.map(req=>({Request:req.requestId,Device:req.displayName||req.deviceId,Role:req.role??``,IP:req.remoteIp??``,Age:typeof req.ts==`number`?formatTimeAgo(Date.now()-req.ts):``,Flags:req.isRepair?`repair`:``}))}).trimEnd())}if(list.paired?.length){let tableWidth=Math.max(60,(process.stdout.columns??120)-1);defaultRuntime.log(`${theme.heading(`Paired`)} ${theme.muted(`(${list.paired.length})`)}`),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Device`,header:`Device`,minWidth:16,flex:!0},{key:`Roles`,header:`Roles`,minWidth:12,flex:!0},{key:`Scopes`,header:`Scopes`,minWidth:12,flex:!0},{key:`Tokens`,header:`Tokens`,minWidth:12,flex:!0},{key:`IP`,header:`IP`,minWidth:12}],rows:list.paired.map(device=>({Device:device.displayName||device.deviceId,Roles:device.roles?.length?device.roles.join(`, `):``,Scopes:device.scopes?.length?device.scopes.join(`, `):``,Tokens:formatTokenSummary(device.tokens),IP:device.remoteIp??``}))}).trimEnd())}!list.pending?.length&&!list.paired?.length&&defaultRuntime.log(theme.muted(`No device pairing entries.`))})),devicesCallOpts(devices.command(`remove`).description(`Remove a paired device entry`).argument(`<deviceId>`,`Paired device id`).action(async(deviceId,opts)=>{let trimmed=deviceId.trim();if(!trimmed){defaultRuntime.error(`deviceId is required`),defaultRuntime.exit(1);return}let result=await callGatewayCli(`device.pair.remove`,opts,{deviceId:trimmed});if(opts.json){defaultRuntime.log(JSON.stringify(result,null,2));return}defaultRuntime.log(`${theme.warn(`Removed`)} ${theme.command(trimmed)}`)})),devicesCallOpts(devices.command(`clear`).description(`Clear paired devices from the gateway table`).option(`--pending`,`Also reject all pending pairing requests`,!1).option(`--yes`,`Confirm destructive clear`,!1).action(async opts=>{if(!opts.yes){defaultRuntime.error(`Refusing to clear pairing table without --yes`),defaultRuntime.exit(1);return}let list=parseDevicePairingList(await callGatewayCli(`device.pair.list`,opts,{})),removedDeviceIds=[],rejectedRequestIds=[],paired=Array.isArray(list.paired)?list.paired:[];for(let device of paired){let deviceId=typeof device.deviceId==`string`?device.deviceId.trim():``;deviceId&&(await callGatewayCli(`device.pair.remove`,opts,{deviceId}),removedDeviceIds.push(deviceId))}if(opts.pending){let pending=Array.isArray(list.pending)?list.pending:[];for(let req of pending){let requestId=typeof req.requestId==`string`?req.requestId.trim():``;requestId&&(await callGatewayCli(`device.pair.reject`,opts,{requestId}),rejectedRequestIds.push(requestId))}}if(opts.json){defaultRuntime.log(JSON.stringify({removedDevices:removedDeviceIds,rejectedPending:rejectedRequestIds},null,2));return}defaultRuntime.log(`${theme.warn(`Cleared`)} ${removedDeviceIds.length} paired device${removedDeviceIds.length===1?``:`s`}`),opts.pending&&defaultRuntime.log(`${theme.warn(`Rejected`)} ${rejectedRequestIds.length} pending request${rejectedRequestIds.length===1?``:`s`}`)})),devicesCallOpts(devices.command(`approve`).description(`Approve a pending device pairing request`).argument(`[requestId]`,`Pending request id`).option(`--latest`,`Approve the most recent pending request`,!1).action(async(requestId,opts)=>{let resolvedRequestId=requestId?.trim();if((!resolvedRequestId||opts.latest)&&(resolvedRequestId=selectLatestPendingRequest(parseDevicePairingList(await callGatewayCli(`device.pair.list`,opts,{})).pending)?.requestId?.trim()),!resolvedRequestId){defaultRuntime.error(`No pending device pairing requests to approve`),defaultRuntime.exit(1);return}let result=await callGatewayCli(`device.pair.approve`,opts,{requestId:resolvedRequestId});if(opts.json){defaultRuntime.log(JSON.stringify(result,null,2));return}let deviceId=result?.device?.deviceId;defaultRuntime.log(`${theme.success(`Approved`)} ${theme.command(deviceId??`ok`)} ${theme.muted(`(${resolvedRequestId})`)}`)})),devicesCallOpts(devices.command(`reject`).description(`Reject a pending device pairing request`).argument(`<requestId>`,`Pending request id`).action(async(requestId,opts)=>{let result=await callGatewayCli(`device.pair.reject`,opts,{requestId});if(opts.json){defaultRuntime.log(JSON.stringify(result,null,2));return}let deviceId=result?.deviceId;defaultRuntime.log(`${theme.warn(`Rejected`)} ${theme.command(deviceId??`ok`)}`)})),devicesCallOpts(devices.command(`rotate`).description(`Rotate a device token for a role`).requiredOption(`--device <id>`,`Device id`).requiredOption(`--role <role>`,`Role name`).option(`--scope <scope...>`,`Scopes to attach to the token (repeatable)`).action(async opts=>{let required=resolveRequiredDeviceRole(opts);if(!required)return;let result=await callGatewayCli(`device.token.rotate`,opts,{deviceId:required.deviceId,role:required.role,scopes:Array.isArray(opts.scope)?opts.scope:void 0});defaultRuntime.log(JSON.stringify(result,null,2))})),devicesCallOpts(devices.command(`revoke`).description(`Revoke a device token for a role`).requiredOption(`--device <id>`,`Device id`).requiredOption(`--role <role>`,`Role name`).action(async opts=>{let required=resolveRequiredDeviceRole(opts);if(!required)return;let result=await callGatewayCli(`device.token.revoke`,opts,{deviceId:required.deviceId,role:required.role});defaultRuntime.log(JSON.stringify(result,null,2))}))}export{registerDevicesCli};