@seanhogg/builderforce-agents 2026.10.9 → 2026.10.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. package/dist/{acp-cli-DcKpPsJa.js → acp-cli-C23mmrQt.js} +1 -1
  2. package/dist/{acp-cli-BxH-eUDl.js → acp-cli-D6F-D5JB.js} +1 -1
  3. package/dist/{agent-cXF-aL0g.js → agent-B-2r1Lr_.js} +1 -1
  4. package/dist/{agent-wJmvciTM.js → agent-BI9qSnSp.js} +1 -1
  5. package/dist/{agentbot-cli-Cub3Abbt.js → agentbot-cli-Cyrhr5jX.js} +1 -1
  6. package/dist/{agentbot-cli-CTRvEfBp.js → agentbot-cli-sC55m-XS.js} +1 -1
  7. package/dist/{agents-Cr7WO73I.js → agents-CMThT_Bj.js} +1 -1
  8. package/dist/agents-Chz9nfm2.js +1 -0
  9. package/dist/{api-key-rotation-CHBjUwUJ.js → api-key-rotation-CyCi-UqR.js} +1 -1
  10. package/dist/{audio-preflight-CWFuqbao.js → audio-preflight-B411b2-y.js} +1 -1
  11. package/dist/{audio-preflight-F2e3Y4CW.js → audio-preflight-Cs4eUjQk.js} +1 -1
  12. package/dist/{audit-DGnEhZYe.js → audit-B-USV03V.js} +1 -1
  13. package/dist/{audit-DBjjjW93.js → audit-SKNPS-K2.js} +1 -1
  14. package/dist/auth-choice-CChsMy-F.js +1 -0
  15. package/dist/{auth-choice-9gZuOvPS.js → auth-choice-CCib_yVL.js} +1 -1
  16. package/dist/auth-choice-DSnpkrMc.js +1 -0
  17. package/dist/{auth-choice-BoZFVmEa.js → auth-choice-DzBqqq7i.js} +1 -1
  18. package/dist/auth-choice.apply-6f3Jb_lS.js +1 -0
  19. package/dist/{auth-choice.apply-CcatXiNo.js → auth-choice.apply-BgOXoS8X.js} +1 -1
  20. package/dist/{auth-choice.apply-BHLQeym9.js → auth-choice.apply-DBuvopiF.js} +1 -1
  21. package/dist/auth-choice.apply-DeXnLwVS.js +1 -0
  22. package/dist/auth-choice.apply.transformers-CZDuBaOr.js +1 -0
  23. package/dist/{auth-choice.apply.transformers-CIn3fs7K.js → auth-choice.apply.transformers-Df9l_jRz.js} +2 -2
  24. package/dist/{auth-choice.apply.transformers-1plI0MUg.js → auth-choice.apply.transformers-DmdxpHGz.js} +2 -2
  25. package/dist/{auth-choice.apply.transformers-D5OrjEHo.js → auth-choice.apply.transformers-dn7l6XyJ.js} +1 -1
  26. package/dist/{auth-json-D1ite-pW.js → auth-json-BB-VBn5E.js} +1 -1
  27. package/dist/{auth-json-CN3MWw57.js → auth-json-BVyos95N.js} +1 -1
  28. package/dist/{auth-json-HGu227VM.js → auth-json-CoOe4tEg.js} +1 -1
  29. package/dist/{auth-json-DZ7E50Y1.js → auth-json-wrKixZxh.js} +1 -1
  30. package/dist/{auth-profiles-C1VbcUOm.js → auth-profiles-pt7Tr4HA.js} +1 -1
  31. package/dist/{auth-token-CyVfNEQb.js → auth-token-BE67qxLw.js} +1 -1
  32. package/dist/{auth-token-CoQ5ePPl.js → auth-token-BPHeoBAW.js} +1 -1
  33. package/dist/{banner-DY-L7_eI.js → banner-ErBINvbk.js} +1 -1
  34. package/dist/{browser-cli-D2O94twn.js → browser-cli-BZc64-Xx.js} +1 -1
  35. package/dist/{browser-cli-CoRx_4iM.js → browser-cli-CoxVKdon.js} +1 -1
  36. package/dist/build-info.json +3 -3
  37. package/dist/{builderforce-BmrsVdFw.js → builderforce-B9187Tm9.js} +4 -4
  38. package/dist/{builderforce-Bwyw0GJ6.js → builderforce-BLqHwgeu.js} +4 -4
  39. package/dist/builderforce-api-DKgXl8BH.js +1 -0
  40. package/dist/builderforce-api-DcPAGsla.js +1 -0
  41. package/dist/builderforce-onboarding-CaPJZSvw.js +24 -0
  42. package/dist/builderforce-onboarding-RXFb0gct.js +24 -0
  43. package/dist/{builderforcellm-syscheck-CprBhARf.js → builderforcellm-syscheck-9ksvqHYX.js} +1 -1
  44. package/dist/{builderforcellm-syscheck-DrFJ638L.js → builderforcellm-syscheck-F5JMAr3p.js} +1 -1
  45. package/dist/{call-DxPWzV-k.js → call-BnAs_SER.js} +1 -1
  46. package/dist/{call-DFjBq0H2.js → call-D1Opj5ev.js} +1 -1
  47. package/dist/{call-DmAU4cRX.js → call-Du2LiaX6.js} +1 -1
  48. package/dist/{call-BbRf8gFM.js → call-T8ciwMTA.js} +1 -1
  49. package/dist/{channel-options-d4EwVQD0.js → channel-options-B7sRMp2v.js} +1 -1
  50. package/dist/{channel-options-CDixz6dT.js → channel-options-rhDBCtlp.js} +1 -1
  51. package/dist/{channel-web-DJa8JC9W.js → channel-web-CcCqUQrJ.js} +1 -1
  52. package/dist/{channels-cli-BgKy0MbE.js → channels-cli-BjnLW14T.js} +1 -1
  53. package/dist/{channels-cli-nNW0ezPM.js → channels-cli-DVWUBsmc.js} +1 -1
  54. package/dist/{chrome-BnEbJV3D.js → chrome-CFmcixaE.js} +1 -1
  55. package/dist/{chrome-a3X9_-nf.js → chrome-DXt86tmV.js} +1 -1
  56. package/dist/cli/daemon-cli.js +1 -1
  57. package/dist/{cli-DkWt7p2x.js → cli-BUqtALJK.js} +1 -1
  58. package/dist/{cli-C5MbcECQ.js → cli-K4reS6IS.js} +1 -1
  59. package/dist/{coding-tools.policy-NEPm7Mz1.js → coding-tools.policy-D9Ba8eDh.js} +1 -1
  60. package/dist/{coding-tools.policy-6qh9acJy.js → coding-tools.policy-ZhOdlcEI.js} +1 -1
  61. package/dist/{command-registry-COUcUWby.js → command-registry-B7uAoROP.js} +1 -1
  62. package/dist/{command-registry-4_K-lfW5.js → command-registry-CW16Mk2Y.js} +1 -1
  63. package/dist/{completion-cli-DlvHqL86.js → completion-cli-ZvXrCQqk.js} +1 -1
  64. package/dist/{completion-cli-B2qcVd6q.js → completion-cli-gyvx5ZXu.js} +1 -1
  65. package/dist/{completion-cli-DpFvU4Qn.js → completion-cli-n8UsdT91.js} +1 -1
  66. package/dist/{completion-cli-SdcQ-kQj.js → completion-cli-sKReGv3d.js} +1 -1
  67. package/dist/{config-_1Ca6jGb.js → config-BgV_FYSq.js} +1 -1
  68. package/dist/{config-toczWD3q.js → config-BpChMIJ6.js} +1 -1
  69. package/dist/{config-BTWlKwtB.js → config-D01EgOky.js} +1 -1
  70. package/dist/{config-27_FNba3.js → config-Dsnbi-a3.js} +1 -1
  71. package/dist/{config-cli-DeiQz5sY.js → config-cli-Bpo74mE5.js} +1 -1
  72. package/dist/{config-cli-CfczShaZ.js → config-cli-CF31O_5s.js} +1 -1
  73. package/dist/{config-guard-CD-Wq8kk.js → config-guard-BRUOk5YL.js} +1 -1
  74. package/dist/{config-guard-ClVl2FvD.js → config-guard-BUpQiSTW.js} +1 -1
  75. package/dist/{config-guard-B4in8l8I.js → config-guard-USCN-dq0.js} +1 -1
  76. package/dist/{config-validation-jpeXzoU3.js → config-validation-BGpSeNbh.js} +1 -1
  77. package/dist/{config-validation-C6u-z9bJ.js → config-validation-CdBJ-tZq.js} +1 -1
  78. package/dist/{configure-3W9C5LiT.js → configure-CWr61Ph2.js} +1 -1
  79. package/dist/configure-DhazB2qh.js +1 -0
  80. package/dist/{configure-BtXQW7ue.js → configure-DlcO1tWx.js} +1 -1
  81. package/dist/configure-MXheujvX.js +1 -0
  82. package/dist/{control-service-CJuuqNOE.js → control-service-2PkCt256.js} +1 -1
  83. package/dist/{control-service-qKfWP7VD.js → control-service-CcsbseZS.js} +1 -1
  84. package/dist/{control-service-izGyCWQs.js → control-service-qK1oboMo.js} +1 -1
  85. package/dist/{control-service-BbsswoMy.js → control-service-y3GYvIBg.js} +1 -1
  86. package/dist/{cron-cli-BrOM4s6N.js → cron-cli-BYu_lA8i.js} +1 -1
  87. package/dist/{cron-cli-CwtTX6pg.js → cron-cli-D_Og20iB.js} +1 -1
  88. package/dist/{daemon-cli-DyVsMf8p.js → daemon-cli-BNzthScZ.js} +1 -1
  89. package/dist/{daemon-cli-DlwOVDbt.js → daemon-cli-Bh3p0hui.js} +1 -1
  90. package/dist/{daemon-cli-Br0wu9xQ.js → daemon-cli-DxxKiKVN.js} +1 -1
  91. package/dist/{daemon-cli-DmicpZED.js → daemon-cli-emNxLkIw.js} +1 -1
  92. package/dist/{daemon-runtime-CtOr1ncS.js → daemon-runtime-9XitJmIL.js} +1 -1
  93. package/dist/{daemon-runtime-B4UjqdyJ.js → daemon-runtime-Dx800VUt.js} +1 -1
  94. package/dist/{deliver-BpLm3ktn.js → deliver--6OBF3LL.js} +1 -1
  95. package/dist/{deliver-9o_SE4ZK.js → deliver-ADpnRGRf.js} +1 -1
  96. package/dist/{deliver-D2VAVelb.js → deliver-BM6-damm.js} +1 -1
  97. package/dist/{deliver-BuZu68tp.js → deliver-CsG0cHbZ.js} +1 -1
  98. package/dist/{deps-CkJiJ6wc.js → deps-Dg_9rfXK.js} +1 -1
  99. package/dist/{devices-cli-BfXeDnbx.js → devices-cli-B8DXzcRP.js} +1 -1
  100. package/dist/{devices-cli-B9G6YOsS.js → devices-cli-BZkdWSx-.js} +1 -1
  101. package/dist/{directory-cli-BRCaiGOn.js → directory-cli-B78pAVI_.js} +1 -1
  102. package/dist/{directory-cli-D5ciZ5fY.js → directory-cli-CSaRkkL8.js} +1 -1
  103. package/dist/{dm-policy-shared-CRZpjRv0.js → dm-policy-shared-B9lW-AsK.js} +1 -1
  104. package/dist/{dm-policy-shared-Dhw9_6mi.js → dm-policy-shared-DYZ_T-az.js} +1 -1
  105. package/dist/{dns-cli-CgZ7oMcT.js → dns-cli-CLPGOFA1.js} +1 -1
  106. package/dist/{dns-cli-C4f4Tyij.js → dns-cli-dr5dHzfI.js} +1 -1
  107. package/dist/{doctor-completion-BSotFS6p.js → doctor-completion-94zme499.js} +1 -1
  108. package/dist/{doctor-completion-DVxbs-74.js → doctor-completion-CbF34DIH.js} +1 -1
  109. package/dist/{embedded-helpers-CEsr3aQ0.js → embedded-helpers-C9jpiwlw.js} +1 -1
  110. package/dist/{embedded-helpers-DK8_apW0.js → embedded-helpers-DdU30lmt.js} +1 -1
  111. package/dist/entry.js +1 -1
  112. package/dist/{exec-approvals-cli-YuOu7mVg.js → exec-approvals-cli-CS_uabo7.js} +1 -1
  113. package/dist/{exec-approvals-cli-BPFi82B0.js → exec-approvals-cli-ktB7M7WE.js} +1 -1
  114. package/dist/{gateway-cli-D2Bg1Um6.js → gateway-cli-CKcoLVMA.js} +5 -5
  115. package/dist/{gateway-cli-DFEo8C0z.js → gateway-cli-CuXBDBWe.js} +5 -5
  116. package/dist/{gateway-rpc-BXR_lVIx.js → gateway-rpc-B02y0PnE.js} +1 -1
  117. package/dist/{gateway-rpc-ByUcnQ7W.js → gateway-rpc-ff1RVb0_.js} +1 -1
  118. package/dist/{gemini-auth-CkD5jCPh.js → gemini-auth-DDR12zst.js} +1 -1
  119. package/dist/health-D0DZmCmh.js +1 -0
  120. package/dist/{health-yS3NRKvY.js → health-FO8MG5Ur.js} +1 -1
  121. package/dist/{health-DVo8a9yg.js → health-zrsgFZmR.js} +1 -1
  122. package/dist/{hooks-cli-B0lVee-j.js → hooks-cli-5Y4hnSX9.js} +1 -1
  123. package/dist/{hooks-cli-DsVmrQAG.js → hooks-cli-DpHZzRo2.js} +1 -1
  124. package/dist/index.js +2 -2
  125. package/dist/{ink-session-BitZ1wcY.js → ink-session-Dt9Q4iH-.js} +2 -2
  126. package/dist/{ink-session-CyAqXDla.js → ink-session-N8wCBzwk.js} +2 -2
  127. package/dist/{installs-CWd54ARy.js → installs-B_t2YXgq.js} +1 -1
  128. package/dist/{installs-C9A8QFiF.js → installs-DFiF4lGy.js} +1 -1
  129. package/dist/{io-3R_ZyUxB.js → io-BLBq4T2o.js} +1 -1
  130. package/dist/{io-DSIGyPrT.js → io-CXN4uLS2.js} +1 -1
  131. package/dist/{io-6jLoKffb.js → io-Ckd4NlvH.js} +1 -1
  132. package/dist/{io-CohJffHG.js → io-D9hC2aG0.js} +1 -1
  133. package/dist/{lifecycle-core-BpMvDXy1.js → lifecycle-core-D9Dg5Qps.js} +1 -1
  134. package/dist/{lifecycle-core-Dwb4gHjZ.js → lifecycle-core-uxjxTzFv.js} +1 -1
  135. package/dist/login-B3sDAgHb.js +1 -0
  136. package/dist/{login-C_ZdMOvv.js → login-CwwuaXtb.js} +1 -1
  137. package/dist/{login-DtDUyFO3.js → login-D1bVUPlv.js} +1 -1
  138. package/dist/{login-CEnjUo5c.js → login-GLDax56V.js} +1 -1
  139. package/dist/{login-qr-B9lyIZVD.js → login-qr-CbiUcBLy.js} +1 -1
  140. package/dist/{login-qr-BCBsxwhT.js → login-qr-Cp0YqK4e.js} +1 -1
  141. package/dist/{logs-cli-CdM5W3HE.js → logs-cli-Cy11HfSG.js} +1 -1
  142. package/dist/{logs-cli-jh5Xn3TD.js → logs-cli-nD36c-Y1.js} +1 -1
  143. package/dist/{manager-CRba8roB.js → manager-BeohB4-8.js} +1 -1
  144. package/dist/{manager-B3IJ_IKf.js → manager-CTTXDBt3.js} +1 -1
  145. package/dist/{manager-TGVy_fAb.js → manager-CoQMlcrf.js} +1 -1
  146. package/dist/{manager-DwywI_5-.js → manager-DSz61dXv.js} +1 -1
  147. package/dist/{memory-cli-BlayFTAM.js → memory-cli-BpAiRntI.js} +1 -1
  148. package/dist/{memory-cli-DRz4wtHk.js → memory-cli-CbkWGjRn.js} +1 -1
  149. package/dist/{memory-cli-PdyTQ84w.js → memory-cli-CrBMLM2P.js} +1 -1
  150. package/dist/{memory-cli-ivAs7q7v.js → memory-cli-CveeVOWH.js} +1 -1
  151. package/dist/{model-catalog-CQOdhMUY.js → model-catalog-B29yeBYS.js} +1 -1
  152. package/dist/{model-catalog-CiiFJX77.js → model-catalog-BeBXvbFm.js} +1 -1
  153. package/dist/model-catalog-CMKHKuBL.js +1 -0
  154. package/dist/{model-catalog-C6UrZ0uG.js → model-catalog-DjNiebr7.js} +1 -1
  155. package/dist/{model-discovery-C9Xm95uL.js → model-discovery-D0i1JpiL.js} +1 -1
  156. package/dist/{model-picker-swoSwauV.js → model-picker-CGDNPRPc.js} +1 -1
  157. package/dist/model-picker-CGEF8yhc.js +1 -0
  158. package/dist/model-picker-DeUNOC78.js +1 -0
  159. package/dist/{model-picker-BUePD7Zg.js → model-picker-EIhpfOZa.js} +1 -1
  160. package/dist/{model-selection-9bRFKBI_.js → model-selection-DG9J_VTz.js} +1 -1
  161. package/dist/{models-BNivsd2o.js → models-BjIzVQYX.js} +2 -2
  162. package/dist/{models-DQeSIY6M.js → models-JoqOgEF5.js} +1 -1
  163. package/dist/{models-cli-KokGgWeP.js → models-cli-B2zbchgs.js} +1 -1
  164. package/dist/{models-cli-BcNxU4P_.js → models-cli-CkFdc8NN.js} +2 -2
  165. package/dist/{node-cli-DIMh3X2F.js → node-cli-CXnuxiBq.js} +1 -1
  166. package/dist/{node-cli-EmTU-Gh0.js → node-cli-oVyjVnb7.js} +1 -1
  167. package/dist/{nodes-cli-BX8TznFK.js → nodes-cli-BBVotxNt.js} +1 -1
  168. package/dist/{nodes-cli-DyHovdAc.js → nodes-cli-DVMBSUhK.js} +1 -1
  169. package/dist/{onboard-DfMVh1bM.js → onboard-BItclJp0.js} +1 -1
  170. package/dist/{onboard-BVmZ4jMw.js → onboard-CqvHIvKj.js} +1 -1
  171. package/dist/{onboard-auth.credentials-yagR-VMG.js → onboard-auth.credentials-DneFSdYg.js} +1 -1
  172. package/dist/{onboard-auth.credentials-BuT-etnE.js → onboard-auth.credentials-DpitLlzw.js} +1 -1
  173. package/dist/onboard-channels-B91m5S3w.js +1 -0
  174. package/dist/onboard-channels-BOoPtYbF.js +1 -0
  175. package/dist/{onboard-channels-B6QDFkkK.js → onboard-channels-Dn0u5C-C.js} +1 -1
  176. package/dist/{onboard-channels-C8FCFn29.js → onboard-channels-vhtccaIV.js} +1 -1
  177. package/dist/onboard-custom-BN0uzSq_.js +1 -0
  178. package/dist/{onboard-custom-D1nd8Hlu.js → onboard-custom-BYIza2e7.js} +1 -1
  179. package/dist/onboard-custom-CCFthqto.js +1 -0
  180. package/dist/{onboard-custom-C_BI0ZXn.js → onboard-custom-Ckf0xKXY.js} +1 -1
  181. package/dist/{onboard-helpers-CGlLpagb.js → onboard-helpers-B8I5AVyb.js} +1 -1
  182. package/dist/{onboard-helpers-CckrS8_K.js → onboard-helpers-Ce_c4Raj.js} +1 -1
  183. package/dist/{onboard-helpers-Cf5dNq7-.js → onboard-helpers-CiHzTaFX.js} +1 -1
  184. package/dist/{onboard-helpers-BvIZ4-R5.js → onboard-helpers-DC-nMl-V.js} +1 -1
  185. package/dist/{onboard-interactive-DYJttZ2w.js → onboard-interactive-Cl2K3EYn.js} +1 -1
  186. package/dist/{onboard-interactive-zgjmwJz-.js → onboard-interactive-JNux9zfA.js} +1 -1
  187. package/dist/{onboard-interactive-B3-KBZbZ.js → onboard-interactive-J_ObFzeW.js} +1 -1
  188. package/dist/{onboard-interactive-Dc_7URYb.js → onboard-interactive-OUNsvlh0.js} +1 -1
  189. package/dist/{onboard-remote-D5lR2lVm.js → onboard-remote-0-q7MG9t.js} +1 -1
  190. package/dist/{onboard-remote-BmSyHww1.js → onboard-remote-CgAAEZpq.js} +1 -1
  191. package/dist/{onboard-remote-CzzQMZ3X.js → onboard-remote-DKXHDdBD.js} +1 -1
  192. package/dist/{onboard-remote-DcuX8b2g.js → onboard-remote-cB8j9RG-.js} +1 -1
  193. package/dist/{onboard-skills-ILHIeg1R.js → onboard-skills-47upVdA2.js} +1 -1
  194. package/dist/{onboard-skills-BPlNN_-T.js → onboard-skills-9Um4TL2x.js} +1 -1
  195. package/dist/{onboard-skills-DIhjDMom.js → onboard-skills-DhCmvhJY.js} +1 -1
  196. package/dist/{onboard-skills-CI1OtWsE.js → onboard-skills-mI2kfvdT.js} +1 -1
  197. package/dist/{onboarding-D4-HDbmU.js → onboarding-BSENgR9C.js} +5 -5
  198. package/dist/{onboarding-CP9rrz8y.js → onboarding-CIaZLNc1.js} +5 -5
  199. package/dist/{onboarding.finalize-C2kZi7F0.js → onboarding.finalize-BwOpvoPE.js} +1 -1
  200. package/dist/{onboarding.finalize-BfWXPgX7.js → onboarding.finalize-yMK-g7Uy.js} +1 -1
  201. package/dist/{onboarding.gateway-config-Cd7_bXVs.js → onboarding.gateway-config-Kn1O-QFl.js} +1 -1
  202. package/dist/{onboarding.gateway-config-Bd8HJkso.js → onboarding.gateway-config-huOjFf8D.js} +1 -1
  203. package/dist/{openai-model-default-Cp3nf21W.js → openai-model-default-CH2-2Hvk.js} +1 -1
  204. package/dist/{openai-model-default-BMRrqTmH.js → openai-model-default-pfoEzWYJ.js} +1 -1
  205. package/dist/{outbound-BRInCJD9.js → outbound-BdeHcMAo.js} +1 -1
  206. package/dist/{outbound-CAtBpFoD.js → outbound-BylJYD7n.js} +1 -1
  207. package/dist/{outbound-OI-t5zZ0.js → outbound-CAirtWr1.js} +1 -1
  208. package/dist/{outbound-CnIvOJlU.js → outbound-VNcvF2MG.js} +1 -1
  209. package/dist/{outbound-send-deps-m6DqOma_.js → outbound-send-deps-B3Lg-uqF.js} +1 -1
  210. package/dist/{pairing-cli-CEr0yEsc.js → pairing-cli-5RtPvz2i.js} +1 -1
  211. package/dist/{pairing-cli-Dxfoni-F.js → pairing-cli-C_Mj6Dy4.js} +1 -1
  212. package/dist/{pairing-labels-3j_iRYOO.js → pairing-labels-BJPrScRl.js} +1 -1
  213. package/dist/{pairing-labels-BW5jQZlr.js → pairing-labels-oA-nKTaW.js} +1 -1
  214. package/dist/{pairing-store-QDb6lhIU.js → pairing-store-YRy7EBgI.js} +1 -1
  215. package/dist/{pairing-store-CbvMJhD3.js → pairing-store-ti3FEkmr.js} +1 -1
  216. package/dist/{plugin-auto-enable-BV9K9Vhr.js → plugin-auto-enable-Cupr4wbt.js} +1 -1
  217. package/dist/{plugin-auto-enable-DDry2fA6.js → plugin-auto-enable-D8gKiE3F.js} +1 -1
  218. package/dist/plugin-registry-BEfyc2f_.js +1 -0
  219. package/dist/{plugin-registry-C-_GA65s.js → plugin-registry-BoPaef5I.js} +1 -1
  220. package/dist/{plugin-registry-SAdxNUwm.js → plugin-registry-CxnuHO_n.js} +1 -1
  221. package/dist/plugin-registry-D0tIqo8L.js +1 -0
  222. package/dist/plugin-sdk/{accounts-Cy3WCbWg.js → accounts-BwreSNAR.js} +1 -1
  223. package/dist/plugin-sdk/{active-listener-DVWVNlT9.js → active-listener-DpQ7aGYd.js} +1 -1
  224. package/dist/plugin-sdk/agent-runtime/src/infra/workflow-telemetry.d.ts +12 -1
  225. package/dist/plugin-sdk/{agent-scope-DgKN27hJ.js → agent-scope-BQByW0cD.js} +1 -1
  226. package/dist/plugin-sdk/{api-key-rotation-ftXf7mBZ.js → api-key-rotation-7YdImWrh.js} +1 -1
  227. package/dist/plugin-sdk/{audio-preflight-CfTmmeS-.js → audio-preflight-EbkaATDO.js} +1 -1
  228. package/dist/plugin-sdk/{auth-json-BrNBg87n.js → auth-json-DK6qod1_.js} +1 -1
  229. package/dist/plugin-sdk/{bindings-CH-YLOLC.js → bindings-CDEzl4kl.js} +1 -1
  230. package/dist/plugin-sdk/{channel-web-B6rg0Rbf.js → channel-web-D2KuONp0.js} +1 -1
  231. package/dist/plugin-sdk/{chrome-CuXP-hes.js → chrome-SOXFIkUM.js} +1 -1
  232. package/dist/plugin-sdk/{chunk-C94IAOuf.js → chunk-cW0POl22.js} +1 -1
  233. package/dist/plugin-sdk/{command-format-B3XMq_73.js → command-format-CAX9XFjI.js} +1 -1
  234. package/dist/plugin-sdk/{common-n0l_XN-S.js → common-BxEWhN2X.js} +1 -1
  235. package/dist/plugin-sdk/{config-DsXZsCkJ.js → config-v1EU9Ll8.js} +2 -2
  236. package/dist/plugin-sdk/{fetch-B-GxSYRO.js → fetch-DH0Y8iyO.js} +1 -1
  237. package/dist/plugin-sdk/index.js +1 -1
  238. package/dist/plugin-sdk/{login-_my8QwPP.js → login-d1zBgykF.js} +1 -1
  239. package/dist/plugin-sdk/{login-qr-BaePtXuG.js → login-qr-B6exvQnN.js} +1 -1
  240. package/dist/plugin-sdk/{manager-BsC-4ymy.js → manager-BH_bmGds.js} +1 -1
  241. package/dist/plugin-sdk/{markdown-tables-BUfhHgfs.js → markdown-tables-Epim9b-0.js} +1 -1
  242. package/dist/plugin-sdk/{message-channel-CuZ2xOAM.js → message-channel-sBPQc_-T.js} +1 -1
  243. package/dist/plugin-sdk/{model-catalog-yuiXVcmw.js → model-catalog-cXsza5GU.js} +1 -1
  244. package/dist/plugin-sdk/{model-selection-BtgvnqB5.js → model-selection-K82MAGlL.js} +1 -1
  245. package/dist/plugin-sdk/{outbound-D_attiyO.js → outbound-Chn_H1O7.js} +1 -1
  246. package/dist/plugin-sdk/{plugins-BdkC9v5E.js → plugins-CaUOZBVb.js} +1 -1
  247. package/dist/plugin-sdk/{pw-ai-A7Rathx6.js → pw-ai-BIiJF7ZD.js} +1 -1
  248. package/dist/plugin-sdk/{qmd-manager-Dxn0jCpE.js → qmd-manager-BRe5fGZw.js} +1 -1
  249. package/dist/plugin-sdk/{registry-CZHRcH-q.js → registry-DJq2Cvo9.js} +1 -1
  250. package/dist/plugin-sdk/{render-CuA_WRX5.js → render-BUCRXPIk.js} +1 -1
  251. package/dist/plugin-sdk/{replies-DmLfO-pg.js → replies-Cz5OD3qN.js} +1 -1
  252. package/dist/plugin-sdk/{reply-3-ne-N_7.js → reply-D5Uk7pUv.js} +9 -9
  253. package/dist/plugin-sdk/{reply-prefix-w7kAvH11.js → reply-prefix-CCymsmsP.js} +1 -1
  254. package/dist/plugin-sdk/{resolve-route-0sbvl4ZN.js → resolve-route-DN1J7Wyc.js} +1 -1
  255. package/dist/plugin-sdk/{runner-4UfrAQnx.js → runner-CYkuO7Fh.js} +4 -4
  256. package/dist/plugin-sdk/{session-BB-yfDWx.js → session-D5jHDo78.js} +1 -1
  257. package/dist/plugin-sdk/{sqlite-JjFgDV-H.js → sqlite-BlMLqMl8.js} +1 -1
  258. package/dist/plugin-sdk/{subsystem-D0Ril4rt.js → subsystem-COTa5Ly_.js} +1 -1
  259. package/dist/plugin-sdk/{tool-images-WRTP95FT.js → tool-images-DSpchb4x.js} +1 -1
  260. package/dist/plugin-sdk/{tool-loop-detection-sC_rhJfb.js → tool-loop-detection-BP6u-mbh.js} +1 -1
  261. package/dist/plugin-sdk/web-BbganhKi.js +1 -0
  262. package/dist/plugin-sdk/{whatsapp-actions-ThxQ5niy.js → whatsapp-actions-CZUqxmP1.js} +1 -1
  263. package/dist/{plugins-BIG8NDB9.js → plugins-Cx29kkDj.js} +1 -1
  264. package/dist/{plugins-iAq-Gr8l.js → plugins-DJqou2hi.js} +1 -1
  265. package/dist/{plugins-cli-CpaVUv_r.js → plugins-cli-Bu-A8aGy.js} +1 -1
  266. package/dist/{plugins-cli-CPkSgvdL.js → plugins-cli-CGFsQDVW.js} +1 -1
  267. package/dist/{program-context-BCwL3wlM.js → program-context-ClBa4lUj.js} +1 -1
  268. package/dist/{program-2w7Ue902.js → program-vVCzU0cH.js} +2 -2
  269. package/dist/{prompt-select-styled-hB_nLOn1.js → prompt-select-styled-BJPGccTJ.js} +1 -1
  270. package/dist/{prompt-select-styled-Dd5swW2b.js → prompt-select-styled-BK74z6FF.js} +1 -1
  271. package/dist/{provider-auth-helpers-BpTnp2Yr.js → provider-auth-helpers-B84m5VMc.js} +1 -1
  272. package/dist/{provider-auth-helpers-CJTG_tVx.js → provider-auth-helpers-hNwpK_hl.js} +1 -1
  273. package/dist/{provider-dispatcher-TWwBT2aH.js → provider-dispatcher-BjR5DE3O.js} +1 -1
  274. package/dist/provider-dispatcher-DgOeVjcL.js +1 -0
  275. package/dist/{provider-usage-BdrU4cIE.js → provider-usage-B-wPVN_j.js} +1 -1
  276. package/dist/{provider-usage-Bn4ZrnU7.js → provider-usage-B8lFHp0K.js} +1 -1
  277. package/dist/{push-apns-C4sJnHbO.js → push-apns-BTPPvY81.js} +1 -1
  278. package/dist/{push-apns-CiD3rrVv.js → push-apns-CscYUS0D.js} +1 -1
  279. package/dist/{pw-ai-DSEj1QrV.js → pw-ai-CLS_VZ8p.js} +1 -1
  280. package/dist/{pw-ai-dNZY-qBs.js → pw-ai-D5og_rIf.js} +1 -1
  281. package/dist/{qr-cli-qr-SFLZW.js → qr-cli-CAquM1Zk.js} +1 -1
  282. package/dist/{qr-cli-B45dCV0o.js → qr-cli-GsR8n1cm.js} +1 -1
  283. package/dist/{qr-cli-CMlAIzrD.js → qr-cli-kAKgaL-T.js} +1 -1
  284. package/dist/{qr-cli-CySNSEFj.js → qr-cli-uyxNf-cQ.js} +1 -1
  285. package/dist/{register.agent-BA6LIJSb.js → register.agent-BwTCfyeJ.js} +1 -1
  286. package/dist/{register.agent-D2uCH8jZ.js → register.agent-Dhdo3_7k.js} +1 -1
  287. package/dist/register.configure-B0m0G3ot.js +1 -0
  288. package/dist/register.configure-D3cbjmTz.js +1 -0
  289. package/dist/{register.maintenance-BELfCO_C.js → register.maintenance-C6ocMld2.js} +1 -1
  290. package/dist/{register.maintenance-DukWFS_D.js → register.maintenance-CbE2zSyc.js} +1 -1
  291. package/dist/{register.message-DiZRRAE5.js → register.message-Jn4u533_.js} +1 -1
  292. package/dist/{register.message-8iGDhO8h.js → register.message-Tu1hlM0m.js} +1 -1
  293. package/dist/{register.onboard-B9DMNfHE.js → register.onboard-B34211N6.js} +1 -1
  294. package/dist/{register.onboard-Dt7rzAq-.js → register.onboard-S1d2WAE4.js} +1 -1
  295. package/dist/{register.setup-CSF-2ImP.js → register.setup-CJPyAwCQ.js} +1 -1
  296. package/dist/{register.setup-BRRVPrx7.js → register.setup-Sg8f3nsH.js} +1 -1
  297. package/dist/{register.status-health-sessions-D6wdwPwV.js → register.status-health-sessions-BlgVxoZ4.js} +1 -1
  298. package/dist/{register.status-health-sessions-ZSufYw5j.js → register.status-health-sessions-DwADQJ74.js} +1 -1
  299. package/dist/{register.subclis-4eDV9jKH.js → register.subclis-C9V_M-Lk.js} +1 -1
  300. package/dist/{register.subclis-Cr9DoYcv.js → register.subclis-pWn9XObB.js} +1 -1
  301. package/dist/{replies-DbkT_5BV.js → replies-BOGMDhSN.js} +1 -1
  302. package/dist/{replies-CzV-RFUG.js → replies-BXbV02ik.js} +1 -1
  303. package/dist/{replies-DIBQzxGp.js → replies-CUv671JF.js} +1 -1
  304. package/dist/{replies-Bd2RPZwQ.js → replies-DokbEfJD.js} +1 -1
  305. package/dist/{reply-Cd3vVnD7.js → reply-GY1C8tcv.js} +10 -10
  306. package/dist/{routes-BzfLvF8W.js → routes-DZntyPY6.js} +1 -1
  307. package/dist/{routes-lclJHOYY.js → routes-_iZdG1Fo.js} +1 -1
  308. package/dist/{rpc-BLqXRn5R.js → rpc-CbUnwStf.js} +1 -1
  309. package/dist/{rpc-DcQNGQlj.js → rpc-Cwm4gchc.js} +1 -1
  310. package/dist/{run-main-DLcDEJgv.js → run-main-DQMbgbcF.js} +1 -1
  311. package/dist/{runner-DwWmciCt.js → runner-Cu9NJouV.js} +1 -1
  312. package/dist/{runner-SxCr9kXD.js → runner-eTTUbLAK.js} +1 -1
  313. package/dist/{sandbox-BZibn6PX.js → sandbox-C4AKi2EX.js} +1 -1
  314. package/dist/{sandbox-z9t_PRf9.js → sandbox-DvKMuAXL.js} +1 -1
  315. package/dist/{sandbox-cli-BtGs0dBR.js → sandbox-cli-C0LhzYq_.js} +1 -1
  316. package/dist/{sandbox-cli-B8FpLgyY.js → sandbox-cli-De0iaoHB.js} +1 -1
  317. package/dist/{security-cli-D8Q8I7fn.js → security-cli-BvEfiO8m.js} +1 -1
  318. package/dist/{security-cli-IIMR7Pb4.js → security-cli-BzsQ0XQh.js} +1 -1
  319. package/dist/{send-DnMzjS7L.js → send-2dRKMWtl.js} +1 -1
  320. package/dist/{send-DerUBvXW.js → send-Aw8wK3vK.js} +1 -1
  321. package/dist/{send-BvroeIQ6.js → send-B7H8Ae5j.js} +1 -1
  322. package/dist/{send-4d9NswaD.js → send-BP5osGBo.js} +1 -1
  323. package/dist/{send-BU_-BGmf.js → send-BVal50Bi.js} +1 -1
  324. package/dist/{send-CxG2suVM.js → send-Bbo7TXLx.js} +1 -1
  325. package/dist/{send-CBBziNqM.js → send-BxoVLIy1.js} +1 -1
  326. package/dist/{send-dDpSBSBo.js → send-COKUbcqs.js} +1 -1
  327. package/dist/{send--12DIueA.js → send-CTw3PqN4.js} +1 -1
  328. package/dist/{send-UFtylOiq.js → send-CYGOPcKq.js} +1 -1
  329. package/dist/{send-DyF1Xy9K.js → send-ChGpVO3O.js} +1 -1
  330. package/dist/{send-Q-uTkSFE.js → send-Cqea2UFo.js} +1 -1
  331. package/dist/{send-j15662lv.js → send-CrFWgJKx.js} +1 -1
  332. package/dist/{send-gDb60Hk-.js → send-CwK8QBR3.js} +1 -1
  333. package/dist/{send-CceNWtYE.js → send-DqR7Rxzm.js} +1 -1
  334. package/dist/{send-CJHXQvVl.js → send-DxwfUIN-.js} +1 -1
  335. package/dist/{send-ByCVQQVz.js → send-KgN1P41U.js} +1 -1
  336. package/dist/{send-B1rJLLpr.js → send-bNp87SIq.js} +1 -1
  337. package/dist/{send-B_1BtyfA.js → send-kkm_zrHQ.js} +1 -1
  338. package/dist/{send-BJDzwYJN.js → send-l3ge4wkC.js} +1 -1
  339. package/dist/{server-context-DJZT7Upf.js → server-context-CQ2v4BAx.js} +1 -1
  340. package/dist/{server-context-owOmmyUM.js → server-context-CttALzrW.js} +1 -1
  341. package/dist/{server-node-events-54d8Rmjl.js → server-node-events-CIMO6Vae.js} +1 -1
  342. package/dist/{server-node-events-CSFVqgxX.js → server-node-events-iCF2ngcN.js} +1 -1
  343. package/dist/{session-BzQdcCqN.js → session-BJHsjD3z.js} +1 -1
  344. package/dist/{session-4FpEJvkE.js → session-C_b1ttHJ.js} +1 -1
  345. package/dist/{session-dirs-OxQuIvJW.js → session-dirs-Bvbgw0GC.js} +1 -1
  346. package/dist/{session-dirs-D_ARkyw0.js → session-dirs-DHaoq7zc.js} +1 -1
  347. package/dist/{session-utils-GMvum00v.js → session-utils-Dxou8SbO.js} +1 -1
  348. package/dist/{sessions-Bl1wwotX.js → sessions-BA8Se_bT.js} +1 -1
  349. package/dist/{sessions-CdanN_ZI.js → sessions-BuZVmOWt.js} +1 -1
  350. package/dist/{sessions-B5dwRhUC.js → sessions-DvbW0FNJ.js} +1 -1
  351. package/dist/{sessions-B1t7qeEn.js → sessions-DvqsIg0M.js} +1 -1
  352. package/dist/{shared-xj-xaKFi.js → shared-BBOiNdjf.js} +1 -1
  353. package/dist/{shared-BPN3qd7G.js → shared-C2orjbTD.js} +1 -1
  354. package/dist/{skill-scanner-U3AJgjqc.js → skill-scanner-BEvov9QH.js} +1 -1
  355. package/dist/{skill-scanner-DEmbPsRh.js → skill-scanner-OTLeRZ_p.js} +1 -1
  356. package/dist/{skills-cli-CIdnXa3B.js → skills-cli-C1BOgB3y.js} +1 -1
  357. package/dist/{skills-cli-BXbGr7vl.js → skills-cli-CFT2Aq5R.js} +1 -1
  358. package/dist/{skills-install-Btw_GHbI.js → skills-install-LlKntDHa.js} +1 -1
  359. package/dist/{skills-install-DMHQRpIl.js → skills-install-tx5Mahav.js} +1 -1
  360. package/dist/{status-DXaDS_0w.js → status-Bh8V7kjv.js} +1 -1
  361. package/dist/{status-BxeKmkVr.js → status-BtBHmhQh.js} +1 -1
  362. package/dist/{status-BkcmeZg6.js → status-CpwD4y9B.js} +1 -1
  363. package/dist/status-CqaTmyih.js +1 -0
  364. package/dist/{status-DouJcFzf.js → status-yXz8PUbL.js} +1 -1
  365. package/dist/{status.update-C9iy31xr.js → status.update-CdgsLBPg.js} +1 -1
  366. package/dist/{status.update-KYyRSDZY.js → status.update-hzMro-BT.js} +1 -1
  367. package/dist/{subagent-registry-Dr20nzwk.js → subagent-registry-CaRUNwCj.js} +1 -1
  368. package/dist/{subagent-registry-CyGxu3kP.js → subagent-registry-DDEN4oJi.js} +10 -10
  369. package/dist/{subagent-registry-BiXkIDeh.js → subagent-registry-DYYfeIc3.js} +1 -1
  370. package/dist/{system-cli-b4YgXPHv.js → system-cli-4aii1JYf.js} +1 -1
  371. package/dist/{system-cli-C7YzJeP4.js → system-cli-CfkDD3FV.js} +1 -1
  372. package/dist/{tui-DylWbrDx.js → tui-DnVRxfI8.js} +2 -2
  373. package/dist/{tui-BwWMByVp.js → tui-JfWoLGIV.js} +2 -2
  374. package/dist/{tui-cli-C_TTgabr.js → tui-cli-CGjg2Eb5.js} +1 -1
  375. package/dist/{tui-cli-Bh1V8-w9.js → tui-cli-cd7Efw5u.js} +1 -1
  376. package/dist/{tui-setup-check-DJZCJokQ.js → tui-setup-check-BEHm9wwo.js} +1 -1
  377. package/dist/{tui-setup-check-BABAyl-e.js → tui-setup-check-DK8vdhLI.js} +1 -1
  378. package/dist/{tui-stream-assembler-ign_cPkv.js → tui-stream-assembler-8ud9oyMK.js} +1 -1
  379. package/dist/{tui-stream-assembler-q9GANTDr.js → tui-stream-assembler-Br15rhRH.js} +1 -1
  380. package/dist/{update-BUzcmoDf.js → update-B5yKFeGO.js} +1 -1
  381. package/dist/{update-D6U-V8Au.js → update-DodoQDCk.js} +1 -1
  382. package/dist/{update-cli-DUrUIrYQ.js → update-cli-CfJJcSUS.js} +1 -1
  383. package/dist/{update-cli-CA3LuuJ7.js → update-cli-x8Ocbf-0.js} +1 -1
  384. package/dist/{usage-cli-CfEg1_NZ.js → usage-cli-CN7L1YRG.js} +1 -1
  385. package/dist/{usage-cli-CpbYMXxS.js → usage-cli-CQmokGkG.js} +1 -1
  386. package/dist/{web-D-NSyF6b.js → web-BXLk9UT2.js} +1 -1
  387. package/dist/web-Btgs8oWv.js +1 -0
  388. package/dist/{webhooks-cli-B_f61rq7.js → webhooks-cli-DIo8p3lk.js} +1 -1
  389. package/dist/{webhooks-cli-Bi0t3w6P.js → webhooks-cli-DhxEtiFt.js} +1 -1
  390. package/dist/{whatsapp-actions-JbF2MrTV.js → whatsapp-actions-B7r9AyZN.js} +1 -1
  391. package/dist/{whatsapp-actions-BkCMhD9X.js → whatsapp-actions-DX2QU6Gs.js} +1 -1
  392. package/dist/{with-timeout-T07SJo4N.js → with-timeout-B_p5pWDv.js} +1 -1
  393. package/dist/{with-timeout-Bwq-GyUQ.js → with-timeout-GDLpcjW7.js} +1 -1
  394. package/dist/workflow-telemetry-BMTg5lPd.js +1 -0
  395. package/dist/workflow-telemetry-Bg8MVUr_.js +2 -0
  396. package/dist/workflow-telemetry-Do1UsYwM.js +1 -0
  397. package/dist/workflow-telemetry-DqBPhVL4.js +2 -0
  398. package/package.json +1 -1
  399. package/dist/agents-DsZ5vLKE.js +0 -1
  400. package/dist/auth-choice-Btd2Rxxd.js +0 -1
  401. package/dist/auth-choice-CVV9wRFN.js +0 -1
  402. package/dist/auth-choice.apply-BOK9XRCQ.js +0 -1
  403. package/dist/auth-choice.apply-Cv-BiV5Q.js +0 -1
  404. package/dist/auth-choice.apply.transformers-CXywS3GZ.js +0 -1
  405. package/dist/builderforce-onboarding-Dq6VUSKZ.js +0 -24
  406. package/dist/builderforce-onboarding-DuUfZ6oL.js +0 -24
  407. package/dist/configure-CWBBFk3F.js +0 -1
  408. package/dist/configure-fHVOAucW.js +0 -1
  409. package/dist/health-GLcAfqDz.js +0 -1
  410. package/dist/login-CPyEf5h6.js +0 -1
  411. package/dist/model-catalog-J7R-tJDu.js +0 -1
  412. package/dist/model-picker-D2bcWrtu.js +0 -1
  413. package/dist/model-picker-DO1HtEEm.js +0 -1
  414. package/dist/onboard-channels-CmqKsAoW.js +0 -1
  415. package/dist/onboard-channels-Db0P4iWl.js +0 -1
  416. package/dist/onboard-custom-BABqIYa4.js +0 -1
  417. package/dist/onboard-custom-VpW3UC8u.js +0 -1
  418. package/dist/plugin-registry-B-UOeWqM.js +0 -1
  419. package/dist/plugin-registry-BjMr3yXM.js +0 -1
  420. package/dist/plugin-sdk/web-CThgoHQp.js +0 -1
  421. package/dist/provider-dispatcher-C4nHaNqn.js +0 -1
  422. package/dist/register.configure-DAL38e7r.js +0 -1
  423. package/dist/register.configure-DZG7-WVi.js +0 -1
  424. package/dist/status-BTYqHVha.js +0 -1
  425. package/dist/web-P6QsgmSD.js +0 -1
  426. package/dist/workflow-telemetry-B8Im0mPk.js +0 -1
  427. package/dist/workflow-telemetry-DLEnm5TI.js +0 -2
  428. package/dist/workflow-telemetry-Dc_oseV7.js +0 -2
  429. package/dist/workflow-telemetry-Dkm3mofI.js +0 -1
  430. /package/dist/{devtools-CI7JyCXv.js → devtools-Cg4F-l9O.js} +0 -0
  431. /package/dist/{devtools-eMFaIsAT.js → devtools-Dl2DACSO.js} +0 -0
  432. /package/dist/{github-copilot-token-D3gHtNUu.js → github-copilot-token-BlyiXyTy.js} +0 -0
  433. /package/dist/{github-copilot-token-DHP2kAiN.js → github-copilot-token-D5sB2AUI.js} +0 -0
  434. /package/dist/{onboard-hooks-Cenav0eW.js → onboard-hooks-BaOSgxs9.js} +0 -0
  435. /package/dist/{onboard-hooks-Ce20rwpW.js → onboard-hooks-fO5eeDe_.js} +0 -0
  436. /package/dist/{qmd-manager-DVd_aWEV.js → qmd-manager-BgplOjHN.js} +0 -0
  437. /package/dist/{qmd-manager-keHvLmvP.js → qmd-manager-COUi_Fqb.js} +0 -0
