@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{u as resolveGatewayPort}from"./paths-BHg-VHB4.js";import{c as writeConfigFile,n as createConfigIO,r as loadConfig}from"./io-CohJffHG.js";import{n as isLoopbackHost}from"./net-DtnXq2dW.js";import{n as formatErrorMessage,t as extractErrorCode}from"./errors-tAt19c1E.js";import{C as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME,D as DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME,E as DEFAULT_BUILDERFORCE_AGENTS_BROWSER_ENABLED,T as DEFAULT_BUILDERFORCE_AGENTS_BROWSER_COLOR,a as resolveBuilderForceAgentsUserDataDir,d as normalizeCdpWsUrl,h as fetchOk,i as launchBuilderForceAgentsChrome,l as createTargetViaCdp,m as fetchJson,n as isChromeCdpReady,o as stopBuilderForceAgentsChrome,p as appendCdpPath,r as isChromeReachable,v as ensureChromeExtensionRelayServer,w as DEFAULT_BROWSER_EVALUATE_ENABLED,y as stopChromeExtensionRelayServer}from"./chrome-BnEbJV3D.js";import{i as resolveGatewayAuth}from"./auth-ChecwOXS.js";import{t as movePathToTrash}from"./trash-C3zmJ_O7.js";import fs from"node:fs";import crypto from"node:crypto";function resolveBrowserControlAuth(cfg,env=process.env){let auth=resolveGatewayAuth({authConfig:cfg?.gateway?.auth,env,tailscaleMode:cfg?.gateway?.tailscale?.mode}),token=typeof auth.token==`string`?auth.token.trim():``,password=typeof auth.password==`string`?auth.password.trim():``;return{token:token||void 0,password:password||void 0}}function shouldAutoGenerateBrowserAuth(env){if((env.NODE_ENV??``).trim().toLowerCase()===`test`)return!1;let vitest=(env.VITEST??``).trim().toLowerCase();return!(vitest&&vitest!==`0`&&vitest!==`false`&&vitest!==`off`)}async function ensureBrowserControlAuth(params){let env=params.env??process.env,auth=resolveBrowserControlAuth(params.cfg,env);if(auth.token||auth.password||!shouldAutoGenerateBrowserAuth(env)||params.cfg.gateway?.auth?.mode===`password`||params.cfg.gateway?.auth?.mode===`trusted-proxy`)return{auth};let latestCfg=loadConfig(),latestAuth=resolveBrowserControlAuth(latestCfg,env);if(latestAuth.token||latestAuth.password||latestCfg.gateway?.auth?.mode===`password`||latestCfg.gateway?.auth?.mode===`trusted-proxy`)return{auth:latestAuth};let generatedToken=crypto.randomBytes(24).toString(`hex`);return await writeConfigFile({...latestCfg,gateway:{...latestCfg.gateway,auth:{...latestCfg.gateway?.auth,mode:`token`,token:generatedToken}}}),{auth:{token:generatedToken},generatedToken}}let pwAiModuleSoft=null,pwAiModuleStrict=null;function isModuleNotFoundError(err){if(extractErrorCode(err)===`ERR_MODULE_NOT_FOUND`)return!0;let msg=formatErrorMessage(err);return msg.includes(`Cannot find module`)||msg.includes(`Cannot find package`)||msg.includes(`Failed to resolve import`)||msg.includes(`Failed to resolve entry for package`)||msg.includes(`Failed to load url`)}async function loadPwAiModule(mode){try{return await import(`./pw-ai-DSEj1QrV.js`)}catch(err){if(mode===`soft`||isModuleNotFoundError(err))return null;throw err}}async function getPwAiModule(opts){return(opts?.mode??`soft`)===`soft`?(pwAiModuleSoft||=loadPwAiModule(`soft`),await pwAiModuleSoft):(pwAiModuleStrict||=loadPwAiModule(`strict`),await pwAiModuleStrict)}function isValidPort(port){return Number.isFinite(port)&&port>0&&port<=65535}function clampPort(port,fallback){return isValidPort(port)?port:fallback}function derivePort(base,offset,fallback){return clampPort(base+offset,fallback)}const DEFAULT_BROWSER_CONTROL_PORT=18791,DEFAULT_BROWSER_CDP_PORT_RANGE_START=18800,DEFAULT_BROWSER_CDP_PORT_RANGE_END=18899;function deriveDefaultBrowserControlPort(gatewayPort){return derivePort(gatewayPort,2,DEFAULT_BROWSER_CONTROL_PORT)}function deriveDefaultBrowserCdpPortRange(browserControlPort){let start=derivePort(browserControlPort,9,DEFAULT_BROWSER_CDP_PORT_RANGE_START),end=clampPort(start+(DEFAULT_BROWSER_CDP_PORT_RANGE_END-DEFAULT_BROWSER_CDP_PORT_RANGE_START),DEFAULT_BROWSER_CDP_PORT_RANGE_END);return end<start?{start,end:start}:{start,end}}const CDP_PORT_RANGE_START=18800,PROFILE_NAME_REGEX=/^[a-z0-9][a-z0-9-]*$/;function isValidProfileName(name){return!name||name.length>64?!1:PROFILE_NAME_REGEX.test(name)}function allocateCdpPort(usedPorts,range){let start=range?.start??CDP_PORT_RANGE_START,end=range?.end??18899;if(!Number.isFinite(start)||!Number.isFinite(end)||start<=0||end<=0||start>end)return null;for(let port=start;port<=end;port++)if(!usedPorts.has(port))return port;return null}function getUsedPorts(profiles){if(!profiles)return new Set;let used=new Set;for(let profile of Object.values(profiles)){if(typeof profile.cdpPort==`number`){used.add(profile.cdpPort);continue}let rawUrl=profile.cdpUrl?.trim();if(rawUrl)try{let parsed=new URL(rawUrl),port=parsed.port&&Number.parseInt(parsed.port,10)>0?Number.parseInt(parsed.port,10):parsed.protocol===`https:`?443:80;!Number.isNaN(port)&&port>0&&port<=65535&&used.add(port)}catch{}}return used}const PROFILE_COLORS=[`#FF4500`,`#0066CC`,`#00AA00`,`#9933FF`,`#FF6699`,`#00CCCC`,`#FF9900`,`#6666FF`,`#CC3366`,`#339966`];function allocateColor(usedColors){for(let color of PROFILE_COLORS)if(!usedColors.has(color.toUpperCase()))return color;return PROFILE_COLORS[usedColors.size%PROFILE_COLORS.length]??PROFILE_COLORS[0]}function getUsedColors(profiles){return profiles?new Set(Object.values(profiles).map(p=>p.color.toUpperCase())):new Set}function normalizeHexColor(raw){let value=(raw??``).trim();if(!value)return DEFAULT_BUILDERFORCE_AGENTS_BROWSER_COLOR;let normalized=value.startsWith(`#`)?value:`#${value}`;return/^#[0-9a-fA-F]{6}$/.test(normalized)?normalized.toUpperCase():DEFAULT_BUILDERFORCE_AGENTS_BROWSER_COLOR}function normalizeTimeoutMs(raw,fallback){let value=typeof raw==`number`&&Number.isFinite(raw)?Math.floor(raw):fallback;return value<0?fallback:value}function parseHttpUrl(raw,label){let trimmed=raw.trim(),parsed=new URL(trimmed);if(parsed.protocol!==`http:`&&parsed.protocol!==`https:`)throw Error(`${label} must be http(s), got: ${parsed.protocol.replace(`:`,``)}`);let port=parsed.port&&Number.parseInt(parsed.port,10)>0?Number.parseInt(parsed.port,10):parsed.protocol===`https:`?443:80;if(Number.isNaN(port)||port<=0||port>65535)throw Error(`${label} has invalid port: ${parsed.port}`);return{parsed,port,normalized:parsed.toString().replace(/\/$/,``)}}function ensureDefaultProfile(profiles,defaultColor,legacyCdpPort,derivedDefaultCdpPort){let result={...profiles};return result[DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME]||(result[DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME]={cdpPort:legacyCdpPort??derivedDefaultCdpPort??CDP_PORT_RANGE_START,color:defaultColor}),result}function ensureDefaultChromeExtensionProfile(profiles,controlPort){let result={...profiles};if(result.chrome)return result;let relayPort=controlPort+1;return!Number.isFinite(relayPort)||relayPort<=0||relayPort>65535||getUsedPorts(result).has(relayPort)||(result.chrome={driver:`extension`,cdpUrl:`http://127.0.0.1:${relayPort}`,color:`#00AA00`}),result}function resolveBrowserConfig(cfg,rootConfig){let enabled=cfg?.enabled??DEFAULT_BUILDERFORCE_AGENTS_BROWSER_ENABLED,evaluateEnabled=cfg?.evaluateEnabled??DEFAULT_BROWSER_EVALUATE_ENABLED,controlPort=deriveDefaultBrowserControlPort(resolveGatewayPort(rootConfig)??DEFAULT_BROWSER_CONTROL_PORT),defaultColor=normalizeHexColor(cfg?.color),remoteCdpTimeoutMs=normalizeTimeoutMs(cfg?.remoteCdpTimeoutMs,1500),remoteCdpHandshakeTimeoutMs=normalizeTimeoutMs(cfg?.remoteCdpHandshakeTimeoutMs,Math.max(2e3,remoteCdpTimeoutMs*2)),derivedCdpRange=deriveDefaultBrowserCdpPortRange(controlPort),rawCdpUrl=(cfg?.cdpUrl??``).trim(),cdpInfo;if(rawCdpUrl)cdpInfo=parseHttpUrl(rawCdpUrl,`browser.cdpUrl`);else{let derivedPort=controlPort+1;if(derivedPort>65535)throw Error(`Derived CDP port (${derivedPort}) is too high; check gateway port configuration.`);let derived=new URL(`http://127.0.0.1:${derivedPort}`);cdpInfo={parsed:derived,port:derivedPort,normalized:derived.toString().replace(/\/$/,``)}}let headless=cfg?.headless===!0,noSandbox=cfg?.noSandbox===!0,attachOnly=cfg?.attachOnly===!0,executablePath=cfg?.executablePath?.trim()||void 0,defaultProfileFromConfig=cfg?.defaultProfile?.trim()||void 0,legacyCdpPort=rawCdpUrl?cdpInfo.port:void 0,profiles=ensureDefaultChromeExtensionProfile(ensureDefaultProfile(cfg?.profiles,defaultColor,legacyCdpPort,derivedCdpRange.start),controlPort),cdpProtocol=cdpInfo.parsed.protocol===`https:`?`https`:`http`,defaultProfile=defaultProfileFromConfig??(profiles[DEFAULT_BROWSER_DEFAULT_PROFILE_NAME]?DEFAULT_BROWSER_DEFAULT_PROFILE_NAME:DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME),extraArgs=Array.isArray(cfg?.extraArgs)?cfg.extraArgs.filter(a=>typeof a==`string`&&a.trim().length>0):[];return{enabled,evaluateEnabled,controlPort,cdpProtocol,cdpHost:cdpInfo.parsed.hostname,cdpIsLoopback:isLoopbackHost(cdpInfo.parsed.hostname),remoteCdpTimeoutMs,remoteCdpHandshakeTimeoutMs,color:defaultColor,executablePath,headless,noSandbox,attachOnly,defaultProfile,profiles,extraArgs}}function resolveProfile(resolved,profileName){let profile=resolved.profiles[profileName];if(!profile)return null;let rawProfileUrl=profile.cdpUrl?.trim()??``,cdpHost=resolved.cdpHost,cdpPort=profile.cdpPort??0,cdpUrl=``,driver=profile.driver===`extension`?`extension`:`builderforce`;if(rawProfileUrl){let parsed=parseHttpUrl(rawProfileUrl,`browser.profiles.${profileName}.cdpUrl`);cdpHost=parsed.parsed.hostname,cdpPort=parsed.port,cdpUrl=parsed.normalized}else if(cdpPort)cdpUrl=`${resolved.cdpProtocol}://${resolved.cdpHost}:${cdpPort}`;else throw Error(`Profile "${profileName}" must define cdpPort or cdpUrl.`);return{name:profileName,cdpPort,cdpUrl,cdpHost,cdpIsLoopback:isLoopbackHost(cdpHost),color:profile.color,driver}}function applyResolvedConfig(current,freshResolved){current.resolved=freshResolved;for(let[name,runtime]of current.profiles){let nextProfile=resolveProfile(freshResolved,name);if(nextProfile){runtime.profile=nextProfile;continue}runtime.running||current.profiles.delete(name)}}function refreshResolvedBrowserConfigFromDisk(params){if(!params.refreshConfigFromDisk)return;let cfg=params.mode===`fresh`?createConfigIO().loadConfig():loadConfig(),freshResolved=resolveBrowserConfig(cfg.browser,cfg);applyResolvedConfig(params.current,freshResolved)}function resolveBrowserProfileWithHotReload(params){refreshResolvedBrowserConfigFromDisk({current:params.current,refreshConfigFromDisk:params.refreshConfigFromDisk,mode:`cached`});let profile=resolveProfile(params.current.resolved,params.name);return profile||(refreshResolvedBrowserConfigFromDisk({current:params.current,refreshConfigFromDisk:params.refreshConfigFromDisk,mode:`fresh`}),profile=resolveProfile(params.current.resolved,params.name),profile)}function resolveTargetIdFromTabs(input,tabs){let needle=input.trim();if(!needle)return{ok:!1,reason:`not_found`};let exact=tabs.find(t=>t.targetId===needle);if(exact)return{ok:!0,targetId:exact.targetId};let lower=needle.toLowerCase(),matches=tabs.map(t=>t.targetId).filter(id=>id.toLowerCase().startsWith(lower)),only=matches.length===1?matches[0]:void 0;return only?{ok:!0,targetId:only}:matches.length===0?{ok:!1,reason:`not_found`}:{ok:!1,reason:`ambiguous`,matches}}function listKnownProfileNames(state){let names=new Set(Object.keys(state.resolved.profiles));for(let name of state.profiles.keys())names.add(name);return[...names]}function normalizeWsUrl(raw,cdpBaseUrl){if(raw)try{return normalizeCdpWsUrl(raw,cdpBaseUrl)}catch{return raw}}function createProfileContext(opts,profile){let state=()=>{let current=opts.getState();if(!current)throw Error(`Browser server not started`);return current},getProfileState=()=>{let current=state(),profileState=current.profiles.get(profile.name);return profileState||(profileState={profile,running:null,lastTargetId:null},current.profiles.set(profile.name,profileState)),profileState},setProfileRunning=running=>{let profileState=getProfileState();profileState.running=running},listTabs=async()=>{if(!profile.cdpIsLoopback){let listPagesViaPlaywright=(await getPwAiModule({mode:`strict`}))?.listPagesViaPlaywright;if(typeof listPagesViaPlaywright==`function`)return(await listPagesViaPlaywright({cdpUrl:profile.cdpUrl})).map(p=>({targetId:p.targetId,title:p.title,url:p.url,type:p.type}))}return(await fetchJson(appendCdpPath(profile.cdpUrl,`/json/list`))).map(t=>({targetId:t.id??``,title:t.title??``,url:t.url??``,wsUrl:normalizeWsUrl(t.webSocketDebuggerUrl,profile.cdpUrl),type:t.type})).filter(t=>!!t.targetId)},openTab=async url=>{if(!profile.cdpIsLoopback){let createPageViaPlaywright=(await getPwAiModule({mode:`strict`}))?.createPageViaPlaywright;if(typeof createPageViaPlaywright==`function`){let page=await createPageViaPlaywright({cdpUrl:profile.cdpUrl,url}),profileState=getProfileState();return profileState.lastTargetId=page.targetId,{targetId:page.targetId,title:page.title,url:page.url,type:page.type}}}let createdViaCdp=await createTargetViaCdp({cdpUrl:profile.cdpUrl,url}).then(r=>r.targetId).catch(()=>null);if(createdViaCdp){let profileState=getProfileState();profileState.lastTargetId=createdViaCdp;let deadline=Date.now()+2e3;for(;Date.now()<deadline;){let found=(await listTabs().catch(()=>[])).find(t=>t.targetId===createdViaCdp);if(found)return found;await new Promise(r=>setTimeout(r,100))}return{targetId:createdViaCdp,title:``,url,type:`page`}}let encoded=encodeURIComponent(url),endpointUrl=new URL(appendCdpPath(profile.cdpUrl,`/json/new`)),endpoint=endpointUrl.search?(endpointUrl.searchParams.set(`url`,url),endpointUrl.toString()):`${endpointUrl.toString()}?${encoded}`,created=await fetchJson(endpoint,1500,{method:`PUT`}).catch(async err=>{if(String(err).includes(`HTTP 405`))return await fetchJson(endpoint,1500);throw err});if(!created.id)throw Error(`Failed to open tab (missing id)`);let profileState=getProfileState();return profileState.lastTargetId=created.id,{targetId:created.id,title:created.title??``,url:created.url??url,wsUrl:normalizeWsUrl(created.webSocketDebuggerUrl,profile.cdpUrl),type:created.type}},resolveRemoteHttpTimeout=timeoutMs=>{if(profile.cdpIsLoopback)return timeoutMs??300;let resolved=state().resolved;return typeof timeoutMs==`number`&&Number.isFinite(timeoutMs)?Math.max(Math.floor(timeoutMs),resolved.remoteCdpTimeoutMs):resolved.remoteCdpTimeoutMs},resolveRemoteWsTimeout=timeoutMs=>{if(profile.cdpIsLoopback){let base=timeoutMs??300;return Math.max(200,Math.min(2e3,base*2))}let resolved=state().resolved;return typeof timeoutMs==`number`&&Number.isFinite(timeoutMs)?Math.max(Math.floor(timeoutMs)*2,resolved.remoteCdpHandshakeTimeoutMs):resolved.remoteCdpHandshakeTimeoutMs},isReachable=async timeoutMs=>{let httpTimeout=resolveRemoteHttpTimeout(timeoutMs),wsTimeout=resolveRemoteWsTimeout(timeoutMs);return await isChromeCdpReady(profile.cdpUrl,httpTimeout,wsTimeout)},isHttpReachable=async timeoutMs=>{let httpTimeout=resolveRemoteHttpTimeout(timeoutMs);return await isChromeReachable(profile.cdpUrl,httpTimeout)},attachRunning=running=>{setProfileRunning(running),running.proc.on(`exit`,()=>{opts.getState()&&getProfileState().running?.pid===running.pid&&setProfileRunning(null)})},ensureBrowserAvailable=async()=>{let current=state(),remoteCdp=!profile.cdpIsLoopback,isExtension=profile.driver===`extension`,profileState=getProfileState(),httpReachable=await isHttpReachable();if(isExtension&&remoteCdp)throw Error(`Profile "${profile.name}" uses driver=extension but cdpUrl is not loopback (${profile.cdpUrl}).`);if(isExtension){if(!httpReachable&&(await ensureChromeExtensionRelayServer({cdpUrl:profile.cdpUrl}),!await isHttpReachable(1200)))throw Error(`Chrome extension relay for profile "${profile.name}" is not reachable at ${profile.cdpUrl}.`);if(await isReachable(600))return;throw Error(`Chrome extension relay is running, but no tab is connected. Click the BuilderForceAgents Chrome extension icon on a tab to attach it (profile "${profile.name}").`)}if(!httpReachable){if((current.resolved.attachOnly||remoteCdp)&&opts.onEnsureAttachTarget&&(await opts.onEnsureAttachTarget(profile),await isHttpReachable(1200)))return;if(current.resolved.attachOnly||remoteCdp)throw Error(remoteCdp?`Remote CDP for profile "${profile.name}" is not reachable at ${profile.cdpUrl}.`:`Browser attachOnly is enabled and profile "${profile.name}" is not running.`);attachRunning(await launchBuilderForceAgentsChrome(current.resolved,profile));return}if(!await isReachable()){if(!profileState.running)throw Error(`Port ${profile.cdpPort} is in use for profile "${profile.name}" but not by builderforce. Run action=reset-profile profile=${profile.name} to kill the process.`);if(current.resolved.attachOnly||remoteCdp){if(opts.onEnsureAttachTarget&&(await opts.onEnsureAttachTarget(profile),await isReachable(1200)))return;throw Error(remoteCdp?`Remote CDP websocket for profile "${profile.name}" is not reachable.`:`Browser attachOnly is enabled and CDP websocket for profile "${profile.name}" is not reachable.`)}if(await stopBuilderForceAgentsChrome(profileState.running),setProfileRunning(null),attachRunning(await launchBuilderForceAgentsChrome(current.resolved,profile)),!await isReachable(600))throw Error(`Chrome CDP websocket for profile "${profile.name}" is not reachable after restart.`)}},ensureTabAvailable=async targetId=>{await ensureBrowserAvailable();let profileState=getProfileState();if((await listTabs()).length===0){if(profile.driver===`extension`)throw Error(`tab not found (no attached Chrome tabs for profile "${profile.name}"). Click the BuilderForceAgents Browser Relay toolbar icon on the tab you want to control (badge ON).`);await openTab(`about:blank`)}let tabs=await listTabs(),candidates=profile.driver===`extension`||!profile.cdpIsLoopback?tabs:tabs.filter(t=>!!t.wsUrl),resolveById=raw=>{let resolved=resolveTargetIdFromTabs(raw,candidates);return resolved.ok?candidates.find(t=>t.targetId===resolved.targetId)??null:resolved.reason===`ambiguous`?`AMBIGUOUS`:null},chosen=targetId?resolveById(targetId):(()=>{let last=profileState.lastTargetId?.trim()||``,lastResolved=last?resolveById(last):null;return lastResolved&&lastResolved!==`AMBIGUOUS`?lastResolved:candidates.find(t=>(t.type??`page`)===`page`)??candidates.at(0)??null})();if(!chosen&&profile.driver===`extension`&&candidates.length===1&&(chosen=candidates[0]??null),chosen===`AMBIGUOUS`)throw Error(`ambiguous target id prefix`);if(!chosen)throw Error(`tab not found`);return profileState.lastTargetId=chosen.targetId,chosen},focusTab=async targetId=>{let resolved=resolveTargetIdFromTabs(targetId,await listTabs());if(!resolved.ok)throw resolved.reason===`ambiguous`?Error(`ambiguous target id prefix`):Error(`tab not found`);if(!profile.cdpIsLoopback){let focusPageByTargetIdViaPlaywright=(await getPwAiModule({mode:`strict`}))?.focusPageByTargetIdViaPlaywright;if(typeof focusPageByTargetIdViaPlaywright==`function`){await focusPageByTargetIdViaPlaywright({cdpUrl:profile.cdpUrl,targetId:resolved.targetId});let profileState=getProfileState();profileState.lastTargetId=resolved.targetId;return}}await fetchOk(appendCdpPath(profile.cdpUrl,`/json/activate/${resolved.targetId}`));let profileState=getProfileState();profileState.lastTargetId=resolved.targetId},closeTab=async targetId=>{let resolved=resolveTargetIdFromTabs(targetId,await listTabs());if(!resolved.ok)throw resolved.reason===`ambiguous`?Error(`ambiguous target id prefix`):Error(`tab not found`);if(!profile.cdpIsLoopback){let closePageByTargetIdViaPlaywright=(await getPwAiModule({mode:`strict`}))?.closePageByTargetIdViaPlaywright;if(typeof closePageByTargetIdViaPlaywright==`function`){await closePageByTargetIdViaPlaywright({cdpUrl:profile.cdpUrl,targetId:resolved.targetId});return}}await fetchOk(appendCdpPath(profile.cdpUrl,`/json/close/${resolved.targetId}`))},stopRunningBrowser=async()=>{if(profile.driver===`extension`)return{stopped:await stopChromeExtensionRelayServer({cdpUrl:profile.cdpUrl})};let profileState=getProfileState();return profileState.running?(await stopBuilderForceAgentsChrome(profileState.running),setProfileRunning(null),{stopped:!0}):{stopped:!1}};return{profile,ensureBrowserAvailable,ensureTabAvailable,isHttpReachable,isReachable,listTabs,openTab,focusTab,closeTab,stopRunningBrowser,resetProfile:async()=>{if(profile.driver===`extension`)return await stopChromeExtensionRelayServer({cdpUrl:profile.cdpUrl}).catch(()=>{}),{moved:!1,from:profile.cdpUrl};if(!profile.cdpIsLoopback)throw Error(`reset-profile is only supported for local profiles (profile "${profile.name}" is remote).`);let userDataDir=resolveBuilderForceAgentsUserDataDir(profile.name),profileState=getProfileState();if(await isHttpReachable(300)&&!profileState.running)try{await(await import(`./pw-ai-DSEj1QrV.js`)).closePlaywrightBrowserConnection()}catch{}profileState.running&&await stopRunningBrowser();try{await(await import(`./pw-ai-DSEj1QrV.js`)).closePlaywrightBrowserConnection()}catch{}return fs.existsSync(userDataDir)?{moved:!0,from:userDataDir,to:await movePathToTrash(userDataDir)}:{moved:!1,from:userDataDir}}}}function createBrowserRouteContext(opts){let refreshConfigFromDisk=opts.refreshConfigFromDisk===!0,state=()=>{let current=opts.getState();if(!current)throw Error(`Browser server not started`);return current},forProfile=profileName=>{let current=state(),name=profileName??current.resolved.defaultProfile,profile=resolveBrowserProfileWithHotReload({current,refreshConfigFromDisk,name});if(!profile){let available=Object.keys(current.resolved.profiles).join(`, `);throw Error(`Profile "${name}" not found. Available profiles: ${available||`(none)`}`)}return createProfileContext(opts,profile)},listProfiles=async()=>{let current=state();refreshResolvedBrowserConfigFromDisk({current,refreshConfigFromDisk,mode:`cached`});let result=[];for(let name of Object.keys(current.resolved.profiles)){let profileState=current.profiles.get(name),profile=resolveProfile(current.resolved,name);if(!profile)continue;let tabCount=0,running=!1;if(profileState?.running){running=!0;try{tabCount=(await createProfileContext(opts,profile).listTabs()).filter(t=>t.type===`page`).length}catch{}}else try{await isChromeReachable(profile.cdpUrl,200)&&(running=!0,tabCount=(await createProfileContext(opts,profile).listTabs().catch(()=>[])).filter(t=>t.type===`page`).length)}catch{}result.push({name,cdpPort:profile.cdpPort,cdpUrl:profile.cdpUrl,color:profile.color,running,tabCount,isDefault:name===current.resolved.defaultProfile,isRemote:!profile.cdpIsLoopback})}return result},getDefaultContext=()=>forProfile();return{state,forProfile,listProfiles,ensureBrowserAvailable:()=>getDefaultContext().ensureBrowserAvailable(),ensureTabAvailable:targetId=>getDefaultContext().ensureTabAvailable(targetId),isHttpReachable:timeoutMs=>getDefaultContext().isHttpReachable(timeoutMs),isReachable:timeoutMs=>getDefaultContext().isReachable(timeoutMs),listTabs:()=>getDefaultContext().listTabs(),openTab:url=>getDefaultContext().openTab(url),focusTab:targetId=>getDefaultContext().focusTab(targetId),closeTab:targetId=>getDefaultContext().closeTab(targetId),stopRunningBrowser:()=>getDefaultContext().stopRunningBrowser(),resetProfile:()=>getDefaultContext().resetProfile(),mapTabError:err=>{let msg=String(err);return msg.includes(`ambiguous target id prefix`)?{status:409,message:`ambiguous target id prefix`}:msg.includes(`tab not found`)||msg.includes(`not found`)?{status:404,message:msg}:null}}}export{resolveProfile as a,getUsedColors as c,deriveDefaultBrowserCdpPortRange as d,getPwAiModule as f,resolveBrowserConfig as i,getUsedPorts as l,resolveBrowserControlAuth as m,listKnownProfileNames as n,allocateCdpPort as o,ensureBrowserControlAuth as p,parseHttpUrl as r,allocateColor as s,createBrowserRouteContext as t,isValidProfileName as u};
1
+ import{u as resolveGatewayPort}from"./paths-BHg-VHB4.js";import{c as writeConfigFile,n as createConfigIO,r as loadConfig}from"./io-D9hC2aG0.js";import{n as isLoopbackHost}from"./net-DtnXq2dW.js";import{n as formatErrorMessage,t as extractErrorCode}from"./errors-tAt19c1E.js";import{C as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME,D as DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME,E as DEFAULT_BUILDERFORCE_AGENTS_BROWSER_ENABLED,T as DEFAULT_BUILDERFORCE_AGENTS_BROWSER_COLOR,a as resolveBuilderForceAgentsUserDataDir,d as normalizeCdpWsUrl,h as fetchOk,i as launchBuilderForceAgentsChrome,l as createTargetViaCdp,m as fetchJson,n as isChromeCdpReady,o as stopBuilderForceAgentsChrome,p as appendCdpPath,r as isChromeReachable,v as ensureChromeExtensionRelayServer,w as DEFAULT_BROWSER_EVALUATE_ENABLED,y as stopChromeExtensionRelayServer}from"./chrome-CFmcixaE.js";import{i as resolveGatewayAuth}from"./auth-ChecwOXS.js";import{t as movePathToTrash}from"./trash-C3zmJ_O7.js";import fs from"node:fs";import crypto from"node:crypto";function resolveBrowserControlAuth(cfg,env=process.env){let auth=resolveGatewayAuth({authConfig:cfg?.gateway?.auth,env,tailscaleMode:cfg?.gateway?.tailscale?.mode}),token=typeof auth.token==`string`?auth.token.trim():``,password=typeof auth.password==`string`?auth.password.trim():``;return{token:token||void 0,password:password||void 0}}function shouldAutoGenerateBrowserAuth(env){if((env.NODE_ENV??``).trim().toLowerCase()===`test`)return!1;let vitest=(env.VITEST??``).trim().toLowerCase();return!(vitest&&vitest!==`0`&&vitest!==`false`&&vitest!==`off`)}async function ensureBrowserControlAuth(params){let env=params.env??process.env,auth=resolveBrowserControlAuth(params.cfg,env);if(auth.token||auth.password||!shouldAutoGenerateBrowserAuth(env)||params.cfg.gateway?.auth?.mode===`password`||params.cfg.gateway?.auth?.mode===`trusted-proxy`)return{auth};let latestCfg=loadConfig(),latestAuth=resolveBrowserControlAuth(latestCfg,env);if(latestAuth.token||latestAuth.password||latestCfg.gateway?.auth?.mode===`password`||latestCfg.gateway?.auth?.mode===`trusted-proxy`)return{auth:latestAuth};let generatedToken=crypto.randomBytes(24).toString(`hex`);return await writeConfigFile({...latestCfg,gateway:{...latestCfg.gateway,auth:{...latestCfg.gateway?.auth,mode:`token`,token:generatedToken}}}),{auth:{token:generatedToken},generatedToken}}let pwAiModuleSoft=null,pwAiModuleStrict=null;function isModuleNotFoundError(err){if(extractErrorCode(err)===`ERR_MODULE_NOT_FOUND`)return!0;let msg=formatErrorMessage(err);return msg.includes(`Cannot find module`)||msg.includes(`Cannot find package`)||msg.includes(`Failed to resolve import`)||msg.includes(`Failed to resolve entry for package`)||msg.includes(`Failed to load url`)}async function loadPwAiModule(mode){try{return await import(`./pw-ai-CLS_VZ8p.js`)}catch(err){if(mode===`soft`||isModuleNotFoundError(err))return null;throw err}}async function getPwAiModule(opts){return(opts?.mode??`soft`)===`soft`?(pwAiModuleSoft||=loadPwAiModule(`soft`),await pwAiModuleSoft):(pwAiModuleStrict||=loadPwAiModule(`strict`),await pwAiModuleStrict)}function isValidPort(port){return Number.isFinite(port)&&port>0&&port<=65535}function clampPort(port,fallback){return isValidPort(port)?port:fallback}function derivePort(base,offset,fallback){return clampPort(base+offset,fallback)}const DEFAULT_BROWSER_CONTROL_PORT=18791,DEFAULT_BROWSER_CDP_PORT_RANGE_START=18800,DEFAULT_BROWSER_CDP_PORT_RANGE_END=18899;function deriveDefaultBrowserControlPort(gatewayPort){return derivePort(gatewayPort,2,DEFAULT_BROWSER_CONTROL_PORT)}function deriveDefaultBrowserCdpPortRange(browserControlPort){let start=derivePort(browserControlPort,9,DEFAULT_BROWSER_CDP_PORT_RANGE_START),end=clampPort(start+(DEFAULT_BROWSER_CDP_PORT_RANGE_END-DEFAULT_BROWSER_CDP_PORT_RANGE_START),DEFAULT_BROWSER_CDP_PORT_RANGE_END);return end<start?{start,end:start}:{start,end}}const CDP_PORT_RANGE_START=18800,PROFILE_NAME_REGEX=/^[a-z0-9][a-z0-9-]*$/;function isValidProfileName(name){return!name||name.length>64?!1:PROFILE_NAME_REGEX.test(name)}function allocateCdpPort(usedPorts,range){let start=range?.start??CDP_PORT_RANGE_START,end=range?.end??18899;if(!Number.isFinite(start)||!Number.isFinite(end)||start<=0||end<=0||start>end)return null;for(let port=start;port<=end;port++)if(!usedPorts.has(port))return port;return null}function getUsedPorts(profiles){if(!profiles)return new Set;let used=new Set;for(let profile of Object.values(profiles)){if(typeof profile.cdpPort==`number`){used.add(profile.cdpPort);continue}let rawUrl=profile.cdpUrl?.trim();if(rawUrl)try{let parsed=new URL(rawUrl),port=parsed.port&&Number.parseInt(parsed.port,10)>0?Number.parseInt(parsed.port,10):parsed.protocol===`https:`?443:80;!Number.isNaN(port)&&port>0&&port<=65535&&used.add(port)}catch{}}return used}const PROFILE_COLORS=[`#FF4500`,`#0066CC`,`#00AA00`,`#9933FF`,`#FF6699`,`#00CCCC`,`#FF9900`,`#6666FF`,`#CC3366`,`#339966`];function allocateColor(usedColors){for(let color of PROFILE_COLORS)if(!usedColors.has(color.toUpperCase()))return color;return PROFILE_COLORS[usedColors.size%PROFILE_COLORS.length]??PROFILE_COLORS[0]}function getUsedColors(profiles){return profiles?new Set(Object.values(profiles).map(p=>p.color.toUpperCase())):new Set}function normalizeHexColor(raw){let value=(raw??``).trim();if(!value)return DEFAULT_BUILDERFORCE_AGENTS_BROWSER_COLOR;let normalized=value.startsWith(`#`)?value:`#${value}`;return/^#[0-9a-fA-F]{6}$/.test(normalized)?normalized.toUpperCase():DEFAULT_BUILDERFORCE_AGENTS_BROWSER_COLOR}function normalizeTimeoutMs(raw,fallback){let value=typeof raw==`number`&&Number.isFinite(raw)?Math.floor(raw):fallback;return value<0?fallback:value}function parseHttpUrl(raw,label){let trimmed=raw.trim(),parsed=new URL(trimmed);if(parsed.protocol!==`http:`&&parsed.protocol!==`https:`)throw Error(`${label} must be http(s), got: ${parsed.protocol.replace(`:`,``)}`);let port=parsed.port&&Number.parseInt(parsed.port,10)>0?Number.parseInt(parsed.port,10):parsed.protocol===`https:`?443:80;if(Number.isNaN(port)||port<=0||port>65535)throw Error(`${label} has invalid port: ${parsed.port}`);return{parsed,port,normalized:parsed.toString().replace(/\/$/,``)}}function ensureDefaultProfile(profiles,defaultColor,legacyCdpPort,derivedDefaultCdpPort){let result={...profiles};return result[DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME]||(result[DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME]={cdpPort:legacyCdpPort??derivedDefaultCdpPort??CDP_PORT_RANGE_START,color:defaultColor}),result}function ensureDefaultChromeExtensionProfile(profiles,controlPort){let result={...profiles};if(result.chrome)return result;let relayPort=controlPort+1;return!Number.isFinite(relayPort)||relayPort<=0||relayPort>65535||getUsedPorts(result).has(relayPort)||(result.chrome={driver:`extension`,cdpUrl:`http://127.0.0.1:${relayPort}`,color:`#00AA00`}),result}function resolveBrowserConfig(cfg,rootConfig){let enabled=cfg?.enabled??DEFAULT_BUILDERFORCE_AGENTS_BROWSER_ENABLED,evaluateEnabled=cfg?.evaluateEnabled??DEFAULT_BROWSER_EVALUATE_ENABLED,controlPort=deriveDefaultBrowserControlPort(resolveGatewayPort(rootConfig)??DEFAULT_BROWSER_CONTROL_PORT),defaultColor=normalizeHexColor(cfg?.color),remoteCdpTimeoutMs=normalizeTimeoutMs(cfg?.remoteCdpTimeoutMs,1500),remoteCdpHandshakeTimeoutMs=normalizeTimeoutMs(cfg?.remoteCdpHandshakeTimeoutMs,Math.max(2e3,remoteCdpTimeoutMs*2)),derivedCdpRange=deriveDefaultBrowserCdpPortRange(controlPort),rawCdpUrl=(cfg?.cdpUrl??``).trim(),cdpInfo;if(rawCdpUrl)cdpInfo=parseHttpUrl(rawCdpUrl,`browser.cdpUrl`);else{let derivedPort=controlPort+1;if(derivedPort>65535)throw Error(`Derived CDP port (${derivedPort}) is too high; check gateway port configuration.`);let derived=new URL(`http://127.0.0.1:${derivedPort}`);cdpInfo={parsed:derived,port:derivedPort,normalized:derived.toString().replace(/\/$/,``)}}let headless=cfg?.headless===!0,noSandbox=cfg?.noSandbox===!0,attachOnly=cfg?.attachOnly===!0,executablePath=cfg?.executablePath?.trim()||void 0,defaultProfileFromConfig=cfg?.defaultProfile?.trim()||void 0,legacyCdpPort=rawCdpUrl?cdpInfo.port:void 0,profiles=ensureDefaultChromeExtensionProfile(ensureDefaultProfile(cfg?.profiles,defaultColor,legacyCdpPort,derivedCdpRange.start),controlPort),cdpProtocol=cdpInfo.parsed.protocol===`https:`?`https`:`http`,defaultProfile=defaultProfileFromConfig??(profiles[DEFAULT_BROWSER_DEFAULT_PROFILE_NAME]?DEFAULT_BROWSER_DEFAULT_PROFILE_NAME:DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME),extraArgs=Array.isArray(cfg?.extraArgs)?cfg.extraArgs.filter(a=>typeof a==`string`&&a.trim().length>0):[];return{enabled,evaluateEnabled,controlPort,cdpProtocol,cdpHost:cdpInfo.parsed.hostname,cdpIsLoopback:isLoopbackHost(cdpInfo.parsed.hostname),remoteCdpTimeoutMs,remoteCdpHandshakeTimeoutMs,color:defaultColor,executablePath,headless,noSandbox,attachOnly,defaultProfile,profiles,extraArgs}}function resolveProfile(resolved,profileName){let profile=resolved.profiles[profileName];if(!profile)return null;let rawProfileUrl=profile.cdpUrl?.trim()??``,cdpHost=resolved.cdpHost,cdpPort=profile.cdpPort??0,cdpUrl=``,driver=profile.driver===`extension`?`extension`:`builderforce`;if(rawProfileUrl){let parsed=parseHttpUrl(rawProfileUrl,`browser.profiles.${profileName}.cdpUrl`);cdpHost=parsed.parsed.hostname,cdpPort=parsed.port,cdpUrl=parsed.normalized}else if(cdpPort)cdpUrl=`${resolved.cdpProtocol}://${resolved.cdpHost}:${cdpPort}`;else throw Error(`Profile "${profileName}" must define cdpPort or cdpUrl.`);return{name:profileName,cdpPort,cdpUrl,cdpHost,cdpIsLoopback:isLoopbackHost(cdpHost),color:profile.color,driver}}function applyResolvedConfig(current,freshResolved){current.resolved=freshResolved;for(let[name,runtime]of current.profiles){let nextProfile=resolveProfile(freshResolved,name);if(nextProfile){runtime.profile=nextProfile;continue}runtime.running||current.profiles.delete(name)}}function refreshResolvedBrowserConfigFromDisk(params){if(!params.refreshConfigFromDisk)return;let cfg=params.mode===`fresh`?createConfigIO().loadConfig():loadConfig(),freshResolved=resolveBrowserConfig(cfg.browser,cfg);applyResolvedConfig(params.current,freshResolved)}function resolveBrowserProfileWithHotReload(params){refreshResolvedBrowserConfigFromDisk({current:params.current,refreshConfigFromDisk:params.refreshConfigFromDisk,mode:`cached`});let profile=resolveProfile(params.current.resolved,params.name);return profile||(refreshResolvedBrowserConfigFromDisk({current:params.current,refreshConfigFromDisk:params.refreshConfigFromDisk,mode:`fresh`}),profile=resolveProfile(params.current.resolved,params.name),profile)}function resolveTargetIdFromTabs(input,tabs){let needle=input.trim();if(!needle)return{ok:!1,reason:`not_found`};let exact=tabs.find(t=>t.targetId===needle);if(exact)return{ok:!0,targetId:exact.targetId};let lower=needle.toLowerCase(),matches=tabs.map(t=>t.targetId).filter(id=>id.toLowerCase().startsWith(lower)),only=matches.length===1?matches[0]:void 0;return only?{ok:!0,targetId:only}:matches.length===0?{ok:!1,reason:`not_found`}:{ok:!1,reason:`ambiguous`,matches}}function listKnownProfileNames(state){let names=new Set(Object.keys(state.resolved.profiles));for(let name of state.profiles.keys())names.add(name);return[...names]}function normalizeWsUrl(raw,cdpBaseUrl){if(raw)try{return normalizeCdpWsUrl(raw,cdpBaseUrl)}catch{return raw}}function createProfileContext(opts,profile){let state=()=>{let current=opts.getState();if(!current)throw Error(`Browser server not started`);return current},getProfileState=()=>{let current=state(),profileState=current.profiles.get(profile.name);return profileState||(profileState={profile,running:null,lastTargetId:null},current.profiles.set(profile.name,profileState)),profileState},setProfileRunning=running=>{let profileState=getProfileState();profileState.running=running},listTabs=async()=>{if(!profile.cdpIsLoopback){let listPagesViaPlaywright=(await getPwAiModule({mode:`strict`}))?.listPagesViaPlaywright;if(typeof listPagesViaPlaywright==`function`)return(await listPagesViaPlaywright({cdpUrl:profile.cdpUrl})).map(p=>({targetId:p.targetId,title:p.title,url:p.url,type:p.type}))}return(await fetchJson(appendCdpPath(profile.cdpUrl,`/json/list`))).map(t=>({targetId:t.id??``,title:t.title??``,url:t.url??``,wsUrl:normalizeWsUrl(t.webSocketDebuggerUrl,profile.cdpUrl),type:t.type})).filter(t=>!!t.targetId)},openTab=async url=>{if(!profile.cdpIsLoopback){let createPageViaPlaywright=(await getPwAiModule({mode:`strict`}))?.createPageViaPlaywright;if(typeof createPageViaPlaywright==`function`){let page=await createPageViaPlaywright({cdpUrl:profile.cdpUrl,url}),profileState=getProfileState();return profileState.lastTargetId=page.targetId,{targetId:page.targetId,title:page.title,url:page.url,type:page.type}}}let createdViaCdp=await createTargetViaCdp({cdpUrl:profile.cdpUrl,url}).then(r=>r.targetId).catch(()=>null);if(createdViaCdp){let profileState=getProfileState();profileState.lastTargetId=createdViaCdp;let deadline=Date.now()+2e3;for(;Date.now()<deadline;){let found=(await listTabs().catch(()=>[])).find(t=>t.targetId===createdViaCdp);if(found)return found;await new Promise(r=>setTimeout(r,100))}return{targetId:createdViaCdp,title:``,url,type:`page`}}let encoded=encodeURIComponent(url),endpointUrl=new URL(appendCdpPath(profile.cdpUrl,`/json/new`)),endpoint=endpointUrl.search?(endpointUrl.searchParams.set(`url`,url),endpointUrl.toString()):`${endpointUrl.toString()}?${encoded}`,created=await fetchJson(endpoint,1500,{method:`PUT`}).catch(async err=>{if(String(err).includes(`HTTP 405`))return await fetchJson(endpoint,1500);throw err});if(!created.id)throw Error(`Failed to open tab (missing id)`);let profileState=getProfileState();return profileState.lastTargetId=created.id,{targetId:created.id,title:created.title??``,url:created.url??url,wsUrl:normalizeWsUrl(created.webSocketDebuggerUrl,profile.cdpUrl),type:created.type}},resolveRemoteHttpTimeout=timeoutMs=>{if(profile.cdpIsLoopback)return timeoutMs??300;let resolved=state().resolved;return typeof timeoutMs==`number`&&Number.isFinite(timeoutMs)?Math.max(Math.floor(timeoutMs),resolved.remoteCdpTimeoutMs):resolved.remoteCdpTimeoutMs},resolveRemoteWsTimeout=timeoutMs=>{if(profile.cdpIsLoopback){let base=timeoutMs??300;return Math.max(200,Math.min(2e3,base*2))}let resolved=state().resolved;return typeof timeoutMs==`number`&&Number.isFinite(timeoutMs)?Math.max(Math.floor(timeoutMs)*2,resolved.remoteCdpHandshakeTimeoutMs):resolved.remoteCdpHandshakeTimeoutMs},isReachable=async timeoutMs=>{let httpTimeout=resolveRemoteHttpTimeout(timeoutMs),wsTimeout=resolveRemoteWsTimeout(timeoutMs);return await isChromeCdpReady(profile.cdpUrl,httpTimeout,wsTimeout)},isHttpReachable=async timeoutMs=>{let httpTimeout=resolveRemoteHttpTimeout(timeoutMs);return await isChromeReachable(profile.cdpUrl,httpTimeout)},attachRunning=running=>{setProfileRunning(running),running.proc.on(`exit`,()=>{opts.getState()&&getProfileState().running?.pid===running.pid&&setProfileRunning(null)})},ensureBrowserAvailable=async()=>{let current=state(),remoteCdp=!profile.cdpIsLoopback,isExtension=profile.driver===`extension`,profileState=getProfileState(),httpReachable=await isHttpReachable();if(isExtension&&remoteCdp)throw Error(`Profile "${profile.name}" uses driver=extension but cdpUrl is not loopback (${profile.cdpUrl}).`);if(isExtension){if(!httpReachable&&(await ensureChromeExtensionRelayServer({cdpUrl:profile.cdpUrl}),!await isHttpReachable(1200)))throw Error(`Chrome extension relay for profile "${profile.name}" is not reachable at ${profile.cdpUrl}.`);if(await isReachable(600))return;throw Error(`Chrome extension relay is running, but no tab is connected. Click the BuilderForceAgents Chrome extension icon on a tab to attach it (profile "${profile.name}").`)}if(!httpReachable){if((current.resolved.attachOnly||remoteCdp)&&opts.onEnsureAttachTarget&&(await opts.onEnsureAttachTarget(profile),await isHttpReachable(1200)))return;if(current.resolved.attachOnly||remoteCdp)throw Error(remoteCdp?`Remote CDP for profile "${profile.name}" is not reachable at ${profile.cdpUrl}.`:`Browser attachOnly is enabled and profile "${profile.name}" is not running.`);attachRunning(await launchBuilderForceAgentsChrome(current.resolved,profile));return}if(!await isReachable()){if(!profileState.running)throw Error(`Port ${profile.cdpPort} is in use for profile "${profile.name}" but not by builderforce. Run action=reset-profile profile=${profile.name} to kill the process.`);if(current.resolved.attachOnly||remoteCdp){if(opts.onEnsureAttachTarget&&(await opts.onEnsureAttachTarget(profile),await isReachable(1200)))return;throw Error(remoteCdp?`Remote CDP websocket for profile "${profile.name}" is not reachable.`:`Browser attachOnly is enabled and CDP websocket for profile "${profile.name}" is not reachable.`)}if(await stopBuilderForceAgentsChrome(profileState.running),setProfileRunning(null),attachRunning(await launchBuilderForceAgentsChrome(current.resolved,profile)),!await isReachable(600))throw Error(`Chrome CDP websocket for profile "${profile.name}" is not reachable after restart.`)}},ensureTabAvailable=async targetId=>{await ensureBrowserAvailable();let profileState=getProfileState();if((await listTabs()).length===0){if(profile.driver===`extension`)throw Error(`tab not found (no attached Chrome tabs for profile "${profile.name}"). Click the BuilderForceAgents Browser Relay toolbar icon on the tab you want to control (badge ON).`);await openTab(`about:blank`)}let tabs=await listTabs(),candidates=profile.driver===`extension`||!profile.cdpIsLoopback?tabs:tabs.filter(t=>!!t.wsUrl),resolveById=raw=>{let resolved=resolveTargetIdFromTabs(raw,candidates);return resolved.ok?candidates.find(t=>t.targetId===resolved.targetId)??null:resolved.reason===`ambiguous`?`AMBIGUOUS`:null},chosen=targetId?resolveById(targetId):(()=>{let last=profileState.lastTargetId?.trim()||``,lastResolved=last?resolveById(last):null;return lastResolved&&lastResolved!==`AMBIGUOUS`?lastResolved:candidates.find(t=>(t.type??`page`)===`page`)??candidates.at(0)??null})();if(!chosen&&profile.driver===`extension`&&candidates.length===1&&(chosen=candidates[0]??null),chosen===`AMBIGUOUS`)throw Error(`ambiguous target id prefix`);if(!chosen)throw Error(`tab not found`);return profileState.lastTargetId=chosen.targetId,chosen},focusTab=async targetId=>{let resolved=resolveTargetIdFromTabs(targetId,await listTabs());if(!resolved.ok)throw resolved.reason===`ambiguous`?Error(`ambiguous target id prefix`):Error(`tab not found`);if(!profile.cdpIsLoopback){let focusPageByTargetIdViaPlaywright=(await getPwAiModule({mode:`strict`}))?.focusPageByTargetIdViaPlaywright;if(typeof focusPageByTargetIdViaPlaywright==`function`){await focusPageByTargetIdViaPlaywright({cdpUrl:profile.cdpUrl,targetId:resolved.targetId});let profileState=getProfileState();profileState.lastTargetId=resolved.targetId;return}}await fetchOk(appendCdpPath(profile.cdpUrl,`/json/activate/${resolved.targetId}`));let profileState=getProfileState();profileState.lastTargetId=resolved.targetId},closeTab=async targetId=>{let resolved=resolveTargetIdFromTabs(targetId,await listTabs());if(!resolved.ok)throw resolved.reason===`ambiguous`?Error(`ambiguous target id prefix`):Error(`tab not found`);if(!profile.cdpIsLoopback){let closePageByTargetIdViaPlaywright=(await getPwAiModule({mode:`strict`}))?.closePageByTargetIdViaPlaywright;if(typeof closePageByTargetIdViaPlaywright==`function`){await closePageByTargetIdViaPlaywright({cdpUrl:profile.cdpUrl,targetId:resolved.targetId});return}}await fetchOk(appendCdpPath(profile.cdpUrl,`/json/close/${resolved.targetId}`))},stopRunningBrowser=async()=>{if(profile.driver===`extension`)return{stopped:await stopChromeExtensionRelayServer({cdpUrl:profile.cdpUrl})};let profileState=getProfileState();return profileState.running?(await stopBuilderForceAgentsChrome(profileState.running),setProfileRunning(null),{stopped:!0}):{stopped:!1}};return{profile,ensureBrowserAvailable,ensureTabAvailable,isHttpReachable,isReachable,listTabs,openTab,focusTab,closeTab,stopRunningBrowser,resetProfile:async()=>{if(profile.driver===`extension`)return await stopChromeExtensionRelayServer({cdpUrl:profile.cdpUrl}).catch(()=>{}),{moved:!1,from:profile.cdpUrl};if(!profile.cdpIsLoopback)throw Error(`reset-profile is only supported for local profiles (profile "${profile.name}" is remote).`);let userDataDir=resolveBuilderForceAgentsUserDataDir(profile.name),profileState=getProfileState();if(await isHttpReachable(300)&&!profileState.running)try{await(await import(`./pw-ai-CLS_VZ8p.js`)).closePlaywrightBrowserConnection()}catch{}profileState.running&&await stopRunningBrowser();try{await(await import(`./pw-ai-CLS_VZ8p.js`)).closePlaywrightBrowserConnection()}catch{}return fs.existsSync(userDataDir)?{moved:!0,from:userDataDir,to:await movePathToTrash(userDataDir)}:{moved:!1,from:userDataDir}}}}function createBrowserRouteContext(opts){let refreshConfigFromDisk=opts.refreshConfigFromDisk===!0,state=()=>{let current=opts.getState();if(!current)throw Error(`Browser server not started`);return current},forProfile=profileName=>{let current=state(),name=profileName??current.resolved.defaultProfile,profile=resolveBrowserProfileWithHotReload({current,refreshConfigFromDisk,name});if(!profile){let available=Object.keys(current.resolved.profiles).join(`, `);throw Error(`Profile "${name}" not found. Available profiles: ${available||`(none)`}`)}return createProfileContext(opts,profile)},listProfiles=async()=>{let current=state();refreshResolvedBrowserConfigFromDisk({current,refreshConfigFromDisk,mode:`cached`});let result=[];for(let name of Object.keys(current.resolved.profiles)){let profileState=current.profiles.get(name),profile=resolveProfile(current.resolved,name);if(!profile)continue;let tabCount=0,running=!1;if(profileState?.running){running=!0;try{tabCount=(await createProfileContext(opts,profile).listTabs()).filter(t=>t.type===`page`).length}catch{}}else try{await isChromeReachable(profile.cdpUrl,200)&&(running=!0,tabCount=(await createProfileContext(opts,profile).listTabs().catch(()=>[])).filter(t=>t.type===`page`).length)}catch{}result.push({name,cdpPort:profile.cdpPort,cdpUrl:profile.cdpUrl,color:profile.color,running,tabCount,isDefault:name===current.resolved.defaultProfile,isRemote:!profile.cdpIsLoopback})}return result},getDefaultContext=()=>forProfile();return{state,forProfile,listProfiles,ensureBrowserAvailable:()=>getDefaultContext().ensureBrowserAvailable(),ensureTabAvailable:targetId=>getDefaultContext().ensureTabAvailable(targetId),isHttpReachable:timeoutMs=>getDefaultContext().isHttpReachable(timeoutMs),isReachable:timeoutMs=>getDefaultContext().isReachable(timeoutMs),listTabs:()=>getDefaultContext().listTabs(),openTab:url=>getDefaultContext().openTab(url),focusTab:targetId=>getDefaultContext().focusTab(targetId),closeTab:targetId=>getDefaultContext().closeTab(targetId),stopRunningBrowser:()=>getDefaultContext().stopRunningBrowser(),resetProfile:()=>getDefaultContext().resetProfile(),mapTabError:err=>{let msg=String(err);return msg.includes(`ambiguous target id prefix`)?{status:409,message:`ambiguous target id prefix`}:msg.includes(`tab not found`)||msg.includes(`not found`)?{status:404,message:msg}:null}}}export{resolveProfile as a,getUsedColors as c,deriveDefaultBrowserCdpPortRange as d,getPwAiModule as f,resolveBrowserConfig as i,getUsedPorts as l,resolveBrowserControlAuth as m,listKnownProfileNames as n,allocateCdpPort as o,ensureBrowserControlAuth as p,parseHttpUrl as r,allocateColor as s,createBrowserRouteContext as t,isValidProfileName as u};
@@ -1 +1 @@
1
- import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-CEsr3aQ0.js";import{F as pruneLegacyStoreKeys,I as resolveGatewaySessionStoreTarget,Ot as requestHeartbeatNow,P as loadSessionEntry,U as resolveOutboundTarget,di as enqueueSystemEvent}from"./reply-Cd3vVnD7.js";import{f as normalizeMainKey}from"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import{d as resolveSessionAgentId}from"./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"./runner-SxCr9kXD.js";import"./model-catalog-C6UrZ0uG.js";import"./sandbox-BZibn6PX.js";import"./chrome-a3X9_-nf.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DJZT7Upf.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-BzfLvF8W.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import{u as updateSessionStore}from"./sessions-CdanN_ZI.js";import"./message-channel-D_jXxXQj.js";import{r as normalizeChannelId}from"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-DerUBvXW.js";import"./send-DyF1Xy9K.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-CHBjUwUJ.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-wcq7lXuI.js";import"./with-timeout-Bwq-GyUQ.js";import{t as deliverOutboundPayloads}from"./deliver-BpLm3ktn.js";import"./send-CBBziNqM.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import"./memory-cli-DRz4wtHk.js";import"./manager-DwywI_5-.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-BbRf8gFM.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-DrFJ638L.js";import"./send-4d9NswaD.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-CbvMJhD3.js";import"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import"./resolve-route-D49haUnv.js";import"./replies-Bd2RPZwQ.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-6qh9acJy.js";import"./send-BJDzwYJN.js";import"./onboard-helpers-Cf5dNq7-.js";import"./prompt-style-BpVK43GK.js";import"./pairing-labels-BW5jQZlr.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-BdrU4cIE.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-CJj0Inz-.js";import"./control-service-BbsswoMy.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-CoGqoBTH.js";import"./transformers-stream-D7nRu4Qu.js";import"./deps-CkJiJ6wc.js";import{c as parseMessageWithAttachments,l as formatForLog,r as registerApnsToken,s as normalizeRpcAttachmentsToChatAttachments}from"./push-apns-C4sJnHbO.js";import{t as createOutboundSendDeps}from"./outbound-send-deps-CmJnMKI7.js";import{t as agentCommand}from"./agent-cXF-aL0g.js";import{randomUUID}from"node:crypto";const VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS=1500,recentVoiceTranscripts=new Map;function normalizeNonEmptyString(value){if(typeof value!=`string`)return null;let trimmed=value.trim();return trimmed.length>0?trimmed:null}function normalizeFiniteInteger(value){return typeof value==`number`&&Number.isFinite(value)?Math.trunc(value):null}function resolveVoiceTranscriptFingerprint(obj,text){let eventId=normalizeNonEmptyString(obj.eventId)??normalizeNonEmptyString(obj.providerEventId)??normalizeNonEmptyString(obj.transcriptId);if(eventId)return`event:${eventId}`;let callId=normalizeNonEmptyString(obj.providerCallId)??normalizeNonEmptyString(obj.callId),sequence=normalizeFiniteInteger(obj.sequence)??normalizeFiniteInteger(obj.seq);if(callId&&sequence!==null)return`call-seq:${callId}:${sequence}`;let eventTimestamp=normalizeFiniteInteger(obj.timestamp)??normalizeFiniteInteger(obj.ts)??normalizeFiniteInteger(obj.eventTimestamp);return callId&&eventTimestamp!==null?`call-ts:${callId}:${eventTimestamp}`:eventTimestamp===null?`text:${text}`:`timestamp:${eventTimestamp}|text:${text}`}function shouldDropDuplicateVoiceTranscript(params){let previous=recentVoiceTranscripts.get(params.sessionKey);if(previous&&previous.fingerprint===params.fingerprint&&params.now-previous.ts<=VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS)return!0;if(recentVoiceTranscripts.set(params.sessionKey,{fingerprint:params.fingerprint,ts:params.now}),recentVoiceTranscripts.size>200){let cutoff=params.now-VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS*2;for(let[key,value]of recentVoiceTranscripts)if(value.ts<cutoff&&recentVoiceTranscripts.delete(key),recentVoiceTranscripts.size<=200)break;for(;recentVoiceTranscripts.size>200;){let oldestKey=recentVoiceTranscripts.keys().next().value;if(oldestKey===void 0)break;recentVoiceTranscripts.delete(oldestKey)}}return!1}function compactExecEventOutput(raw){let normalized=raw.replace(/\s+/g,` `).trim();return normalized?normalized.length<=180?normalized:`${normalized.slice(0,179)}…`:``}async function touchSessionStore(params){let{storePath}=params;storePath&&await updateSessionStore(storePath,store=>{let target=resolveGatewaySessionStoreTarget({cfg:params.cfg,key:params.sessionKey,store});pruneLegacyStoreKeys({store,canonicalKey:target.canonicalKey,candidates:target.storeKeys}),store[params.canonicalKey]={sessionId:params.sessionId,updatedAt:params.now,thinkingLevel:params.entry?.thinkingLevel,verboseLevel:params.entry?.verboseLevel,reasoningLevel:params.entry?.reasoningLevel,systemSent:params.entry?.systemSent,sendPolicy:params.entry?.sendPolicy,lastChannel:params.entry?.lastChannel,lastTo:params.entry?.lastTo}})}function queueSessionStoreTouch(params){touchSessionStore({cfg:params.cfg,sessionKey:params.sessionKey,storePath:params.storePath,canonicalKey:params.canonicalKey,entry:params.entry,sessionId:params.sessionId,now:params.now}).catch(err=>{params.ctx.logGateway.warn(`voice session-store update failed: `+formatForLog(err))})}function parseSessionKeyFromPayloadJSON(payloadJSON){let payload;try{payload=JSON.parse(payloadJSON)}catch{return null}if(typeof payload!=`object`||!payload)return null;let obj=payload,sessionKey=typeof obj.sessionKey==`string`?obj.sessionKey.trim():``;return sessionKey.length>0?sessionKey:null}async function sendReceiptAck(params){let resolved=resolveOutboundTarget({channel:params.channel,to:params.to,cfg:params.cfg,mode:`explicit`});if(!resolved.ok)throw Error(String(resolved.error));let agentId=resolveSessionAgentId({sessionKey:params.sessionKey,config:params.cfg});await deliverOutboundPayloads({cfg:params.cfg,channel:params.channel,to:resolved.to,payloads:[{text:params.text}],agentId,bestEffort:!0,deps:createOutboundSendDeps(params.deps)})}const handleNodeEvent=async(ctx,nodeId,evt)=>{switch(evt.event){case`voice.transcript`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},text=typeof obj.text==`string`?obj.text.trim():``;if(!text||text.length>2e4)return;let sessionKeyRaw=typeof obj.sessionKey==`string`?obj.sessionKey.trim():``,cfg=loadConfig(),rawMainKey=normalizeMainKey(cfg.session?.mainKey),sessionKey=sessionKeyRaw.length>0?sessionKeyRaw:rawMainKey,{storePath,entry,canonicalKey}=loadSessionEntry(sessionKey),now=Date.now();if(shouldDropDuplicateVoiceTranscript({sessionKey:canonicalKey,fingerprint:resolveVoiceTranscriptFingerprint(obj,text),now}))return;let sessionId=entry?.sessionId??randomUUID();queueSessionStoreTouch({ctx,cfg,sessionKey,storePath,canonicalKey,entry,sessionId,now}),ctx.addChatRun(sessionId,{sessionKey:canonicalKey,clientRunId:`voice-${randomUUID()}`}),agentCommand({message:text,sessionId,sessionKey:canonicalKey,thinking:`low`,deliver:!1,messageChannel:`node`,inputProvenance:{kind:`external_user`,sourceChannel:`voice`,sourceTool:`gateway.voice.transcript`}},defaultRuntime,ctx.deps).catch(err=>{ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`)});return}case`agent.request`:{if(!evt.payloadJSON)return;let link=null;try{link=JSON.parse(evt.payloadJSON)}catch{return}let message=(link?.message??``).trim(),normalizedAttachments=normalizeRpcAttachmentsToChatAttachments(link?.attachments??void 0),images=[];if(normalizedAttachments.length>0)try{let parsed=await parseMessageWithAttachments(message,normalizedAttachments,{maxBytes:5e6,log:ctx.logGateway});message=parsed.message.trim(),images=parsed.images}catch{return}if(!message||message.length>2e4)return;let channel=normalizeChannelId(typeof link?.channel==`string`?link.channel.trim():``)??void 0,to=typeof link?.to==`string`&&link.to.trim()?link.to.trim():void 0,deliverRequested=!!link?.deliver,wantsReceipt=!!link?.receipt,receiptText=(typeof link?.receiptText==`string`?link.receiptText.trim():``)||`Just received your iOS share + request, working on it.`,sessionKeyRaw=(link?.sessionKey??``).trim(),sessionKey=sessionKeyRaw.length>0?sessionKeyRaw:`node-${nodeId}`,cfg=loadConfig(),{storePath,entry,canonicalKey}=loadSessionEntry(sessionKey),now=Date.now(),sessionId=entry?.sessionId??randomUUID();if(await touchSessionStore({cfg,sessionKey,storePath,canonicalKey,entry,sessionId,now}),deliverRequested&&(!channel||!to)){let entryChannel=typeof entry?.lastChannel==`string`?normalizeChannelId(entry.lastChannel):void 0,entryTo=typeof entry?.lastTo==`string`?entry.lastTo.trim():``;!channel&&entryChannel&&(channel=entryChannel),!to&&entryTo&&(to=entryTo)}let deliver=deliverRequested&&!!(channel&&to),deliveryChannel=deliver?channel:void 0,deliveryTo=deliver?to:void 0;deliverRequested&&!deliver&&ctx.logGateway.warn(`agent delivery disabled node=${nodeId}: missing session delivery route (channel=${channel??`-`} to=${to??`-`})`),wantsReceipt&&deliveryChannel&&deliveryTo?sendReceiptAck({cfg,deps:ctx.deps,sessionKey:canonicalKey,channel:deliveryChannel,to:deliveryTo,text:receiptText}).catch(err=>{ctx.logGateway.warn(`agent receipt failed node=${nodeId}: ${formatForLog(err)}`)}):wantsReceipt&&ctx.logGateway.warn(`agent receipt skipped node=${nodeId}: missing delivery route (channel=${deliveryChannel??`-`} to=${deliveryTo??`-`})`),agentCommand({message,images,sessionId,sessionKey:canonicalKey,thinking:link?.thinking??void 0,deliver,to:deliveryTo,channel:deliveryChannel,timeout:typeof link?.timeoutSeconds==`number`?link.timeoutSeconds.toString():void 0,messageChannel:`node`},defaultRuntime,ctx.deps).catch(err=>{ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`)});return}case`chat.subscribe`:{if(!evt.payloadJSON)return;let sessionKey=parseSessionKeyFromPayloadJSON(evt.payloadJSON);if(!sessionKey)return;ctx.nodeSubscribe(nodeId,sessionKey);return}case`chat.unsubscribe`:{if(!evt.payloadJSON)return;let sessionKey=parseSessionKeyFromPayloadJSON(evt.payloadJSON);if(!sessionKey)return;ctx.nodeUnsubscribe(nodeId,sessionKey);return}case`exec.started`:case`exec.finished`:case`exec.denied`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},sessionKey=typeof obj.sessionKey==`string`?obj.sessionKey.trim():`node-${nodeId}`;if(!sessionKey)return;let runId=typeof obj.runId==`string`?obj.runId.trim():``,command=typeof obj.command==`string`?obj.command.trim():``,exitCode=typeof obj.exitCode==`number`&&Number.isFinite(obj.exitCode)?obj.exitCode:void 0,timedOut=obj.timedOut===!0,output=typeof obj.output==`string`?obj.output.trim():``,reason=typeof obj.reason==`string`?obj.reason.trim():``,text=``;if(evt.event===`exec.started`)text=`Exec started (node=${nodeId}${runId?` id=${runId}`:``})`,command&&(text+=`: ${command}`);else if(evt.event===`exec.finished`){let exitLabel=timedOut?`timeout`:`code ${exitCode??`?`}`,compactOutput=compactExecEventOutput(output);if(!(timedOut||exitCode!==0||compactOutput.length>0))return;text=`Exec finished (node=${nodeId}${runId?` id=${runId}`:``}, ${exitLabel})`,compactOutput&&(text+=`\n${compactOutput}`)}else text=`Exec denied (node=${nodeId}${runId?` id=${runId}`:``}${reason?`, ${reason}`:``})`,command&&(text+=`: ${command}`);enqueueSystemEvent(text,{sessionKey,contextKey:runId?`exec:${runId}`:`exec`}),requestHeartbeatNow({reason:`exec-event`});return}case`push.apns.register`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},token=typeof obj.token==`string`?obj.token:``,topic=typeof obj.topic==`string`?obj.topic:``,environment=obj.environment;try{await registerApnsToken({nodeId,token,topic,environment})}catch(err){ctx.logGateway.warn(`push apns register failed node=${nodeId}: ${formatForLog(err)}`)}return}default:return}};export{handleNodeEvent};
1
+ import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-C9jpiwlw.js";import{F as pruneLegacyStoreKeys,I as resolveGatewaySessionStoreTarget,Ot as requestHeartbeatNow,P as loadSessionEntry,U as resolveOutboundTarget,di as enqueueSystemEvent}from"./reply-GY1C8tcv.js";import{f as normalizeMainKey}from"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import{d as resolveSessionAgentId}from"./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"./runner-eTTUbLAK.js";import"./model-catalog-DjNiebr7.js";import"./sandbox-C4AKi2EX.js";import"./chrome-DXt86tmV.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-CQ2v4BAx.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-DZntyPY6.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import{u as updateSessionStore}from"./sessions-BuZVmOWt.js";import"./message-channel-D_jXxXQj.js";import{r as normalizeChannelId}from"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-Aw8wK3vK.js";import"./send-ChGpVO3O.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-CyCi-UqR.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-wcq7lXuI.js";import"./with-timeout-GDLpcjW7.js";import{t as deliverOutboundPayloads}from"./deliver--6OBF3LL.js";import"./send-BxoVLIy1.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import"./memory-cli-CbkWGjRn.js";import"./manager-DSz61dXv.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-T8ciwMTA.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-F5JMAr3p.js";import"./send-BP5osGBo.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-ti3FEkmr.js";import"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import"./resolve-route-D49haUnv.js";import"./replies-DokbEfJD.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-ZhOdlcEI.js";import"./send-l3ge4wkC.js";import"./onboard-helpers-CiHzTaFX.js";import"./prompt-style-BpVK43GK.js";import"./pairing-labels-oA-nKTaW.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-B-wPVN_j.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-CJj0Inz-.js";import"./control-service-y3GYvIBg.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-CoGqoBTH.js";import"./transformers-stream-D7nRu4Qu.js";import"./deps-Dg_9rfXK.js";import{c as parseMessageWithAttachments,l as formatForLog,r as registerApnsToken,s as normalizeRpcAttachmentsToChatAttachments}from"./push-apns-BTPPvY81.js";import{t as createOutboundSendDeps}from"./outbound-send-deps-CmJnMKI7.js";import{t as agentCommand}from"./agent-B-2r1Lr_.js";import{randomUUID}from"node:crypto";const VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS=1500,recentVoiceTranscripts=new Map;function normalizeNonEmptyString(value){if(typeof value!=`string`)return null;let trimmed=value.trim();return trimmed.length>0?trimmed:null}function normalizeFiniteInteger(value){return typeof value==`number`&&Number.isFinite(value)?Math.trunc(value):null}function resolveVoiceTranscriptFingerprint(obj,text){let eventId=normalizeNonEmptyString(obj.eventId)??normalizeNonEmptyString(obj.providerEventId)??normalizeNonEmptyString(obj.transcriptId);if(eventId)return`event:${eventId}`;let callId=normalizeNonEmptyString(obj.providerCallId)??normalizeNonEmptyString(obj.callId),sequence=normalizeFiniteInteger(obj.sequence)??normalizeFiniteInteger(obj.seq);if(callId&&sequence!==null)return`call-seq:${callId}:${sequence}`;let eventTimestamp=normalizeFiniteInteger(obj.timestamp)??normalizeFiniteInteger(obj.ts)??normalizeFiniteInteger(obj.eventTimestamp);return callId&&eventTimestamp!==null?`call-ts:${callId}:${eventTimestamp}`:eventTimestamp===null?`text:${text}`:`timestamp:${eventTimestamp}|text:${text}`}function shouldDropDuplicateVoiceTranscript(params){let previous=recentVoiceTranscripts.get(params.sessionKey);if(previous&&previous.fingerprint===params.fingerprint&&params.now-previous.ts<=VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS)return!0;if(recentVoiceTranscripts.set(params.sessionKey,{fingerprint:params.fingerprint,ts:params.now}),recentVoiceTranscripts.size>200){let cutoff=params.now-VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS*2;for(let[key,value]of recentVoiceTranscripts)if(value.ts<cutoff&&recentVoiceTranscripts.delete(key),recentVoiceTranscripts.size<=200)break;for(;recentVoiceTranscripts.size>200;){let oldestKey=recentVoiceTranscripts.keys().next().value;if(oldestKey===void 0)break;recentVoiceTranscripts.delete(oldestKey)}}return!1}function compactExecEventOutput(raw){let normalized=raw.replace(/\s+/g,` `).trim();return normalized?normalized.length<=180?normalized:`${normalized.slice(0,179)}…`:``}async function touchSessionStore(params){let{storePath}=params;storePath&&await updateSessionStore(storePath,store=>{let target=resolveGatewaySessionStoreTarget({cfg:params.cfg,key:params.sessionKey,store});pruneLegacyStoreKeys({store,canonicalKey:target.canonicalKey,candidates:target.storeKeys}),store[params.canonicalKey]={sessionId:params.sessionId,updatedAt:params.now,thinkingLevel:params.entry?.thinkingLevel,verboseLevel:params.entry?.verboseLevel,reasoningLevel:params.entry?.reasoningLevel,systemSent:params.entry?.systemSent,sendPolicy:params.entry?.sendPolicy,lastChannel:params.entry?.lastChannel,lastTo:params.entry?.lastTo}})}function queueSessionStoreTouch(params){touchSessionStore({cfg:params.cfg,sessionKey:params.sessionKey,storePath:params.storePath,canonicalKey:params.canonicalKey,entry:params.entry,sessionId:params.sessionId,now:params.now}).catch(err=>{params.ctx.logGateway.warn(`voice session-store update failed: `+formatForLog(err))})}function parseSessionKeyFromPayloadJSON(payloadJSON){let payload;try{payload=JSON.parse(payloadJSON)}catch{return null}if(typeof payload!=`object`||!payload)return null;let obj=payload,sessionKey=typeof obj.sessionKey==`string`?obj.sessionKey.trim():``;return sessionKey.length>0?sessionKey:null}async function sendReceiptAck(params){let resolved=resolveOutboundTarget({channel:params.channel,to:params.to,cfg:params.cfg,mode:`explicit`});if(!resolved.ok)throw Error(String(resolved.error));let agentId=resolveSessionAgentId({sessionKey:params.sessionKey,config:params.cfg});await deliverOutboundPayloads({cfg:params.cfg,channel:params.channel,to:resolved.to,payloads:[{text:params.text}],agentId,bestEffort:!0,deps:createOutboundSendDeps(params.deps)})}const handleNodeEvent=async(ctx,nodeId,evt)=>{switch(evt.event){case`voice.transcript`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},text=typeof obj.text==`string`?obj.text.trim():``;if(!text||text.length>2e4)return;let sessionKeyRaw=typeof obj.sessionKey==`string`?obj.sessionKey.trim():``,cfg=loadConfig(),rawMainKey=normalizeMainKey(cfg.session?.mainKey),sessionKey=sessionKeyRaw.length>0?sessionKeyRaw:rawMainKey,{storePath,entry,canonicalKey}=loadSessionEntry(sessionKey),now=Date.now();if(shouldDropDuplicateVoiceTranscript({sessionKey:canonicalKey,fingerprint:resolveVoiceTranscriptFingerprint(obj,text),now}))return;let sessionId=entry?.sessionId??randomUUID();queueSessionStoreTouch({ctx,cfg,sessionKey,storePath,canonicalKey,entry,sessionId,now}),ctx.addChatRun(sessionId,{sessionKey:canonicalKey,clientRunId:`voice-${randomUUID()}`}),agentCommand({message:text,sessionId,sessionKey:canonicalKey,thinking:`low`,deliver:!1,messageChannel:`node`,inputProvenance:{kind:`external_user`,sourceChannel:`voice`,sourceTool:`gateway.voice.transcript`}},defaultRuntime,ctx.deps).catch(err=>{ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`)});return}case`agent.request`:{if(!evt.payloadJSON)return;let link=null;try{link=JSON.parse(evt.payloadJSON)}catch{return}let message=(link?.message??``).trim(),normalizedAttachments=normalizeRpcAttachmentsToChatAttachments(link?.attachments??void 0),images=[];if(normalizedAttachments.length>0)try{let parsed=await parseMessageWithAttachments(message,normalizedAttachments,{maxBytes:5e6,log:ctx.logGateway});message=parsed.message.trim(),images=parsed.images}catch{return}if(!message||message.length>2e4)return;let channel=normalizeChannelId(typeof link?.channel==`string`?link.channel.trim():``)??void 0,to=typeof link?.to==`string`&&link.to.trim()?link.to.trim():void 0,deliverRequested=!!link?.deliver,wantsReceipt=!!link?.receipt,receiptText=(typeof link?.receiptText==`string`?link.receiptText.trim():``)||`Just received your iOS share + request, working on it.`,sessionKeyRaw=(link?.sessionKey??``).trim(),sessionKey=sessionKeyRaw.length>0?sessionKeyRaw:`node-${nodeId}`,cfg=loadConfig(),{storePath,entry,canonicalKey}=loadSessionEntry(sessionKey),now=Date.now(),sessionId=entry?.sessionId??randomUUID();if(await touchSessionStore({cfg,sessionKey,storePath,canonicalKey,entry,sessionId,now}),deliverRequested&&(!channel||!to)){let entryChannel=typeof entry?.lastChannel==`string`?normalizeChannelId(entry.lastChannel):void 0,entryTo=typeof entry?.lastTo==`string`?entry.lastTo.trim():``;!channel&&entryChannel&&(channel=entryChannel),!to&&entryTo&&(to=entryTo)}let deliver=deliverRequested&&!!(channel&&to),deliveryChannel=deliver?channel:void 0,deliveryTo=deliver?to:void 0;deliverRequested&&!deliver&&ctx.logGateway.warn(`agent delivery disabled node=${nodeId}: missing session delivery route (channel=${channel??`-`} to=${to??`-`})`),wantsReceipt&&deliveryChannel&&deliveryTo?sendReceiptAck({cfg,deps:ctx.deps,sessionKey:canonicalKey,channel:deliveryChannel,to:deliveryTo,text:receiptText}).catch(err=>{ctx.logGateway.warn(`agent receipt failed node=${nodeId}: ${formatForLog(err)}`)}):wantsReceipt&&ctx.logGateway.warn(`agent receipt skipped node=${nodeId}: missing delivery route (channel=${deliveryChannel??`-`} to=${deliveryTo??`-`})`),agentCommand({message,images,sessionId,sessionKey:canonicalKey,thinking:link?.thinking??void 0,deliver,to:deliveryTo,channel:deliveryChannel,timeout:typeof link?.timeoutSeconds==`number`?link.timeoutSeconds.toString():void 0,messageChannel:`node`},defaultRuntime,ctx.deps).catch(err=>{ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`)});return}case`chat.subscribe`:{if(!evt.payloadJSON)return;let sessionKey=parseSessionKeyFromPayloadJSON(evt.payloadJSON);if(!sessionKey)return;ctx.nodeSubscribe(nodeId,sessionKey);return}case`chat.unsubscribe`:{if(!evt.payloadJSON)return;let sessionKey=parseSessionKeyFromPayloadJSON(evt.payloadJSON);if(!sessionKey)return;ctx.nodeUnsubscribe(nodeId,sessionKey);return}case`exec.started`:case`exec.finished`:case`exec.denied`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},sessionKey=typeof obj.sessionKey==`string`?obj.sessionKey.trim():`node-${nodeId}`;if(!sessionKey)return;let runId=typeof obj.runId==`string`?obj.runId.trim():``,command=typeof obj.command==`string`?obj.command.trim():``,exitCode=typeof obj.exitCode==`number`&&Number.isFinite(obj.exitCode)?obj.exitCode:void 0,timedOut=obj.timedOut===!0,output=typeof obj.output==`string`?obj.output.trim():``,reason=typeof obj.reason==`string`?obj.reason.trim():``,text=``;if(evt.event===`exec.started`)text=`Exec started (node=${nodeId}${runId?` id=${runId}`:``})`,command&&(text+=`: ${command}`);else if(evt.event===`exec.finished`){let exitLabel=timedOut?`timeout`:`code ${exitCode??`?`}`,compactOutput=compactExecEventOutput(output);if(!(timedOut||exitCode!==0||compactOutput.length>0))return;text=`Exec finished (node=${nodeId}${runId?` id=${runId}`:``}, ${exitLabel})`,compactOutput&&(text+=`\n${compactOutput}`)}else text=`Exec denied (node=${nodeId}${runId?` id=${runId}`:``}${reason?`, ${reason}`:``})`,command&&(text+=`: ${command}`);enqueueSystemEvent(text,{sessionKey,contextKey:runId?`exec:${runId}`:`exec`}),requestHeartbeatNow({reason:`exec-event`});return}case`push.apns.register`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},token=typeof obj.token==`string`?obj.token:``,topic=typeof obj.topic==`string`?obj.topic:``,environment=obj.environment;try{await registerApnsToken({nodeId,token,topic,environment})}catch(err){ctx.logGateway.warn(`push apns register failed node=${nodeId}: ${formatForLog(err)}`)}return}default:return}};export{handleNodeEvent};
@@ -1 +1 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import{p as defaultRuntime}from"./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{f as normalizeMainKey}from"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import{d as resolveSessionAgentId}from"./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"./model-discovery-C9Xm95uL.js";import"./model-catalog-CiiFJX77.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-DmAU4cRX.js";import"./message-channel-z5YRpR2d.js";import{Ln as enqueueSystemEvent,at as resolveOutboundTarget,in as requestHeartbeatNow}from"./subagent-registry-CyGxu3kP.js";import{u as updateSessionStore}from"./sessions-Bl1wwotX.js";import"./project-context-store-CIUcwUP_.js";import"./tokens-CFKkpUIu.js";import{r as normalizeChannelId}from"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-BvroeIQ6.js";import"./send-CceNWtYE.js";import"./with-timeout-T07SJo4N.js";import{t as deliverOutboundPayloads}from"./deliver-BuZu68tp.js";import"./accounts-Cx82nj4E.js";import"./send-ByCVQQVz.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-DK8_apW0.js";import"./sandbox-z9t_PRf9.js";import"./chrome-BnEbJV3D.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-owOmmyUM.js";import"./routes-lclJHOYY.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./workspace-waBqRxiy.js";import"./reply-prefix-Cg7AqaK0.js";import"./sqlite-CIGM1WKg.js";import"./memory-cli-ivAs7q7v.js";import"./manager-CRba8roB.js";import"./gemini-auth-CkD5jCPh.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import"./runner-DwWmciCt.js";import"./tool-display-Cs4hDP1f.js";import"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-CprBhARf.js";import{c as resolveGatewaySessionStoreTarget,o as loadSessionEntry,s as pruneLegacyStoreKeys}from"./session-utils-GMvum00v.js";import"./coding-tools.policy-NEPm7Mz1.js";import"./pairing-store-QDb6lhIU.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-Bn4ZrnU7.js";import"./send-B_1BtyfA.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-D3Mx4maV.js";import"./control-service-CJuuqNOE.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-UFtylOiq.js";import"./resolve-route-DEIW5uKy.js";import"./channel-activity-DX36RadH.js";import"./tables-CojSfTth.js";import"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DbkT_5BV.js";import"./onboard-helpers-CckrS8_K.js";import"./prompt-style-BMWmaqSC.js";import"./pairing-labels-3j_iRYOO.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-CV4nDcCk.js";import"./transformers-stream-Buj40qHl.js";import{t as createOutboundSendDeps}from"./outbound-send-deps-m6DqOma_.js";import{c as parseMessageWithAttachments,l as formatForLog,r as registerApnsToken,s as normalizeRpcAttachmentsToChatAttachments}from"./push-apns-CiD3rrVv.js";import{t as agentCommand}from"./agent-wJmvciTM.js";import{randomUUID}from"node:crypto";const VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS=1500,recentVoiceTranscripts=new Map;function normalizeNonEmptyString(value){if(typeof value!=`string`)return null;let trimmed=value.trim();return trimmed.length>0?trimmed:null}function normalizeFiniteInteger(value){return typeof value==`number`&&Number.isFinite(value)?Math.trunc(value):null}function resolveVoiceTranscriptFingerprint(obj,text){let eventId=normalizeNonEmptyString(obj.eventId)??normalizeNonEmptyString(obj.providerEventId)??normalizeNonEmptyString(obj.transcriptId);if(eventId)return`event:${eventId}`;let callId=normalizeNonEmptyString(obj.providerCallId)??normalizeNonEmptyString(obj.callId),sequence=normalizeFiniteInteger(obj.sequence)??normalizeFiniteInteger(obj.seq);if(callId&&sequence!==null)return`call-seq:${callId}:${sequence}`;let eventTimestamp=normalizeFiniteInteger(obj.timestamp)??normalizeFiniteInteger(obj.ts)??normalizeFiniteInteger(obj.eventTimestamp);return callId&&eventTimestamp!==null?`call-ts:${callId}:${eventTimestamp}`:eventTimestamp===null?`text:${text}`:`timestamp:${eventTimestamp}|text:${text}`}function shouldDropDuplicateVoiceTranscript(params){let previous=recentVoiceTranscripts.get(params.sessionKey);if(previous&&previous.fingerprint===params.fingerprint&&params.now-previous.ts<=VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS)return!0;if(recentVoiceTranscripts.set(params.sessionKey,{fingerprint:params.fingerprint,ts:params.now}),recentVoiceTranscripts.size>200){let cutoff=params.now-VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS*2;for(let[key,value]of recentVoiceTranscripts)if(value.ts<cutoff&&recentVoiceTranscripts.delete(key),recentVoiceTranscripts.size<=200)break;for(;recentVoiceTranscripts.size>200;){let oldestKey=recentVoiceTranscripts.keys().next().value;if(oldestKey===void 0)break;recentVoiceTranscripts.delete(oldestKey)}}return!1}function compactExecEventOutput(raw){let normalized=raw.replace(/\s+/g,` `).trim();return normalized?normalized.length<=180?normalized:`${normalized.slice(0,179)}…`:``}async function touchSessionStore(params){let{storePath}=params;storePath&&await updateSessionStore(storePath,store=>{let target=resolveGatewaySessionStoreTarget({cfg:params.cfg,key:params.sessionKey,store});pruneLegacyStoreKeys({store,canonicalKey:target.canonicalKey,candidates:target.storeKeys}),store[params.canonicalKey]={sessionId:params.sessionId,updatedAt:params.now,thinkingLevel:params.entry?.thinkingLevel,verboseLevel:params.entry?.verboseLevel,reasoningLevel:params.entry?.reasoningLevel,systemSent:params.entry?.systemSent,sendPolicy:params.entry?.sendPolicy,lastChannel:params.entry?.lastChannel,lastTo:params.entry?.lastTo}})}function queueSessionStoreTouch(params){touchSessionStore({cfg:params.cfg,sessionKey:params.sessionKey,storePath:params.storePath,canonicalKey:params.canonicalKey,entry:params.entry,sessionId:params.sessionId,now:params.now}).catch(err=>{params.ctx.logGateway.warn(`voice session-store update failed: `+formatForLog(err))})}function parseSessionKeyFromPayloadJSON(payloadJSON){let payload;try{payload=JSON.parse(payloadJSON)}catch{return null}if(typeof payload!=`object`||!payload)return null;let obj=payload,sessionKey=typeof obj.sessionKey==`string`?obj.sessionKey.trim():``;return sessionKey.length>0?sessionKey:null}async function sendReceiptAck(params){let resolved=resolveOutboundTarget({channel:params.channel,to:params.to,cfg:params.cfg,mode:`explicit`});if(!resolved.ok)throw Error(String(resolved.error));let agentId=resolveSessionAgentId({sessionKey:params.sessionKey,config:params.cfg});await deliverOutboundPayloads({cfg:params.cfg,channel:params.channel,to:resolved.to,payloads:[{text:params.text}],agentId,bestEffort:!0,deps:createOutboundSendDeps(params.deps)})}const handleNodeEvent=async(ctx,nodeId,evt)=>{switch(evt.event){case`voice.transcript`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},text=typeof obj.text==`string`?obj.text.trim():``;if(!text||text.length>2e4)return;let sessionKeyRaw=typeof obj.sessionKey==`string`?obj.sessionKey.trim():``,cfg=loadConfig(),rawMainKey=normalizeMainKey(cfg.session?.mainKey),sessionKey=sessionKeyRaw.length>0?sessionKeyRaw:rawMainKey,{storePath,entry,canonicalKey}=loadSessionEntry(sessionKey),now=Date.now();if(shouldDropDuplicateVoiceTranscript({sessionKey:canonicalKey,fingerprint:resolveVoiceTranscriptFingerprint(obj,text),now}))return;let sessionId=entry?.sessionId??randomUUID();queueSessionStoreTouch({ctx,cfg,sessionKey,storePath,canonicalKey,entry,sessionId,now}),ctx.addChatRun(sessionId,{sessionKey:canonicalKey,clientRunId:`voice-${randomUUID()}`}),agentCommand({message:text,sessionId,sessionKey:canonicalKey,thinking:`low`,deliver:!1,messageChannel:`node`,inputProvenance:{kind:`external_user`,sourceChannel:`voice`,sourceTool:`gateway.voice.transcript`}},defaultRuntime,ctx.deps).catch(err=>{ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`)});return}case`agent.request`:{if(!evt.payloadJSON)return;let link=null;try{link=JSON.parse(evt.payloadJSON)}catch{return}let message=(link?.message??``).trim(),normalizedAttachments=normalizeRpcAttachmentsToChatAttachments(link?.attachments??void 0),images=[];if(normalizedAttachments.length>0)try{let parsed=await parseMessageWithAttachments(message,normalizedAttachments,{maxBytes:5e6,log:ctx.logGateway});message=parsed.message.trim(),images=parsed.images}catch{return}if(!message||message.length>2e4)return;let channel=normalizeChannelId(typeof link?.channel==`string`?link.channel.trim():``)??void 0,to=typeof link?.to==`string`&&link.to.trim()?link.to.trim():void 0,deliverRequested=!!link?.deliver,wantsReceipt=!!link?.receipt,receiptText=(typeof link?.receiptText==`string`?link.receiptText.trim():``)||`Just received your iOS share + request, working on it.`,sessionKeyRaw=(link?.sessionKey??``).trim(),sessionKey=sessionKeyRaw.length>0?sessionKeyRaw:`node-${nodeId}`,cfg=loadConfig(),{storePath,entry,canonicalKey}=loadSessionEntry(sessionKey),now=Date.now(),sessionId=entry?.sessionId??randomUUID();if(await touchSessionStore({cfg,sessionKey,storePath,canonicalKey,entry,sessionId,now}),deliverRequested&&(!channel||!to)){let entryChannel=typeof entry?.lastChannel==`string`?normalizeChannelId(entry.lastChannel):void 0,entryTo=typeof entry?.lastTo==`string`?entry.lastTo.trim():``;!channel&&entryChannel&&(channel=entryChannel),!to&&entryTo&&(to=entryTo)}let deliver=deliverRequested&&!!(channel&&to),deliveryChannel=deliver?channel:void 0,deliveryTo=deliver?to:void 0;deliverRequested&&!deliver&&ctx.logGateway.warn(`agent delivery disabled node=${nodeId}: missing session delivery route (channel=${channel??`-`} to=${to??`-`})`),wantsReceipt&&deliveryChannel&&deliveryTo?sendReceiptAck({cfg,deps:ctx.deps,sessionKey:canonicalKey,channel:deliveryChannel,to:deliveryTo,text:receiptText}).catch(err=>{ctx.logGateway.warn(`agent receipt failed node=${nodeId}: ${formatForLog(err)}`)}):wantsReceipt&&ctx.logGateway.warn(`agent receipt skipped node=${nodeId}: missing delivery route (channel=${deliveryChannel??`-`} to=${deliveryTo??`-`})`),agentCommand({message,images,sessionId,sessionKey:canonicalKey,thinking:link?.thinking??void 0,deliver,to:deliveryTo,channel:deliveryChannel,timeout:typeof link?.timeoutSeconds==`number`?link.timeoutSeconds.toString():void 0,messageChannel:`node`},defaultRuntime,ctx.deps).catch(err=>{ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`)});return}case`chat.subscribe`:{if(!evt.payloadJSON)return;let sessionKey=parseSessionKeyFromPayloadJSON(evt.payloadJSON);if(!sessionKey)return;ctx.nodeSubscribe(nodeId,sessionKey);return}case`chat.unsubscribe`:{if(!evt.payloadJSON)return;let sessionKey=parseSessionKeyFromPayloadJSON(evt.payloadJSON);if(!sessionKey)return;ctx.nodeUnsubscribe(nodeId,sessionKey);return}case`exec.started`:case`exec.finished`:case`exec.denied`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},sessionKey=typeof obj.sessionKey==`string`?obj.sessionKey.trim():`node-${nodeId}`;if(!sessionKey)return;let runId=typeof obj.runId==`string`?obj.runId.trim():``,command=typeof obj.command==`string`?obj.command.trim():``,exitCode=typeof obj.exitCode==`number`&&Number.isFinite(obj.exitCode)?obj.exitCode:void 0,timedOut=obj.timedOut===!0,output=typeof obj.output==`string`?obj.output.trim():``,reason=typeof obj.reason==`string`?obj.reason.trim():``,text=``;if(evt.event===`exec.started`)text=`Exec started (node=${nodeId}${runId?` id=${runId}`:``})`,command&&(text+=`: ${command}`);else if(evt.event===`exec.finished`){let exitLabel=timedOut?`timeout`:`code ${exitCode??`?`}`,compactOutput=compactExecEventOutput(output);if(!(timedOut||exitCode!==0||compactOutput.length>0))return;text=`Exec finished (node=${nodeId}${runId?` id=${runId}`:``}, ${exitLabel})`,compactOutput&&(text+=`\n${compactOutput}`)}else text=`Exec denied (node=${nodeId}${runId?` id=${runId}`:``}${reason?`, ${reason}`:``})`,command&&(text+=`: ${command}`);enqueueSystemEvent(text,{sessionKey,contextKey:runId?`exec:${runId}`:`exec`}),requestHeartbeatNow({reason:`exec-event`});return}case`push.apns.register`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},token=typeof obj.token==`string`?obj.token:``,topic=typeof obj.topic==`string`?obj.topic:``,environment=obj.environment;try{await registerApnsToken({nodeId,token,topic,environment})}catch(err){ctx.logGateway.warn(`push apns register failed node=${nodeId}: ${formatForLog(err)}`)}return}default:return}};export{handleNodeEvent};
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import{p as defaultRuntime}from"./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{f as normalizeMainKey}from"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import{d as resolveSessionAgentId}from"./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"./model-discovery-D0i1JpiL.js";import"./model-catalog-BeBXvbFm.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-Du2LiaX6.js";import"./message-channel-z5YRpR2d.js";import{Ln as enqueueSystemEvent,at as resolveOutboundTarget,in as requestHeartbeatNow}from"./subagent-registry-DDEN4oJi.js";import{u as updateSessionStore}from"./sessions-BA8Se_bT.js";import"./project-context-store-CIUcwUP_.js";import"./tokens-CFKkpUIu.js";import{r as normalizeChannelId}from"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-B7H8Ae5j.js";import"./send-DqR7Rxzm.js";import"./with-timeout-B_p5pWDv.js";import{t as deliverOutboundPayloads}from"./deliver-CsG0cHbZ.js";import"./accounts-Cx82nj4E.js";import"./send-KgN1P41U.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-DdU30lmt.js";import"./sandbox-DvKMuAXL.js";import"./chrome-CFmcixaE.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-CttALzrW.js";import"./routes-_iZdG1Fo.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./workspace-waBqRxiy.js";import"./reply-prefix-Cg7AqaK0.js";import"./sqlite-CIGM1WKg.js";import"./memory-cli-CveeVOWH.js";import"./manager-BeohB4-8.js";import"./gemini-auth-DDR12zst.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import"./runner-Cu9NJouV.js";import"./tool-display-Cs4hDP1f.js";import"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-9ksvqHYX.js";import{c as resolveGatewaySessionStoreTarget,o as loadSessionEntry,s as pruneLegacyStoreKeys}from"./session-utils-Dxou8SbO.js";import"./coding-tools.policy-D9Ba8eDh.js";import"./pairing-store-YRy7EBgI.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-B8lFHp0K.js";import"./send-kkm_zrHQ.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-D3Mx4maV.js";import"./control-service-2PkCt256.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-CYGOPcKq.js";import"./resolve-route-DEIW5uKy.js";import"./channel-activity-DX36RadH.js";import"./tables-CojSfTth.js";import"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-BOGMDhSN.js";import"./onboard-helpers-Ce_c4Raj.js";import"./prompt-style-BMWmaqSC.js";import"./pairing-labels-BJPrScRl.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-CV4nDcCk.js";import"./transformers-stream-Buj40qHl.js";import{t as createOutboundSendDeps}from"./outbound-send-deps-B3Lg-uqF.js";import{c as parseMessageWithAttachments,l as formatForLog,r as registerApnsToken,s as normalizeRpcAttachmentsToChatAttachments}from"./push-apns-CscYUS0D.js";import{t as agentCommand}from"./agent-BI9qSnSp.js";import{randomUUID}from"node:crypto";const VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS=1500,recentVoiceTranscripts=new Map;function normalizeNonEmptyString(value){if(typeof value!=`string`)return null;let trimmed=value.trim();return trimmed.length>0?trimmed:null}function normalizeFiniteInteger(value){return typeof value==`number`&&Number.isFinite(value)?Math.trunc(value):null}function resolveVoiceTranscriptFingerprint(obj,text){let eventId=normalizeNonEmptyString(obj.eventId)??normalizeNonEmptyString(obj.providerEventId)??normalizeNonEmptyString(obj.transcriptId);if(eventId)return`event:${eventId}`;let callId=normalizeNonEmptyString(obj.providerCallId)??normalizeNonEmptyString(obj.callId),sequence=normalizeFiniteInteger(obj.sequence)??normalizeFiniteInteger(obj.seq);if(callId&&sequence!==null)return`call-seq:${callId}:${sequence}`;let eventTimestamp=normalizeFiniteInteger(obj.timestamp)??normalizeFiniteInteger(obj.ts)??normalizeFiniteInteger(obj.eventTimestamp);return callId&&eventTimestamp!==null?`call-ts:${callId}:${eventTimestamp}`:eventTimestamp===null?`text:${text}`:`timestamp:${eventTimestamp}|text:${text}`}function shouldDropDuplicateVoiceTranscript(params){let previous=recentVoiceTranscripts.get(params.sessionKey);if(previous&&previous.fingerprint===params.fingerprint&&params.now-previous.ts<=VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS)return!0;if(recentVoiceTranscripts.set(params.sessionKey,{fingerprint:params.fingerprint,ts:params.now}),recentVoiceTranscripts.size>200){let cutoff=params.now-VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS*2;for(let[key,value]of recentVoiceTranscripts)if(value.ts<cutoff&&recentVoiceTranscripts.delete(key),recentVoiceTranscripts.size<=200)break;for(;recentVoiceTranscripts.size>200;){let oldestKey=recentVoiceTranscripts.keys().next().value;if(oldestKey===void 0)break;recentVoiceTranscripts.delete(oldestKey)}}return!1}function compactExecEventOutput(raw){let normalized=raw.replace(/\s+/g,` `).trim();return normalized?normalized.length<=180?normalized:`${normalized.slice(0,179)}…`:``}async function touchSessionStore(params){let{storePath}=params;storePath&&await updateSessionStore(storePath,store=>{let target=resolveGatewaySessionStoreTarget({cfg:params.cfg,key:params.sessionKey,store});pruneLegacyStoreKeys({store,canonicalKey:target.canonicalKey,candidates:target.storeKeys}),store[params.canonicalKey]={sessionId:params.sessionId,updatedAt:params.now,thinkingLevel:params.entry?.thinkingLevel,verboseLevel:params.entry?.verboseLevel,reasoningLevel:params.entry?.reasoningLevel,systemSent:params.entry?.systemSent,sendPolicy:params.entry?.sendPolicy,lastChannel:params.entry?.lastChannel,lastTo:params.entry?.lastTo}})}function queueSessionStoreTouch(params){touchSessionStore({cfg:params.cfg,sessionKey:params.sessionKey,storePath:params.storePath,canonicalKey:params.canonicalKey,entry:params.entry,sessionId:params.sessionId,now:params.now}).catch(err=>{params.ctx.logGateway.warn(`voice session-store update failed: `+formatForLog(err))})}function parseSessionKeyFromPayloadJSON(payloadJSON){let payload;try{payload=JSON.parse(payloadJSON)}catch{return null}if(typeof payload!=`object`||!payload)return null;let obj=payload,sessionKey=typeof obj.sessionKey==`string`?obj.sessionKey.trim():``;return sessionKey.length>0?sessionKey:null}async function sendReceiptAck(params){let resolved=resolveOutboundTarget({channel:params.channel,to:params.to,cfg:params.cfg,mode:`explicit`});if(!resolved.ok)throw Error(String(resolved.error));let agentId=resolveSessionAgentId({sessionKey:params.sessionKey,config:params.cfg});await deliverOutboundPayloads({cfg:params.cfg,channel:params.channel,to:resolved.to,payloads:[{text:params.text}],agentId,bestEffort:!0,deps:createOutboundSendDeps(params.deps)})}const handleNodeEvent=async(ctx,nodeId,evt)=>{switch(evt.event){case`voice.transcript`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},text=typeof obj.text==`string`?obj.text.trim():``;if(!text||text.length>2e4)return;let sessionKeyRaw=typeof obj.sessionKey==`string`?obj.sessionKey.trim():``,cfg=loadConfig(),rawMainKey=normalizeMainKey(cfg.session?.mainKey),sessionKey=sessionKeyRaw.length>0?sessionKeyRaw:rawMainKey,{storePath,entry,canonicalKey}=loadSessionEntry(sessionKey),now=Date.now();if(shouldDropDuplicateVoiceTranscript({sessionKey:canonicalKey,fingerprint:resolveVoiceTranscriptFingerprint(obj,text),now}))return;let sessionId=entry?.sessionId??randomUUID();queueSessionStoreTouch({ctx,cfg,sessionKey,storePath,canonicalKey,entry,sessionId,now}),ctx.addChatRun(sessionId,{sessionKey:canonicalKey,clientRunId:`voice-${randomUUID()}`}),agentCommand({message:text,sessionId,sessionKey:canonicalKey,thinking:`low`,deliver:!1,messageChannel:`node`,inputProvenance:{kind:`external_user`,sourceChannel:`voice`,sourceTool:`gateway.voice.transcript`}},defaultRuntime,ctx.deps).catch(err=>{ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`)});return}case`agent.request`:{if(!evt.payloadJSON)return;let link=null;try{link=JSON.parse(evt.payloadJSON)}catch{return}let message=(link?.message??``).trim(),normalizedAttachments=normalizeRpcAttachmentsToChatAttachments(link?.attachments??void 0),images=[];if(normalizedAttachments.length>0)try{let parsed=await parseMessageWithAttachments(message,normalizedAttachments,{maxBytes:5e6,log:ctx.logGateway});message=parsed.message.trim(),images=parsed.images}catch{return}if(!message||message.length>2e4)return;let channel=normalizeChannelId(typeof link?.channel==`string`?link.channel.trim():``)??void 0,to=typeof link?.to==`string`&&link.to.trim()?link.to.trim():void 0,deliverRequested=!!link?.deliver,wantsReceipt=!!link?.receipt,receiptText=(typeof link?.receiptText==`string`?link.receiptText.trim():``)||`Just received your iOS share + request, working on it.`,sessionKeyRaw=(link?.sessionKey??``).trim(),sessionKey=sessionKeyRaw.length>0?sessionKeyRaw:`node-${nodeId}`,cfg=loadConfig(),{storePath,entry,canonicalKey}=loadSessionEntry(sessionKey),now=Date.now(),sessionId=entry?.sessionId??randomUUID();if(await touchSessionStore({cfg,sessionKey,storePath,canonicalKey,entry,sessionId,now}),deliverRequested&&(!channel||!to)){let entryChannel=typeof entry?.lastChannel==`string`?normalizeChannelId(entry.lastChannel):void 0,entryTo=typeof entry?.lastTo==`string`?entry.lastTo.trim():``;!channel&&entryChannel&&(channel=entryChannel),!to&&entryTo&&(to=entryTo)}let deliver=deliverRequested&&!!(channel&&to),deliveryChannel=deliver?channel:void 0,deliveryTo=deliver?to:void 0;deliverRequested&&!deliver&&ctx.logGateway.warn(`agent delivery disabled node=${nodeId}: missing session delivery route (channel=${channel??`-`} to=${to??`-`})`),wantsReceipt&&deliveryChannel&&deliveryTo?sendReceiptAck({cfg,deps:ctx.deps,sessionKey:canonicalKey,channel:deliveryChannel,to:deliveryTo,text:receiptText}).catch(err=>{ctx.logGateway.warn(`agent receipt failed node=${nodeId}: ${formatForLog(err)}`)}):wantsReceipt&&ctx.logGateway.warn(`agent receipt skipped node=${nodeId}: missing delivery route (channel=${deliveryChannel??`-`} to=${deliveryTo??`-`})`),agentCommand({message,images,sessionId,sessionKey:canonicalKey,thinking:link?.thinking??void 0,deliver,to:deliveryTo,channel:deliveryChannel,timeout:typeof link?.timeoutSeconds==`number`?link.timeoutSeconds.toString():void 0,messageChannel:`node`},defaultRuntime,ctx.deps).catch(err=>{ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`)});return}case`chat.subscribe`:{if(!evt.payloadJSON)return;let sessionKey=parseSessionKeyFromPayloadJSON(evt.payloadJSON);if(!sessionKey)return;ctx.nodeSubscribe(nodeId,sessionKey);return}case`chat.unsubscribe`:{if(!evt.payloadJSON)return;let sessionKey=parseSessionKeyFromPayloadJSON(evt.payloadJSON);if(!sessionKey)return;ctx.nodeUnsubscribe(nodeId,sessionKey);return}case`exec.started`:case`exec.finished`:case`exec.denied`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},sessionKey=typeof obj.sessionKey==`string`?obj.sessionKey.trim():`node-${nodeId}`;if(!sessionKey)return;let runId=typeof obj.runId==`string`?obj.runId.trim():``,command=typeof obj.command==`string`?obj.command.trim():``,exitCode=typeof obj.exitCode==`number`&&Number.isFinite(obj.exitCode)?obj.exitCode:void 0,timedOut=obj.timedOut===!0,output=typeof obj.output==`string`?obj.output.trim():``,reason=typeof obj.reason==`string`?obj.reason.trim():``,text=``;if(evt.event===`exec.started`)text=`Exec started (node=${nodeId}${runId?` id=${runId}`:``})`,command&&(text+=`: ${command}`);else if(evt.event===`exec.finished`){let exitLabel=timedOut?`timeout`:`code ${exitCode??`?`}`,compactOutput=compactExecEventOutput(output);if(!(timedOut||exitCode!==0||compactOutput.length>0))return;text=`Exec finished (node=${nodeId}${runId?` id=${runId}`:``}, ${exitLabel})`,compactOutput&&(text+=`\n${compactOutput}`)}else text=`Exec denied (node=${nodeId}${runId?` id=${runId}`:``}${reason?`, ${reason}`:``})`,command&&(text+=`: ${command}`);enqueueSystemEvent(text,{sessionKey,contextKey:runId?`exec:${runId}`:`exec`}),requestHeartbeatNow({reason:`exec-event`});return}case`push.apns.register`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},token=typeof obj.token==`string`?obj.token:``,topic=typeof obj.topic==`string`?obj.topic:``,environment=obj.environment;try{await registerApnsToken({nodeId,token,topic,environment})}catch(err){ctx.logGateway.warn(`push apns register failed node=${nodeId}: ${formatForLog(err)}`)}return}default:return}};export{handleNodeEvent};
@@ -1 +1 @@
1
- import{I as success,J as toPinoLikeLogger,O as danger,U as getChildLogger,b as resolveUserPath,c as ensureDir}from"./utils-DbaBVFaK.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{U as VERSION}from"./io-3R_ZyUxB.js";import{d as resolveDefaultWebAuthDir,f as resolveWebCredsBackupPath,l as readCredsJsonRaw,p as resolveWebCredsPath,s as maybeRestoreCredsFromBackup}from"./accounts-o35LU_iy.js";import fs from"node:fs";import"node:crypto";import{DisconnectReason,fetchLatestBaileysVersion,makeCacheableSignalKeyStore,makeWASocket,useMultiFileAuthState}from"@whiskeysockets/baileys";import qrcode from"qrcode-terminal";let credsSaveQueue=Promise.resolve();function enqueueSaveCreds(authDir,saveCreds,logger){credsSaveQueue=credsSaveQueue.then(()=>safeSaveCreds(authDir,saveCreds,logger)).catch(err=>{logger.warn({error:String(err)},`WhatsApp creds save queue error`)})}async function safeSaveCreds(authDir,saveCreds,logger){try{let credsPath=resolveWebCredsPath(authDir),backupPath=resolveWebCredsBackupPath(authDir),raw=readCredsJsonRaw(credsPath);if(raw)try{JSON.parse(raw),fs.copyFileSync(credsPath,backupPath);try{fs.chmodSync(backupPath,384)}catch{}}catch{}}catch{}try{await Promise.resolve(saveCreds());try{fs.chmodSync(resolveWebCredsPath(authDir),384)}catch{}}catch(err){logger.warn({error:String(err)},`failed saving WhatsApp creds`)}}async function createWaSocket(printQr,verbose,opts={}){let logger=toPinoLikeLogger(getChildLogger({module:`baileys`},{level:verbose?`info`:`silent`}),verbose?`info`:`silent`),authDir=resolveUserPath(opts.authDir??resolveDefaultWebAuthDir());await ensureDir(authDir);let sessionLogger=getChildLogger({module:`web-session`});maybeRestoreCredsFromBackup(authDir);let{state,saveCreds}=await useMultiFileAuthState(authDir),{version}=await fetchLatestBaileysVersion(),sock=makeWASocket({auth:{creds:state.creds,keys:makeCacheableSignalKeyStore(state.keys,logger)},version,logger,printQRInTerminal:!1,browser:[`builderforce`,`cli`,VERSION],syncFullHistory:!1,markOnlineOnConnect:!1});return sock.ev.on(`creds.update`,()=>enqueueSaveCreds(authDir,saveCreds,sessionLogger)),sock.ev.on(`connection.update`,update=>{try{let{connection,lastDisconnect,qr}=update;qr&&(opts.onQr?.(qr),printQr&&(console.log(`Scan this QR in WhatsApp (Linked Devices):`),qrcode.generate(qr,{small:!0}))),connection===`close`&&getStatusCode(lastDisconnect?.error)===DisconnectReason.loggedOut&&console.error(danger(`WhatsApp session logged out. Run: ${formatCliCommand(`builderforce channels login`)}`)),connection===`open`&&verbose&&console.log(success(`WhatsApp Web connected.`))}catch(err){sessionLogger.error({error:String(err)},`connection.update handler error`)}}),sock.ws&&typeof sock.ws.on==`function`&&sock.ws.on(`error`,err=>{sessionLogger.error({error:String(err)},`WebSocket error`)}),sock}async function waitForWaConnection(sock){return new Promise((resolve,reject)=>{let evWithOff=sock.ev,handler=(...args)=>{let update=args[0]??{};update.connection===`open`&&(evWithOff.off?.(`connection.update`,handler),resolve()),update.connection===`close`&&(evWithOff.off?.(`connection.update`,handler),reject(update.lastDisconnect??Error(`Connection closed`)))};sock.ev.on(`connection.update`,handler)})}function getStatusCode(err){return err?.output?.statusCode??err?.status}function safeStringify(value,limit=800){try{let seen=new WeakSet,raw=JSON.stringify(value,(_key,v)=>{if(typeof v==`bigint`)return v.toString();if(typeof v==`function`){let maybeName=v.name;return`[Function ${typeof maybeName==`string`&&maybeName.length>0?maybeName:`anonymous`}]`}if(typeof v==`object`&&v){if(seen.has(v))return`[Circular]`;seen.add(v)}return v},2);return raw?raw.length>limit?`${raw.slice(0,limit)}…`:raw:String(value)}catch{return String(value)}}function extractBoomDetails(err){if(!err||typeof err!=`object`)return null;let output=err?.output;if(!output||typeof output!=`object`)return null;let payload=output.payload,statusCode=typeof output.statusCode==`number`?output.statusCode:typeof payload?.statusCode==`number`?payload.statusCode:void 0,error=typeof payload?.error==`string`?payload.error:void 0,message=typeof payload?.message==`string`?payload.message:void 0;return!statusCode&&!error&&!message?null:{statusCode,error,message}}function formatError(err){if(err instanceof Error)return err.message;if(typeof err==`string`)return err;if(!err||typeof err!=`object`)return String(err);let boom=extractBoomDetails(err)??extractBoomDetails(err?.error)??extractBoomDetails(err?.lastDisconnect?.error),status=boom?.statusCode??getStatusCode(err),code=err?.code,codeText=typeof code==`string`||typeof code==`number`?String(code):void 0,message=[boom?.message,typeof err?.message==`string`?err.message:void 0,typeof err?.error?.message==`string`?err.error?.message:void 0].filter(v=>!!(v&&v.trim().length>0))[0],pieces=[];return typeof status==`number`&&pieces.push(`status=${status}`),boom?.error&&pieces.push(boom.error),message&&pieces.push(message),codeText&&pieces.push(`code=${codeText}`),pieces.length>0?pieces.join(` `):safeStringify(err)}export{waitForWaConnection as i,formatError as n,getStatusCode as r,createWaSocket as t};
1
+ import{I as success,J as toPinoLikeLogger,O as danger,U as getChildLogger,b as resolveUserPath,c as ensureDir}from"./utils-DbaBVFaK.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{U as VERSION}from"./io-BLBq4T2o.js";import{d as resolveDefaultWebAuthDir,f as resolveWebCredsBackupPath,l as readCredsJsonRaw,p as resolveWebCredsPath,s as maybeRestoreCredsFromBackup}from"./accounts-o35LU_iy.js";import fs from"node:fs";import"node:crypto";import{DisconnectReason,fetchLatestBaileysVersion,makeCacheableSignalKeyStore,makeWASocket,useMultiFileAuthState}from"@whiskeysockets/baileys";import qrcode from"qrcode-terminal";let credsSaveQueue=Promise.resolve();function enqueueSaveCreds(authDir,saveCreds,logger){credsSaveQueue=credsSaveQueue.then(()=>safeSaveCreds(authDir,saveCreds,logger)).catch(err=>{logger.warn({error:String(err)},`WhatsApp creds save queue error`)})}async function safeSaveCreds(authDir,saveCreds,logger){try{let credsPath=resolveWebCredsPath(authDir),backupPath=resolveWebCredsBackupPath(authDir),raw=readCredsJsonRaw(credsPath);if(raw)try{JSON.parse(raw),fs.copyFileSync(credsPath,backupPath);try{fs.chmodSync(backupPath,384)}catch{}}catch{}}catch{}try{await Promise.resolve(saveCreds());try{fs.chmodSync(resolveWebCredsPath(authDir),384)}catch{}}catch(err){logger.warn({error:String(err)},`failed saving WhatsApp creds`)}}async function createWaSocket(printQr,verbose,opts={}){let logger=toPinoLikeLogger(getChildLogger({module:`baileys`},{level:verbose?`info`:`silent`}),verbose?`info`:`silent`),authDir=resolveUserPath(opts.authDir??resolveDefaultWebAuthDir());await ensureDir(authDir);let sessionLogger=getChildLogger({module:`web-session`});maybeRestoreCredsFromBackup(authDir);let{state,saveCreds}=await useMultiFileAuthState(authDir),{version}=await fetchLatestBaileysVersion(),sock=makeWASocket({auth:{creds:state.creds,keys:makeCacheableSignalKeyStore(state.keys,logger)},version,logger,printQRInTerminal:!1,browser:[`builderforce`,`cli`,VERSION],syncFullHistory:!1,markOnlineOnConnect:!1});return sock.ev.on(`creds.update`,()=>enqueueSaveCreds(authDir,saveCreds,sessionLogger)),sock.ev.on(`connection.update`,update=>{try{let{connection,lastDisconnect,qr}=update;qr&&(opts.onQr?.(qr),printQr&&(console.log(`Scan this QR in WhatsApp (Linked Devices):`),qrcode.generate(qr,{small:!0}))),connection===`close`&&getStatusCode(lastDisconnect?.error)===DisconnectReason.loggedOut&&console.error(danger(`WhatsApp session logged out. Run: ${formatCliCommand(`builderforce channels login`)}`)),connection===`open`&&verbose&&console.log(success(`WhatsApp Web connected.`))}catch(err){sessionLogger.error({error:String(err)},`connection.update handler error`)}}),sock.ws&&typeof sock.ws.on==`function`&&sock.ws.on(`error`,err=>{sessionLogger.error({error:String(err)},`WebSocket error`)}),sock}async function waitForWaConnection(sock){return new Promise((resolve,reject)=>{let evWithOff=sock.ev,handler=(...args)=>{let update=args[0]??{};update.connection===`open`&&(evWithOff.off?.(`connection.update`,handler),resolve()),update.connection===`close`&&(evWithOff.off?.(`connection.update`,handler),reject(update.lastDisconnect??Error(`Connection closed`)))};sock.ev.on(`connection.update`,handler)})}function getStatusCode(err){return err?.output?.statusCode??err?.status}function safeStringify(value,limit=800){try{let seen=new WeakSet,raw=JSON.stringify(value,(_key,v)=>{if(typeof v==`bigint`)return v.toString();if(typeof v==`function`){let maybeName=v.name;return`[Function ${typeof maybeName==`string`&&maybeName.length>0?maybeName:`anonymous`}]`}if(typeof v==`object`&&v){if(seen.has(v))return`[Circular]`;seen.add(v)}return v},2);return raw?raw.length>limit?`${raw.slice(0,limit)}…`:raw:String(value)}catch{return String(value)}}function extractBoomDetails(err){if(!err||typeof err!=`object`)return null;let output=err?.output;if(!output||typeof output!=`object`)return null;let payload=output.payload,statusCode=typeof output.statusCode==`number`?output.statusCode:typeof payload?.statusCode==`number`?payload.statusCode:void 0,error=typeof payload?.error==`string`?payload.error:void 0,message=typeof payload?.message==`string`?payload.message:void 0;return!statusCode&&!error&&!message?null:{statusCode,error,message}}function formatError(err){if(err instanceof Error)return err.message;if(typeof err==`string`)return err;if(!err||typeof err!=`object`)return String(err);let boom=extractBoomDetails(err)??extractBoomDetails(err?.error)??extractBoomDetails(err?.lastDisconnect?.error),status=boom?.statusCode??getStatusCode(err),code=err?.code,codeText=typeof code==`string`||typeof code==`number`?String(code):void 0,message=[boom?.message,typeof err?.message==`string`?err.message:void 0,typeof err?.error?.message==`string`?err.error?.message:void 0].filter(v=>!!(v&&v.trim().length>0))[0],pieces=[];return typeof status==`number`&&pieces.push(`status=${status}`),boom?.error&&pieces.push(boom.error),message&&pieces.push(message),codeText&&pieces.push(`code=${codeText}`),pieces.length>0?pieces.join(` `):safeStringify(err)}export{waitForWaConnection as i,formatError as n,getStatusCode as r,createWaSocket as t};
@@ -1 +1 @@
1
- import{D as danger,F as success,H as getChildLogger,q as toPinoLikeLogger,s as ensureDir,y as resolveUserPath}from"./utils-BP60e80M.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{U as VERSION}from"./io-CohJffHG.js";import{d as resolveDefaultWebAuthDir,f as resolveWebCredsBackupPath,l as readCredsJsonRaw,p as resolveWebCredsPath,s as maybeRestoreCredsFromBackup}from"./accounts-BkTLjSrD.js";import fs from"node:fs";import"node:crypto";import{DisconnectReason,fetchLatestBaileysVersion,makeCacheableSignalKeyStore,makeWASocket,useMultiFileAuthState}from"@whiskeysockets/baileys";import qrcode from"qrcode-terminal";let credsSaveQueue=Promise.resolve();function enqueueSaveCreds(authDir,saveCreds,logger){credsSaveQueue=credsSaveQueue.then(()=>safeSaveCreds(authDir,saveCreds,logger)).catch(err=>{logger.warn({error:String(err)},`WhatsApp creds save queue error`)})}async function safeSaveCreds(authDir,saveCreds,logger){try{let credsPath=resolveWebCredsPath(authDir),backupPath=resolveWebCredsBackupPath(authDir),raw=readCredsJsonRaw(credsPath);if(raw)try{JSON.parse(raw),fs.copyFileSync(credsPath,backupPath);try{fs.chmodSync(backupPath,384)}catch{}}catch{}}catch{}try{await Promise.resolve(saveCreds());try{fs.chmodSync(resolveWebCredsPath(authDir),384)}catch{}}catch(err){logger.warn({error:String(err)},`failed saving WhatsApp creds`)}}async function createWaSocket(printQr,verbose,opts={}){let logger=toPinoLikeLogger(getChildLogger({module:`baileys`},{level:verbose?`info`:`silent`}),verbose?`info`:`silent`),authDir=resolveUserPath(opts.authDir??resolveDefaultWebAuthDir());await ensureDir(authDir);let sessionLogger=getChildLogger({module:`web-session`});maybeRestoreCredsFromBackup(authDir);let{state,saveCreds}=await useMultiFileAuthState(authDir),{version}=await fetchLatestBaileysVersion(),sock=makeWASocket({auth:{creds:state.creds,keys:makeCacheableSignalKeyStore(state.keys,logger)},version,logger,printQRInTerminal:!1,browser:[`builderforce`,`cli`,VERSION],syncFullHistory:!1,markOnlineOnConnect:!1});return sock.ev.on(`creds.update`,()=>enqueueSaveCreds(authDir,saveCreds,sessionLogger)),sock.ev.on(`connection.update`,update=>{try{let{connection,lastDisconnect,qr}=update;qr&&(opts.onQr?.(qr),printQr&&(console.log(`Scan this QR in WhatsApp (Linked Devices):`),qrcode.generate(qr,{small:!0}))),connection===`close`&&getStatusCode(lastDisconnect?.error)===DisconnectReason.loggedOut&&console.error(danger(`WhatsApp session logged out. Run: ${formatCliCommand(`builderforce channels login`)}`)),connection===`open`&&verbose&&console.log(success(`WhatsApp Web connected.`))}catch(err){sessionLogger.error({error:String(err)},`connection.update handler error`)}}),sock.ws&&typeof sock.ws.on==`function`&&sock.ws.on(`error`,err=>{sessionLogger.error({error:String(err)},`WebSocket error`)}),sock}async function waitForWaConnection(sock){return new Promise((resolve,reject)=>{let evWithOff=sock.ev,handler=(...args)=>{let update=args[0]??{};update.connection===`open`&&(evWithOff.off?.(`connection.update`,handler),resolve()),update.connection===`close`&&(evWithOff.off?.(`connection.update`,handler),reject(update.lastDisconnect??Error(`Connection closed`)))};sock.ev.on(`connection.update`,handler)})}function getStatusCode(err){return err?.output?.statusCode??err?.status}function safeStringify(value,limit=800){try{let seen=new WeakSet,raw=JSON.stringify(value,(_key,v)=>{if(typeof v==`bigint`)return v.toString();if(typeof v==`function`){let maybeName=v.name;return`[Function ${typeof maybeName==`string`&&maybeName.length>0?maybeName:`anonymous`}]`}if(typeof v==`object`&&v){if(seen.has(v))return`[Circular]`;seen.add(v)}return v},2);return raw?raw.length>limit?`${raw.slice(0,limit)}…`:raw:String(value)}catch{return String(value)}}function extractBoomDetails(err){if(!err||typeof err!=`object`)return null;let output=err?.output;if(!output||typeof output!=`object`)return null;let payload=output.payload,statusCode=typeof output.statusCode==`number`?output.statusCode:typeof payload?.statusCode==`number`?payload.statusCode:void 0,error=typeof payload?.error==`string`?payload.error:void 0,message=typeof payload?.message==`string`?payload.message:void 0;return!statusCode&&!error&&!message?null:{statusCode,error,message}}function formatError(err){if(err instanceof Error)return err.message;if(typeof err==`string`)return err;if(!err||typeof err!=`object`)return String(err);let boom=extractBoomDetails(err)??extractBoomDetails(err?.error)??extractBoomDetails(err?.lastDisconnect?.error),status=boom?.statusCode??getStatusCode(err),code=err?.code,codeText=typeof code==`string`||typeof code==`number`?String(code):void 0,message=[boom?.message,typeof err?.message==`string`?err.message:void 0,typeof err?.error?.message==`string`?err.error?.message:void 0].filter(v=>!!(v&&v.trim().length>0))[0],pieces=[];return typeof status==`number`&&pieces.push(`status=${status}`),boom?.error&&pieces.push(boom.error),message&&pieces.push(message),codeText&&pieces.push(`code=${codeText}`),pieces.length>0?pieces.join(` `):safeStringify(err)}export{waitForWaConnection as i,formatError as n,getStatusCode as r,createWaSocket as t};
1
+ import{D as danger,F as success,H as getChildLogger,q as toPinoLikeLogger,s as ensureDir,y as resolveUserPath}from"./utils-BP60e80M.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{U as VERSION}from"./io-D9hC2aG0.js";import{d as resolveDefaultWebAuthDir,f as resolveWebCredsBackupPath,l as readCredsJsonRaw,p as resolveWebCredsPath,s as maybeRestoreCredsFromBackup}from"./accounts-BkTLjSrD.js";import fs from"node:fs";import"node:crypto";import{DisconnectReason,fetchLatestBaileysVersion,makeCacheableSignalKeyStore,makeWASocket,useMultiFileAuthState}from"@whiskeysockets/baileys";import qrcode from"qrcode-terminal";let credsSaveQueue=Promise.resolve();function enqueueSaveCreds(authDir,saveCreds,logger){credsSaveQueue=credsSaveQueue.then(()=>safeSaveCreds(authDir,saveCreds,logger)).catch(err=>{logger.warn({error:String(err)},`WhatsApp creds save queue error`)})}async function safeSaveCreds(authDir,saveCreds,logger){try{let credsPath=resolveWebCredsPath(authDir),backupPath=resolveWebCredsBackupPath(authDir),raw=readCredsJsonRaw(credsPath);if(raw)try{JSON.parse(raw),fs.copyFileSync(credsPath,backupPath);try{fs.chmodSync(backupPath,384)}catch{}}catch{}}catch{}try{await Promise.resolve(saveCreds());try{fs.chmodSync(resolveWebCredsPath(authDir),384)}catch{}}catch(err){logger.warn({error:String(err)},`failed saving WhatsApp creds`)}}async function createWaSocket(printQr,verbose,opts={}){let logger=toPinoLikeLogger(getChildLogger({module:`baileys`},{level:verbose?`info`:`silent`}),verbose?`info`:`silent`),authDir=resolveUserPath(opts.authDir??resolveDefaultWebAuthDir());await ensureDir(authDir);let sessionLogger=getChildLogger({module:`web-session`});maybeRestoreCredsFromBackup(authDir);let{state,saveCreds}=await useMultiFileAuthState(authDir),{version}=await fetchLatestBaileysVersion(),sock=makeWASocket({auth:{creds:state.creds,keys:makeCacheableSignalKeyStore(state.keys,logger)},version,logger,printQRInTerminal:!1,browser:[`builderforce`,`cli`,VERSION],syncFullHistory:!1,markOnlineOnConnect:!1});return sock.ev.on(`creds.update`,()=>enqueueSaveCreds(authDir,saveCreds,sessionLogger)),sock.ev.on(`connection.update`,update=>{try{let{connection,lastDisconnect,qr}=update;qr&&(opts.onQr?.(qr),printQr&&(console.log(`Scan this QR in WhatsApp (Linked Devices):`),qrcode.generate(qr,{small:!0}))),connection===`close`&&getStatusCode(lastDisconnect?.error)===DisconnectReason.loggedOut&&console.error(danger(`WhatsApp session logged out. Run: ${formatCliCommand(`builderforce channels login`)}`)),connection===`open`&&verbose&&console.log(success(`WhatsApp Web connected.`))}catch(err){sessionLogger.error({error:String(err)},`connection.update handler error`)}}),sock.ws&&typeof sock.ws.on==`function`&&sock.ws.on(`error`,err=>{sessionLogger.error({error:String(err)},`WebSocket error`)}),sock}async function waitForWaConnection(sock){return new Promise((resolve,reject)=>{let evWithOff=sock.ev,handler=(...args)=>{let update=args[0]??{};update.connection===`open`&&(evWithOff.off?.(`connection.update`,handler),resolve()),update.connection===`close`&&(evWithOff.off?.(`connection.update`,handler),reject(update.lastDisconnect??Error(`Connection closed`)))};sock.ev.on(`connection.update`,handler)})}function getStatusCode(err){return err?.output?.statusCode??err?.status}function safeStringify(value,limit=800){try{let seen=new WeakSet,raw=JSON.stringify(value,(_key,v)=>{if(typeof v==`bigint`)return v.toString();if(typeof v==`function`){let maybeName=v.name;return`[Function ${typeof maybeName==`string`&&maybeName.length>0?maybeName:`anonymous`}]`}if(typeof v==`object`&&v){if(seen.has(v))return`[Circular]`;seen.add(v)}return v},2);return raw?raw.length>limit?`${raw.slice(0,limit)}…`:raw:String(value)}catch{return String(value)}}function extractBoomDetails(err){if(!err||typeof err!=`object`)return null;let output=err?.output;if(!output||typeof output!=`object`)return null;let payload=output.payload,statusCode=typeof output.statusCode==`number`?output.statusCode:typeof payload?.statusCode==`number`?payload.statusCode:void 0,error=typeof payload?.error==`string`?payload.error:void 0,message=typeof payload?.message==`string`?payload.message:void 0;return!statusCode&&!error&&!message?null:{statusCode,error,message}}function formatError(err){if(err instanceof Error)return err.message;if(typeof err==`string`)return err;if(!err||typeof err!=`object`)return String(err);let boom=extractBoomDetails(err)??extractBoomDetails(err?.error)??extractBoomDetails(err?.lastDisconnect?.error),status=boom?.statusCode??getStatusCode(err),code=err?.code,codeText=typeof code==`string`||typeof code==`number`?String(code):void 0,message=[boom?.message,typeof err?.message==`string`?err.message:void 0,typeof err?.error?.message==`string`?err.error?.message:void 0].filter(v=>!!(v&&v.trim().length>0))[0],pieces=[];return typeof status==`number`&&pieces.push(`status=${status}`),boom?.error&&pieces.push(boom.error),message&&pieces.push(message),codeText&&pieces.push(`code=${codeText}`),pieces.length>0?pieces.join(` `):safeStringify(err)}export{waitForWaConnection as i,formatError as n,getStatusCode as r,createWaSocket as t};
@@ -1,3 +1,3 @@
1
- import{h as pathExists}from"./utils-BP60e80M.js";import{a as isCorePackageName,i as CORE_PACKAGE_NAMES,o as stripPackagePrefix,r as CORE_PACKAGE_NAME}from"./builderforce-root-DY1qbWNX.js";import{t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import{xr as trimLogTail}from"./subagent-registry-CyGxu3kP.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-BxgWcomx.js";import{a as gitWorkingTreeStatusArgs,d as channelToNpmTag,l as DEFAULT_PACKAGE_CHANNEL,m as isStableTag,n as compareSemverStrings,p as isBetaTag,s as detectPackageManager$1,u as DEV_BRANCH}from"./update-check-B0YqSZJr.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";async function readPackageVersion(root){try{let raw=await fs.readFile(path.join(root,`package.json`),`utf-8`),parsed=JSON.parse(raw);return typeof parsed?.version==`string`?parsed.version:null}catch{return null}}async function readPackageName(root){try{let raw=await fs.readFile(path.join(root,`package.json`),`utf-8`);return JSON.parse(raw)?.name?.trim()||null}catch{return null}}const PRIMARY_PACKAGE_NAME=CORE_PACKAGE_NAME,ALL_PACKAGE_NAMES=CORE_PACKAGE_NAMES;async function tryRealpath(targetPath){try{return await fs.realpath(targetPath)}catch{return path.resolve(targetPath)}}function resolveBunGlobalRoot(){let bunInstall=process.env.BUN_INSTALL?.trim()||path.join(os.homedir(),`.bun`);return path.join(bunInstall,`install`,`global`,`node_modules`)}async function resolveGlobalRoot(manager,runCommand,timeoutMs){if(manager===`bun`)return resolveBunGlobalRoot();let res=await runCommand(manager===`pnpm`?[`pnpm`,`root`,`-g`]:[`npm`,`root`,`-g`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?null:res.stdout.trim()||null}async function resolveGlobalPackageRoot(manager,runCommand,timeoutMs){let root=await resolveGlobalRoot(manager,runCommand,timeoutMs);if(!root)return null;for(let name of ALL_PACKAGE_NAMES){let candidate=path.join(root,name);if(await pathExists(candidate))return candidate}return path.join(root,PRIMARY_PACKAGE_NAME)}async function detectGlobalInstallManagerForRoot(runCommand,pkgRoot,timeoutMs){let pkgReal=await tryRealpath(pkgRoot);for(let{manager,argv}of[{manager:`npm`,argv:[`npm`,`root`,`-g`]},{manager:`pnpm`,argv:[`pnpm`,`root`,`-g`]}]){let res=await runCommand(argv,{timeoutMs}).catch(()=>null);if(!res||res.code!==0)continue;let globalRoot=res.stdout.trim();if(!globalRoot)continue;let globalReal=await tryRealpath(globalRoot);for(let name of ALL_PACKAGE_NAMES){let expected=path.join(globalReal,name);if(path.resolve(expected)===path.resolve(pkgReal))return manager}}let bunGlobalReal=await tryRealpath(resolveBunGlobalRoot());for(let name of ALL_PACKAGE_NAMES){let bunExpected=path.join(bunGlobalReal,name);if(path.resolve(bunExpected)===path.resolve(pkgReal))return`bun`}return null}async function detectGlobalInstallManagerByPresence(runCommand,timeoutMs){for(let manager of[`npm`,`pnpm`]){let root=await resolveGlobalRoot(manager,runCommand,timeoutMs);if(root){for(let name of ALL_PACKAGE_NAMES)if(await pathExists(path.join(root,name)))return manager}}let bunRoot=resolveBunGlobalRoot();for(let name of ALL_PACKAGE_NAMES)if(await pathExists(path.join(bunRoot,name)))return`bun`;return null}function globalInstallArgs(manager,spec){return manager===`pnpm`?[`pnpm`,`add`,`-g`,spec]:manager===`bun`?[`bun`,`add`,`-g`,spec]:[`npm`,`i`,`-g`,spec]}async function cleanupGlobalRenameDirs(params){let removed=[],root=params.globalRoot.trim(),name=params.packageName.trim().split(`/`).pop()??``;if(!root||!name)return{removed};let prefix=`.${name}-`,entries=[];try{entries=await fs.readdir(root)}catch{return{removed}}for(let entry of entries){if(!entry.startsWith(prefix))continue;let target=path.join(root,entry);try{if(!(await fs.lstat(target)).isDirectory())continue;await fs.rm(target,{recursive:!0,force:!0}),removed.push(entry)}catch{}}return{removed}}const MAX_LOG_CHARS=8e3,START_DIRS=[`cwd`,`argv1`,`process`];function normalizeDir(value){if(!value)return null;let trimmed=value.trim();return trimmed?path.resolve(trimmed):null}function resolveNodeModulesBinPackageRoot(argv1){let normalized=path.resolve(argv1),parts=normalized.split(path.sep),binIndex=parts.lastIndexOf(`.bin`);if(binIndex<=0||parts[binIndex-1]!==`node_modules`)return null;let binName=path.basename(normalized),nodeModulesDir=parts.slice(0,binIndex).join(path.sep);return path.join(nodeModulesDir,binName)}function buildStartDirs(opts){let dirs=[],cwd=normalizeDir(opts.cwd);cwd&&dirs.push(cwd);let argv1=normalizeDir(opts.argv1);if(argv1){dirs.push(path.dirname(argv1));let packageRoot=resolveNodeModulesBinPackageRoot(argv1);packageRoot&&dirs.push(packageRoot)}let proc=normalizeDir(process.cwd());return proc&&dirs.push(proc),Array.from(new Set(dirs))}async function readBranchName(runCommand,root,timeoutMs){let res=await runCommand([`git`,`-C`,root,`rev-parse`,`--abbrev-ref`,`HEAD`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?null:res.stdout.trim()||null}async function listGitTags(runCommand,root,timeoutMs,pattern=`v*`){let res=await runCommand([`git`,`-C`,root,`tag`,`--list`,pattern,`--sort=-v:refname`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?[]:res.stdout.split(`
1
+ import{h as pathExists}from"./utils-BP60e80M.js";import{a as isCorePackageName,i as CORE_PACKAGE_NAMES,o as stripPackagePrefix,r as CORE_PACKAGE_NAME}from"./builderforce-root-DY1qbWNX.js";import{t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import{xr as trimLogTail}from"./subagent-registry-DDEN4oJi.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-BxgWcomx.js";import{a as gitWorkingTreeStatusArgs,d as channelToNpmTag,l as DEFAULT_PACKAGE_CHANNEL,m as isStableTag,n as compareSemverStrings,p as isBetaTag,s as detectPackageManager$1,u as DEV_BRANCH}from"./update-check-B0YqSZJr.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";async function readPackageVersion(root){try{let raw=await fs.readFile(path.join(root,`package.json`),`utf-8`),parsed=JSON.parse(raw);return typeof parsed?.version==`string`?parsed.version:null}catch{return null}}async function readPackageName(root){try{let raw=await fs.readFile(path.join(root,`package.json`),`utf-8`);return JSON.parse(raw)?.name?.trim()||null}catch{return null}}const PRIMARY_PACKAGE_NAME=CORE_PACKAGE_NAME,ALL_PACKAGE_NAMES=CORE_PACKAGE_NAMES;async function tryRealpath(targetPath){try{return await fs.realpath(targetPath)}catch{return path.resolve(targetPath)}}function resolveBunGlobalRoot(){let bunInstall=process.env.BUN_INSTALL?.trim()||path.join(os.homedir(),`.bun`);return path.join(bunInstall,`install`,`global`,`node_modules`)}async function resolveGlobalRoot(manager,runCommand,timeoutMs){if(manager===`bun`)return resolveBunGlobalRoot();let res=await runCommand(manager===`pnpm`?[`pnpm`,`root`,`-g`]:[`npm`,`root`,`-g`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?null:res.stdout.trim()||null}async function resolveGlobalPackageRoot(manager,runCommand,timeoutMs){let root=await resolveGlobalRoot(manager,runCommand,timeoutMs);if(!root)return null;for(let name of ALL_PACKAGE_NAMES){let candidate=path.join(root,name);if(await pathExists(candidate))return candidate}return path.join(root,PRIMARY_PACKAGE_NAME)}async function detectGlobalInstallManagerForRoot(runCommand,pkgRoot,timeoutMs){let pkgReal=await tryRealpath(pkgRoot);for(let{manager,argv}of[{manager:`npm`,argv:[`npm`,`root`,`-g`]},{manager:`pnpm`,argv:[`pnpm`,`root`,`-g`]}]){let res=await runCommand(argv,{timeoutMs}).catch(()=>null);if(!res||res.code!==0)continue;let globalRoot=res.stdout.trim();if(!globalRoot)continue;let globalReal=await tryRealpath(globalRoot);for(let name of ALL_PACKAGE_NAMES){let expected=path.join(globalReal,name);if(path.resolve(expected)===path.resolve(pkgReal))return manager}}let bunGlobalReal=await tryRealpath(resolveBunGlobalRoot());for(let name of ALL_PACKAGE_NAMES){let bunExpected=path.join(bunGlobalReal,name);if(path.resolve(bunExpected)===path.resolve(pkgReal))return`bun`}return null}async function detectGlobalInstallManagerByPresence(runCommand,timeoutMs){for(let manager of[`npm`,`pnpm`]){let root=await resolveGlobalRoot(manager,runCommand,timeoutMs);if(root){for(let name of ALL_PACKAGE_NAMES)if(await pathExists(path.join(root,name)))return manager}}let bunRoot=resolveBunGlobalRoot();for(let name of ALL_PACKAGE_NAMES)if(await pathExists(path.join(bunRoot,name)))return`bun`;return null}function globalInstallArgs(manager,spec){return manager===`pnpm`?[`pnpm`,`add`,`-g`,spec]:manager===`bun`?[`bun`,`add`,`-g`,spec]:[`npm`,`i`,`-g`,spec]}async function cleanupGlobalRenameDirs(params){let removed=[],root=params.globalRoot.trim(),name=params.packageName.trim().split(`/`).pop()??``;if(!root||!name)return{removed};let prefix=`.${name}-`,entries=[];try{entries=await fs.readdir(root)}catch{return{removed}}for(let entry of entries){if(!entry.startsWith(prefix))continue;let target=path.join(root,entry);try{if(!(await fs.lstat(target)).isDirectory())continue;await fs.rm(target,{recursive:!0,force:!0}),removed.push(entry)}catch{}}return{removed}}const MAX_LOG_CHARS=8e3,START_DIRS=[`cwd`,`argv1`,`process`];function normalizeDir(value){if(!value)return null;let trimmed=value.trim();return trimmed?path.resolve(trimmed):null}function resolveNodeModulesBinPackageRoot(argv1){let normalized=path.resolve(argv1),parts=normalized.split(path.sep),binIndex=parts.lastIndexOf(`.bin`);if(binIndex<=0||parts[binIndex-1]!==`node_modules`)return null;let binName=path.basename(normalized),nodeModulesDir=parts.slice(0,binIndex).join(path.sep);return path.join(nodeModulesDir,binName)}function buildStartDirs(opts){let dirs=[],cwd=normalizeDir(opts.cwd);cwd&&dirs.push(cwd);let argv1=normalizeDir(opts.argv1);if(argv1){dirs.push(path.dirname(argv1));let packageRoot=resolveNodeModulesBinPackageRoot(argv1);packageRoot&&dirs.push(packageRoot)}let proc=normalizeDir(process.cwd());return proc&&dirs.push(proc),Array.from(new Set(dirs))}async function readBranchName(runCommand,root,timeoutMs){let res=await runCommand([`git`,`-C`,root,`rev-parse`,`--abbrev-ref`,`HEAD`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?null:res.stdout.trim()||null}async function listGitTags(runCommand,root,timeoutMs,pattern=`v*`){let res=await runCommand([`git`,`-C`,root,`tag`,`--list`,pattern,`--sort=-v:refname`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?[]:res.stdout.split(`
2
2
  `).map(line=>line.trim()).filter(Boolean)}async function resolveChannelTag(runCommand,root,timeoutMs,channel){let tags=await listGitTags(runCommand,root,timeoutMs);if(channel===`beta`){let betaTag=tags.find(tag=>isBetaTag(tag))??null,stableTag=tags.find(tag=>isStableTag(tag))??null;if(!betaTag)return stableTag;if(!stableTag)return betaTag;let cmp=compareSemverStrings(betaTag,stableTag);return cmp!=null&&cmp<0?stableTag:betaTag}return tags.find(tag=>isStableTag(tag))??null}async function resolveGitRoot(runCommand,candidates,timeoutMs){for(let dir of candidates){let res=await runCommand([`git`,`-C`,dir,`rev-parse`,`--show-toplevel`],{timeoutMs});if(res.code===0){let root=res.stdout.trim();if(root)return root}}return null}async function findPackageRoot(candidates){for(let dir of candidates){let current=dir;for(let i=0;i<12;i+=1){let pkgPath=path.join(current,`package.json`);try{let raw=await fs.readFile(pkgPath,`utf-8`),name=JSON.parse(raw)?.name?.trim();if(isCorePackageName(name))return current}catch{}let parent=path.dirname(current);if(parent===current)break;current=parent}}return null}async function detectPackageManager(root){return await detectPackageManager$1(root)??`npm`}async function runStep(opts){let{runCommand,name,argv,cwd,timeoutMs,env,progress,stepIndex,totalSteps}=opts,command=argv.join(` `),stepInfo={name,command,index:stepIndex,total:totalSteps};progress?.onStepStart?.(stepInfo);let started=Date.now(),result=await runCommand(argv,{cwd,timeoutMs,env}),durationMs=Date.now()-started,stderrTail=trimLogTail(result.stderr,MAX_LOG_CHARS);return progress?.onStepComplete?.({...stepInfo,durationMs,exitCode:result.code,stderrTail}),{name,command,cwd,durationMs,exitCode:result.code,stdoutTail:trimLogTail(result.stdout,MAX_LOG_CHARS),stderrTail:trimLogTail(result.stderr,MAX_LOG_CHARS)}}function managerScriptArgs(manager,script,args=[]){return manager===`pnpm`?[`pnpm`,script,...args]:manager===`bun`?[`bun`,`run`,script,...args]:args.length>0?[`npm`,`run`,script,`--`,...args]:[`npm`,`run`,script]}function managerInstallArgs(manager){return manager===`pnpm`?[`pnpm`,`install`]:manager===`bun`?[`bun`,`install`]:[`npm`,`install`]}function normalizeTag(tag){let trimmed=tag?.trim();return trimmed?stripPackagePrefix(trimmed):`latest`}async function runGatewayUpdate(opts={}){let startedAt=Date.now(),runCommand=opts.runCommand??(async(argv,options)=>{let res=await runCommandWithTimeout(argv,options);return{stdout:res.stdout,stderr:res.stderr,code:res.code}}),timeoutMs=opts.timeoutMs??12e5,progress=opts.progress,steps=[],candidates=buildStartDirs(opts),stepIndex=0,gitTotalSteps=0,step=(name,argv,cwd,env)=>{let currentIndex=stepIndex;return stepIndex+=1,{runCommand,name,argv,cwd,timeoutMs,env,progress,stepIndex:currentIndex,totalSteps:gitTotalSteps}},pkgRoot=await findPackageRoot(candidates),gitRoot=await resolveGitRoot(runCommand,candidates,timeoutMs);if(gitRoot&&pkgRoot&&path.resolve(gitRoot)!==path.resolve(pkgRoot)&&(gitRoot=null),gitRoot&&!pkgRoot)return{status:`error`,mode:`unknown`,root:gitRoot,reason:`not-builderforce-root`,steps:[],durationMs:Date.now()-startedAt};if(gitRoot&&pkgRoot&&path.resolve(gitRoot)===path.resolve(pkgRoot)){let beforeSha=(await runCommand([`git`,`-C`,gitRoot,`rev-parse`,`HEAD`],{cwd:gitRoot,timeoutMs})).stdout.trim()||null,beforeVersion=await readPackageVersion(gitRoot),channel=opts.channel??`dev`,branch=channel===`dev`?await readBranchName(runCommand,gitRoot,timeoutMs):null,needsCheckoutMain=channel===`dev`&&branch!==DEV_BRANCH;gitTotalSteps=channel===`dev`?needsCheckoutMain?11:10:9;let buildGitErrorResult=reason=>({status:`error`,mode:`git`,root:gitRoot,reason,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt}),runGitCheckoutOrFail=async(name,argv)=>{let checkoutStep=await runStep(step(name,argv,gitRoot));return steps.push(checkoutStep),checkoutStep.exitCode===0?null:buildGitErrorResult(`checkout-failed`)},statusCheck=await runStep(step(`clean check`,gitWorkingTreeStatusArgs(gitRoot),gitRoot));if(steps.push(statusCheck),statusCheck.stdoutTail&&statusCheck.stdoutTail.trim().length>0)return{status:`skipped`,mode:`git`,root:gitRoot,reason:`dirty`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};if(channel===`dev`){if(needsCheckoutMain){let failure=await runGitCheckoutOrFail(`git checkout ${DEV_BRANCH}`,[`git`,`-C`,gitRoot,`checkout`,DEV_BRANCH]);if(failure)return failure}let upstreamStep=await runStep(step(`upstream check`,[`git`,`-C`,gitRoot,`rev-parse`,`--abbrev-ref`,`--symbolic-full-name`,`@{upstream}`],gitRoot));if(steps.push(upstreamStep),upstreamStep.exitCode!==0)return{status:`skipped`,mode:`git`,root:gitRoot,reason:`no-upstream`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let fetchStep=await runStep(step(`git fetch`,[`git`,`-C`,gitRoot,`fetch`,`--all`,`--prune`,`--tags`],gitRoot));steps.push(fetchStep);let upstreamShaStep=await runStep(step(`git rev-parse @{upstream}`,[`git`,`-C`,gitRoot,`rev-parse`,`@{upstream}`],gitRoot));steps.push(upstreamShaStep);let upstreamSha=upstreamShaStep.stdoutTail?.trim();if(!upstreamShaStep.stdoutTail||!upstreamSha)return{status:`error`,mode:`git`,root:gitRoot,reason:`no-upstream-sha`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let revListStep=await runStep(step(`git rev-list`,[`git`,`-C`,gitRoot,`rev-list`,`--max-count=10`,upstreamSha],gitRoot));if(steps.push(revListStep),revListStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`preflight-revlist-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let candidates=(revListStep.stdoutTail??``).split(`
3
3
  `).map(line=>line.trim()).filter(Boolean);if(candidates.length===0)return{status:`error`,mode:`git`,root:gitRoot,reason:`preflight-no-candidates`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let manager=await detectPackageManager(gitRoot),preflightRoot=await fs.mkdtemp(path.join(os.tmpdir(),`builderforce-update-preflight-`)),worktreeDir=path.join(preflightRoot,`worktree`),worktreeStep=await runStep(step(`preflight worktree`,[`git`,`-C`,gitRoot,`worktree`,`add`,`--detach`,worktreeDir,upstreamSha],gitRoot));if(steps.push(worktreeStep),worktreeStep.exitCode!==0)return await fs.rm(preflightRoot,{recursive:!0,force:!0}).catch(()=>{}),{status:`error`,mode:`git`,root:gitRoot,reason:`preflight-worktree-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let selectedSha=null;try{for(let sha of candidates){let shortSha=sha.slice(0,8),checkoutStep=await runStep(step(`preflight checkout (${shortSha})`,[`git`,`-C`,worktreeDir,`checkout`,`--detach`,sha],worktreeDir));if(steps.push(checkoutStep),checkoutStep.exitCode!==0)continue;let depsStep=await runStep(step(`preflight deps install (${shortSha})`,managerInstallArgs(manager),worktreeDir));if(steps.push(depsStep),depsStep.exitCode!==0)continue;let buildStep=await runStep(step(`preflight build (${shortSha})`,managerScriptArgs(manager,`build`),worktreeDir));if(steps.push(buildStep),buildStep.exitCode!==0)continue;let lintStep=await runStep(step(`preflight lint (${shortSha})`,managerScriptArgs(manager,`lint`),worktreeDir));if(steps.push(lintStep),lintStep.exitCode===0){selectedSha=sha;break}}}finally{let removeStep=await runStep(step(`preflight cleanup`,[`git`,`-C`,gitRoot,`worktree`,`remove`,`--force`,worktreeDir],gitRoot));steps.push(removeStep),await runCommand([`git`,`-C`,gitRoot,`worktree`,`prune`],{cwd:gitRoot,timeoutMs}).catch(()=>null),await fs.rm(preflightRoot,{recursive:!0,force:!0}).catch(()=>{})}if(!selectedSha)return{status:`error`,mode:`git`,root:gitRoot,reason:`preflight-no-good-commit`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let rebaseStep=await runStep(step(`git rebase`,[`git`,`-C`,gitRoot,`rebase`,selectedSha],gitRoot));if(steps.push(rebaseStep),rebaseStep.exitCode!==0){let abortResult=await runCommand([`git`,`-C`,gitRoot,`rebase`,`--abort`],{cwd:gitRoot,timeoutMs});return steps.push({name:`git rebase --abort`,command:`git rebase --abort`,cwd:gitRoot,durationMs:0,exitCode:abortResult.code,stdoutTail:trimLogTail(abortResult.stdout,MAX_LOG_CHARS),stderrTail:trimLogTail(abortResult.stderr,MAX_LOG_CHARS)}),{status:`error`,mode:`git`,root:gitRoot,reason:`rebase-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt}}}else{let fetchStep=await runStep(step(`git fetch`,[`git`,`-C`,gitRoot,`fetch`,`--all`,`--prune`,`--tags`],gitRoot));if(steps.push(fetchStep),fetchStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`fetch-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let tag=await resolveChannelTag(runCommand,gitRoot,timeoutMs,channel);if(!tag)return{status:`error`,mode:`git`,root:gitRoot,reason:`no-release-tag`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let failure=await runGitCheckoutOrFail(`git checkout ${tag}`,[`git`,`-C`,gitRoot,`checkout`,`--detach`,tag]);if(failure)return failure}let manager=await detectPackageManager(gitRoot),depsStep=await runStep(step(`deps install`,managerInstallArgs(manager),gitRoot));if(steps.push(depsStep),depsStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`deps-install-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let buildStep=await runStep(step(`build`,managerScriptArgs(manager,`build`),gitRoot));if(steps.push(buildStep),buildStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`build-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let uiBuildStep=await runStep(step(`ui:build`,managerScriptArgs(manager,`ui:build`),gitRoot));if(steps.push(uiBuildStep),uiBuildStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`ui-build-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let doctorEntry=path.join(gitRoot,`builderforce.mjs`);if(!await fs.stat(doctorEntry).then(()=>!0).catch(()=>!1))return steps.push({name:`builderforce doctor entry`,command:`verify ${doctorEntry}`,cwd:gitRoot,durationMs:0,exitCode:1,stderrTail:`missing ${doctorEntry}`}),{status:`error`,mode:`git`,root:gitRoot,reason:`doctor-entry-missing`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let doctorStep=await runStep(step(`builderforce doctor`,[process.execPath,doctorEntry,`doctor`,`--non-interactive`,`--fix`],gitRoot,{BUILDERFORCE_AGENTS_UPDATE_IN_PROGRESS:`1`}));if(steps.push(doctorStep),!(await resolveControlUiDistIndexHealth({root:gitRoot})).exists){let repairArgv=managerScriptArgs(manager,`ui:build`),started=Date.now(),repairResult=await runCommand(repairArgv,{cwd:gitRoot,timeoutMs}),repairStep={name:`ui:build (post-doctor repair)`,command:repairArgv.join(` `),cwd:gitRoot,durationMs:Date.now()-started,exitCode:repairResult.code,stdoutTail:trimLogTail(repairResult.stdout,MAX_LOG_CHARS),stderrTail:trimLogTail(repairResult.stderr,MAX_LOG_CHARS)};if(steps.push(repairStep),repairResult.code!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:repairStep.name,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let repairedUiIndexHealth=await resolveControlUiDistIndexHealth({root:gitRoot});if(!repairedUiIndexHealth.exists){let uiIndexPath=repairedUiIndexHealth.indexPath??resolveControlUiDistIndexPathForRoot(gitRoot);return steps.push({name:`ui assets verify`,command:`verify ${uiIndexPath}`,cwd:gitRoot,durationMs:0,exitCode:1,stderrTail:`missing ${uiIndexPath}`}),{status:`error`,mode:`git`,root:gitRoot,reason:`ui-assets-missing`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt}}}let failedStep=steps.find(s=>s.exitCode!==0),afterShaStep=await runStep(step(`git rev-parse HEAD (after)`,[`git`,`-C`,gitRoot,`rev-parse`,`HEAD`],gitRoot));steps.push(afterShaStep);let afterVersion=await readPackageVersion(gitRoot);return{status:failedStep?`error`:`ok`,mode:`git`,root:gitRoot,reason:failedStep?failedStep.name:void 0,before:{sha:beforeSha,version:beforeVersion},after:{sha:afterShaStep.stdoutTail?.trim()??null,version:afterVersion},steps,durationMs:Date.now()-startedAt}}if(!pkgRoot)return{status:`error`,mode:`unknown`,reason:`no root (${START_DIRS.join(`,`)})`,steps:[],durationMs:Date.now()-startedAt};let beforeVersion=await readPackageVersion(pkgRoot),globalManager=await detectGlobalInstallManagerForRoot(runCommand,pkgRoot,timeoutMs);if(globalManager){let packageName=await readPackageName(pkgRoot)??CORE_PACKAGE_NAME;await cleanupGlobalRenameDirs({globalRoot:path.dirname(pkgRoot),packageName});let channel=opts.channel??DEFAULT_PACKAGE_CHANNEL,updateStep=await runStep({runCommand,name:`global update`,argv:globalInstallArgs(globalManager,`${packageName}@${normalizeTag(opts.tag??channelToNpmTag(channel))}`),cwd:pkgRoot,timeoutMs,progress,stepIndex:0,totalSteps:1}),steps=[updateStep],afterVersion=await readPackageVersion(pkgRoot);return{status:updateStep.exitCode===0?`ok`:`error`,mode:globalManager,root:pkgRoot,reason:updateStep.exitCode===0?void 0:updateStep.name,before:{version:beforeVersion},after:{version:afterVersion},steps,durationMs:Date.now()-startedAt}}return{status:`skipped`,mode:`unknown`,root:pkgRoot,reason:`not-git-install`,before:{version:beforeVersion},steps:[],durationMs:Date.now()-startedAt}}async function resolveAgentSessionDirs(stateDir){let agentsDir=path.join(stateDir,`agents`),entries=[];try{entries=await fs.readdir(agentsDir,{withFileTypes:!0})}catch(err){if(err.code===`ENOENT`)return[];throw err}return entries.filter(entry=>entry.isDirectory()).map(entry=>path.join(agentsDir,entry.name,`sessions`)).toSorted((a,b)=>a.localeCompare(b))}export{detectGlobalInstallManagerForRoot as a,readPackageName as c,detectGlobalInstallManagerByPresence as i,readPackageVersion as l,runGatewayUpdate as n,globalInstallArgs as o,cleanupGlobalRenameDirs as r,resolveGlobalPackageRoot as s,resolveAgentSessionDirs as t};
@@ -1,3 +1,3 @@
1
- import{g as pathExists}from"./utils-DbaBVFaK.js";import{cr as trimLogTail}from"./reply-Cd3vVnD7.js";import{a as isCorePackageName,i as CORE_PACKAGE_NAMES,o as stripPackagePrefix,r as CORE_PACKAGE_NAME}from"./builderforce-root-D64_sXEi.js";import{t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-CWgH1Tda.js";import{a as gitWorkingTreeStatusArgs,d as channelToNpmTag,l as DEFAULT_PACKAGE_CHANNEL,m as isStableTag,n as compareSemverStrings,p as isBetaTag,s as detectPackageManager$1,u as DEV_BRANCH}from"./update-check-D6MvqVFE.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";async function readPackageVersion(root){try{let raw=await fs.readFile(path.join(root,`package.json`),`utf-8`),parsed=JSON.parse(raw);return typeof parsed?.version==`string`?parsed.version:null}catch{return null}}async function readPackageName(root){try{let raw=await fs.readFile(path.join(root,`package.json`),`utf-8`);return JSON.parse(raw)?.name?.trim()||null}catch{return null}}const PRIMARY_PACKAGE_NAME=CORE_PACKAGE_NAME,ALL_PACKAGE_NAMES=CORE_PACKAGE_NAMES;async function tryRealpath(targetPath){try{return await fs.realpath(targetPath)}catch{return path.resolve(targetPath)}}function resolveBunGlobalRoot(){let bunInstall=process.env.BUN_INSTALL?.trim()||path.join(os.homedir(),`.bun`);return path.join(bunInstall,`install`,`global`,`node_modules`)}async function resolveGlobalRoot(manager,runCommand,timeoutMs){if(manager===`bun`)return resolveBunGlobalRoot();let res=await runCommand(manager===`pnpm`?[`pnpm`,`root`,`-g`]:[`npm`,`root`,`-g`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?null:res.stdout.trim()||null}async function resolveGlobalPackageRoot(manager,runCommand,timeoutMs){let root=await resolveGlobalRoot(manager,runCommand,timeoutMs);if(!root)return null;for(let name of ALL_PACKAGE_NAMES){let candidate=path.join(root,name);if(await pathExists(candidate))return candidate}return path.join(root,PRIMARY_PACKAGE_NAME)}async function detectGlobalInstallManagerForRoot(runCommand,pkgRoot,timeoutMs){let pkgReal=await tryRealpath(pkgRoot);for(let{manager,argv}of[{manager:`npm`,argv:[`npm`,`root`,`-g`]},{manager:`pnpm`,argv:[`pnpm`,`root`,`-g`]}]){let res=await runCommand(argv,{timeoutMs}).catch(()=>null);if(!res||res.code!==0)continue;let globalRoot=res.stdout.trim();if(!globalRoot)continue;let globalReal=await tryRealpath(globalRoot);for(let name of ALL_PACKAGE_NAMES){let expected=path.join(globalReal,name);if(path.resolve(expected)===path.resolve(pkgReal))return manager}}let bunGlobalReal=await tryRealpath(resolveBunGlobalRoot());for(let name of ALL_PACKAGE_NAMES){let bunExpected=path.join(bunGlobalReal,name);if(path.resolve(bunExpected)===path.resolve(pkgReal))return`bun`}return null}async function detectGlobalInstallManagerByPresence(runCommand,timeoutMs){for(let manager of[`npm`,`pnpm`]){let root=await resolveGlobalRoot(manager,runCommand,timeoutMs);if(root){for(let name of ALL_PACKAGE_NAMES)if(await pathExists(path.join(root,name)))return manager}}let bunRoot=resolveBunGlobalRoot();for(let name of ALL_PACKAGE_NAMES)if(await pathExists(path.join(bunRoot,name)))return`bun`;return null}function globalInstallArgs(manager,spec){return manager===`pnpm`?[`pnpm`,`add`,`-g`,spec]:manager===`bun`?[`bun`,`add`,`-g`,spec]:[`npm`,`i`,`-g`,spec]}async function cleanupGlobalRenameDirs(params){let removed=[],root=params.globalRoot.trim(),name=params.packageName.trim().split(`/`).pop()??``;if(!root||!name)return{removed};let prefix=`.${name}-`,entries=[];try{entries=await fs.readdir(root)}catch{return{removed}}for(let entry of entries){if(!entry.startsWith(prefix))continue;let target=path.join(root,entry);try{if(!(await fs.lstat(target)).isDirectory())continue;await fs.rm(target,{recursive:!0,force:!0}),removed.push(entry)}catch{}}return{removed}}const MAX_LOG_CHARS=8e3,START_DIRS=[`cwd`,`argv1`,`process`];function normalizeDir(value){if(!value)return null;let trimmed=value.trim();return trimmed?path.resolve(trimmed):null}function resolveNodeModulesBinPackageRoot(argv1){let normalized=path.resolve(argv1),parts=normalized.split(path.sep),binIndex=parts.lastIndexOf(`.bin`);if(binIndex<=0||parts[binIndex-1]!==`node_modules`)return null;let binName=path.basename(normalized),nodeModulesDir=parts.slice(0,binIndex).join(path.sep);return path.join(nodeModulesDir,binName)}function buildStartDirs(opts){let dirs=[],cwd=normalizeDir(opts.cwd);cwd&&dirs.push(cwd);let argv1=normalizeDir(opts.argv1);if(argv1){dirs.push(path.dirname(argv1));let packageRoot=resolveNodeModulesBinPackageRoot(argv1);packageRoot&&dirs.push(packageRoot)}let proc=normalizeDir(process.cwd());return proc&&dirs.push(proc),Array.from(new Set(dirs))}async function readBranchName(runCommand,root,timeoutMs){let res=await runCommand([`git`,`-C`,root,`rev-parse`,`--abbrev-ref`,`HEAD`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?null:res.stdout.trim()||null}async function listGitTags(runCommand,root,timeoutMs,pattern=`v*`){let res=await runCommand([`git`,`-C`,root,`tag`,`--list`,pattern,`--sort=-v:refname`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?[]:res.stdout.split(`
1
+ import{g as pathExists}from"./utils-DbaBVFaK.js";import{cr as trimLogTail}from"./reply-GY1C8tcv.js";import{a as isCorePackageName,i as CORE_PACKAGE_NAMES,o as stripPackagePrefix,r as CORE_PACKAGE_NAME}from"./builderforce-root-D64_sXEi.js";import{t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-CWgH1Tda.js";import{a as gitWorkingTreeStatusArgs,d as channelToNpmTag,l as DEFAULT_PACKAGE_CHANNEL,m as isStableTag,n as compareSemverStrings,p as isBetaTag,s as detectPackageManager$1,u as DEV_BRANCH}from"./update-check-D6MvqVFE.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";async function readPackageVersion(root){try{let raw=await fs.readFile(path.join(root,`package.json`),`utf-8`),parsed=JSON.parse(raw);return typeof parsed?.version==`string`?parsed.version:null}catch{return null}}async function readPackageName(root){try{let raw=await fs.readFile(path.join(root,`package.json`),`utf-8`);return JSON.parse(raw)?.name?.trim()||null}catch{return null}}const PRIMARY_PACKAGE_NAME=CORE_PACKAGE_NAME,ALL_PACKAGE_NAMES=CORE_PACKAGE_NAMES;async function tryRealpath(targetPath){try{return await fs.realpath(targetPath)}catch{return path.resolve(targetPath)}}function resolveBunGlobalRoot(){let bunInstall=process.env.BUN_INSTALL?.trim()||path.join(os.homedir(),`.bun`);return path.join(bunInstall,`install`,`global`,`node_modules`)}async function resolveGlobalRoot(manager,runCommand,timeoutMs){if(manager===`bun`)return resolveBunGlobalRoot();let res=await runCommand(manager===`pnpm`?[`pnpm`,`root`,`-g`]:[`npm`,`root`,`-g`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?null:res.stdout.trim()||null}async function resolveGlobalPackageRoot(manager,runCommand,timeoutMs){let root=await resolveGlobalRoot(manager,runCommand,timeoutMs);if(!root)return null;for(let name of ALL_PACKAGE_NAMES){let candidate=path.join(root,name);if(await pathExists(candidate))return candidate}return path.join(root,PRIMARY_PACKAGE_NAME)}async function detectGlobalInstallManagerForRoot(runCommand,pkgRoot,timeoutMs){let pkgReal=await tryRealpath(pkgRoot);for(let{manager,argv}of[{manager:`npm`,argv:[`npm`,`root`,`-g`]},{manager:`pnpm`,argv:[`pnpm`,`root`,`-g`]}]){let res=await runCommand(argv,{timeoutMs}).catch(()=>null);if(!res||res.code!==0)continue;let globalRoot=res.stdout.trim();if(!globalRoot)continue;let globalReal=await tryRealpath(globalRoot);for(let name of ALL_PACKAGE_NAMES){let expected=path.join(globalReal,name);if(path.resolve(expected)===path.resolve(pkgReal))return manager}}let bunGlobalReal=await tryRealpath(resolveBunGlobalRoot());for(let name of ALL_PACKAGE_NAMES){let bunExpected=path.join(bunGlobalReal,name);if(path.resolve(bunExpected)===path.resolve(pkgReal))return`bun`}return null}async function detectGlobalInstallManagerByPresence(runCommand,timeoutMs){for(let manager of[`npm`,`pnpm`]){let root=await resolveGlobalRoot(manager,runCommand,timeoutMs);if(root){for(let name of ALL_PACKAGE_NAMES)if(await pathExists(path.join(root,name)))return manager}}let bunRoot=resolveBunGlobalRoot();for(let name of ALL_PACKAGE_NAMES)if(await pathExists(path.join(bunRoot,name)))return`bun`;return null}function globalInstallArgs(manager,spec){return manager===`pnpm`?[`pnpm`,`add`,`-g`,spec]:manager===`bun`?[`bun`,`add`,`-g`,spec]:[`npm`,`i`,`-g`,spec]}async function cleanupGlobalRenameDirs(params){let removed=[],root=params.globalRoot.trim(),name=params.packageName.trim().split(`/`).pop()??``;if(!root||!name)return{removed};let prefix=`.${name}-`,entries=[];try{entries=await fs.readdir(root)}catch{return{removed}}for(let entry of entries){if(!entry.startsWith(prefix))continue;let target=path.join(root,entry);try{if(!(await fs.lstat(target)).isDirectory())continue;await fs.rm(target,{recursive:!0,force:!0}),removed.push(entry)}catch{}}return{removed}}const MAX_LOG_CHARS=8e3,START_DIRS=[`cwd`,`argv1`,`process`];function normalizeDir(value){if(!value)return null;let trimmed=value.trim();return trimmed?path.resolve(trimmed):null}function resolveNodeModulesBinPackageRoot(argv1){let normalized=path.resolve(argv1),parts=normalized.split(path.sep),binIndex=parts.lastIndexOf(`.bin`);if(binIndex<=0||parts[binIndex-1]!==`node_modules`)return null;let binName=path.basename(normalized),nodeModulesDir=parts.slice(0,binIndex).join(path.sep);return path.join(nodeModulesDir,binName)}function buildStartDirs(opts){let dirs=[],cwd=normalizeDir(opts.cwd);cwd&&dirs.push(cwd);let argv1=normalizeDir(opts.argv1);if(argv1){dirs.push(path.dirname(argv1));let packageRoot=resolveNodeModulesBinPackageRoot(argv1);packageRoot&&dirs.push(packageRoot)}let proc=normalizeDir(process.cwd());return proc&&dirs.push(proc),Array.from(new Set(dirs))}async function readBranchName(runCommand,root,timeoutMs){let res=await runCommand([`git`,`-C`,root,`rev-parse`,`--abbrev-ref`,`HEAD`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?null:res.stdout.trim()||null}async function listGitTags(runCommand,root,timeoutMs,pattern=`v*`){let res=await runCommand([`git`,`-C`,root,`tag`,`--list`,pattern,`--sort=-v:refname`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?[]:res.stdout.split(`
2
2
  `).map(line=>line.trim()).filter(Boolean)}async function resolveChannelTag(runCommand,root,timeoutMs,channel){let tags=await listGitTags(runCommand,root,timeoutMs);if(channel===`beta`){let betaTag=tags.find(tag=>isBetaTag(tag))??null,stableTag=tags.find(tag=>isStableTag(tag))??null;if(!betaTag)return stableTag;if(!stableTag)return betaTag;let cmp=compareSemverStrings(betaTag,stableTag);return cmp!=null&&cmp<0?stableTag:betaTag}return tags.find(tag=>isStableTag(tag))??null}async function resolveGitRoot(runCommand,candidates,timeoutMs){for(let dir of candidates){let res=await runCommand([`git`,`-C`,dir,`rev-parse`,`--show-toplevel`],{timeoutMs});if(res.code===0){let root=res.stdout.trim();if(root)return root}}return null}async function findPackageRoot(candidates){for(let dir of candidates){let current=dir;for(let i=0;i<12;i+=1){let pkgPath=path.join(current,`package.json`);try{let raw=await fs.readFile(pkgPath,`utf-8`),name=JSON.parse(raw)?.name?.trim();if(isCorePackageName(name))return current}catch{}let parent=path.dirname(current);if(parent===current)break;current=parent}}return null}async function detectPackageManager(root){return await detectPackageManager$1(root)??`npm`}async function runStep(opts){let{runCommand,name,argv,cwd,timeoutMs,env,progress,stepIndex,totalSteps}=opts,command=argv.join(` `),stepInfo={name,command,index:stepIndex,total:totalSteps};progress?.onStepStart?.(stepInfo);let started=Date.now(),result=await runCommand(argv,{cwd,timeoutMs,env}),durationMs=Date.now()-started,stderrTail=trimLogTail(result.stderr,MAX_LOG_CHARS);return progress?.onStepComplete?.({...stepInfo,durationMs,exitCode:result.code,stderrTail}),{name,command,cwd,durationMs,exitCode:result.code,stdoutTail:trimLogTail(result.stdout,MAX_LOG_CHARS),stderrTail:trimLogTail(result.stderr,MAX_LOG_CHARS)}}function managerScriptArgs(manager,script,args=[]){return manager===`pnpm`?[`pnpm`,script,...args]:manager===`bun`?[`bun`,`run`,script,...args]:args.length>0?[`npm`,`run`,script,`--`,...args]:[`npm`,`run`,script]}function managerInstallArgs(manager){return manager===`pnpm`?[`pnpm`,`install`]:manager===`bun`?[`bun`,`install`]:[`npm`,`install`]}function normalizeTag(tag){let trimmed=tag?.trim();return trimmed?stripPackagePrefix(trimmed):`latest`}async function runGatewayUpdate(opts={}){let startedAt=Date.now(),runCommand=opts.runCommand??(async(argv,options)=>{let res=await runCommandWithTimeout(argv,options);return{stdout:res.stdout,stderr:res.stderr,code:res.code}}),timeoutMs=opts.timeoutMs??12e5,progress=opts.progress,steps=[],candidates=buildStartDirs(opts),stepIndex=0,gitTotalSteps=0,step=(name,argv,cwd,env)=>{let currentIndex=stepIndex;return stepIndex+=1,{runCommand,name,argv,cwd,timeoutMs,env,progress,stepIndex:currentIndex,totalSteps:gitTotalSteps}},pkgRoot=await findPackageRoot(candidates),gitRoot=await resolveGitRoot(runCommand,candidates,timeoutMs);if(gitRoot&&pkgRoot&&path.resolve(gitRoot)!==path.resolve(pkgRoot)&&(gitRoot=null),gitRoot&&!pkgRoot)return{status:`error`,mode:`unknown`,root:gitRoot,reason:`not-builderforce-root`,steps:[],durationMs:Date.now()-startedAt};if(gitRoot&&pkgRoot&&path.resolve(gitRoot)===path.resolve(pkgRoot)){let beforeSha=(await runCommand([`git`,`-C`,gitRoot,`rev-parse`,`HEAD`],{cwd:gitRoot,timeoutMs})).stdout.trim()||null,beforeVersion=await readPackageVersion(gitRoot),channel=opts.channel??`dev`,branch=channel===`dev`?await readBranchName(runCommand,gitRoot,timeoutMs):null,needsCheckoutMain=channel===`dev`&&branch!==DEV_BRANCH;gitTotalSteps=channel===`dev`?needsCheckoutMain?11:10:9;let buildGitErrorResult=reason=>({status:`error`,mode:`git`,root:gitRoot,reason,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt}),runGitCheckoutOrFail=async(name,argv)=>{let checkoutStep=await runStep(step(name,argv,gitRoot));return steps.push(checkoutStep),checkoutStep.exitCode===0?null:buildGitErrorResult(`checkout-failed`)},statusCheck=await runStep(step(`clean check`,gitWorkingTreeStatusArgs(gitRoot),gitRoot));if(steps.push(statusCheck),statusCheck.stdoutTail&&statusCheck.stdoutTail.trim().length>0)return{status:`skipped`,mode:`git`,root:gitRoot,reason:`dirty`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};if(channel===`dev`){if(needsCheckoutMain){let failure=await runGitCheckoutOrFail(`git checkout ${DEV_BRANCH}`,[`git`,`-C`,gitRoot,`checkout`,DEV_BRANCH]);if(failure)return failure}let upstreamStep=await runStep(step(`upstream check`,[`git`,`-C`,gitRoot,`rev-parse`,`--abbrev-ref`,`--symbolic-full-name`,`@{upstream}`],gitRoot));if(steps.push(upstreamStep),upstreamStep.exitCode!==0)return{status:`skipped`,mode:`git`,root:gitRoot,reason:`no-upstream`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let fetchStep=await runStep(step(`git fetch`,[`git`,`-C`,gitRoot,`fetch`,`--all`,`--prune`,`--tags`],gitRoot));steps.push(fetchStep);let upstreamShaStep=await runStep(step(`git rev-parse @{upstream}`,[`git`,`-C`,gitRoot,`rev-parse`,`@{upstream}`],gitRoot));steps.push(upstreamShaStep);let upstreamSha=upstreamShaStep.stdoutTail?.trim();if(!upstreamShaStep.stdoutTail||!upstreamSha)return{status:`error`,mode:`git`,root:gitRoot,reason:`no-upstream-sha`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let revListStep=await runStep(step(`git rev-list`,[`git`,`-C`,gitRoot,`rev-list`,`--max-count=10`,upstreamSha],gitRoot));if(steps.push(revListStep),revListStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`preflight-revlist-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let candidates=(revListStep.stdoutTail??``).split(`
3
3
  `).map(line=>line.trim()).filter(Boolean);if(candidates.length===0)return{status:`error`,mode:`git`,root:gitRoot,reason:`preflight-no-candidates`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let manager=await detectPackageManager(gitRoot),preflightRoot=await fs.mkdtemp(path.join(os.tmpdir(),`builderforce-update-preflight-`)),worktreeDir=path.join(preflightRoot,`worktree`),worktreeStep=await runStep(step(`preflight worktree`,[`git`,`-C`,gitRoot,`worktree`,`add`,`--detach`,worktreeDir,upstreamSha],gitRoot));if(steps.push(worktreeStep),worktreeStep.exitCode!==0)return await fs.rm(preflightRoot,{recursive:!0,force:!0}).catch(()=>{}),{status:`error`,mode:`git`,root:gitRoot,reason:`preflight-worktree-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let selectedSha=null;try{for(let sha of candidates){let shortSha=sha.slice(0,8),checkoutStep=await runStep(step(`preflight checkout (${shortSha})`,[`git`,`-C`,worktreeDir,`checkout`,`--detach`,sha],worktreeDir));if(steps.push(checkoutStep),checkoutStep.exitCode!==0)continue;let depsStep=await runStep(step(`preflight deps install (${shortSha})`,managerInstallArgs(manager),worktreeDir));if(steps.push(depsStep),depsStep.exitCode!==0)continue;let buildStep=await runStep(step(`preflight build (${shortSha})`,managerScriptArgs(manager,`build`),worktreeDir));if(steps.push(buildStep),buildStep.exitCode!==0)continue;let lintStep=await runStep(step(`preflight lint (${shortSha})`,managerScriptArgs(manager,`lint`),worktreeDir));if(steps.push(lintStep),lintStep.exitCode===0){selectedSha=sha;break}}}finally{let removeStep=await runStep(step(`preflight cleanup`,[`git`,`-C`,gitRoot,`worktree`,`remove`,`--force`,worktreeDir],gitRoot));steps.push(removeStep),await runCommand([`git`,`-C`,gitRoot,`worktree`,`prune`],{cwd:gitRoot,timeoutMs}).catch(()=>null),await fs.rm(preflightRoot,{recursive:!0,force:!0}).catch(()=>{})}if(!selectedSha)return{status:`error`,mode:`git`,root:gitRoot,reason:`preflight-no-good-commit`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let rebaseStep=await runStep(step(`git rebase`,[`git`,`-C`,gitRoot,`rebase`,selectedSha],gitRoot));if(steps.push(rebaseStep),rebaseStep.exitCode!==0){let abortResult=await runCommand([`git`,`-C`,gitRoot,`rebase`,`--abort`],{cwd:gitRoot,timeoutMs});return steps.push({name:`git rebase --abort`,command:`git rebase --abort`,cwd:gitRoot,durationMs:0,exitCode:abortResult.code,stdoutTail:trimLogTail(abortResult.stdout,MAX_LOG_CHARS),stderrTail:trimLogTail(abortResult.stderr,MAX_LOG_CHARS)}),{status:`error`,mode:`git`,root:gitRoot,reason:`rebase-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt}}}else{let fetchStep=await runStep(step(`git fetch`,[`git`,`-C`,gitRoot,`fetch`,`--all`,`--prune`,`--tags`],gitRoot));if(steps.push(fetchStep),fetchStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`fetch-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let tag=await resolveChannelTag(runCommand,gitRoot,timeoutMs,channel);if(!tag)return{status:`error`,mode:`git`,root:gitRoot,reason:`no-release-tag`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let failure=await runGitCheckoutOrFail(`git checkout ${tag}`,[`git`,`-C`,gitRoot,`checkout`,`--detach`,tag]);if(failure)return failure}let manager=await detectPackageManager(gitRoot),depsStep=await runStep(step(`deps install`,managerInstallArgs(manager),gitRoot));if(steps.push(depsStep),depsStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`deps-install-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let buildStep=await runStep(step(`build`,managerScriptArgs(manager,`build`),gitRoot));if(steps.push(buildStep),buildStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`build-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let uiBuildStep=await runStep(step(`ui:build`,managerScriptArgs(manager,`ui:build`),gitRoot));if(steps.push(uiBuildStep),uiBuildStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`ui-build-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let doctorEntry=path.join(gitRoot,`builderforce.mjs`);if(!await fs.stat(doctorEntry).then(()=>!0).catch(()=>!1))return steps.push({name:`builderforce doctor entry`,command:`verify ${doctorEntry}`,cwd:gitRoot,durationMs:0,exitCode:1,stderrTail:`missing ${doctorEntry}`}),{status:`error`,mode:`git`,root:gitRoot,reason:`doctor-entry-missing`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let doctorStep=await runStep(step(`builderforce doctor`,[process.execPath,doctorEntry,`doctor`,`--non-interactive`,`--fix`],gitRoot,{BUILDERFORCE_AGENTS_UPDATE_IN_PROGRESS:`1`}));if(steps.push(doctorStep),!(await resolveControlUiDistIndexHealth({root:gitRoot})).exists){let repairArgv=managerScriptArgs(manager,`ui:build`),started=Date.now(),repairResult=await runCommand(repairArgv,{cwd:gitRoot,timeoutMs}),repairStep={name:`ui:build (post-doctor repair)`,command:repairArgv.join(` `),cwd:gitRoot,durationMs:Date.now()-started,exitCode:repairResult.code,stdoutTail:trimLogTail(repairResult.stdout,MAX_LOG_CHARS),stderrTail:trimLogTail(repairResult.stderr,MAX_LOG_CHARS)};if(steps.push(repairStep),repairResult.code!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:repairStep.name,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let repairedUiIndexHealth=await resolveControlUiDistIndexHealth({root:gitRoot});if(!repairedUiIndexHealth.exists){let uiIndexPath=repairedUiIndexHealth.indexPath??resolveControlUiDistIndexPathForRoot(gitRoot);return steps.push({name:`ui assets verify`,command:`verify ${uiIndexPath}`,cwd:gitRoot,durationMs:0,exitCode:1,stderrTail:`missing ${uiIndexPath}`}),{status:`error`,mode:`git`,root:gitRoot,reason:`ui-assets-missing`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt}}}let failedStep=steps.find(s=>s.exitCode!==0),afterShaStep=await runStep(step(`git rev-parse HEAD (after)`,[`git`,`-C`,gitRoot,`rev-parse`,`HEAD`],gitRoot));steps.push(afterShaStep);let afterVersion=await readPackageVersion(gitRoot);return{status:failedStep?`error`:`ok`,mode:`git`,root:gitRoot,reason:failedStep?failedStep.name:void 0,before:{sha:beforeSha,version:beforeVersion},after:{sha:afterShaStep.stdoutTail?.trim()??null,version:afterVersion},steps,durationMs:Date.now()-startedAt}}if(!pkgRoot)return{status:`error`,mode:`unknown`,reason:`no root (${START_DIRS.join(`,`)})`,steps:[],durationMs:Date.now()-startedAt};let beforeVersion=await readPackageVersion(pkgRoot),globalManager=await detectGlobalInstallManagerForRoot(runCommand,pkgRoot,timeoutMs);if(globalManager){let packageName=await readPackageName(pkgRoot)??CORE_PACKAGE_NAME;await cleanupGlobalRenameDirs({globalRoot:path.dirname(pkgRoot),packageName});let channel=opts.channel??DEFAULT_PACKAGE_CHANNEL,updateStep=await runStep({runCommand,name:`global update`,argv:globalInstallArgs(globalManager,`${packageName}@${normalizeTag(opts.tag??channelToNpmTag(channel))}`),cwd:pkgRoot,timeoutMs,progress,stepIndex:0,totalSteps:1}),steps=[updateStep],afterVersion=await readPackageVersion(pkgRoot);return{status:updateStep.exitCode===0?`ok`:`error`,mode:globalManager,root:pkgRoot,reason:updateStep.exitCode===0?void 0:updateStep.name,before:{version:beforeVersion},after:{version:afterVersion},steps,durationMs:Date.now()-startedAt}}return{status:`skipped`,mode:`unknown`,root:pkgRoot,reason:`not-git-install`,before:{version:beforeVersion},steps:[],durationMs:Date.now()-startedAt}}async function resolveAgentSessionDirs(stateDir){let agentsDir=path.join(stateDir,`agents`),entries=[];try{entries=await fs.readdir(agentsDir,{withFileTypes:!0})}catch(err){if(err.code===`ENOENT`)return[];throw err}return entries.filter(entry=>entry.isDirectory()).map(entry=>path.join(agentsDir,entry.name,`sessions`)).toSorted((a,b)=>a.localeCompare(b))}export{detectGlobalInstallManagerForRoot as a,readPackageName as c,detectGlobalInstallManagerByPresence as i,readPackageVersion as l,runGatewayUpdate as n,globalInstallArgs as o,cleanupGlobalRenameDirs as r,resolveGlobalPackageRoot as s,resolveAgentSessionDirs as t};
@@ -1 +1 @@
1
- import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import{H as resolveConfiguredModelRef,T as resolveBuilderForceAgentsAgentDir,U as resolveDefaultModelForAgent,_n as DEFAULT_PROVIDER,gn as DEFAULT_MODEL,hn as DEFAULT_CONTEXT_TOKENS,z as parseModelRef}from"./auth-profiles-C1VbcUOm.js";import{C as parseAgentSessionKey,b as isCronRunSessionKey,d as normalizeAgentId,f as normalizeMainKey}from"./session-key-CksCYipj.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-CufEmNj_.js";import{r as loadConfig}from"./io-CohJffHG.js";import{a as ensureBuilderForceAgentsModelsJson,i as discoverModels,r as discoverAuthStorage}from"./model-discovery-C9Xm95uL.js";import{A as canonicalizeMainSessionAlias,N as resolveMainSessionKey,U as buildGroupDisplayName,a as loadSessionStore,j as resolveAgentMainSessionKey,k as resolveFreshSessionTotalTokens,nt as normalizeSessionDeliveryFields,y as readSessionTitleFieldsFromTranscript}from"./sessions-Bl1wwotX.js";import{c as resolveStorePath}from"./paths-ClsbsPQP.js";import path from"node:path";import fs from"node:fs";function applyDiscoveredContextWindows(params){for(let model of params.models){if(!model?.id)continue;let contextWindow=typeof model.contextWindow==`number`?Math.trunc(model.contextWindow):void 0;if(!contextWindow||contextWindow<=0)continue;let existing=params.cache.get(model.id);(existing===void 0||contextWindow<existing)&&params.cache.set(model.id,contextWindow)}}function applyConfiguredContextWindows(params){let providers=params.modelsConfig?.providers;if(!(!providers||typeof providers!=`object`)){for(let provider of Object.values(providers))if(Array.isArray(provider?.models))for(let model of provider.models){let modelId=typeof model?.id==`string`?model.id:void 0,contextWindow=typeof model?.contextWindow==`number`?model.contextWindow:void 0;!modelId||!contextWindow||contextWindow<=0||params.cache.set(modelId,contextWindow)}}}const MODEL_CACHE=new Map;(async()=>{let cfg;try{cfg=loadConfig()}catch{return}try{await ensureBuilderForceAgentsModelsJson(cfg)}catch{}try{let agentDir=resolveBuilderForceAgentsAgentDir(),modelRegistry=discoverModels(discoverAuthStorage(agentDir),agentDir);applyDiscoveredContextWindows({cache:MODEL_CACHE,models:typeof modelRegistry.getAvailable==`function`?modelRegistry.getAvailable():modelRegistry.getAll()})}catch{}applyConfiguredContextWindows({cache:MODEL_CACHE,modelsConfig:cfg.models})})().catch(()=>{});function lookupContextTokens(modelId){if(modelId)return MODEL_CACHE.get(modelId)}const AVATAR_DATA_RE=/^data:/i,AVATAR_HTTP_RE=/^https?:\/\//i,AVATAR_SCHEME_RE=/^[a-z][a-z0-9+.-]*:/i,WINDOWS_ABS_RE=/^[a-zA-Z]:[\\/]/,AVATAR_MIME_BY_EXT={".png":`image/png`,".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".webp":`image/webp`,".gif":`image/gif`,".svg":`image/svg+xml`,".bmp":`image/bmp`,".tif":`image/tiff`,".tiff":`image/tiff`};function resolveAvatarMime(filePath){return AVATAR_MIME_BY_EXT[path.extname(filePath).toLowerCase()]??`application/octet-stream`}function isWorkspaceRelativePath(value){return!(!value||value.startsWith(`~`)||AVATAR_SCHEME_RE.test(value)&&!WINDOWS_ABS_RE.test(value))}function resolveIdentityAvatarUrl(cfg,agentId,avatar){if(!avatar)return;let trimmed=avatar.trim();if(!trimmed)return;if(AVATAR_DATA_RE.test(trimmed)||AVATAR_HTTP_RE.test(trimmed))return trimmed;if(!isWorkspaceRelativePath(trimmed))return;let workspaceDir=resolveAgentWorkspaceDir(cfg,agentId),workspaceRoot=path.resolve(workspaceDir),resolved=path.resolve(workspaceRoot,trimmed),relative=path.relative(workspaceRoot,resolved);if(!(relative.startsWith(`..`)||path.isAbsolute(relative)))try{let stat=fs.statSync(resolved);if(!stat.isFile()||stat.size>2097152)return;let buffer=fs.readFileSync(resolved);return`data:${resolveAvatarMime(resolved)};base64,${buffer.toString(`base64`)}`}catch{return}}function formatSessionIdPrefix(sessionId,updatedAt){let prefix=sessionId.slice(0,8);return updatedAt&&updatedAt>0?`${prefix} (${new Date(updatedAt).toISOString().slice(0,10)})`:prefix}function truncateTitle(text,maxLen){if(text.length<=maxLen)return text;let cut=text.slice(0,maxLen-1),lastSpace=cut.lastIndexOf(` `);return lastSpace>maxLen*.6?cut.slice(0,lastSpace)+`…`:cut+`…`}function deriveSessionTitle(entry,firstUserMessage){if(entry){if(entry.displayName?.trim())return entry.displayName.trim();if(entry.subject?.trim())return entry.subject.trim();if(firstUserMessage?.trim())return truncateTitle(firstUserMessage.replace(/\s+/g,` `).trim(),60);if(entry.sessionId)return formatSessionIdPrefix(entry.sessionId,entry.updatedAt)}}function loadSessionEntry(sessionKey){let cfg=loadConfig(),sessionCfg=cfg.session,canonicalKey=resolveSessionStoreKey({cfg,sessionKey}),agentId=resolveSessionStoreAgentId(cfg,canonicalKey),storePath=resolveStorePath(sessionCfg?.store,{agentId}),store=loadSessionStore(storePath),match=findStoreMatch(store,canonicalKey,sessionKey.trim()),legacyKey=match?.key===canonicalKey?void 0:match?.key;return{cfg,storePath,store,entry:match?.entry,canonicalKey,legacyKey}}function findStoreMatch(store,...candidates){for(let candidate of candidates)if(candidate&&store[candidate])return{entry:store[candidate],key:candidate};let loweredSet=new Set(candidates.filter(Boolean).map(c=>c.toLowerCase()));for(let key of Object.keys(store))if(loweredSet.has(key.toLowerCase()))return{entry:store[key],key}}function findStoreKeysIgnoreCase(store,targetKey){let lowered=targetKey.toLowerCase(),matches=[];for(let key of Object.keys(store))key.toLowerCase()===lowered&&matches.push(key);return matches}function pruneLegacyStoreKeys(params){let keysToDelete=new Set;for(let candidate of params.candidates){let trimmed=String(candidate??``).trim();if(trimmed){trimmed!==params.canonicalKey&&keysToDelete.add(trimmed);for(let match of findStoreKeysIgnoreCase(params.store,trimmed))match!==params.canonicalKey&&keysToDelete.add(match)}}for(let key of keysToDelete)delete params.store[key]}function classifySessionKey(key,entry){return key===`global`?`global`:key===`unknown`?`unknown`:entry?.chatType===`group`||entry?.chatType===`channel`||key.includes(`:group:`)||key.includes(`:channel:`)?`group`:`direct`}function parseGroupKey(key){let parts=(parseAgentSessionKey(key)?.rest??key).split(`:`).filter(Boolean);if(parts.length>=3){let[channel,kind,...rest]=parts;if(kind===`group`||kind===`channel`)return{channel,kind,id:rest.join(`:`)}}return null}function isStorePathTemplate(store){return typeof store==`string`&&store.includes(`{agentId}`)}function listExistingAgentIdsFromDisk(){let root=resolveStateDir(),agentsDir=path.join(root,`agents`);try{return fs.readdirSync(agentsDir,{withFileTypes:!0}).filter(entry=>entry.isDirectory()).map(entry=>normalizeAgentId(entry.name)).filter(Boolean)}catch{return[]}}function listConfiguredAgentIds(cfg){let agents=cfg.agents?.list??[];if(agents.length>0){let ids=new Set;for(let entry of agents)entry?.id&&ids.add(normalizeAgentId(entry.id));let defaultId=normalizeAgentId(resolveDefaultAgentId(cfg));ids.add(defaultId);let sorted=Array.from(ids).filter(Boolean);return sorted.sort((a,b)=>a.localeCompare(b)),sorted.includes(defaultId)?[defaultId,...sorted.filter(id=>id!==defaultId)]:sorted}let ids=new Set,defaultId=normalizeAgentId(resolveDefaultAgentId(cfg));ids.add(defaultId);for(let id of listExistingAgentIdsFromDisk())ids.add(id);let sorted=Array.from(ids).filter(Boolean);return sorted.sort((a,b)=>a.localeCompare(b)),sorted.includes(defaultId)?[defaultId,...sorted.filter(id=>id!==defaultId)]:sorted}function listAgentsForGateway(cfg){let defaultId=normalizeAgentId(resolveDefaultAgentId(cfg)),mainKey=normalizeMainKey(cfg.session?.mainKey),scope=cfg.session?.scope??`per-sender`,configuredById=new Map;for(let entry of cfg.agents?.list??[]){if(!entry?.id)continue;let identity=entry.identity?{name:entry.identity.name?.trim()||void 0,theme:entry.identity.theme?.trim()||void 0,emoji:entry.identity.emoji?.trim()||void 0,avatar:entry.identity.avatar?.trim()||void 0,avatarUrl:resolveIdentityAvatarUrl(cfg,normalizeAgentId(entry.id),entry.identity.avatar?.trim())}:void 0;configuredById.set(normalizeAgentId(entry.id),{name:typeof entry.name==`string`&&entry.name.trim()?entry.name.trim():void 0,identity})}let explicitIds=new Set((cfg.agents?.list??[]).map(entry=>entry?.id?normalizeAgentId(entry.id):``).filter(Boolean)),allowedIds=explicitIds.size>0?new Set([...explicitIds,defaultId]):null,agentIds=listConfiguredAgentIds(cfg).filter(id=>allowedIds?allowedIds.has(id):!0);return mainKey&&!agentIds.includes(mainKey)&&(!allowedIds||allowedIds.has(mainKey))&&(agentIds=[...agentIds,mainKey]),{defaultId,mainKey,scope,agents:agentIds.map(id=>{let meta=configuredById.get(id);return{id,name:meta?.name,identity:meta?.identity}})}}function canonicalizeSessionKeyForAgent(agentId,key){let lowered=key.toLowerCase();return lowered===`global`||lowered===`unknown`||lowered.startsWith(`agent:`)?lowered:`agent:${normalizeAgentId(agentId)}:${lowered}`}function resolveDefaultStoreAgentId(cfg){return normalizeAgentId(resolveDefaultAgentId(cfg))}function resolveSessionStoreKey(params){let raw=params.sessionKey.trim();if(!raw)return raw;let rawLower=raw.toLowerCase();if(rawLower===`global`||rawLower===`unknown`)return rawLower;let parsed=parseAgentSessionKey(raw);if(parsed){let agentId=normalizeAgentId(parsed.agentId),lowered=raw.toLowerCase(),canonical=canonicalizeMainSessionAlias({cfg:params.cfg,agentId,sessionKey:lowered});return canonical===lowered?lowered:canonical}let lowered=raw.toLowerCase(),rawMainKey=normalizeMainKey(params.cfg.session?.mainKey);return lowered===`main`||lowered===rawMainKey?resolveMainSessionKey(params.cfg):canonicalizeSessionKeyForAgent(resolveDefaultStoreAgentId(params.cfg),lowered)}function resolveSessionStoreAgentId(cfg,canonicalKey){if(canonicalKey===`global`||canonicalKey===`unknown`)return resolveDefaultStoreAgentId(cfg);let parsed=parseAgentSessionKey(canonicalKey);return parsed?.agentId?normalizeAgentId(parsed.agentId):resolveDefaultStoreAgentId(cfg)}function canonicalizeSpawnedByForAgent(cfg,agentId,spawnedBy){let raw=spawnedBy?.trim();if(!raw)return;let lower=raw.toLowerCase();if(lower===`global`||lower===`unknown`)return lower;let result;result=raw.toLowerCase().startsWith(`agent:`)?raw.toLowerCase():`agent:${normalizeAgentId(agentId)}:${lower}`;let parsed=parseAgentSessionKey(result);return canonicalizeMainSessionAlias({cfg,agentId:parsed?.agentId?normalizeAgentId(parsed.agentId):agentId,sessionKey:result})}function resolveGatewaySessionStoreTarget(params){let key=params.key.trim(),canonicalKey=resolveSessionStoreKey({cfg:params.cfg,sessionKey:key}),agentId=resolveSessionStoreAgentId(params.cfg,canonicalKey),storeConfig=params.cfg.session?.store,storePath=resolveStorePath(storeConfig,{agentId});if(canonicalKey===`global`||canonicalKey===`unknown`)return{agentId,storePath,canonicalKey,storeKeys:key&&key!==canonicalKey?[canonicalKey,key]:[key]};let storeKeys=new Set;if(storeKeys.add(canonicalKey),key&&key!==canonicalKey&&storeKeys.add(key),params.scanLegacyKeys!==!1){let scanTargets=new Set(storeKeys);canonicalKey===resolveAgentMainSessionKey({cfg:params.cfg,agentId})&&scanTargets.add(`agent:${agentId}:main`);let store=params.store??loadSessionStore(storePath);for(let seed of scanTargets)for(let legacyKey of findStoreKeysIgnoreCase(store,seed))storeKeys.add(legacyKey)}return{agentId,storePath,canonicalKey,storeKeys:Array.from(storeKeys)}}function mergeSessionEntryIntoCombined(params){let{cfg,combined,entry,agentId,canonicalKey}=params,existing=combined[canonicalKey];existing&&(existing.updatedAt??0)>(entry.updatedAt??0)?combined[canonicalKey]={...entry,...existing,spawnedBy:canonicalizeSpawnedByForAgent(cfg,agentId,existing.spawnedBy??entry.spawnedBy)}:combined[canonicalKey]={...existing,...entry,spawnedBy:canonicalizeSpawnedByForAgent(cfg,agentId,entry.spawnedBy??existing?.spawnedBy)}}function loadCombinedSessionStoreForGateway(cfg){let storeConfig=cfg.session?.store;if(storeConfig&&!isStorePathTemplate(storeConfig)){let storePath=resolveStorePath(storeConfig),defaultAgentId=normalizeAgentId(resolveDefaultAgentId(cfg)),store=loadSessionStore(storePath),combined={};for(let[key,entry]of Object.entries(store))mergeSessionEntryIntoCombined({cfg,combined,entry,agentId:defaultAgentId,canonicalKey:canonicalizeSessionKeyForAgent(defaultAgentId,key)});return{storePath,store:combined}}let agentIds=listConfiguredAgentIds(cfg),combined={};for(let agentId of agentIds){let store=loadSessionStore(resolveStorePath(storeConfig,{agentId}));for(let[key,entry]of Object.entries(store))mergeSessionEntryIntoCombined({cfg,combined,entry,agentId,canonicalKey:canonicalizeSessionKeyForAgent(agentId,key)})}return{storePath:typeof storeConfig==`string`&&storeConfig.trim()?storeConfig.trim():`(multiple)`,store:combined}}function getSessionDefaults(cfg){let resolved=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),contextTokens=cfg.agents?.defaults?.contextTokens??lookupContextTokens(resolved.model)??DEFAULT_CONTEXT_TOKENS;return{modelProvider:resolved.provider??null,model:resolved.model??null,contextTokens:contextTokens??null}}function resolveSessionModelRef(cfg,entry,agentId){let resolved=agentId?resolveDefaultModelForAgent({cfg,agentId}):resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),provider=resolved.provider,model=resolved.model,runtimeModel=entry?.model?.trim(),runtimeProvider=entry?.modelProvider?.trim();if(runtimeModel){let parsedRuntime=parseModelRef(runtimeModel,runtimeProvider||provider||DEFAULT_PROVIDER);return parsedRuntime?(provider=parsedRuntime.provider,model=parsedRuntime.model):(provider=runtimeProvider||provider,model=runtimeModel),{provider,model}}let storedModelOverride=entry?.modelOverride?.trim();if(storedModelOverride){let overrideProvider=entry?.providerOverride?.trim()||provider||DEFAULT_PROVIDER,parsedOverride=parseModelRef(storedModelOverride,overrideProvider);parsedOverride?(provider=parsedOverride.provider,model=parsedOverride.model):(provider=overrideProvider,model=storedModelOverride)}return{provider,model}}function listSessionsFromStore(params){let{cfg,storePath,store,opts}=params,now=Date.now(),includeGlobal=opts.includeGlobal===!0,includeUnknown=opts.includeUnknown===!0,includeDerivedTitles=opts.includeDerivedTitles===!0,includeLastMessage=opts.includeLastMessage===!0,spawnedBy=typeof opts.spawnedBy==`string`?opts.spawnedBy:``,label=typeof opts.label==`string`?opts.label.trim():``,agentId=typeof opts.agentId==`string`?normalizeAgentId(opts.agentId):``,search=typeof opts.search==`string`?opts.search.trim().toLowerCase():``,activeMinutes=typeof opts.activeMinutes==`number`&&Number.isFinite(opts.activeMinutes)?Math.max(1,Math.floor(opts.activeMinutes)):void 0,sessions=Object.entries(store).filter(([key])=>{if(isCronRunSessionKey(key)||!includeGlobal&&key===`global`||!includeUnknown&&key===`unknown`)return!1;if(agentId){if(key===`global`||key===`unknown`)return!1;let parsed=parseAgentSessionKey(key);return parsed?normalizeAgentId(parsed.agentId)===agentId:!1}return!0}).filter(([key,entry])=>spawnedBy?key===`unknown`||key===`global`?!1:entry?.spawnedBy===spawnedBy:!0).filter(([,entry])=>label?entry?.label===label:!0).map(([key,entry])=>{let updatedAt=entry?.updatedAt??null,total=resolveFreshSessionTotalTokens(entry),totalTokensFresh=typeof entry?.totalTokens==`number`?entry?.totalTokensFresh!==!1:!1,parsed=parseGroupKey(key),channel=entry?.channel??parsed?.channel,subject=entry?.subject,groupChannel=entry?.groupChannel,space=entry?.space,id=parsed?.id,origin=entry?.origin,originLabel=origin?.label,displayName=entry?.displayName??(channel?buildGroupDisplayName({provider:channel,subject,groupChannel,space,id,key}):void 0)??entry?.label??originLabel,deliveryFields=normalizeSessionDeliveryFields(entry),resolvedModel=resolveSessionModelRef(cfg,entry,normalizeAgentId(parseAgentSessionKey(key)?.agentId??resolveDefaultAgentId(cfg))),modelProvider=resolvedModel.provider??DEFAULT_PROVIDER,model=resolvedModel.model??DEFAULT_MODEL;return{key,entry,kind:classifySessionKey(key,entry),label:entry?.label,displayName,channel,subject,groupChannel,space,chatType:entry?.chatType,origin,updatedAt,sessionId:entry?.sessionId,systemSent:entry?.systemSent,abortedLastRun:entry?.abortedLastRun,thinkingLevel:entry?.thinkingLevel,verboseLevel:entry?.verboseLevel,reasoningLevel:entry?.reasoningLevel,elevatedLevel:entry?.elevatedLevel,sendPolicy:entry?.sendPolicy,inputTokens:entry?.inputTokens,outputTokens:entry?.outputTokens,totalTokens:total,totalTokensFresh,responseUsage:entry?.responseUsage,modelProvider,model,contextTokens:entry?.contextTokens,deliveryContext:deliveryFields.deliveryContext,lastChannel:deliveryFields.lastChannel??entry?.lastChannel,lastTo:deliveryFields.lastTo??entry?.lastTo,lastAccountId:deliveryFields.lastAccountId??entry?.lastAccountId}}).toSorted((a,b)=>(b.updatedAt??0)-(a.updatedAt??0));if(search&&(sessions=sessions.filter(s=>[s.displayName,s.label,s.subject,s.sessionId,s.key].some(f=>typeof f==`string`&&f.toLowerCase().includes(search)))),activeMinutes!==void 0){let cutoff=now-activeMinutes*6e4;sessions=sessions.filter(s=>(s.updatedAt??0)>=cutoff)}if(typeof opts.limit==`number`&&Number.isFinite(opts.limit)){let limit=Math.max(1,Math.floor(opts.limit));sessions=sessions.slice(0,limit)}let finalSessions=sessions.map(s=>{let{entry,...rest}=s,derivedTitle,lastMessagePreview;if(entry?.sessionId&&(includeDerivedTitles||includeLastMessage)){let parsed=parseAgentSessionKey(s.key),agentId=parsed&&parsed.agentId?normalizeAgentId(parsed.agentId):resolveDefaultAgentId(cfg),fields=readSessionTitleFieldsFromTranscript(entry.sessionId,storePath,entry.sessionFile,agentId);includeDerivedTitles&&(derivedTitle=deriveSessionTitle(entry,fields.firstUserMessage)),includeLastMessage&&fields.lastMessagePreview&&(lastMessagePreview=fields.lastMessagePreview)}return{...rest,derivedTitle,lastMessagePreview}});return{ts:now,path:storePath,count:finalSessions.length,defaults:getSessionDefaults(cfg),sessions:finalSessions}}export{loadCombinedSessionStoreForGateway as a,resolveGatewaySessionStoreTarget as c,listSessionsFromStore as i,resolveSessionModelRef as l,classifySessionKey as n,loadSessionEntry as o,listAgentsForGateway as r,pruneLegacyStoreKeys as s,canonicalizeSpawnedByForAgent as t,lookupContextTokens as u};
1
+ import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import{H as resolveConfiguredModelRef,T as resolveBuilderForceAgentsAgentDir,U as resolveDefaultModelForAgent,_n as DEFAULT_PROVIDER,gn as DEFAULT_MODEL,hn as DEFAULT_CONTEXT_TOKENS,z as parseModelRef}from"./auth-profiles-pt7Tr4HA.js";import{C as parseAgentSessionKey,b as isCronRunSessionKey,d as normalizeAgentId,f as normalizeMainKey}from"./session-key-CksCYipj.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-CufEmNj_.js";import{r as loadConfig}from"./io-D9hC2aG0.js";import{a as ensureBuilderForceAgentsModelsJson,i as discoverModels,r as discoverAuthStorage}from"./model-discovery-D0i1JpiL.js";import{A as canonicalizeMainSessionAlias,N as resolveMainSessionKey,U as buildGroupDisplayName,a as loadSessionStore,j as resolveAgentMainSessionKey,k as resolveFreshSessionTotalTokens,nt as normalizeSessionDeliveryFields,y as readSessionTitleFieldsFromTranscript}from"./sessions-BA8Se_bT.js";import{c as resolveStorePath}from"./paths-ClsbsPQP.js";import path from"node:path";import fs from"node:fs";function applyDiscoveredContextWindows(params){for(let model of params.models){if(!model?.id)continue;let contextWindow=typeof model.contextWindow==`number`?Math.trunc(model.contextWindow):void 0;if(!contextWindow||contextWindow<=0)continue;let existing=params.cache.get(model.id);(existing===void 0||contextWindow<existing)&&params.cache.set(model.id,contextWindow)}}function applyConfiguredContextWindows(params){let providers=params.modelsConfig?.providers;if(!(!providers||typeof providers!=`object`)){for(let provider of Object.values(providers))if(Array.isArray(provider?.models))for(let model of provider.models){let modelId=typeof model?.id==`string`?model.id:void 0,contextWindow=typeof model?.contextWindow==`number`?model.contextWindow:void 0;!modelId||!contextWindow||contextWindow<=0||params.cache.set(modelId,contextWindow)}}}const MODEL_CACHE=new Map;(async()=>{let cfg;try{cfg=loadConfig()}catch{return}try{await ensureBuilderForceAgentsModelsJson(cfg)}catch{}try{let agentDir=resolveBuilderForceAgentsAgentDir(),modelRegistry=discoverModels(discoverAuthStorage(agentDir),agentDir);applyDiscoveredContextWindows({cache:MODEL_CACHE,models:typeof modelRegistry.getAvailable==`function`?modelRegistry.getAvailable():modelRegistry.getAll()})}catch{}applyConfiguredContextWindows({cache:MODEL_CACHE,modelsConfig:cfg.models})})().catch(()=>{});function lookupContextTokens(modelId){if(modelId)return MODEL_CACHE.get(modelId)}const AVATAR_DATA_RE=/^data:/i,AVATAR_HTTP_RE=/^https?:\/\//i,AVATAR_SCHEME_RE=/^[a-z][a-z0-9+.-]*:/i,WINDOWS_ABS_RE=/^[a-zA-Z]:[\\/]/,AVATAR_MIME_BY_EXT={".png":`image/png`,".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".webp":`image/webp`,".gif":`image/gif`,".svg":`image/svg+xml`,".bmp":`image/bmp`,".tif":`image/tiff`,".tiff":`image/tiff`};function resolveAvatarMime(filePath){return AVATAR_MIME_BY_EXT[path.extname(filePath).toLowerCase()]??`application/octet-stream`}function isWorkspaceRelativePath(value){return!(!value||value.startsWith(`~`)||AVATAR_SCHEME_RE.test(value)&&!WINDOWS_ABS_RE.test(value))}function resolveIdentityAvatarUrl(cfg,agentId,avatar){if(!avatar)return;let trimmed=avatar.trim();if(!trimmed)return;if(AVATAR_DATA_RE.test(trimmed)||AVATAR_HTTP_RE.test(trimmed))return trimmed;if(!isWorkspaceRelativePath(trimmed))return;let workspaceDir=resolveAgentWorkspaceDir(cfg,agentId),workspaceRoot=path.resolve(workspaceDir),resolved=path.resolve(workspaceRoot,trimmed),relative=path.relative(workspaceRoot,resolved);if(!(relative.startsWith(`..`)||path.isAbsolute(relative)))try{let stat=fs.statSync(resolved);if(!stat.isFile()||stat.size>2097152)return;let buffer=fs.readFileSync(resolved);return`data:${resolveAvatarMime(resolved)};base64,${buffer.toString(`base64`)}`}catch{return}}function formatSessionIdPrefix(sessionId,updatedAt){let prefix=sessionId.slice(0,8);return updatedAt&&updatedAt>0?`${prefix} (${new Date(updatedAt).toISOString().slice(0,10)})`:prefix}function truncateTitle(text,maxLen){if(text.length<=maxLen)return text;let cut=text.slice(0,maxLen-1),lastSpace=cut.lastIndexOf(` `);return lastSpace>maxLen*.6?cut.slice(0,lastSpace)+`…`:cut+`…`}function deriveSessionTitle(entry,firstUserMessage){if(entry){if(entry.displayName?.trim())return entry.displayName.trim();if(entry.subject?.trim())return entry.subject.trim();if(firstUserMessage?.trim())return truncateTitle(firstUserMessage.replace(/\s+/g,` `).trim(),60);if(entry.sessionId)return formatSessionIdPrefix(entry.sessionId,entry.updatedAt)}}function loadSessionEntry(sessionKey){let cfg=loadConfig(),sessionCfg=cfg.session,canonicalKey=resolveSessionStoreKey({cfg,sessionKey}),agentId=resolveSessionStoreAgentId(cfg,canonicalKey),storePath=resolveStorePath(sessionCfg?.store,{agentId}),store=loadSessionStore(storePath),match=findStoreMatch(store,canonicalKey,sessionKey.trim()),legacyKey=match?.key===canonicalKey?void 0:match?.key;return{cfg,storePath,store,entry:match?.entry,canonicalKey,legacyKey}}function findStoreMatch(store,...candidates){for(let candidate of candidates)if(candidate&&store[candidate])return{entry:store[candidate],key:candidate};let loweredSet=new Set(candidates.filter(Boolean).map(c=>c.toLowerCase()));for(let key of Object.keys(store))if(loweredSet.has(key.toLowerCase()))return{entry:store[key],key}}function findStoreKeysIgnoreCase(store,targetKey){let lowered=targetKey.toLowerCase(),matches=[];for(let key of Object.keys(store))key.toLowerCase()===lowered&&matches.push(key);return matches}function pruneLegacyStoreKeys(params){let keysToDelete=new Set;for(let candidate of params.candidates){let trimmed=String(candidate??``).trim();if(trimmed){trimmed!==params.canonicalKey&&keysToDelete.add(trimmed);for(let match of findStoreKeysIgnoreCase(params.store,trimmed))match!==params.canonicalKey&&keysToDelete.add(match)}}for(let key of keysToDelete)delete params.store[key]}function classifySessionKey(key,entry){return key===`global`?`global`:key===`unknown`?`unknown`:entry?.chatType===`group`||entry?.chatType===`channel`||key.includes(`:group:`)||key.includes(`:channel:`)?`group`:`direct`}function parseGroupKey(key){let parts=(parseAgentSessionKey(key)?.rest??key).split(`:`).filter(Boolean);if(parts.length>=3){let[channel,kind,...rest]=parts;if(kind===`group`||kind===`channel`)return{channel,kind,id:rest.join(`:`)}}return null}function isStorePathTemplate(store){return typeof store==`string`&&store.includes(`{agentId}`)}function listExistingAgentIdsFromDisk(){let root=resolveStateDir(),agentsDir=path.join(root,`agents`);try{return fs.readdirSync(agentsDir,{withFileTypes:!0}).filter(entry=>entry.isDirectory()).map(entry=>normalizeAgentId(entry.name)).filter(Boolean)}catch{return[]}}function listConfiguredAgentIds(cfg){let agents=cfg.agents?.list??[];if(agents.length>0){let ids=new Set;for(let entry of agents)entry?.id&&ids.add(normalizeAgentId(entry.id));let defaultId=normalizeAgentId(resolveDefaultAgentId(cfg));ids.add(defaultId);let sorted=Array.from(ids).filter(Boolean);return sorted.sort((a,b)=>a.localeCompare(b)),sorted.includes(defaultId)?[defaultId,...sorted.filter(id=>id!==defaultId)]:sorted}let ids=new Set,defaultId=normalizeAgentId(resolveDefaultAgentId(cfg));ids.add(defaultId);for(let id of listExistingAgentIdsFromDisk())ids.add(id);let sorted=Array.from(ids).filter(Boolean);return sorted.sort((a,b)=>a.localeCompare(b)),sorted.includes(defaultId)?[defaultId,...sorted.filter(id=>id!==defaultId)]:sorted}function listAgentsForGateway(cfg){let defaultId=normalizeAgentId(resolveDefaultAgentId(cfg)),mainKey=normalizeMainKey(cfg.session?.mainKey),scope=cfg.session?.scope??`per-sender`,configuredById=new Map;for(let entry of cfg.agents?.list??[]){if(!entry?.id)continue;let identity=entry.identity?{name:entry.identity.name?.trim()||void 0,theme:entry.identity.theme?.trim()||void 0,emoji:entry.identity.emoji?.trim()||void 0,avatar:entry.identity.avatar?.trim()||void 0,avatarUrl:resolveIdentityAvatarUrl(cfg,normalizeAgentId(entry.id),entry.identity.avatar?.trim())}:void 0;configuredById.set(normalizeAgentId(entry.id),{name:typeof entry.name==`string`&&entry.name.trim()?entry.name.trim():void 0,identity})}let explicitIds=new Set((cfg.agents?.list??[]).map(entry=>entry?.id?normalizeAgentId(entry.id):``).filter(Boolean)),allowedIds=explicitIds.size>0?new Set([...explicitIds,defaultId]):null,agentIds=listConfiguredAgentIds(cfg).filter(id=>allowedIds?allowedIds.has(id):!0);return mainKey&&!agentIds.includes(mainKey)&&(!allowedIds||allowedIds.has(mainKey))&&(agentIds=[...agentIds,mainKey]),{defaultId,mainKey,scope,agents:agentIds.map(id=>{let meta=configuredById.get(id);return{id,name:meta?.name,identity:meta?.identity}})}}function canonicalizeSessionKeyForAgent(agentId,key){let lowered=key.toLowerCase();return lowered===`global`||lowered===`unknown`||lowered.startsWith(`agent:`)?lowered:`agent:${normalizeAgentId(agentId)}:${lowered}`}function resolveDefaultStoreAgentId(cfg){return normalizeAgentId(resolveDefaultAgentId(cfg))}function resolveSessionStoreKey(params){let raw=params.sessionKey.trim();if(!raw)return raw;let rawLower=raw.toLowerCase();if(rawLower===`global`||rawLower===`unknown`)return rawLower;let parsed=parseAgentSessionKey(raw);if(parsed){let agentId=normalizeAgentId(parsed.agentId),lowered=raw.toLowerCase(),canonical=canonicalizeMainSessionAlias({cfg:params.cfg,agentId,sessionKey:lowered});return canonical===lowered?lowered:canonical}let lowered=raw.toLowerCase(),rawMainKey=normalizeMainKey(params.cfg.session?.mainKey);return lowered===`main`||lowered===rawMainKey?resolveMainSessionKey(params.cfg):canonicalizeSessionKeyForAgent(resolveDefaultStoreAgentId(params.cfg),lowered)}function resolveSessionStoreAgentId(cfg,canonicalKey){if(canonicalKey===`global`||canonicalKey===`unknown`)return resolveDefaultStoreAgentId(cfg);let parsed=parseAgentSessionKey(canonicalKey);return parsed?.agentId?normalizeAgentId(parsed.agentId):resolveDefaultStoreAgentId(cfg)}function canonicalizeSpawnedByForAgent(cfg,agentId,spawnedBy){let raw=spawnedBy?.trim();if(!raw)return;let lower=raw.toLowerCase();if(lower===`global`||lower===`unknown`)return lower;let result;result=raw.toLowerCase().startsWith(`agent:`)?raw.toLowerCase():`agent:${normalizeAgentId(agentId)}:${lower}`;let parsed=parseAgentSessionKey(result);return canonicalizeMainSessionAlias({cfg,agentId:parsed?.agentId?normalizeAgentId(parsed.agentId):agentId,sessionKey:result})}function resolveGatewaySessionStoreTarget(params){let key=params.key.trim(),canonicalKey=resolveSessionStoreKey({cfg:params.cfg,sessionKey:key}),agentId=resolveSessionStoreAgentId(params.cfg,canonicalKey),storeConfig=params.cfg.session?.store,storePath=resolveStorePath(storeConfig,{agentId});if(canonicalKey===`global`||canonicalKey===`unknown`)return{agentId,storePath,canonicalKey,storeKeys:key&&key!==canonicalKey?[canonicalKey,key]:[key]};let storeKeys=new Set;if(storeKeys.add(canonicalKey),key&&key!==canonicalKey&&storeKeys.add(key),params.scanLegacyKeys!==!1){let scanTargets=new Set(storeKeys);canonicalKey===resolveAgentMainSessionKey({cfg:params.cfg,agentId})&&scanTargets.add(`agent:${agentId}:main`);let store=params.store??loadSessionStore(storePath);for(let seed of scanTargets)for(let legacyKey of findStoreKeysIgnoreCase(store,seed))storeKeys.add(legacyKey)}return{agentId,storePath,canonicalKey,storeKeys:Array.from(storeKeys)}}function mergeSessionEntryIntoCombined(params){let{cfg,combined,entry,agentId,canonicalKey}=params,existing=combined[canonicalKey];existing&&(existing.updatedAt??0)>(entry.updatedAt??0)?combined[canonicalKey]={...entry,...existing,spawnedBy:canonicalizeSpawnedByForAgent(cfg,agentId,existing.spawnedBy??entry.spawnedBy)}:combined[canonicalKey]={...existing,...entry,spawnedBy:canonicalizeSpawnedByForAgent(cfg,agentId,entry.spawnedBy??existing?.spawnedBy)}}function loadCombinedSessionStoreForGateway(cfg){let storeConfig=cfg.session?.store;if(storeConfig&&!isStorePathTemplate(storeConfig)){let storePath=resolveStorePath(storeConfig),defaultAgentId=normalizeAgentId(resolveDefaultAgentId(cfg)),store=loadSessionStore(storePath),combined={};for(let[key,entry]of Object.entries(store))mergeSessionEntryIntoCombined({cfg,combined,entry,agentId:defaultAgentId,canonicalKey:canonicalizeSessionKeyForAgent(defaultAgentId,key)});return{storePath,store:combined}}let agentIds=listConfiguredAgentIds(cfg),combined={};for(let agentId of agentIds){let store=loadSessionStore(resolveStorePath(storeConfig,{agentId}));for(let[key,entry]of Object.entries(store))mergeSessionEntryIntoCombined({cfg,combined,entry,agentId,canonicalKey:canonicalizeSessionKeyForAgent(agentId,key)})}return{storePath:typeof storeConfig==`string`&&storeConfig.trim()?storeConfig.trim():`(multiple)`,store:combined}}function getSessionDefaults(cfg){let resolved=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),contextTokens=cfg.agents?.defaults?.contextTokens??lookupContextTokens(resolved.model)??DEFAULT_CONTEXT_TOKENS;return{modelProvider:resolved.provider??null,model:resolved.model??null,contextTokens:contextTokens??null}}function resolveSessionModelRef(cfg,entry,agentId){let resolved=agentId?resolveDefaultModelForAgent({cfg,agentId}):resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),provider=resolved.provider,model=resolved.model,runtimeModel=entry?.model?.trim(),runtimeProvider=entry?.modelProvider?.trim();if(runtimeModel){let parsedRuntime=parseModelRef(runtimeModel,runtimeProvider||provider||DEFAULT_PROVIDER);return parsedRuntime?(provider=parsedRuntime.provider,model=parsedRuntime.model):(provider=runtimeProvider||provider,model=runtimeModel),{provider,model}}let storedModelOverride=entry?.modelOverride?.trim();if(storedModelOverride){let overrideProvider=entry?.providerOverride?.trim()||provider||DEFAULT_PROVIDER,parsedOverride=parseModelRef(storedModelOverride,overrideProvider);parsedOverride?(provider=parsedOverride.provider,model=parsedOverride.model):(provider=overrideProvider,model=storedModelOverride)}return{provider,model}}function listSessionsFromStore(params){let{cfg,storePath,store,opts}=params,now=Date.now(),includeGlobal=opts.includeGlobal===!0,includeUnknown=opts.includeUnknown===!0,includeDerivedTitles=opts.includeDerivedTitles===!0,includeLastMessage=opts.includeLastMessage===!0,spawnedBy=typeof opts.spawnedBy==`string`?opts.spawnedBy:``,label=typeof opts.label==`string`?opts.label.trim():``,agentId=typeof opts.agentId==`string`?normalizeAgentId(opts.agentId):``,search=typeof opts.search==`string`?opts.search.trim().toLowerCase():``,activeMinutes=typeof opts.activeMinutes==`number`&&Number.isFinite(opts.activeMinutes)?Math.max(1,Math.floor(opts.activeMinutes)):void 0,sessions=Object.entries(store).filter(([key])=>{if(isCronRunSessionKey(key)||!includeGlobal&&key===`global`||!includeUnknown&&key===`unknown`)return!1;if(agentId){if(key===`global`||key===`unknown`)return!1;let parsed=parseAgentSessionKey(key);return parsed?normalizeAgentId(parsed.agentId)===agentId:!1}return!0}).filter(([key,entry])=>spawnedBy?key===`unknown`||key===`global`?!1:entry?.spawnedBy===spawnedBy:!0).filter(([,entry])=>label?entry?.label===label:!0).map(([key,entry])=>{let updatedAt=entry?.updatedAt??null,total=resolveFreshSessionTotalTokens(entry),totalTokensFresh=typeof entry?.totalTokens==`number`?entry?.totalTokensFresh!==!1:!1,parsed=parseGroupKey(key),channel=entry?.channel??parsed?.channel,subject=entry?.subject,groupChannel=entry?.groupChannel,space=entry?.space,id=parsed?.id,origin=entry?.origin,originLabel=origin?.label,displayName=entry?.displayName??(channel?buildGroupDisplayName({provider:channel,subject,groupChannel,space,id,key}):void 0)??entry?.label??originLabel,deliveryFields=normalizeSessionDeliveryFields(entry),resolvedModel=resolveSessionModelRef(cfg,entry,normalizeAgentId(parseAgentSessionKey(key)?.agentId??resolveDefaultAgentId(cfg))),modelProvider=resolvedModel.provider??DEFAULT_PROVIDER,model=resolvedModel.model??DEFAULT_MODEL;return{key,entry,kind:classifySessionKey(key,entry),label:entry?.label,displayName,channel,subject,groupChannel,space,chatType:entry?.chatType,origin,updatedAt,sessionId:entry?.sessionId,systemSent:entry?.systemSent,abortedLastRun:entry?.abortedLastRun,thinkingLevel:entry?.thinkingLevel,verboseLevel:entry?.verboseLevel,reasoningLevel:entry?.reasoningLevel,elevatedLevel:entry?.elevatedLevel,sendPolicy:entry?.sendPolicy,inputTokens:entry?.inputTokens,outputTokens:entry?.outputTokens,totalTokens:total,totalTokensFresh,responseUsage:entry?.responseUsage,modelProvider,model,contextTokens:entry?.contextTokens,deliveryContext:deliveryFields.deliveryContext,lastChannel:deliveryFields.lastChannel??entry?.lastChannel,lastTo:deliveryFields.lastTo??entry?.lastTo,lastAccountId:deliveryFields.lastAccountId??entry?.lastAccountId}}).toSorted((a,b)=>(b.updatedAt??0)-(a.updatedAt??0));if(search&&(sessions=sessions.filter(s=>[s.displayName,s.label,s.subject,s.sessionId,s.key].some(f=>typeof f==`string`&&f.toLowerCase().includes(search)))),activeMinutes!==void 0){let cutoff=now-activeMinutes*6e4;sessions=sessions.filter(s=>(s.updatedAt??0)>=cutoff)}if(typeof opts.limit==`number`&&Number.isFinite(opts.limit)){let limit=Math.max(1,Math.floor(opts.limit));sessions=sessions.slice(0,limit)}let finalSessions=sessions.map(s=>{let{entry,...rest}=s,derivedTitle,lastMessagePreview;if(entry?.sessionId&&(includeDerivedTitles||includeLastMessage)){let parsed=parseAgentSessionKey(s.key),agentId=parsed&&parsed.agentId?normalizeAgentId(parsed.agentId):resolveDefaultAgentId(cfg),fields=readSessionTitleFieldsFromTranscript(entry.sessionId,storePath,entry.sessionFile,agentId);includeDerivedTitles&&(derivedTitle=deriveSessionTitle(entry,fields.firstUserMessage)),includeLastMessage&&fields.lastMessagePreview&&(lastMessagePreview=fields.lastMessagePreview)}return{...rest,derivedTitle,lastMessagePreview}});return{ts:now,path:storePath,count:finalSessions.length,defaults:getSessionDefaults(cfg),sessions:finalSessions}}export{loadCombinedSessionStoreForGateway as a,resolveGatewaySessionStoreTarget as c,listSessionsFromStore as i,resolveSessionModelRef as l,classifySessionKey as n,loadSessionEntry as o,listAgentsForGateway as r,pruneLegacyStoreKeys as s,canonicalizeSpawnedByForAgent as t,lookupContextTokens as u};