@@ -1 +1 @@
1
- import{d as resolveIsNixMode}from"./paths-5FcIFMsj.js";import{B as theme,G as getResolvedLoggerSettings,H as appendGatewayLifecycleAudit,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{r as loadConfig}from"./io-3R_ZyUxB.js";import{l as pickPrimaryLanIPv4}from"./ws-Bbu03j3h.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName}from"./constants-BBbGeL3t.js";import{t as isWSL}from"./wsl-DkYsHmN5.js";import{d as isVersionManagedNodePath,h as resolveSystemNodePath,l as getMinimalServicePathPartsFromEnv,u as isSystemNodePath}from"./daemon-runtime-CtOr1ncS.js";import{o as resolveSystemdUserUnitPath,r as isSystemdUserServiceAvailable}from"./systemd-BG3_QT6W.js";import{c as resolveLaunchAgentPlistPath,s as resolveGatewayLogPaths}from"./service-D-NLDyK3.js";import{n as readRecentGatewayLogErrors,r as formatRuntimeStatusWithDetails}from"./diagnostics-DCjg0nBH.js";import{t as parsePort}from"./parse-port-nw1R44xn.js";import path from"node:path";import fs from"node:fs/promises";import{Writable}from"node:stream";function emitDaemonActionJson(payload){defaultRuntime.log(JSON.stringify(payload,null,2))}function buildDaemonServiceSnapshot(service,loaded){return{label:service.label,loaded,loadedText:service.loadedText,notLoadedText:service.notLoadedText}}function createNullWriter(){return new Writable({write(_chunk,_encoding,callback){callback()}})}function createDaemonActionContext(params){let warnings=[],stdout=params.json?createNullWriter():process.stdout,emit=payload=>{params.json&&emitDaemonActionJson({action:params.action,...payload,warnings:payload.warnings??(warnings.length?warnings:void 0)})};return{stdout,warnings,emit,fail:(message,hints)=>{if(params.json)emit({ok:!1,error:message,hints});else if(defaultRuntime.error(message),hints?.length)for(let hint of hints)defaultRuntime.log(`Tip: ${hint}`);defaultRuntime.exit(1)}}}async function installDaemonServiceAndEmit(params){try{await params.install()}catch(err){params.fail(`${params.serviceNoun} install failed: ${String(err)}`);return}let installed=!0;try{installed=await params.service.isLoaded({env:process.env})}catch{installed=!0}params.emit({ok:!0,result:`installed`,service:buildDaemonServiceSnapshot(params.service,installed),warnings:params.warnings.length?params.warnings:void 0})}function formatRuntimeStatus(runtime){if(!runtime)return null;let details=[];return runtime.subState&&details.push(`sub ${runtime.subState}`),runtime.lastExitStatus!==void 0&&details.push(`last exit ${runtime.lastExitStatus}`),runtime.lastExitReason&&details.push(`reason ${runtime.lastExitReason}`),runtime.lastRunResult&&details.push(`last run ${runtime.lastRunResult}`),runtime.lastRunTime&&details.push(`last run time ${runtime.lastRunTime}`),runtime.detail&&details.push(runtime.detail),formatRuntimeStatusWithDetails({status:runtime.status,pid:runtime.pid,state:runtime.state,details})}function createCliStatusTextStyles(){let rich=isRich();return{rich,label:value=>colorize(rich,theme.muted,value),accent:value=>colorize(rich,theme.accent,value),infoText:value=>colorize(rich,theme.info,value),okText:value=>colorize(rich,theme.success,value),warnText:value=>colorize(rich,theme.warn,value),errorText:value=>colorize(rich,theme.error,value)}}function resolveRuntimeStatusColor(status){let runtimeStatus=status??`unknown`;return runtimeStatus===`running`?theme.success:runtimeStatus===`stopped`?theme.error:runtimeStatus===`unknown`?theme.muted:theme.warn}function parsePortFromArgs(programArguments){if(!programArguments?.length)return null;for(let i=0;i<programArguments.length;i+=1){let arg=programArguments[i];if(arg===`--port`){let next=programArguments[i+1],parsed=parsePort(next);if(parsed)return parsed}if(arg?.startsWith(`--port=`)){let parsed=parsePort(arg.split(`=`,2)[1]);if(parsed)return parsed}}return null}function pickProbeHostForBind(bindMode,tailnetIPv4,customBindHost){return bindMode===`custom`&&customBindHost?.trim()?customBindHost.trim():bindMode===`tailnet`?tailnetIPv4??`127.0.0.1`:bindMode===`lan`?pickPrimaryLanIPv4()??`127.0.0.1`:`127.0.0.1`}const SAFE_DAEMON_ENV_KEYS=[`BUILDERFORCE_AGENTS_PROFILE`,`BUILDERFORCE_AGENTS_STATE_DIR`,`BUILDERFORCE_AGENTS_CONFIG_PATH`,`BUILDERFORCE_AGENTS_GATEWAY_PORT`,`BUILDERFORCE_AGENTS_NIX_MODE`];function filterDaemonEnv(env){if(!env)return{};let filtered={};for(let key of SAFE_DAEMON_ENV_KEYS){let value=env[key];value?.trim()&&(filtered[key]=value.trim())}return filtered}function safeDaemonEnv(env){let filtered=filterDaemonEnv(env);return Object.entries(filtered).map(([key,value])=>`${key}=${value}`)}function normalizeListenerAddress(raw){let value=raw.trim();return value&&(value=value.replace(/^TCP\s+/i,``),value=value.replace(/\s+\(LISTEN\)\s*$/i,``),value.trim())}function renderRuntimeHints(runtime,env=process.env){if(!runtime)return[];let hints=[],fileLog=(()=>{try{return getResolvedLoggerSettings().file}catch{return null}})();if(runtime.missingUnit)return hints.push(`Service not installed. Run: ${formatCliCommand(`builderforce gateway install`,env)}`),fileLog&&hints.push(`File logs: ${fileLog}`),hints;if(runtime.status===`stopped`){if(fileLog&&hints.push(`File logs: ${fileLog}`),process.platform===`darwin`){let logs=resolveGatewayLogPaths(env);hints.push(`Launchd stdout (if installed): ${logs.stdoutPath}`),hints.push(`Launchd stderr (if installed): ${logs.stderrPath}`)}else if(process.platform===`linux`){let unit=resolveGatewaySystemdServiceName(env.BUILDERFORCE_AGENTS_PROFILE);hints.push(`Logs: journalctl --user -u ${unit}.service -n 200 --no-pager`)}else if(process.platform===`win32`){let task=resolveGatewayWindowsTaskName(env.BUILDERFORCE_AGENTS_PROFILE);hints.push(`Logs: schtasks /Query /TN "${task}" /V /FO LIST`)}}return hints}function renderGatewayServiceStartHints(env=process.env){let base=[formatCliCommand(`builderforce gateway install`,env),formatCliCommand(`builderforce gateway`,env)],profile=env.BUILDERFORCE_AGENTS_PROFILE;switch(process.platform){case`darwin`:{let label=resolveGatewayLaunchAgentLabel(profile);return[...base,`launchctl bootstrap gui/$UID ~/Library/LaunchAgents/${label}.plist`]}case`linux`:{let unit=resolveGatewaySystemdServiceName(profile);return[...base,`systemctl --user start ${unit}.service`]}case`win32`:{let task=resolveGatewayWindowsTaskName(profile);return[...base,`schtasks /Run /TN "${task}"`]}default:return base}}const SERVICE_AUDIT_CODES={gatewayCommandMissing:`gateway-command-missing`,gatewayEntrypointMismatch:`gateway-entrypoint-mismatch`,gatewayPathMissing:`gateway-path-missing`,gatewayPathMissingDirs:`gateway-path-missing-dirs`,gatewayPathNonMinimal:`gateway-path-nonminimal`,gatewayTokenMismatch:`gateway-token-mismatch`,gatewayRuntimeBun:`gateway-runtime-bun`,gatewayRuntimeNodeVersionManager:`gateway-runtime-node-version-manager`,gatewayRuntimeNodeSystemMissing:`gateway-runtime-node-system-missing`,gatewayTokenDrift:`gateway-token-drift`,launchdKeepAlive:`launchd-keep-alive`,launchdRunAtLoad:`launchd-run-at-load`,systemdAfterNetworkOnline:`systemd-after-network-online`,systemdRestartSec:`systemd-restart-sec`,systemdWantsNetworkOnline:`systemd-wants-network-online`};function needsNodeRuntimeMigration(issues){return issues.some(issue=>issue.code===SERVICE_AUDIT_CODES.gatewayRuntimeBun||issue.code===SERVICE_AUDIT_CODES.gatewayRuntimeNodeVersionManager)}function hasGatewaySubcommand(programArguments){return!!programArguments?.some(arg=>arg===`gateway`)}function parseSystemdUnit(content){let after=new Set,wants=new Set,restartSec;for(let rawLine of content.split(/\r?\n/)){let line=rawLine.trim();if(!line||line.startsWith(`#`)||line.startsWith(`;`)||line.startsWith(`[`))continue;let idx=line.indexOf(`=`);if(idx<=0)continue;let key=line.slice(0,idx).trim(),value=line.slice(idx+1).trim();if(value)if(key===`After`)for(let entry of value.split(/\s+/))entry&&after.add(entry);else if(key===`Wants`)for(let entry of value.split(/\s+/))entry&&wants.add(entry);else key===`RestartSec`&&(restartSec=value)}return{after,wants,restartSec}}function isRestartSecPreferred(value){if(!value)return!1;let parsed=Number.parseFloat(value);return Number.isFinite(parsed)?Math.abs(parsed-5)<.01:!1}async function auditSystemdUnit(env,issues){let unitPath=resolveSystemdUserUnitPath(env),content=``;try{content=await fs.readFile(unitPath,`utf8`)}catch{return}let parsed=parseSystemdUnit(content);parsed.after.has(`network-online.target`)||issues.push({code:SERVICE_AUDIT_CODES.systemdAfterNetworkOnline,message:`Missing systemd After=network-online.target`,detail:unitPath,level:`recommended`}),parsed.wants.has(`network-online.target`)||issues.push({code:SERVICE_AUDIT_CODES.systemdWantsNetworkOnline,message:`Missing systemd Wants=network-online.target`,detail:unitPath,level:`recommended`}),isRestartSecPreferred(parsed.restartSec)||issues.push({code:SERVICE_AUDIT_CODES.systemdRestartSec,message:`RestartSec does not match the recommended 5s`,detail:unitPath,level:`recommended`})}async function auditLaunchdPlist(env,issues){let plistPath=resolveLaunchAgentPlistPath(env),content=``;try{content=await fs.readFile(plistPath,`utf8`)}catch{return}let hasRunAtLoad=/<key>RunAtLoad<\/key>\s*<true\s*\/>/i.test(content),hasKeepAlive=/<key>KeepAlive<\/key>\s*<true\s*\/>/i.test(content);hasRunAtLoad||issues.push({code:SERVICE_AUDIT_CODES.launchdRunAtLoad,message:`LaunchAgent is missing RunAtLoad=true`,detail:plistPath,level:`recommended`}),hasKeepAlive||issues.push({code:SERVICE_AUDIT_CODES.launchdKeepAlive,message:`LaunchAgent is missing KeepAlive=true`,detail:plistPath,level:`recommended`})}function auditGatewayCommand(programArguments,issues){!programArguments||programArguments.length===0||hasGatewaySubcommand(programArguments)||issues.push({code:SERVICE_AUDIT_CODES.gatewayCommandMissing,message:`Service command does not include the gateway subcommand`,level:`aggressive`})}function auditGatewayToken(command,issues,expectedGatewayToken){let expectedToken=expectedGatewayToken?.trim();if(!expectedToken)return;let serviceToken=command?.environment?.BUILDERFORCE_AGENTS_GATEWAY_TOKEN?.trim();serviceToken!==expectedToken&&issues.push({code:SERVICE_AUDIT_CODES.gatewayTokenMismatch,message:`Gateway service BUILDERFORCE_AGENTS_GATEWAY_TOKEN does not match gateway.auth.token in builderforce.json`,detail:serviceToken?`service token is stale`:`service token is missing`,level:`recommended`})}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`}function getPathModule(platform){return platform===`win32`?path.win32:path.posix}function normalizePathEntry(entry,platform){let normalized=getPathModule(platform).normalize(entry).replaceAll(`\\`,`/`);return platform===`win32`?normalized.toLowerCase():normalized}function auditGatewayServicePath(command,issues,env,platform){if(platform===`win32`)return;let servicePath=command?.environment?.PATH;if(!servicePath){issues.push({code:SERVICE_AUDIT_CODES.gatewayPathMissing,message:`Gateway service PATH is not set; the daemon should use a minimal PATH.`,level:`recommended`});return}let expected=getMinimalServicePathPartsFromEnv({platform,env}),parts=servicePath.split(getPathModule(platform).delimiter).map(entry=>entry.trim()).filter(Boolean),normalizedParts=new Set(parts.map(entry=>normalizePathEntry(entry,platform))),normalizedExpected=new Set(expected.map(entry=>normalizePathEntry(entry,platform))),missing=expected.filter(entry=>{let normalized=normalizePathEntry(entry,platform);return!normalizedParts.has(normalized)});missing.length>0&&issues.push({code:SERVICE_AUDIT_CODES.gatewayPathMissingDirs,message:`Gateway service PATH missing required dirs: ${missing.join(`, `)}`,level:`recommended`});let nonMinimal=parts.filter(entry=>{let normalized=normalizePathEntry(entry,platform);return normalizedExpected.has(normalized)?!1:normalized.includes(`/.nvm/`)||normalized.includes(`/.fnm/`)||normalized.includes(`/.volta/`)||normalized.includes(`/.asdf/`)||normalized.includes(`/.n/`)||normalized.includes(`/.nodenv/`)||normalized.includes(`/.nodebrew/`)||normalized.includes(`/nvs/`)||normalized.includes(`/.local/share/pnpm/`)||normalized.includes(`/pnpm/`)||normalized.endsWith(`/pnpm`)});nonMinimal.length>0&&issues.push({code:SERVICE_AUDIT_CODES.gatewayPathNonMinimal,message:`Gateway service PATH includes version managers or package managers; recommend a minimal PATH.`,detail:nonMinimal.join(`, `),level:`recommended`})}async function auditGatewayRuntime(env,command,issues,platform){let execPath=command?.programArguments?.[0];if(execPath){if(isBunRuntime(execPath)){issues.push({code:SERVICE_AUDIT_CODES.gatewayRuntimeBun,message:`Gateway service uses Bun; Bun is incompatible with WhatsApp + Telegram channels.`,detail:execPath,level:`recommended`});return}isNodeRuntime(execPath)&&isVersionManagedNodePath(execPath,platform)&&(issues.push({code:SERVICE_AUDIT_CODES.gatewayRuntimeNodeVersionManager,message:`Gateway service uses Node from a version manager; it can break after upgrades.`,detail:execPath,level:`recommended`}),isSystemNodePath(execPath,env,platform)||await resolveSystemNodePath(env,platform)||issues.push({code:SERVICE_AUDIT_CODES.gatewayRuntimeNodeSystemMissing,message:`System Node 22+ not found; install it before migrating away from version managers.`,level:`recommended`}))}}function checkTokenDrift(params){let{serviceToken,configToken}=params;return!serviceToken&&!configToken?null:configToken&&serviceToken!==configToken?{code:SERVICE_AUDIT_CODES.gatewayTokenDrift,message:`Config token differs from service token. The daemon will use the old token after restart.`,detail:"Run `builderforce gateway install --force` to sync the token.",level:`recommended`}:null}async function auditGatewayServiceConfig(params){let issues=[],platform=params.platform??process.platform;return auditGatewayCommand(params.command?.programArguments,issues),auditGatewayToken(params.command,issues,params.expectedGatewayToken),auditGatewayServicePath(params.command,issues,params.env,platform),await auditGatewayRuntime(params.env,params.command,issues,platform),platform===`linux`?await auditSystemdUnit(params.env,issues):platform===`darwin`&&await auditLaunchdPlist(params.env,issues),{ok:issues.length===0,issues}}function isSystemdUnavailableDetail(detail){if(!detail)return!1;let normalized=detail.toLowerCase();return normalized.includes(`systemctl --user unavailable`)||normalized.includes(`systemctl not available`)||normalized.includes(`not been booted with systemd`)||normalized.includes(`failed to connect to bus`)||normalized.includes(`systemd user services are required`)}function renderSystemdUnavailableHints(options={}){return options.wsl?[`WSL2 needs systemd enabled: edit /etc/wsl.conf with [boot]\\nsystemd=true`,`Then run: wsl --shutdown (from PowerShell) and reopen your distro.`,`Verify: systemctl --user status`]:[`systemd user services are unavailable; install/enable systemd or run the gateway under your supervisor.`,`If you're in a container, run the gateway in the foreground instead of \`${formatCliCommand(`builderforce gateway`)}\`.`]}function sleep(ms){return new Promise(resolve=>setTimeout(resolve,ms))}async function detectServiceCrash(service,since,waitUntilHealthy){await sleep(2e3);try{if((await service.readRuntime(process.env)).status===`running`)return null;if(waitUntilHealthy){let deadline=Date.now()+12e4;for(;Date.now()<deadline;){if(await waitUntilHealthy().catch(()=>!1))return null;let errors=await readRecentGatewayLogErrors(since,{maxEntries:5});if(errors.length>0)return{errors};await sleep(1e3)}}return{errors:await readRecentGatewayLogErrors(since)}}catch{return null}}async function maybeAugmentSystemdHints(hints){return process.platform!==`linux`||await isSystemdUserServiceAvailable().catch(()=>!1)?hints:[...hints,...renderSystemdUnavailableHints({wsl:await isWSL()})]}function createActionIO(params){let stdout=params.json?createNullWriter():process.stdout,emit=payload=>{params.json&&emitDaemonActionJson({action:params.action,...payload})};return{stdout,emit,fail:(message,hints)=>{params.json?emit({ok:!1,error:message,hints}):defaultRuntime.error(message),defaultRuntime.exit(1)}}}async function handleServiceNotLoaded(params){let hints=await maybeAugmentSystemdHints(params.renderStartHints());if(params.emit({ok:!0,result:`not-loaded`,message:`${params.serviceNoun} service ${params.service.notLoadedText}.`,hints,service:buildDaemonServiceSnapshot(params.service,params.loaded)}),!params.json){defaultRuntime.log(`${params.serviceNoun} service ${params.service.notLoadedText}.`);for(let hint of hints)defaultRuntime.log(`Start with: ${hint}`)}}async function resolveServiceLoadedOrFail(params){try{return await params.service.isLoaded({env:process.env})}catch(err){return params.fail(`${params.serviceNoun} service check failed: ${String(err)}`),null}}async function runServiceUninstall(params){let{stdout,emit,fail}=createActionIO({action:`uninstall`,json:!!params.opts?.json});if(resolveIsNixMode(process.env)){fail(`Nix mode detected; service uninstall is disabled.`);return}let loaded=!1;try{loaded=await params.service.isLoaded({env:process.env})}catch{loaded=!1}if(loaded&&params.stopBeforeUninstall)try{await params.service.stop({env:process.env,stdout})}catch{}try{await params.service.uninstall({env:process.env,stdout})}catch(err){fail(`${params.serviceNoun} uninstall failed: ${String(err)}`);return}loaded=!1;try{loaded=await params.service.isLoaded({env:process.env})}catch{loaded=!1}if(loaded&&params.assertNotLoadedAfterUninstall){fail(`${params.serviceNoun} service still loaded after uninstall.`);return}emit({ok:!0,result:`uninstalled`,service:buildDaemonServiceSnapshot(params.service,loaded)})}async function runServiceStart(params){let json=!!params.opts?.json,{stdout,emit,fail}=createActionIO({action:`start`,json}),loaded=await resolveServiceLoadedOrFail({serviceNoun:params.serviceNoun,service:params.service,fail});if(loaded===null)return;if(!loaded){await handleServiceNotLoaded({serviceNoun:params.serviceNoun,service:params.service,loaded,renderStartHints:params.renderStartHints,json,emit});return}let restartTime=new Date;appendGatewayLifecycleAudit({action:`start`,source:`builderforce gateway start`});try{await params.service.restart({env:process.env,stdout})}catch(err){let hints=params.renderStartHints();fail(`${params.serviceNoun} start failed: ${String(err)}`,hints);return}let crashed=await detectServiceCrash(params.service,restartTime,params.waitUntilHealthy);if(crashed){if(json)emit({ok:!1,error:`${params.serviceNoun} started but exited immediately`,hints:crashed.errors.length>0?crashed.errors:void 0,service:buildDaemonServiceSnapshot(params.service,!1)});else{defaultRuntime.error(`${params.serviceNoun} started but exited immediately.`);for(let line of crashed.errors)defaultRuntime.error(` ${line}`);crashed.errors.length===0&&defaultRuntime.error(` Check gateway logs for details.`)}defaultRuntime.exit(1);return}let started=!0;try{started=await params.service.isLoaded({env:process.env})}catch{started=!0}emit({ok:!0,result:`started`,service:buildDaemonServiceSnapshot(params.service,started)})}async function runServiceStop(params){let json=!!params.opts?.json,{stdout,emit,fail}=createActionIO({action:`stop`,json}),loaded=await resolveServiceLoadedOrFail({serviceNoun:params.serviceNoun,service:params.service,fail});if(loaded===null)return;if(!loaded){emit({ok:!0,result:`not-loaded`,message:`${params.serviceNoun} service ${params.service.notLoadedText}.`,service:buildDaemonServiceSnapshot(params.service,loaded)}),json||defaultRuntime.log(`${params.serviceNoun} service ${params.service.notLoadedText}.`);return}appendGatewayLifecycleAudit({action:`stop`,source:`builderforce gateway stop`});try{await params.service.stop({env:process.env,stdout})}catch(err){fail(`${params.serviceNoun} stop failed: ${String(err)}`);return}let stopped=!1;try{stopped=await params.service.isLoaded({env:process.env})}catch{stopped=!1}emit({ok:!0,result:`stopped`,service:buildDaemonServiceSnapshot(params.service,stopped)})}async function runServiceRestart(params){let json=!!params.opts?.json,{stdout,emit,fail}=createActionIO({action:`restart`,json}),loaded=await resolveServiceLoadedOrFail({serviceNoun:params.serviceNoun,service:params.service,fail});if(loaded===null)return!1;if(!loaded)return await handleServiceNotLoaded({serviceNoun:params.serviceNoun,service:params.service,loaded,renderStartHints:params.renderStartHints,json,emit}),!1;let warnings=[];if(params.checkTokenDrift)try{let serviceToken=(await params.service.readCommand(process.env))?.environment?.BUILDERFORCE_AGENTS_GATEWAY_TOKEN,driftIssue=checkTokenDrift({serviceToken,configToken:loadConfig().gateway?.auth?.token||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN});if(driftIssue){let warning=driftIssue.detail?`${driftIssue.message} ${driftIssue.detail}`:driftIssue.message;warnings.push(warning),json||(defaultRuntime.log(`\n⚠️ ${driftIssue.message}`),driftIssue.detail&&defaultRuntime.log(` ${driftIssue.detail}\n`))}}catch{}let restartTime=new Date;appendGatewayLifecycleAudit({action:`restart`,source:`builderforce gateway restart`});try{await params.service.restart({env:process.env,stdout})}catch(err){let hints=params.renderStartHints();return fail(`${params.serviceNoun} restart failed: ${String(err)}`,hints),!1}let crashed=await detectServiceCrash(params.service,restartTime,params.waitUntilHealthy);if(crashed){if(json)emit({ok:!1,error:`${params.serviceNoun} restarted but exited immediately`,hints:crashed.errors.length>0?crashed.errors:void 0,service:buildDaemonServiceSnapshot(params.service,!1),warnings:warnings.length?warnings:void 0});else{defaultRuntime.error(`${params.serviceNoun} restarted but exited immediately.`);for(let line of crashed.errors)defaultRuntime.error(` ${line}`);crashed.errors.length===0&&defaultRuntime.error(` Check gateway logs for details.`)}return defaultRuntime.exit(1),!1}let restarted=!0;try{restarted=await params.service.isLoaded({env:process.env})}catch{restarted=!0}return emit({ok:!0,result:`restarted`,service:buildDaemonServiceSnapshot(params.service,restarted),warnings:warnings.length?warnings:void 0}),!0}export{installDaemonServiceAndEmit as S,resolveRuntimeStatusColor as _,isSystemdUnavailableDetail as a,buildDaemonServiceSnapshot as b,auditGatewayServiceConfig as c,filterDaemonEnv as d,normalizeListenerAddress as f,renderRuntimeHints as g,renderGatewayServiceStartHints as h,runServiceUninstall as i,needsNodeRuntimeMigration as l,pickProbeHostForBind as m,runServiceStart as n,renderSystemdUnavailableHints as o,parsePortFromArgs as p,runServiceStop as r,SERVICE_AUDIT_CODES as s,runServiceRestart as t,createCliStatusTextStyles as u,safeDaemonEnv as v,createDaemonActionContext as x,formatRuntimeStatus as y};
1
+ import{d as resolveIsNixMode}from"./paths-5FcIFMsj.js";import{B as theme,G as getResolvedLoggerSettings,H as appendGatewayLifecycleAudit,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{r as loadConfig}from"./io-BLBq4T2o.js";import{l as pickPrimaryLanIPv4}from"./ws-Bbu03j3h.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName}from"./constants-BBbGeL3t.js";import{t as isWSL}from"./wsl-DkYsHmN5.js";import{d as isVersionManagedNodePath,h as resolveSystemNodePath,l as getMinimalServicePathPartsFromEnv,u as isSystemNodePath}from"./daemon-runtime-9XitJmIL.js";import{o as resolveSystemdUserUnitPath,r as isSystemdUserServiceAvailable}from"./systemd-BG3_QT6W.js";import{c as resolveLaunchAgentPlistPath,s as resolveGatewayLogPaths}from"./service-D-NLDyK3.js";import{n as readRecentGatewayLogErrors,r as formatRuntimeStatusWithDetails}from"./diagnostics-DCjg0nBH.js";import{t as parsePort}from"./parse-port-nw1R44xn.js";import path from"node:path";import fs from"node:fs/promises";import{Writable}from"node:stream";function emitDaemonActionJson(payload){defaultRuntime.log(JSON.stringify(payload,null,2))}function buildDaemonServiceSnapshot(service,loaded){return{label:service.label,loaded,loadedText:service.loadedText,notLoadedText:service.notLoadedText}}function createNullWriter(){return new Writable({write(_chunk,_encoding,callback){callback()}})}function createDaemonActionContext(params){let warnings=[],stdout=params.json?createNullWriter():process.stdout,emit=payload=>{params.json&&emitDaemonActionJson({action:params.action,...payload,warnings:payload.warnings??(warnings.length?warnings:void 0)})};return{stdout,warnings,emit,fail:(message,hints)=>{if(params.json)emit({ok:!1,error:message,hints});else if(defaultRuntime.error(message),hints?.length)for(let hint of hints)defaultRuntime.log(`Tip: ${hint}`);defaultRuntime.exit(1)}}}async function installDaemonServiceAndEmit(params){try{await params.install()}catch(err){params.fail(`${params.serviceNoun} install failed: ${String(err)}`);return}let installed=!0;try{installed=await params.service.isLoaded({env:process.env})}catch{installed=!0}params.emit({ok:!0,result:`installed`,service:buildDaemonServiceSnapshot(params.service,installed),warnings:params.warnings.length?params.warnings:void 0})}function formatRuntimeStatus(runtime){if(!runtime)return null;let details=[];return runtime.subState&&details.push(`sub ${runtime.subState}`),runtime.lastExitStatus!==void 0&&details.push(`last exit ${runtime.lastExitStatus}`),runtime.lastExitReason&&details.push(`reason ${runtime.lastExitReason}`),runtime.lastRunResult&&details.push(`last run ${runtime.lastRunResult}`),runtime.lastRunTime&&details.push(`last run time ${runtime.lastRunTime}`),runtime.detail&&details.push(runtime.detail),formatRuntimeStatusWithDetails({status:runtime.status,pid:runtime.pid,state:runtime.state,details})}function createCliStatusTextStyles(){let rich=isRich();return{rich,label:value=>colorize(rich,theme.muted,value),accent:value=>colorize(rich,theme.accent,value),infoText:value=>colorize(rich,theme.info,value),okText:value=>colorize(rich,theme.success,value),warnText:value=>colorize(rich,theme.warn,value),errorText:value=>colorize(rich,theme.error,value)}}function resolveRuntimeStatusColor(status){let runtimeStatus=status??`unknown`;return runtimeStatus===`running`?theme.success:runtimeStatus===`stopped`?theme.error:runtimeStatus===`unknown`?theme.muted:theme.warn}function parsePortFromArgs(programArguments){if(!programArguments?.length)return null;for(let i=0;i<programArguments.length;i+=1){let arg=programArguments[i];if(arg===`--port`){let next=programArguments[i+1],parsed=parsePort(next);if(parsed)return parsed}if(arg?.startsWith(`--port=`)){let parsed=parsePort(arg.split(`=`,2)[1]);if(parsed)return parsed}}return null}function pickProbeHostForBind(bindMode,tailnetIPv4,customBindHost){return bindMode===`custom`&&customBindHost?.trim()?customBindHost.trim():bindMode===`tailnet`?tailnetIPv4??`127.0.0.1`:bindMode===`lan`?pickPrimaryLanIPv4()??`127.0.0.1`:`127.0.0.1`}const SAFE_DAEMON_ENV_KEYS=[`BUILDERFORCE_AGENTS_PROFILE`,`BUILDERFORCE_AGENTS_STATE_DIR`,`BUILDERFORCE_AGENTS_CONFIG_PATH`,`BUILDERFORCE_AGENTS_GATEWAY_PORT`,`BUILDERFORCE_AGENTS_NIX_MODE`];function filterDaemonEnv(env){if(!env)return{};let filtered={};for(let key of SAFE_DAEMON_ENV_KEYS){let value=env[key];value?.trim()&&(filtered[key]=value.trim())}return filtered}function safeDaemonEnv(env){let filtered=filterDaemonEnv(env);return Object.entries(filtered).map(([key,value])=>`${key}=${value}`)}function normalizeListenerAddress(raw){let value=raw.trim();return value&&(value=value.replace(/^TCP\s+/i,``),value=value.replace(/\s+\(LISTEN\)\s*$/i,``),value.trim())}function renderRuntimeHints(runtime,env=process.env){if(!runtime)return[];let hints=[],fileLog=(()=>{try{return getResolvedLoggerSettings().file}catch{return null}})();if(runtime.missingUnit)return hints.push(`Service not installed. Run: ${formatCliCommand(`builderforce gateway install`,env)}`),fileLog&&hints.push(`File logs: ${fileLog}`),hints;if(runtime.status===`stopped`){if(fileLog&&hints.push(`File logs: ${fileLog}`),process.platform===`darwin`){let logs=resolveGatewayLogPaths(env);hints.push(`Launchd stdout (if installed): ${logs.stdoutPath}`),hints.push(`Launchd stderr (if installed): ${logs.stderrPath}`)}else if(process.platform===`linux`){let unit=resolveGatewaySystemdServiceName(env.BUILDERFORCE_AGENTS_PROFILE);hints.push(`Logs: journalctl --user -u ${unit}.service -n 200 --no-pager`)}else if(process.platform===`win32`){let task=resolveGatewayWindowsTaskName(env.BUILDERFORCE_AGENTS_PROFILE);hints.push(`Logs: schtasks /Query /TN "${task}" /V /FO LIST`)}}return hints}function renderGatewayServiceStartHints(env=process.env){let base=[formatCliCommand(`builderforce gateway install`,env),formatCliCommand(`builderforce gateway`,env)],profile=env.BUILDERFORCE_AGENTS_PROFILE;switch(process.platform){case`darwin`:{let label=resolveGatewayLaunchAgentLabel(profile);return[...base,`launchctl bootstrap gui/$UID ~/Library/LaunchAgents/${label}.plist`]}case`linux`:{let unit=resolveGatewaySystemdServiceName(profile);return[...base,`systemctl --user start ${unit}.service`]}case`win32`:{let task=resolveGatewayWindowsTaskName(profile);return[...base,`schtasks /Run /TN "${task}"`]}default:return base}}const SERVICE_AUDIT_CODES={gatewayCommandMissing:`gateway-command-missing`,gatewayEntrypointMismatch:`gateway-entrypoint-mismatch`,gatewayPathMissing:`gateway-path-missing`,gatewayPathMissingDirs:`gateway-path-missing-dirs`,gatewayPathNonMinimal:`gateway-path-nonminimal`,gatewayTokenMismatch:`gateway-token-mismatch`,gatewayRuntimeBun:`gateway-runtime-bun`,gatewayRuntimeNodeVersionManager:`gateway-runtime-node-version-manager`,gatewayRuntimeNodeSystemMissing:`gateway-runtime-node-system-missing`,gatewayTokenDrift:`gateway-token-drift`,launchdKeepAlive:`launchd-keep-alive`,launchdRunAtLoad:`launchd-run-at-load`,systemdAfterNetworkOnline:`systemd-after-network-online`,systemdRestartSec:`systemd-restart-sec`,systemdWantsNetworkOnline:`systemd-wants-network-online`};function needsNodeRuntimeMigration(issues){return issues.some(issue=>issue.code===SERVICE_AUDIT_CODES.gatewayRuntimeBun||issue.code===SERVICE_AUDIT_CODES.gatewayRuntimeNodeVersionManager)}function hasGatewaySubcommand(programArguments){return!!programArguments?.some(arg=>arg===`gateway`)}function parseSystemdUnit(content){let after=new Set,wants=new Set,restartSec;for(let rawLine of content.split(/\r?\n/)){let line=rawLine.trim();if(!line||line.startsWith(`#`)||line.startsWith(`;`)||line.startsWith(`[`))continue;let idx=line.indexOf(`=`);if(idx<=0)continue;let key=line.slice(0,idx).trim(),value=line.slice(idx+1).trim();if(value)if(key===`After`)for(let entry of value.split(/\s+/))entry&&after.add(entry);else if(key===`Wants`)for(let entry of value.split(/\s+/))entry&&wants.add(entry);else key===`RestartSec`&&(restartSec=value)}return{after,wants,restartSec}}function isRestartSecPreferred(value){if(!value)return!1;let parsed=Number.parseFloat(value);return Number.isFinite(parsed)?Math.abs(parsed-5)<.01:!1}async function auditSystemdUnit(env,issues){let unitPath=resolveSystemdUserUnitPath(env),content=``;try{content=await fs.readFile(unitPath,`utf8`)}catch{return}let parsed=parseSystemdUnit(content);parsed.after.has(`network-online.target`)||issues.push({code:SERVICE_AUDIT_CODES.systemdAfterNetworkOnline,message:`Missing systemd After=network-online.target`,detail:unitPath,level:`recommended`}),parsed.wants.has(`network-online.target`)||issues.push({code:SERVICE_AUDIT_CODES.systemdWantsNetworkOnline,message:`Missing systemd Wants=network-online.target`,detail:unitPath,level:`recommended`}),isRestartSecPreferred(parsed.restartSec)||issues.push({code:SERVICE_AUDIT_CODES.systemdRestartSec,message:`RestartSec does not match the recommended 5s`,detail:unitPath,level:`recommended`})}async function auditLaunchdPlist(env,issues){let plistPath=resolveLaunchAgentPlistPath(env),content=``;try{content=await fs.readFile(plistPath,`utf8`)}catch{return}let hasRunAtLoad=/<key>RunAtLoad<\/key>\s*<true\s*\/>/i.test(content),hasKeepAlive=/<key>KeepAlive<\/key>\s*<true\s*\/>/i.test(content);hasRunAtLoad||issues.push({code:SERVICE_AUDIT_CODES.launchdRunAtLoad,message:`LaunchAgent is missing RunAtLoad=true`,detail:plistPath,level:`recommended`}),hasKeepAlive||issues.push({code:SERVICE_AUDIT_CODES.launchdKeepAlive,message:`LaunchAgent is missing KeepAlive=true`,detail:plistPath,level:`recommended`})}function auditGatewayCommand(programArguments,issues){!programArguments||programArguments.length===0||hasGatewaySubcommand(programArguments)||issues.push({code:SERVICE_AUDIT_CODES.gatewayCommandMissing,message:`Service command does not include the gateway subcommand`,level:`aggressive`})}function auditGatewayToken(command,issues,expectedGatewayToken){let expectedToken=expectedGatewayToken?.trim();if(!expectedToken)return;let serviceToken=command?.environment?.BUILDERFORCE_AGENTS_GATEWAY_TOKEN?.trim();serviceToken!==expectedToken&&issues.push({code:SERVICE_AUDIT_CODES.gatewayTokenMismatch,message:`Gateway service BUILDERFORCE_AGENTS_GATEWAY_TOKEN does not match gateway.auth.token in builderforce.json`,detail:serviceToken?`service token is stale`:`service token is missing`,level:`recommended`})}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`}function getPathModule(platform){return platform===`win32`?path.win32:path.posix}function normalizePathEntry(entry,platform){let normalized=getPathModule(platform).normalize(entry).replaceAll(`\\`,`/`);return platform===`win32`?normalized.toLowerCase():normalized}function auditGatewayServicePath(command,issues,env,platform){if(platform===`win32`)return;let servicePath=command?.environment?.PATH;if(!servicePath){issues.push({code:SERVICE_AUDIT_CODES.gatewayPathMissing,message:`Gateway service PATH is not set; the daemon should use a minimal PATH.`,level:`recommended`});return}let expected=getMinimalServicePathPartsFromEnv({platform,env}),parts=servicePath.split(getPathModule(platform).delimiter).map(entry=>entry.trim()).filter(Boolean),normalizedParts=new Set(parts.map(entry=>normalizePathEntry(entry,platform))),normalizedExpected=new Set(expected.map(entry=>normalizePathEntry(entry,platform))),missing=expected.filter(entry=>{let normalized=normalizePathEntry(entry,platform);return!normalizedParts.has(normalized)});missing.length>0&&issues.push({code:SERVICE_AUDIT_CODES.gatewayPathMissingDirs,message:`Gateway service PATH missing required dirs: ${missing.join(`, `)}`,level:`recommended`});let nonMinimal=parts.filter(entry=>{let normalized=normalizePathEntry(entry,platform);return normalizedExpected.has(normalized)?!1:normalized.includes(`/.nvm/`)||normalized.includes(`/.fnm/`)||normalized.includes(`/.volta/`)||normalized.includes(`/.asdf/`)||normalized.includes(`/.n/`)||normalized.includes(`/.nodenv/`)||normalized.includes(`/.nodebrew/`)||normalized.includes(`/nvs/`)||normalized.includes(`/.local/share/pnpm/`)||normalized.includes(`/pnpm/`)||normalized.endsWith(`/pnpm`)});nonMinimal.length>0&&issues.push({code:SERVICE_AUDIT_CODES.gatewayPathNonMinimal,message:`Gateway service PATH includes version managers or package managers; recommend a minimal PATH.`,detail:nonMinimal.join(`, `),level:`recommended`})}async function auditGatewayRuntime(env,command,issues,platform){let execPath=command?.programArguments?.[0];if(execPath){if(isBunRuntime(execPath)){issues.push({code:SERVICE_AUDIT_CODES.gatewayRuntimeBun,message:`Gateway service uses Bun; Bun is incompatible with WhatsApp + Telegram channels.`,detail:execPath,level:`recommended`});return}isNodeRuntime(execPath)&&isVersionManagedNodePath(execPath,platform)&&(issues.push({code:SERVICE_AUDIT_CODES.gatewayRuntimeNodeVersionManager,message:`Gateway service uses Node from a version manager; it can break after upgrades.`,detail:execPath,level:`recommended`}),isSystemNodePath(execPath,env,platform)||await resolveSystemNodePath(env,platform)||issues.push({code:SERVICE_AUDIT_CODES.gatewayRuntimeNodeSystemMissing,message:`System Node 22+ not found; install it before migrating away from version managers.`,level:`recommended`}))}}function checkTokenDrift(params){let{serviceToken,configToken}=params;return!serviceToken&&!configToken?null:configToken&&serviceToken!==configToken?{code:SERVICE_AUDIT_CODES.gatewayTokenDrift,message:`Config token differs from service token. The daemon will use the old token after restart.`,detail:"Run `builderforce gateway install --force` to sync the token.",level:`recommended`}:null}async function auditGatewayServiceConfig(params){let issues=[],platform=params.platform??process.platform;return auditGatewayCommand(params.command?.programArguments,issues),auditGatewayToken(params.command,issues,params.expectedGatewayToken),auditGatewayServicePath(params.command,issues,params.env,platform),await auditGatewayRuntime(params.env,params.command,issues,platform),platform===`linux`?await auditSystemdUnit(params.env,issues):platform===`darwin`&&await auditLaunchdPlist(params.env,issues),{ok:issues.length===0,issues}}function isSystemdUnavailableDetail(detail){if(!detail)return!1;let normalized=detail.toLowerCase();return normalized.includes(`systemctl --user unavailable`)||normalized.includes(`systemctl not available`)||normalized.includes(`not been booted with systemd`)||normalized.includes(`failed to connect to bus`)||normalized.includes(`systemd user services are required`)}function renderSystemdUnavailableHints(options={}){return options.wsl?[`WSL2 needs systemd enabled: edit /etc/wsl.conf with [boot]\\nsystemd=true`,`Then run: wsl --shutdown (from PowerShell) and reopen your distro.`,`Verify: systemctl --user status`]:[`systemd user services are unavailable; install/enable systemd or run the gateway under your supervisor.`,`If you're in a container, run the gateway in the foreground instead of \`${formatCliCommand(`builderforce gateway`)}\`.`]}function sleep(ms){return new Promise(resolve=>setTimeout(resolve,ms))}async function detectServiceCrash(service,since,waitUntilHealthy){await sleep(2e3);try{if((await service.readRuntime(process.env)).status===`running`)return null;if(waitUntilHealthy){let deadline=Date.now()+12e4;for(;Date.now()<deadline;){if(await waitUntilHealthy().catch(()=>!1))return null;let errors=await readRecentGatewayLogErrors(since,{maxEntries:5});if(errors.length>0)return{errors};await sleep(1e3)}}return{errors:await readRecentGatewayLogErrors(since)}}catch{return null}}async function maybeAugmentSystemdHints(hints){return process.platform!==`linux`||await isSystemdUserServiceAvailable().catch(()=>!1)?hints:[...hints,...renderSystemdUnavailableHints({wsl:await isWSL()})]}function createActionIO(params){let stdout=params.json?createNullWriter():process.stdout,emit=payload=>{params.json&&emitDaemonActionJson({action:params.action,...payload})};return{stdout,emit,fail:(message,hints)=>{params.json?emit({ok:!1,error:message,hints}):defaultRuntime.error(message),defaultRuntime.exit(1)}}}async function handleServiceNotLoaded(params){let hints=await maybeAugmentSystemdHints(params.renderStartHints());if(params.emit({ok:!0,result:`not-loaded`,message:`${params.serviceNoun} service ${params.service.notLoadedText}.`,hints,service:buildDaemonServiceSnapshot(params.service,params.loaded)}),!params.json){defaultRuntime.log(`${params.serviceNoun} service ${params.service.notLoadedText}.`);for(let hint of hints)defaultRuntime.log(`Start with: ${hint}`)}}async function resolveServiceLoadedOrFail(params){try{return await params.service.isLoaded({env:process.env})}catch(err){return params.fail(`${params.serviceNoun} service check failed: ${String(err)}`),null}}async function runServiceUninstall(params){let{stdout,emit,fail}=createActionIO({action:`uninstall`,json:!!params.opts?.json});if(resolveIsNixMode(process.env)){fail(`Nix mode detected; service uninstall is disabled.`);return}let loaded=!1;try{loaded=await params.service.isLoaded({env:process.env})}catch{loaded=!1}if(loaded&&params.stopBeforeUninstall)try{await params.service.stop({env:process.env,stdout})}catch{}try{await params.service.uninstall({env:process.env,stdout})}catch(err){fail(`${params.serviceNoun} uninstall failed: ${String(err)}`);return}loaded=!1;try{loaded=await params.service.isLoaded({env:process.env})}catch{loaded=!1}if(loaded&&params.assertNotLoadedAfterUninstall){fail(`${params.serviceNoun} service still loaded after uninstall.`);return}emit({ok:!0,result:`uninstalled`,service:buildDaemonServiceSnapshot(params.service,loaded)})}async function runServiceStart(params){let json=!!params.opts?.json,{stdout,emit,fail}=createActionIO({action:`start`,json}),loaded=await resolveServiceLoadedOrFail({serviceNoun:params.serviceNoun,service:params.service,fail});if(loaded===null)return;if(!loaded){await handleServiceNotLoaded({serviceNoun:params.serviceNoun,service:params.service,loaded,renderStartHints:params.renderStartHints,json,emit});return}let restartTime=new Date;appendGatewayLifecycleAudit({action:`start`,source:`builderforce gateway start`});try{await params.service.restart({env:process.env,stdout})}catch(err){let hints=params.renderStartHints();fail(`${params.serviceNoun} start failed: ${String(err)}`,hints);return}let crashed=await detectServiceCrash(params.service,restartTime,params.waitUntilHealthy);if(crashed){if(json)emit({ok:!1,error:`${params.serviceNoun} started but exited immediately`,hints:crashed.errors.length>0?crashed.errors:void 0,service:buildDaemonServiceSnapshot(params.service,!1)});else{defaultRuntime.error(`${params.serviceNoun} started but exited immediately.`);for(let line of crashed.errors)defaultRuntime.error(` ${line}`);crashed.errors.length===0&&defaultRuntime.error(` Check gateway logs for details.`)}defaultRuntime.exit(1);return}let started=!0;try{started=await params.service.isLoaded({env:process.env})}catch{started=!0}emit({ok:!0,result:`started`,service:buildDaemonServiceSnapshot(params.service,started)})}async function runServiceStop(params){let json=!!params.opts?.json,{stdout,emit,fail}=createActionIO({action:`stop`,json}),loaded=await resolveServiceLoadedOrFail({serviceNoun:params.serviceNoun,service:params.service,fail});if(loaded===null)return;if(!loaded){emit({ok:!0,result:`not-loaded`,message:`${params.serviceNoun} service ${params.service.notLoadedText}.`,service:buildDaemonServiceSnapshot(params.service,loaded)}),json||defaultRuntime.log(`${params.serviceNoun} service ${params.service.notLoadedText}.`);return}appendGatewayLifecycleAudit({action:`stop`,source:`builderforce gateway stop`});try{await params.service.stop({env:process.env,stdout})}catch(err){fail(`${params.serviceNoun} stop failed: ${String(err)}`);return}let stopped=!1;try{stopped=await params.service.isLoaded({env:process.env})}catch{stopped=!1}emit({ok:!0,result:`stopped`,service:buildDaemonServiceSnapshot(params.service,stopped)})}async function runServiceRestart(params){let json=!!params.opts?.json,{stdout,emit,fail}=createActionIO({action:`restart`,json}),loaded=await resolveServiceLoadedOrFail({serviceNoun:params.serviceNoun,service:params.service,fail});if(loaded===null)return!1;if(!loaded)return await handleServiceNotLoaded({serviceNoun:params.serviceNoun,service:params.service,loaded,renderStartHints:params.renderStartHints,json,emit}),!1;let warnings=[];if(params.checkTokenDrift)try{let serviceToken=(await params.service.readCommand(process.env))?.environment?.BUILDERFORCE_AGENTS_GATEWAY_TOKEN,driftIssue=checkTokenDrift({serviceToken,configToken:loadConfig().gateway?.auth?.token||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN});if(driftIssue){let warning=driftIssue.detail?`${driftIssue.message} ${driftIssue.detail}`:driftIssue.message;warnings.push(warning),json||(defaultRuntime.log(`\n⚠️ ${driftIssue.message}`),driftIssue.detail&&defaultRuntime.log(` ${driftIssue.detail}\n`))}}catch{}let restartTime=new Date;appendGatewayLifecycleAudit({action:`restart`,source:`builderforce gateway restart`});try{await params.service.restart({env:process.env,stdout})}catch(err){let hints=params.renderStartHints();return fail(`${params.serviceNoun} restart failed: ${String(err)}`,hints),!1}let crashed=await detectServiceCrash(params.service,restartTime,params.waitUntilHealthy);if(crashed){if(json)emit({ok:!1,error:`${params.serviceNoun} restarted but exited immediately`,hints:crashed.errors.length>0?crashed.errors:void 0,service:buildDaemonServiceSnapshot(params.service,!1),warnings:warnings.length?warnings:void 0});else{defaultRuntime.error(`${params.serviceNoun} restarted but exited immediately.`);for(let line of crashed.errors)defaultRuntime.error(` ${line}`);crashed.errors.length===0&&defaultRuntime.error(` Check gateway logs for details.`)}return defaultRuntime.exit(1),!1}let restarted=!0;try{restarted=await params.service.isLoaded({env:process.env})}catch{restarted=!0}return emit({ok:!0,result:`restarted`,service:buildDaemonServiceSnapshot(params.service,restarted),warnings:warnings.length?warnings:void 0}),!0}export{installDaemonServiceAndEmit as S,resolveRuntimeStatusColor as _,isSystemdUnavailableDetail as a,buildDaemonServiceSnapshot as b,auditGatewayServiceConfig as c,filterDaemonEnv as d,normalizeListenerAddress as f,renderRuntimeHints as g,renderGatewayServiceStartHints as h,runServiceUninstall as i,needsNodeRuntimeMigration as l,pickProbeHostForBind as m,runServiceStart as n,renderSystemdUnavailableHints as o,parsePortFromArgs as p,runServiceStop as r,SERVICE_AUDIT_CODES as s,runServiceRestart as t,createCliStatusTextStyles as u,safeDaemonEnv as v,createDaemonActionContext as x,formatRuntimeStatus as y};
@@ -0,0 +1 @@
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./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"./accounts-BkTLjSrD.js";import"./session-C_b1ttHJ.js";import{t as loginWeb}from"./login-GLDax56V.js";export{loginWeb};
@@ -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"./accounts-o35LU_iy.js";import"./session-BzQdcCqN.js";import{t as loginWeb}from"./login-DtDUyFO3.js";export{loginWeb};
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"./accounts-o35LU_iy.js";import"./session-BJHsjD3z.js";import{t as loginWeb}from"./login-D1bVUPlv.js";export{loginWeb};
@@ -1 +1 @@
1
- import{I as success,O as danger,k as info}from"./utils-DbaBVFaK.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import{r as logInfo}from"./logger-Bch0bx9c.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{r as loadConfig}from"./io-3R_ZyUxB.js";import{n as resolveWhatsAppAccount,o as logoutWeb}from"./accounts-o35LU_iy.js";import{i as waitForWaConnection,n as formatError,t as createWaSocket}from"./session-BzQdcCqN.js";import{DisconnectReason}from"@whiskeysockets/baileys";async function loginWeb(verbose,waitForConnection,runtime=defaultRuntime,accountId){let wait=waitForConnection??waitForWaConnection,account=resolveWhatsAppAccount({cfg:loadConfig(),accountId}),sock=await createWaSocket(!0,verbose,{authDir:account.authDir});logInfo(`Waiting for WhatsApp connection...`,runtime);try{await wait(sock),console.log(success(`✅ Linked! Credentials saved for future sends.`))}catch(err){let code=err?.error?.output?.statusCode??err?.output?.statusCode;if(code===515){console.log(info(`WhatsApp asked for a restart after pairing (code 515); creds are saved. Restarting connection once…`));try{sock.ws?.close()}catch{}let retry=await createWaSocket(!1,verbose,{authDir:account.authDir});try{await wait(retry),console.log(success(`✅ Linked after restart; web session ready.`));return}finally{setTimeout(()=>retry.ws?.close(),500)}}if(code===DisconnectReason.loggedOut)throw await logoutWeb({authDir:account.authDir,isLegacyAuthDir:account.isLegacyAuthDir,runtime}),console.error(danger(`WhatsApp reported the session is logged out. Cleared cached web session; please rerun ${formatCliCommand(`builderforce channels login`)} and scan the QR again.`)),Error(`Session logged out; cache cleared. Re-run login.`,{cause:err});let formatted=formatError(err);throw console.error(danger(`WhatsApp Web connection ended before fully opening. ${formatted}`)),Error(formatted,{cause:err})}finally{setTimeout(()=>{try{sock.ws?.close()}catch{}},500)}}export{loginWeb as t};
1
+ import{I as success,O as danger,k as info}from"./utils-DbaBVFaK.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import{r as logInfo}from"./logger-Bch0bx9c.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{r as loadConfig}from"./io-BLBq4T2o.js";import{n as resolveWhatsAppAccount,o as logoutWeb}from"./accounts-o35LU_iy.js";import{i as waitForWaConnection,n as formatError,t as createWaSocket}from"./session-BJHsjD3z.js";import{DisconnectReason}from"@whiskeysockets/baileys";async function loginWeb(verbose,waitForConnection,runtime=defaultRuntime,accountId){let wait=waitForConnection??waitForWaConnection,account=resolveWhatsAppAccount({cfg:loadConfig(),accountId}),sock=await createWaSocket(!0,verbose,{authDir:account.authDir});logInfo(`Waiting for WhatsApp connection...`,runtime);try{await wait(sock),console.log(success(`✅ Linked! Credentials saved for future sends.`))}catch(err){let code=err?.error?.output?.statusCode??err?.output?.statusCode;if(code===515){console.log(info(`WhatsApp asked for a restart after pairing (code 515); creds are saved. Restarting connection once…`));try{sock.ws?.close()}catch{}let retry=await createWaSocket(!1,verbose,{authDir:account.authDir});try{await wait(retry),console.log(success(`✅ Linked after restart; web session ready.`));return}finally{setTimeout(()=>retry.ws?.close(),500)}}if(code===DisconnectReason.loggedOut)throw await logoutWeb({authDir:account.authDir,isLegacyAuthDir:account.isLegacyAuthDir,runtime}),console.error(danger(`WhatsApp reported the session is logged out. Cleared cached web session; please rerun ${formatCliCommand(`builderforce channels login`)} and scan the QR again.`)),Error(`Session logged out; cache cleared. Re-run login.`,{cause:err});let formatted=formatError(err);throw console.error(danger(`WhatsApp Web connection ended before fully opening. ${formatted}`)),Error(formatted,{cause:err})}finally{setTimeout(()=>{try{sock.ws?.close()}catch{}},500)}}export{loginWeb as t};
@@ -1 +1 @@
1
- import{D as danger,F as success,O as info}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{r as logInfo}from"./logger-wuOr7HKl.js";import{r as loadConfig}from"./io-CohJffHG.js";import{n as resolveWhatsAppAccount,o as logoutWeb}from"./accounts-BkTLjSrD.js";import{i as waitForWaConnection,n as formatError,t as createWaSocket}from"./session-4FpEJvkE.js";import{DisconnectReason}from"@whiskeysockets/baileys";async function loginWeb(verbose,waitForConnection,runtime=defaultRuntime,accountId){let wait=waitForConnection??waitForWaConnection,account=resolveWhatsAppAccount({cfg:loadConfig(),accountId}),sock=await createWaSocket(!0,verbose,{authDir:account.authDir});logInfo(`Waiting for WhatsApp connection...`,runtime);try{await wait(sock),console.log(success(`✅ Linked! Credentials saved for future sends.`))}catch(err){let code=err?.error?.output?.statusCode??err?.output?.statusCode;if(code===515){console.log(info(`WhatsApp asked for a restart after pairing (code 515); creds are saved. Restarting connection once…`));try{sock.ws?.close()}catch{}let retry=await createWaSocket(!1,verbose,{authDir:account.authDir});try{await wait(retry),console.log(success(`✅ Linked after restart; web session ready.`));return}finally{setTimeout(()=>retry.ws?.close(),500)}}if(code===DisconnectReason.loggedOut)throw await logoutWeb({authDir:account.authDir,isLegacyAuthDir:account.isLegacyAuthDir,runtime}),console.error(danger(`WhatsApp reported the session is logged out. Cleared cached web session; please rerun ${formatCliCommand(`builderforce channels login`)} and scan the QR again.`)),Error(`Session logged out; cache cleared. Re-run login.`,{cause:err});let formatted=formatError(err);throw console.error(danger(`WhatsApp Web connection ended before fully opening. ${formatted}`)),Error(formatted,{cause:err})}finally{setTimeout(()=>{try{sock.ws?.close()}catch{}},500)}}export{loginWeb as t};
1
+ import{D as danger,F as success,O as info}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{r as logInfo}from"./logger-wuOr7HKl.js";import{r as loadConfig}from"./io-D9hC2aG0.js";import{n as resolveWhatsAppAccount,o as logoutWeb}from"./accounts-BkTLjSrD.js";import{i as waitForWaConnection,n as formatError,t as createWaSocket}from"./session-C_b1ttHJ.js";import{DisconnectReason}from"@whiskeysockets/baileys";async function loginWeb(verbose,waitForConnection,runtime=defaultRuntime,accountId){let wait=waitForConnection??waitForWaConnection,account=resolveWhatsAppAccount({cfg:loadConfig(),accountId}),sock=await createWaSocket(!0,verbose,{authDir:account.authDir});logInfo(`Waiting for WhatsApp connection...`,runtime);try{await wait(sock),console.log(success(`✅ Linked! Credentials saved for future sends.`))}catch(err){let code=err?.error?.output?.statusCode??err?.output?.statusCode;if(code===515){console.log(info(`WhatsApp asked for a restart after pairing (code 515); creds are saved. Restarting connection once…`));try{sock.ws?.close()}catch{}let retry=await createWaSocket(!1,verbose,{authDir:account.authDir});try{await wait(retry),console.log(success(`✅ Linked after restart; web session ready.`));return}finally{setTimeout(()=>retry.ws?.close(),500)}}if(code===DisconnectReason.loggedOut)throw await logoutWeb({authDir:account.authDir,isLegacyAuthDir:account.isLegacyAuthDir,runtime}),console.error(danger(`WhatsApp reported the session is logged out. Cleared cached web session; please rerun ${formatCliCommand(`builderforce channels login`)} and scan the QR again.`)),Error(`Session logged out; cache cleared. Re-run login.`,{cause:err});let formatted=formatError(err);throw console.error(danger(`WhatsApp Web connection ended before fully opening. ${formatted}`)),Error(formatted,{cause:err})}finally{setTimeout(()=>{try{sock.ws?.close()}catch{}},500)}}export{loginWeb as t};
@@ -1 +1 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{D as danger,F as success,O as info}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-C1VbcUOm.js";import"./src-DvWaTze9.js";import{r as logInfo}from"./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{r as loadConfig}from"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import{m as webAuthExists,n as resolveWhatsAppAccount,o as logoutWeb,u as readWebSelfId}from"./accounts-BkTLjSrD.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-4FpEJvkE.js";import{randomUUID}from"node:crypto";import{DisconnectReason}from"@whiskeysockets/baileys";import QRCodeModule from"qrcode-terminal/vendor/QRCode/index.js";import QRErrorCorrectLevelModule from"qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js";import{deflateSync}from"node:zlib";const CRC_TABLE=(()=>{let table=new Uint32Array(256);for(let i=0;i<256;i+=1){let c=i;for(let k=0;k<8;k+=1)c=c&1?3988292384^c>>>1:c>>>1;table[i]=c>>>0}return table})();function crc32(buf){let crc=4294967295;for(let i=0;i<buf.length;i+=1)crc=CRC_TABLE[(crc^buf[i])&255]^crc>>>8;return(crc^4294967295)>>>0}function pngChunk(type,data){let typeBuf=Buffer.from(type,`ascii`),len=Buffer.alloc(4);len.writeUInt32BE(data.length,0);let crc=crc32(Buffer.concat([typeBuf,data])),crcBuf=Buffer.alloc(4);return crcBuf.writeUInt32BE(crc,0),Buffer.concat([len,typeBuf,data,crcBuf])}function fillPixel(buf,x,y,width,r,g,b,a=255){if(x<0||y<0||x>=width)return;let idx=(y*width+x)*4;idx<0||idx+3>=buf.length||(buf[idx]=r,buf[idx+1]=g,buf[idx+2]=b,buf[idx+3]=a)}function encodePngRgba(buffer,width,height){let stride=width*4,raw=Buffer.alloc((stride+1)*height);for(let row=0;row<height;row+=1){let rawOffset=row*(stride+1);raw[rawOffset]=0,buffer.copy(raw,rawOffset+1,row*stride,row*stride+stride)}let compressed=deflateSync(raw),signature=Buffer.from([137,80,78,71,13,10,26,10]),ihdr=Buffer.alloc(13);return ihdr.writeUInt32BE(width,0),ihdr.writeUInt32BE(height,4),ihdr[8]=8,ihdr[9]=6,ihdr[10]=0,ihdr[11]=0,ihdr[12]=0,Buffer.concat([signature,pngChunk(`IHDR`,ihdr),pngChunk(`IDAT`,compressed),pngChunk(`IEND`,Buffer.alloc(0))])}const QRCode=QRCodeModule,QRErrorCorrectLevel=QRErrorCorrectLevelModule;function createQrMatrix(input){let qr=new QRCode(-1,QRErrorCorrectLevel.L);return qr.addData(input),qr.make(),qr}async function renderQrPngBase64(input,opts={}){let{scale=6,marginModules=4}=opts,qr=createQrMatrix(input),modules=qr.getModuleCount(),size=(modules+marginModules*2)*scale,buf=Buffer.alloc(size*size*4,255);for(let row=0;row<modules;row+=1)for(let col=0;col<modules;col+=1){if(!qr.isDark(row,col))continue;let startX=(col+marginModules)*scale,startY=(row+marginModules)*scale;for(let y=0;y<scale;y+=1){let pixelY=startY+y;for(let x=0;x<scale;x+=1)fillPixel(buf,startX+x,pixelY,size,0,0,0,255)}}return encodePngRgba(buf,size,size).toString(`base64`)}const activeLogins=new Map;function closeSocket(sock){try{sock.ws?.close()}catch{}}async function resetActiveLogin(accountId,reason){let login=activeLogins.get(accountId);login&&(closeSocket(login.sock),activeLogins.delete(accountId)),reason&&logInfo(reason)}function isLoginFresh(login){return Date.now()-login.startedAt<18e4}function attachLoginWaiter(accountId,login){login.waitPromise=waitForWaConnection(login.sock).then(()=>{let current=activeLogins.get(accountId);current?.id===login.id&&(current.connected=!0)}).catch(err=>{let current=activeLogins.get(accountId);current?.id===login.id&&(current.error=formatError(err),current.errorStatus=getStatusCode(err))})}async function restartLoginSocket(login,runtime){if(login.restartAttempted)return!1;login.restartAttempted=!0,runtime.log(info(`WhatsApp asked for a restart after pairing (code 515); retrying connection once…`)),closeSocket(login.sock);try{return login.sock=await createWaSocket(!1,login.verbose,{authDir:login.authDir}),login.connected=!1,login.error=void 0,login.errorStatus=void 0,attachLoginWaiter(login.accountId,login),!0}catch(err){return login.error=formatError(err),login.errorStatus=getStatusCode(err),!1}}async function startWebLoginWithQr(opts={}){let runtime=opts.runtime??defaultRuntime,account=resolveWhatsAppAccount({cfg:loadConfig(),accountId:opts.accountId}),hasWeb=await webAuthExists(account.authDir),selfId=readWebSelfId(account.authDir);if(hasWeb&&!opts.force)return{message:`WhatsApp is already linked (${selfId.e164??selfId.jid??`unknown`}). Say “relink” if you want a fresh QR.`};let existing=activeLogins.get(account.accountId);if(existing&&isLoginFresh(existing)&&existing.qrDataUrl)return{qrDataUrl:existing.qrDataUrl,message:`QR already active. Scan it in WhatsApp → Linked Devices.`};await resetActiveLogin(account.accountId);let resolveQr=null,rejectQr=null,qrPromise=new Promise((resolve,reject)=>{resolveQr=resolve,rejectQr=reject}),qrTimer=setTimeout(()=>{rejectQr?.(Error(`Timed out waiting for WhatsApp QR`))},Math.max(opts.timeoutMs??3e4,5e3)),sock,pendingQr=null;try{sock=await createWaSocket(!1,!!opts.verbose,{authDir:account.authDir,onQr:qr=>{if(pendingQr)return;pendingQr=qr;let current=activeLogins.get(account.accountId);current&&!current.qr&&(current.qr=qr),clearTimeout(qrTimer),runtime.log(info(`WhatsApp QR received.`)),resolveQr?.(qr)}})}catch(err){return clearTimeout(qrTimer),await resetActiveLogin(account.accountId),{message:`Failed to start WhatsApp login: ${String(err)}`}}let login={accountId:account.accountId,authDir:account.authDir,isLegacyAuthDir:account.isLegacyAuthDir,id:randomUUID(),sock,startedAt:Date.now(),connected:!1,waitPromise:Promise.resolve(),restartAttempted:!1,verbose:!!opts.verbose};activeLogins.set(account.accountId,login),pendingQr&&!login.qr&&(login.qr=pendingQr),attachLoginWaiter(account.accountId,login);let qr;try{qr=await qrPromise}catch(err){return clearTimeout(qrTimer),await resetActiveLogin(account.accountId),{message:`Failed to get QR: ${String(err)}`}}return login.qrDataUrl=`data:image/png;base64,${await renderQrPngBase64(qr)}`,{qrDataUrl:login.qrDataUrl,message:`Scan this QR in WhatsApp → Linked Devices.`}}async function waitForWebLogin(opts={}){let runtime=opts.runtime??defaultRuntime,account=resolveWhatsAppAccount({cfg:loadConfig(),accountId:opts.accountId}),activeLogin=activeLogins.get(account.accountId);if(!activeLogin)return{connected:!1,message:`No active WhatsApp login in progress.`};let login=activeLogin;if(!isLoginFresh(login))return await resetActiveLogin(account.accountId),{connected:!1,message:`The login QR expired. Ask me to generate a new one.`};let timeoutMs=Math.max(opts.timeoutMs??12e4,1e3),deadline=Date.now()+timeoutMs;for(;;){let remaining=deadline-Date.now();if(remaining<=0)return{connected:!1,message:`Still waiting for the QR scan. Let me know when you’ve scanned it.`};let timeout=new Promise(resolve=>setTimeout(()=>resolve(`timeout`),remaining));if(await Promise.race([login.waitPromise.then(()=>`done`),timeout])===`timeout`)return{connected:!1,message:`Still waiting for the QR scan. Let me know when you’ve scanned it.`};if(login.error){if(login.errorStatus===DisconnectReason.loggedOut){await logoutWeb({authDir:login.authDir,isLegacyAuthDir:login.isLegacyAuthDir,runtime});let message=`WhatsApp reported the session is logged out. Cleared cached web session; please scan a new QR.`;return await resetActiveLogin(account.accountId,message),runtime.log(danger(message)),{connected:!1,message}}if(login.errorStatus===515&&await restartLoginSocket(login,runtime)&&isLoginFresh(login))continue;let message=`WhatsApp login failed: ${login.error}`;return await resetActiveLogin(account.accountId,message),runtime.log(danger(message)),{connected:!1,message}}if(login.connected){let message=`✅ Linked! WhatsApp is ready.`;return runtime.log(success(message)),await resetActiveLogin(account.accountId),{connected:!0,message}}return{connected:!1,message:`Login ended without a connection.`}}}export{startWebLoginWithQr,waitForWebLogin};
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{D as danger,F as success,O as info}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-pt7Tr4HA.js";import"./src-DvWaTze9.js";import{r as logInfo}from"./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{r as loadConfig}from"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import{m as webAuthExists,n as resolveWhatsAppAccount,o as logoutWeb,u as readWebSelfId}from"./accounts-BkTLjSrD.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-C_b1ttHJ.js";import{randomUUID}from"node:crypto";import{DisconnectReason}from"@whiskeysockets/baileys";import QRCodeModule from"qrcode-terminal/vendor/QRCode/index.js";import QRErrorCorrectLevelModule from"qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js";import{deflateSync}from"node:zlib";const CRC_TABLE=(()=>{let table=new Uint32Array(256);for(let i=0;i<256;i+=1){let c=i;for(let k=0;k<8;k+=1)c=c&1?3988292384^c>>>1:c>>>1;table[i]=c>>>0}return table})();function crc32(buf){let crc=4294967295;for(let i=0;i<buf.length;i+=1)crc=CRC_TABLE[(crc^buf[i])&255]^crc>>>8;return(crc^4294967295)>>>0}function pngChunk(type,data){let typeBuf=Buffer.from(type,`ascii`),len=Buffer.alloc(4);len.writeUInt32BE(data.length,0);let crc=crc32(Buffer.concat([typeBuf,data])),crcBuf=Buffer.alloc(4);return crcBuf.writeUInt32BE(crc,0),Buffer.concat([len,typeBuf,data,crcBuf])}function fillPixel(buf,x,y,width,r,g,b,a=255){if(x<0||y<0||x>=width)return;let idx=(y*width+x)*4;idx<0||idx+3>=buf.length||(buf[idx]=r,buf[idx+1]=g,buf[idx+2]=b,buf[idx+3]=a)}function encodePngRgba(buffer,width,height){let stride=width*4,raw=Buffer.alloc((stride+1)*height);for(let row=0;row<height;row+=1){let rawOffset=row*(stride+1);raw[rawOffset]=0,buffer.copy(raw,rawOffset+1,row*stride,row*stride+stride)}let compressed=deflateSync(raw),signature=Buffer.from([137,80,78,71,13,10,26,10]),ihdr=Buffer.alloc(13);return ihdr.writeUInt32BE(width,0),ihdr.writeUInt32BE(height,4),ihdr[8]=8,ihdr[9]=6,ihdr[10]=0,ihdr[11]=0,ihdr[12]=0,Buffer.concat([signature,pngChunk(`IHDR`,ihdr),pngChunk(`IDAT`,compressed),pngChunk(`IEND`,Buffer.alloc(0))])}const QRCode=QRCodeModule,QRErrorCorrectLevel=QRErrorCorrectLevelModule;function createQrMatrix(input){let qr=new QRCode(-1,QRErrorCorrectLevel.L);return qr.addData(input),qr.make(),qr}async function renderQrPngBase64(input,opts={}){let{scale=6,marginModules=4}=opts,qr=createQrMatrix(input),modules=qr.getModuleCount(),size=(modules+marginModules*2)*scale,buf=Buffer.alloc(size*size*4,255);for(let row=0;row<modules;row+=1)for(let col=0;col<modules;col+=1){if(!qr.isDark(row,col))continue;let startX=(col+marginModules)*scale,startY=(row+marginModules)*scale;for(let y=0;y<scale;y+=1){let pixelY=startY+y;for(let x=0;x<scale;x+=1)fillPixel(buf,startX+x,pixelY,size,0,0,0,255)}}return encodePngRgba(buf,size,size).toString(`base64`)}const activeLogins=new Map;function closeSocket(sock){try{sock.ws?.close()}catch{}}async function resetActiveLogin(accountId,reason){let login=activeLogins.get(accountId);login&&(closeSocket(login.sock),activeLogins.delete(accountId)),reason&&logInfo(reason)}function isLoginFresh(login){return Date.now()-login.startedAt<18e4}function attachLoginWaiter(accountId,login){login.waitPromise=waitForWaConnection(login.sock).then(()=>{let current=activeLogins.get(accountId);current?.id===login.id&&(current.connected=!0)}).catch(err=>{let current=activeLogins.get(accountId);current?.id===login.id&&(current.error=formatError(err),current.errorStatus=getStatusCode(err))})}async function restartLoginSocket(login,runtime){if(login.restartAttempted)return!1;login.restartAttempted=!0,runtime.log(info(`WhatsApp asked for a restart after pairing (code 515); retrying connection once…`)),closeSocket(login.sock);try{return login.sock=await createWaSocket(!1,login.verbose,{authDir:login.authDir}),login.connected=!1,login.error=void 0,login.errorStatus=void 0,attachLoginWaiter(login.accountId,login),!0}catch(err){return login.error=formatError(err),login.errorStatus=getStatusCode(err),!1}}async function startWebLoginWithQr(opts={}){let runtime=opts.runtime??defaultRuntime,account=resolveWhatsAppAccount({cfg:loadConfig(),accountId:opts.accountId}),hasWeb=await webAuthExists(account.authDir),selfId=readWebSelfId(account.authDir);if(hasWeb&&!opts.force)return{message:`WhatsApp is already linked (${selfId.e164??selfId.jid??`unknown`}). Say “relink” if you want a fresh QR.`};let existing=activeLogins.get(account.accountId);if(existing&&isLoginFresh(existing)&&existing.qrDataUrl)return{qrDataUrl:existing.qrDataUrl,message:`QR already active. Scan it in WhatsApp → Linked Devices.`};await resetActiveLogin(account.accountId);let resolveQr=null,rejectQr=null,qrPromise=new Promise((resolve,reject)=>{resolveQr=resolve,rejectQr=reject}),qrTimer=setTimeout(()=>{rejectQr?.(Error(`Timed out waiting for WhatsApp QR`))},Math.max(opts.timeoutMs??3e4,5e3)),sock,pendingQr=null;try{sock=await createWaSocket(!1,!!opts.verbose,{authDir:account.authDir,onQr:qr=>{if(pendingQr)return;pendingQr=qr;let current=activeLogins.get(account.accountId);current&&!current.qr&&(current.qr=qr),clearTimeout(qrTimer),runtime.log(info(`WhatsApp QR received.`)),resolveQr?.(qr)}})}catch(err){return clearTimeout(qrTimer),await resetActiveLogin(account.accountId),{message:`Failed to start WhatsApp login: ${String(err)}`}}let login={accountId:account.accountId,authDir:account.authDir,isLegacyAuthDir:account.isLegacyAuthDir,id:randomUUID(),sock,startedAt:Date.now(),connected:!1,waitPromise:Promise.resolve(),restartAttempted:!1,verbose:!!opts.verbose};activeLogins.set(account.accountId,login),pendingQr&&!login.qr&&(login.qr=pendingQr),attachLoginWaiter(account.accountId,login);let qr;try{qr=await qrPromise}catch(err){return clearTimeout(qrTimer),await resetActiveLogin(account.accountId),{message:`Failed to get QR: ${String(err)}`}}return login.qrDataUrl=`data:image/png;base64,${await renderQrPngBase64(qr)}`,{qrDataUrl:login.qrDataUrl,message:`Scan this QR in WhatsApp → Linked Devices.`}}async function waitForWebLogin(opts={}){let runtime=opts.runtime??defaultRuntime,account=resolveWhatsAppAccount({cfg:loadConfig(),accountId:opts.accountId}),activeLogin=activeLogins.get(account.accountId);if(!activeLogin)return{connected:!1,message:`No active WhatsApp login in progress.`};let login=activeLogin;if(!isLoginFresh(login))return await resetActiveLogin(account.accountId),{connected:!1,message:`The login QR expired. Ask me to generate a new one.`};let timeoutMs=Math.max(opts.timeoutMs??12e4,1e3),deadline=Date.now()+timeoutMs;for(;;){let remaining=deadline-Date.now();if(remaining<=0)return{connected:!1,message:`Still waiting for the QR scan. Let me know when you’ve scanned it.`};let timeout=new Promise(resolve=>setTimeout(()=>resolve(`timeout`),remaining));if(await Promise.race([login.waitPromise.then(()=>`done`),timeout])===`timeout`)return{connected:!1,message:`Still waiting for the QR scan. Let me know when you’ve scanned it.`};if(login.error){if(login.errorStatus===DisconnectReason.loggedOut){await logoutWeb({authDir:login.authDir,isLegacyAuthDir:login.isLegacyAuthDir,runtime});let message=`WhatsApp reported the session is logged out. Cleared cached web session; please scan a new QR.`;return await resetActiveLogin(account.accountId,message),runtime.log(danger(message)),{connected:!1,message}}if(login.errorStatus===515&&await restartLoginSocket(login,runtime)&&isLoginFresh(login))continue;let message=`WhatsApp login failed: ${login.error}`;return await resetActiveLogin(account.accountId,message),runtime.log(danger(message)),{connected:!1,message}}if(login.connected){let message=`✅ Linked! WhatsApp is ready.`;return runtime.log(success(message)),await resetActiveLogin(account.accountId),{connected:!0,message}}return{connected:!1,message:`Login ended without a connection.`}}}export{startWebLoginWithQr,waitForWebLogin};
@@ -1 +1 @@
1
- import"./paths-5FcIFMsj.js";import{I as success,O as danger,k as info}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{r as logInfo}from"./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{r as loadConfig}from"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import{m as webAuthExists,n as resolveWhatsAppAccount,o as logoutWeb,u as readWebSelfId}from"./accounts-o35LU_iy.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-BzQdcCqN.js";import{randomUUID}from"node:crypto";import{DisconnectReason}from"@whiskeysockets/baileys";import QRCodeModule from"qrcode-terminal/vendor/QRCode/index.js";import QRErrorCorrectLevelModule from"qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js";import{deflateSync}from"node:zlib";const CRC_TABLE=(()=>{let table=new Uint32Array(256);for(let i=0;i<256;i+=1){let c=i;for(let k=0;k<8;k+=1)c=c&1?3988292384^c>>>1:c>>>1;table[i]=c>>>0}return table})();function crc32(buf){let crc=4294967295;for(let i=0;i<buf.length;i+=1)crc=CRC_TABLE[(crc^buf[i])&255]^crc>>>8;return(crc^4294967295)>>>0}function pngChunk(type,data){let typeBuf=Buffer.from(type,`ascii`),len=Buffer.alloc(4);len.writeUInt32BE(data.length,0);let crc=crc32(Buffer.concat([typeBuf,data])),crcBuf=Buffer.alloc(4);return crcBuf.writeUInt32BE(crc,0),Buffer.concat([len,typeBuf,data,crcBuf])}function fillPixel(buf,x,y,width,r,g,b,a=255){if(x<0||y<0||x>=width)return;let idx=(y*width+x)*4;idx<0||idx+3>=buf.length||(buf[idx]=r,buf[idx+1]=g,buf[idx+2]=b,buf[idx+3]=a)}function encodePngRgba(buffer,width,height){let stride=width*4,raw=Buffer.alloc((stride+1)*height);for(let row=0;row<height;row+=1){let rawOffset=row*(stride+1);raw[rawOffset]=0,buffer.copy(raw,rawOffset+1,row*stride,row*stride+stride)}let compressed=deflateSync(raw),signature=Buffer.from([137,80,78,71,13,10,26,10]),ihdr=Buffer.alloc(13);return ihdr.writeUInt32BE(width,0),ihdr.writeUInt32BE(height,4),ihdr[8]=8,ihdr[9]=6,ihdr[10]=0,ihdr[11]=0,ihdr[12]=0,Buffer.concat([signature,pngChunk(`IHDR`,ihdr),pngChunk(`IDAT`,compressed),pngChunk(`IEND`,Buffer.alloc(0))])}const QRCode=QRCodeModule,QRErrorCorrectLevel=QRErrorCorrectLevelModule;function createQrMatrix(input){let qr=new QRCode(-1,QRErrorCorrectLevel.L);return qr.addData(input),qr.make(),qr}async function renderQrPngBase64(input,opts={}){let{scale=6,marginModules=4}=opts,qr=createQrMatrix(input),modules=qr.getModuleCount(),size=(modules+marginModules*2)*scale,buf=Buffer.alloc(size*size*4,255);for(let row=0;row<modules;row+=1)for(let col=0;col<modules;col+=1){if(!qr.isDark(row,col))continue;let startX=(col+marginModules)*scale,startY=(row+marginModules)*scale;for(let y=0;y<scale;y+=1){let pixelY=startY+y;for(let x=0;x<scale;x+=1)fillPixel(buf,startX+x,pixelY,size,0,0,0,255)}}return encodePngRgba(buf,size,size).toString(`base64`)}const activeLogins=new Map;function closeSocket(sock){try{sock.ws?.close()}catch{}}async function resetActiveLogin(accountId,reason){let login=activeLogins.get(accountId);login&&(closeSocket(login.sock),activeLogins.delete(accountId)),reason&&logInfo(reason)}function isLoginFresh(login){return Date.now()-login.startedAt<18e4}function attachLoginWaiter(accountId,login){login.waitPromise=waitForWaConnection(login.sock).then(()=>{let current=activeLogins.get(accountId);current?.id===login.id&&(current.connected=!0)}).catch(err=>{let current=activeLogins.get(accountId);current?.id===login.id&&(current.error=formatError(err),current.errorStatus=getStatusCode(err))})}async function restartLoginSocket(login,runtime){if(login.restartAttempted)return!1;login.restartAttempted=!0,runtime.log(info(`WhatsApp asked for a restart after pairing (code 515); retrying connection once…`)),closeSocket(login.sock);try{return login.sock=await createWaSocket(!1,login.verbose,{authDir:login.authDir}),login.connected=!1,login.error=void 0,login.errorStatus=void 0,attachLoginWaiter(login.accountId,login),!0}catch(err){return login.error=formatError(err),login.errorStatus=getStatusCode(err),!1}}async function startWebLoginWithQr(opts={}){let runtime=opts.runtime??defaultRuntime,account=resolveWhatsAppAccount({cfg:loadConfig(),accountId:opts.accountId}),hasWeb=await webAuthExists(account.authDir),selfId=readWebSelfId(account.authDir);if(hasWeb&&!opts.force)return{message:`WhatsApp is already linked (${selfId.e164??selfId.jid??`unknown`}). Say “relink” if you want a fresh QR.`};let existing=activeLogins.get(account.accountId);if(existing&&isLoginFresh(existing)&&existing.qrDataUrl)return{qrDataUrl:existing.qrDataUrl,message:`QR already active. Scan it in WhatsApp → Linked Devices.`};await resetActiveLogin(account.accountId);let resolveQr=null,rejectQr=null,qrPromise=new Promise((resolve,reject)=>{resolveQr=resolve,rejectQr=reject}),qrTimer=setTimeout(()=>{rejectQr?.(Error(`Timed out waiting for WhatsApp QR`))},Math.max(opts.timeoutMs??3e4,5e3)),sock,pendingQr=null;try{sock=await createWaSocket(!1,!!opts.verbose,{authDir:account.authDir,onQr:qr=>{if(pendingQr)return;pendingQr=qr;let current=activeLogins.get(account.accountId);current&&!current.qr&&(current.qr=qr),clearTimeout(qrTimer),runtime.log(info(`WhatsApp QR received.`)),resolveQr?.(qr)}})}catch(err){return clearTimeout(qrTimer),await resetActiveLogin(account.accountId),{message:`Failed to start WhatsApp login: ${String(err)}`}}let login={accountId:account.accountId,authDir:account.authDir,isLegacyAuthDir:account.isLegacyAuthDir,id:randomUUID(),sock,startedAt:Date.now(),connected:!1,waitPromise:Promise.resolve(),restartAttempted:!1,verbose:!!opts.verbose};activeLogins.set(account.accountId,login),pendingQr&&!login.qr&&(login.qr=pendingQr),attachLoginWaiter(account.accountId,login);let qr;try{qr=await qrPromise}catch(err){return clearTimeout(qrTimer),await resetActiveLogin(account.accountId),{message:`Failed to get QR: ${String(err)}`}}return login.qrDataUrl=`data:image/png;base64,${await renderQrPngBase64(qr)}`,{qrDataUrl:login.qrDataUrl,message:`Scan this QR in WhatsApp → Linked Devices.`}}async function waitForWebLogin(opts={}){let runtime=opts.runtime??defaultRuntime,account=resolveWhatsAppAccount({cfg:loadConfig(),accountId:opts.accountId}),activeLogin=activeLogins.get(account.accountId);if(!activeLogin)return{connected:!1,message:`No active WhatsApp login in progress.`};let login=activeLogin;if(!isLoginFresh(login))return await resetActiveLogin(account.accountId),{connected:!1,message:`The login QR expired. Ask me to generate a new one.`};let timeoutMs=Math.max(opts.timeoutMs??12e4,1e3),deadline=Date.now()+timeoutMs;for(;;){let remaining=deadline-Date.now();if(remaining<=0)return{connected:!1,message:`Still waiting for the QR scan. Let me know when you’ve scanned it.`};let timeout=new Promise(resolve=>setTimeout(()=>resolve(`timeout`),remaining));if(await Promise.race([login.waitPromise.then(()=>`done`),timeout])===`timeout`)return{connected:!1,message:`Still waiting for the QR scan. Let me know when you’ve scanned it.`};if(login.error){if(login.errorStatus===DisconnectReason.loggedOut){await logoutWeb({authDir:login.authDir,isLegacyAuthDir:login.isLegacyAuthDir,runtime});let message=`WhatsApp reported the session is logged out. Cleared cached web session; please scan a new QR.`;return await resetActiveLogin(account.accountId,message),runtime.log(danger(message)),{connected:!1,message}}if(login.errorStatus===515&&await restartLoginSocket(login,runtime)&&isLoginFresh(login))continue;let message=`WhatsApp login failed: ${login.error}`;return await resetActiveLogin(account.accountId,message),runtime.log(danger(message)),{connected:!1,message}}if(login.connected){let message=`✅ Linked! WhatsApp is ready.`;return runtime.log(success(message)),await resetActiveLogin(account.accountId),{connected:!0,message}}return{connected:!1,message:`Login ended without a connection.`}}}export{startWebLoginWithQr,waitForWebLogin};
1
+ import"./paths-5FcIFMsj.js";import{I as success,O as danger,k as info}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{r as logInfo}from"./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{r as loadConfig}from"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import{m as webAuthExists,n as resolveWhatsAppAccount,o as logoutWeb,u as readWebSelfId}from"./accounts-o35LU_iy.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-BJHsjD3z.js";import{randomUUID}from"node:crypto";import{DisconnectReason}from"@whiskeysockets/baileys";import QRCodeModule from"qrcode-terminal/vendor/QRCode/index.js";import QRErrorCorrectLevelModule from"qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js";import{deflateSync}from"node:zlib";const CRC_TABLE=(()=>{let table=new Uint32Array(256);for(let i=0;i<256;i+=1){let c=i;for(let k=0;k<8;k+=1)c=c&1?3988292384^c>>>1:c>>>1;table[i]=c>>>0}return table})();function crc32(buf){let crc=4294967295;for(let i=0;i<buf.length;i+=1)crc=CRC_TABLE[(crc^buf[i])&255]^crc>>>8;return(crc^4294967295)>>>0}function pngChunk(type,data){let typeBuf=Buffer.from(type,`ascii`),len=Buffer.alloc(4);len.writeUInt32BE(data.length,0);let crc=crc32(Buffer.concat([typeBuf,data])),crcBuf=Buffer.alloc(4);return crcBuf.writeUInt32BE(crc,0),Buffer.concat([len,typeBuf,data,crcBuf])}function fillPixel(buf,x,y,width,r,g,b,a=255){if(x<0||y<0||x>=width)return;let idx=(y*width+x)*4;idx<0||idx+3>=buf.length||(buf[idx]=r,buf[idx+1]=g,buf[idx+2]=b,buf[idx+3]=a)}function encodePngRgba(buffer,width,height){let stride=width*4,raw=Buffer.alloc((stride+1)*height);for(let row=0;row<height;row+=1){let rawOffset=row*(stride+1);raw[rawOffset]=0,buffer.copy(raw,rawOffset+1,row*stride,row*stride+stride)}let compressed=deflateSync(raw),signature=Buffer.from([137,80,78,71,13,10,26,10]),ihdr=Buffer.alloc(13);return ihdr.writeUInt32BE(width,0),ihdr.writeUInt32BE(height,4),ihdr[8]=8,ihdr[9]=6,ihdr[10]=0,ihdr[11]=0,ihdr[12]=0,Buffer.concat([signature,pngChunk(`IHDR`,ihdr),pngChunk(`IDAT`,compressed),pngChunk(`IEND`,Buffer.alloc(0))])}const QRCode=QRCodeModule,QRErrorCorrectLevel=QRErrorCorrectLevelModule;function createQrMatrix(input){let qr=new QRCode(-1,QRErrorCorrectLevel.L);return qr.addData(input),qr.make(),qr}async function renderQrPngBase64(input,opts={}){let{scale=6,marginModules=4}=opts,qr=createQrMatrix(input),modules=qr.getModuleCount(),size=(modules+marginModules*2)*scale,buf=Buffer.alloc(size*size*4,255);for(let row=0;row<modules;row+=1)for(let col=0;col<modules;col+=1){if(!qr.isDark(row,col))continue;let startX=(col+marginModules)*scale,startY=(row+marginModules)*scale;for(let y=0;y<scale;y+=1){let pixelY=startY+y;for(let x=0;x<scale;x+=1)fillPixel(buf,startX+x,pixelY,size,0,0,0,255)}}return encodePngRgba(buf,size,size).toString(`base64`)}const activeLogins=new Map;function closeSocket(sock){try{sock.ws?.close()}catch{}}async function resetActiveLogin(accountId,reason){let login=activeLogins.get(accountId);login&&(closeSocket(login.sock),activeLogins.delete(accountId)),reason&&logInfo(reason)}function isLoginFresh(login){return Date.now()-login.startedAt<18e4}function attachLoginWaiter(accountId,login){login.waitPromise=waitForWaConnection(login.sock).then(()=>{let current=activeLogins.get(accountId);current?.id===login.id&&(current.connected=!0)}).catch(err=>{let current=activeLogins.get(accountId);current?.id===login.id&&(current.error=formatError(err),current.errorStatus=getStatusCode(err))})}async function restartLoginSocket(login,runtime){if(login.restartAttempted)return!1;login.restartAttempted=!0,runtime.log(info(`WhatsApp asked for a restart after pairing (code 515); retrying connection once…`)),closeSocket(login.sock);try{return login.sock=await createWaSocket(!1,login.verbose,{authDir:login.authDir}),login.connected=!1,login.error=void 0,login.errorStatus=void 0,attachLoginWaiter(login.accountId,login),!0}catch(err){return login.error=formatError(err),login.errorStatus=getStatusCode(err),!1}}async function startWebLoginWithQr(opts={}){let runtime=opts.runtime??defaultRuntime,account=resolveWhatsAppAccount({cfg:loadConfig(),accountId:opts.accountId}),hasWeb=await webAuthExists(account.authDir),selfId=readWebSelfId(account.authDir);if(hasWeb&&!opts.force)return{message:`WhatsApp is already linked (${selfId.e164??selfId.jid??`unknown`}). Say “relink” if you want a fresh QR.`};let existing=activeLogins.get(account.accountId);if(existing&&isLoginFresh(existing)&&existing.qrDataUrl)return{qrDataUrl:existing.qrDataUrl,message:`QR already active. Scan it in WhatsApp → Linked Devices.`};await resetActiveLogin(account.accountId);let resolveQr=null,rejectQr=null,qrPromise=new Promise((resolve,reject)=>{resolveQr=resolve,rejectQr=reject}),qrTimer=setTimeout(()=>{rejectQr?.(Error(`Timed out waiting for WhatsApp QR`))},Math.max(opts.timeoutMs??3e4,5e3)),sock,pendingQr=null;try{sock=await createWaSocket(!1,!!opts.verbose,{authDir:account.authDir,onQr:qr=>{if(pendingQr)return;pendingQr=qr;let current=activeLogins.get(account.accountId);current&&!current.qr&&(current.qr=qr),clearTimeout(qrTimer),runtime.log(info(`WhatsApp QR received.`)),resolveQr?.(qr)}})}catch(err){return clearTimeout(qrTimer),await resetActiveLogin(account.accountId),{message:`Failed to start WhatsApp login: ${String(err)}`}}let login={accountId:account.accountId,authDir:account.authDir,isLegacyAuthDir:account.isLegacyAuthDir,id:randomUUID(),sock,startedAt:Date.now(),connected:!1,waitPromise:Promise.resolve(),restartAttempted:!1,verbose:!!opts.verbose};activeLogins.set(account.accountId,login),pendingQr&&!login.qr&&(login.qr=pendingQr),attachLoginWaiter(account.accountId,login);let qr;try{qr=await qrPromise}catch(err){return clearTimeout(qrTimer),await resetActiveLogin(account.accountId),{message:`Failed to get QR: ${String(err)}`}}return login.qrDataUrl=`data:image/png;base64,${await renderQrPngBase64(qr)}`,{qrDataUrl:login.qrDataUrl,message:`Scan this QR in WhatsApp → Linked Devices.`}}async function waitForWebLogin(opts={}){let runtime=opts.runtime??defaultRuntime,account=resolveWhatsAppAccount({cfg:loadConfig(),accountId:opts.accountId}),activeLogin=activeLogins.get(account.accountId);if(!activeLogin)return{connected:!1,message:`No active WhatsApp login in progress.`};let login=activeLogin;if(!isLoginFresh(login))return await resetActiveLogin(account.accountId),{connected:!1,message:`The login QR expired. Ask me to generate a new one.`};let timeoutMs=Math.max(opts.timeoutMs??12e4,1e3),deadline=Date.now()+timeoutMs;for(;;){let remaining=deadline-Date.now();if(remaining<=0)return{connected:!1,message:`Still waiting for the QR scan. Let me know when you’ve scanned it.`};let timeout=new Promise(resolve=>setTimeout(()=>resolve(`timeout`),remaining));if(await Promise.race([login.waitPromise.then(()=>`done`),timeout])===`timeout`)return{connected:!1,message:`Still waiting for the QR scan. Let me know when you’ve scanned it.`};if(login.error){if(login.errorStatus===DisconnectReason.loggedOut){await logoutWeb({authDir:login.authDir,isLegacyAuthDir:login.isLegacyAuthDir,runtime});let message=`WhatsApp reported the session is logged out. Cleared cached web session; please scan a new QR.`;return await resetActiveLogin(account.accountId,message),runtime.log(danger(message)),{connected:!1,message}}if(login.errorStatus===515&&await restartLoginSocket(login,runtime)&&isLoginFresh(login))continue;let message=`WhatsApp login failed: ${login.error}`;return await resetActiveLogin(account.accountId,message),runtime.log(danger(message)),{connected:!1,message}}if(login.connected){let message=`✅ Linked! WhatsApp is ready.`;return runtime.log(success(message)),await resetActiveLogin(account.accountId),{connected:!0,message}}return{connected:!1,message:`Login ended without a connection.`}}}export{startWebLoginWithQr,waitForWebLogin};
@@ -1 +1 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{L as colorize,R as isRich,z as theme}from"./utils-BP60e80M.js";import{n as clearActiveProgressLine}from"./restore-BdB4wlsZ.js";import{c as formatLocalIsoWithOffset}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-C1VbcUOm.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.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{t as buildGatewayConnectionDetails}from"./call-DmAU4cRX.js";import"./message-channel-z5YRpR2d.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import"./progress-Cqb-jAjT.js";import{n as callGatewayFromCli,t as addGatewayClientOptions}from"./gateway-rpc-ByUcnQ7W.js";import{t as parseLogLine}from"./parse-log-line-Xw9Ui348.js";import{setTimeout}from"node:timers/promises";function isBrokenPipeError(err){let code=err?.code;return code===`EPIPE`||code===`EIO`}function createSafeStreamWriter(options={}){let closed=!1,notified=!1,noteBrokenPipe=(err,stream)=>{notified||(notified=!0,options.onBrokenPipe?.(err,stream))},handleError=(err,stream)=>{if(!isBrokenPipeError(err))throw err;return closed=!0,noteBrokenPipe(err,stream),!1},write=(stream,text)=>{if(closed)return!1;try{options.beforeWrite?.()}catch(err){return handleError(err,process.stderr)}try{return stream.write(text),!closed}catch(err){return handleError(err,stream)}};return{write,writeLine:(stream,text)=>write(stream,`${text}\n`),reset:()=>{closed=!1,notified=!1},isClosed:()=>closed}}function parsePositiveInt(value,fallback){if(!value)return fallback;let parsed=Number.parseInt(value,10);return Number.isFinite(parsed)&&parsed>0?parsed:fallback}async function fetchLogs(opts,cursor,showProgress){let payload=await callGatewayFromCli(`logs.tail`,opts,{cursor,limit:parsePositiveInt(opts.limit,200),maxBytes:parsePositiveInt(opts.maxBytes,25e4)},{progress:showProgress});if(!payload||typeof payload!=`object`)throw Error(`Unexpected logs.tail response`);return payload}function formatLogTimestamp(value,mode=`plain`,localTime=!1){if(!value)return``;let parsed=new Date(value);if(Number.isNaN(parsed.getTime()))return value;let timeString;return timeString=localTime?formatLocalIsoWithOffset(parsed):parsed.toISOString(),mode===`pretty`?timeString.slice(11,19):timeString}function formatLogLine(raw,opts){let parsed=parseLogLine(raw);if(!parsed)return raw;let label=parsed.subsystem??parsed.module??``,time=formatLogTimestamp(parsed.time,opts.pretty?`pretty`:`plain`,opts.localTime),level=parsed.level??``,levelLabel=level.padEnd(5).trim(),message=parsed.message||parsed.raw;if(!opts.pretty)return[time,level,label,message].filter(Boolean).join(` `).trim();let timeLabel=colorize(opts.rich,theme.muted,time),labelValue=colorize(opts.rich,theme.accent,label),levelValue=level===`error`||level===`fatal`?colorize(opts.rich,theme.error,levelLabel):level===`warn`?colorize(opts.rich,theme.warn,levelLabel):level===`debug`||level===`trace`?colorize(opts.rich,theme.muted,levelLabel):colorize(opts.rich,theme.info,levelLabel),messageValue=level===`error`||level===`fatal`?colorize(opts.rich,theme.error,message):level===`warn`?colorize(opts.rich,theme.warn,message):level===`debug`||level===`trace`?colorize(opts.rich,theme.muted,message):colorize(opts.rich,theme.info,message);return[[timeLabel,levelValue,labelValue].filter(Boolean).join(` `),messageValue].filter(Boolean).join(` `).trim()}function createLogWriters(){let writer=createSafeStreamWriter({beforeWrite:()=>clearActiveProgressLine(),onBrokenPipe:(err,stream)=>{let code=err.code??`EPIPE`,message=`builderforce logs: output ${stream===process.stdout?`stdout`:`stderr`} closed (${code}). Stopping tail.`;try{clearActiveProgressLine(),process.stderr.write(`${message}\n`)}catch{}}});return{logLine:text=>writer.writeLine(process.stdout,text),errorLine:text=>writer.writeLine(process.stderr,text),emitJsonLine:(payload,toStdErr=!1)=>writer.write(toStdErr?process.stderr:process.stdout,`${JSON.stringify(payload)}\n`)}}function emitGatewayError(err,opts,mode,rich,emitJsonLine,errorLine){let details=buildGatewayConnectionDetails({url:opts.url}),message=`Gateway not reachable. Is it running and accessible?`,hint=`Hint: run \`${formatCliCommand(`builderforce doctor`)}\`.`,errorText=err instanceof Error?err.message:String(err);if(mode===`json`)return emitJsonLine({type:`error`,message,error:errorText,details,hint},!0),void 0;errorLine(colorize(rich,theme.error,message))&&errorLine(details.message)&&errorLine(colorize(rich,theme.muted,hint))}function registerLogsCli(program){let logs=program.command(`logs`).description(`Tail gateway file logs via RPC`).option(`--limit <n>`,`Max lines to return`,`200`).option(`--max-bytes <n>`,`Max bytes to read`,`250000`).option(`--follow`,`Follow log output`,!1).option(`--interval <ms>`,`Polling interval in ms`,`1000`).option(`--json`,`Emit JSON log lines`,!1).option(`--plain`,`Plain text output (no ANSI styling)`,!1).option(`--no-color`,`Disable ANSI colors`).option(`--local-time`,`Display timestamps in local timezone`,!1).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/logs`,`docs.builderforce.ai/cli/logs`)}\n`);addGatewayClientOptions(logs),logs.action(async opts=>{let{logLine,errorLine,emitJsonLine}=createLogWriters(),interval=parsePositiveInt(opts.interval,1e3),cursor,first=!0,jsonMode=!!opts.json,pretty=!jsonMode&&!!process.stdout.isTTY&&!opts.plain,rich=isRich()&&opts.color!==!1,localTime=!!opts.localTime;for(;;){let payload,showProgress=first&&!opts.follow;try{payload=await fetchLogs(opts,cursor,showProgress)}catch(err){emitGatewayError(err,opts,jsonMode?`json`:`text`,rich,emitJsonLine,errorLine),process.exit(1);return}let lines=Array.isArray(payload.lines)?payload.lines:[];if(jsonMode){if(first&&!emitJsonLine({type:`meta`,file:payload.file,cursor:payload.cursor,size:payload.size}))return;for(let line of lines){let parsed=parseLogLine(line);if(parsed){if(!emitJsonLine({type:`log`,...parsed}))return}else if(!emitJsonLine({type:`raw`,raw:line}))return}if(payload.truncated&&!emitJsonLine({type:`notice`,message:`Log tail truncated (increase --max-bytes).`})||payload.reset&&!emitJsonLine({type:`notice`,message:`Log cursor reset (file rotated).`}))return}else{if(first&&payload.file&&!logLine(`${pretty?colorize(rich,theme.muted,`Log file:`):`Log file:`} ${payload.file}`))return;for(let line of lines)if(!logLine(formatLogLine(line,{pretty,rich,localTime})))return;if(payload.truncated&&!errorLine(`Log tail truncated (increase --max-bytes).`)||payload.reset&&!errorLine(`Log cursor reset (file rotated).`))return}if(cursor=typeof payload.cursor==`number`&&Number.isFinite(payload.cursor)?payload.cursor:cursor,first=!1,!opts.follow)return;await setTimeout(interval)}})}export{registerLogsCli};
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{L as colorize,R as isRich,z as theme}from"./utils-BP60e80M.js";import{n as clearActiveProgressLine}from"./restore-BdB4wlsZ.js";import{c as formatLocalIsoWithOffset}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-pt7Tr4HA.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.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{t as buildGatewayConnectionDetails}from"./call-Du2LiaX6.js";import"./message-channel-z5YRpR2d.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import"./progress-Cqb-jAjT.js";import{n as callGatewayFromCli,t as addGatewayClientOptions}from"./gateway-rpc-ff1RVb0_.js";import{t as parseLogLine}from"./parse-log-line-Xw9Ui348.js";import{setTimeout}from"node:timers/promises";function isBrokenPipeError(err){let code=err?.code;return code===`EPIPE`||code===`EIO`}function createSafeStreamWriter(options={}){let closed=!1,notified=!1,noteBrokenPipe=(err,stream)=>{notified||(notified=!0,options.onBrokenPipe?.(err,stream))},handleError=(err,stream)=>{if(!isBrokenPipeError(err))throw err;return closed=!0,noteBrokenPipe(err,stream),!1},write=(stream,text)=>{if(closed)return!1;try{options.beforeWrite?.()}catch(err){return handleError(err,process.stderr)}try{return stream.write(text),!closed}catch(err){return handleError(err,stream)}};return{write,writeLine:(stream,text)=>write(stream,`${text}\n`),reset:()=>{closed=!1,notified=!1},isClosed:()=>closed}}function parsePositiveInt(value,fallback){if(!value)return fallback;let parsed=Number.parseInt(value,10);return Number.isFinite(parsed)&&parsed>0?parsed:fallback}async function fetchLogs(opts,cursor,showProgress){let payload=await callGatewayFromCli(`logs.tail`,opts,{cursor,limit:parsePositiveInt(opts.limit,200),maxBytes:parsePositiveInt(opts.maxBytes,25e4)},{progress:showProgress});if(!payload||typeof payload!=`object`)throw Error(`Unexpected logs.tail response`);return payload}function formatLogTimestamp(value,mode=`plain`,localTime=!1){if(!value)return``;let parsed=new Date(value);if(Number.isNaN(parsed.getTime()))return value;let timeString;return timeString=localTime?formatLocalIsoWithOffset(parsed):parsed.toISOString(),mode===`pretty`?timeString.slice(11,19):timeString}function formatLogLine(raw,opts){let parsed=parseLogLine(raw);if(!parsed)return raw;let label=parsed.subsystem??parsed.module??``,time=formatLogTimestamp(parsed.time,opts.pretty?`pretty`:`plain`,opts.localTime),level=parsed.level??``,levelLabel=level.padEnd(5).trim(),message=parsed.message||parsed.raw;if(!opts.pretty)return[time,level,label,message].filter(Boolean).join(` `).trim();let timeLabel=colorize(opts.rich,theme.muted,time),labelValue=colorize(opts.rich,theme.accent,label),levelValue=level===`error`||level===`fatal`?colorize(opts.rich,theme.error,levelLabel):level===`warn`?colorize(opts.rich,theme.warn,levelLabel):level===`debug`||level===`trace`?colorize(opts.rich,theme.muted,levelLabel):colorize(opts.rich,theme.info,levelLabel),messageValue=level===`error`||level===`fatal`?colorize(opts.rich,theme.error,message):level===`warn`?colorize(opts.rich,theme.warn,message):level===`debug`||level===`trace`?colorize(opts.rich,theme.muted,message):colorize(opts.rich,theme.info,message);return[[timeLabel,levelValue,labelValue].filter(Boolean).join(` `),messageValue].filter(Boolean).join(` `).trim()}function createLogWriters(){let writer=createSafeStreamWriter({beforeWrite:()=>clearActiveProgressLine(),onBrokenPipe:(err,stream)=>{let code=err.code??`EPIPE`,message=`builderforce logs: output ${stream===process.stdout?`stdout`:`stderr`} closed (${code}). Stopping tail.`;try{clearActiveProgressLine(),process.stderr.write(`${message}\n`)}catch{}}});return{logLine:text=>writer.writeLine(process.stdout,text),errorLine:text=>writer.writeLine(process.stderr,text),emitJsonLine:(payload,toStdErr=!1)=>writer.write(toStdErr?process.stderr:process.stdout,`${JSON.stringify(payload)}\n`)}}function emitGatewayError(err,opts,mode,rich,emitJsonLine,errorLine){let details=buildGatewayConnectionDetails({url:opts.url}),message=`Gateway not reachable. Is it running and accessible?`,hint=`Hint: run \`${formatCliCommand(`builderforce doctor`)}\`.`,errorText=err instanceof Error?err.message:String(err);if(mode===`json`)return emitJsonLine({type:`error`,message,error:errorText,details,hint},!0),void 0;errorLine(colorize(rich,theme.error,message))&&errorLine(details.message)&&errorLine(colorize(rich,theme.muted,hint))}function registerLogsCli(program){let logs=program.command(`logs`).description(`Tail gateway file logs via RPC`).option(`--limit <n>`,`Max lines to return`,`200`).option(`--max-bytes <n>`,`Max bytes to read`,`250000`).option(`--follow`,`Follow log output`,!1).option(`--interval <ms>`,`Polling interval in ms`,`1000`).option(`--json`,`Emit JSON log lines`,!1).option(`--plain`,`Plain text output (no ANSI styling)`,!1).option(`--no-color`,`Disable ANSI colors`).option(`--local-time`,`Display timestamps in local timezone`,!1).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/logs`,`docs.builderforce.ai/cli/logs`)}\n`);addGatewayClientOptions(logs),logs.action(async opts=>{let{logLine,errorLine,emitJsonLine}=createLogWriters(),interval=parsePositiveInt(opts.interval,1e3),cursor,first=!0,jsonMode=!!opts.json,pretty=!jsonMode&&!!process.stdout.isTTY&&!opts.plain,rich=isRich()&&opts.color!==!1,localTime=!!opts.localTime;for(;;){let payload,showProgress=first&&!opts.follow;try{payload=await fetchLogs(opts,cursor,showProgress)}catch(err){emitGatewayError(err,opts,jsonMode?`json`:`text`,rich,emitJsonLine,errorLine),process.exit(1);return}let lines=Array.isArray(payload.lines)?payload.lines:[];if(jsonMode){if(first&&!emitJsonLine({type:`meta`,file:payload.file,cursor:payload.cursor,size:payload.size}))return;for(let line of lines){let parsed=parseLogLine(line);if(parsed){if(!emitJsonLine({type:`log`,...parsed}))return}else if(!emitJsonLine({type:`raw`,raw:line}))return}if(payload.truncated&&!emitJsonLine({type:`notice`,message:`Log tail truncated (increase --max-bytes).`})||payload.reset&&!emitJsonLine({type:`notice`,message:`Log cursor reset (file rotated).`}))return}else{if(first&&payload.file&&!logLine(`${pretty?colorize(rich,theme.muted,`Log file:`):`Log file:`} ${payload.file}`))return;for(let line of lines)if(!logLine(formatLogLine(line,{pretty,rich,localTime})))return;if(payload.truncated&&!errorLine(`Log tail truncated (increase --max-bytes).`)||payload.reset&&!errorLine(`Log cursor reset (file rotated).`))return}if(cursor=typeof payload.cursor==`number`&&Number.isFinite(payload.cursor)?payload.cursor:cursor,first=!1,!opts.follow)return;await setTimeout(interval)}})}export{registerLogsCli};
@@ -1 +1 @@
1
- import"./paths-5FcIFMsj.js";import{B as theme,R as colorize,z as isRich}from"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{u as formatLocalIsoWithOffset}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import{n as clearActiveProgressLine}from"./restore-gPan2ZAn.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./message-channel-D_jXxXQj.js";import"./client-xfoidwPI.js";import{t as buildGatewayConnectionDetails}from"./call-BbRf8gFM.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import"./progress-BfOtdN6b.js";import{n as callGatewayFromCli,t as addGatewayClientOptions}from"./gateway-rpc-BXR_lVIx.js";import{t as parseLogLine}from"./parse-log-line-D-p4EvDQ.js";import{setTimeout}from"node:timers/promises";function isBrokenPipeError(err){let code=err?.code;return code===`EPIPE`||code===`EIO`}function createSafeStreamWriter(options={}){let closed=!1,notified=!1,noteBrokenPipe=(err,stream)=>{notified||(notified=!0,options.onBrokenPipe?.(err,stream))},handleError=(err,stream)=>{if(!isBrokenPipeError(err))throw err;return closed=!0,noteBrokenPipe(err,stream),!1},write=(stream,text)=>{if(closed)return!1;try{options.beforeWrite?.()}catch(err){return handleError(err,process.stderr)}try{return stream.write(text),!closed}catch(err){return handleError(err,stream)}};return{write,writeLine:(stream,text)=>write(stream,`${text}\n`),reset:()=>{closed=!1,notified=!1},isClosed:()=>closed}}function parsePositiveInt(value,fallback){if(!value)return fallback;let parsed=Number.parseInt(value,10);return Number.isFinite(parsed)&&parsed>0?parsed:fallback}async function fetchLogs(opts,cursor,showProgress){let payload=await callGatewayFromCli(`logs.tail`,opts,{cursor,limit:parsePositiveInt(opts.limit,200),maxBytes:parsePositiveInt(opts.maxBytes,25e4)},{progress:showProgress});if(!payload||typeof payload!=`object`)throw Error(`Unexpected logs.tail response`);return payload}function formatLogTimestamp(value,mode=`plain`,localTime=!1){if(!value)return``;let parsed=new Date(value);if(Number.isNaN(parsed.getTime()))return value;let timeString;return timeString=localTime?formatLocalIsoWithOffset(parsed):parsed.toISOString(),mode===`pretty`?timeString.slice(11,19):timeString}function formatLogLine(raw,opts){let parsed=parseLogLine(raw);if(!parsed)return raw;let label=parsed.subsystem??parsed.module??``,time=formatLogTimestamp(parsed.time,opts.pretty?`pretty`:`plain`,opts.localTime),level=parsed.level??``,levelLabel=level.padEnd(5).trim(),message=parsed.message||parsed.raw;if(!opts.pretty)return[time,level,label,message].filter(Boolean).join(` `).trim();let timeLabel=colorize(opts.rich,theme.muted,time),labelValue=colorize(opts.rich,theme.accent,label),levelValue=level===`error`||level===`fatal`?colorize(opts.rich,theme.error,levelLabel):level===`warn`?colorize(opts.rich,theme.warn,levelLabel):level===`debug`||level===`trace`?colorize(opts.rich,theme.muted,levelLabel):colorize(opts.rich,theme.info,levelLabel),messageValue=level===`error`||level===`fatal`?colorize(opts.rich,theme.error,message):level===`warn`?colorize(opts.rich,theme.warn,message):level===`debug`||level===`trace`?colorize(opts.rich,theme.muted,message):colorize(opts.rich,theme.info,message);return[[timeLabel,levelValue,labelValue].filter(Boolean).join(` `),messageValue].filter(Boolean).join(` `).trim()}function createLogWriters(){let writer=createSafeStreamWriter({beforeWrite:()=>clearActiveProgressLine(),onBrokenPipe:(err,stream)=>{let code=err.code??`EPIPE`,message=`builderforce logs: output ${stream===process.stdout?`stdout`:`stderr`} closed (${code}). Stopping tail.`;try{clearActiveProgressLine(),process.stderr.write(`${message}\n`)}catch{}}});return{logLine:text=>writer.writeLine(process.stdout,text),errorLine:text=>writer.writeLine(process.stderr,text),emitJsonLine:(payload,toStdErr=!1)=>writer.write(toStdErr?process.stderr:process.stdout,`${JSON.stringify(payload)}\n`)}}function emitGatewayError(err,opts,mode,rich,emitJsonLine,errorLine){let details=buildGatewayConnectionDetails({url:opts.url}),message=`Gateway not reachable. Is it running and accessible?`,hint=`Hint: run \`${formatCliCommand(`builderforce doctor`)}\`.`,errorText=err instanceof Error?err.message:String(err);if(mode===`json`)return emitJsonLine({type:`error`,message,error:errorText,details,hint},!0),void 0;errorLine(colorize(rich,theme.error,message))&&errorLine(details.message)&&errorLine(colorize(rich,theme.muted,hint))}function registerLogsCli(program){let logs=program.command(`logs`).description(`Tail gateway file logs via RPC`).option(`--limit <n>`,`Max lines to return`,`200`).option(`--max-bytes <n>`,`Max bytes to read`,`250000`).option(`--follow`,`Follow log output`,!1).option(`--interval <ms>`,`Polling interval in ms`,`1000`).option(`--json`,`Emit JSON log lines`,!1).option(`--plain`,`Plain text output (no ANSI styling)`,!1).option(`--no-color`,`Disable ANSI colors`).option(`--local-time`,`Display timestamps in local timezone`,!1).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/logs`,`docs.builderforce.ai/cli/logs`)}\n`);addGatewayClientOptions(logs),logs.action(async opts=>{let{logLine,errorLine,emitJsonLine}=createLogWriters(),interval=parsePositiveInt(opts.interval,1e3),cursor,first=!0,jsonMode=!!opts.json,pretty=!jsonMode&&!!process.stdout.isTTY&&!opts.plain,rich=isRich()&&opts.color!==!1,localTime=!!opts.localTime;for(;;){let payload,showProgress=first&&!opts.follow;try{payload=await fetchLogs(opts,cursor,showProgress)}catch(err){emitGatewayError(err,opts,jsonMode?`json`:`text`,rich,emitJsonLine,errorLine),process.exit(1);return}let lines=Array.isArray(payload.lines)?payload.lines:[];if(jsonMode){if(first&&!emitJsonLine({type:`meta`,file:payload.file,cursor:payload.cursor,size:payload.size}))return;for(let line of lines){let parsed=parseLogLine(line);if(parsed){if(!emitJsonLine({type:`log`,...parsed}))return}else if(!emitJsonLine({type:`raw`,raw:line}))return}if(payload.truncated&&!emitJsonLine({type:`notice`,message:`Log tail truncated (increase --max-bytes).`})||payload.reset&&!emitJsonLine({type:`notice`,message:`Log cursor reset (file rotated).`}))return}else{if(first&&payload.file&&!logLine(`${pretty?colorize(rich,theme.muted,`Log file:`):`Log file:`} ${payload.file}`))return;for(let line of lines)if(!logLine(formatLogLine(line,{pretty,rich,localTime})))return;if(payload.truncated&&!errorLine(`Log tail truncated (increase --max-bytes).`)||payload.reset&&!errorLine(`Log cursor reset (file rotated).`))return}if(cursor=typeof payload.cursor==`number`&&Number.isFinite(payload.cursor)?payload.cursor:cursor,first=!1,!opts.follow)return;await setTimeout(interval)}})}export{registerLogsCli};
1
+ import"./paths-5FcIFMsj.js";import{B as theme,R as colorize,z as isRich}from"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{u as formatLocalIsoWithOffset}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import{n as clearActiveProgressLine}from"./restore-gPan2ZAn.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{t as formatCliCommand}from"./command-format-D806O2pt.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./message-channel-D_jXxXQj.js";import"./client-xfoidwPI.js";import{t as buildGatewayConnectionDetails}from"./call-T8ciwMTA.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import"./progress-BfOtdN6b.js";import{n as callGatewayFromCli,t as addGatewayClientOptions}from"./gateway-rpc-B02y0PnE.js";import{t as parseLogLine}from"./parse-log-line-D-p4EvDQ.js";import{setTimeout}from"node:timers/promises";function isBrokenPipeError(err){let code=err?.code;return code===`EPIPE`||code===`EIO`}function createSafeStreamWriter(options={}){let closed=!1,notified=!1,noteBrokenPipe=(err,stream)=>{notified||(notified=!0,options.onBrokenPipe?.(err,stream))},handleError=(err,stream)=>{if(!isBrokenPipeError(err))throw err;return closed=!0,noteBrokenPipe(err,stream),!1},write=(stream,text)=>{if(closed)return!1;try{options.beforeWrite?.()}catch(err){return handleError(err,process.stderr)}try{return stream.write(text),!closed}catch(err){return handleError(err,stream)}};return{write,writeLine:(stream,text)=>write(stream,`${text}\n`),reset:()=>{closed=!1,notified=!1},isClosed:()=>closed}}function parsePositiveInt(value,fallback){if(!value)return fallback;let parsed=Number.parseInt(value,10);return Number.isFinite(parsed)&&parsed>0?parsed:fallback}async function fetchLogs(opts,cursor,showProgress){let payload=await callGatewayFromCli(`logs.tail`,opts,{cursor,limit:parsePositiveInt(opts.limit,200),maxBytes:parsePositiveInt(opts.maxBytes,25e4)},{progress:showProgress});if(!payload||typeof payload!=`object`)throw Error(`Unexpected logs.tail response`);return payload}function formatLogTimestamp(value,mode=`plain`,localTime=!1){if(!value)return``;let parsed=new Date(value);if(Number.isNaN(parsed.getTime()))return value;let timeString;return timeString=localTime?formatLocalIsoWithOffset(parsed):parsed.toISOString(),mode===`pretty`?timeString.slice(11,19):timeString}function formatLogLine(raw,opts){let parsed=parseLogLine(raw);if(!parsed)return raw;let label=parsed.subsystem??parsed.module??``,time=formatLogTimestamp(parsed.time,opts.pretty?`pretty`:`plain`,opts.localTime),level=parsed.level??``,levelLabel=level.padEnd(5).trim(),message=parsed.message||parsed.raw;if(!opts.pretty)return[time,level,label,message].filter(Boolean).join(` `).trim();let timeLabel=colorize(opts.rich,theme.muted,time),labelValue=colorize(opts.rich,theme.accent,label),levelValue=level===`error`||level===`fatal`?colorize(opts.rich,theme.error,levelLabel):level===`warn`?colorize(opts.rich,theme.warn,levelLabel):level===`debug`||level===`trace`?colorize(opts.rich,theme.muted,levelLabel):colorize(opts.rich,theme.info,levelLabel),messageValue=level===`error`||level===`fatal`?colorize(opts.rich,theme.error,message):level===`warn`?colorize(opts.rich,theme.warn,message):level===`debug`||level===`trace`?colorize(opts.rich,theme.muted,message):colorize(opts.rich,theme.info,message);return[[timeLabel,levelValue,labelValue].filter(Boolean).join(` `),messageValue].filter(Boolean).join(` `).trim()}function createLogWriters(){let writer=createSafeStreamWriter({beforeWrite:()=>clearActiveProgressLine(),onBrokenPipe:(err,stream)=>{let code=err.code??`EPIPE`,message=`builderforce logs: output ${stream===process.stdout?`stdout`:`stderr`} closed (${code}). Stopping tail.`;try{clearActiveProgressLine(),process.stderr.write(`${message}\n`)}catch{}}});return{logLine:text=>writer.writeLine(process.stdout,text),errorLine:text=>writer.writeLine(process.stderr,text),emitJsonLine:(payload,toStdErr=!1)=>writer.write(toStdErr?process.stderr:process.stdout,`${JSON.stringify(payload)}\n`)}}function emitGatewayError(err,opts,mode,rich,emitJsonLine,errorLine){let details=buildGatewayConnectionDetails({url:opts.url}),message=`Gateway not reachable. Is it running and accessible?`,hint=`Hint: run \`${formatCliCommand(`builderforce doctor`)}\`.`,errorText=err instanceof Error?err.message:String(err);if(mode===`json`)return emitJsonLine({type:`error`,message,error:errorText,details,hint},!0),void 0;errorLine(colorize(rich,theme.error,message))&&errorLine(details.message)&&errorLine(colorize(rich,theme.muted,hint))}function registerLogsCli(program){let logs=program.command(`logs`).description(`Tail gateway file logs via RPC`).option(`--limit <n>`,`Max lines to return`,`200`).option(`--max-bytes <n>`,`Max bytes to read`,`250000`).option(`--follow`,`Follow log output`,!1).option(`--interval <ms>`,`Polling interval in ms`,`1000`).option(`--json`,`Emit JSON log lines`,!1).option(`--plain`,`Plain text output (no ANSI styling)`,!1).option(`--no-color`,`Disable ANSI colors`).option(`--local-time`,`Display timestamps in local timezone`,!1).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/logs`,`docs.builderforce.ai/cli/logs`)}\n`);addGatewayClientOptions(logs),logs.action(async opts=>{let{logLine,errorLine,emitJsonLine}=createLogWriters(),interval=parsePositiveInt(opts.interval,1e3),cursor,first=!0,jsonMode=!!opts.json,pretty=!jsonMode&&!!process.stdout.isTTY&&!opts.plain,rich=isRich()&&opts.color!==!1,localTime=!!opts.localTime;for(;;){let payload,showProgress=first&&!opts.follow;try{payload=await fetchLogs(opts,cursor,showProgress)}catch(err){emitGatewayError(err,opts,jsonMode?`json`:`text`,rich,emitJsonLine,errorLine),process.exit(1);return}let lines=Array.isArray(payload.lines)?payload.lines:[];if(jsonMode){if(first&&!emitJsonLine({type:`meta`,file:payload.file,cursor:payload.cursor,size:payload.size}))return;for(let line of lines){let parsed=parseLogLine(line);if(parsed){if(!emitJsonLine({type:`log`,...parsed}))return}else if(!emitJsonLine({type:`raw`,raw:line}))return}if(payload.truncated&&!emitJsonLine({type:`notice`,message:`Log tail truncated (increase --max-bytes).`})||payload.reset&&!emitJsonLine({type:`notice`,message:`Log cursor reset (file rotated).`}))return}else{if(first&&payload.file&&!logLine(`${pretty?colorize(rich,theme.muted,`Log file:`):`Log file:`} ${payload.file}`))return;for(let line of lines)if(!logLine(formatLogLine(line,{pretty,rich,localTime})))return;if(payload.truncated&&!errorLine(`Log tail truncated (increase --max-bytes).`)||payload.reset&&!errorLine(`Log cursor reset (file rotated).`))return}if(cursor=typeof payload.cursor==`number`&&Number.isFinite(payload.cursor)?payload.cursor:cursor,first=!1,!opts.follow)return;await setTimeout(interval)}})}export{registerLogsCli};
@@ -1,4 +1,4 @@
1
- import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import{E as truncateUtf16Safe,i as clampNumber,r as clampInt,y as resolveUserPath}from"./utils-BP60e80M.js";import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{Kt as requireApiKey,qt as resolveApiKeyForProvider}from"./auth-profiles-C1VbcUOm.js";import{c as resolveAgentWorkspaceDir,i as resolveAgentDir,r as resolveAgentConfig}from"./agent-scope-CufEmNj_.js";import{t as normalizeBaseUrl}from"./normalize-base-url-D_sv6Zgt.js";import{n as formatErrorMessage}from"./errors-tAt19c1E.js";import{s as resolveSessionTranscriptsDirForAgent}from"./paths-ClsbsPQP.js";import{n as onSessionTranscriptUpdate}from"./transcript-events-XyildGuH.js";import{_ as runWithConcurrency,a as buildFileEntry,d as hashText,f as isMemoryPath,g as remapChunkLines,h as parseEmbedding,i as sessionPathForFile,m as normalizeExtraMemoryPaths,n as buildSessionEntry,o as chunkMarkdown,p as listMemoryFiles,r as listSessionFilesForAgent,s as ensureDir,t as requireNodeSqlite,u as getDefaultMemoryWatchPatterns}from"./sqlite-CIGM1WKg.js";import{n as collectProviderApiKeysForExecution,r as executeWithApiKeyRotation,t as parseGeminiAuth}from"./gemini-auth-CkD5jCPh.js";import{n as retryAsync}from"./retry-B151Hej5.js";import os from"node:os";import path from"node:path";import fs from"node:fs";import{randomUUID}from"node:crypto";import fs$1 from"node:fs/promises";import chokidar from"chokidar";import{createInterface}from"node:readline";import{Readable}from"node:stream";function tokenize$1(text){return text.toLowerCase().split(/[\s\W]+/).filter(Boolean)}function jaccardSimilarity(a,b){if(a.size===0&&b.size===0)return 1;let intersection=0;for(let token of a)b.has(token)&&intersection++;let union=a.size+b.size-intersection;return intersection/union}function cosineSimilarity(a,b){let n=Math.min(a.length,b.length),dot=0,na=0,nb=0;for(let i=0;i<n;i++)dot+=a[i]*b[i],na+=a[i]*a[i],nb+=b[i]*b[i];let denom=Math.sqrt(na)*Math.sqrt(nb);return denom===0?0:dot/denom}function mmrSelect(items,opts){let lambda=opts.lambda??.7,limit=Math.min(opts.topK??items.length,items.length),remaining=[...items],relevance=new Map;for(let item of remaining)relevance.set(item,opts.relevance(item));let selected=[];for(;selected.length<limit&&remaining.length>0;){let bestIdx=-1,bestScore=-1/0;for(let i=0;i<remaining.length;i++){let candidate=remaining[i],maxSimToSelected=0;for(let s of selected){let sim=opts.similarity(candidate,s);sim>maxSimToSelected&&(maxSimToSelected=sim)}let score=lambda*relevance.get(candidate)-(1-lambda)*maxSimToSelected;(score>bestScore||score===bestScore&&bestIdx>=0&&opts.tieScore!==void 0&&opts.tieScore(candidate)>opts.tieScore(remaining[bestIdx]))&&(bestScore=score,bestIdx=i)}if(bestIdx<0)break;selected.push(remaining.splice(bestIdx,1)[0])}return selected}function textMaximalMarginalRelevance(items,lambda=.7){if(items.length<=1)return[...items];let l=Math.max(0,Math.min(1,lambda));if(l===1)return[...items].sort((a,b)=>b.score-a.score);let tokens=new Map;for(let item of items)tokens.set(item.id,new Set(tokenize$1(item.content)));let tokensOf=item=>tokens.get(item.id)??new Set(tokenize$1(item.content)),scores=items.map(i=>i.score),min=Math.min(...scores),range=Math.max(...scores)-min;return mmrSelect(items,{relevance:item=>range===0?1:(item.score-min)/range,similarity:(a,b)=>jaccardSimilarity(tokensOf(a),tokensOf(b)),lambda:l,tieScore:item=>item.score})}const DEFAULT_HYBRID_VECTOR_WEIGHT$1=.7,DEFAULT_HYBRID_TEXT_WEIGHT$1=.3;function normalizeHybridWeights(vectorWeight,textWeight){let clamp=(n,fallback)=>typeof n==`number`&&Number.isFinite(n)?Math.max(0,n):fallback,v=clamp(vectorWeight,DEFAULT_HYBRID_VECTOR_WEIGHT$1),t=clamp(textWeight,DEFAULT_HYBRID_TEXT_WEIGHT$1),sum=v+t;return sum<=0?{vectorWeight:DEFAULT_HYBRID_VECTOR_WEIGHT$1,textWeight:DEFAULT_HYBRID_TEXT_WEIGHT$1}:{vectorWeight:v/sum,textWeight:t/sum}}function hybridScore(scores,weights){let v=Number.isFinite(scores.vectorScore)?scores.vectorScore:0,t=Number.isFinite(scores.textScore)?scores.textScore:0;return weights.vectorWeight*v+weights.textWeight*t}function bm25RankToScore$1(rank){return 1/(1+(Number.isFinite(rank)?Math.max(0,rank):999))}function toDecayLambda(halfLifeDays){return!Number.isFinite(halfLifeDays)||halfLifeDays<=0?0:Math.LN2/halfLifeDays}function calculateTemporalDecayMultiplier(params){let lambda=toDecayLambda(params.halfLifeDays),clampedAge=Math.max(0,params.ageInDays);return lambda<=0||!Number.isFinite(clampedAge)?1:Math.exp(-lambda*clampedAge)}function applyTemporalDecayToScore(params){return params.score*calculateTemporalDecayMultiplier(params)}const DEFAULT_MMR_LAMBDA=.7,DEFAULT_SOURCES=[`memory`];function normalizeSources(sources,sessionMemoryEnabled){let normalized=new Set,input=sources?.length?sources:DEFAULT_SOURCES;for(let source of input)source===`memory`&&normalized.add(`memory`),source===`sessions`&&sessionMemoryEnabled&&normalized.add(`sessions`);return normalized.size===0&&normalized.add(`memory`),Array.from(normalized)}function resolveStorePath(agentId,raw){let stateDir=resolveStateDir(process.env,os.homedir),fallback=path.join(stateDir,`memory`,`${agentId}.sqlite`);return raw?resolveUserPath(raw.includes(`{agentId}`)?raw.replaceAll(`{agentId}`,agentId):raw):fallback}function mergeConfig(defaults,overrides,agentId){let enabled=overrides?.enabled??defaults?.enabled??!0,sessionMemory=overrides?.experimental?.sessionMemory??defaults?.experimental?.sessionMemory??!1,provider=overrides?.provider??defaults?.provider??`auto`,defaultRemote=defaults?.remote,overrideRemote=overrides?.remote,includeRemote=!!(overrideRemote?.baseUrl||overrideRemote?.apiKey||overrideRemote?.headers||defaultRemote?.baseUrl||defaultRemote?.apiKey||defaultRemote?.headers)||provider===`openai`||provider===`gemini`||provider===`voyage`||provider===`auto`,batch={enabled:overrideRemote?.batch?.enabled??defaultRemote?.batch?.enabled??!1,wait:overrideRemote?.batch?.wait??defaultRemote?.batch?.wait??!0,concurrency:Math.max(1,overrideRemote?.batch?.concurrency??defaultRemote?.batch?.concurrency??2),pollIntervalMs:overrideRemote?.batch?.pollIntervalMs??defaultRemote?.batch?.pollIntervalMs??2e3,timeoutMinutes:overrideRemote?.batch?.timeoutMinutes??defaultRemote?.batch?.timeoutMinutes??60},remote=includeRemote?{baseUrl:overrideRemote?.baseUrl??defaultRemote?.baseUrl,apiKey:overrideRemote?.apiKey??defaultRemote?.apiKey,headers:overrideRemote?.headers??defaultRemote?.headers,batch}:void 0,fallback=overrides?.fallback??defaults?.fallback??`none`,modelDefault=provider===`gemini`?`gemini-embedding-001`:provider===`openai`?`text-embedding-3-small`:provider===`voyage`?`voyage-4-large`:void 0,model=overrides?.model??defaults?.model??modelDefault??``,local={modelPath:overrides?.local?.modelPath??defaults?.local?.modelPath,modelCacheDir:overrides?.local?.modelCacheDir??defaults?.local?.modelCacheDir},sources=normalizeSources(overrides?.sources??defaults?.sources,sessionMemory),rawPaths=[...defaults?.extraPaths??[],...overrides?.extraPaths??[]].map(value=>value.trim()).filter(Boolean),extraPaths=Array.from(new Set(rawPaths)),vector={enabled:overrides?.store?.vector?.enabled??defaults?.store?.vector?.enabled??!0,extensionPath:overrides?.store?.vector?.extensionPath??defaults?.store?.vector?.extensionPath},store={driver:overrides?.store?.driver??defaults?.store?.driver??`sqlite`,path:resolveStorePath(agentId,overrides?.store?.path??defaults?.store?.path),vector},chunking={tokens:overrides?.chunking?.tokens??defaults?.chunking?.tokens??400,overlap:overrides?.chunking?.overlap??defaults?.chunking?.overlap??80},sync={onSessionStart:overrides?.sync?.onSessionStart??defaults?.sync?.onSessionStart??!0,onSearch:overrides?.sync?.onSearch??defaults?.sync?.onSearch??!0,watch:overrides?.sync?.watch??defaults?.sync?.watch??!0,watchDebounceMs:overrides?.sync?.watchDebounceMs??defaults?.sync?.watchDebounceMs??1500,intervalMinutes:overrides?.sync?.intervalMinutes??defaults?.sync?.intervalMinutes??0,sessions:{deltaBytes:overrides?.sync?.sessions?.deltaBytes??defaults?.sync?.sessions?.deltaBytes??1e5,deltaMessages:overrides?.sync?.sessions?.deltaMessages??defaults?.sync?.sessions?.deltaMessages??50}},query={maxResults:overrides?.query?.maxResults??defaults?.query?.maxResults??6,minScore:overrides?.query?.minScore??defaults?.query?.minScore??.35},hybrid={enabled:overrides?.query?.hybrid?.enabled??defaults?.query?.hybrid?.enabled??!0,vectorWeight:overrides?.query?.hybrid?.vectorWeight??defaults?.query?.hybrid?.vectorWeight??.7,textWeight:overrides?.query?.hybrid?.textWeight??defaults?.query?.hybrid?.textWeight??.3,candidateMultiplier:overrides?.query?.hybrid?.candidateMultiplier??defaults?.query?.hybrid?.candidateMultiplier??4,mmr:{enabled:overrides?.query?.hybrid?.mmr?.enabled??defaults?.query?.hybrid?.mmr?.enabled??!1,lambda:overrides?.query?.hybrid?.mmr?.lambda??defaults?.query?.hybrid?.mmr?.lambda??DEFAULT_MMR_LAMBDA},temporalDecay:{enabled:overrides?.query?.hybrid?.temporalDecay?.enabled??defaults?.query?.hybrid?.temporalDecay?.enabled??!1,halfLifeDays:overrides?.query?.hybrid?.temporalDecay?.halfLifeDays??defaults?.query?.hybrid?.temporalDecay?.halfLifeDays??30}},cache={enabled:overrides?.cache?.enabled??defaults?.cache?.enabled??!0,maxEntries:overrides?.cache?.maxEntries??defaults?.cache?.maxEntries},overlap=clampNumber(chunking.overlap,0,Math.max(0,chunking.tokens-1)),minScore=clampNumber(query.minScore,0,1),{vectorWeight:normalizedVectorWeight,textWeight:normalizedTextWeight}=normalizeHybridWeights(hybrid.vectorWeight,hybrid.textWeight),candidateMultiplier=clampInt(hybrid.candidateMultiplier,1,20),temporalDecayHalfLifeDays=Math.max(1,Math.floor(Number.isFinite(hybrid.temporalDecay.halfLifeDays)?hybrid.temporalDecay.halfLifeDays:30)),deltaBytes=clampInt(sync.sessions.deltaBytes,0,2**53-1),deltaMessages=clampInt(sync.sessions.deltaMessages,0,2**53-1);return{enabled,sources,extraPaths,provider,remote,experimental:{sessionMemory},fallback,model,local,store,chunking:{tokens:Math.max(1,chunking.tokens),overlap},sync:{...sync,sessions:{deltaBytes,deltaMessages}},query:{...query,minScore,hybrid:{enabled:!!hybrid.enabled,vectorWeight:normalizedVectorWeight,textWeight:normalizedTextWeight,candidateMultiplier,mmr:{enabled:!!hybrid.mmr.enabled,lambda:Number.isFinite(hybrid.mmr.lambda)?Math.max(0,Math.min(1,hybrid.mmr.lambda)):DEFAULT_MMR_LAMBDA},temporalDecay:{enabled:!!hybrid.temporalDecay.enabled,halfLifeDays:temporalDecayHalfLifeDays}}},cache:{enabled:!!cache.enabled,maxEntries:typeof cache.maxEntries==`number`&&Number.isFinite(cache.maxEntries)?Math.max(1,Math.floor(cache.maxEntries)):void 0}}}function resolveMemorySearchConfig(cfg,agentId){let defaults=cfg.agents?.defaults?.memorySearch,overrides=resolveAgentConfig(cfg,agentId)?.memorySearch,resolved=mergeConfig(defaults,overrides,agentId);return resolved.enabled?resolved:null}const debugEmbeddings=isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_DEBUG_MEMORY_EMBEDDINGS),log$3=createSubsystemLogger(`memory/embeddings`);function debugEmbeddingsLog(message,meta){if(!debugEmbeddings)return;let suffix=meta?` ${JSON.stringify(meta)}`:``;log$3.raw(`${message}${suffix}`)}const DEFAULT_GEMINI_EMBEDDING_MODEL=`gemini-embedding-001`,GEMINI_MAX_INPUT_TOKENS={"text-embedding-004":2048};function resolveRemoteApiKey(remoteApiKey){let trimmed=remoteApiKey?.trim();if(trimmed)return trimmed===`GOOGLE_API_KEY`||trimmed===`GEMINI_API_KEY`?process.env[trimmed]?.trim():trimmed}function normalizeGeminiModel(model){let trimmed=model.trim();if(!trimmed)return DEFAULT_GEMINI_EMBEDDING_MODEL;let withoutPrefix=trimmed.replace(/^models\//,``);return withoutPrefix.startsWith(`gemini/`)||withoutPrefix.startsWith(`google/`)?withoutPrefix.slice(7):withoutPrefix}function normalizeGeminiBaseUrl(raw){let trimmed=normalizeBaseUrl(raw),openAiIndex=trimmed.indexOf(`/openai`);return openAiIndex>-1?trimmed.slice(0,openAiIndex):trimmed}function buildGeminiModelPath(model){return model.startsWith(`models/`)?model:`models/${model}`}async function createGeminiEmbeddingProvider(options){let client=await resolveGeminiEmbeddingClient(options),baseUrl=client.baseUrl.replace(/\/$/,``),embedUrl=`${baseUrl}/${client.modelPath}:embedContent`,batchUrl=`${baseUrl}/${client.modelPath}:batchEmbedContents`,fetchWithGeminiAuth=async(apiKey,endpoint,body)=>{let headers={...parseGeminiAuth(apiKey).headers,...client.headers},res=await fetch(endpoint,{method:`POST`,headers,body:JSON.stringify(body)});if(!res.ok){let payload=await res.text();throw Error(`gemini embeddings failed: ${res.status} ${payload}`)}return await res.json()};return{provider:{id:`gemini`,model:client.model,maxInputTokens:GEMINI_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>text.trim()?(await executeWithApiKeyRotation({provider:`google`,apiKeys:client.apiKeys,execute:apiKey=>fetchWithGeminiAuth(apiKey,embedUrl,{content:{parts:[{text}]},taskType:`RETRIEVAL_QUERY`})})).embedding?.values??[]:[],embedBatch:async texts=>{if(texts.length===0)return[];let requests=texts.map(text=>({model:client.modelPath,content:{parts:[{text}]},taskType:`RETRIEVAL_DOCUMENT`})),payload=await executeWithApiKeyRotation({provider:`google`,apiKeys:client.apiKeys,execute:apiKey=>fetchWithGeminiAuth(apiKey,batchUrl,{requests})}),embeddings=Array.isArray(payload.embeddings)?payload.embeddings:[];return texts.map((_,index)=>embeddings[index]?.values??[])}},client}}async function resolveGeminiEmbeddingClient(options){let remote=options.remote,remoteApiKey=resolveRemoteApiKey(remote?.apiKey),remoteBaseUrl=remote?.baseUrl?.trim(),apiKey=remoteApiKey||requireApiKey(await resolveApiKeyForProvider({provider:`google`,cfg:options.config,agentDir:options.agentDir}),`google`),providerConfig=options.config.models?.providers?.google,rawBaseUrl=remoteBaseUrl||providerConfig?.baseUrl?.trim()||`https://generativelanguage.googleapis.com/v1beta`,baseUrl=normalizeGeminiBaseUrl(rawBaseUrl),headers={...Object.assign({},providerConfig?.headers,remote?.headers)},apiKeys=collectProviderApiKeysForExecution({provider:`google`,primaryApiKey:apiKey}),model=normalizeGeminiModel(options.model),modelPath=buildGeminiModelPath(model);return debugEmbeddingsLog(`memory embeddings: gemini client`,{rawBaseUrl,baseUrl,model,modelPath,embedEndpoint:`${baseUrl}/${modelPath}:embedContent`,batchEndpoint:`${baseUrl}/${modelPath}:batchEmbedContents`}),{baseUrl,headers,model,modelPath,apiKeys}}async function resolveRemoteEmbeddingBearerClient(params){let remote=params.options.remote,remoteApiKey=remote?.apiKey?.trim(),remoteBaseUrl=remote?.baseUrl?.trim(),providerConfig=params.options.config.models?.providers?.[params.provider],apiKey=remoteApiKey||requireApiKey(await resolveApiKeyForProvider({provider:params.provider,cfg:params.options.config,agentDir:params.options.agentDir}),params.provider),baseUrl=remoteBaseUrl||providerConfig?.baseUrl?.trim()||params.defaultBaseUrl,headerOverrides=Object.assign({},providerConfig?.headers,remote?.headers);return{baseUrl,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${apiKey}`,...headerOverrides}}}async function fetchRemoteEmbeddingVectors(params){let res=await fetch(params.url,{method:`POST`,headers:params.headers,body:JSON.stringify(params.body)});if(!res.ok){let text=await res.text();throw Error(`${params.errorPrefix}: ${res.status} ${text}`)}return((await res.json()).data??[]).map(entry=>entry.embedding??[])}const DEFAULT_OPENAI_EMBEDDING_MODEL=`text-embedding-3-small`,OPENAI_MAX_INPUT_TOKENS={"text-embedding-3-small":8192,"text-embedding-3-large":8192,"text-embedding-ada-002":8191};function normalizeOpenAiModel(model){let trimmed=model.trim();return trimmed?trimmed.startsWith(`openai/`)?trimmed.slice(7):trimmed:DEFAULT_OPENAI_EMBEDDING_MODEL}async function createOpenAiEmbeddingProvider(options){let client=await resolveOpenAiEmbeddingClient(options),url=`${client.baseUrl.replace(/\/$/,``)}/embeddings`,embed=async input=>input.length===0?[]:await fetchRemoteEmbeddingVectors({url,headers:client.headers,body:{model:client.model,input},errorPrefix:`openai embeddings failed`});return{provider:{id:`openai`,model:client.model,maxInputTokens:OPENAI_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>{let[vec]=await embed([text]);return vec??[]},embedBatch:embed},client}}async function resolveOpenAiEmbeddingClient(options){let{baseUrl,headers}=await resolveRemoteEmbeddingBearerClient({provider:`openai`,options,defaultBaseUrl:`https://api.openai.com/v1`});return{baseUrl,headers,model:normalizeOpenAiModel(options.model)}}const DEFAULT_VOYAGE_EMBEDDING_MODEL=`voyage-4-large`,VOYAGE_MAX_INPUT_TOKENS={"voyage-3":32e3,"voyage-3-lite":16e3,"voyage-code-3":32e3};function normalizeVoyageModel(model){let trimmed=model.trim();return trimmed?trimmed.startsWith(`voyage/`)?trimmed.slice(7):trimmed:DEFAULT_VOYAGE_EMBEDDING_MODEL}async function createVoyageEmbeddingProvider(options){let client=await resolveVoyageEmbeddingClient(options),url=`${client.baseUrl.replace(/\/$/,``)}/embeddings`,embed=async(input,input_type)=>{if(input.length===0)return[];let body={model:client.model,input};return input_type&&(body.input_type=input_type),await fetchRemoteEmbeddingVectors({url,headers:client.headers,body,errorPrefix:`voyage embeddings failed`})};return{provider:{id:`voyage`,model:client.model,maxInputTokens:VOYAGE_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>{let[vec]=await embed([text],`query`);return vec??[]},embedBatch:async texts=>embed(texts,`document`)},client}}async function resolveVoyageEmbeddingClient(options){let{baseUrl,headers}=await resolveRemoteEmbeddingBearerClient({provider:`voyage`,options,defaultBaseUrl:`https://api.voyageai.com/v1`});return{baseUrl,headers,model:normalizeVoyageModel(options.model)}}async function importNodeLlamaCpp(){return import(`node-llama-cpp`)}function sanitizeAndNormalizeEmbedding(vec){let sanitized=vec.map(value=>Number.isFinite(value)?value:0),magnitude=Math.sqrt(sanitized.reduce((sum,value)=>sum+value*value,0));return magnitude<1e-10?sanitized:sanitized.map(value=>value/magnitude)}const REMOTE_EMBEDDING_PROVIDER_IDS=[`openai`,`gemini`,`voyage`];function canAutoSelectLocal(options){let modelPath=options.local?.modelPath?.trim();if(!modelPath||/^(hf:|https?:)/i.test(modelPath))return!1;let resolved=resolveUserPath(modelPath);try{return fs.statSync(resolved).isFile()}catch{return!1}}function isMissingApiKeyError(err){return formatErrorMessage(err).includes(`No API key found for provider`)}async function createLocalEmbeddingProvider(options){let modelPath=options.local?.modelPath?.trim()||`hf:ggml-org/embeddinggemma-300m-qat-q8_0-GGUF/embeddinggemma-300m-qat-Q8_0.gguf`,modelCacheDir=options.local?.modelCacheDir?.trim(),{getLlama,resolveModelFile,LlamaLogLevel}=await importNodeLlamaCpp(),llama=null,embeddingModel=null,embeddingContext=null,ensureContext=async()=>{if(llama||=await getLlama({logLevel:LlamaLogLevel.error}),!embeddingModel){let resolved=await resolveModelFile(modelPath,modelCacheDir||void 0);embeddingModel=await llama.loadModel({modelPath:resolved})}return embeddingContext||=await embeddingModel.createEmbeddingContext(),embeddingContext};return{id:`local`,model:modelPath,embedQuery:async text=>{let embedding=await(await ensureContext()).getEmbeddingFor(text);return sanitizeAndNormalizeEmbedding(Array.from(embedding.vector))},embedBatch:async texts=>{let ctx=await ensureContext();return await Promise.all(texts.map(async text=>{let embedding=await ctx.getEmbeddingFor(text);return sanitizeAndNormalizeEmbedding(Array.from(embedding.vector))}))}}}async function createEmbeddingProvider(options){let requestedProvider=options.provider,fallback=options.fallback,createProvider=async id=>{if(id===`local`)return{provider:await createLocalEmbeddingProvider(options)};if(id===`gemini`){let{provider,client}=await createGeminiEmbeddingProvider(options);return{provider,gemini:client}}if(id===`voyage`){let{provider,client}=await createVoyageEmbeddingProvider(options);return{provider,voyage:client}}let{provider,client}=await createOpenAiEmbeddingProvider(options);return{provider,openAi:client}},formatPrimaryError=(err,provider)=>provider===`local`?formatLocalSetupError(err):formatErrorMessage(err);if(requestedProvider===`auto`){let missingKeyErrors=[],localError=null;if(canAutoSelectLocal(options))try{return{...await createProvider(`local`),requestedProvider}}catch(err){localError=formatLocalSetupError(err)}for(let provider of REMOTE_EMBEDDING_PROVIDER_IDS)try{return{...await createProvider(provider),requestedProvider}}catch(err){let message=formatPrimaryError(err,provider);if(isMissingApiKeyError(err)){missingKeyErrors.push(message);continue}throw Error(message,{cause:err})}let details=[...missingKeyErrors,localError].filter(Boolean);return{provider:null,requestedProvider,providerUnavailableReason:details.length>0?details.join(`
1
+ import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import{E as truncateUtf16Safe,i as clampNumber,r as clampInt,y as resolveUserPath}from"./utils-BP60e80M.js";import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{Kt as requireApiKey,qt as resolveApiKeyForProvider}from"./auth-profiles-pt7Tr4HA.js";import{c as resolveAgentWorkspaceDir,i as resolveAgentDir,r as resolveAgentConfig}from"./agent-scope-CufEmNj_.js";import{t as normalizeBaseUrl}from"./normalize-base-url-D_sv6Zgt.js";import{n as formatErrorMessage}from"./errors-tAt19c1E.js";import{s as resolveSessionTranscriptsDirForAgent}from"./paths-ClsbsPQP.js";import{n as onSessionTranscriptUpdate}from"./transcript-events-XyildGuH.js";import{_ as runWithConcurrency,a as buildFileEntry,d as hashText,f as isMemoryPath,g as remapChunkLines,h as parseEmbedding,i as sessionPathForFile,m as normalizeExtraMemoryPaths,n as buildSessionEntry,o as chunkMarkdown,p as listMemoryFiles,r as listSessionFilesForAgent,s as ensureDir,t as requireNodeSqlite,u as getDefaultMemoryWatchPatterns}from"./sqlite-CIGM1WKg.js";import{n as collectProviderApiKeysForExecution,r as executeWithApiKeyRotation,t as parseGeminiAuth}from"./gemini-auth-DDR12zst.js";import{n as retryAsync}from"./retry-B151Hej5.js";import os from"node:os";import path from"node:path";import fs from"node:fs";import{randomUUID}from"node:crypto";import fs$1 from"node:fs/promises";import chokidar from"chokidar";import{createInterface}from"node:readline";import{Readable}from"node:stream";function tokenize$1(text){return text.toLowerCase().split(/[\s\W]+/).filter(Boolean)}function jaccardSimilarity(a,b){if(a.size===0&&b.size===0)return 1;let intersection=0;for(let token of a)b.has(token)&&intersection++;let union=a.size+b.size-intersection;return intersection/union}function cosineSimilarity(a,b){let n=Math.min(a.length,b.length),dot=0,na=0,nb=0;for(let i=0;i<n;i++)dot+=a[i]*b[i],na+=a[i]*a[i],nb+=b[i]*b[i];let denom=Math.sqrt(na)*Math.sqrt(nb);return denom===0?0:dot/denom}function mmrSelect(items,opts){let lambda=opts.lambda??.7,limit=Math.min(opts.topK??items.length,items.length),remaining=[...items],relevance=new Map;for(let item of remaining)relevance.set(item,opts.relevance(item));let selected=[];for(;selected.length<limit&&remaining.length>0;){let bestIdx=-1,bestScore=-1/0;for(let i=0;i<remaining.length;i++){let candidate=remaining[i],maxSimToSelected=0;for(let s of selected){let sim=opts.similarity(candidate,s);sim>maxSimToSelected&&(maxSimToSelected=sim)}let score=lambda*relevance.get(candidate)-(1-lambda)*maxSimToSelected;(score>bestScore||score===bestScore&&bestIdx>=0&&opts.tieScore!==void 0&&opts.tieScore(candidate)>opts.tieScore(remaining[bestIdx]))&&(bestScore=score,bestIdx=i)}if(bestIdx<0)break;selected.push(remaining.splice(bestIdx,1)[0])}return selected}function textMaximalMarginalRelevance(items,lambda=.7){if(items.length<=1)return[...items];let l=Math.max(0,Math.min(1,lambda));if(l===1)return[...items].sort((a,b)=>b.score-a.score);let tokens=new Map;for(let item of items)tokens.set(item.id,new Set(tokenize$1(item.content)));let tokensOf=item=>tokens.get(item.id)??new Set(tokenize$1(item.content)),scores=items.map(i=>i.score),min=Math.min(...scores),range=Math.max(...scores)-min;return mmrSelect(items,{relevance:item=>range===0?1:(item.score-min)/range,similarity:(a,b)=>jaccardSimilarity(tokensOf(a),tokensOf(b)),lambda:l,tieScore:item=>item.score})}const DEFAULT_HYBRID_VECTOR_WEIGHT$1=.7,DEFAULT_HYBRID_TEXT_WEIGHT$1=.3;function normalizeHybridWeights(vectorWeight,textWeight){let clamp=(n,fallback)=>typeof n==`number`&&Number.isFinite(n)?Math.max(0,n):fallback,v=clamp(vectorWeight,DEFAULT_HYBRID_VECTOR_WEIGHT$1),t=clamp(textWeight,DEFAULT_HYBRID_TEXT_WEIGHT$1),sum=v+t;return sum<=0?{vectorWeight:DEFAULT_HYBRID_VECTOR_WEIGHT$1,textWeight:DEFAULT_HYBRID_TEXT_WEIGHT$1}:{vectorWeight:v/sum,textWeight:t/sum}}function hybridScore(scores,weights){let v=Number.isFinite(scores.vectorScore)?scores.vectorScore:0,t=Number.isFinite(scores.textScore)?scores.textScore:0;return weights.vectorWeight*v+weights.textWeight*t}function bm25RankToScore$1(rank){return 1/(1+(Number.isFinite(rank)?Math.max(0,rank):999))}function toDecayLambda(halfLifeDays){return!Number.isFinite(halfLifeDays)||halfLifeDays<=0?0:Math.LN2/halfLifeDays}function calculateTemporalDecayMultiplier(params){let lambda=toDecayLambda(params.halfLifeDays),clampedAge=Math.max(0,params.ageInDays);return lambda<=0||!Number.isFinite(clampedAge)?1:Math.exp(-lambda*clampedAge)}function applyTemporalDecayToScore(params){return params.score*calculateTemporalDecayMultiplier(params)}const DEFAULT_MMR_LAMBDA=.7,DEFAULT_SOURCES=[`memory`];function normalizeSources(sources,sessionMemoryEnabled){let normalized=new Set,input=sources?.length?sources:DEFAULT_SOURCES;for(let source of input)source===`memory`&&normalized.add(`memory`),source===`sessions`&&sessionMemoryEnabled&&normalized.add(`sessions`);return normalized.size===0&&normalized.add(`memory`),Array.from(normalized)}function resolveStorePath(agentId,raw){let stateDir=resolveStateDir(process.env,os.homedir),fallback=path.join(stateDir,`memory`,`${agentId}.sqlite`);return raw?resolveUserPath(raw.includes(`{agentId}`)?raw.replaceAll(`{agentId}`,agentId):raw):fallback}function mergeConfig(defaults,overrides,agentId){let enabled=overrides?.enabled??defaults?.enabled??!0,sessionMemory=overrides?.experimental?.sessionMemory??defaults?.experimental?.sessionMemory??!1,provider=overrides?.provider??defaults?.provider??`auto`,defaultRemote=defaults?.remote,overrideRemote=overrides?.remote,includeRemote=!!(overrideRemote?.baseUrl||overrideRemote?.apiKey||overrideRemote?.headers||defaultRemote?.baseUrl||defaultRemote?.apiKey||defaultRemote?.headers)||provider===`openai`||provider===`gemini`||provider===`voyage`||provider===`auto`,batch={enabled:overrideRemote?.batch?.enabled??defaultRemote?.batch?.enabled??!1,wait:overrideRemote?.batch?.wait??defaultRemote?.batch?.wait??!0,concurrency:Math.max(1,overrideRemote?.batch?.concurrency??defaultRemote?.batch?.concurrency??2),pollIntervalMs:overrideRemote?.batch?.pollIntervalMs??defaultRemote?.batch?.pollIntervalMs??2e3,timeoutMinutes:overrideRemote?.batch?.timeoutMinutes??defaultRemote?.batch?.timeoutMinutes??60},remote=includeRemote?{baseUrl:overrideRemote?.baseUrl??defaultRemote?.baseUrl,apiKey:overrideRemote?.apiKey??defaultRemote?.apiKey,headers:overrideRemote?.headers??defaultRemote?.headers,batch}:void 0,fallback=overrides?.fallback??defaults?.fallback??`none`,modelDefault=provider===`gemini`?`gemini-embedding-001`:provider===`openai`?`text-embedding-3-small`:provider===`voyage`?`voyage-4-large`:void 0,model=overrides?.model??defaults?.model??modelDefault??``,local={modelPath:overrides?.local?.modelPath??defaults?.local?.modelPath,modelCacheDir:overrides?.local?.modelCacheDir??defaults?.local?.modelCacheDir},sources=normalizeSources(overrides?.sources??defaults?.sources,sessionMemory),rawPaths=[...defaults?.extraPaths??[],...overrides?.extraPaths??[]].map(value=>value.trim()).filter(Boolean),extraPaths=Array.from(new Set(rawPaths)),vector={enabled:overrides?.store?.vector?.enabled??defaults?.store?.vector?.enabled??!0,extensionPath:overrides?.store?.vector?.extensionPath??defaults?.store?.vector?.extensionPath},store={driver:overrides?.store?.driver??defaults?.store?.driver??`sqlite`,path:resolveStorePath(agentId,overrides?.store?.path??defaults?.store?.path),vector},chunking={tokens:overrides?.chunking?.tokens??defaults?.chunking?.tokens??400,overlap:overrides?.chunking?.overlap??defaults?.chunking?.overlap??80},sync={onSessionStart:overrides?.sync?.onSessionStart??defaults?.sync?.onSessionStart??!0,onSearch:overrides?.sync?.onSearch??defaults?.sync?.onSearch??!0,watch:overrides?.sync?.watch??defaults?.sync?.watch??!0,watchDebounceMs:overrides?.sync?.watchDebounceMs??defaults?.sync?.watchDebounceMs??1500,intervalMinutes:overrides?.sync?.intervalMinutes??defaults?.sync?.intervalMinutes??0,sessions:{deltaBytes:overrides?.sync?.sessions?.deltaBytes??defaults?.sync?.sessions?.deltaBytes??1e5,deltaMessages:overrides?.sync?.sessions?.deltaMessages??defaults?.sync?.sessions?.deltaMessages??50}},query={maxResults:overrides?.query?.maxResults??defaults?.query?.maxResults??6,minScore:overrides?.query?.minScore??defaults?.query?.minScore??.35},hybrid={enabled:overrides?.query?.hybrid?.enabled??defaults?.query?.hybrid?.enabled??!0,vectorWeight:overrides?.query?.hybrid?.vectorWeight??defaults?.query?.hybrid?.vectorWeight??.7,textWeight:overrides?.query?.hybrid?.textWeight??defaults?.query?.hybrid?.textWeight??.3,candidateMultiplier:overrides?.query?.hybrid?.candidateMultiplier??defaults?.query?.hybrid?.candidateMultiplier??4,mmr:{enabled:overrides?.query?.hybrid?.mmr?.enabled??defaults?.query?.hybrid?.mmr?.enabled??!1,lambda:overrides?.query?.hybrid?.mmr?.lambda??defaults?.query?.hybrid?.mmr?.lambda??DEFAULT_MMR_LAMBDA},temporalDecay:{enabled:overrides?.query?.hybrid?.temporalDecay?.enabled??defaults?.query?.hybrid?.temporalDecay?.enabled??!1,halfLifeDays:overrides?.query?.hybrid?.temporalDecay?.halfLifeDays??defaults?.query?.hybrid?.temporalDecay?.halfLifeDays??30}},cache={enabled:overrides?.cache?.enabled??defaults?.cache?.enabled??!0,maxEntries:overrides?.cache?.maxEntries??defaults?.cache?.maxEntries},overlap=clampNumber(chunking.overlap,0,Math.max(0,chunking.tokens-1)),minScore=clampNumber(query.minScore,0,1),{vectorWeight:normalizedVectorWeight,textWeight:normalizedTextWeight}=normalizeHybridWeights(hybrid.vectorWeight,hybrid.textWeight),candidateMultiplier=clampInt(hybrid.candidateMultiplier,1,20),temporalDecayHalfLifeDays=Math.max(1,Math.floor(Number.isFinite(hybrid.temporalDecay.halfLifeDays)?hybrid.temporalDecay.halfLifeDays:30)),deltaBytes=clampInt(sync.sessions.deltaBytes,0,2**53-1),deltaMessages=clampInt(sync.sessions.deltaMessages,0,2**53-1);return{enabled,sources,extraPaths,provider,remote,experimental:{sessionMemory},fallback,model,local,store,chunking:{tokens:Math.max(1,chunking.tokens),overlap},sync:{...sync,sessions:{deltaBytes,deltaMessages}},query:{...query,minScore,hybrid:{enabled:!!hybrid.enabled,vectorWeight:normalizedVectorWeight,textWeight:normalizedTextWeight,candidateMultiplier,mmr:{enabled:!!hybrid.mmr.enabled,lambda:Number.isFinite(hybrid.mmr.lambda)?Math.max(0,Math.min(1,hybrid.mmr.lambda)):DEFAULT_MMR_LAMBDA},temporalDecay:{enabled:!!hybrid.temporalDecay.enabled,halfLifeDays:temporalDecayHalfLifeDays}}},cache:{enabled:!!cache.enabled,maxEntries:typeof cache.maxEntries==`number`&&Number.isFinite(cache.maxEntries)?Math.max(1,Math.floor(cache.maxEntries)):void 0}}}function resolveMemorySearchConfig(cfg,agentId){let defaults=cfg.agents?.defaults?.memorySearch,overrides=resolveAgentConfig(cfg,agentId)?.memorySearch,resolved=mergeConfig(defaults,overrides,agentId);return resolved.enabled?resolved:null}const debugEmbeddings=isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_DEBUG_MEMORY_EMBEDDINGS),log$3=createSubsystemLogger(`memory/embeddings`);function debugEmbeddingsLog(message,meta){if(!debugEmbeddings)return;let suffix=meta?` ${JSON.stringify(meta)}`:``;log$3.raw(`${message}${suffix}`)}const DEFAULT_GEMINI_EMBEDDING_MODEL=`gemini-embedding-001`,GEMINI_MAX_INPUT_TOKENS={"text-embedding-004":2048};function resolveRemoteApiKey(remoteApiKey){let trimmed=remoteApiKey?.trim();if(trimmed)return trimmed===`GOOGLE_API_KEY`||trimmed===`GEMINI_API_KEY`?process.env[trimmed]?.trim():trimmed}function normalizeGeminiModel(model){let trimmed=model.trim();if(!trimmed)return DEFAULT_GEMINI_EMBEDDING_MODEL;let withoutPrefix=trimmed.replace(/^models\//,``);return withoutPrefix.startsWith(`gemini/`)||withoutPrefix.startsWith(`google/`)?withoutPrefix.slice(7):withoutPrefix}function normalizeGeminiBaseUrl(raw){let trimmed=normalizeBaseUrl(raw),openAiIndex=trimmed.indexOf(`/openai`);return openAiIndex>-1?trimmed.slice(0,openAiIndex):trimmed}function buildGeminiModelPath(model){return model.startsWith(`models/`)?model:`models/${model}`}async function createGeminiEmbeddingProvider(options){let client=await resolveGeminiEmbeddingClient(options),baseUrl=client.baseUrl.replace(/\/$/,``),embedUrl=`${baseUrl}/${client.modelPath}:embedContent`,batchUrl=`${baseUrl}/${client.modelPath}:batchEmbedContents`,fetchWithGeminiAuth=async(apiKey,endpoint,body)=>{let headers={...parseGeminiAuth(apiKey).headers,...client.headers},res=await fetch(endpoint,{method:`POST`,headers,body:JSON.stringify(body)});if(!res.ok){let payload=await res.text();throw Error(`gemini embeddings failed: ${res.status} ${payload}`)}return await res.json()};return{provider:{id:`gemini`,model:client.model,maxInputTokens:GEMINI_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>text.trim()?(await executeWithApiKeyRotation({provider:`google`,apiKeys:client.apiKeys,execute:apiKey=>fetchWithGeminiAuth(apiKey,embedUrl,{content:{parts:[{text}]},taskType:`RETRIEVAL_QUERY`})})).embedding?.values??[]:[],embedBatch:async texts=>{if(texts.length===0)return[];let requests=texts.map(text=>({model:client.modelPath,content:{parts:[{text}]},taskType:`RETRIEVAL_DOCUMENT`})),payload=await executeWithApiKeyRotation({provider:`google`,apiKeys:client.apiKeys,execute:apiKey=>fetchWithGeminiAuth(apiKey,batchUrl,{requests})}),embeddings=Array.isArray(payload.embeddings)?payload.embeddings:[];return texts.map((_,index)=>embeddings[index]?.values??[])}},client}}async function resolveGeminiEmbeddingClient(options){let remote=options.remote,remoteApiKey=resolveRemoteApiKey(remote?.apiKey),remoteBaseUrl=remote?.baseUrl?.trim(),apiKey=remoteApiKey||requireApiKey(await resolveApiKeyForProvider({provider:`google`,cfg:options.config,agentDir:options.agentDir}),`google`),providerConfig=options.config.models?.providers?.google,rawBaseUrl=remoteBaseUrl||providerConfig?.baseUrl?.trim()||`https://generativelanguage.googleapis.com/v1beta`,baseUrl=normalizeGeminiBaseUrl(rawBaseUrl),headers={...Object.assign({},providerConfig?.headers,remote?.headers)},apiKeys=collectProviderApiKeysForExecution({provider:`google`,primaryApiKey:apiKey}),model=normalizeGeminiModel(options.model),modelPath=buildGeminiModelPath(model);return debugEmbeddingsLog(`memory embeddings: gemini client`,{rawBaseUrl,baseUrl,model,modelPath,embedEndpoint:`${baseUrl}/${modelPath}:embedContent`,batchEndpoint:`${baseUrl}/${modelPath}:batchEmbedContents`}),{baseUrl,headers,model,modelPath,apiKeys}}async function resolveRemoteEmbeddingBearerClient(params){let remote=params.options.remote,remoteApiKey=remote?.apiKey?.trim(),remoteBaseUrl=remote?.baseUrl?.trim(),providerConfig=params.options.config.models?.providers?.[params.provider],apiKey=remoteApiKey||requireApiKey(await resolveApiKeyForProvider({provider:params.provider,cfg:params.options.config,agentDir:params.options.agentDir}),params.provider),baseUrl=remoteBaseUrl||providerConfig?.baseUrl?.trim()||params.defaultBaseUrl,headerOverrides=Object.assign({},providerConfig?.headers,remote?.headers);return{baseUrl,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${apiKey}`,...headerOverrides}}}async function fetchRemoteEmbeddingVectors(params){let res=await fetch(params.url,{method:`POST`,headers:params.headers,body:JSON.stringify(params.body)});if(!res.ok){let text=await res.text();throw Error(`${params.errorPrefix}: ${res.status} ${text}`)}return((await res.json()).data??[]).map(entry=>entry.embedding??[])}const DEFAULT_OPENAI_EMBEDDING_MODEL=`text-embedding-3-small`,OPENAI_MAX_INPUT_TOKENS={"text-embedding-3-small":8192,"text-embedding-3-large":8192,"text-embedding-ada-002":8191};function normalizeOpenAiModel(model){let trimmed=model.trim();return trimmed?trimmed.startsWith(`openai/`)?trimmed.slice(7):trimmed:DEFAULT_OPENAI_EMBEDDING_MODEL}async function createOpenAiEmbeddingProvider(options){let client=await resolveOpenAiEmbeddingClient(options),url=`${client.baseUrl.replace(/\/$/,``)}/embeddings`,embed=async input=>input.length===0?[]:await fetchRemoteEmbeddingVectors({url,headers:client.headers,body:{model:client.model,input},errorPrefix:`openai embeddings failed`});return{provider:{id:`openai`,model:client.model,maxInputTokens:OPENAI_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>{let[vec]=await embed([text]);return vec??[]},embedBatch:embed},client}}async function resolveOpenAiEmbeddingClient(options){let{baseUrl,headers}=await resolveRemoteEmbeddingBearerClient({provider:`openai`,options,defaultBaseUrl:`https://api.openai.com/v1`});return{baseUrl,headers,model:normalizeOpenAiModel(options.model)}}const DEFAULT_VOYAGE_EMBEDDING_MODEL=`voyage-4-large`,VOYAGE_MAX_INPUT_TOKENS={"voyage-3":32e3,"voyage-3-lite":16e3,"voyage-code-3":32e3};function normalizeVoyageModel(model){let trimmed=model.trim();return trimmed?trimmed.startsWith(`voyage/`)?trimmed.slice(7):trimmed:DEFAULT_VOYAGE_EMBEDDING_MODEL}async function createVoyageEmbeddingProvider(options){let client=await resolveVoyageEmbeddingClient(options),url=`${client.baseUrl.replace(/\/$/,``)}/embeddings`,embed=async(input,input_type)=>{if(input.length===0)return[];let body={model:client.model,input};return input_type&&(body.input_type=input_type),await fetchRemoteEmbeddingVectors({url,headers:client.headers,body,errorPrefix:`voyage embeddings failed`})};return{provider:{id:`voyage`,model:client.model,maxInputTokens:VOYAGE_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>{let[vec]=await embed([text],`query`);return vec??[]},embedBatch:async texts=>embed(texts,`document`)},client}}async function resolveVoyageEmbeddingClient(options){let{baseUrl,headers}=await resolveRemoteEmbeddingBearerClient({provider:`voyage`,options,defaultBaseUrl:`https://api.voyageai.com/v1`});return{baseUrl,headers,model:normalizeVoyageModel(options.model)}}async function importNodeLlamaCpp(){return import(`node-llama-cpp`)}function sanitizeAndNormalizeEmbedding(vec){let sanitized=vec.map(value=>Number.isFinite(value)?value:0),magnitude=Math.sqrt(sanitized.reduce((sum,value)=>sum+value*value,0));return magnitude<1e-10?sanitized:sanitized.map(value=>value/magnitude)}const REMOTE_EMBEDDING_PROVIDER_IDS=[`openai`,`gemini`,`voyage`];function canAutoSelectLocal(options){let modelPath=options.local?.modelPath?.trim();if(!modelPath||/^(hf:|https?:)/i.test(modelPath))return!1;let resolved=resolveUserPath(modelPath);try{return fs.statSync(resolved).isFile()}catch{return!1}}function isMissingApiKeyError(err){return formatErrorMessage(err).includes(`No API key found for provider`)}async function createLocalEmbeddingProvider(options){let modelPath=options.local?.modelPath?.trim()||`hf:ggml-org/embeddinggemma-300m-qat-q8_0-GGUF/embeddinggemma-300m-qat-Q8_0.gguf`,modelCacheDir=options.local?.modelCacheDir?.trim(),{getLlama,resolveModelFile,LlamaLogLevel}=await importNodeLlamaCpp(),llama=null,embeddingModel=null,embeddingContext=null,ensureContext=async()=>{if(llama||=await getLlama({logLevel:LlamaLogLevel.error}),!embeddingModel){let resolved=await resolveModelFile(modelPath,modelCacheDir||void 0);embeddingModel=await llama.loadModel({modelPath:resolved})}return embeddingContext||=await embeddingModel.createEmbeddingContext(),embeddingContext};return{id:`local`,model:modelPath,embedQuery:async text=>{let embedding=await(await ensureContext()).getEmbeddingFor(text);return sanitizeAndNormalizeEmbedding(Array.from(embedding.vector))},embedBatch:async texts=>{let ctx=await ensureContext();return await Promise.all(texts.map(async text=>{let embedding=await ctx.getEmbeddingFor(text);return sanitizeAndNormalizeEmbedding(Array.from(embedding.vector))}))}}}async function createEmbeddingProvider(options){let requestedProvider=options.provider,fallback=options.fallback,createProvider=async id=>{if(id===`local`)return{provider:await createLocalEmbeddingProvider(options)};if(id===`gemini`){let{provider,client}=await createGeminiEmbeddingProvider(options);return{provider,gemini:client}}if(id===`voyage`){let{provider,client}=await createVoyageEmbeddingProvider(options);return{provider,voyage:client}}let{provider,client}=await createOpenAiEmbeddingProvider(options);return{provider,openAi:client}},formatPrimaryError=(err,provider)=>provider===`local`?formatLocalSetupError(err):formatErrorMessage(err);if(requestedProvider===`auto`){let missingKeyErrors=[],localError=null;if(canAutoSelectLocal(options))try{return{...await createProvider(`local`),requestedProvider}}catch(err){localError=formatLocalSetupError(err)}for(let provider of REMOTE_EMBEDDING_PROVIDER_IDS)try{return{...await createProvider(provider),requestedProvider}}catch(err){let message=formatPrimaryError(err,provider);if(isMissingApiKeyError(err)){missingKeyErrors.push(message);continue}throw Error(message,{cause:err})}let details=[...missingKeyErrors,localError].filter(Boolean);return{provider:null,requestedProvider,providerUnavailableReason:details.length>0?details.join(`
2
2
 
3
3
  `):`No embeddings provider available.`}}try{return{...await createProvider(requestedProvider),requestedProvider}}catch(primaryErr){let reason=formatPrimaryError(primaryErr,requestedProvider);if(fallback&&fallback!==`none`&&fallback!==requestedProvider)try{return{...await createProvider(fallback),requestedProvider,fallbackFrom:requestedProvider,fallbackReason:reason}}catch(fallbackErr){let combinedReason=`${reason}\n\nFallback to ${fallback} failed: ${formatErrorMessage(fallbackErr)}`;if(isMissingApiKeyError(primaryErr)&&isMissingApiKeyError(fallbackErr))return{provider:null,requestedProvider,fallbackFrom:requestedProvider,fallbackReason:reason,providerUnavailableReason:combinedReason};throw Error(combinedReason,{cause:fallbackErr})}if(isMissingApiKeyError(primaryErr))return{provider:null,requestedProvider,providerUnavailableReason:reason};throw Error(reason,{cause:primaryErr})}}function isNodeLlamaCppMissing(err){return err instanceof Error&&err.code===`ERR_MODULE_NOT_FOUND`?err.message.includes(`node-llama-cpp`):!1}function formatLocalSetupError(err){let detail=formatErrorMessage(err),missing=isNodeLlamaCppMissing(err);return[`Local embeddings unavailable.`,missing?`Reason: optional dependency node-llama-cpp is missing (or failed to install).`:detail?`Reason: ${detail}`:void 0,missing&&detail?`Detail: ${detail}`:null,`To enable local embeddings:`,`1) Use Node 22 LTS (recommended for installs/updates)`,missing?`2) Reinstall BuilderForceAgents (this should install node-llama-cpp): npm i -g @seanhogg/builderforce-agents@latest`:null,`3) If you use pnpm: pnpm approve-builds (select node-llama-cpp), then pnpm rebuild node-llama-cpp`,...REMOTE_EMBEDDING_PROVIDER_IDS.map(provider=>`Or set agents.defaults.memorySearch.provider = "${provider}" (remote).`)].filter(Boolean).join(`
4
4
  `)}const DEFAULT_MMR_CONFIG={enabled:!1,lambda:.7};function mmrRerank(items,config={}){let{enabled=DEFAULT_MMR_CONFIG.enabled,lambda=DEFAULT_MMR_CONFIG.lambda}=config;return!enabled||items.length<=1?[...items]:textMaximalMarginalRelevance(items,lambda)}function applyMMRToHybridResults(results,config={}){if(results.length===0)return results;let itemById=new Map;return mmrRerank(results.map((r,index)=>{let id=`${r.path}:${r.startLine}:${index}`;return itemById.set(id,r),{id,score:r.score,content:r.snippet}}),config).map(item=>itemById.get(item.id))}const DEFAULT_TEMPORAL_DECAY_CONFIG={enabled:!1,halfLifeDays:30},DATED_MEMORY_PATH_RE=/(?:^|\/)memory\/(\d{4})-(\d{2})-(\d{2})\.md$/;function parseMemoryDateFromPath(filePath){let normalized=filePath.replaceAll(`\\`,`/`).replace(/^\.\//,``),match=DATED_MEMORY_PATH_RE.exec(normalized);if(!match)return null;let year=Number(match[1]),month=Number(match[2]),day=Number(match[3]);if(!Number.isInteger(year)||!Number.isInteger(month)||!Number.isInteger(day))return null;let timestamp=Date.UTC(year,month-1,day),parsed=new Date(timestamp);return parsed.getUTCFullYear()!==year||parsed.getUTCMonth()!==month-1||parsed.getUTCDate()!==day?null:parsed}function isEvergreenMemoryPath(filePath){let normalized=filePath.replaceAll(`\\`,`/`).replace(/^\.\//,``);return normalized===`MEMORY.md`||normalized===`memory.md`||normalized===`.builderforce/MEMORY.md`||normalized===`.builderforce/memory.md`?!0:!normalized.startsWith(`memory/`)&&!normalized.startsWith(`.builderforce/memory/`)?!1:!DATED_MEMORY_PATH_RE.test(normalized)}async function extractTimestamp(params){let fromPath=parseMemoryDateFromPath(params.filePath);if(fromPath)return fromPath;if(params.source===`memory`&&isEvergreenMemoryPath(params.filePath)||!params.workspaceDir)return null;let absolutePath=path.isAbsolute(params.filePath)?params.filePath:path.resolve(params.workspaceDir,params.filePath);try{let stat=await fs$1.stat(absolutePath);return Number.isFinite(stat.mtimeMs)?new Date(stat.mtimeMs):null}catch{return null}}function ageInDaysFromTimestamp(timestamp,nowMs){return Math.max(0,nowMs-timestamp.getTime())/864e5}async function applyTemporalDecayToHybridResults(params){let config={...DEFAULT_TEMPORAL_DECAY_CONFIG,...params.temporalDecay};if(!config.enabled)return[...params.results];let nowMs=params.nowMs??Date.now(),timestampPromiseCache=new Map;return Promise.all(params.results.map(async entry=>{let cacheKey=`${entry.source}:${entry.path}`,timestampPromise=timestampPromiseCache.get(cacheKey);timestampPromise||(timestampPromise=extractTimestamp({filePath:entry.path,source:entry.source,workspaceDir:params.workspaceDir}),timestampPromiseCache.set(cacheKey,timestampPromise));let timestamp=await timestampPromise;if(!timestamp)return entry;let decayedScore=applyTemporalDecayToScore({score:entry.score,ageInDays:ageInDaysFromTimestamp(timestamp,nowMs),halfLifeDays:config.halfLifeDays});return{...entry,score:decayedScore}}))}function buildFtsQuery(raw){let tokens=raw.match(/[\p{L}\p{N}_]+/gu)?.map(t=>t.trim()).filter(Boolean)??[];return tokens.length===0?null:tokens.map(t=>`"${t.replaceAll(`"`,``)}"`).join(` AND `)}const bm25RankToScore=bm25RankToScore$1;async function mergeHybridResults(params){let byId=new Map;for(let r of params.vector)byId.set(r.id,{id:r.id,path:r.path,startLine:r.startLine,endLine:r.endLine,source:r.source,snippet:r.snippet,vectorScore:r.vectorScore,textScore:0});for(let r of params.keyword){let existing=byId.get(r.id);existing?(existing.textScore=r.textScore,r.snippet&&r.snippet.length>0&&(existing.snippet=r.snippet)):byId.set(r.id,{id:r.id,path:r.path,startLine:r.startLine,endLine:r.endLine,source:r.source,snippet:r.snippet,vectorScore:0,textScore:r.textScore})}let weights=normalizeHybridWeights(params.vectorWeight,params.textWeight),sorted=(await applyTemporalDecayToHybridResults({results:Array.from(byId.values()).map(entry=>{let score=hybridScore({vectorScore:entry.vectorScore,textScore:entry.textScore},weights);return{path:entry.path,startLine:entry.startLine,endLine:entry.endLine,score,snippet:entry.snippet,source:entry.source}}),temporalDecay:{...DEFAULT_TEMPORAL_DECAY_CONFIG,...params.temporalDecay},workspaceDir:params.workspaceDir,nowMs:params.nowMs})).toSorted((a,b)=>b.score-a.score),mmrConfig={...DEFAULT_MMR_CONFIG,...params.mmr};return mmrConfig.enabled?applyMMRToHybridResults(sorted,mmrConfig):sorted}function normalizeBatchBaseUrl(client){return client.baseUrl?.replace(/\/$/,``)??``}function buildBatchHeaders(client,params){let headers=client.headers?{...client.headers}:{};return params.json?!headers[`Content-Type`]&&!headers[`content-type`]&&(headers[`Content-Type`]=`application/json`):(delete headers[`Content-Type`],delete headers[`content-type`]),headers}function splitBatchRequests(requests,maxRequests){if(requests.length<=maxRequests)return[requests];let groups=[];for(let i=0;i<requests.length;i+=maxRequests)groups.push(requests.slice(i,i+maxRequests));return groups}async function runEmbeddingBatchGroups(params){if(params.requests.length===0)return new Map;let groups=splitBatchRequests(params.requests,params.maxRequests),byCustomId=new Map,tasks=groups.map((group,groupIndex)=>async()=>{await params.runGroup({group,groupIndex,groups:groups.length,byCustomId})});return params.debug?.(params.debugLabel,{requests:params.requests.length,groups:groups.length,wait:params.wait,concurrency:params.concurrency,pollIntervalMs:params.pollIntervalMs,timeoutMs:params.timeoutMs}),await runWithConcurrency(tasks,params.concurrency),byCustomId}function getGeminiUploadUrl(baseUrl){return baseUrl.includes(`/v1beta`)?baseUrl.replace(/\/v1beta\/?$/,`/upload/v1beta`):`${baseUrl.replace(/\/$/,``)}/upload`}function buildGeminiUploadBody(params){let boundary=`builderforce-${hashText(params.displayName)}`,jsonPart=JSON.stringify({file:{displayName:params.displayName,mimeType:`application/jsonl`}}),delimiter=`--${boundary}\r\n`,closeDelimiter=`--${boundary}--\r\n`,parts=[`${delimiter}Content-Type: application/json; charset=UTF-8\r\n\r\n${jsonPart}\r\n`,`${delimiter}Content-Type: application/jsonl; charset=UTF-8\r\n\r\n${params.jsonl}\r\n`,closeDelimiter];return{body:new Blob([parts.join(``)],{type:`multipart/related`}),contentType:`multipart/related; boundary=${boundary}`}}async function submitGeminiBatch(params){let baseUrl=normalizeBatchBaseUrl(params.gemini),uploadPayload=buildGeminiUploadBody({jsonl:params.requests.map(request=>JSON.stringify({key:request.custom_id,request:{content:request.content,task_type:request.taskType}})).join(`
@@ -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"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-DJ6rztqJ.js";import"./api-key-rotation-CHBjUwUJ.js";import"./sqlite-C39E12XS.js";import{t as MemoryIndexManager}from"./manager-DwywI_5-.js";import"./retry-DlVhg5qu.js";export{MemoryIndexManager};
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"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-DJ6rztqJ.js";import"./api-key-rotation-CyCi-UqR.js";import"./sqlite-C39E12XS.js";import{t as MemoryIndexManager}from"./manager-DSz61dXv.js";import"./retry-DlVhg5qu.js";export{MemoryIndexManager};
@@ -1 +1 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-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"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./paths-ClsbsPQP.js";import"./sqlite-CIGM1WKg.js";import{t as MemoryIndexManager}from"./manager-CRba8roB.js";import"./gemini-auth-CkD5jCPh.js";import"./retry-B151Hej5.js";export{MemoryIndexManager};
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-pt7Tr4HA.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./paths-ClsbsPQP.js";import"./sqlite-CIGM1WKg.js";import{t as MemoryIndexManager}from"./manager-BeohB4-8.js";import"./gemini-auth-DDR12zst.js";import"./retry-B151Hej5.js";export{MemoryIndexManager};
@@ -1,4 +1,4 @@
1
- import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{D as truncateUtf16Safe,a as clampNumber,b as resolveUserPath,i as clampInt}from"./utils-DbaBVFaK.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{c as resolveAgentWorkspaceDir,i as resolveAgentDir,r as resolveAgentConfig}from"./agent-scope-DPtjOxzp.js";import{vt as requireApiKey,yt as resolveApiKeyForProvider}from"./model-selection-9bRFKBI_.js";import{t as normalizeBaseUrl}from"./normalize-base-url-DmugqkQ6.js";import{t as isTruthyEnvValue}from"./env-BIdU5BAp.js";import{n as formatErrorMessage}from"./errors-B1MIg3g-.js";import{s as resolveSessionTranscriptsDirForAgent}from"./paths-DJ6rztqJ.js";import{n as onSessionTranscriptUpdate}from"./transcript-events-C4rFYweQ.js";import{n as executeWithApiKeyRotation,r as parseGeminiAuth,t as collectProviderApiKeysForExecution}from"./api-key-rotation-CHBjUwUJ.js";import{_ as runWithConcurrency,a as buildFileEntry,d as hashText,f as isMemoryPath,g as remapChunkLines,h as parseEmbedding,i as sessionPathForFile,m as normalizeExtraMemoryPaths,n as buildSessionEntry,o as chunkMarkdown,p as listMemoryFiles,r as listSessionFilesForAgent,s as ensureDir,t as requireNodeSqlite,u as getDefaultMemoryWatchPatterns}from"./sqlite-C39E12XS.js";import{n as retryAsync}from"./retry-DlVhg5qu.js";import fs from"node:fs";import os from"node:os";import path from"node:path";import{randomUUID}from"node:crypto";import fs$1 from"node:fs/promises";import{createInterface}from"node:readline";import{Readable}from"node:stream";import chokidar from"chokidar";function tokenize$1(text){return text.toLowerCase().split(/[\s\W]+/).filter(Boolean)}function jaccardSimilarity(a,b){if(a.size===0&&b.size===0)return 1;let intersection=0;for(let token of a)b.has(token)&&intersection++;let union=a.size+b.size-intersection;return intersection/union}function cosineSimilarity(a,b){let n=Math.min(a.length,b.length),dot=0,na=0,nb=0;for(let i=0;i<n;i++)dot+=a[i]*b[i],na+=a[i]*a[i],nb+=b[i]*b[i];let denom=Math.sqrt(na)*Math.sqrt(nb);return denom===0?0:dot/denom}function mmrSelect(items,opts){let lambda=opts.lambda??.7,limit=Math.min(opts.topK??items.length,items.length),remaining=[...items],relevance=new Map;for(let item of remaining)relevance.set(item,opts.relevance(item));let selected=[];for(;selected.length<limit&&remaining.length>0;){let bestIdx=-1,bestScore=-1/0;for(let i=0;i<remaining.length;i++){let candidate=remaining[i],maxSimToSelected=0;for(let s of selected){let sim=opts.similarity(candidate,s);sim>maxSimToSelected&&(maxSimToSelected=sim)}let score=lambda*relevance.get(candidate)-(1-lambda)*maxSimToSelected;(score>bestScore||score===bestScore&&bestIdx>=0&&opts.tieScore!==void 0&&opts.tieScore(candidate)>opts.tieScore(remaining[bestIdx]))&&(bestScore=score,bestIdx=i)}if(bestIdx<0)break;selected.push(remaining.splice(bestIdx,1)[0])}return selected}function textMaximalMarginalRelevance(items,lambda=.7){if(items.length<=1)return[...items];let l=Math.max(0,Math.min(1,lambda));if(l===1)return[...items].sort((a,b)=>b.score-a.score);let tokens=new Map;for(let item of items)tokens.set(item.id,new Set(tokenize$1(item.content)));let tokensOf=item=>tokens.get(item.id)??new Set(tokenize$1(item.content)),scores=items.map(i=>i.score),min=Math.min(...scores),range=Math.max(...scores)-min;return mmrSelect(items,{relevance:item=>range===0?1:(item.score-min)/range,similarity:(a,b)=>jaccardSimilarity(tokensOf(a),tokensOf(b)),lambda:l,tieScore:item=>item.score})}const DEFAULT_HYBRID_VECTOR_WEIGHT$1=.7,DEFAULT_HYBRID_TEXT_WEIGHT$1=.3;function normalizeHybridWeights(vectorWeight,textWeight){let clamp=(n,fallback)=>typeof n==`number`&&Number.isFinite(n)?Math.max(0,n):fallback,v=clamp(vectorWeight,DEFAULT_HYBRID_VECTOR_WEIGHT$1),t=clamp(textWeight,DEFAULT_HYBRID_TEXT_WEIGHT$1),sum=v+t;return sum<=0?{vectorWeight:DEFAULT_HYBRID_VECTOR_WEIGHT$1,textWeight:DEFAULT_HYBRID_TEXT_WEIGHT$1}:{vectorWeight:v/sum,textWeight:t/sum}}function hybridScore(scores,weights){let v=Number.isFinite(scores.vectorScore)?scores.vectorScore:0,t=Number.isFinite(scores.textScore)?scores.textScore:0;return weights.vectorWeight*v+weights.textWeight*t}function bm25RankToScore$1(rank){return 1/(1+(Number.isFinite(rank)?Math.max(0,rank):999))}function toDecayLambda(halfLifeDays){return!Number.isFinite(halfLifeDays)||halfLifeDays<=0?0:Math.LN2/halfLifeDays}function calculateTemporalDecayMultiplier(params){let lambda=toDecayLambda(params.halfLifeDays),clampedAge=Math.max(0,params.ageInDays);return lambda<=0||!Number.isFinite(clampedAge)?1:Math.exp(-lambda*clampedAge)}function applyTemporalDecayToScore(params){return params.score*calculateTemporalDecayMultiplier(params)}const DEFAULT_MMR_LAMBDA=.7,DEFAULT_SOURCES=[`memory`];function normalizeSources(sources,sessionMemoryEnabled){let normalized=new Set,input=sources?.length?sources:DEFAULT_SOURCES;for(let source of input)source===`memory`&&normalized.add(`memory`),source===`sessions`&&sessionMemoryEnabled&&normalized.add(`sessions`);return normalized.size===0&&normalized.add(`memory`),Array.from(normalized)}function resolveStorePath(agentId,raw){let stateDir=resolveStateDir(process.env,os.homedir),fallback=path.join(stateDir,`memory`,`${agentId}.sqlite`);return raw?resolveUserPath(raw.includes(`{agentId}`)?raw.replaceAll(`{agentId}`,agentId):raw):fallback}function mergeConfig(defaults,overrides,agentId){let enabled=overrides?.enabled??defaults?.enabled??!0,sessionMemory=overrides?.experimental?.sessionMemory??defaults?.experimental?.sessionMemory??!1,provider=overrides?.provider??defaults?.provider??`auto`,defaultRemote=defaults?.remote,overrideRemote=overrides?.remote,includeRemote=!!(overrideRemote?.baseUrl||overrideRemote?.apiKey||overrideRemote?.headers||defaultRemote?.baseUrl||defaultRemote?.apiKey||defaultRemote?.headers)||provider===`openai`||provider===`gemini`||provider===`voyage`||provider===`auto`,batch={enabled:overrideRemote?.batch?.enabled??defaultRemote?.batch?.enabled??!1,wait:overrideRemote?.batch?.wait??defaultRemote?.batch?.wait??!0,concurrency:Math.max(1,overrideRemote?.batch?.concurrency??defaultRemote?.batch?.concurrency??2),pollIntervalMs:overrideRemote?.batch?.pollIntervalMs??defaultRemote?.batch?.pollIntervalMs??2e3,timeoutMinutes:overrideRemote?.batch?.timeoutMinutes??defaultRemote?.batch?.timeoutMinutes??60},remote=includeRemote?{baseUrl:overrideRemote?.baseUrl??defaultRemote?.baseUrl,apiKey:overrideRemote?.apiKey??defaultRemote?.apiKey,headers:overrideRemote?.headers??defaultRemote?.headers,batch}:void 0,fallback=overrides?.fallback??defaults?.fallback??`none`,modelDefault=provider===`gemini`?`gemini-embedding-001`:provider===`openai`?`text-embedding-3-small`:provider===`voyage`?`voyage-4-large`:void 0,model=overrides?.model??defaults?.model??modelDefault??``,local={modelPath:overrides?.local?.modelPath??defaults?.local?.modelPath,modelCacheDir:overrides?.local?.modelCacheDir??defaults?.local?.modelCacheDir},sources=normalizeSources(overrides?.sources??defaults?.sources,sessionMemory),rawPaths=[...defaults?.extraPaths??[],...overrides?.extraPaths??[]].map(value=>value.trim()).filter(Boolean),extraPaths=Array.from(new Set(rawPaths)),vector={enabled:overrides?.store?.vector?.enabled??defaults?.store?.vector?.enabled??!0,extensionPath:overrides?.store?.vector?.extensionPath??defaults?.store?.vector?.extensionPath},store={driver:overrides?.store?.driver??defaults?.store?.driver??`sqlite`,path:resolveStorePath(agentId,overrides?.store?.path??defaults?.store?.path),vector},chunking={tokens:overrides?.chunking?.tokens??defaults?.chunking?.tokens??400,overlap:overrides?.chunking?.overlap??defaults?.chunking?.overlap??80},sync={onSessionStart:overrides?.sync?.onSessionStart??defaults?.sync?.onSessionStart??!0,onSearch:overrides?.sync?.onSearch??defaults?.sync?.onSearch??!0,watch:overrides?.sync?.watch??defaults?.sync?.watch??!0,watchDebounceMs:overrides?.sync?.watchDebounceMs??defaults?.sync?.watchDebounceMs??1500,intervalMinutes:overrides?.sync?.intervalMinutes??defaults?.sync?.intervalMinutes??0,sessions:{deltaBytes:overrides?.sync?.sessions?.deltaBytes??defaults?.sync?.sessions?.deltaBytes??1e5,deltaMessages:overrides?.sync?.sessions?.deltaMessages??defaults?.sync?.sessions?.deltaMessages??50}},query={maxResults:overrides?.query?.maxResults??defaults?.query?.maxResults??6,minScore:overrides?.query?.minScore??defaults?.query?.minScore??.35},hybrid={enabled:overrides?.query?.hybrid?.enabled??defaults?.query?.hybrid?.enabled??!0,vectorWeight:overrides?.query?.hybrid?.vectorWeight??defaults?.query?.hybrid?.vectorWeight??.7,textWeight:overrides?.query?.hybrid?.textWeight??defaults?.query?.hybrid?.textWeight??.3,candidateMultiplier:overrides?.query?.hybrid?.candidateMultiplier??defaults?.query?.hybrid?.candidateMultiplier??4,mmr:{enabled:overrides?.query?.hybrid?.mmr?.enabled??defaults?.query?.hybrid?.mmr?.enabled??!1,lambda:overrides?.query?.hybrid?.mmr?.lambda??defaults?.query?.hybrid?.mmr?.lambda??DEFAULT_MMR_LAMBDA},temporalDecay:{enabled:overrides?.query?.hybrid?.temporalDecay?.enabled??defaults?.query?.hybrid?.temporalDecay?.enabled??!1,halfLifeDays:overrides?.query?.hybrid?.temporalDecay?.halfLifeDays??defaults?.query?.hybrid?.temporalDecay?.halfLifeDays??30}},cache={enabled:overrides?.cache?.enabled??defaults?.cache?.enabled??!0,maxEntries:overrides?.cache?.maxEntries??defaults?.cache?.maxEntries},overlap=clampNumber(chunking.overlap,0,Math.max(0,chunking.tokens-1)),minScore=clampNumber(query.minScore,0,1),{vectorWeight:normalizedVectorWeight,textWeight:normalizedTextWeight}=normalizeHybridWeights(hybrid.vectorWeight,hybrid.textWeight),candidateMultiplier=clampInt(hybrid.candidateMultiplier,1,20),temporalDecayHalfLifeDays=Math.max(1,Math.floor(Number.isFinite(hybrid.temporalDecay.halfLifeDays)?hybrid.temporalDecay.halfLifeDays:30)),deltaBytes=clampInt(sync.sessions.deltaBytes,0,2**53-1),deltaMessages=clampInt(sync.sessions.deltaMessages,0,2**53-1);return{enabled,sources,extraPaths,provider,remote,experimental:{sessionMemory},fallback,model,local,store,chunking:{tokens:Math.max(1,chunking.tokens),overlap},sync:{...sync,sessions:{deltaBytes,deltaMessages}},query:{...query,minScore,hybrid:{enabled:!!hybrid.enabled,vectorWeight:normalizedVectorWeight,textWeight:normalizedTextWeight,candidateMultiplier,mmr:{enabled:!!hybrid.mmr.enabled,lambda:Number.isFinite(hybrid.mmr.lambda)?Math.max(0,Math.min(1,hybrid.mmr.lambda)):DEFAULT_MMR_LAMBDA},temporalDecay:{enabled:!!hybrid.temporalDecay.enabled,halfLifeDays:temporalDecayHalfLifeDays}}},cache:{enabled:!!cache.enabled,maxEntries:typeof cache.maxEntries==`number`&&Number.isFinite(cache.maxEntries)?Math.max(1,Math.floor(cache.maxEntries)):void 0}}}function resolveMemorySearchConfig(cfg,agentId){let defaults=cfg.agents?.defaults?.memorySearch,overrides=resolveAgentConfig(cfg,agentId)?.memorySearch,resolved=mergeConfig(defaults,overrides,agentId);return resolved.enabled?resolved:null}const debugEmbeddings=isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_DEBUG_MEMORY_EMBEDDINGS),log$3=createSubsystemLogger(`memory/embeddings`);function debugEmbeddingsLog(message,meta){if(!debugEmbeddings)return;let suffix=meta?` ${JSON.stringify(meta)}`:``;log$3.raw(`${message}${suffix}`)}const DEFAULT_GEMINI_EMBEDDING_MODEL=`gemini-embedding-001`,GEMINI_MAX_INPUT_TOKENS={"text-embedding-004":2048};function resolveRemoteApiKey(remoteApiKey){let trimmed=remoteApiKey?.trim();if(trimmed)return trimmed===`GOOGLE_API_KEY`||trimmed===`GEMINI_API_KEY`?process.env[trimmed]?.trim():trimmed}function normalizeGeminiModel(model){let trimmed=model.trim();if(!trimmed)return DEFAULT_GEMINI_EMBEDDING_MODEL;let withoutPrefix=trimmed.replace(/^models\//,``);return withoutPrefix.startsWith(`gemini/`)||withoutPrefix.startsWith(`google/`)?withoutPrefix.slice(7):withoutPrefix}function normalizeGeminiBaseUrl(raw){let trimmed=normalizeBaseUrl(raw),openAiIndex=trimmed.indexOf(`/openai`);return openAiIndex>-1?trimmed.slice(0,openAiIndex):trimmed}function buildGeminiModelPath(model){return model.startsWith(`models/`)?model:`models/${model}`}async function createGeminiEmbeddingProvider(options){let client=await resolveGeminiEmbeddingClient(options),baseUrl=client.baseUrl.replace(/\/$/,``),embedUrl=`${baseUrl}/${client.modelPath}:embedContent`,batchUrl=`${baseUrl}/${client.modelPath}:batchEmbedContents`,fetchWithGeminiAuth=async(apiKey,endpoint,body)=>{let headers={...parseGeminiAuth(apiKey).headers,...client.headers},res=await fetch(endpoint,{method:`POST`,headers,body:JSON.stringify(body)});if(!res.ok){let payload=await res.text();throw Error(`gemini embeddings failed: ${res.status} ${payload}`)}return await res.json()};return{provider:{id:`gemini`,model:client.model,maxInputTokens:GEMINI_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>text.trim()?(await executeWithApiKeyRotation({provider:`google`,apiKeys:client.apiKeys,execute:apiKey=>fetchWithGeminiAuth(apiKey,embedUrl,{content:{parts:[{text}]},taskType:`RETRIEVAL_QUERY`})})).embedding?.values??[]:[],embedBatch:async texts=>{if(texts.length===0)return[];let requests=texts.map(text=>({model:client.modelPath,content:{parts:[{text}]},taskType:`RETRIEVAL_DOCUMENT`})),payload=await executeWithApiKeyRotation({provider:`google`,apiKeys:client.apiKeys,execute:apiKey=>fetchWithGeminiAuth(apiKey,batchUrl,{requests})}),embeddings=Array.isArray(payload.embeddings)?payload.embeddings:[];return texts.map((_,index)=>embeddings[index]?.values??[])}},client}}async function resolveGeminiEmbeddingClient(options){let remote=options.remote,remoteApiKey=resolveRemoteApiKey(remote?.apiKey),remoteBaseUrl=remote?.baseUrl?.trim(),apiKey=remoteApiKey||requireApiKey(await resolveApiKeyForProvider({provider:`google`,cfg:options.config,agentDir:options.agentDir}),`google`),providerConfig=options.config.models?.providers?.google,rawBaseUrl=remoteBaseUrl||providerConfig?.baseUrl?.trim()||`https://generativelanguage.googleapis.com/v1beta`,baseUrl=normalizeGeminiBaseUrl(rawBaseUrl),headers={...Object.assign({},providerConfig?.headers,remote?.headers)},apiKeys=collectProviderApiKeysForExecution({provider:`google`,primaryApiKey:apiKey}),model=normalizeGeminiModel(options.model),modelPath=buildGeminiModelPath(model);return debugEmbeddingsLog(`memory embeddings: gemini client`,{rawBaseUrl,baseUrl,model,modelPath,embedEndpoint:`${baseUrl}/${modelPath}:embedContent`,batchEndpoint:`${baseUrl}/${modelPath}:batchEmbedContents`}),{baseUrl,headers,model,modelPath,apiKeys}}async function resolveRemoteEmbeddingBearerClient(params){let remote=params.options.remote,remoteApiKey=remote?.apiKey?.trim(),remoteBaseUrl=remote?.baseUrl?.trim(),providerConfig=params.options.config.models?.providers?.[params.provider],apiKey=remoteApiKey||requireApiKey(await resolveApiKeyForProvider({provider:params.provider,cfg:params.options.config,agentDir:params.options.agentDir}),params.provider),baseUrl=remoteBaseUrl||providerConfig?.baseUrl?.trim()||params.defaultBaseUrl,headerOverrides=Object.assign({},providerConfig?.headers,remote?.headers);return{baseUrl,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${apiKey}`,...headerOverrides}}}async function fetchRemoteEmbeddingVectors(params){let res=await fetch(params.url,{method:`POST`,headers:params.headers,body:JSON.stringify(params.body)});if(!res.ok){let text=await res.text();throw Error(`${params.errorPrefix}: ${res.status} ${text}`)}return((await res.json()).data??[]).map(entry=>entry.embedding??[])}const DEFAULT_OPENAI_EMBEDDING_MODEL=`text-embedding-3-small`,OPENAI_MAX_INPUT_TOKENS={"text-embedding-3-small":8192,"text-embedding-3-large":8192,"text-embedding-ada-002":8191};function normalizeOpenAiModel(model){let trimmed=model.trim();return trimmed?trimmed.startsWith(`openai/`)?trimmed.slice(7):trimmed:DEFAULT_OPENAI_EMBEDDING_MODEL}async function createOpenAiEmbeddingProvider(options){let client=await resolveOpenAiEmbeddingClient(options),url=`${client.baseUrl.replace(/\/$/,``)}/embeddings`,embed=async input=>input.length===0?[]:await fetchRemoteEmbeddingVectors({url,headers:client.headers,body:{model:client.model,input},errorPrefix:`openai embeddings failed`});return{provider:{id:`openai`,model:client.model,maxInputTokens:OPENAI_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>{let[vec]=await embed([text]);return vec??[]},embedBatch:embed},client}}async function resolveOpenAiEmbeddingClient(options){let{baseUrl,headers}=await resolveRemoteEmbeddingBearerClient({provider:`openai`,options,defaultBaseUrl:`https://api.openai.com/v1`});return{baseUrl,headers,model:normalizeOpenAiModel(options.model)}}const DEFAULT_VOYAGE_EMBEDDING_MODEL=`voyage-4-large`,VOYAGE_MAX_INPUT_TOKENS={"voyage-3":32e3,"voyage-3-lite":16e3,"voyage-code-3":32e3};function normalizeVoyageModel(model){let trimmed=model.trim();return trimmed?trimmed.startsWith(`voyage/`)?trimmed.slice(7):trimmed:DEFAULT_VOYAGE_EMBEDDING_MODEL}async function createVoyageEmbeddingProvider(options){let client=await resolveVoyageEmbeddingClient(options),url=`${client.baseUrl.replace(/\/$/,``)}/embeddings`,embed=async(input,input_type)=>{if(input.length===0)return[];let body={model:client.model,input};return input_type&&(body.input_type=input_type),await fetchRemoteEmbeddingVectors({url,headers:client.headers,body,errorPrefix:`voyage embeddings failed`})};return{provider:{id:`voyage`,model:client.model,maxInputTokens:VOYAGE_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>{let[vec]=await embed([text],`query`);return vec??[]},embedBatch:async texts=>embed(texts,`document`)},client}}async function resolveVoyageEmbeddingClient(options){let{baseUrl,headers}=await resolveRemoteEmbeddingBearerClient({provider:`voyage`,options,defaultBaseUrl:`https://api.voyageai.com/v1`});return{baseUrl,headers,model:normalizeVoyageModel(options.model)}}async function importNodeLlamaCpp(){return import(`node-llama-cpp`)}function sanitizeAndNormalizeEmbedding(vec){let sanitized=vec.map(value=>Number.isFinite(value)?value:0),magnitude=Math.sqrt(sanitized.reduce((sum,value)=>sum+value*value,0));return magnitude<1e-10?sanitized:sanitized.map(value=>value/magnitude)}const REMOTE_EMBEDDING_PROVIDER_IDS=[`openai`,`gemini`,`voyage`];function canAutoSelectLocal(options){let modelPath=options.local?.modelPath?.trim();if(!modelPath||/^(hf:|https?:)/i.test(modelPath))return!1;let resolved=resolveUserPath(modelPath);try{return fs.statSync(resolved).isFile()}catch{return!1}}function isMissingApiKeyError(err){return formatErrorMessage(err).includes(`No API key found for provider`)}async function createLocalEmbeddingProvider(options){let modelPath=options.local?.modelPath?.trim()||`hf:ggml-org/embeddinggemma-300m-qat-q8_0-GGUF/embeddinggemma-300m-qat-Q8_0.gguf`,modelCacheDir=options.local?.modelCacheDir?.trim(),{getLlama,resolveModelFile,LlamaLogLevel}=await importNodeLlamaCpp(),llama=null,embeddingModel=null,embeddingContext=null,ensureContext=async()=>{if(llama||=await getLlama({logLevel:LlamaLogLevel.error}),!embeddingModel){let resolved=await resolveModelFile(modelPath,modelCacheDir||void 0);embeddingModel=await llama.loadModel({modelPath:resolved})}return embeddingContext||=await embeddingModel.createEmbeddingContext(),embeddingContext};return{id:`local`,model:modelPath,embedQuery:async text=>{let embedding=await(await ensureContext()).getEmbeddingFor(text);return sanitizeAndNormalizeEmbedding(Array.from(embedding.vector))},embedBatch:async texts=>{let ctx=await ensureContext();return await Promise.all(texts.map(async text=>{let embedding=await ctx.getEmbeddingFor(text);return sanitizeAndNormalizeEmbedding(Array.from(embedding.vector))}))}}}async function createEmbeddingProvider(options){let requestedProvider=options.provider,fallback=options.fallback,createProvider=async id=>{if(id===`local`)return{provider:await createLocalEmbeddingProvider(options)};if(id===`gemini`){let{provider,client}=await createGeminiEmbeddingProvider(options);return{provider,gemini:client}}if(id===`voyage`){let{provider,client}=await createVoyageEmbeddingProvider(options);return{provider,voyage:client}}let{provider,client}=await createOpenAiEmbeddingProvider(options);return{provider,openAi:client}},formatPrimaryError=(err,provider)=>provider===`local`?formatLocalSetupError(err):formatErrorMessage(err);if(requestedProvider===`auto`){let missingKeyErrors=[],localError=null;if(canAutoSelectLocal(options))try{return{...await createProvider(`local`),requestedProvider}}catch(err){localError=formatLocalSetupError(err)}for(let provider of REMOTE_EMBEDDING_PROVIDER_IDS)try{return{...await createProvider(provider),requestedProvider}}catch(err){let message=formatPrimaryError(err,provider);if(isMissingApiKeyError(err)){missingKeyErrors.push(message);continue}throw Error(message,{cause:err})}let details=[...missingKeyErrors,localError].filter(Boolean);return{provider:null,requestedProvider,providerUnavailableReason:details.length>0?details.join(`
1
+ import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{D as truncateUtf16Safe,a as clampNumber,b as resolveUserPath,i as clampInt}from"./utils-DbaBVFaK.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{c as resolveAgentWorkspaceDir,i as resolveAgentDir,r as resolveAgentConfig}from"./agent-scope-DPtjOxzp.js";import{vt as requireApiKey,yt as resolveApiKeyForProvider}from"./model-selection-DG9J_VTz.js";import{t as normalizeBaseUrl}from"./normalize-base-url-DmugqkQ6.js";import{t as isTruthyEnvValue}from"./env-BIdU5BAp.js";import{n as formatErrorMessage}from"./errors-B1MIg3g-.js";import{s as resolveSessionTranscriptsDirForAgent}from"./paths-DJ6rztqJ.js";import{n as onSessionTranscriptUpdate}from"./transcript-events-C4rFYweQ.js";import{n as executeWithApiKeyRotation,r as parseGeminiAuth,t as collectProviderApiKeysForExecution}from"./api-key-rotation-CyCi-UqR.js";import{_ as runWithConcurrency,a as buildFileEntry,d as hashText,f as isMemoryPath,g as remapChunkLines,h as parseEmbedding,i as sessionPathForFile,m as normalizeExtraMemoryPaths,n as buildSessionEntry,o as chunkMarkdown,p as listMemoryFiles,r as listSessionFilesForAgent,s as ensureDir,t as requireNodeSqlite,u as getDefaultMemoryWatchPatterns}from"./sqlite-C39E12XS.js";import{n as retryAsync}from"./retry-DlVhg5qu.js";import fs from"node:fs";import os from"node:os";import path from"node:path";import{randomUUID}from"node:crypto";import fs$1 from"node:fs/promises";import{createInterface}from"node:readline";import{Readable}from"node:stream";import chokidar from"chokidar";function tokenize$1(text){return text.toLowerCase().split(/[\s\W]+/).filter(Boolean)}function jaccardSimilarity(a,b){if(a.size===0&&b.size===0)return 1;let intersection=0;for(let token of a)b.has(token)&&intersection++;let union=a.size+b.size-intersection;return intersection/union}function cosineSimilarity(a,b){let n=Math.min(a.length,b.length),dot=0,na=0,nb=0;for(let i=0;i<n;i++)dot+=a[i]*b[i],na+=a[i]*a[i],nb+=b[i]*b[i];let denom=Math.sqrt(na)*Math.sqrt(nb);return denom===0?0:dot/denom}function mmrSelect(items,opts){let lambda=opts.lambda??.7,limit=Math.min(opts.topK??items.length,items.length),remaining=[...items],relevance=new Map;for(let item of remaining)relevance.set(item,opts.relevance(item));let selected=[];for(;selected.length<limit&&remaining.length>0;){let bestIdx=-1,bestScore=-1/0;for(let i=0;i<remaining.length;i++){let candidate=remaining[i],maxSimToSelected=0;for(let s of selected){let sim=opts.similarity(candidate,s);sim>maxSimToSelected&&(maxSimToSelected=sim)}let score=lambda*relevance.get(candidate)-(1-lambda)*maxSimToSelected;(score>bestScore||score===bestScore&&bestIdx>=0&&opts.tieScore!==void 0&&opts.tieScore(candidate)>opts.tieScore(remaining[bestIdx]))&&(bestScore=score,bestIdx=i)}if(bestIdx<0)break;selected.push(remaining.splice(bestIdx,1)[0])}return selected}function textMaximalMarginalRelevance(items,lambda=.7){if(items.length<=1)return[...items];let l=Math.max(0,Math.min(1,lambda));if(l===1)return[...items].sort((a,b)=>b.score-a.score);let tokens=new Map;for(let item of items)tokens.set(item.id,new Set(tokenize$1(item.content)));let tokensOf=item=>tokens.get(item.id)??new Set(tokenize$1(item.content)),scores=items.map(i=>i.score),min=Math.min(...scores),range=Math.max(...scores)-min;return mmrSelect(items,{relevance:item=>range===0?1:(item.score-min)/range,similarity:(a,b)=>jaccardSimilarity(tokensOf(a),tokensOf(b)),lambda:l,tieScore:item=>item.score})}const DEFAULT_HYBRID_VECTOR_WEIGHT$1=.7,DEFAULT_HYBRID_TEXT_WEIGHT$1=.3;function normalizeHybridWeights(vectorWeight,textWeight){let clamp=(n,fallback)=>typeof n==`number`&&Number.isFinite(n)?Math.max(0,n):fallback,v=clamp(vectorWeight,DEFAULT_HYBRID_VECTOR_WEIGHT$1),t=clamp(textWeight,DEFAULT_HYBRID_TEXT_WEIGHT$1),sum=v+t;return sum<=0?{vectorWeight:DEFAULT_HYBRID_VECTOR_WEIGHT$1,textWeight:DEFAULT_HYBRID_TEXT_WEIGHT$1}:{vectorWeight:v/sum,textWeight:t/sum}}function hybridScore(scores,weights){let v=Number.isFinite(scores.vectorScore)?scores.vectorScore:0,t=Number.isFinite(scores.textScore)?scores.textScore:0;return weights.vectorWeight*v+weights.textWeight*t}function bm25RankToScore$1(rank){return 1/(1+(Number.isFinite(rank)?Math.max(0,rank):999))}function toDecayLambda(halfLifeDays){return!Number.isFinite(halfLifeDays)||halfLifeDays<=0?0:Math.LN2/halfLifeDays}function calculateTemporalDecayMultiplier(params){let lambda=toDecayLambda(params.halfLifeDays),clampedAge=Math.max(0,params.ageInDays);return lambda<=0||!Number.isFinite(clampedAge)?1:Math.exp(-lambda*clampedAge)}function applyTemporalDecayToScore(params){return params.score*calculateTemporalDecayMultiplier(params)}const DEFAULT_MMR_LAMBDA=.7,DEFAULT_SOURCES=[`memory`];function normalizeSources(sources,sessionMemoryEnabled){let normalized=new Set,input=sources?.length?sources:DEFAULT_SOURCES;for(let source of input)source===`memory`&&normalized.add(`memory`),source===`sessions`&&sessionMemoryEnabled&&normalized.add(`sessions`);return normalized.size===0&&normalized.add(`memory`),Array.from(normalized)}function resolveStorePath(agentId,raw){let stateDir=resolveStateDir(process.env,os.homedir),fallback=path.join(stateDir,`memory`,`${agentId}.sqlite`);return raw?resolveUserPath(raw.includes(`{agentId}`)?raw.replaceAll(`{agentId}`,agentId):raw):fallback}function mergeConfig(defaults,overrides,agentId){let enabled=overrides?.enabled??defaults?.enabled??!0,sessionMemory=overrides?.experimental?.sessionMemory??defaults?.experimental?.sessionMemory??!1,provider=overrides?.provider??defaults?.provider??`auto`,defaultRemote=defaults?.remote,overrideRemote=overrides?.remote,includeRemote=!!(overrideRemote?.baseUrl||overrideRemote?.apiKey||overrideRemote?.headers||defaultRemote?.baseUrl||defaultRemote?.apiKey||defaultRemote?.headers)||provider===`openai`||provider===`gemini`||provider===`voyage`||provider===`auto`,batch={enabled:overrideRemote?.batch?.enabled??defaultRemote?.batch?.enabled??!1,wait:overrideRemote?.batch?.wait??defaultRemote?.batch?.wait??!0,concurrency:Math.max(1,overrideRemote?.batch?.concurrency??defaultRemote?.batch?.concurrency??2),pollIntervalMs:overrideRemote?.batch?.pollIntervalMs??defaultRemote?.batch?.pollIntervalMs??2e3,timeoutMinutes:overrideRemote?.batch?.timeoutMinutes??defaultRemote?.batch?.timeoutMinutes??60},remote=includeRemote?{baseUrl:overrideRemote?.baseUrl??defaultRemote?.baseUrl,apiKey:overrideRemote?.apiKey??defaultRemote?.apiKey,headers:overrideRemote?.headers??defaultRemote?.headers,batch}:void 0,fallback=overrides?.fallback??defaults?.fallback??`none`,modelDefault=provider===`gemini`?`gemini-embedding-001`:provider===`openai`?`text-embedding-3-small`:provider===`voyage`?`voyage-4-large`:void 0,model=overrides?.model??defaults?.model??modelDefault??``,local={modelPath:overrides?.local?.modelPath??defaults?.local?.modelPath,modelCacheDir:overrides?.local?.modelCacheDir??defaults?.local?.modelCacheDir},sources=normalizeSources(overrides?.sources??defaults?.sources,sessionMemory),rawPaths=[...defaults?.extraPaths??[],...overrides?.extraPaths??[]].map(value=>value.trim()).filter(Boolean),extraPaths=Array.from(new Set(rawPaths)),vector={enabled:overrides?.store?.vector?.enabled??defaults?.store?.vector?.enabled??!0,extensionPath:overrides?.store?.vector?.extensionPath??defaults?.store?.vector?.extensionPath},store={driver:overrides?.store?.driver??defaults?.store?.driver??`sqlite`,path:resolveStorePath(agentId,overrides?.store?.path??defaults?.store?.path),vector},chunking={tokens:overrides?.chunking?.tokens??defaults?.chunking?.tokens??400,overlap:overrides?.chunking?.overlap??defaults?.chunking?.overlap??80},sync={onSessionStart:overrides?.sync?.onSessionStart??defaults?.sync?.onSessionStart??!0,onSearch:overrides?.sync?.onSearch??defaults?.sync?.onSearch??!0,watch:overrides?.sync?.watch??defaults?.sync?.watch??!0,watchDebounceMs:overrides?.sync?.watchDebounceMs??defaults?.sync?.watchDebounceMs??1500,intervalMinutes:overrides?.sync?.intervalMinutes??defaults?.sync?.intervalMinutes??0,sessions:{deltaBytes:overrides?.sync?.sessions?.deltaBytes??defaults?.sync?.sessions?.deltaBytes??1e5,deltaMessages:overrides?.sync?.sessions?.deltaMessages??defaults?.sync?.sessions?.deltaMessages??50}},query={maxResults:overrides?.query?.maxResults??defaults?.query?.maxResults??6,minScore:overrides?.query?.minScore??defaults?.query?.minScore??.35},hybrid={enabled:overrides?.query?.hybrid?.enabled??defaults?.query?.hybrid?.enabled??!0,vectorWeight:overrides?.query?.hybrid?.vectorWeight??defaults?.query?.hybrid?.vectorWeight??.7,textWeight:overrides?.query?.hybrid?.textWeight??defaults?.query?.hybrid?.textWeight??.3,candidateMultiplier:overrides?.query?.hybrid?.candidateMultiplier??defaults?.query?.hybrid?.candidateMultiplier??4,mmr:{enabled:overrides?.query?.hybrid?.mmr?.enabled??defaults?.query?.hybrid?.mmr?.enabled??!1,lambda:overrides?.query?.hybrid?.mmr?.lambda??defaults?.query?.hybrid?.mmr?.lambda??DEFAULT_MMR_LAMBDA},temporalDecay:{enabled:overrides?.query?.hybrid?.temporalDecay?.enabled??defaults?.query?.hybrid?.temporalDecay?.enabled??!1,halfLifeDays:overrides?.query?.hybrid?.temporalDecay?.halfLifeDays??defaults?.query?.hybrid?.temporalDecay?.halfLifeDays??30}},cache={enabled:overrides?.cache?.enabled??defaults?.cache?.enabled??!0,maxEntries:overrides?.cache?.maxEntries??defaults?.cache?.maxEntries},overlap=clampNumber(chunking.overlap,0,Math.max(0,chunking.tokens-1)),minScore=clampNumber(query.minScore,0,1),{vectorWeight:normalizedVectorWeight,textWeight:normalizedTextWeight}=normalizeHybridWeights(hybrid.vectorWeight,hybrid.textWeight),candidateMultiplier=clampInt(hybrid.candidateMultiplier,1,20),temporalDecayHalfLifeDays=Math.max(1,Math.floor(Number.isFinite(hybrid.temporalDecay.halfLifeDays)?hybrid.temporalDecay.halfLifeDays:30)),deltaBytes=clampInt(sync.sessions.deltaBytes,0,2**53-1),deltaMessages=clampInt(sync.sessions.deltaMessages,0,2**53-1);return{enabled,sources,extraPaths,provider,remote,experimental:{sessionMemory},fallback,model,local,store,chunking:{tokens:Math.max(1,chunking.tokens),overlap},sync:{...sync,sessions:{deltaBytes,deltaMessages}},query:{...query,minScore,hybrid:{enabled:!!hybrid.enabled,vectorWeight:normalizedVectorWeight,textWeight:normalizedTextWeight,candidateMultiplier,mmr:{enabled:!!hybrid.mmr.enabled,lambda:Number.isFinite(hybrid.mmr.lambda)?Math.max(0,Math.min(1,hybrid.mmr.lambda)):DEFAULT_MMR_LAMBDA},temporalDecay:{enabled:!!hybrid.temporalDecay.enabled,halfLifeDays:temporalDecayHalfLifeDays}}},cache:{enabled:!!cache.enabled,maxEntries:typeof cache.maxEntries==`number`&&Number.isFinite(cache.maxEntries)?Math.max(1,Math.floor(cache.maxEntries)):void 0}}}function resolveMemorySearchConfig(cfg,agentId){let defaults=cfg.agents?.defaults?.memorySearch,overrides=resolveAgentConfig(cfg,agentId)?.memorySearch,resolved=mergeConfig(defaults,overrides,agentId);return resolved.enabled?resolved:null}const debugEmbeddings=isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_DEBUG_MEMORY_EMBEDDINGS),log$3=createSubsystemLogger(`memory/embeddings`);function debugEmbeddingsLog(message,meta){if(!debugEmbeddings)return;let suffix=meta?` ${JSON.stringify(meta)}`:``;log$3.raw(`${message}${suffix}`)}const DEFAULT_GEMINI_EMBEDDING_MODEL=`gemini-embedding-001`,GEMINI_MAX_INPUT_TOKENS={"text-embedding-004":2048};function resolveRemoteApiKey(remoteApiKey){let trimmed=remoteApiKey?.trim();if(trimmed)return trimmed===`GOOGLE_API_KEY`||trimmed===`GEMINI_API_KEY`?process.env[trimmed]?.trim():trimmed}function normalizeGeminiModel(model){let trimmed=model.trim();if(!trimmed)return DEFAULT_GEMINI_EMBEDDING_MODEL;let withoutPrefix=trimmed.replace(/^models\//,``);return withoutPrefix.startsWith(`gemini/`)||withoutPrefix.startsWith(`google/`)?withoutPrefix.slice(7):withoutPrefix}function normalizeGeminiBaseUrl(raw){let trimmed=normalizeBaseUrl(raw),openAiIndex=trimmed.indexOf(`/openai`);return openAiIndex>-1?trimmed.slice(0,openAiIndex):trimmed}function buildGeminiModelPath(model){return model.startsWith(`models/`)?model:`models/${model}`}async function createGeminiEmbeddingProvider(options){let client=await resolveGeminiEmbeddingClient(options),baseUrl=client.baseUrl.replace(/\/$/,``),embedUrl=`${baseUrl}/${client.modelPath}:embedContent`,batchUrl=`${baseUrl}/${client.modelPath}:batchEmbedContents`,fetchWithGeminiAuth=async(apiKey,endpoint,body)=>{let headers={...parseGeminiAuth(apiKey).headers,...client.headers},res=await fetch(endpoint,{method:`POST`,headers,body:JSON.stringify(body)});if(!res.ok){let payload=await res.text();throw Error(`gemini embeddings failed: ${res.status} ${payload}`)}return await res.json()};return{provider:{id:`gemini`,model:client.model,maxInputTokens:GEMINI_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>text.trim()?(await executeWithApiKeyRotation({provider:`google`,apiKeys:client.apiKeys,execute:apiKey=>fetchWithGeminiAuth(apiKey,embedUrl,{content:{parts:[{text}]},taskType:`RETRIEVAL_QUERY`})})).embedding?.values??[]:[],embedBatch:async texts=>{if(texts.length===0)return[];let requests=texts.map(text=>({model:client.modelPath,content:{parts:[{text}]},taskType:`RETRIEVAL_DOCUMENT`})),payload=await executeWithApiKeyRotation({provider:`google`,apiKeys:client.apiKeys,execute:apiKey=>fetchWithGeminiAuth(apiKey,batchUrl,{requests})}),embeddings=Array.isArray(payload.embeddings)?payload.embeddings:[];return texts.map((_,index)=>embeddings[index]?.values??[])}},client}}async function resolveGeminiEmbeddingClient(options){let remote=options.remote,remoteApiKey=resolveRemoteApiKey(remote?.apiKey),remoteBaseUrl=remote?.baseUrl?.trim(),apiKey=remoteApiKey||requireApiKey(await resolveApiKeyForProvider({provider:`google`,cfg:options.config,agentDir:options.agentDir}),`google`),providerConfig=options.config.models?.providers?.google,rawBaseUrl=remoteBaseUrl||providerConfig?.baseUrl?.trim()||`https://generativelanguage.googleapis.com/v1beta`,baseUrl=normalizeGeminiBaseUrl(rawBaseUrl),headers={...Object.assign({},providerConfig?.headers,remote?.headers)},apiKeys=collectProviderApiKeysForExecution({provider:`google`,primaryApiKey:apiKey}),model=normalizeGeminiModel(options.model),modelPath=buildGeminiModelPath(model);return debugEmbeddingsLog(`memory embeddings: gemini client`,{rawBaseUrl,baseUrl,model,modelPath,embedEndpoint:`${baseUrl}/${modelPath}:embedContent`,batchEndpoint:`${baseUrl}/${modelPath}:batchEmbedContents`}),{baseUrl,headers,model,modelPath,apiKeys}}async function resolveRemoteEmbeddingBearerClient(params){let remote=params.options.remote,remoteApiKey=remote?.apiKey?.trim(),remoteBaseUrl=remote?.baseUrl?.trim(),providerConfig=params.options.config.models?.providers?.[params.provider],apiKey=remoteApiKey||requireApiKey(await resolveApiKeyForProvider({provider:params.provider,cfg:params.options.config,agentDir:params.options.agentDir}),params.provider),baseUrl=remoteBaseUrl||providerConfig?.baseUrl?.trim()||params.defaultBaseUrl,headerOverrides=Object.assign({},providerConfig?.headers,remote?.headers);return{baseUrl,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${apiKey}`,...headerOverrides}}}async function fetchRemoteEmbeddingVectors(params){let res=await fetch(params.url,{method:`POST`,headers:params.headers,body:JSON.stringify(params.body)});if(!res.ok){let text=await res.text();throw Error(`${params.errorPrefix}: ${res.status} ${text}`)}return((await res.json()).data??[]).map(entry=>entry.embedding??[])}const DEFAULT_OPENAI_EMBEDDING_MODEL=`text-embedding-3-small`,OPENAI_MAX_INPUT_TOKENS={"text-embedding-3-small":8192,"text-embedding-3-large":8192,"text-embedding-ada-002":8191};function normalizeOpenAiModel(model){let trimmed=model.trim();return trimmed?trimmed.startsWith(`openai/`)?trimmed.slice(7):trimmed:DEFAULT_OPENAI_EMBEDDING_MODEL}async function createOpenAiEmbeddingProvider(options){let client=await resolveOpenAiEmbeddingClient(options),url=`${client.baseUrl.replace(/\/$/,``)}/embeddings`,embed=async input=>input.length===0?[]:await fetchRemoteEmbeddingVectors({url,headers:client.headers,body:{model:client.model,input},errorPrefix:`openai embeddings failed`});return{provider:{id:`openai`,model:client.model,maxInputTokens:OPENAI_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>{let[vec]=await embed([text]);return vec??[]},embedBatch:embed},client}}async function resolveOpenAiEmbeddingClient(options){let{baseUrl,headers}=await resolveRemoteEmbeddingBearerClient({provider:`openai`,options,defaultBaseUrl:`https://api.openai.com/v1`});return{baseUrl,headers,model:normalizeOpenAiModel(options.model)}}const DEFAULT_VOYAGE_EMBEDDING_MODEL=`voyage-4-large`,VOYAGE_MAX_INPUT_TOKENS={"voyage-3":32e3,"voyage-3-lite":16e3,"voyage-code-3":32e3};function normalizeVoyageModel(model){let trimmed=model.trim();return trimmed?trimmed.startsWith(`voyage/`)?trimmed.slice(7):trimmed:DEFAULT_VOYAGE_EMBEDDING_MODEL}async function createVoyageEmbeddingProvider(options){let client=await resolveVoyageEmbeddingClient(options),url=`${client.baseUrl.replace(/\/$/,``)}/embeddings`,embed=async(input,input_type)=>{if(input.length===0)return[];let body={model:client.model,input};return input_type&&(body.input_type=input_type),await fetchRemoteEmbeddingVectors({url,headers:client.headers,body,errorPrefix:`voyage embeddings failed`})};return{provider:{id:`voyage`,model:client.model,maxInputTokens:VOYAGE_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>{let[vec]=await embed([text],`query`);return vec??[]},embedBatch:async texts=>embed(texts,`document`)},client}}async function resolveVoyageEmbeddingClient(options){let{baseUrl,headers}=await resolveRemoteEmbeddingBearerClient({provider:`voyage`,options,defaultBaseUrl:`https://api.voyageai.com/v1`});return{baseUrl,headers,model:normalizeVoyageModel(options.model)}}async function importNodeLlamaCpp(){return import(`node-llama-cpp`)}function sanitizeAndNormalizeEmbedding(vec){let sanitized=vec.map(value=>Number.isFinite(value)?value:0),magnitude=Math.sqrt(sanitized.reduce((sum,value)=>sum+value*value,0));return magnitude<1e-10?sanitized:sanitized.map(value=>value/magnitude)}const REMOTE_EMBEDDING_PROVIDER_IDS=[`openai`,`gemini`,`voyage`];function canAutoSelectLocal(options){let modelPath=options.local?.modelPath?.trim();if(!modelPath||/^(hf:|https?:)/i.test(modelPath))return!1;let resolved=resolveUserPath(modelPath);try{return fs.statSync(resolved).isFile()}catch{return!1}}function isMissingApiKeyError(err){return formatErrorMessage(err).includes(`No API key found for provider`)}async function createLocalEmbeddingProvider(options){let modelPath=options.local?.modelPath?.trim()||`hf:ggml-org/embeddinggemma-300m-qat-q8_0-GGUF/embeddinggemma-300m-qat-Q8_0.gguf`,modelCacheDir=options.local?.modelCacheDir?.trim(),{getLlama,resolveModelFile,LlamaLogLevel}=await importNodeLlamaCpp(),llama=null,embeddingModel=null,embeddingContext=null,ensureContext=async()=>{if(llama||=await getLlama({logLevel:LlamaLogLevel.error}),!embeddingModel){let resolved=await resolveModelFile(modelPath,modelCacheDir||void 0);embeddingModel=await llama.loadModel({modelPath:resolved})}return embeddingContext||=await embeddingModel.createEmbeddingContext(),embeddingContext};return{id:`local`,model:modelPath,embedQuery:async text=>{let embedding=await(await ensureContext()).getEmbeddingFor(text);return sanitizeAndNormalizeEmbedding(Array.from(embedding.vector))},embedBatch:async texts=>{let ctx=await ensureContext();return await Promise.all(texts.map(async text=>{let embedding=await ctx.getEmbeddingFor(text);return sanitizeAndNormalizeEmbedding(Array.from(embedding.vector))}))}}}async function createEmbeddingProvider(options){let requestedProvider=options.provider,fallback=options.fallback,createProvider=async id=>{if(id===`local`)return{provider:await createLocalEmbeddingProvider(options)};if(id===`gemini`){let{provider,client}=await createGeminiEmbeddingProvider(options);return{provider,gemini:client}}if(id===`voyage`){let{provider,client}=await createVoyageEmbeddingProvider(options);return{provider,voyage:client}}let{provider,client}=await createOpenAiEmbeddingProvider(options);return{provider,openAi:client}},formatPrimaryError=(err,provider)=>provider===`local`?formatLocalSetupError(err):formatErrorMessage(err);if(requestedProvider===`auto`){let missingKeyErrors=[],localError=null;if(canAutoSelectLocal(options))try{return{...await createProvider(`local`),requestedProvider}}catch(err){localError=formatLocalSetupError(err)}for(let provider of REMOTE_EMBEDDING_PROVIDER_IDS)try{return{...await createProvider(provider),requestedProvider}}catch(err){let message=formatPrimaryError(err,provider);if(isMissingApiKeyError(err)){missingKeyErrors.push(message);continue}throw Error(message,{cause:err})}let details=[...missingKeyErrors,localError].filter(Boolean);return{provider:null,requestedProvider,providerUnavailableReason:details.length>0?details.join(`
2
2
 
3
3
  `):`No embeddings provider available.`}}try{return{...await createProvider(requestedProvider),requestedProvider}}catch(primaryErr){let reason=formatPrimaryError(primaryErr,requestedProvider);if(fallback&&fallback!==`none`&&fallback!==requestedProvider)try{return{...await createProvider(fallback),requestedProvider,fallbackFrom:requestedProvider,fallbackReason:reason}}catch(fallbackErr){let combinedReason=`${reason}\n\nFallback to ${fallback} failed: ${formatErrorMessage(fallbackErr)}`;if(isMissingApiKeyError(primaryErr)&&isMissingApiKeyError(fallbackErr))return{provider:null,requestedProvider,fallbackFrom:requestedProvider,fallbackReason:reason,providerUnavailableReason:combinedReason};throw Error(combinedReason,{cause:fallbackErr})}if(isMissingApiKeyError(primaryErr))return{provider:null,requestedProvider,providerUnavailableReason:reason};throw Error(reason,{cause:primaryErr})}}function isNodeLlamaCppMissing(err){return err instanceof Error&&err.code===`ERR_MODULE_NOT_FOUND`?err.message.includes(`node-llama-cpp`):!1}function formatLocalSetupError(err){let detail=formatErrorMessage(err),missing=isNodeLlamaCppMissing(err);return[`Local embeddings unavailable.`,missing?`Reason: optional dependency node-llama-cpp is missing (or failed to install).`:detail?`Reason: ${detail}`:void 0,missing&&detail?`Detail: ${detail}`:null,`To enable local embeddings:`,`1) Use Node 22 LTS (recommended for installs/updates)`,missing?`2) Reinstall BuilderForceAgents (this should install node-llama-cpp): npm i -g @seanhogg/builderforce-agents@latest`:null,`3) If you use pnpm: pnpm approve-builds (select node-llama-cpp), then pnpm rebuild node-llama-cpp`,...REMOTE_EMBEDDING_PROVIDER_IDS.map(provider=>`Or set agents.defaults.memorySearch.provider = "${provider}" (remote).`)].filter(Boolean).join(`
4
4
  `)}const DEFAULT_MMR_CONFIG={enabled:!1,lambda:.7};function mmrRerank(items,config={}){let{enabled=DEFAULT_MMR_CONFIG.enabled,lambda=DEFAULT_MMR_CONFIG.lambda}=config;return!enabled||items.length<=1?[...items]:textMaximalMarginalRelevance(items,lambda)}function applyMMRToHybridResults(results,config={}){if(results.length===0)return results;let itemById=new Map;return mmrRerank(results.map((r,index)=>{let id=`${r.path}:${r.startLine}:${index}`;return itemById.set(id,r),{id,score:r.score,content:r.snippet}}),config).map(item=>itemById.get(item.id))}const DEFAULT_TEMPORAL_DECAY_CONFIG={enabled:!1,halfLifeDays:30},DATED_MEMORY_PATH_RE=/(?:^|\/)memory\/(\d{4})-(\d{2})-(\d{2})\.md$/;function parseMemoryDateFromPath(filePath){let normalized=filePath.replaceAll(`\\`,`/`).replace(/^\.\//,``),match=DATED_MEMORY_PATH_RE.exec(normalized);if(!match)return null;let year=Number(match[1]),month=Number(match[2]),day=Number(match[3]);if(!Number.isInteger(year)||!Number.isInteger(month)||!Number.isInteger(day))return null;let timestamp=Date.UTC(year,month-1,day),parsed=new Date(timestamp);return parsed.getUTCFullYear()!==year||parsed.getUTCMonth()!==month-1||parsed.getUTCDate()!==day?null:parsed}function isEvergreenMemoryPath(filePath){let normalized=filePath.replaceAll(`\\`,`/`).replace(/^\.\//,``);return normalized===`MEMORY.md`||normalized===`memory.md`||normalized===`.builderforce/MEMORY.md`||normalized===`.builderforce/memory.md`?!0:!normalized.startsWith(`memory/`)&&!normalized.startsWith(`.builderforce/memory/`)?!1:!DATED_MEMORY_PATH_RE.test(normalized)}async function extractTimestamp(params){let fromPath=parseMemoryDateFromPath(params.filePath);if(fromPath)return fromPath;if(params.source===`memory`&&isEvergreenMemoryPath(params.filePath)||!params.workspaceDir)return null;let absolutePath=path.isAbsolute(params.filePath)?params.filePath:path.resolve(params.workspaceDir,params.filePath);try{let stat=await fs$1.stat(absolutePath);return Number.isFinite(stat.mtimeMs)?new Date(stat.mtimeMs):null}catch{return null}}function ageInDaysFromTimestamp(timestamp,nowMs){return Math.max(0,nowMs-timestamp.getTime())/864e5}async function applyTemporalDecayToHybridResults(params){let config={...DEFAULT_TEMPORAL_DECAY_CONFIG,...params.temporalDecay};if(!config.enabled)return[...params.results];let nowMs=params.nowMs??Date.now(),timestampPromiseCache=new Map;return Promise.all(params.results.map(async entry=>{let cacheKey=`${entry.source}:${entry.path}`,timestampPromise=timestampPromiseCache.get(cacheKey);timestampPromise||(timestampPromise=extractTimestamp({filePath:entry.path,source:entry.source,workspaceDir:params.workspaceDir}),timestampPromiseCache.set(cacheKey,timestampPromise));let timestamp=await timestampPromise;if(!timestamp)return entry;let decayedScore=applyTemporalDecayToScore({score:entry.score,ageInDays:ageInDaysFromTimestamp(timestamp,nowMs),halfLifeDays:config.halfLifeDays});return{...entry,score:decayedScore}}))}function buildFtsQuery(raw){let tokens=raw.match(/[\p{L}\p{N}_]+/gu)?.map(t=>t.trim()).filter(Boolean)??[];return tokens.length===0?null:tokens.map(t=>`"${t.replaceAll(`"`,``)}"`).join(` AND `)}const bm25RankToScore=bm25RankToScore$1;async function mergeHybridResults(params){let byId=new Map;for(let r of params.vector)byId.set(r.id,{id:r.id,path:r.path,startLine:r.startLine,endLine:r.endLine,source:r.source,snippet:r.snippet,vectorScore:r.vectorScore,textScore:0});for(let r of params.keyword){let existing=byId.get(r.id);existing?(existing.textScore=r.textScore,r.snippet&&r.snippet.length>0&&(existing.snippet=r.snippet)):byId.set(r.id,{id:r.id,path:r.path,startLine:r.startLine,endLine:r.endLine,source:r.source,snippet:r.snippet,vectorScore:0,textScore:r.textScore})}let weights=normalizeHybridWeights(params.vectorWeight,params.textWeight),sorted=(await applyTemporalDecayToHybridResults({results:Array.from(byId.values()).map(entry=>{let score=hybridScore({vectorScore:entry.vectorScore,textScore:entry.textScore},weights);return{path:entry.path,startLine:entry.startLine,endLine:entry.endLine,score,snippet:entry.snippet,source:entry.source}}),temporalDecay:{...DEFAULT_TEMPORAL_DECAY_CONFIG,...params.temporalDecay},workspaceDir:params.workspaceDir,nowMs:params.nowMs})).toSorted((a,b)=>b.score-a.score),mmrConfig={...DEFAULT_MMR_CONFIG,...params.mmr};return mmrConfig.enabled?applyMMRToHybridResults(sorted,mmrConfig):sorted}function normalizeBatchBaseUrl(client){return client.baseUrl?.replace(/\/$/,``)??``}function buildBatchHeaders(client,params){let headers=client.headers?{...client.headers}:{};return params.json?!headers[`Content-Type`]&&!headers[`content-type`]&&(headers[`Content-Type`]=`application/json`):(delete headers[`Content-Type`],delete headers[`content-type`]),headers}function splitBatchRequests(requests,maxRequests){if(requests.length<=maxRequests)return[requests];let groups=[];for(let i=0;i<requests.length;i+=maxRequests)groups.push(requests.slice(i,i+maxRequests));return groups}async function runEmbeddingBatchGroups(params){if(params.requests.length===0)return new Map;let groups=splitBatchRequests(params.requests,params.maxRequests),byCustomId=new Map,tasks=groups.map((group,groupIndex)=>async()=>{await params.runGroup({group,groupIndex,groups:groups.length,byCustomId})});return params.debug?.(params.debugLabel,{requests:params.requests.length,groups:groups.length,wait:params.wait,concurrency:params.concurrency,pollIntervalMs:params.pollIntervalMs,timeoutMs:params.timeoutMs}),await runWithConcurrency(tasks,params.concurrency),byCustomId}function getGeminiUploadUrl(baseUrl){return baseUrl.includes(`/v1beta`)?baseUrl.replace(/\/v1beta\/?$/,`/upload/v1beta`):`${baseUrl.replace(/\/$/,``)}/upload`}function buildGeminiUploadBody(params){let boundary=`builderforce-${hashText(params.displayName)}`,jsonPart=JSON.stringify({file:{displayName:params.displayName,mimeType:`application/jsonl`}}),delimiter=`--${boundary}\r\n`,closeDelimiter=`--${boundary}--\r\n`,parts=[`${delimiter}Content-Type: application/json; charset=UTF-8\r\n\r\n${jsonPart}\r\n`,`${delimiter}Content-Type: application/jsonl; charset=UTF-8\r\n\r\n${params.jsonl}\r\n`,closeDelimiter];return{body:new Blob([parts.join(``)],{type:`multipart/related`}),contentType:`multipart/related; boundary=${boundary}`}}async function submitGeminiBatch(params){let baseUrl=normalizeBatchBaseUrl(params.gemini),uploadPayload=buildGeminiUploadBody({jsonl:params.requests.map(request=>JSON.stringify({key:request.custom_id,request:{content:request.content,task_type:request.taskType}})).join(`