@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,3 +1,3 @@
1
- import{M as logVerbose}from"./utils-DbaBVFaK.js";import{r as loadConfig}from"./io-3R_ZyUxB.js";import{d as resolveSlackAccount,m as resolveSlackBotToken}from"./plugins-D5zP6ENo.js";import{a as requireTargetKind,i as parseTargetPrefixes,n as ensureTargetId,r as parseTargetMention,t as buildMessagingTarget}from"./targets-egOap37j.js";import{c as resolveTextChunkLimit,i as chunkMarkdownTextWithMode,s as resolveChunkMode}from"./chunk-FCBlVOyo.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-P6uoUSFa.js";import{a as loadWebMedia,n as markdownToIR,t as chunkMarkdownIR}from"./ir-5BNoIXZm.js";import{t as renderMarkdownWithMarkers}from"./render-D1dVTEB1.js";import{WebClient}from"@slack/web-api";function parseSlackTarget(raw,options={}){let trimmed=raw.trim();return trimmed?parseTargetMention({raw:trimmed,mentionPattern:/^<@([A-Z0-9]+)>$/i,kind:`user`})||parseTargetPrefixes({raw:trimmed,prefixes:[{prefix:`user:`,kind:`user`},{prefix:`channel:`,kind:`channel`},{prefix:`slack:`,kind:`user`}]})||(trimmed.startsWith(`@`)?buildMessagingTarget(`user`,ensureTargetId({candidate:trimmed.slice(1).trim(),pattern:/^[A-Z0-9]+$/i,errorMessage:`Slack DMs require a user id (use user:<id> or <@id>)`}),trimmed):trimmed.startsWith(`#`)?buildMessagingTarget(`channel`,ensureTargetId({candidate:trimmed.slice(1).trim(),pattern:/^[A-Z0-9]+$/i,errorMessage:`Slack channels require a channel id (use channel:<id>)`}),trimmed):options.defaultKind?buildMessagingTarget(options.defaultKind,trimmed,trimmed):buildMessagingTarget(`channel`,trimmed,trimmed)):void 0}function resolveSlackChannelId(raw){return requireTargetKind({platform:`Slack`,target:parseSlackTarget(raw,{defaultKind:`channel`}),kind:`channel`})}function cleanCandidate(value){if(typeof value!=`string`)return;let normalized=value.replace(/\s+/g,` `).trim();return normalized.length>0?normalized:void 0}function readSectionText(block){return cleanCandidate(block.text?.text)}function readHeaderText(block){return cleanCandidate(block.text?.text)}function readImageText(block){return cleanCandidate(block.alt_text)??cleanCandidate(block.title?.text)}function readVideoText(block){return cleanCandidate(block.title?.text)??cleanCandidate(block.alt_text)}function readContextText(block){if(!Array.isArray(block.elements))return;let textParts=block.elements.map(element=>cleanCandidate(element.text)).filter(value=>!!value);return textParts.length>0?textParts.join(` `):void 0}function buildSlackBlocksFallbackText(blocks){for(let raw of blocks){let block=raw;switch(block.type){case`header`:{let text=readHeaderText(block);if(text)return text;break}case`section`:{let text=readSectionText(block);if(text)return text;break}case`image`:return readImageText(block)||`Shared an image`;case`video`:return readVideoText(block)||`Shared a video`;case`file`:return`Shared a file`;case`context`:{let text=readContextText(block);if(text)return text;break}default:break}}return`Shared a Block Kit message`}function parseBlocksJson(raw){try{return JSON.parse(raw)}catch{throw Error(`blocks must be valid JSON`)}}function assertBlocksArray(raw){if(!Array.isArray(raw))throw Error(`blocks must be an array`);if(raw.length===0)throw Error(`blocks must contain at least one block`);if(raw.length>50)throw Error(`blocks cannot exceed 50 items`);for(let block of raw){if(!block||typeof block!=`object`||Array.isArray(block))throw Error(`each block must be an object`);let type=block.type;if(typeof type!=`string`||type.trim().length===0)throw Error(`each block must include a non-empty string type`)}}function validateSlackBlocksArray(raw){return assertBlocksArray(raw),raw}function parseSlackBlocksInput(raw){if(raw!=null)return validateSlackBlocksArray(typeof raw==`string`?parseBlocksJson(raw):raw)}const SLACK_DEFAULT_RETRY_OPTIONS={retries:2,factor:2,minTimeout:500,maxTimeout:3e3,randomize:!0};function resolveSlackWebClientOptions(options={}){return{...options,retryConfig:options.retryConfig??SLACK_DEFAULT_RETRY_OPTIONS}}function createSlackWebClient(token,options={}){return new WebClient(token,resolveSlackWebClientOptions(options))}function escapeSlackMrkdwnSegment(text){return text.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}const SLACK_ANGLE_TOKEN_RE=/<[^>\n]+>/g;function isAllowedSlackAngleToken(token){if(!token.startsWith(`<`)||!token.endsWith(`>`))return!1;let inner=token.slice(1,-1);return inner.startsWith(`@`)||inner.startsWith(`#`)||inner.startsWith(`!`)||inner.startsWith(`mailto:`)||inner.startsWith(`tel:`)||inner.startsWith(`http://`)||inner.startsWith(`https://`)||inner.startsWith(`slack://`)}function escapeSlackMrkdwnContent(text){if(!text.includes(`&`)&&!text.includes(`<`)&&!text.includes(`>`))return text;SLACK_ANGLE_TOKEN_RE.lastIndex=0;let out=[],lastIndex=0;for(let match=SLACK_ANGLE_TOKEN_RE.exec(text);match;match=SLACK_ANGLE_TOKEN_RE.exec(text)){let matchIndex=match.index??0;out.push(escapeSlackMrkdwnSegment(text.slice(lastIndex,matchIndex)));let token=match[0]??``;out.push(isAllowedSlackAngleToken(token)?token:escapeSlackMrkdwnSegment(token)),lastIndex=matchIndex+token.length}return out.push(escapeSlackMrkdwnSegment(text.slice(lastIndex))),out.join(``)}function escapeSlackMrkdwnText(text){return!text.includes(`&`)&&!text.includes(`<`)&&!text.includes(`>`)?text:text.split(`
1
+ import{M as logVerbose}from"./utils-DbaBVFaK.js";import{r as loadConfig}from"./io-BLBq4T2o.js";import{d as resolveSlackAccount,m as resolveSlackBotToken}from"./plugins-D5zP6ENo.js";import{a as requireTargetKind,i as parseTargetPrefixes,n as ensureTargetId,r as parseTargetMention,t as buildMessagingTarget}from"./targets-egOap37j.js";import{c as resolveTextChunkLimit,i as chunkMarkdownTextWithMode,s as resolveChunkMode}from"./chunk-FCBlVOyo.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-P6uoUSFa.js";import{a as loadWebMedia,n as markdownToIR,t as chunkMarkdownIR}from"./ir-5BNoIXZm.js";import{t as renderMarkdownWithMarkers}from"./render-D1dVTEB1.js";import{WebClient}from"@slack/web-api";function parseSlackTarget(raw,options={}){let trimmed=raw.trim();return trimmed?parseTargetMention({raw:trimmed,mentionPattern:/^<@([A-Z0-9]+)>$/i,kind:`user`})||parseTargetPrefixes({raw:trimmed,prefixes:[{prefix:`user:`,kind:`user`},{prefix:`channel:`,kind:`channel`},{prefix:`slack:`,kind:`user`}]})||(trimmed.startsWith(`@`)?buildMessagingTarget(`user`,ensureTargetId({candidate:trimmed.slice(1).trim(),pattern:/^[A-Z0-9]+$/i,errorMessage:`Slack DMs require a user id (use user:<id> or <@id>)`}),trimmed):trimmed.startsWith(`#`)?buildMessagingTarget(`channel`,ensureTargetId({candidate:trimmed.slice(1).trim(),pattern:/^[A-Z0-9]+$/i,errorMessage:`Slack channels require a channel id (use channel:<id>)`}),trimmed):options.defaultKind?buildMessagingTarget(options.defaultKind,trimmed,trimmed):buildMessagingTarget(`channel`,trimmed,trimmed)):void 0}function resolveSlackChannelId(raw){return requireTargetKind({platform:`Slack`,target:parseSlackTarget(raw,{defaultKind:`channel`}),kind:`channel`})}function cleanCandidate(value){if(typeof value!=`string`)return;let normalized=value.replace(/\s+/g,` `).trim();return normalized.length>0?normalized:void 0}function readSectionText(block){return cleanCandidate(block.text?.text)}function readHeaderText(block){return cleanCandidate(block.text?.text)}function readImageText(block){return cleanCandidate(block.alt_text)??cleanCandidate(block.title?.text)}function readVideoText(block){return cleanCandidate(block.title?.text)??cleanCandidate(block.alt_text)}function readContextText(block){if(!Array.isArray(block.elements))return;let textParts=block.elements.map(element=>cleanCandidate(element.text)).filter(value=>!!value);return textParts.length>0?textParts.join(` `):void 0}function buildSlackBlocksFallbackText(blocks){for(let raw of blocks){let block=raw;switch(block.type){case`header`:{let text=readHeaderText(block);if(text)return text;break}case`section`:{let text=readSectionText(block);if(text)return text;break}case`image`:return readImageText(block)||`Shared an image`;case`video`:return readVideoText(block)||`Shared a video`;case`file`:return`Shared a file`;case`context`:{let text=readContextText(block);if(text)return text;break}default:break}}return`Shared a Block Kit message`}function parseBlocksJson(raw){try{return JSON.parse(raw)}catch{throw Error(`blocks must be valid JSON`)}}function assertBlocksArray(raw){if(!Array.isArray(raw))throw Error(`blocks must be an array`);if(raw.length===0)throw Error(`blocks must contain at least one block`);if(raw.length>50)throw Error(`blocks cannot exceed 50 items`);for(let block of raw){if(!block||typeof block!=`object`||Array.isArray(block))throw Error(`each block must be an object`);let type=block.type;if(typeof type!=`string`||type.trim().length===0)throw Error(`each block must include a non-empty string type`)}}function validateSlackBlocksArray(raw){return assertBlocksArray(raw),raw}function parseSlackBlocksInput(raw){if(raw!=null)return validateSlackBlocksArray(typeof raw==`string`?parseBlocksJson(raw):raw)}const SLACK_DEFAULT_RETRY_OPTIONS={retries:2,factor:2,minTimeout:500,maxTimeout:3e3,randomize:!0};function resolveSlackWebClientOptions(options={}){return{...options,retryConfig:options.retryConfig??SLACK_DEFAULT_RETRY_OPTIONS}}function createSlackWebClient(token,options={}){return new WebClient(token,resolveSlackWebClientOptions(options))}function escapeSlackMrkdwnSegment(text){return text.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}const SLACK_ANGLE_TOKEN_RE=/<[^>\n]+>/g;function isAllowedSlackAngleToken(token){if(!token.startsWith(`<`)||!token.endsWith(`>`))return!1;let inner=token.slice(1,-1);return inner.startsWith(`@`)||inner.startsWith(`#`)||inner.startsWith(`!`)||inner.startsWith(`mailto:`)||inner.startsWith(`tel:`)||inner.startsWith(`http://`)||inner.startsWith(`https://`)||inner.startsWith(`slack://`)}function escapeSlackMrkdwnContent(text){if(!text.includes(`&`)&&!text.includes(`<`)&&!text.includes(`>`))return text;SLACK_ANGLE_TOKEN_RE.lastIndex=0;let out=[],lastIndex=0;for(let match=SLACK_ANGLE_TOKEN_RE.exec(text);match;match=SLACK_ANGLE_TOKEN_RE.exec(text)){let matchIndex=match.index??0;out.push(escapeSlackMrkdwnSegment(text.slice(lastIndex,matchIndex)));let token=match[0]??``;out.push(isAllowedSlackAngleToken(token)?token:escapeSlackMrkdwnSegment(token)),lastIndex=matchIndex+token.length}return out.push(escapeSlackMrkdwnSegment(text.slice(lastIndex))),out.join(``)}function escapeSlackMrkdwnText(text){return!text.includes(`&`)&&!text.includes(`<`)&&!text.includes(`>`)?text:text.split(`
2
2
  `).map(line=>line.startsWith(`> `)?`> ${escapeSlackMrkdwnContent(line.slice(2))}`:escapeSlackMrkdwnContent(line)).join(`
3
3
  `)}function buildSlackLink(link,text){let href=link.href.trim();if(!href)return null;let trimmedLabel=text.slice(link.start,link.end).trim(),comparableHref=href.startsWith(`mailto:`)?href.slice(7):href;if(!(trimmedLabel.length>0&&trimmedLabel!==href&&trimmedLabel!==comparableHref))return null;let safeHref=escapeSlackMrkdwnSegment(href);return{start:link.start,end:link.end,open:`<${safeHref}|`,close:`>`}}function buildSlackRenderOptions(){return{styleMarkers:{bold:{open:`*`,close:`*`},italic:{open:`_`,close:`_`},strikethrough:{open:`~`,close:`~`},code:{open:"`",close:"`"},code_block:{open:"```\n",close:"```"}},escapeText:escapeSlackMrkdwnText,buildLink:buildSlackLink}}function markdownToSlackMrkdwnChunks(markdown,limit,options={}){let chunks=chunkMarkdownIR(markdownToIR(markdown??``,{linkify:!1,autolink:!1,headingStyle:`bold`,blockquotePrefix:`> `,tableMode:options.tableMode}),limit),renderOptions=buildSlackRenderOptions();return chunks.map(chunk=>renderMarkdownWithMarkers(chunk,renderOptions))}function hasCustomIdentity(identity){return!!(identity?.username||identity?.iconUrl||identity?.iconEmoji)}function isSlackCustomizeScopeError(err){if(!(err instanceof Error))return!1;let maybeData=err;return maybeData.data?.error?.toLowerCase()===`missing_scope`?(maybeData.data?.needed?.toLowerCase())?.includes(`chat:write.customize`)?!0:[...maybeData.data?.response_metadata?.scopes??[],...maybeData.data?.response_metadata?.acceptedScopes??[]].map(scope=>scope.toLowerCase()).includes(`chat:write.customize`):!1}async function postSlackMessageBestEffort(params){let basePayload={channel:params.channelId,text:params.text,thread_ts:params.threadTs,...params.blocks?.length?{blocks:params.blocks}:{}};try{return params.identity?.iconUrl?await params.client.chat.postMessage({...basePayload,...params.identity.username?{username:params.identity.username}:{},icon_url:params.identity.iconUrl}):params.identity?.iconEmoji?await params.client.chat.postMessage({...basePayload,...params.identity.username?{username:params.identity.username}:{},icon_emoji:params.identity.iconEmoji}):await params.client.chat.postMessage({...basePayload,...params.identity?.username?{username:params.identity.username}:{}})}catch(err){if(!hasCustomIdentity(params.identity)||!isSlackCustomizeScopeError(err))throw err;return logVerbose(`slack send: missing chat:write.customize, retrying without custom identity`),params.client.chat.postMessage(basePayload)}}function resolveToken(params){let explicit=resolveSlackBotToken(params.explicit);if(explicit)return explicit;let fallback=resolveSlackBotToken(params.fallbackToken);if(!fallback)throw logVerbose(`slack send: missing bot token for account=${params.accountId} explicit=${!!params.explicit} source=${params.fallbackSource??`unknown`}`),Error(`Slack bot token missing for account "${params.accountId}" (set channels.slack.accounts.${params.accountId}.botToken or SLACK_BOT_TOKEN for default).`);return fallback}function parseRecipient(raw){let target=parseSlackTarget(raw);if(!target)throw Error(`Recipient is required for Slack sends`);return{kind:target.kind,id:target.id}}async function resolveChannelId(client,recipient){if(recipient.kind===`channel`)return{channelId:recipient.id};let channelId=(await client.conversations.open({users:recipient.id})).channel?.id;if(!channelId)throw Error(`Failed to open Slack DM channel`);return{channelId,isDm:!0}}async function uploadSlackFile(params){let{buffer,contentType:_contentType,fileName}=await loadWebMedia(params.mediaUrl,{maxBytes:params.maxBytes,localRoots:params.mediaLocalRoots}),basePayload={channel_id:params.channelId,file:buffer,filename:fileName,...params.caption?{initial_comment:params.caption}:{}},payload=params.threadTs?{...basePayload,thread_ts:params.threadTs}:basePayload,parsed=await params.client.files.uploadV2(payload);return parsed.files?.[0]?.id??parsed.file?.id??parsed.files?.[0]?.name??parsed.file?.name??`unknown`}async function sendMessageSlack(to,message,opts={}){let trimmedMessage=message?.trim()??``,blocks=opts.blocks==null?void 0:validateSlackBlocksArray(opts.blocks);if(!trimmedMessage&&!opts.mediaUrl&&!blocks)throw Error(`Slack send requires text, blocks, or media`);let cfg=loadConfig(),account=resolveSlackAccount({cfg,accountId:opts.accountId}),token=resolveToken({explicit:opts.token,accountId:account.accountId,fallbackToken:account.botToken,fallbackSource:account.botTokenSource}),client=opts.client??createSlackWebClient(token),{channelId}=await resolveChannelId(client,parseRecipient(to));if(blocks){if(opts.mediaUrl)throw Error(`Slack send does not support blocks with mediaUrl`);return{messageId:(await postSlackMessageBestEffort({client,channelId,text:trimmedMessage||buildSlackBlocksFallbackText(blocks),threadTs:opts.threadTs,identity:opts.identity,blocks})).ts??`unknown`,channelId}}let textLimit=resolveTextChunkLimit(cfg,`slack`,account.accountId),chunkLimit=Math.min(textLimit,4e3),tableMode=resolveMarkdownTableMode({cfg,channel:`slack`,accountId:account.accountId}),chunkMode=resolveChunkMode(cfg,`slack`,account.accountId),chunks=(chunkMode===`newline`?chunkMarkdownTextWithMode(trimmedMessage,chunkLimit,chunkMode):[trimmedMessage]).flatMap(markdown=>markdownToSlackMrkdwnChunks(markdown,chunkLimit,{tableMode}));!chunks.length&&trimmedMessage&&chunks.push(trimmedMessage);let mediaMaxBytes=typeof account.config.mediaMaxMb==`number`?account.config.mediaMaxMb*1024*1024:void 0,lastMessageId=``;if(opts.mediaUrl){let[firstChunk,...rest]=chunks;lastMessageId=await uploadSlackFile({client,channelId,mediaUrl:opts.mediaUrl,mediaLocalRoots:opts.mediaLocalRoots,caption:firstChunk,threadTs:opts.threadTs,maxBytes:mediaMaxBytes});for(let chunk of rest)lastMessageId=(await postSlackMessageBestEffort({client,channelId,text:chunk,threadTs:opts.threadTs,identity:opts.identity})).ts??lastMessageId}else for(let chunk of chunks.length?chunks:[``])lastMessageId=(await postSlackMessageBestEffort({client,channelId,text:chunk,threadTs:opts.threadTs,identity:opts.identity})).ts??lastMessageId;return{messageId:lastMessageId||`unknown`,channelId}}export{parseSlackBlocksInput as a,parseSlackTarget as c,resolveSlackWebClientOptions as i,resolveSlackChannelId as l,markdownToSlackMrkdwnChunks as n,validateSlackBlocksArray as o,createSlackWebClient as r,buildSlackBlocksFallbackText as s,sendMessageSlack as t};
@@ -1,3 +1,3 @@
1
- import{j as logVerbose}from"./utils-BP60e80M.js";import{r as loadConfig}from"./io-CohJffHG.js";import{d as resolveSlackAccount,m as resolveSlackBotToken}from"./plugins-1Mn6RiNf.js";import{a as requireTargetKind,i as parseTargetPrefixes,n as ensureTargetId,r as parseTargetMention,t as buildMessagingTarget}from"./targets-B3ZhESDN.js";import{c as resolveTextChunkLimit,i as chunkMarkdownTextWithMode,s as resolveChunkMode}from"./chunk-Dly7lM4r.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-B1Rx8hv6.js";import{a as loadWebMedia,n as markdownToIR,t as chunkMarkdownIR}from"./ir-CSdQJPqu.js";import{t as renderMarkdownWithMarkers}from"./render-DlHYsbvQ.js";import{WebClient}from"@slack/web-api";function parseSlackTarget(raw,options={}){let trimmed=raw.trim();return trimmed?parseTargetMention({raw:trimmed,mentionPattern:/^<@([A-Z0-9]+)>$/i,kind:`user`})||parseTargetPrefixes({raw:trimmed,prefixes:[{prefix:`user:`,kind:`user`},{prefix:`channel:`,kind:`channel`},{prefix:`slack:`,kind:`user`}]})||(trimmed.startsWith(`@`)?buildMessagingTarget(`user`,ensureTargetId({candidate:trimmed.slice(1).trim(),pattern:/^[A-Z0-9]+$/i,errorMessage:`Slack DMs require a user id (use user:<id> or <@id>)`}),trimmed):trimmed.startsWith(`#`)?buildMessagingTarget(`channel`,ensureTargetId({candidate:trimmed.slice(1).trim(),pattern:/^[A-Z0-9]+$/i,errorMessage:`Slack channels require a channel id (use channel:<id>)`}),trimmed):options.defaultKind?buildMessagingTarget(options.defaultKind,trimmed,trimmed):buildMessagingTarget(`channel`,trimmed,trimmed)):void 0}function resolveSlackChannelId(raw){return requireTargetKind({platform:`Slack`,target:parseSlackTarget(raw,{defaultKind:`channel`}),kind:`channel`})}function cleanCandidate(value){if(typeof value!=`string`)return;let normalized=value.replace(/\s+/g,` `).trim();return normalized.length>0?normalized:void 0}function readSectionText(block){return cleanCandidate(block.text?.text)}function readHeaderText(block){return cleanCandidate(block.text?.text)}function readImageText(block){return cleanCandidate(block.alt_text)??cleanCandidate(block.title?.text)}function readVideoText(block){return cleanCandidate(block.title?.text)??cleanCandidate(block.alt_text)}function readContextText(block){if(!Array.isArray(block.elements))return;let textParts=block.elements.map(element=>cleanCandidate(element.text)).filter(value=>!!value);return textParts.length>0?textParts.join(` `):void 0}function buildSlackBlocksFallbackText(blocks){for(let raw of blocks){let block=raw;switch(block.type){case`header`:{let text=readHeaderText(block);if(text)return text;break}case`section`:{let text=readSectionText(block);if(text)return text;break}case`image`:return readImageText(block)||`Shared an image`;case`video`:return readVideoText(block)||`Shared a video`;case`file`:return`Shared a file`;case`context`:{let text=readContextText(block);if(text)return text;break}default:break}}return`Shared a Block Kit message`}function parseBlocksJson(raw){try{return JSON.parse(raw)}catch{throw Error(`blocks must be valid JSON`)}}function assertBlocksArray(raw){if(!Array.isArray(raw))throw Error(`blocks must be an array`);if(raw.length===0)throw Error(`blocks must contain at least one block`);if(raw.length>50)throw Error(`blocks cannot exceed 50 items`);for(let block of raw){if(!block||typeof block!=`object`||Array.isArray(block))throw Error(`each block must be an object`);let type=block.type;if(typeof type!=`string`||type.trim().length===0)throw Error(`each block must include a non-empty string type`)}}function validateSlackBlocksArray(raw){return assertBlocksArray(raw),raw}function parseSlackBlocksInput(raw){if(raw!=null)return validateSlackBlocksArray(typeof raw==`string`?parseBlocksJson(raw):raw)}const SLACK_DEFAULT_RETRY_OPTIONS={retries:2,factor:2,minTimeout:500,maxTimeout:3e3,randomize:!0};function resolveSlackWebClientOptions(options={}){return{...options,retryConfig:options.retryConfig??SLACK_DEFAULT_RETRY_OPTIONS}}function createSlackWebClient(token,options={}){return new WebClient(token,resolveSlackWebClientOptions(options))}function escapeSlackMrkdwnSegment(text){return text.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}const SLACK_ANGLE_TOKEN_RE=/<[^>\n]+>/g;function isAllowedSlackAngleToken(token){if(!token.startsWith(`<`)||!token.endsWith(`>`))return!1;let inner=token.slice(1,-1);return inner.startsWith(`@`)||inner.startsWith(`#`)||inner.startsWith(`!`)||inner.startsWith(`mailto:`)||inner.startsWith(`tel:`)||inner.startsWith(`http://`)||inner.startsWith(`https://`)||inner.startsWith(`slack://`)}function escapeSlackMrkdwnContent(text){if(!text.includes(`&`)&&!text.includes(`<`)&&!text.includes(`>`))return text;SLACK_ANGLE_TOKEN_RE.lastIndex=0;let out=[],lastIndex=0;for(let match=SLACK_ANGLE_TOKEN_RE.exec(text);match;match=SLACK_ANGLE_TOKEN_RE.exec(text)){let matchIndex=match.index??0;out.push(escapeSlackMrkdwnSegment(text.slice(lastIndex,matchIndex)));let token=match[0]??``;out.push(isAllowedSlackAngleToken(token)?token:escapeSlackMrkdwnSegment(token)),lastIndex=matchIndex+token.length}return out.push(escapeSlackMrkdwnSegment(text.slice(lastIndex))),out.join(``)}function escapeSlackMrkdwnText(text){return!text.includes(`&`)&&!text.includes(`<`)&&!text.includes(`>`)?text:text.split(`
1
+ import{j as logVerbose}from"./utils-BP60e80M.js";import{r as loadConfig}from"./io-D9hC2aG0.js";import{d as resolveSlackAccount,m as resolveSlackBotToken}from"./plugins-1Mn6RiNf.js";import{a as requireTargetKind,i as parseTargetPrefixes,n as ensureTargetId,r as parseTargetMention,t as buildMessagingTarget}from"./targets-B3ZhESDN.js";import{c as resolveTextChunkLimit,i as chunkMarkdownTextWithMode,s as resolveChunkMode}from"./chunk-Dly7lM4r.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-B1Rx8hv6.js";import{a as loadWebMedia,n as markdownToIR,t as chunkMarkdownIR}from"./ir-CSdQJPqu.js";import{t as renderMarkdownWithMarkers}from"./render-DlHYsbvQ.js";import{WebClient}from"@slack/web-api";function parseSlackTarget(raw,options={}){let trimmed=raw.trim();return trimmed?parseTargetMention({raw:trimmed,mentionPattern:/^<@([A-Z0-9]+)>$/i,kind:`user`})||parseTargetPrefixes({raw:trimmed,prefixes:[{prefix:`user:`,kind:`user`},{prefix:`channel:`,kind:`channel`},{prefix:`slack:`,kind:`user`}]})||(trimmed.startsWith(`@`)?buildMessagingTarget(`user`,ensureTargetId({candidate:trimmed.slice(1).trim(),pattern:/^[A-Z0-9]+$/i,errorMessage:`Slack DMs require a user id (use user:<id> or <@id>)`}),trimmed):trimmed.startsWith(`#`)?buildMessagingTarget(`channel`,ensureTargetId({candidate:trimmed.slice(1).trim(),pattern:/^[A-Z0-9]+$/i,errorMessage:`Slack channels require a channel id (use channel:<id>)`}),trimmed):options.defaultKind?buildMessagingTarget(options.defaultKind,trimmed,trimmed):buildMessagingTarget(`channel`,trimmed,trimmed)):void 0}function resolveSlackChannelId(raw){return requireTargetKind({platform:`Slack`,target:parseSlackTarget(raw,{defaultKind:`channel`}),kind:`channel`})}function cleanCandidate(value){if(typeof value!=`string`)return;let normalized=value.replace(/\s+/g,` `).trim();return normalized.length>0?normalized:void 0}function readSectionText(block){return cleanCandidate(block.text?.text)}function readHeaderText(block){return cleanCandidate(block.text?.text)}function readImageText(block){return cleanCandidate(block.alt_text)??cleanCandidate(block.title?.text)}function readVideoText(block){return cleanCandidate(block.title?.text)??cleanCandidate(block.alt_text)}function readContextText(block){if(!Array.isArray(block.elements))return;let textParts=block.elements.map(element=>cleanCandidate(element.text)).filter(value=>!!value);return textParts.length>0?textParts.join(` `):void 0}function buildSlackBlocksFallbackText(blocks){for(let raw of blocks){let block=raw;switch(block.type){case`header`:{let text=readHeaderText(block);if(text)return text;break}case`section`:{let text=readSectionText(block);if(text)return text;break}case`image`:return readImageText(block)||`Shared an image`;case`video`:return readVideoText(block)||`Shared a video`;case`file`:return`Shared a file`;case`context`:{let text=readContextText(block);if(text)return text;break}default:break}}return`Shared a Block Kit message`}function parseBlocksJson(raw){try{return JSON.parse(raw)}catch{throw Error(`blocks must be valid JSON`)}}function assertBlocksArray(raw){if(!Array.isArray(raw))throw Error(`blocks must be an array`);if(raw.length===0)throw Error(`blocks must contain at least one block`);if(raw.length>50)throw Error(`blocks cannot exceed 50 items`);for(let block of raw){if(!block||typeof block!=`object`||Array.isArray(block))throw Error(`each block must be an object`);let type=block.type;if(typeof type!=`string`||type.trim().length===0)throw Error(`each block must include a non-empty string type`)}}function validateSlackBlocksArray(raw){return assertBlocksArray(raw),raw}function parseSlackBlocksInput(raw){if(raw!=null)return validateSlackBlocksArray(typeof raw==`string`?parseBlocksJson(raw):raw)}const SLACK_DEFAULT_RETRY_OPTIONS={retries:2,factor:2,minTimeout:500,maxTimeout:3e3,randomize:!0};function resolveSlackWebClientOptions(options={}){return{...options,retryConfig:options.retryConfig??SLACK_DEFAULT_RETRY_OPTIONS}}function createSlackWebClient(token,options={}){return new WebClient(token,resolveSlackWebClientOptions(options))}function escapeSlackMrkdwnSegment(text){return text.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}const SLACK_ANGLE_TOKEN_RE=/<[^>\n]+>/g;function isAllowedSlackAngleToken(token){if(!token.startsWith(`<`)||!token.endsWith(`>`))return!1;let inner=token.slice(1,-1);return inner.startsWith(`@`)||inner.startsWith(`#`)||inner.startsWith(`!`)||inner.startsWith(`mailto:`)||inner.startsWith(`tel:`)||inner.startsWith(`http://`)||inner.startsWith(`https://`)||inner.startsWith(`slack://`)}function escapeSlackMrkdwnContent(text){if(!text.includes(`&`)&&!text.includes(`<`)&&!text.includes(`>`))return text;SLACK_ANGLE_TOKEN_RE.lastIndex=0;let out=[],lastIndex=0;for(let match=SLACK_ANGLE_TOKEN_RE.exec(text);match;match=SLACK_ANGLE_TOKEN_RE.exec(text)){let matchIndex=match.index??0;out.push(escapeSlackMrkdwnSegment(text.slice(lastIndex,matchIndex)));let token=match[0]??``;out.push(isAllowedSlackAngleToken(token)?token:escapeSlackMrkdwnSegment(token)),lastIndex=matchIndex+token.length}return out.push(escapeSlackMrkdwnSegment(text.slice(lastIndex))),out.join(``)}function escapeSlackMrkdwnText(text){return!text.includes(`&`)&&!text.includes(`<`)&&!text.includes(`>`)?text:text.split(`
2
2
  `).map(line=>line.startsWith(`> `)?`> ${escapeSlackMrkdwnContent(line.slice(2))}`:escapeSlackMrkdwnContent(line)).join(`
3
3
  `)}function buildSlackLink(link,text){let href=link.href.trim();if(!href)return null;let trimmedLabel=text.slice(link.start,link.end).trim(),comparableHref=href.startsWith(`mailto:`)?href.slice(7):href;if(!(trimmedLabel.length>0&&trimmedLabel!==href&&trimmedLabel!==comparableHref))return null;let safeHref=escapeSlackMrkdwnSegment(href);return{start:link.start,end:link.end,open:`<${safeHref}|`,close:`>`}}function buildSlackRenderOptions(){return{styleMarkers:{bold:{open:`*`,close:`*`},italic:{open:`_`,close:`_`},strikethrough:{open:`~`,close:`~`},code:{open:"`",close:"`"},code_block:{open:"```\n",close:"```"}},escapeText:escapeSlackMrkdwnText,buildLink:buildSlackLink}}function markdownToSlackMrkdwnChunks(markdown,limit,options={}){let chunks=chunkMarkdownIR(markdownToIR(markdown??``,{linkify:!1,autolink:!1,headingStyle:`bold`,blockquotePrefix:`> `,tableMode:options.tableMode}),limit),renderOptions=buildSlackRenderOptions();return chunks.map(chunk=>renderMarkdownWithMarkers(chunk,renderOptions))}function hasCustomIdentity(identity){return!!(identity?.username||identity?.iconUrl||identity?.iconEmoji)}function isSlackCustomizeScopeError(err){if(!(err instanceof Error))return!1;let maybeData=err;return maybeData.data?.error?.toLowerCase()===`missing_scope`?(maybeData.data?.needed?.toLowerCase())?.includes(`chat:write.customize`)?!0:[...maybeData.data?.response_metadata?.scopes??[],...maybeData.data?.response_metadata?.acceptedScopes??[]].map(scope=>scope.toLowerCase()).includes(`chat:write.customize`):!1}async function postSlackMessageBestEffort(params){let basePayload={channel:params.channelId,text:params.text,thread_ts:params.threadTs,...params.blocks?.length?{blocks:params.blocks}:{}};try{return params.identity?.iconUrl?await params.client.chat.postMessage({...basePayload,...params.identity.username?{username:params.identity.username}:{},icon_url:params.identity.iconUrl}):params.identity?.iconEmoji?await params.client.chat.postMessage({...basePayload,...params.identity.username?{username:params.identity.username}:{},icon_emoji:params.identity.iconEmoji}):await params.client.chat.postMessage({...basePayload,...params.identity?.username?{username:params.identity.username}:{}})}catch(err){if(!hasCustomIdentity(params.identity)||!isSlackCustomizeScopeError(err))throw err;return logVerbose(`slack send: missing chat:write.customize, retrying without custom identity`),params.client.chat.postMessage(basePayload)}}function resolveToken(params){let explicit=resolveSlackBotToken(params.explicit);if(explicit)return explicit;let fallback=resolveSlackBotToken(params.fallbackToken);if(!fallback)throw logVerbose(`slack send: missing bot token for account=${params.accountId} explicit=${!!params.explicit} source=${params.fallbackSource??`unknown`}`),Error(`Slack bot token missing for account "${params.accountId}" (set channels.slack.accounts.${params.accountId}.botToken or SLACK_BOT_TOKEN for default).`);return fallback}function parseRecipient(raw){let target=parseSlackTarget(raw);if(!target)throw Error(`Recipient is required for Slack sends`);return{kind:target.kind,id:target.id}}async function resolveChannelId(client,recipient){if(recipient.kind===`channel`)return{channelId:recipient.id};let channelId=(await client.conversations.open({users:recipient.id})).channel?.id;if(!channelId)throw Error(`Failed to open Slack DM channel`);return{channelId,isDm:!0}}async function uploadSlackFile(params){let{buffer,contentType:_contentType,fileName}=await loadWebMedia(params.mediaUrl,{maxBytes:params.maxBytes,localRoots:params.mediaLocalRoots}),basePayload={channel_id:params.channelId,file:buffer,filename:fileName,...params.caption?{initial_comment:params.caption}:{}},payload=params.threadTs?{...basePayload,thread_ts:params.threadTs}:basePayload,parsed=await params.client.files.uploadV2(payload);return parsed.files?.[0]?.id??parsed.file?.id??parsed.files?.[0]?.name??parsed.file?.name??`unknown`}async function sendMessageSlack(to,message,opts={}){let trimmedMessage=message?.trim()??``,blocks=opts.blocks==null?void 0:validateSlackBlocksArray(opts.blocks);if(!trimmedMessage&&!opts.mediaUrl&&!blocks)throw Error(`Slack send requires text, blocks, or media`);let cfg=loadConfig(),account=resolveSlackAccount({cfg,accountId:opts.accountId}),token=resolveToken({explicit:opts.token,accountId:account.accountId,fallbackToken:account.botToken,fallbackSource:account.botTokenSource}),client=opts.client??createSlackWebClient(token),{channelId}=await resolveChannelId(client,parseRecipient(to));if(blocks){if(opts.mediaUrl)throw Error(`Slack send does not support blocks with mediaUrl`);return{messageId:(await postSlackMessageBestEffort({client,channelId,text:trimmedMessage||buildSlackBlocksFallbackText(blocks),threadTs:opts.threadTs,identity:opts.identity,blocks})).ts??`unknown`,channelId}}let textLimit=resolveTextChunkLimit(cfg,`slack`,account.accountId),chunkLimit=Math.min(textLimit,4e3),tableMode=resolveMarkdownTableMode({cfg,channel:`slack`,accountId:account.accountId}),chunkMode=resolveChunkMode(cfg,`slack`,account.accountId),chunks=(chunkMode===`newline`?chunkMarkdownTextWithMode(trimmedMessage,chunkLimit,chunkMode):[trimmedMessage]).flatMap(markdown=>markdownToSlackMrkdwnChunks(markdown,chunkLimit,{tableMode}));!chunks.length&&trimmedMessage&&chunks.push(trimmedMessage);let mediaMaxBytes=typeof account.config.mediaMaxMb==`number`?account.config.mediaMaxMb*1024*1024:void 0,lastMessageId=``;if(opts.mediaUrl){let[firstChunk,...rest]=chunks;lastMessageId=await uploadSlackFile({client,channelId,mediaUrl:opts.mediaUrl,mediaLocalRoots:opts.mediaLocalRoots,caption:firstChunk,threadTs:opts.threadTs,maxBytes:mediaMaxBytes});for(let chunk of rest)lastMessageId=(await postSlackMessageBestEffort({client,channelId,text:chunk,threadTs:opts.threadTs,identity:opts.identity})).ts??lastMessageId}else for(let chunk of chunks.length?chunks:[``])lastMessageId=(await postSlackMessageBestEffort({client,channelId,text:chunk,threadTs:opts.threadTs,identity:opts.identity})).ts??lastMessageId;return{messageId:lastMessageId||`unknown`,channelId}}export{parseSlackBlocksInput as a,parseSlackTarget as c,resolveSlackWebClientOptions as i,resolveSlackChannelId as l,markdownToSlackMrkdwnChunks as n,validateSlackBlocksArray as o,createSlackWebClient as r,buildSlackBlocksFallbackText as s,sendMessageSlack as t};
@@ -1,4 +1,4 @@
1
- import{t as normalizeBaseUrl$1}from"./normalize-base-url-DmugqkQ6.js";import{r as loadConfig}from"./io-3R_ZyUxB.js";import{v as mediaKindFromMime}from"./image-ops-C8IUQKjn.js";import{n as resolveSignalAccount}from"./accounts-BLueHgKj.js";import{n as fetchWithTimeout}from"./fetch-timeout-BIqoSVfA.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-P6uoUSFa.js";import{n as markdownToIR,t as chunkMarkdownIR}from"./ir-5BNoIXZm.js";import{t as resolveOutboundAttachmentFromUrl}from"./outbound-attachment-C7wByQO5.js";import{t as resolveFetch}from"./fetch-DnVtDecb.js";import{randomUUID}from"node:crypto";function normalizeUrlForComparison(url){let normalized=url.toLowerCase();return normalized=normalized.replace(/^https?:\/\//,``),normalized=normalized.replace(/^www\./,``),normalized=normalizeBaseUrl$1(normalized),normalized}function mapStyle(style){switch(style){case`bold`:return`BOLD`;case`italic`:return`ITALIC`;case`strikethrough`:return`STRIKETHROUGH`;case`code`:case`code_block`:return`MONOSPACE`;case`spoiler`:return`SPOILER`;default:return null}}function mergeStyles(styles){let sorted=[...styles].toSorted((a,b)=>a.start===b.start?a.length===b.length?a.style.localeCompare(b.style):a.length-b.length:a.start-b.start),merged=[];for(let style of sorted){let prev=merged[merged.length-1];if(prev&&prev.style===style.style&&style.start<=prev.start+prev.length){let prevEnd=prev.start+prev.length;prev.length=Math.max(prevEnd,style.start+style.length)-prev.start;continue}merged.push({...style})}return merged}function clampStyles(styles,maxLength){let clamped=[];for(let style of styles){let start=Math.max(0,Math.min(style.start,maxLength)),length=Math.min(style.start+style.length,maxLength)-start;length>0&&clamped.push({start,length,style:style.style})}return clamped}function applyInsertionsToStyles(spans,insertions){if(insertions.length===0)return spans;let sortedInsertions=[...insertions].toSorted((a,b)=>a.pos-b.pos),updated=spans,cumulativeShift=0;for(let insertion of sortedInsertions){let insertionPos=insertion.pos+cumulativeShift,next=[];for(let span of updated){if(span.end<=insertionPos){next.push(span);continue}if(span.start>=insertionPos){next.push({start:span.start+insertion.length,end:span.end+insertion.length,style:span.style});continue}if(span.start<insertionPos&&span.end>insertionPos){insertionPos>span.start&&next.push({start:span.start,end:insertionPos,style:span.style});let shiftedStart=insertionPos+insertion.length,shiftedEnd=span.end+insertion.length;shiftedEnd>shiftedStart&&next.push({start:shiftedStart,end:shiftedEnd,style:span.style})}}updated=next,cumulativeShift+=insertion.length}return updated}function renderSignalText(ir){let text=ir.text??``;if(!text)return{text:``,styles:[]};let sortedLinks=[...ir.links].toSorted((a,b)=>a.start-b.start),out=``,cursor=0,insertions=[];for(let link of sortedLinks){if(link.start<cursor)continue;out+=text.slice(cursor,link.end);let href=link.href.trim(),trimmedLabel=text.slice(link.start,link.end).trim();if(href)if(!trimmedLabel)out+=href,insertions.push({pos:link.end,length:href.length});else{let normalizedLabel=normalizeUrlForComparison(trimmedLabel),comparableHref=href;if(href.startsWith(`mailto:`)&&(comparableHref=href.slice(7)),normalizedLabel!==normalizeUrlForComparison(comparableHref)){let addition=` (${href})`;out+=addition,insertions.push({pos:link.end,length:addition.length})}}cursor=link.end}out+=text.slice(cursor);let adjusted=applyInsertionsToStyles(ir.styles.map(span=>{let mapped=mapStyle(span.style);return mapped?{start:span.start,end:span.end,style:mapped}:null}).filter(span=>span!==null),insertions),trimmedText=out.trimEnd(),trimmedLength=trimmedText.length;return{text:trimmedText,styles:mergeStyles(clampStyles(adjusted.map(span=>({start:span.start,length:span.end-span.start,style:span.style})),trimmedLength))}}function markdownToSignalText(markdown,options={}){return renderSignalText(markdownToIR(markdown??``,{linkify:!0,enableSpoilers:!0,headingStyle:`bold`,blockquotePrefix:`> `,tableMode:options.tableMode}))}function sliceSignalStyles(styles,start,end){let sliced=[];for(let style of styles){let styleEnd=style.start+style.length,sliceStart=Math.max(style.start,start),sliceEnd=Math.min(styleEnd,end);sliceEnd>sliceStart&&sliced.push({start:sliceStart-start,length:sliceEnd-sliceStart,style:style.style})}return sliced}function splitSignalFormattedText(formatted,limit){let{text,styles}=formatted;if(text.length<=limit)return[formatted];let results=[],remaining=text,offset=0;for(;remaining.length>0;){if(remaining.length<=limit){let trimmed=remaining.trimEnd();trimmed.length>0&&results.push({text:trimmed,styles:mergeStyles(sliceSignalStyles(styles,offset,offset+trimmed.length))});break}let breakIdx=findBreakIndex(remaining.slice(0,limit));breakIdx<=0&&(breakIdx=limit);let chunk=remaining.slice(0,breakIdx).trimEnd();chunk.length>0&&results.push({text:chunk,styles:mergeStyles(sliceSignalStyles(styles,offset,offset+chunk.length))});let brokeOnWhitespace=breakIdx<remaining.length&&/\s/.test(remaining[breakIdx]),nextStart=Math.min(remaining.length,breakIdx+(brokeOnWhitespace?1:0));remaining=remaining.slice(nextStart).trimStart(),offset=text.length-remaining.length}return results}function findBreakIndex(window){let lastNewline=-1,lastWhitespace=-1,parenDepth=0;for(let i=0;i<window.length;i++){let char=window[i];if(char===`(`){parenDepth++;continue}if(char===`)`&&parenDepth>0){parenDepth--;continue}parenDepth===0&&(char===`
1
+ import{t as normalizeBaseUrl$1}from"./normalize-base-url-DmugqkQ6.js";import{r as loadConfig}from"./io-BLBq4T2o.js";import{v as mediaKindFromMime}from"./image-ops-C8IUQKjn.js";import{n as resolveSignalAccount}from"./accounts-BLueHgKj.js";import{n as fetchWithTimeout}from"./fetch-timeout-BIqoSVfA.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-P6uoUSFa.js";import{n as markdownToIR,t as chunkMarkdownIR}from"./ir-5BNoIXZm.js";import{t as resolveOutboundAttachmentFromUrl}from"./outbound-attachment-C7wByQO5.js";import{t as resolveFetch}from"./fetch-DnVtDecb.js";import{randomUUID}from"node:crypto";function normalizeUrlForComparison(url){let normalized=url.toLowerCase();return normalized=normalized.replace(/^https?:\/\//,``),normalized=normalized.replace(/^www\./,``),normalized=normalizeBaseUrl$1(normalized),normalized}function mapStyle(style){switch(style){case`bold`:return`BOLD`;case`italic`:return`ITALIC`;case`strikethrough`:return`STRIKETHROUGH`;case`code`:case`code_block`:return`MONOSPACE`;case`spoiler`:return`SPOILER`;default:return null}}function mergeStyles(styles){let sorted=[...styles].toSorted((a,b)=>a.start===b.start?a.length===b.length?a.style.localeCompare(b.style):a.length-b.length:a.start-b.start),merged=[];for(let style of sorted){let prev=merged[merged.length-1];if(prev&&prev.style===style.style&&style.start<=prev.start+prev.length){let prevEnd=prev.start+prev.length;prev.length=Math.max(prevEnd,style.start+style.length)-prev.start;continue}merged.push({...style})}return merged}function clampStyles(styles,maxLength){let clamped=[];for(let style of styles){let start=Math.max(0,Math.min(style.start,maxLength)),length=Math.min(style.start+style.length,maxLength)-start;length>0&&clamped.push({start,length,style:style.style})}return clamped}function applyInsertionsToStyles(spans,insertions){if(insertions.length===0)return spans;let sortedInsertions=[...insertions].toSorted((a,b)=>a.pos-b.pos),updated=spans,cumulativeShift=0;for(let insertion of sortedInsertions){let insertionPos=insertion.pos+cumulativeShift,next=[];for(let span of updated){if(span.end<=insertionPos){next.push(span);continue}if(span.start>=insertionPos){next.push({start:span.start+insertion.length,end:span.end+insertion.length,style:span.style});continue}if(span.start<insertionPos&&span.end>insertionPos){insertionPos>span.start&&next.push({start:span.start,end:insertionPos,style:span.style});let shiftedStart=insertionPos+insertion.length,shiftedEnd=span.end+insertion.length;shiftedEnd>shiftedStart&&next.push({start:shiftedStart,end:shiftedEnd,style:span.style})}}updated=next,cumulativeShift+=insertion.length}return updated}function renderSignalText(ir){let text=ir.text??``;if(!text)return{text:``,styles:[]};let sortedLinks=[...ir.links].toSorted((a,b)=>a.start-b.start),out=``,cursor=0,insertions=[];for(let link of sortedLinks){if(link.start<cursor)continue;out+=text.slice(cursor,link.end);let href=link.href.trim(),trimmedLabel=text.slice(link.start,link.end).trim();if(href)if(!trimmedLabel)out+=href,insertions.push({pos:link.end,length:href.length});else{let normalizedLabel=normalizeUrlForComparison(trimmedLabel),comparableHref=href;if(href.startsWith(`mailto:`)&&(comparableHref=href.slice(7)),normalizedLabel!==normalizeUrlForComparison(comparableHref)){let addition=` (${href})`;out+=addition,insertions.push({pos:link.end,length:addition.length})}}cursor=link.end}out+=text.slice(cursor);let adjusted=applyInsertionsToStyles(ir.styles.map(span=>{let mapped=mapStyle(span.style);return mapped?{start:span.start,end:span.end,style:mapped}:null}).filter(span=>span!==null),insertions),trimmedText=out.trimEnd(),trimmedLength=trimmedText.length;return{text:trimmedText,styles:mergeStyles(clampStyles(adjusted.map(span=>({start:span.start,length:span.end-span.start,style:span.style})),trimmedLength))}}function markdownToSignalText(markdown,options={}){return renderSignalText(markdownToIR(markdown??``,{linkify:!0,enableSpoilers:!0,headingStyle:`bold`,blockquotePrefix:`> `,tableMode:options.tableMode}))}function sliceSignalStyles(styles,start,end){let sliced=[];for(let style of styles){let styleEnd=style.start+style.length,sliceStart=Math.max(style.start,start),sliceEnd=Math.min(styleEnd,end);sliceEnd>sliceStart&&sliced.push({start:sliceStart-start,length:sliceEnd-sliceStart,style:style.style})}return sliced}function splitSignalFormattedText(formatted,limit){let{text,styles}=formatted;if(text.length<=limit)return[formatted];let results=[],remaining=text,offset=0;for(;remaining.length>0;){if(remaining.length<=limit){let trimmed=remaining.trimEnd();trimmed.length>0&&results.push({text:trimmed,styles:mergeStyles(sliceSignalStyles(styles,offset,offset+trimmed.length))});break}let breakIdx=findBreakIndex(remaining.slice(0,limit));breakIdx<=0&&(breakIdx=limit);let chunk=remaining.slice(0,breakIdx).trimEnd();chunk.length>0&&results.push({text:chunk,styles:mergeStyles(sliceSignalStyles(styles,offset,offset+chunk.length))});let brokeOnWhitespace=breakIdx<remaining.length&&/\s/.test(remaining[breakIdx]),nextStart=Math.min(remaining.length,breakIdx+(brokeOnWhitespace?1:0));remaining=remaining.slice(nextStart).trimStart(),offset=text.length-remaining.length}return results}function findBreakIndex(window){let lastNewline=-1,lastWhitespace=-1,parenDepth=0;for(let i=0;i<window.length;i++){let char=window[i];if(char===`(`){parenDepth++;continue}if(char===`)`&&parenDepth>0){parenDepth--;continue}parenDepth===0&&(char===`
2
2
  `?lastNewline=i:/\s/.test(char)&&(lastWhitespace=i))}return lastNewline>0?lastNewline:lastWhitespace}function markdownToSignalTextChunks(markdown,limit,options={}){let chunks=chunkMarkdownIR(markdownToIR(markdown??``,{linkify:!0,enableSpoilers:!0,headingStyle:`bold`,blockquotePrefix:`> `,tableMode:options.tableMode}),limit),results=[];for(let chunk of chunks){let rendered=renderSignalText(chunk);rendered.text.length>limit?results.push(...splitSignalFormattedText(rendered,limit)):results.push(rendered)}return results}const DEFAULT_TIMEOUT_MS=1e4;function normalizeBaseUrl(url){let trimmed=url.trim();if(!trimmed)throw Error(`Signal base URL is required`);return/^https?:\/\//i.test(trimmed)?normalizeBaseUrl$1(trimmed):normalizeBaseUrl$1(`http://${trimmed}`)}function getRequiredFetch(){let fetchImpl=resolveFetch();if(!fetchImpl)throw Error(`fetch is not available`);return fetchImpl}async function signalRpcRequest(method,params,opts){let baseUrl=normalizeBaseUrl(opts.baseUrl),id=randomUUID(),body=JSON.stringify({jsonrpc:`2.0`,method,params,id}),res=await fetchWithTimeout(`${baseUrl}/api/v1/rpc`,{method:`POST`,headers:{"Content-Type":`application/json`},body},opts.timeoutMs??DEFAULT_TIMEOUT_MS,getRequiredFetch());if(res.status===201)return;let text=await res.text();if(!text)throw Error(`Signal RPC empty response (status ${res.status})`);let parsed=JSON.parse(text);if(parsed.error){let code=parsed.error.code??`unknown`,msg=parsed.error.message??`Signal RPC error`;throw Error(`Signal RPC ${code}: ${msg}`)}return parsed.result}async function signalCheck(baseUrl,timeoutMs=DEFAULT_TIMEOUT_MS){let normalized=normalizeBaseUrl(baseUrl);try{let res=await fetchWithTimeout(`${normalized}/api/v1/check`,{method:`GET`},timeoutMs,getRequiredFetch());return res.ok?{ok:!0,status:res.status,error:null}:{ok:!1,status:res.status,error:`HTTP ${res.status}`}}catch(err){return{ok:!1,status:null,error:err instanceof Error?err.message:String(err)}}}async function streamSignalEvents(params){let baseUrl=normalizeBaseUrl(params.baseUrl),url=new URL(`${baseUrl}/api/v1/events`);params.account&&url.searchParams.set(`account`,params.account);let fetchImpl=resolveFetch();if(!fetchImpl)throw Error(`fetch is not available`);let res=await fetchImpl(url,{method:`GET`,headers:{Accept:`text/event-stream`},signal:params.abortSignal});if(!res.ok||!res.body)throw Error(`Signal SSE failed (${res.status} ${res.statusText||`error`})`);let reader=res.body.getReader(),decoder=new TextDecoder,buffer=``,currentEvent={},flushEvent=()=>{!currentEvent.data&&!currentEvent.event&&!currentEvent.id||(params.onEvent({event:currentEvent.event,data:currentEvent.data,id:currentEvent.id}),currentEvent={})};for(;;){let{value,done}=await reader.read();if(done)break;buffer+=decoder.decode(value,{stream:!0});let lineEnd=buffer.indexOf(`
3
3
  `);for(;lineEnd!==-1;){let line=buffer.slice(0,lineEnd);if(buffer=buffer.slice(lineEnd+1),line.endsWith(`\r`)&&(line=line.slice(0,-1)),line===``){flushEvent(),lineEnd=buffer.indexOf(`
4
4
  `);continue}if(line.startsWith(`:`)){lineEnd=buffer.indexOf(`
@@ -1 +1 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-C1VbcUOm.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./message-channel-z5YRpR2d.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import{t as sendMessageSlack}from"./send-BvroeIQ6.js";import"./image-ops-CotJhwRR.js";import"./ssrf-DJXLYZ0d.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";export{sendMessageSlack};
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-pt7Tr4HA.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import"./message-channel-z5YRpR2d.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import{t as sendMessageSlack}from"./send-B7H8Ae5j.js";import"./image-ops-CotJhwRR.js";import"./ssrf-DJXLYZ0d.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";export{sendMessageSlack};
@@ -1 +1 @@
1
- import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./fetch-guard-8mwt3-hm.js";import"./fetch-BuOLY9KP.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import{t as sendMessageSignal}from"./send-4d9NswaD.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";export{sendMessageSignal};
1
+ import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./fetch-guard-8mwt3-hm.js";import"./fetch-BuOLY9KP.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import{t as sendMessageSignal}from"./send-BP5osGBo.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";export{sendMessageSignal};
@@ -1 +1 @@
1
- import{M as logVerbose,O as danger}from"./utils-DbaBVFaK.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{t as isTruthyEnvValue}from"./env-BIdU5BAp.js";import{r as loadConfig}from"./io-3R_ZyUxB.js";import{n as redactSensitiveText}from"./redact-BHdfp2MZ.js";import{n as formatErrorMessage,r as formatUncaughtError,t as extractErrorCode}from"./errors-B1MIg3g-.js";import{h as normalizeMimeType,p as isGifMedia,u as getFileExtension,v as mediaKindFromMime}from"./image-ops-C8IUQKjn.js";import{l as resolveTelegramAccount}from"./plugins-D5zP6ENo.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-P6uoUSFa.js";import{a as loadWebMedia,n as markdownToIR,t as chunkMarkdownIR}from"./ir-5BNoIXZm.js";import{t as renderMarkdownWithMarkers}from"./render-D1dVTEB1.js";import{t as resolveFetch}from"./fetch-DnVtDecb.js";import{n as normalizePollInput}from"./polls-IFZVG0cW.js";import{i as createTelegramRetryRunner,n as recordChannelActivity}from"./channel-activity-CCNDbdD3.js";import{i as readChannelAllowFromStore}from"./pairing-store-CbvMJhD3.js";import process$1 from"node:process";import*as net$1 from"node:net";import{ProxyAgent,fetch}from"undici";import{Bot,HttpError,InputFile}from"grammy";function stripTelegramInternalPrefixes(to){let trimmed=to.trim(),strippedTelegramPrefix=!1;for(;;){let next=/^(telegram|tg):/i.test(trimmed)?(strippedTelegramPrefix=!0,trimmed.replace(/^(telegram|tg):/i,``).trim()):strippedTelegramPrefix&&/^group:/i.test(trimmed)?trimmed.replace(/^group:/i,``).trim():trimmed;if(next===trimmed)return trimmed;trimmed=next}}function resolveTelegramChatType(chatId){let trimmed=chatId.trim();return trimmed&&/^-?\d+$/.test(trimmed)?trimmed.startsWith(`-`)?`group`:`direct`:`unknown`}function parseTelegramTarget(to){let normalized=stripTelegramInternalPrefixes(to),topicMatch=/^(.+?):topic:(\d+)$/.exec(normalized);if(topicMatch)return{chatId:topicMatch[1],messageThreadId:Number.parseInt(topicMatch[2],10),chatType:resolveTelegramChatType(topicMatch[1])};let colonMatch=/^(.+):(\d+)$/.exec(normalized);return colonMatch?{chatId:colonMatch[1],messageThreadId:Number.parseInt(colonMatch[2],10),chatType:resolveTelegramChatType(colonMatch[1])}:{chatId:normalized,chatType:resolveTelegramChatType(normalized)}}function resolveTelegramTargetChatType(target){return parseTelegramTarget(target).chatType}const TELEGRAM_VOICE_AUDIO_EXTENSIONS=new Set([`.oga`,`.ogg`,`.opus`,`.mp3`,`.m4a`]),TELEGRAM_VOICE_MIME_TYPES=new Set([`audio/ogg`,`audio/opus`,`audio/mpeg`,`audio/mp3`,`audio/mp4`,`audio/x-m4a`,`audio/m4a`]);function isTelegramVoiceCompatibleAudio(opts){let mime=normalizeMimeType(opts.contentType);if(mime&&TELEGRAM_VOICE_MIME_TYPES.has(mime))return!0;let fileName=opts.fileName?.trim();if(!fileName)return!1;let ext=getFileExtension(fileName);return ext?TELEGRAM_VOICE_AUDIO_EXTENSIONS.has(ext):!1}function isVoiceCompatibleAudio(opts){return isTelegramVoiceCompatibleAudio(opts)}function normalizeFlag(value){return value.trim().toLowerCase()}function parseEnvFlags(raw){if(!raw)return[];let trimmed=raw.trim();if(!trimmed)return[];let lowered=trimmed.toLowerCase();return[`0`,`false`,`off`,`none`].includes(lowered)?[]:[`1`,`true`,`all`,`*`].includes(lowered)?[`*`]:trimmed.split(/[,\s]+/).map(normalizeFlag).filter(Boolean)}function uniqueFlags(flags){let seen=new Set,out=[];for(let flag of flags){let normalized=normalizeFlag(flag);!normalized||seen.has(normalized)||(seen.add(normalized),out.push(normalized))}return out}function resolveDiagnosticFlags(cfg,env=process.env){let configFlags=Array.isArray(cfg?.diagnostics?.flags)?cfg?.diagnostics?.flags:[],envFlags=parseEnvFlags(env.BUILDERFORCE_AGENTS_DIAGNOSTICS);return uniqueFlags([...configFlags,...envFlags])}function matchesDiagnosticFlag(flag,enabledFlags){let target=normalizeFlag(flag);if(!target)return!1;for(let raw of enabledFlags){let enabled=normalizeFlag(raw);if(enabled){if(enabled===`*`||enabled===`all`)return!0;if(enabled.endsWith(`.*`)){let prefix=enabled.slice(0,-2);if(target===prefix||target.startsWith(`${prefix}.`))return!0}if(enabled.endsWith(`*`)){let prefix=enabled.slice(0,-1);if(target.startsWith(prefix))return!0}if(enabled===target)return!0}}return!1}function isDiagnosticFlagEnabled(flag,cfg,env=process.env){return matchesDiagnosticFlag(flag,resolveDiagnosticFlags(cfg,env))}const fallbackLogger=createSubsystemLogger(`telegram/api`);function resolveTelegramApiLogger(runtime,logger){return logger||(runtime?.error?runtime.error:message=>fallbackLogger.error(message))}async function withTelegramApiErrorLogging({operation,fn,runtime,logger,shouldLog}){try{return await fn()}catch(err){if(!shouldLog||shouldLog(err)){let errText=formatErrorMessage(err);resolveTelegramApiLogger(runtime,logger)(danger(`telegram ${operation} failed: ${errText}`))}throw err}}function resolveLocation(location){let source=location.source??(location.isLive?`live`:location.name||location.address?`place`:`pin`),isLive=!!(location.isLive??source===`live`);return{...location,source,isLive}}function formatAccuracy(accuracy){return Number.isFinite(accuracy)?` ±${Math.round(accuracy??0)}m`:``}function formatCoords(latitude,longitude){return`${latitude.toFixed(6)}, ${longitude.toFixed(6)}`}function formatLocationText(location){let resolved=resolveLocation(location),coords=formatCoords(resolved.latitude,resolved.longitude),accuracy=formatAccuracy(resolved.accuracy),caption=resolved.caption?.trim(),header=``;return header=resolved.source===`live`||resolved.isLive?`🛰 Live location: ${coords}${accuracy}`:resolved.name||resolved.address?`📍 ${[resolved.name,resolved.address].filter(Boolean).join(` — `)} (${coords}${accuracy})`:`📍 ${coords}${accuracy}`,caption?`${header}\n${caption}`:header}function toLocationContext(location){let resolved=resolveLocation(location);return{LocationLat:resolved.latitude,LocationLon:resolved.longitude,LocationAccuracy:resolved.accuracy,LocationName:resolved.name,LocationAddress:resolved.address,LocationSource:resolved.source,LocationIsLive:resolved.isLive}}const warnedInvalidEntries=new Set;function warnInvalidAllowFromEntries(entries){if(!process.env.VITEST)for(let entry of entries)warnedInvalidEntries.has(entry)||(warnedInvalidEntries.add(entry),console.warn([`[telegram] Invalid allowFrom entry:`,JSON.stringify(entry),`- allowFrom/groupAllowFrom authorization requires numeric Telegram sender IDs only.`,`If you had "@username" entries, re-run onboarding (it resolves @username to IDs) or replace them manually.`].join(` `)))}const normalizeAllowFrom=list=>{let entries=(list??[]).map(value=>String(value).trim()).filter(Boolean),hasWildcard=entries.includes(`*`),normalized=entries.filter(value=>value!==`*`).map(value=>value.replace(/^(telegram|tg):/i,``)),invalidEntries=normalized.filter(value=>!/^\d+$/.test(value));return invalidEntries.length>0&&warnInvalidAllowFromEntries([...new Set(invalidEntries)]),{entries:normalized.filter(value=>/^\d+$/.test(value)),hasWildcard,hasEntries:entries.length>0,invalidEntries}},normalizeAllowFromWithStore=params=>normalizeAllowFrom([...params.allowFrom??[],...params.storeAllowFrom??[]].map(value=>String(value).trim()).filter(Boolean)),firstDefined=(...values)=>{for(let value of values)if(value!==void 0)return value},isSenderAllowed=params=>{let{allow,senderId}=params;return!!(!allow.hasEntries||allow.hasWildcard||senderId&&allow.entries.includes(senderId))},resolveSenderAllowMatch=params=>{let{allow,senderId}=params;return allow.hasWildcard?{allowed:!0,matchKey:`*`,matchSource:`wildcard`}:allow.hasEntries&&senderId&&allow.entries.includes(senderId)?{allowed:!0,matchKey:senderId,matchSource:`id`}:{allowed:!1}};async function resolveTelegramGroupAllowFromContext(params){let resolvedThreadId=resolveTelegramForumThreadId({isForum:params.isForum,messageThreadId:params.messageThreadId}),storeAllowFrom=await readChannelAllowFromStore(`telegram`,process.env,params.accountId).catch(()=>[]),{groupConfig,topicConfig}=params.resolveTelegramGroupConfig(params.chatId,resolvedThreadId),groupAllowOverride=firstDefined(topicConfig?.allowFrom,groupConfig?.allowFrom);return{resolvedThreadId,storeAllowFrom,groupConfig,topicConfig,groupAllowOverride,effectiveGroupAllow:normalizeAllowFromWithStore({allowFrom:groupAllowOverride??params.groupAllowFrom,storeAllowFrom}),hasGroupAllowOverride:groupAllowOverride!==void 0}}function resolveTelegramForumThreadId(params){if(params.isForum)return params.messageThreadId==null?1:params.messageThreadId}function resolveTelegramThreadSpec(params){return params.isGroup?{id:resolveTelegramForumThreadId({isForum:params.isForum,messageThreadId:params.messageThreadId}),scope:params.isForum?`forum`:`none`}:params.messageThreadId==null?{scope:`dm`}:{id:params.messageThreadId,scope:`dm`}}function buildTelegramThreadParams(thread){if(thread?.id==null)return;let normalized=Math.trunc(thread.id);if(thread.scope===`dm`)return normalized>0?{message_thread_id:normalized}:void 0;if(normalized!==1)return{message_thread_id:normalized}}function buildTypingThreadParams(messageThreadId){if(messageThreadId!=null)return{message_thread_id:Math.trunc(messageThreadId)}}function resolveTelegramStreamMode(telegramCfg){let raw=telegramCfg?.streamMode?.trim().toLowerCase();return raw===`off`||raw===`partial`||raw===`block`?raw:`partial`}function buildTelegramGroupPeerId(chatId,messageThreadId){return messageThreadId==null?String(chatId):`${chatId}:topic:${messageThreadId}`}function buildTelegramGroupFrom(chatId,messageThreadId){return`telegram:group:${buildTelegramGroupPeerId(chatId,messageThreadId)}`}function buildTelegramParentPeer(params){if(!(!params.isGroup||params.resolvedThreadId==null))return{kind:`group`,id:String(params.chatId)}}function buildSenderName(msg){return[msg.from?.first_name,msg.from?.last_name].filter(Boolean).join(` `).trim()||msg.from?.username||void 0}function resolveTelegramMediaPlaceholder(msg){if(msg){if(msg.photo)return`<media:image>`;if(msg.video||msg.video_note)return`<media:video>`;if(msg.audio||msg.voice)return`<media:audio>`;if(msg.document)return`<media:document>`;if(msg.sticker)return`<media:sticker>`}}function buildSenderLabel(msg,senderId){let name=buildSenderName(msg),username=msg.from?.username?`@${msg.from.username}`:void 0,label=name;name&&username?label=`${name} (${username})`:!name&&username&&(label=username);let fallbackId=(senderId!=null&&`${senderId}`.trim()?`${senderId}`.trim():void 0)??(msg.from?.id==null?void 0:String(msg.from.id)),idPart=fallbackId?`id:${fallbackId}`:void 0;return label&&idPart?`${label} ${idPart}`:label||(idPart??`id:unknown`)}function buildGroupLabel(msg,chatId,messageThreadId){let title=msg.chat?.title,topicSuffix=messageThreadId==null?``:` topic:${messageThreadId}`;return title?`${title} id:${chatId}${topicSuffix}`:`group:${chatId}${topicSuffix}`}function hasBotMention(msg,botUsername){if((msg.text??msg.caption??``).toLowerCase().includes(`@${botUsername}`))return!0;let entities=msg.entities??msg.caption_entities??[];for(let ent of entities)if(ent.type===`mention`&&(msg.text??msg.caption??``).slice(ent.offset,ent.offset+ent.length).toLowerCase()===`@${botUsername}`)return!0;return!1}function expandTextLinks(text,entities){if(!text||!entities?.length)return text;let textLinks=entities.filter(entity=>entity.type===`text_link`&&!!entity.url).toSorted((a,b)=>b.offset-a.offset);if(textLinks.length===0)return text;let result=text;for(let entity of textLinks){let markdown=`[${text.slice(entity.offset,entity.offset+entity.length)}](${entity.url})`;result=result.slice(0,entity.offset)+markdown+result.slice(entity.offset+entity.length)}return result}function resolveTelegramReplyId(raw){if(!raw)return;let parsed=Number(raw);if(Number.isFinite(parsed))return parsed}function describeReplyTarget(msg){let reply=msg.reply_to_message,externalReply=msg.external_reply,quoteText=msg.quote?.text??externalReply?.quote?.text,body=``,kind=`reply`;typeof quoteText==`string`&&(body=quoteText.trim(),body&&(kind=`quote`));let replyLike=reply??externalReply;if(!body&&replyLike&&(body=(replyLike.text??replyLike.caption??``).trim(),!body&&(body=resolveTelegramMediaPlaceholder(replyLike)??``,!body))){let locationData=extractTelegramLocation(replyLike);locationData&&(body=formatLocationText(locationData))}if(!body)return null;let senderLabel=(replyLike?buildSenderName(replyLike):void 0)??`unknown sender`;return{id:replyLike?.message_id?String(replyLike.message_id):void 0,sender:senderLabel,body,kind}}function normalizeForwardedUserLabel(user){let name=[user.first_name,user.last_name].filter(Boolean).join(` `).trim(),username=user.username?.trim()||void 0,id=String(user.id);return{display:(name&&username?`${name} (@${username})`:name||(username?`@${username}`:void 0))||`user:${id}`,name:name||void 0,username,id}}function normalizeForwardedChatLabel(chat,fallbackKind){let title=chat.title?.trim()||void 0,username=chat.username?.trim()||void 0,id=String(chat.id);return{display:title||(username?`@${username}`:void 0)||`${fallbackKind}:${id}`,title,username,id}}function buildForwardedContextFromUser(params){let{display,name,username,id}=normalizeForwardedUserLabel(params.user);return display?{from:display,date:params.date,fromType:params.type,fromId:id,fromUsername:username,fromTitle:name}:null}function buildForwardedContextFromHiddenName(params){let trimmed=params.name?.trim();return trimmed?{from:trimmed,date:params.date,fromType:params.type,fromTitle:trimmed}:null}function buildForwardedContextFromChat(params){let fallbackKind=params.type===`channel`?`channel`:`chat`,{display,title,username,id}=normalizeForwardedChatLabel(params.chat,fallbackKind);if(!display)return null;let signature=params.signature?.trim()||void 0,from=signature?`${display} (${signature})`:display,chatType=params.chat.type?.trim()||void 0;return{from,date:params.date,fromType:params.type,fromId:id,fromUsername:username,fromTitle:title,fromSignature:signature,fromChatType:chatType,fromMessageId:params.messageId}}function resolveForwardOrigin(origin){switch(origin.type){case`user`:return buildForwardedContextFromUser({user:origin.sender_user,date:origin.date,type:`user`});case`hidden_user`:return buildForwardedContextFromHiddenName({name:origin.sender_user_name,date:origin.date,type:`hidden_user`});case`chat`:return buildForwardedContextFromChat({chat:origin.sender_chat,date:origin.date,type:`chat`,signature:origin.author_signature});case`channel`:return buildForwardedContextFromChat({chat:origin.chat,date:origin.date,type:`channel`,signature:origin.author_signature,messageId:origin.message_id});default:return null}}function normalizeForwardedContext(msg){return msg.forward_origin?resolveForwardOrigin(msg.forward_origin):null}function extractTelegramLocation(msg){let{venue,location}=msg;if(venue)return{latitude:venue.location.latitude,longitude:venue.location.longitude,accuracy:venue.location.horizontal_accuracy,name:venue.title,address:venue.address,source:`place`,isLive:!1};if(location){let isLive=typeof location.live_period==`number`&&location.live_period>0;return{latitude:location.latitude,longitude:location.longitude,accuracy:location.horizontal_accuracy,source:isLive?`live`:`pin`,isLive}}return null}function splitTelegramCaption(text){let trimmed=text?.trim()??``;return trimmed?trimmed.length>1024?{caption:void 0,followUpText:trimmed}:{caption:trimmed,followUpText:void 0}:{caption:void 0,followUpText:void 0}}const TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV=`BUILDERFORCE_AGENTS_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY`,TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV=`BUILDERFORCE_AGENTS_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY`;function resolveTelegramAutoSelectFamilyDecision(params){let env=params?.env??process$1.env,nodeMajor=typeof params?.nodeMajor==`number`?params.nodeMajor:Number(process$1.versions.node.split(`.`)[0]);return isTruthyEnvValue(env[TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV])?{value:!0,source:`env:${TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV}`}:isTruthyEnvValue(env[TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV])?{value:!1,source:`env:${TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV}`}:typeof params?.network?.autoSelectFamily==`boolean`?{value:params.network.autoSelectFamily,source:`config`}:Number.isFinite(nodeMajor)&&nodeMajor>=22?{value:!0,source:`default-node22`}:{value:null}}let appliedAutoSelectFamily=null;const log=createSubsystemLogger(`telegram/network`);function applyTelegramNetworkWorkarounds(network){let decision=resolveTelegramAutoSelectFamilyDecision({network});if(!(decision.value===null||decision.value===appliedAutoSelectFamily)&&(appliedAutoSelectFamily=decision.value,typeof net$1.setDefaultAutoSelectFamily==`function`))try{net$1.setDefaultAutoSelectFamily(decision.value);let label=decision.source?` (${decision.source})`:``;log.info(`telegram: autoSelectFamily=${decision.value}${label}`)}catch{}}function resolveTelegramFetch(proxyFetch,options){if(applyTelegramNetworkWorkarounds(options?.network),proxyFetch)return resolveFetch(proxyFetch);let fetchImpl=resolveFetch();if(!fetchImpl)throw Error(`fetch is not available; set channels.telegram.proxy in config`);return fetchImpl}function escapeHtml(text){return text.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}function escapeHtmlAttr(text){return escapeHtml(text).replace(/"/g,`&quot;`)}const FILE_EXTENSIONS_WITH_TLD=new Set([`md`,`go`,`py`,`pl`,`sh`,`am`,`at`,`be`,`cc`]);function isAutoLinkedFileRef(href,label){if(href.replace(/^https?:\/\//i,``)!==label)return!1;let dotIndex=label.lastIndexOf(`.`);if(dotIndex<1)return!1;let ext=label.slice(dotIndex+1).toLowerCase();if(!FILE_EXTENSIONS_WITH_TLD.has(ext))return!1;let segments=label.split(`/`);if(segments.length>1){for(let i=0;i<segments.length-1;i++)if(segments[i].includes(`.`))return!1}return!0}function buildTelegramLink(link,text){let href=link.href.trim();if(!href||link.start===link.end||isAutoLinkedFileRef(href,text.slice(link.start,link.end)))return null;let safeHref=escapeHtmlAttr(href);return{start:link.start,end:link.end,open:`<a href="${safeHref}">`,close:`</a>`}}function renderTelegramHtml(ir){return renderMarkdownWithMarkers(ir,{styleMarkers:{bold:{open:`<b>`,close:`</b>`},italic:{open:`<i>`,close:`</i>`},strikethrough:{open:`<s>`,close:`</s>`},code:{open:`<code>`,close:`</code>`},code_block:{open:`<pre><code>`,close:`</code></pre>`},spoiler:{open:`<tg-spoiler>`,close:`</tg-spoiler>`},blockquote:{open:`<blockquote>`,close:`</blockquote>`}},escapeText:escapeHtml,buildLink:buildTelegramLink})}function markdownToTelegramHtml(markdown,options={}){let html=renderTelegramHtml(markdownToIR(markdown??``,{linkify:!0,enableSpoilers:!0,headingStyle:`none`,blockquotePrefix:``,tableMode:options.tableMode}));return options.wrapFileRefs===!1?html:wrapFileReferencesInHtml(html)}function escapeRegex(str){return str.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}const FILE_EXTENSIONS_PATTERN=Array.from(FILE_EXTENSIONS_WITH_TLD).map(escapeRegex).join(`|`),AUTO_LINKED_ANCHOR_PATTERN=/<a\s+href="https?:\/\/([^"]+)"[^>]*>\1<\/a>/gi,FILE_REFERENCE_PATTERN=RegExp(`(^|[^a-zA-Z0-9_\\-/])([a-zA-Z0-9_.\\-./]+\\.(?:${FILE_EXTENSIONS_PATTERN}))(?=$|[^a-zA-Z0-9_\\-/])`,`gi`),ORPHANED_TLD_PATTERN=RegExp(`([^a-zA-Z0-9]|^)([A-Za-z]\\.(?:${FILE_EXTENSIONS_PATTERN}))(?=[^a-zA-Z0-9/]|$)`,`g`),HTML_TAG_PATTERN=/(<\/?)([a-zA-Z][a-zA-Z0-9-]*)\b[^>]*?>/gi;function wrapStandaloneFileRef(match,prefix,filename){return filename.startsWith(`//`)||/https?:\/\/$/i.test(prefix)?match:`${prefix}<code>${escapeHtml(filename)}</code>`}function wrapSegmentFileRefs(text,codeDepth,preDepth,anchorDepth){return!text||codeDepth>0||preDepth>0||anchorDepth>0?text:text.replace(FILE_REFERENCE_PATTERN,wrapStandaloneFileRef).replace(ORPHANED_TLD_PATTERN,(match,prefix,tld)=>prefix===`>`?match:`${prefix}<code>${escapeHtml(tld)}</code>`)}function wrapFileReferencesInHtml(html){AUTO_LINKED_ANCHOR_PATTERN.lastIndex=0;let deLinkified=html.replace(AUTO_LINKED_ANCHOR_PATTERN,(_match,label)=>isAutoLinkedFileRef(`http://${label}`,label)?`<code>${escapeHtml(label)}</code>`:_match),codeDepth=0,preDepth=0,anchorDepth=0,result=``,lastIndex=0;HTML_TAG_PATTERN.lastIndex=0;let match;for(;(match=HTML_TAG_PATTERN.exec(deLinkified))!==null;){let tagStart=match.index,tagEnd=HTML_TAG_PATTERN.lastIndex,isClosing=match[1]===`</`,tagName=match[2].toLowerCase(),textBefore=deLinkified.slice(lastIndex,tagStart);result+=wrapSegmentFileRefs(textBefore,codeDepth,preDepth,anchorDepth),tagName===`code`?codeDepth=isClosing?Math.max(0,codeDepth-1):codeDepth+1:tagName===`pre`?preDepth=isClosing?Math.max(0,preDepth-1):preDepth+1:tagName===`a`&&(anchorDepth=isClosing?Math.max(0,anchorDepth-1):anchorDepth+1),result+=deLinkified.slice(tagStart,tagEnd),lastIndex=tagEnd}let remainingText=deLinkified.slice(lastIndex);return result+=wrapSegmentFileRefs(remainingText,codeDepth,preDepth,anchorDepth),result}function renderTelegramHtmlText(text,options={}){return(options.textMode??`markdown`)===`html`?text:markdownToTelegramHtml(text,{tableMode:options.tableMode})}function markdownToTelegramChunks(markdown,limit,options={}){return chunkMarkdownIR(markdownToIR(markdown??``,{linkify:!0,enableSpoilers:!0,headingStyle:`none`,blockquotePrefix:``,tableMode:options.tableMode}),limit).map(chunk=>({html:wrapFileReferencesInHtml(renderTelegramHtml(chunk)),text:chunk.text}))}const RECOVERABLE_ERROR_CODES=new Set([`ECONNRESET`,`ECONNREFUSED`,`EPIPE`,`ETIMEDOUT`,`ESOCKETTIMEDOUT`,`ENETUNREACH`,`EHOSTUNREACH`,`ENOTFOUND`,`EAI_AGAIN`,`UND_ERR_CONNECT_TIMEOUT`,`UND_ERR_HEADERS_TIMEOUT`,`UND_ERR_BODY_TIMEOUT`,`UND_ERR_SOCKET`,`UND_ERR_ABORTED`,`ECONNABORTED`,`ERR_NETWORK`]),RECOVERABLE_ERROR_NAMES=new Set([`AbortError`,`TimeoutError`,`ConnectTimeoutError`,`HeadersTimeoutError`,`BodyTimeoutError`]),RECOVERABLE_MESSAGE_SNIPPETS=[`fetch failed`,`typeerror: fetch failed`,`undici`,`network error`,`network request`,`client network socket disconnected`,`socket hang up`,`getaddrinfo`,`timeout`,`timed out`];function normalizeCode(code){return code?.trim().toUpperCase()??``}function getErrorName(err){return!err||typeof err!=`object`?``:`name`in err?String(err.name):``}function getErrorCode(err){let direct=extractErrorCode(err);if(direct)return direct;if(!err||typeof err!=`object`)return;let errno=err.errno;if(typeof errno==`string`)return errno;if(typeof errno==`number`)return String(errno)}function collectErrorCandidates(err){let queue=[err],seen=new Set,candidates=[];for(;queue.length>0;){let current=queue.shift();if(!(current==null||seen.has(current))&&(seen.add(current),candidates.push(current),typeof current==`object`)){let cause=current.cause;cause&&!seen.has(cause)&&queue.push(cause);let reason=current.reason;reason&&!seen.has(reason)&&queue.push(reason);let errors=current.errors;if(Array.isArray(errors))for(let nested of errors)nested&&!seen.has(nested)&&queue.push(nested);if(getErrorName(current)===`HttpError`){let wrappedError=current.error;wrappedError&&!seen.has(wrappedError)&&queue.push(wrappedError)}}}return candidates}function isRecoverableTelegramNetworkError(err,options={}){if(!err)return!1;let allowMessageMatch=typeof options.allowMessageMatch==`boolean`?options.allowMessageMatch:options.context!==`send`;for(let candidate of collectErrorCandidates(err)){let code=normalizeCode(getErrorCode(candidate));if(code&&RECOVERABLE_ERROR_CODES.has(code))return!0;let name=getErrorName(candidate);if(name&&RECOVERABLE_ERROR_NAMES.has(name))return!0;if(allowMessageMatch){let message=formatErrorMessage(candidate).toLowerCase();if(message&&RECOVERABLE_MESSAGE_SNIPPETS.some(snippet=>message.includes(snippet)))return!0}}return!1}function makeProxyFetch(proxyUrl){let agent=new ProxyAgent(proxyUrl);return((input,init)=>fetch(input,{...init,dispatcher:agent}))}const sentMessages=new Map;function getChatKey(chatId){return String(chatId)}function cleanupExpired(entry){let now=Date.now();for(let[msgId,timestamp]of entry.timestamps)now-timestamp>864e5&&(entry.messageIds.delete(msgId),entry.timestamps.delete(msgId))}function recordSentMessage(chatId,messageId){let key=getChatKey(chatId),entry=sentMessages.get(key);entry||(entry={messageIds:new Set,timestamps:new Map},sentMessages.set(key,entry)),entry.messageIds.add(messageId),entry.timestamps.set(messageId,Date.now()),entry.messageIds.size>100&&cleanupExpired(entry)}function wasSentByBot(chatId,messageId){let key=getChatKey(chatId),entry=sentMessages.get(key);return entry?(cleanupExpired(entry),entry.messageIds.has(messageId)):!1}function resolveTelegramVoiceDecision(opts){return opts.wantsVoice?isTelegramVoiceCompatibleAudio(opts)?{useVoice:!0}:{useVoice:!1,reason:`media is ${opts.contentType??`unknown`} (${opts.fileName??`unknown`})`}:{useVoice:!1}}function resolveTelegramVoiceSend(opts){let decision=resolveTelegramVoiceDecision(opts);return decision.reason&&opts.logFallback&&opts.logFallback(`Telegram voice requested but ${decision.reason}; sending as audio file instead.`),{useVoice:decision.useVoice}}const PARSE_ERR_RE=/can't parse entities|parse entities|find end of the entity/i,THREAD_NOT_FOUND_RE=/400:\s*Bad Request:\s*message thread not found/i,MESSAGE_NOT_MODIFIED_RE=/400:\s*Bad Request:\s*message is not modified|MESSAGE_NOT_MODIFIED/i,CHAT_NOT_FOUND_RE=/400: Bad Request: chat not found/i,diagLogger=createSubsystemLogger(`telegram/diagnostic`);function createTelegramHttpLogger(cfg){return isDiagnosticFlagEnabled(`telegram.http`,cfg)?(label,err)=>{if(!(err instanceof HttpError))return;let detail=redactSensitiveText(formatUncaughtError(err.error??err));diagLogger.warn(`telegram http error (${label}): ${detail}`)}:()=>{}}function resolveTelegramClientOptions(account){let proxyUrl=account.config.proxy?.trim(),fetchImpl=resolveTelegramFetch(proxyUrl?makeProxyFetch(proxyUrl):void 0,{network:account.config.network}),timeoutSeconds=typeof account.config.timeoutSeconds==`number`&&Number.isFinite(account.config.timeoutSeconds)?Math.max(1,Math.floor(account.config.timeoutSeconds)):void 0;return fetchImpl||timeoutSeconds?{...fetchImpl?{fetch:fetchImpl}:{},...timeoutSeconds?{timeoutSeconds}:{}}:void 0}function resolveToken(explicit,params){if(explicit?.trim())return explicit.trim();if(!params.token)throw Error(`Telegram bot token missing for account "${params.accountId}" (set channels.telegram.accounts.${params.accountId}.botToken/tokenFile or TELEGRAM_BOT_TOKEN for default).`);return params.token.trim()}function normalizeChatId(to){let trimmed=to.trim();if(!trimmed)throw Error(`Recipient is required for Telegram sends`);let normalized=stripTelegramInternalPrefixes(trimmed),m=/^https?:\/\/t\.me\/([A-Za-z0-9_]+)$/i.exec(normalized)??/^t\.me\/([A-Za-z0-9_]+)$/i.exec(normalized);if(m?.[1]&&(normalized=`@${m[1]}`),!normalized)throw Error(`Recipient is required for Telegram sends`);return normalized.startsWith(`@`)||/^-?\d+$/.test(normalized)?normalized:/^[A-Za-z0-9_]{5,}$/i.test(normalized)?`@${normalized}`:normalized}function normalizeMessageId(raw){if(typeof raw==`number`&&Number.isFinite(raw))return Math.trunc(raw);if(typeof raw==`string`){let value=raw.trim();if(!value)throw Error(`Message id is required for Telegram actions`);let parsed=Number.parseInt(value,10);if(Number.isFinite(parsed))return parsed}throw Error(`Message id is required for Telegram actions`)}function isTelegramThreadNotFoundError(err){return THREAD_NOT_FOUND_RE.test(formatErrorMessage(err))}function isTelegramMessageNotModifiedError(err){return MESSAGE_NOT_MODIFIED_RE.test(formatErrorMessage(err))}function hasMessageThreadIdParam(params){if(!params)return!1;let value=params.message_thread_id;return typeof value==`number`?Number.isFinite(value):typeof value==`string`?value.trim().length>0:!1}function removeMessageThreadIdParam(params){if(!params||!hasMessageThreadIdParam(params))return params;let next={...params};return delete next.message_thread_id,Object.keys(next).length>0?next:void 0}function isTelegramHtmlParseError(err){return PARSE_ERR_RE.test(formatErrorMessage(err))}function buildTelegramThreadReplyParams(params){let messageThreadId=params.messageThreadId==null?params.targetMessageThreadId:params.messageThreadId,threadScope=params.chatType===`direct`?`dm`:`forum`,threadIdParams=buildTelegramThreadParams(messageThreadId==null?void 0:{id:messageThreadId,scope:threadScope}),threadParams=threadIdParams?{...threadIdParams}:{};if(params.replyToMessageId!=null){let replyToMessageId=Math.trunc(params.replyToMessageId);params.quoteText?.trim()?threadParams.reply_parameters={message_id:replyToMessageId,quote:params.quoteText.trim()}:threadParams.reply_to_message_id=replyToMessageId}return threadParams}async function withTelegramHtmlParseFallback(params){try{return await params.requestHtml(params.label)}catch(err){if(!isTelegramHtmlParseError(err))throw err;return params.verbose&&console.warn(`telegram ${params.label} failed with HTML parse error, retrying as plain text: ${formatErrorMessage(err)}`),await params.requestPlain(`${params.label}-plain`)}}function resolveTelegramApiContext(opts){let cfg=opts.cfg??loadConfig(),account=resolveTelegramAccount({cfg,accountId:opts.accountId}),token=resolveToken(opts.token,account),client=resolveTelegramClientOptions(account);return{cfg,account,api:opts.api??new Bot(token,client?{client}:void 0).api}}function createTelegramRequestWithDiag(params){let request=createTelegramRetryRunner({retry:params.retry,configRetry:params.account.config.retry,verbose:params.verbose,...params.shouldRetry?{shouldRetry:params.shouldRetry}:{}}),logHttpError=createTelegramHttpLogger(params.cfg);return(fn,label,options)=>{let runRequest=()=>request(fn,label);return(params.useApiErrorLogging===!1?runRequest():withTelegramApiErrorLogging({operation:label??`request`,fn:runRequest,...options?.shouldLog?{shouldLog:options.shouldLog}:{}})).catch(err=>{throw logHttpError(label??`request`,err),err})}}function wrapTelegramChatNotFoundError(err,params){return CHAT_NOT_FOUND_RE.test(formatErrorMessage(err))?Error([`Telegram send failed: chat not found (chat_id=${params.chatId}).`,`Likely: bot not started in DM, bot removed from group/channel, group migrated (new -100… id), or wrong bot token.`,`Input was: ${JSON.stringify(params.input)}.`].join(` `)):err}async function withTelegramThreadFallback(params,label,verbose,attempt){try{return await attempt(params,label)}catch(err){if(!hasMessageThreadIdParam(params)||!isTelegramThreadNotFoundError(err))throw err;return verbose&&console.warn(`telegram ${label} failed with message_thread_id, retrying without thread: ${formatErrorMessage(err)}`),await attempt(removeMessageThreadIdParam(params),`${label}-threadless`)}}function createRequestWithChatNotFound(params){return async(fn,label)=>params.requestWithDiag(fn,label).catch(err=>{throw wrapTelegramChatNotFoundError(err,{chatId:params.chatId,input:params.input})})}function buildInlineKeyboard(buttons){if(!buttons?.length)return;let rows=buttons.map(row=>row.filter(button=>button?.text&&button?.callback_data).map(button=>({text:button.text,callback_data:button.callback_data,...button.style?{style:button.style}:{}}))).filter(row=>row.length>0);if(rows.length!==0)return{inline_keyboard:rows}}async function sendMessageTelegram(to,text,opts={}){let{cfg,account,api}=resolveTelegramApiContext(opts),target=parseTelegramTarget(to),chatId=normalizeChatId(target.chatId),mediaUrl=opts.mediaUrl?.trim(),replyMarkup=buildInlineKeyboard(opts.buttons),threadParams=buildTelegramThreadReplyParams({targetMessageThreadId:target.messageThreadId,messageThreadId:opts.messageThreadId,chatType:target.chatType,replyToMessageId:opts.replyToMessageId,quoteText:opts.quoteText}),hasThreadParams=Object.keys(threadParams).length>0,requestWithChatNotFound=createRequestWithChatNotFound({requestWithDiag:createTelegramRequestWithDiag({cfg,account,retry:opts.retry,verbose:opts.verbose,shouldRetry:err=>isRecoverableTelegramNetworkError(err,{context:`send`})}),chatId,input:to}),textMode=opts.textMode??`markdown`,tableMode=resolveMarkdownTableMode({cfg,channel:`telegram`,accountId:account.accountId}),renderHtmlText=value=>renderTelegramHtmlText(value,{textMode,tableMode}),linkPreviewOptions=account.config.linkPreview??!0?void 0:{is_disabled:!0},sendTelegramText=async(rawText,params,fallbackText)=>await withTelegramThreadFallback(params,`message`,opts.verbose,async(effectiveParams,label)=>{let htmlText=renderHtmlText(rawText),baseParams=effectiveParams?{...effectiveParams}:{};linkPreviewOptions&&(baseParams.link_preview_options=linkPreviewOptions);let hasBaseParams=Object.keys(baseParams).length>0,sendParams={parse_mode:`HTML`,...baseParams,...opts.silent===!0?{disable_notification:!0}:{}};return await withTelegramHtmlParseFallback({label,verbose:opts.verbose,requestHtml:retryLabel=>requestWithChatNotFound(()=>api.sendMessage(chatId,htmlText,sendParams),retryLabel),requestPlain:retryLabel=>{let plainParams=hasBaseParams?baseParams:void 0;return requestWithChatNotFound(()=>plainParams?api.sendMessage(chatId,fallbackText??rawText,plainParams):api.sendMessage(chatId,fallbackText??rawText),retryLabel)}})});if(mediaUrl){let media=await loadWebMedia(mediaUrl,{maxBytes:opts.maxBytes,localRoots:opts.mediaLocalRoots}),kind=mediaKindFromMime(media.contentType??void 0),isGif=isGifMedia({contentType:media.contentType,fileName:media.fileName}),isVideoNote=kind===`video`&&opts.asVideoNote===!0,fileName=media.fileName??(isGif?`animation.gif`:inferFilename(kind))??`file`,file=new InputFile(media.buffer,fileName),caption,followUpText;if(isVideoNote)caption=void 0,followUpText=text.trim()?text:void 0;else{let split=splitTelegramCaption(text);caption=split.caption,followUpText=split.followUpText}let htmlCaption=caption?renderHtmlText(caption):void 0,needsSeparateText=!!followUpText,baseMediaParams={...hasThreadParams?threadParams:{},...!needsSeparateText&&replyMarkup?{reply_markup:replyMarkup}:{}},mediaParams={...htmlCaption?{caption:htmlCaption,parse_mode:`HTML`}:{},...baseMediaParams,...opts.silent===!0?{disable_notification:!0}:{}},sendMedia=async(label,sender)=>await withTelegramThreadFallback(mediaParams,label,opts.verbose,async(effectiveParams,retryLabel)=>requestWithChatNotFound(()=>sender(effectiveParams),retryLabel)),mediaSender=(()=>{if(isGif)return{label:`animation`,sender:effectiveParams=>api.sendAnimation(chatId,file,effectiveParams)};if(kind===`image`)return{label:`photo`,sender:effectiveParams=>api.sendPhoto(chatId,file,effectiveParams)};if(kind===`video`)return isVideoNote?{label:`video_note`,sender:effectiveParams=>api.sendVideoNote(chatId,file,effectiveParams)}:{label:`video`,sender:effectiveParams=>api.sendVideo(chatId,file,effectiveParams)};if(kind===`audio`){let{useVoice}=resolveTelegramVoiceSend({wantsVoice:opts.asVoice===!0,contentType:media.contentType,fileName,logFallback:logVerbose});return useVoice?{label:`voice`,sender:effectiveParams=>api.sendVoice(chatId,file,effectiveParams)}:{label:`audio`,sender:effectiveParams=>api.sendAudio(chatId,file,effectiveParams)}}return{label:`document`,sender:effectiveParams=>api.sendDocument(chatId,file,effectiveParams)}})(),result=await sendMedia(mediaSender.label,mediaSender.sender),mediaMessageId=String(result?.message_id??`unknown`),resolvedChatId=String(result?.chat?.id??chatId);if(result?.message_id&&recordSentMessage(chatId,result.message_id),recordChannelActivity({channel:`telegram`,accountId:account.accountId,direction:`outbound`}),needsSeparateText&&followUpText){let textParams=hasThreadParams||replyMarkup?{...threadParams,...replyMarkup?{reply_markup:replyMarkup}:{}}:void 0,textRes=await sendTelegramText(followUpText,textParams);return{messageId:String(textRes?.message_id??mediaMessageId),chatId:resolvedChatId}}return{messageId:mediaMessageId,chatId:resolvedChatId}}if(!text||!text.trim())throw Error(`Message must be non-empty for Telegram sends`);let res=await sendTelegramText(text,hasThreadParams||replyMarkup?{...threadParams,...replyMarkup?{reply_markup:replyMarkup}:{}}:void 0,opts.plainText),messageId=String(res?.message_id??`unknown`);return res?.message_id&&recordSentMessage(chatId,res.message_id),recordChannelActivity({channel:`telegram`,accountId:account.accountId,direction:`outbound`}),{messageId,chatId:String(res?.chat?.id??chatId)}}async function reactMessageTelegram(chatIdInput,messageIdInput,emoji,opts={}){let{cfg,account,api}=resolveTelegramApiContext(opts),chatId=normalizeChatId(String(chatIdInput)),messageId=normalizeMessageId(messageIdInput),requestWithDiag=createTelegramRequestWithDiag({cfg,account,retry:opts.retry,verbose:opts.verbose,shouldRetry:err=>isRecoverableTelegramNetworkError(err,{context:`send`})}),remove=opts.remove===!0,trimmedEmoji=emoji.trim(),reactions=remove||!trimmedEmoji?[]:[{type:`emoji`,emoji:trimmedEmoji}];if(typeof api.setMessageReaction!=`function`)throw Error(`Telegram reactions are unavailable in this bot API.`);try{await requestWithDiag(()=>api.setMessageReaction(chatId,messageId,reactions),`reaction`)}catch(err){let msg=err instanceof Error?err.message:String(err);if(/REACTION_INVALID/i.test(msg))return{ok:!1,warning:`Reaction unavailable: ${trimmedEmoji}`};throw err}return{ok:!0}}async function deleteMessageTelegram(chatIdInput,messageIdInput,opts={}){let{cfg,account,api}=resolveTelegramApiContext(opts),chatId=normalizeChatId(String(chatIdInput)),messageId=normalizeMessageId(messageIdInput);return await createTelegramRequestWithDiag({cfg,account,retry:opts.retry,verbose:opts.verbose,shouldRetry:err=>isRecoverableTelegramNetworkError(err,{context:`send`})})(()=>api.deleteMessage(chatId,messageId),`deleteMessage`),logVerbose(`[telegram] Deleted message ${messageId} from chat ${chatId}`),{ok:!0}}async function editMessageTelegram(chatIdInput,messageIdInput,text,opts={}){let{cfg,account,api}=resolveTelegramApiContext({...opts,cfg:opts.cfg}),chatId=normalizeChatId(String(chatIdInput)),messageId=normalizeMessageId(messageIdInput),requestWithDiag=createTelegramRequestWithDiag({cfg,account,retry:opts.retry,verbose:opts.verbose}),requestWithEditShouldLog=(fn,label,shouldLog)=>requestWithDiag(fn,label,shouldLog?{shouldLog}:void 0),htmlText=renderTelegramHtmlText(text,{textMode:opts.textMode??`markdown`,tableMode:resolveMarkdownTableMode({cfg,channel:`telegram`,accountId:account.accountId})}),shouldTouchButtons=opts.buttons!==void 0,builtKeyboard=shouldTouchButtons?buildInlineKeyboard(opts.buttons):void 0,replyMarkup=shouldTouchButtons?builtKeyboard??{inline_keyboard:[]}:void 0,editParams={parse_mode:`HTML`};opts.linkPreview===!1&&(editParams.link_preview_options={is_disabled:!0}),replyMarkup!==void 0&&(editParams.reply_markup=replyMarkup);let plainParams={};opts.linkPreview===!1&&(plainParams.link_preview_options={is_disabled:!0}),replyMarkup!==void 0&&(plainParams.reply_markup=replyMarkup);try{await withTelegramHtmlParseFallback({label:`editMessage`,verbose:opts.verbose,requestHtml:retryLabel=>requestWithEditShouldLog(()=>api.editMessageText(chatId,messageId,htmlText,editParams),retryLabel,err=>!isTelegramMessageNotModifiedError(err)),requestPlain:retryLabel=>requestWithEditShouldLog(()=>Object.keys(plainParams).length>0?api.editMessageText(chatId,messageId,text,plainParams):api.editMessageText(chatId,messageId,text),retryLabel,plainErr=>!isTelegramMessageNotModifiedError(plainErr))})}catch(err){if(!isTelegramMessageNotModifiedError(err))throw err}return logVerbose(`[telegram] Edited message ${messageId} in chat ${chatId}`),{ok:!0,messageId:String(messageId),chatId}}function inferFilename(kind){switch(kind){case`image`:return`image.jpg`;case`video`:return`video.mp4`;case`audio`:return`audio.ogg`;default:return`file.bin`}}async function sendStickerTelegram(to,fileId,opts={}){if(!fileId?.trim())throw Error(`Telegram sticker file_id is required`);let{cfg,account,api}=resolveTelegramApiContext(opts),target=parseTelegramTarget(to),chatId=normalizeChatId(target.chatId),threadParams=buildTelegramThreadReplyParams({targetMessageThreadId:target.messageThreadId,messageThreadId:opts.messageThreadId,chatType:target.chatType,replyToMessageId:opts.replyToMessageId}),hasThreadParams=Object.keys(threadParams).length>0,requestWithChatNotFound=createRequestWithChatNotFound({requestWithDiag:createTelegramRequestWithDiag({cfg,account,retry:opts.retry,verbose:opts.verbose,useApiErrorLogging:!1}),chatId,input:to}),result=await withTelegramThreadFallback(hasThreadParams?threadParams:void 0,`sticker`,opts.verbose,async(effectiveParams,label)=>requestWithChatNotFound(()=>api.sendSticker(chatId,fileId.trim(),effectiveParams),label)),messageId=String(result?.message_id??`unknown`),resolvedChatId=String(result?.chat?.id??chatId);return result?.message_id&&recordSentMessage(chatId,result.message_id),recordChannelActivity({channel:`telegram`,accountId:account.accountId,direction:`outbound`}),{messageId,chatId:resolvedChatId}}async function sendPollTelegram(to,poll,opts={}){let{cfg,account,api}=resolveTelegramApiContext(opts),target=parseTelegramTarget(to),chatId=normalizeChatId(target.chatId),normalizedPoll=normalizePollInput(poll,{maxOptions:10}),threadParams=buildTelegramThreadReplyParams({targetMessageThreadId:target.messageThreadId,messageThreadId:opts.messageThreadId,chatType:target.chatType,replyToMessageId:opts.replyToMessageId}),pollOptions=normalizedPoll.options,requestWithChatNotFound=createRequestWithChatNotFound({requestWithDiag:createTelegramRequestWithDiag({cfg,account,retry:opts.retry,verbose:opts.verbose,shouldRetry:err=>isRecoverableTelegramNetworkError(err,{context:`send`})}),chatId,input:to}),durationSeconds=normalizedPoll.durationSeconds;if(durationSeconds===void 0&&normalizedPoll.durationHours!==void 0)throw Error(`Telegram poll durationHours is not supported. Use durationSeconds (5-600) instead.`);if(durationSeconds!==void 0&&(durationSeconds<5||durationSeconds>600))throw Error(`Telegram poll durationSeconds must be between 5 and 600`);let result=await withTelegramThreadFallback({allows_multiple_answers:normalizedPoll.maxSelections>1,is_anonymous:opts.isAnonymous??!0,...durationSeconds===void 0?{}:{open_period:durationSeconds},...Object.keys(threadParams).length>0?threadParams:{},...opts.silent===!0?{disable_notification:!0}:{}},`poll`,opts.verbose,async(effectiveParams,label)=>requestWithChatNotFound(()=>api.sendPoll(chatId,normalizedPoll.question,pollOptions,effectiveParams),label)),messageId=String(result?.message_id??`unknown`),resolvedChatId=String(result?.chat?.id??chatId),pollId=result?.poll?.id;return result?.message_id&&recordSentMessage(chatId,result.message_id),recordChannelActivity({channel:`telegram`,accountId:account.accountId,direction:`outbound`}),{messageId,chatId:resolvedChatId,pollId}}async function createForumTopicTelegram(chatId,name,opts={}){if(!name?.trim())throw Error(`Forum topic name is required`);let trimmedName=name.trim();if(trimmedName.length>128)throw Error(`Forum topic name must be 128 characters or fewer`);let cfg=loadConfig(),account=resolveTelegramAccount({cfg,accountId:opts.accountId}),token=resolveToken(opts.token,account),normalizedChatId=normalizeChatId(parseTelegramTarget(chatId).chatId),client=resolveTelegramClientOptions(account),api=opts.api??new Bot(token,client?{client}:void 0).api,request=createTelegramRetryRunner({retry:opts.retry,configRetry:account.config.retry,verbose:opts.verbose,shouldRetry:err=>isRecoverableTelegramNetworkError(err,{context:`send`})}),logHttpError=createTelegramHttpLogger(cfg),requestWithDiag=(fn,label)=>withTelegramApiErrorLogging({operation:label??`request`,fn:()=>request(fn,label)}).catch(err=>{throw logHttpError(label??`request`,err),err}),extra={};opts.iconColor!=null&&(extra.icon_color=opts.iconColor),opts.iconCustomEmojiId?.trim()&&(extra.icon_custom_emoji_id=opts.iconCustomEmojiId.trim());let hasExtra=Object.keys(extra).length>0,result=await requestWithDiag(()=>api.createForumTopic(normalizedChatId,trimmedName,hasExtra?extra:void 0),`createForumTopic`),topicId=result.message_thread_id;return recordChannelActivity({channel:`telegram`,accountId:account.accountId,direction:`outbound`}),{topicId,name:result.name??trimmedName,chatId:normalizedChatId}}export{hasBotMention as A,normalizeAllowFromWithStore as B,buildTelegramGroupPeerId as C,describeReplyTarget as D,buildTypingThreadParams as E,resolveTelegramReplyId as F,isVoiceCompatibleAudio as G,formatLocationText as H,resolveTelegramStreamMode as I,parseTelegramTarget as K,resolveTelegramThreadSpec as L,resolveTelegramForumThreadId as M,resolveTelegramGroupAllowFromContext as N,expandTextLinks as O,resolveTelegramMediaPlaceholder as P,firstDefined as R,buildTelegramGroupFrom as S,buildTelegramThreadParams as T,toLocationContext as U,resolveSenderAllowMatch as V,withTelegramApiErrorLogging as W,resolveTelegramFetch as _,reactMessageTelegram as a,buildSenderLabel as b,sendStickerTelegram as c,makeProxyFetch as d,isRecoverableTelegramNetworkError as f,wrapFileReferencesInHtml as g,renderTelegramHtmlText as h,editMessageTelegram as i,normalizeForwardedContext as j,extractTelegramLocation as k,resolveTelegramVoiceSend as l,markdownToTelegramHtml as m,createForumTopicTelegram as n,sendMessageTelegram as o,markdownToTelegramChunks as p,resolveTelegramTargetChatType as q,deleteMessageTelegram as r,sendPollTelegram as s,buildInlineKeyboard as t,wasSentByBot as u,splitTelegramCaption as v,buildTelegramParentPeer as w,buildSenderName as x,buildGroupLabel as y,isSenderAllowed as z};
1
+ import{M as logVerbose,O as danger}from"./utils-DbaBVFaK.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{t as isTruthyEnvValue}from"./env-BIdU5BAp.js";import{r as loadConfig}from"./io-BLBq4T2o.js";import{n as redactSensitiveText}from"./redact-BHdfp2MZ.js";import{n as formatErrorMessage,r as formatUncaughtError,t as extractErrorCode}from"./errors-B1MIg3g-.js";import{h as normalizeMimeType,p as isGifMedia,u as getFileExtension,v as mediaKindFromMime}from"./image-ops-C8IUQKjn.js";import{l as resolveTelegramAccount}from"./plugins-D5zP6ENo.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-P6uoUSFa.js";import{a as loadWebMedia,n as markdownToIR,t as chunkMarkdownIR}from"./ir-5BNoIXZm.js";import{t as renderMarkdownWithMarkers}from"./render-D1dVTEB1.js";import{t as resolveFetch}from"./fetch-DnVtDecb.js";import{n as normalizePollInput}from"./polls-IFZVG0cW.js";import{i as createTelegramRetryRunner,n as recordChannelActivity}from"./channel-activity-CCNDbdD3.js";import{i as readChannelAllowFromStore}from"./pairing-store-ti3FEkmr.js";import process$1 from"node:process";import*as net$1 from"node:net";import{ProxyAgent,fetch}from"undici";import{Bot,HttpError,InputFile}from"grammy";function stripTelegramInternalPrefixes(to){let trimmed=to.trim(),strippedTelegramPrefix=!1;for(;;){let next=/^(telegram|tg):/i.test(trimmed)?(strippedTelegramPrefix=!0,trimmed.replace(/^(telegram|tg):/i,``).trim()):strippedTelegramPrefix&&/^group:/i.test(trimmed)?trimmed.replace(/^group:/i,``).trim():trimmed;if(next===trimmed)return trimmed;trimmed=next}}function resolveTelegramChatType(chatId){let trimmed=chatId.trim();return trimmed&&/^-?\d+$/.test(trimmed)?trimmed.startsWith(`-`)?`group`:`direct`:`unknown`}function parseTelegramTarget(to){let normalized=stripTelegramInternalPrefixes(to),topicMatch=/^(.+?):topic:(\d+)$/.exec(normalized);if(topicMatch)return{chatId:topicMatch[1],messageThreadId:Number.parseInt(topicMatch[2],10),chatType:resolveTelegramChatType(topicMatch[1])};let colonMatch=/^(.+):(\d+)$/.exec(normalized);return colonMatch?{chatId:colonMatch[1],messageThreadId:Number.parseInt(colonMatch[2],10),chatType:resolveTelegramChatType(colonMatch[1])}:{chatId:normalized,chatType:resolveTelegramChatType(normalized)}}function resolveTelegramTargetChatType(target){return parseTelegramTarget(target).chatType}const TELEGRAM_VOICE_AUDIO_EXTENSIONS=new Set([`.oga`,`.ogg`,`.opus`,`.mp3`,`.m4a`]),TELEGRAM_VOICE_MIME_TYPES=new Set([`audio/ogg`,`audio/opus`,`audio/mpeg`,`audio/mp3`,`audio/mp4`,`audio/x-m4a`,`audio/m4a`]);function isTelegramVoiceCompatibleAudio(opts){let mime=normalizeMimeType(opts.contentType);if(mime&&TELEGRAM_VOICE_MIME_TYPES.has(mime))return!0;let fileName=opts.fileName?.trim();if(!fileName)return!1;let ext=getFileExtension(fileName);return ext?TELEGRAM_VOICE_AUDIO_EXTENSIONS.has(ext):!1}function isVoiceCompatibleAudio(opts){return isTelegramVoiceCompatibleAudio(opts)}function normalizeFlag(value){return value.trim().toLowerCase()}function parseEnvFlags(raw){if(!raw)return[];let trimmed=raw.trim();if(!trimmed)return[];let lowered=trimmed.toLowerCase();return[`0`,`false`,`off`,`none`].includes(lowered)?[]:[`1`,`true`,`all`,`*`].includes(lowered)?[`*`]:trimmed.split(/[,\s]+/).map(normalizeFlag).filter(Boolean)}function uniqueFlags(flags){let seen=new Set,out=[];for(let flag of flags){let normalized=normalizeFlag(flag);!normalized||seen.has(normalized)||(seen.add(normalized),out.push(normalized))}return out}function resolveDiagnosticFlags(cfg,env=process.env){let configFlags=Array.isArray(cfg?.diagnostics?.flags)?cfg?.diagnostics?.flags:[],envFlags=parseEnvFlags(env.BUILDERFORCE_AGENTS_DIAGNOSTICS);return uniqueFlags([...configFlags,...envFlags])}function matchesDiagnosticFlag(flag,enabledFlags){let target=normalizeFlag(flag);if(!target)return!1;for(let raw of enabledFlags){let enabled=normalizeFlag(raw);if(enabled){if(enabled===`*`||enabled===`all`)return!0;if(enabled.endsWith(`.*`)){let prefix=enabled.slice(0,-2);if(target===prefix||target.startsWith(`${prefix}.`))return!0}if(enabled.endsWith(`*`)){let prefix=enabled.slice(0,-1);if(target.startsWith(prefix))return!0}if(enabled===target)return!0}}return!1}function isDiagnosticFlagEnabled(flag,cfg,env=process.env){return matchesDiagnosticFlag(flag,resolveDiagnosticFlags(cfg,env))}const fallbackLogger=createSubsystemLogger(`telegram/api`);function resolveTelegramApiLogger(runtime,logger){return logger||(runtime?.error?runtime.error:message=>fallbackLogger.error(message))}async function withTelegramApiErrorLogging({operation,fn,runtime,logger,shouldLog}){try{return await fn()}catch(err){if(!shouldLog||shouldLog(err)){let errText=formatErrorMessage(err);resolveTelegramApiLogger(runtime,logger)(danger(`telegram ${operation} failed: ${errText}`))}throw err}}function resolveLocation(location){let source=location.source??(location.isLive?`live`:location.name||location.address?`place`:`pin`),isLive=!!(location.isLive??source===`live`);return{...location,source,isLive}}function formatAccuracy(accuracy){return Number.isFinite(accuracy)?` ±${Math.round(accuracy??0)}m`:``}function formatCoords(latitude,longitude){return`${latitude.toFixed(6)}, ${longitude.toFixed(6)}`}function formatLocationText(location){let resolved=resolveLocation(location),coords=formatCoords(resolved.latitude,resolved.longitude),accuracy=formatAccuracy(resolved.accuracy),caption=resolved.caption?.trim(),header=``;return header=resolved.source===`live`||resolved.isLive?`🛰 Live location: ${coords}${accuracy}`:resolved.name||resolved.address?`📍 ${[resolved.name,resolved.address].filter(Boolean).join(` — `)} (${coords}${accuracy})`:`📍 ${coords}${accuracy}`,caption?`${header}\n${caption}`:header}function toLocationContext(location){let resolved=resolveLocation(location);return{LocationLat:resolved.latitude,LocationLon:resolved.longitude,LocationAccuracy:resolved.accuracy,LocationName:resolved.name,LocationAddress:resolved.address,LocationSource:resolved.source,LocationIsLive:resolved.isLive}}const warnedInvalidEntries=new Set;function warnInvalidAllowFromEntries(entries){if(!process.env.VITEST)for(let entry of entries)warnedInvalidEntries.has(entry)||(warnedInvalidEntries.add(entry),console.warn([`[telegram] Invalid allowFrom entry:`,JSON.stringify(entry),`- allowFrom/groupAllowFrom authorization requires numeric Telegram sender IDs only.`,`If you had "@username" entries, re-run onboarding (it resolves @username to IDs) or replace them manually.`].join(` `)))}const normalizeAllowFrom=list=>{let entries=(list??[]).map(value=>String(value).trim()).filter(Boolean),hasWildcard=entries.includes(`*`),normalized=entries.filter(value=>value!==`*`).map(value=>value.replace(/^(telegram|tg):/i,``)),invalidEntries=normalized.filter(value=>!/^\d+$/.test(value));return invalidEntries.length>0&&warnInvalidAllowFromEntries([...new Set(invalidEntries)]),{entries:normalized.filter(value=>/^\d+$/.test(value)),hasWildcard,hasEntries:entries.length>0,invalidEntries}},normalizeAllowFromWithStore=params=>normalizeAllowFrom([...params.allowFrom??[],...params.storeAllowFrom??[]].map(value=>String(value).trim()).filter(Boolean)),firstDefined=(...values)=>{for(let value of values)if(value!==void 0)return value},isSenderAllowed=params=>{let{allow,senderId}=params;return!!(!allow.hasEntries||allow.hasWildcard||senderId&&allow.entries.includes(senderId))},resolveSenderAllowMatch=params=>{let{allow,senderId}=params;return allow.hasWildcard?{allowed:!0,matchKey:`*`,matchSource:`wildcard`}:allow.hasEntries&&senderId&&allow.entries.includes(senderId)?{allowed:!0,matchKey:senderId,matchSource:`id`}:{allowed:!1}};async function resolveTelegramGroupAllowFromContext(params){let resolvedThreadId=resolveTelegramForumThreadId({isForum:params.isForum,messageThreadId:params.messageThreadId}),storeAllowFrom=await readChannelAllowFromStore(`telegram`,process.env,params.accountId).catch(()=>[]),{groupConfig,topicConfig}=params.resolveTelegramGroupConfig(params.chatId,resolvedThreadId),groupAllowOverride=firstDefined(topicConfig?.allowFrom,groupConfig?.allowFrom);return{resolvedThreadId,storeAllowFrom,groupConfig,topicConfig,groupAllowOverride,effectiveGroupAllow:normalizeAllowFromWithStore({allowFrom:groupAllowOverride??params.groupAllowFrom,storeAllowFrom}),hasGroupAllowOverride:groupAllowOverride!==void 0}}function resolveTelegramForumThreadId(params){if(params.isForum)return params.messageThreadId==null?1:params.messageThreadId}function resolveTelegramThreadSpec(params){return params.isGroup?{id:resolveTelegramForumThreadId({isForum:params.isForum,messageThreadId:params.messageThreadId}),scope:params.isForum?`forum`:`none`}:params.messageThreadId==null?{scope:`dm`}:{id:params.messageThreadId,scope:`dm`}}function buildTelegramThreadParams(thread){if(thread?.id==null)return;let normalized=Math.trunc(thread.id);if(thread.scope===`dm`)return normalized>0?{message_thread_id:normalized}:void 0;if(normalized!==1)return{message_thread_id:normalized}}function buildTypingThreadParams(messageThreadId){if(messageThreadId!=null)return{message_thread_id:Math.trunc(messageThreadId)}}function resolveTelegramStreamMode(telegramCfg){let raw=telegramCfg?.streamMode?.trim().toLowerCase();return raw===`off`||raw===`partial`||raw===`block`?raw:`partial`}function buildTelegramGroupPeerId(chatId,messageThreadId){return messageThreadId==null?String(chatId):`${chatId}:topic:${messageThreadId}`}function buildTelegramGroupFrom(chatId,messageThreadId){return`telegram:group:${buildTelegramGroupPeerId(chatId,messageThreadId)}`}function buildTelegramParentPeer(params){if(!(!params.isGroup||params.resolvedThreadId==null))return{kind:`group`,id:String(params.chatId)}}function buildSenderName(msg){return[msg.from?.first_name,msg.from?.last_name].filter(Boolean).join(` `).trim()||msg.from?.username||void 0}function resolveTelegramMediaPlaceholder(msg){if(msg){if(msg.photo)return`<media:image>`;if(msg.video||msg.video_note)return`<media:video>`;if(msg.audio||msg.voice)return`<media:audio>`;if(msg.document)return`<media:document>`;if(msg.sticker)return`<media:sticker>`}}function buildSenderLabel(msg,senderId){let name=buildSenderName(msg),username=msg.from?.username?`@${msg.from.username}`:void 0,label=name;name&&username?label=`${name} (${username})`:!name&&username&&(label=username);let fallbackId=(senderId!=null&&`${senderId}`.trim()?`${senderId}`.trim():void 0)??(msg.from?.id==null?void 0:String(msg.from.id)),idPart=fallbackId?`id:${fallbackId}`:void 0;return label&&idPart?`${label} ${idPart}`:label||(idPart??`id:unknown`)}function buildGroupLabel(msg,chatId,messageThreadId){let title=msg.chat?.title,topicSuffix=messageThreadId==null?``:` topic:${messageThreadId}`;return title?`${title} id:${chatId}${topicSuffix}`:`group:${chatId}${topicSuffix}`}function hasBotMention(msg,botUsername){if((msg.text??msg.caption??``).toLowerCase().includes(`@${botUsername}`))return!0;let entities=msg.entities??msg.caption_entities??[];for(let ent of entities)if(ent.type===`mention`&&(msg.text??msg.caption??``).slice(ent.offset,ent.offset+ent.length).toLowerCase()===`@${botUsername}`)return!0;return!1}function expandTextLinks(text,entities){if(!text||!entities?.length)return text;let textLinks=entities.filter(entity=>entity.type===`text_link`&&!!entity.url).toSorted((a,b)=>b.offset-a.offset);if(textLinks.length===0)return text;let result=text;for(let entity of textLinks){let markdown=`[${text.slice(entity.offset,entity.offset+entity.length)}](${entity.url})`;result=result.slice(0,entity.offset)+markdown+result.slice(entity.offset+entity.length)}return result}function resolveTelegramReplyId(raw){if(!raw)return;let parsed=Number(raw);if(Number.isFinite(parsed))return parsed}function describeReplyTarget(msg){let reply=msg.reply_to_message,externalReply=msg.external_reply,quoteText=msg.quote?.text??externalReply?.quote?.text,body=``,kind=`reply`;typeof quoteText==`string`&&(body=quoteText.trim(),body&&(kind=`quote`));let replyLike=reply??externalReply;if(!body&&replyLike&&(body=(replyLike.text??replyLike.caption??``).trim(),!body&&(body=resolveTelegramMediaPlaceholder(replyLike)??``,!body))){let locationData=extractTelegramLocation(replyLike);locationData&&(body=formatLocationText(locationData))}if(!body)return null;let senderLabel=(replyLike?buildSenderName(replyLike):void 0)??`unknown sender`;return{id:replyLike?.message_id?String(replyLike.message_id):void 0,sender:senderLabel,body,kind}}function normalizeForwardedUserLabel(user){let name=[user.first_name,user.last_name].filter(Boolean).join(` `).trim(),username=user.username?.trim()||void 0,id=String(user.id);return{display:(name&&username?`${name} (@${username})`:name||(username?`@${username}`:void 0))||`user:${id}`,name:name||void 0,username,id}}function normalizeForwardedChatLabel(chat,fallbackKind){let title=chat.title?.trim()||void 0,username=chat.username?.trim()||void 0,id=String(chat.id);return{display:title||(username?`@${username}`:void 0)||`${fallbackKind}:${id}`,title,username,id}}function buildForwardedContextFromUser(params){let{display,name,username,id}=normalizeForwardedUserLabel(params.user);return display?{from:display,date:params.date,fromType:params.type,fromId:id,fromUsername:username,fromTitle:name}:null}function buildForwardedContextFromHiddenName(params){let trimmed=params.name?.trim();return trimmed?{from:trimmed,date:params.date,fromType:params.type,fromTitle:trimmed}:null}function buildForwardedContextFromChat(params){let fallbackKind=params.type===`channel`?`channel`:`chat`,{display,title,username,id}=normalizeForwardedChatLabel(params.chat,fallbackKind);if(!display)return null;let signature=params.signature?.trim()||void 0,from=signature?`${display} (${signature})`:display,chatType=params.chat.type?.trim()||void 0;return{from,date:params.date,fromType:params.type,fromId:id,fromUsername:username,fromTitle:title,fromSignature:signature,fromChatType:chatType,fromMessageId:params.messageId}}function resolveForwardOrigin(origin){switch(origin.type){case`user`:return buildForwardedContextFromUser({user:origin.sender_user,date:origin.date,type:`user`});case`hidden_user`:return buildForwardedContextFromHiddenName({name:origin.sender_user_name,date:origin.date,type:`hidden_user`});case`chat`:return buildForwardedContextFromChat({chat:origin.sender_chat,date:origin.date,type:`chat`,signature:origin.author_signature});case`channel`:return buildForwardedContextFromChat({chat:origin.chat,date:origin.date,type:`channel`,signature:origin.author_signature,messageId:origin.message_id});default:return null}}function normalizeForwardedContext(msg){return msg.forward_origin?resolveForwardOrigin(msg.forward_origin):null}function extractTelegramLocation(msg){let{venue,location}=msg;if(venue)return{latitude:venue.location.latitude,longitude:venue.location.longitude,accuracy:venue.location.horizontal_accuracy,name:venue.title,address:venue.address,source:`place`,isLive:!1};if(location){let isLive=typeof location.live_period==`number`&&location.live_period>0;return{latitude:location.latitude,longitude:location.longitude,accuracy:location.horizontal_accuracy,source:isLive?`live`:`pin`,isLive}}return null}function splitTelegramCaption(text){let trimmed=text?.trim()??``;return trimmed?trimmed.length>1024?{caption:void 0,followUpText:trimmed}:{caption:trimmed,followUpText:void 0}:{caption:void 0,followUpText:void 0}}const TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV=`BUILDERFORCE_AGENTS_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY`,TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV=`BUILDERFORCE_AGENTS_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY`;function resolveTelegramAutoSelectFamilyDecision(params){let env=params?.env??process$1.env,nodeMajor=typeof params?.nodeMajor==`number`?params.nodeMajor:Number(process$1.versions.node.split(`.`)[0]);return isTruthyEnvValue(env[TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV])?{value:!0,source:`env:${TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV}`}:isTruthyEnvValue(env[TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV])?{value:!1,source:`env:${TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV}`}:typeof params?.network?.autoSelectFamily==`boolean`?{value:params.network.autoSelectFamily,source:`config`}:Number.isFinite(nodeMajor)&&nodeMajor>=22?{value:!0,source:`default-node22`}:{value:null}}let appliedAutoSelectFamily=null;const log=createSubsystemLogger(`telegram/network`);function applyTelegramNetworkWorkarounds(network){let decision=resolveTelegramAutoSelectFamilyDecision({network});if(!(decision.value===null||decision.value===appliedAutoSelectFamily)&&(appliedAutoSelectFamily=decision.value,typeof net$1.setDefaultAutoSelectFamily==`function`))try{net$1.setDefaultAutoSelectFamily(decision.value);let label=decision.source?` (${decision.source})`:``;log.info(`telegram: autoSelectFamily=${decision.value}${label}`)}catch{}}function resolveTelegramFetch(proxyFetch,options){if(applyTelegramNetworkWorkarounds(options?.network),proxyFetch)return resolveFetch(proxyFetch);let fetchImpl=resolveFetch();if(!fetchImpl)throw Error(`fetch is not available; set channels.telegram.proxy in config`);return fetchImpl}function escapeHtml(text){return text.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}function escapeHtmlAttr(text){return escapeHtml(text).replace(/"/g,`&quot;`)}const FILE_EXTENSIONS_WITH_TLD=new Set([`md`,`go`,`py`,`pl`,`sh`,`am`,`at`,`be`,`cc`]);function isAutoLinkedFileRef(href,label){if(href.replace(/^https?:\/\//i,``)!==label)return!1;let dotIndex=label.lastIndexOf(`.`);if(dotIndex<1)return!1;let ext=label.slice(dotIndex+1).toLowerCase();if(!FILE_EXTENSIONS_WITH_TLD.has(ext))return!1;let segments=label.split(`/`);if(segments.length>1){for(let i=0;i<segments.length-1;i++)if(segments[i].includes(`.`))return!1}return!0}function buildTelegramLink(link,text){let href=link.href.trim();if(!href||link.start===link.end||isAutoLinkedFileRef(href,text.slice(link.start,link.end)))return null;let safeHref=escapeHtmlAttr(href);return{start:link.start,end:link.end,open:`<a href="${safeHref}">`,close:`</a>`}}function renderTelegramHtml(ir){return renderMarkdownWithMarkers(ir,{styleMarkers:{bold:{open:`<b>`,close:`</b>`},italic:{open:`<i>`,close:`</i>`},strikethrough:{open:`<s>`,close:`</s>`},code:{open:`<code>`,close:`</code>`},code_block:{open:`<pre><code>`,close:`</code></pre>`},spoiler:{open:`<tg-spoiler>`,close:`</tg-spoiler>`},blockquote:{open:`<blockquote>`,close:`</blockquote>`}},escapeText:escapeHtml,buildLink:buildTelegramLink})}function markdownToTelegramHtml(markdown,options={}){let html=renderTelegramHtml(markdownToIR(markdown??``,{linkify:!0,enableSpoilers:!0,headingStyle:`none`,blockquotePrefix:``,tableMode:options.tableMode}));return options.wrapFileRefs===!1?html:wrapFileReferencesInHtml(html)}function escapeRegex(str){return str.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}const FILE_EXTENSIONS_PATTERN=Array.from(FILE_EXTENSIONS_WITH_TLD).map(escapeRegex).join(`|`),AUTO_LINKED_ANCHOR_PATTERN=/<a\s+href="https?:\/\/([^"]+)"[^>]*>\1<\/a>/gi,FILE_REFERENCE_PATTERN=RegExp(`(^|[^a-zA-Z0-9_\\-/])([a-zA-Z0-9_.\\-./]+\\.(?:${FILE_EXTENSIONS_PATTERN}))(?=$|[^a-zA-Z0-9_\\-/])`,`gi`),ORPHANED_TLD_PATTERN=RegExp(`([^a-zA-Z0-9]|^)([A-Za-z]\\.(?:${FILE_EXTENSIONS_PATTERN}))(?=[^a-zA-Z0-9/]|$)`,`g`),HTML_TAG_PATTERN=/(<\/?)([a-zA-Z][a-zA-Z0-9-]*)\b[^>]*?>/gi;function wrapStandaloneFileRef(match,prefix,filename){return filename.startsWith(`//`)||/https?:\/\/$/i.test(prefix)?match:`${prefix}<code>${escapeHtml(filename)}</code>`}function wrapSegmentFileRefs(text,codeDepth,preDepth,anchorDepth){return!text||codeDepth>0||preDepth>0||anchorDepth>0?text:text.replace(FILE_REFERENCE_PATTERN,wrapStandaloneFileRef).replace(ORPHANED_TLD_PATTERN,(match,prefix,tld)=>prefix===`>`?match:`${prefix}<code>${escapeHtml(tld)}</code>`)}function wrapFileReferencesInHtml(html){AUTO_LINKED_ANCHOR_PATTERN.lastIndex=0;let deLinkified=html.replace(AUTO_LINKED_ANCHOR_PATTERN,(_match,label)=>isAutoLinkedFileRef(`http://${label}`,label)?`<code>${escapeHtml(label)}</code>`:_match),codeDepth=0,preDepth=0,anchorDepth=0,result=``,lastIndex=0;HTML_TAG_PATTERN.lastIndex=0;let match;for(;(match=HTML_TAG_PATTERN.exec(deLinkified))!==null;){let tagStart=match.index,tagEnd=HTML_TAG_PATTERN.lastIndex,isClosing=match[1]===`</`,tagName=match[2].toLowerCase(),textBefore=deLinkified.slice(lastIndex,tagStart);result+=wrapSegmentFileRefs(textBefore,codeDepth,preDepth,anchorDepth),tagName===`code`?codeDepth=isClosing?Math.max(0,codeDepth-1):codeDepth+1:tagName===`pre`?preDepth=isClosing?Math.max(0,preDepth-1):preDepth+1:tagName===`a`&&(anchorDepth=isClosing?Math.max(0,anchorDepth-1):anchorDepth+1),result+=deLinkified.slice(tagStart,tagEnd),lastIndex=tagEnd}let remainingText=deLinkified.slice(lastIndex);return result+=wrapSegmentFileRefs(remainingText,codeDepth,preDepth,anchorDepth),result}function renderTelegramHtmlText(text,options={}){return(options.textMode??`markdown`)===`html`?text:markdownToTelegramHtml(text,{tableMode:options.tableMode})}function markdownToTelegramChunks(markdown,limit,options={}){return chunkMarkdownIR(markdownToIR(markdown??``,{linkify:!0,enableSpoilers:!0,headingStyle:`none`,blockquotePrefix:``,tableMode:options.tableMode}),limit).map(chunk=>({html:wrapFileReferencesInHtml(renderTelegramHtml(chunk)),text:chunk.text}))}const RECOVERABLE_ERROR_CODES=new Set([`ECONNRESET`,`ECONNREFUSED`,`EPIPE`,`ETIMEDOUT`,`ESOCKETTIMEDOUT`,`ENETUNREACH`,`EHOSTUNREACH`,`ENOTFOUND`,`EAI_AGAIN`,`UND_ERR_CONNECT_TIMEOUT`,`UND_ERR_HEADERS_TIMEOUT`,`UND_ERR_BODY_TIMEOUT`,`UND_ERR_SOCKET`,`UND_ERR_ABORTED`,`ECONNABORTED`,`ERR_NETWORK`]),RECOVERABLE_ERROR_NAMES=new Set([`AbortError`,`TimeoutError`,`ConnectTimeoutError`,`HeadersTimeoutError`,`BodyTimeoutError`]),RECOVERABLE_MESSAGE_SNIPPETS=[`fetch failed`,`typeerror: fetch failed`,`undici`,`network error`,`network request`,`client network socket disconnected`,`socket hang up`,`getaddrinfo`,`timeout`,`timed out`];function normalizeCode(code){return code?.trim().toUpperCase()??``}function getErrorName(err){return!err||typeof err!=`object`?``:`name`in err?String(err.name):``}function getErrorCode(err){let direct=extractErrorCode(err);if(direct)return direct;if(!err||typeof err!=`object`)return;let errno=err.errno;if(typeof errno==`string`)return errno;if(typeof errno==`number`)return String(errno)}function collectErrorCandidates(err){let queue=[err],seen=new Set,candidates=[];for(;queue.length>0;){let current=queue.shift();if(!(current==null||seen.has(current))&&(seen.add(current),candidates.push(current),typeof current==`object`)){let cause=current.cause;cause&&!seen.has(cause)&&queue.push(cause);let reason=current.reason;reason&&!seen.has(reason)&&queue.push(reason);let errors=current.errors;if(Array.isArray(errors))for(let nested of errors)nested&&!seen.has(nested)&&queue.push(nested);if(getErrorName(current)===`HttpError`){let wrappedError=current.error;wrappedError&&!seen.has(wrappedError)&&queue.push(wrappedError)}}}return candidates}function isRecoverableTelegramNetworkError(err,options={}){if(!err)return!1;let allowMessageMatch=typeof options.allowMessageMatch==`boolean`?options.allowMessageMatch:options.context!==`send`;for(let candidate of collectErrorCandidates(err)){let code=normalizeCode(getErrorCode(candidate));if(code&&RECOVERABLE_ERROR_CODES.has(code))return!0;let name=getErrorName(candidate);if(name&&RECOVERABLE_ERROR_NAMES.has(name))return!0;if(allowMessageMatch){let message=formatErrorMessage(candidate).toLowerCase();if(message&&RECOVERABLE_MESSAGE_SNIPPETS.some(snippet=>message.includes(snippet)))return!0}}return!1}function makeProxyFetch(proxyUrl){let agent=new ProxyAgent(proxyUrl);return((input,init)=>fetch(input,{...init,dispatcher:agent}))}const sentMessages=new Map;function getChatKey(chatId){return String(chatId)}function cleanupExpired(entry){let now=Date.now();for(let[msgId,timestamp]of entry.timestamps)now-timestamp>864e5&&(entry.messageIds.delete(msgId),entry.timestamps.delete(msgId))}function recordSentMessage(chatId,messageId){let key=getChatKey(chatId),entry=sentMessages.get(key);entry||(entry={messageIds:new Set,timestamps:new Map},sentMessages.set(key,entry)),entry.messageIds.add(messageId),entry.timestamps.set(messageId,Date.now()),entry.messageIds.size>100&&cleanupExpired(entry)}function wasSentByBot(chatId,messageId){let key=getChatKey(chatId),entry=sentMessages.get(key);return entry?(cleanupExpired(entry),entry.messageIds.has(messageId)):!1}function resolveTelegramVoiceDecision(opts){return opts.wantsVoice?isTelegramVoiceCompatibleAudio(opts)?{useVoice:!0}:{useVoice:!1,reason:`media is ${opts.contentType??`unknown`} (${opts.fileName??`unknown`})`}:{useVoice:!1}}function resolveTelegramVoiceSend(opts){let decision=resolveTelegramVoiceDecision(opts);return decision.reason&&opts.logFallback&&opts.logFallback(`Telegram voice requested but ${decision.reason}; sending as audio file instead.`),{useVoice:decision.useVoice}}const PARSE_ERR_RE=/can't parse entities|parse entities|find end of the entity/i,THREAD_NOT_FOUND_RE=/400:\s*Bad Request:\s*message thread not found/i,MESSAGE_NOT_MODIFIED_RE=/400:\s*Bad Request:\s*message is not modified|MESSAGE_NOT_MODIFIED/i,CHAT_NOT_FOUND_RE=/400: Bad Request: chat not found/i,diagLogger=createSubsystemLogger(`telegram/diagnostic`);function createTelegramHttpLogger(cfg){return isDiagnosticFlagEnabled(`telegram.http`,cfg)?(label,err)=>{if(!(err instanceof HttpError))return;let detail=redactSensitiveText(formatUncaughtError(err.error??err));diagLogger.warn(`telegram http error (${label}): ${detail}`)}:()=>{}}function resolveTelegramClientOptions(account){let proxyUrl=account.config.proxy?.trim(),fetchImpl=resolveTelegramFetch(proxyUrl?makeProxyFetch(proxyUrl):void 0,{network:account.config.network}),timeoutSeconds=typeof account.config.timeoutSeconds==`number`&&Number.isFinite(account.config.timeoutSeconds)?Math.max(1,Math.floor(account.config.timeoutSeconds)):void 0;return fetchImpl||timeoutSeconds?{...fetchImpl?{fetch:fetchImpl}:{},...timeoutSeconds?{timeoutSeconds}:{}}:void 0}function resolveToken(explicit,params){if(explicit?.trim())return explicit.trim();if(!params.token)throw Error(`Telegram bot token missing for account "${params.accountId}" (set channels.telegram.accounts.${params.accountId}.botToken/tokenFile or TELEGRAM_BOT_TOKEN for default).`);return params.token.trim()}function normalizeChatId(to){let trimmed=to.trim();if(!trimmed)throw Error(`Recipient is required for Telegram sends`);let normalized=stripTelegramInternalPrefixes(trimmed),m=/^https?:\/\/t\.me\/([A-Za-z0-9_]+)$/i.exec(normalized)??/^t\.me\/([A-Za-z0-9_]+)$/i.exec(normalized);if(m?.[1]&&(normalized=`@${m[1]}`),!normalized)throw Error(`Recipient is required for Telegram sends`);return normalized.startsWith(`@`)||/^-?\d+$/.test(normalized)?normalized:/^[A-Za-z0-9_]{5,}$/i.test(normalized)?`@${normalized}`:normalized}function normalizeMessageId(raw){if(typeof raw==`number`&&Number.isFinite(raw))return Math.trunc(raw);if(typeof raw==`string`){let value=raw.trim();if(!value)throw Error(`Message id is required for Telegram actions`);let parsed=Number.parseInt(value,10);if(Number.isFinite(parsed))return parsed}throw Error(`Message id is required for Telegram actions`)}function isTelegramThreadNotFoundError(err){return THREAD_NOT_FOUND_RE.test(formatErrorMessage(err))}function isTelegramMessageNotModifiedError(err){return MESSAGE_NOT_MODIFIED_RE.test(formatErrorMessage(err))}function hasMessageThreadIdParam(params){if(!params)return!1;let value=params.message_thread_id;return typeof value==`number`?Number.isFinite(value):typeof value==`string`?value.trim().length>0:!1}function removeMessageThreadIdParam(params){if(!params||!hasMessageThreadIdParam(params))return params;let next={...params};return delete next.message_thread_id,Object.keys(next).length>0?next:void 0}function isTelegramHtmlParseError(err){return PARSE_ERR_RE.test(formatErrorMessage(err))}function buildTelegramThreadReplyParams(params){let messageThreadId=params.messageThreadId==null?params.targetMessageThreadId:params.messageThreadId,threadScope=params.chatType===`direct`?`dm`:`forum`,threadIdParams=buildTelegramThreadParams(messageThreadId==null?void 0:{id:messageThreadId,scope:threadScope}),threadParams=threadIdParams?{...threadIdParams}:{};if(params.replyToMessageId!=null){let replyToMessageId=Math.trunc(params.replyToMessageId);params.quoteText?.trim()?threadParams.reply_parameters={message_id:replyToMessageId,quote:params.quoteText.trim()}:threadParams.reply_to_message_id=replyToMessageId}return threadParams}async function withTelegramHtmlParseFallback(params){try{return await params.requestHtml(params.label)}catch(err){if(!isTelegramHtmlParseError(err))throw err;return params.verbose&&console.warn(`telegram ${params.label} failed with HTML parse error, retrying as plain text: ${formatErrorMessage(err)}`),await params.requestPlain(`${params.label}-plain`)}}function resolveTelegramApiContext(opts){let cfg=opts.cfg??loadConfig(),account=resolveTelegramAccount({cfg,accountId:opts.accountId}),token=resolveToken(opts.token,account),client=resolveTelegramClientOptions(account);return{cfg,account,api:opts.api??new Bot(token,client?{client}:void 0).api}}function createTelegramRequestWithDiag(params){let request=createTelegramRetryRunner({retry:params.retry,configRetry:params.account.config.retry,verbose:params.verbose,...params.shouldRetry?{shouldRetry:params.shouldRetry}:{}}),logHttpError=createTelegramHttpLogger(params.cfg);return(fn,label,options)=>{let runRequest=()=>request(fn,label);return(params.useApiErrorLogging===!1?runRequest():withTelegramApiErrorLogging({operation:label??`request`,fn:runRequest,...options?.shouldLog?{shouldLog:options.shouldLog}:{}})).catch(err=>{throw logHttpError(label??`request`,err),err})}}function wrapTelegramChatNotFoundError(err,params){return CHAT_NOT_FOUND_RE.test(formatErrorMessage(err))?Error([`Telegram send failed: chat not found (chat_id=${params.chatId}).`,`Likely: bot not started in DM, bot removed from group/channel, group migrated (new -100… id), or wrong bot token.`,`Input was: ${JSON.stringify(params.input)}.`].join(` `)):err}async function withTelegramThreadFallback(params,label,verbose,attempt){try{return await attempt(params,label)}catch(err){if(!hasMessageThreadIdParam(params)||!isTelegramThreadNotFoundError(err))throw err;return verbose&&console.warn(`telegram ${label} failed with message_thread_id, retrying without thread: ${formatErrorMessage(err)}`),await attempt(removeMessageThreadIdParam(params),`${label}-threadless`)}}function createRequestWithChatNotFound(params){return async(fn,label)=>params.requestWithDiag(fn,label).catch(err=>{throw wrapTelegramChatNotFoundError(err,{chatId:params.chatId,input:params.input})})}function buildInlineKeyboard(buttons){if(!buttons?.length)return;let rows=buttons.map(row=>row.filter(button=>button?.text&&button?.callback_data).map(button=>({text:button.text,callback_data:button.callback_data,...button.style?{style:button.style}:{}}))).filter(row=>row.length>0);if(rows.length!==0)return{inline_keyboard:rows}}async function sendMessageTelegram(to,text,opts={}){let{cfg,account,api}=resolveTelegramApiContext(opts),target=parseTelegramTarget(to),chatId=normalizeChatId(target.chatId),mediaUrl=opts.mediaUrl?.trim(),replyMarkup=buildInlineKeyboard(opts.buttons),threadParams=buildTelegramThreadReplyParams({targetMessageThreadId:target.messageThreadId,messageThreadId:opts.messageThreadId,chatType:target.chatType,replyToMessageId:opts.replyToMessageId,quoteText:opts.quoteText}),hasThreadParams=Object.keys(threadParams).length>0,requestWithChatNotFound=createRequestWithChatNotFound({requestWithDiag:createTelegramRequestWithDiag({cfg,account,retry:opts.retry,verbose:opts.verbose,shouldRetry:err=>isRecoverableTelegramNetworkError(err,{context:`send`})}),chatId,input:to}),textMode=opts.textMode??`markdown`,tableMode=resolveMarkdownTableMode({cfg,channel:`telegram`,accountId:account.accountId}),renderHtmlText=value=>renderTelegramHtmlText(value,{textMode,tableMode}),linkPreviewOptions=account.config.linkPreview??!0?void 0:{is_disabled:!0},sendTelegramText=async(rawText,params,fallbackText)=>await withTelegramThreadFallback(params,`message`,opts.verbose,async(effectiveParams,label)=>{let htmlText=renderHtmlText(rawText),baseParams=effectiveParams?{...effectiveParams}:{};linkPreviewOptions&&(baseParams.link_preview_options=linkPreviewOptions);let hasBaseParams=Object.keys(baseParams).length>0,sendParams={parse_mode:`HTML`,...baseParams,...opts.silent===!0?{disable_notification:!0}:{}};return await withTelegramHtmlParseFallback({label,verbose:opts.verbose,requestHtml:retryLabel=>requestWithChatNotFound(()=>api.sendMessage(chatId,htmlText,sendParams),retryLabel),requestPlain:retryLabel=>{let plainParams=hasBaseParams?baseParams:void 0;return requestWithChatNotFound(()=>plainParams?api.sendMessage(chatId,fallbackText??rawText,plainParams):api.sendMessage(chatId,fallbackText??rawText),retryLabel)}})});if(mediaUrl){let media=await loadWebMedia(mediaUrl,{maxBytes:opts.maxBytes,localRoots:opts.mediaLocalRoots}),kind=mediaKindFromMime(media.contentType??void 0),isGif=isGifMedia({contentType:media.contentType,fileName:media.fileName}),isVideoNote=kind===`video`&&opts.asVideoNote===!0,fileName=media.fileName??(isGif?`animation.gif`:inferFilename(kind))??`file`,file=new InputFile(media.buffer,fileName),caption,followUpText;if(isVideoNote)caption=void 0,followUpText=text.trim()?text:void 0;else{let split=splitTelegramCaption(text);caption=split.caption,followUpText=split.followUpText}let htmlCaption=caption?renderHtmlText(caption):void 0,needsSeparateText=!!followUpText,baseMediaParams={...hasThreadParams?threadParams:{},...!needsSeparateText&&replyMarkup?{reply_markup:replyMarkup}:{}},mediaParams={...htmlCaption?{caption:htmlCaption,parse_mode:`HTML`}:{},...baseMediaParams,...opts.silent===!0?{disable_notification:!0}:{}},sendMedia=async(label,sender)=>await withTelegramThreadFallback(mediaParams,label,opts.verbose,async(effectiveParams,retryLabel)=>requestWithChatNotFound(()=>sender(effectiveParams),retryLabel)),mediaSender=(()=>{if(isGif)return{label:`animation`,sender:effectiveParams=>api.sendAnimation(chatId,file,effectiveParams)};if(kind===`image`)return{label:`photo`,sender:effectiveParams=>api.sendPhoto(chatId,file,effectiveParams)};if(kind===`video`)return isVideoNote?{label:`video_note`,sender:effectiveParams=>api.sendVideoNote(chatId,file,effectiveParams)}:{label:`video`,sender:effectiveParams=>api.sendVideo(chatId,file,effectiveParams)};if(kind===`audio`){let{useVoice}=resolveTelegramVoiceSend({wantsVoice:opts.asVoice===!0,contentType:media.contentType,fileName,logFallback:logVerbose});return useVoice?{label:`voice`,sender:effectiveParams=>api.sendVoice(chatId,file,effectiveParams)}:{label:`audio`,sender:effectiveParams=>api.sendAudio(chatId,file,effectiveParams)}}return{label:`document`,sender:effectiveParams=>api.sendDocument(chatId,file,effectiveParams)}})(),result=await sendMedia(mediaSender.label,mediaSender.sender),mediaMessageId=String(result?.message_id??`unknown`),resolvedChatId=String(result?.chat?.id??chatId);if(result?.message_id&&recordSentMessage(chatId,result.message_id),recordChannelActivity({channel:`telegram`,accountId:account.accountId,direction:`outbound`}),needsSeparateText&&followUpText){let textParams=hasThreadParams||replyMarkup?{...threadParams,...replyMarkup?{reply_markup:replyMarkup}:{}}:void 0,textRes=await sendTelegramText(followUpText,textParams);return{messageId:String(textRes?.message_id??mediaMessageId),chatId:resolvedChatId}}return{messageId:mediaMessageId,chatId:resolvedChatId}}if(!text||!text.trim())throw Error(`Message must be non-empty for Telegram sends`);let res=await sendTelegramText(text,hasThreadParams||replyMarkup?{...threadParams,...replyMarkup?{reply_markup:replyMarkup}:{}}:void 0,opts.plainText),messageId=String(res?.message_id??`unknown`);return res?.message_id&&recordSentMessage(chatId,res.message_id),recordChannelActivity({channel:`telegram`,accountId:account.accountId,direction:`outbound`}),{messageId,chatId:String(res?.chat?.id??chatId)}}async function reactMessageTelegram(chatIdInput,messageIdInput,emoji,opts={}){let{cfg,account,api}=resolveTelegramApiContext(opts),chatId=normalizeChatId(String(chatIdInput)),messageId=normalizeMessageId(messageIdInput),requestWithDiag=createTelegramRequestWithDiag({cfg,account,retry:opts.retry,verbose:opts.verbose,shouldRetry:err=>isRecoverableTelegramNetworkError(err,{context:`send`})}),remove=opts.remove===!0,trimmedEmoji=emoji.trim(),reactions=remove||!trimmedEmoji?[]:[{type:`emoji`,emoji:trimmedEmoji}];if(typeof api.setMessageReaction!=`function`)throw Error(`Telegram reactions are unavailable in this bot API.`);try{await requestWithDiag(()=>api.setMessageReaction(chatId,messageId,reactions),`reaction`)}catch(err){let msg=err instanceof Error?err.message:String(err);if(/REACTION_INVALID/i.test(msg))return{ok:!1,warning:`Reaction unavailable: ${trimmedEmoji}`};throw err}return{ok:!0}}async function deleteMessageTelegram(chatIdInput,messageIdInput,opts={}){let{cfg,account,api}=resolveTelegramApiContext(opts),chatId=normalizeChatId(String(chatIdInput)),messageId=normalizeMessageId(messageIdInput);return await createTelegramRequestWithDiag({cfg,account,retry:opts.retry,verbose:opts.verbose,shouldRetry:err=>isRecoverableTelegramNetworkError(err,{context:`send`})})(()=>api.deleteMessage(chatId,messageId),`deleteMessage`),logVerbose(`[telegram] Deleted message ${messageId} from chat ${chatId}`),{ok:!0}}async function editMessageTelegram(chatIdInput,messageIdInput,text,opts={}){let{cfg,account,api}=resolveTelegramApiContext({...opts,cfg:opts.cfg}),chatId=normalizeChatId(String(chatIdInput)),messageId=normalizeMessageId(messageIdInput),requestWithDiag=createTelegramRequestWithDiag({cfg,account,retry:opts.retry,verbose:opts.verbose}),requestWithEditShouldLog=(fn,label,shouldLog)=>requestWithDiag(fn,label,shouldLog?{shouldLog}:void 0),htmlText=renderTelegramHtmlText(text,{textMode:opts.textMode??`markdown`,tableMode:resolveMarkdownTableMode({cfg,channel:`telegram`,accountId:account.accountId})}),shouldTouchButtons=opts.buttons!==void 0,builtKeyboard=shouldTouchButtons?buildInlineKeyboard(opts.buttons):void 0,replyMarkup=shouldTouchButtons?builtKeyboard??{inline_keyboard:[]}:void 0,editParams={parse_mode:`HTML`};opts.linkPreview===!1&&(editParams.link_preview_options={is_disabled:!0}),replyMarkup!==void 0&&(editParams.reply_markup=replyMarkup);let plainParams={};opts.linkPreview===!1&&(plainParams.link_preview_options={is_disabled:!0}),replyMarkup!==void 0&&(plainParams.reply_markup=replyMarkup);try{await withTelegramHtmlParseFallback({label:`editMessage`,verbose:opts.verbose,requestHtml:retryLabel=>requestWithEditShouldLog(()=>api.editMessageText(chatId,messageId,htmlText,editParams),retryLabel,err=>!isTelegramMessageNotModifiedError(err)),requestPlain:retryLabel=>requestWithEditShouldLog(()=>Object.keys(plainParams).length>0?api.editMessageText(chatId,messageId,text,plainParams):api.editMessageText(chatId,messageId,text),retryLabel,plainErr=>!isTelegramMessageNotModifiedError(plainErr))})}catch(err){if(!isTelegramMessageNotModifiedError(err))throw err}return logVerbose(`[telegram] Edited message ${messageId} in chat ${chatId}`),{ok:!0,messageId:String(messageId),chatId}}function inferFilename(kind){switch(kind){case`image`:return`image.jpg`;case`video`:return`video.mp4`;case`audio`:return`audio.ogg`;default:return`file.bin`}}async function sendStickerTelegram(to,fileId,opts={}){if(!fileId?.trim())throw Error(`Telegram sticker file_id is required`);let{cfg,account,api}=resolveTelegramApiContext(opts),target=parseTelegramTarget(to),chatId=normalizeChatId(target.chatId),threadParams=buildTelegramThreadReplyParams({targetMessageThreadId:target.messageThreadId,messageThreadId:opts.messageThreadId,chatType:target.chatType,replyToMessageId:opts.replyToMessageId}),hasThreadParams=Object.keys(threadParams).length>0,requestWithChatNotFound=createRequestWithChatNotFound({requestWithDiag:createTelegramRequestWithDiag({cfg,account,retry:opts.retry,verbose:opts.verbose,useApiErrorLogging:!1}),chatId,input:to}),result=await withTelegramThreadFallback(hasThreadParams?threadParams:void 0,`sticker`,opts.verbose,async(effectiveParams,label)=>requestWithChatNotFound(()=>api.sendSticker(chatId,fileId.trim(),effectiveParams),label)),messageId=String(result?.message_id??`unknown`),resolvedChatId=String(result?.chat?.id??chatId);return result?.message_id&&recordSentMessage(chatId,result.message_id),recordChannelActivity({channel:`telegram`,accountId:account.accountId,direction:`outbound`}),{messageId,chatId:resolvedChatId}}async function sendPollTelegram(to,poll,opts={}){let{cfg,account,api}=resolveTelegramApiContext(opts),target=parseTelegramTarget(to),chatId=normalizeChatId(target.chatId),normalizedPoll=normalizePollInput(poll,{maxOptions:10}),threadParams=buildTelegramThreadReplyParams({targetMessageThreadId:target.messageThreadId,messageThreadId:opts.messageThreadId,chatType:target.chatType,replyToMessageId:opts.replyToMessageId}),pollOptions=normalizedPoll.options,requestWithChatNotFound=createRequestWithChatNotFound({requestWithDiag:createTelegramRequestWithDiag({cfg,account,retry:opts.retry,verbose:opts.verbose,shouldRetry:err=>isRecoverableTelegramNetworkError(err,{context:`send`})}),chatId,input:to}),durationSeconds=normalizedPoll.durationSeconds;if(durationSeconds===void 0&&normalizedPoll.durationHours!==void 0)throw Error(`Telegram poll durationHours is not supported. Use durationSeconds (5-600) instead.`);if(durationSeconds!==void 0&&(durationSeconds<5||durationSeconds>600))throw Error(`Telegram poll durationSeconds must be between 5 and 600`);let result=await withTelegramThreadFallback({allows_multiple_answers:normalizedPoll.maxSelections>1,is_anonymous:opts.isAnonymous??!0,...durationSeconds===void 0?{}:{open_period:durationSeconds},...Object.keys(threadParams).length>0?threadParams:{},...opts.silent===!0?{disable_notification:!0}:{}},`poll`,opts.verbose,async(effectiveParams,label)=>requestWithChatNotFound(()=>api.sendPoll(chatId,normalizedPoll.question,pollOptions,effectiveParams),label)),messageId=String(result?.message_id??`unknown`),resolvedChatId=String(result?.chat?.id??chatId),pollId=result?.poll?.id;return result?.message_id&&recordSentMessage(chatId,result.message_id),recordChannelActivity({channel:`telegram`,accountId:account.accountId,direction:`outbound`}),{messageId,chatId:resolvedChatId,pollId}}async function createForumTopicTelegram(chatId,name,opts={}){if(!name?.trim())throw Error(`Forum topic name is required`);let trimmedName=name.trim();if(trimmedName.length>128)throw Error(`Forum topic name must be 128 characters or fewer`);let cfg=loadConfig(),account=resolveTelegramAccount({cfg,accountId:opts.accountId}),token=resolveToken(opts.token,account),normalizedChatId=normalizeChatId(parseTelegramTarget(chatId).chatId),client=resolveTelegramClientOptions(account),api=opts.api??new Bot(token,client?{client}:void 0).api,request=createTelegramRetryRunner({retry:opts.retry,configRetry:account.config.retry,verbose:opts.verbose,shouldRetry:err=>isRecoverableTelegramNetworkError(err,{context:`send`})}),logHttpError=createTelegramHttpLogger(cfg),requestWithDiag=(fn,label)=>withTelegramApiErrorLogging({operation:label??`request`,fn:()=>request(fn,label)}).catch(err=>{throw logHttpError(label??`request`,err),err}),extra={};opts.iconColor!=null&&(extra.icon_color=opts.iconColor),opts.iconCustomEmojiId?.trim()&&(extra.icon_custom_emoji_id=opts.iconCustomEmojiId.trim());let hasExtra=Object.keys(extra).length>0,result=await requestWithDiag(()=>api.createForumTopic(normalizedChatId,trimmedName,hasExtra?extra:void 0),`createForumTopic`),topicId=result.message_thread_id;return recordChannelActivity({channel:`telegram`,accountId:account.accountId,direction:`outbound`}),{topicId,name:result.name??trimmedName,chatId:normalizedChatId}}export{hasBotMention as A,normalizeAllowFromWithStore as B,buildTelegramGroupPeerId as C,describeReplyTarget as D,buildTypingThreadParams as E,resolveTelegramReplyId as F,isVoiceCompatibleAudio as G,formatLocationText as H,resolveTelegramStreamMode as I,parseTelegramTarget as K,resolveTelegramThreadSpec as L,resolveTelegramForumThreadId as M,resolveTelegramGroupAllowFromContext as N,expandTextLinks as O,resolveTelegramMediaPlaceholder as P,firstDefined as R,buildTelegramGroupFrom as S,buildTelegramThreadParams as T,toLocationContext as U,resolveSenderAllowMatch as V,withTelegramApiErrorLogging as W,resolveTelegramFetch as _,reactMessageTelegram as a,buildSenderLabel as b,sendStickerTelegram as c,makeProxyFetch as d,isRecoverableTelegramNetworkError as f,wrapFileReferencesInHtml as g,renderTelegramHtmlText as h,editMessageTelegram as i,normalizeForwardedContext as j,extractTelegramLocation as k,resolveTelegramVoiceSend as l,markdownToTelegramHtml as m,createForumTopicTelegram as n,sendMessageTelegram as o,markdownToTelegramChunks as p,resolveTelegramTargetChatType as q,deleteMessageTelegram as r,sendPollTelegram as s,buildInlineKeyboard as t,wasSentByBot as u,splitTelegramCaption as v,buildTelegramParentPeer as w,buildSenderName as x,buildGroupLabel as y,isSenderAllowed as z};
@@ -1 +1 @@
1
- import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./bindings-DR59065T.js";import"./fetch-guard-8mwt3-hm.js";import"./fetch-BuOLY9KP.js";import{o as sendMessageTelegram}from"./send-CBBziNqM.js";import"./retry-DlVhg5qu.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./fetch-DnVtDecb.js";import"./channel-activity-CCNDbdD3.js";import"./pairing-store-CbvMJhD3.js";export{sendMessageTelegram};
1
+ import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./bindings-DR59065T.js";import"./fetch-guard-8mwt3-hm.js";import"./fetch-BuOLY9KP.js";import{o as sendMessageTelegram}from"./send-BxoVLIy1.js";import"./retry-DlVhg5qu.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./fetch-DnVtDecb.js";import"./channel-activity-CCNDbdD3.js";import"./pairing-store-ti3FEkmr.js";export{sendMessageTelegram};
@@ -1 +1 @@
1
- import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./bindings-DR59065T.js";import"./fetch-guard-8mwt3-hm.js";import"./fetch-BuOLY9KP.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./outbound-attachment-C7wByQO5.js";import"./tables-ERcoWFDp.js";import{t as sendMessageIMessage}from"./send-BJDzwYJN.js";export{sendMessageIMessage};
1
+ import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./bindings-DR59065T.js";import"./fetch-guard-8mwt3-hm.js";import"./fetch-BuOLY9KP.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./outbound-attachment-C7wByQO5.js";import"./tables-ERcoWFDp.js";import{t as sendMessageIMessage}from"./send-l3ge4wkC.js";export{sendMessageIMessage};
@@ -1 +1 @@
1
- import{m as normalizeE164,y as resolveUserPath}from"./utils-BP60e80M.js";import{r as loadConfig}from"./io-CohJffHG.js";import{v as mediaKindFromMime}from"./image-ops-CotJhwRR.js";import{t as resolveIMessageAccount}from"./accounts-DcoaLXKI.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-B1Rx8hv6.js";import{t as resolveOutboundAttachmentFromUrl}from"./outbound-attachment-BaTYE4qp.js";import{t as convertMarkdownTables}from"./tables-CojSfTth.js";import{spawn}from"node:child_process";import{createInterface}from"node:readline";function isAllowedParsedChatSender(params){let allowFrom=params.allowFrom.map(entry=>String(entry).trim());if(allowFrom.length===0||allowFrom.includes(`*`))return!0;let senderNormalized=params.normalizeSender(params.sender),chatId=params.chatId??void 0,chatGuid=params.chatGuid?.trim(),chatIdentifier=params.chatIdentifier?.trim();for(let entry of allowFrom){if(!entry)continue;let parsed=params.parseAllowTarget(entry);if(parsed.kind===`chat_id`&&chatId!==void 0){if(parsed.chatId===chatId)return!0}else if(parsed.kind===`chat_guid`&&chatGuid){if(parsed.chatGuid===chatGuid)return!0}else if(parsed.kind===`chat_identifier`&&chatIdentifier){if(parsed.chatIdentifier===chatIdentifier)return!0}else if(parsed.kind===`handle`&&senderNormalized&&parsed.handle===senderNormalized)return!0}return!1}function stripPrefix(value,prefix){return value.slice(prefix.length).trim()}function resolveServicePrefixedTarget(params){for(let{prefix,service}of params.servicePrefixes){if(!params.lower.startsWith(prefix))continue;let remainder=stripPrefix(params.trimmed,prefix);if(!remainder)throw Error(`${prefix} target is required`);let remainderLower=remainder.toLowerCase();return params.isChatTarget(remainderLower)?params.parseTarget(remainder):{kind:`handle`,to:remainder,service}}return null}function parseChatTargetPrefixesOrThrow(params){for(let prefix of params.chatIdPrefixes)if(params.lower.startsWith(prefix)){let value=stripPrefix(params.trimmed,prefix),chatId=Number.parseInt(value,10);if(!Number.isFinite(chatId))throw Error(`Invalid chat_id: ${value}`);return{kind:`chat_id`,chatId}}for(let prefix of params.chatGuidPrefixes)if(params.lower.startsWith(prefix)){let value=stripPrefix(params.trimmed,prefix);if(!value)throw Error(`chat_guid is required`);return{kind:`chat_guid`,chatGuid:value}}for(let prefix of params.chatIdentifierPrefixes)if(params.lower.startsWith(prefix)){let value=stripPrefix(params.trimmed,prefix);if(!value)throw Error(`chat_identifier is required`);return{kind:`chat_identifier`,chatIdentifier:value}}return null}function resolveServicePrefixedAllowTarget(params){for(let{prefix}of params.servicePrefixes){if(!params.lower.startsWith(prefix))continue;let remainder=stripPrefix(params.trimmed,prefix);return remainder?params.parseAllowTarget(remainder):{kind:`handle`,handle:``}}return null}function parseChatAllowTargetPrefixes(params){for(let prefix of params.chatIdPrefixes)if(params.lower.startsWith(prefix)){let value=stripPrefix(params.trimmed,prefix),chatId=Number.parseInt(value,10);if(Number.isFinite(chatId))return{kind:`chat_id`,chatId}}for(let prefix of params.chatGuidPrefixes)if(params.lower.startsWith(prefix)){let value=stripPrefix(params.trimmed,prefix);if(value)return{kind:`chat_guid`,chatGuid:value}}for(let prefix of params.chatIdentifierPrefixes)if(params.lower.startsWith(prefix)){let value=stripPrefix(params.trimmed,prefix);if(value)return{kind:`chat_identifier`,chatIdentifier:value}}return null}const CHAT_ID_PREFIXES=[`chat_id:`,`chatid:`,`chat:`],CHAT_GUID_PREFIXES=[`chat_guid:`,`chatguid:`,`guid:`],CHAT_IDENTIFIER_PREFIXES=[`chat_identifier:`,`chatidentifier:`,`chatident:`],SERVICE_PREFIXES=[{prefix:`imessage:`,service:`imessage`},{prefix:`sms:`,service:`sms`},{prefix:`auto:`,service:`auto`}];function normalizeIMessageHandle(raw){let trimmed=raw.trim();if(!trimmed)return``;let lowered=trimmed.toLowerCase();if(lowered.startsWith(`imessage:`))return normalizeIMessageHandle(trimmed.slice(9));if(lowered.startsWith(`sms:`))return normalizeIMessageHandle(trimmed.slice(4));if(lowered.startsWith(`auto:`))return normalizeIMessageHandle(trimmed.slice(5));for(let prefix of CHAT_ID_PREFIXES)if(lowered.startsWith(prefix))return`chat_id:${trimmed.slice(prefix.length).trim()}`;for(let prefix of CHAT_GUID_PREFIXES)if(lowered.startsWith(prefix))return`chat_guid:${trimmed.slice(prefix.length).trim()}`;for(let prefix of CHAT_IDENTIFIER_PREFIXES)if(lowered.startsWith(prefix))return`chat_identifier:${trimmed.slice(prefix.length).trim()}`;return trimmed.includes(`@`)?trimmed.toLowerCase():normalizeE164(trimmed)||trimmed.replace(/\s+/g,``)}function parseIMessageTarget(raw){let trimmed=raw.trim();if(!trimmed)throw Error(`iMessage target is required`);let lower=trimmed.toLowerCase();return resolveServicePrefixedTarget({trimmed,lower,servicePrefixes:SERVICE_PREFIXES,isChatTarget:remainderLower=>CHAT_ID_PREFIXES.some(p=>remainderLower.startsWith(p))||CHAT_GUID_PREFIXES.some(p=>remainderLower.startsWith(p))||CHAT_IDENTIFIER_PREFIXES.some(p=>remainderLower.startsWith(p)),parseTarget:parseIMessageTarget})||parseChatTargetPrefixesOrThrow({trimmed,lower,chatIdPrefixes:CHAT_ID_PREFIXES,chatGuidPrefixes:CHAT_GUID_PREFIXES,chatIdentifierPrefixes:CHAT_IDENTIFIER_PREFIXES})||{kind:`handle`,to:trimmed,service:`auto`}}function parseIMessageAllowTarget(raw){let trimmed=raw.trim();if(!trimmed)return{kind:`handle`,handle:``};let lower=trimmed.toLowerCase();return resolveServicePrefixedAllowTarget({trimmed,lower,servicePrefixes:SERVICE_PREFIXES,parseAllowTarget:parseIMessageAllowTarget})||parseChatAllowTargetPrefixes({trimmed,lower,chatIdPrefixes:CHAT_ID_PREFIXES,chatGuidPrefixes:CHAT_GUID_PREFIXES,chatIdentifierPrefixes:CHAT_IDENTIFIER_PREFIXES})||{kind:`handle`,handle:normalizeIMessageHandle(trimmed)}}function isAllowedIMessageSender(params){return isAllowedParsedChatSender({allowFrom:params.allowFrom,sender:params.sender,chatId:params.chatId,chatGuid:params.chatGuid,chatIdentifier:params.chatIdentifier,normalizeSender:normalizeIMessageHandle,parseAllowTarget:parseIMessageAllowTarget})}function formatIMessageChatTarget(chatId){return!chatId||!Number.isFinite(chatId)?``:`chat_id:${chatId}`}const DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS=1e4;function isTestEnv(){return!!process.env.VITEST?.trim().toLowerCase()}var IMessageRpcClient=class{constructor(opts={}){this.pending=new Map,this.closedResolve=null,this.child=null,this.reader=null,this.nextId=1,this.cliPath=opts.cliPath?.trim()||`imsg`,this.dbPath=opts.dbPath?.trim()?resolveUserPath(opts.dbPath):void 0,this.runtime=opts.runtime,this.onNotification=opts.onNotification,this.closed=new Promise(resolve=>{this.closedResolve=resolve})}async start(){if(this.child)return;if(isTestEnv())throw Error(`Refusing to start imsg rpc in test environment; mock iMessage RPC client`);let args=[`rpc`];this.dbPath&&args.push(`--db`,this.dbPath);let child=spawn(this.cliPath,args,{stdio:[`pipe`,`pipe`,`pipe`]});this.child=child,this.reader=createInterface({input:child.stdout}),this.reader.on(`line`,line=>{let trimmed=line.trim();trimmed&&this.handleLine(trimmed)}),child.stderr?.on(`data`,chunk=>{let lines=chunk.toString().split(/\r?\n/);for(let line of lines)line.trim()&&this.runtime?.error?.(`imsg rpc: ${line.trim()}`)}),child.on(`error`,err=>{this.failAll(err instanceof Error?err:Error(String(err))),this.closedResolve?.()}),child.on(`close`,(code,signal)=>{if(code!==0&&code!==null){let reason=signal?`signal ${signal}`:`code ${code}`;this.failAll(Error(`imsg rpc exited (${reason})`))}else this.failAll(Error(`imsg rpc closed`));this.closedResolve?.()})}async stop(){if(!this.child)return;this.reader?.close(),this.reader=null,this.child.stdin?.end();let child=this.child;this.child=null,await Promise.race([this.closed,new Promise(resolve=>{setTimeout(()=>{child.killed||child.kill(`SIGTERM`),resolve()},500)})])}async waitForClose(){await this.closed}async request(method,params,opts){if(!this.child||!this.child.stdin)throw Error(`imsg rpc not running`);let id=this.nextId++,payload={jsonrpc:`2.0`,id,method,params:params??{}},line=`${JSON.stringify(payload)}\n`,timeoutMs=opts?.timeoutMs??DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS,response=new Promise((resolve,reject)=>{let key=String(id),timer=timeoutMs>0?setTimeout(()=>{this.pending.delete(key),reject(Error(`imsg rpc timeout (${method})`))},timeoutMs):void 0;this.pending.set(key,{resolve:value=>resolve(value),reject,timer})});return this.child.stdin.write(line),await response}handleLine(line){let parsed;try{parsed=JSON.parse(line)}catch(err){let detail=err instanceof Error?err.message:String(err);this.runtime?.error?.(`imsg rpc: failed to parse ${line}: ${detail}`);return}if(parsed.id!==void 0&&parsed.id!==null){let key=String(parsed.id),pending=this.pending.get(key);if(!pending)return;if(pending.timer&&clearTimeout(pending.timer),this.pending.delete(key),parsed.error){let baseMessage=parsed.error.message??`imsg rpc error`,details=parsed.error.data,code=parsed.error.code,suffixes=[];if(typeof code==`number`&&suffixes.push(`code=${code}`),details!==void 0){let detailText=typeof details==`string`?details:JSON.stringify(details,null,2);detailText&&suffixes.push(detailText)}let msg=suffixes.length>0?`${baseMessage}: ${suffixes.join(` `)}`:baseMessage;pending.reject(Error(msg));return}pending.resolve(parsed.result);return}parsed.method&&this.onNotification?.({method:parsed.method,params:parsed.params})}failAll(err){for(let[key,pending]of this.pending.entries())pending.timer&&clearTimeout(pending.timer),pending.reject(err),this.pending.delete(key)}};async function createIMessageRpcClient(opts={}){let client=new IMessageRpcClient(opts);return await client.start(),client}const LEADING_REPLY_TAG_RE=/^\s*\[\[\s*reply_to\s*:\s*([^\]\n]+)\s*\]\]\s*/i;function stripUnsafeReplyTagChars(value){let next=``;for(let ch of value){let code=ch.charCodeAt(0);code>=0&&code<=31||code===127||ch===`[`||ch===`]`||(next+=ch)}return next}function sanitizeReplyToId(rawReplyToId){let trimmed=rawReplyToId?.trim();if(!trimmed)return;let sanitized=stripUnsafeReplyTagChars(trimmed).trim();if(sanitized)return sanitized.length>256?sanitized.slice(0,256):sanitized}function prependReplyTagIfNeeded(message,replyToId){let resolvedReplyToId=sanitizeReplyToId(replyToId);if(!resolvedReplyToId)return message;let replyTag=`[[reply_to:${resolvedReplyToId}]]`,existingLeadingTag=message.match(LEADING_REPLY_TAG_RE);if(existingLeadingTag){let remainder=message.slice(existingLeadingTag[0].length).trimStart();return remainder?`${replyTag} ${remainder}`:replyTag}let trimmedMessage=message.trimStart();return trimmedMessage?`${replyTag} ${trimmedMessage}`:replyTag}function resolveMessageId(result){if(!result)return null;let raw=typeof result.messageId==`string`&&result.messageId.trim()||typeof result.message_id==`string`&&result.message_id.trim()||typeof result.id==`string`&&result.id.trim()||typeof result.guid==`string`&&result.guid.trim()||(typeof result.message_id==`number`?String(result.message_id):null)||(typeof result.id==`number`?String(result.id):null);return raw?String(raw).trim():null}async function sendMessageIMessage(to,text,opts={}){let cfg=opts.config??loadConfig(),account=opts.account??resolveIMessageAccount({cfg,accountId:opts.accountId}),cliPath=opts.cliPath?.trim()||account.config.cliPath?.trim()||`imsg`,dbPath=opts.dbPath?.trim()||account.config.dbPath?.trim(),target=parseIMessageTarget(opts.chatId?formatIMessageChatTarget(opts.chatId):to),service=opts.service??(target.kind===`handle`?target.service:void 0)??account.config.service,region=opts.region?.trim()||account.config.region?.trim()||`US`,maxBytes=typeof opts.maxBytes==`number`?opts.maxBytes:typeof account.config.mediaMaxMb==`number`?account.config.mediaMaxMb*1024*1024:16*1024*1024,message=text??``,filePath;if(opts.mediaUrl?.trim()){let resolved=await(opts.resolveAttachmentImpl??resolveOutboundAttachmentFromUrl)(opts.mediaUrl.trim(),maxBytes,{localRoots:opts.mediaLocalRoots});if(filePath=resolved.path,!message.trim()){let kind=mediaKindFromMime(resolved.contentType??void 0);kind&&(message=kind===`image`?`<media:image>`:`<media:${kind}>`)}}if(!message.trim()&&!filePath)throw Error(`iMessage send requires text or media`);if(message.trim()){let tableMode=resolveMarkdownTableMode({cfg,channel:`imessage`,accountId:account.accountId});message=convertMarkdownTables(message,tableMode)}message=prependReplyTagIfNeeded(message,opts.replyToId);let params={text:message,service:service||`auto`,region};filePath&&(params.file=filePath),target.kind===`chat_id`?params.chat_id=target.chatId:target.kind===`chat_guid`?params.chat_guid=target.chatGuid:target.kind===`chat_identifier`?params.chat_identifier=target.chatIdentifier:params.to=target.to;let client=opts.client??(opts.createClient?await opts.createClient({cliPath,dbPath}):await createIMessageRpcClient({cliPath,dbPath})),shouldClose=!opts.client;try{let result=await client.request(`send`,params,{timeoutMs:opts.timeoutMs});return{messageId:resolveMessageId(result)??(result?.ok?`ok`:`unknown`)}}finally{shouldClose&&await client.stop()}}export{isAllowedIMessageSender as a,formatIMessageChatTarget as i,createIMessageRpcClient as n,normalizeIMessageHandle as o,DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS as r,parseIMessageTarget as s,sendMessageIMessage as t};
1
+ import{m as normalizeE164,y as resolveUserPath}from"./utils-BP60e80M.js";import{r as loadConfig}from"./io-D9hC2aG0.js";import{v as mediaKindFromMime}from"./image-ops-CotJhwRR.js";import{t as resolveIMessageAccount}from"./accounts-DcoaLXKI.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-B1Rx8hv6.js";import{t as resolveOutboundAttachmentFromUrl}from"./outbound-attachment-BaTYE4qp.js";import{t as convertMarkdownTables}from"./tables-CojSfTth.js";import{spawn}from"node:child_process";import{createInterface}from"node:readline";function isAllowedParsedChatSender(params){let allowFrom=params.allowFrom.map(entry=>String(entry).trim());if(allowFrom.length===0||allowFrom.includes(`*`))return!0;let senderNormalized=params.normalizeSender(params.sender),chatId=params.chatId??void 0,chatGuid=params.chatGuid?.trim(),chatIdentifier=params.chatIdentifier?.trim();for(let entry of allowFrom){if(!entry)continue;let parsed=params.parseAllowTarget(entry);if(parsed.kind===`chat_id`&&chatId!==void 0){if(parsed.chatId===chatId)return!0}else if(parsed.kind===`chat_guid`&&chatGuid){if(parsed.chatGuid===chatGuid)return!0}else if(parsed.kind===`chat_identifier`&&chatIdentifier){if(parsed.chatIdentifier===chatIdentifier)return!0}else if(parsed.kind===`handle`&&senderNormalized&&parsed.handle===senderNormalized)return!0}return!1}function stripPrefix(value,prefix){return value.slice(prefix.length).trim()}function resolveServicePrefixedTarget(params){for(let{prefix,service}of params.servicePrefixes){if(!params.lower.startsWith(prefix))continue;let remainder=stripPrefix(params.trimmed,prefix);if(!remainder)throw Error(`${prefix} target is required`);let remainderLower=remainder.toLowerCase();return params.isChatTarget(remainderLower)?params.parseTarget(remainder):{kind:`handle`,to:remainder,service}}return null}function parseChatTargetPrefixesOrThrow(params){for(let prefix of params.chatIdPrefixes)if(params.lower.startsWith(prefix)){let value=stripPrefix(params.trimmed,prefix),chatId=Number.parseInt(value,10);if(!Number.isFinite(chatId))throw Error(`Invalid chat_id: ${value}`);return{kind:`chat_id`,chatId}}for(let prefix of params.chatGuidPrefixes)if(params.lower.startsWith(prefix)){let value=stripPrefix(params.trimmed,prefix);if(!value)throw Error(`chat_guid is required`);return{kind:`chat_guid`,chatGuid:value}}for(let prefix of params.chatIdentifierPrefixes)if(params.lower.startsWith(prefix)){let value=stripPrefix(params.trimmed,prefix);if(!value)throw Error(`chat_identifier is required`);return{kind:`chat_identifier`,chatIdentifier:value}}return null}function resolveServicePrefixedAllowTarget(params){for(let{prefix}of params.servicePrefixes){if(!params.lower.startsWith(prefix))continue;let remainder=stripPrefix(params.trimmed,prefix);return remainder?params.parseAllowTarget(remainder):{kind:`handle`,handle:``}}return null}function parseChatAllowTargetPrefixes(params){for(let prefix of params.chatIdPrefixes)if(params.lower.startsWith(prefix)){let value=stripPrefix(params.trimmed,prefix),chatId=Number.parseInt(value,10);if(Number.isFinite(chatId))return{kind:`chat_id`,chatId}}for(let prefix of params.chatGuidPrefixes)if(params.lower.startsWith(prefix)){let value=stripPrefix(params.trimmed,prefix);if(value)return{kind:`chat_guid`,chatGuid:value}}for(let prefix of params.chatIdentifierPrefixes)if(params.lower.startsWith(prefix)){let value=stripPrefix(params.trimmed,prefix);if(value)return{kind:`chat_identifier`,chatIdentifier:value}}return null}const CHAT_ID_PREFIXES=[`chat_id:`,`chatid:`,`chat:`],CHAT_GUID_PREFIXES=[`chat_guid:`,`chatguid:`,`guid:`],CHAT_IDENTIFIER_PREFIXES=[`chat_identifier:`,`chatidentifier:`,`chatident:`],SERVICE_PREFIXES=[{prefix:`imessage:`,service:`imessage`},{prefix:`sms:`,service:`sms`},{prefix:`auto:`,service:`auto`}];function normalizeIMessageHandle(raw){let trimmed=raw.trim();if(!trimmed)return``;let lowered=trimmed.toLowerCase();if(lowered.startsWith(`imessage:`))return normalizeIMessageHandle(trimmed.slice(9));if(lowered.startsWith(`sms:`))return normalizeIMessageHandle(trimmed.slice(4));if(lowered.startsWith(`auto:`))return normalizeIMessageHandle(trimmed.slice(5));for(let prefix of CHAT_ID_PREFIXES)if(lowered.startsWith(prefix))return`chat_id:${trimmed.slice(prefix.length).trim()}`;for(let prefix of CHAT_GUID_PREFIXES)if(lowered.startsWith(prefix))return`chat_guid:${trimmed.slice(prefix.length).trim()}`;for(let prefix of CHAT_IDENTIFIER_PREFIXES)if(lowered.startsWith(prefix))return`chat_identifier:${trimmed.slice(prefix.length).trim()}`;return trimmed.includes(`@`)?trimmed.toLowerCase():normalizeE164(trimmed)||trimmed.replace(/\s+/g,``)}function parseIMessageTarget(raw){let trimmed=raw.trim();if(!trimmed)throw Error(`iMessage target is required`);let lower=trimmed.toLowerCase();return resolveServicePrefixedTarget({trimmed,lower,servicePrefixes:SERVICE_PREFIXES,isChatTarget:remainderLower=>CHAT_ID_PREFIXES.some(p=>remainderLower.startsWith(p))||CHAT_GUID_PREFIXES.some(p=>remainderLower.startsWith(p))||CHAT_IDENTIFIER_PREFIXES.some(p=>remainderLower.startsWith(p)),parseTarget:parseIMessageTarget})||parseChatTargetPrefixesOrThrow({trimmed,lower,chatIdPrefixes:CHAT_ID_PREFIXES,chatGuidPrefixes:CHAT_GUID_PREFIXES,chatIdentifierPrefixes:CHAT_IDENTIFIER_PREFIXES})||{kind:`handle`,to:trimmed,service:`auto`}}function parseIMessageAllowTarget(raw){let trimmed=raw.trim();if(!trimmed)return{kind:`handle`,handle:``};let lower=trimmed.toLowerCase();return resolveServicePrefixedAllowTarget({trimmed,lower,servicePrefixes:SERVICE_PREFIXES,parseAllowTarget:parseIMessageAllowTarget})||parseChatAllowTargetPrefixes({trimmed,lower,chatIdPrefixes:CHAT_ID_PREFIXES,chatGuidPrefixes:CHAT_GUID_PREFIXES,chatIdentifierPrefixes:CHAT_IDENTIFIER_PREFIXES})||{kind:`handle`,handle:normalizeIMessageHandle(trimmed)}}function isAllowedIMessageSender(params){return isAllowedParsedChatSender({allowFrom:params.allowFrom,sender:params.sender,chatId:params.chatId,chatGuid:params.chatGuid,chatIdentifier:params.chatIdentifier,normalizeSender:normalizeIMessageHandle,parseAllowTarget:parseIMessageAllowTarget})}function formatIMessageChatTarget(chatId){return!chatId||!Number.isFinite(chatId)?``:`chat_id:${chatId}`}const DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS=1e4;function isTestEnv(){return!!process.env.VITEST?.trim().toLowerCase()}var IMessageRpcClient=class{constructor(opts={}){this.pending=new Map,this.closedResolve=null,this.child=null,this.reader=null,this.nextId=1,this.cliPath=opts.cliPath?.trim()||`imsg`,this.dbPath=opts.dbPath?.trim()?resolveUserPath(opts.dbPath):void 0,this.runtime=opts.runtime,this.onNotification=opts.onNotification,this.closed=new Promise(resolve=>{this.closedResolve=resolve})}async start(){if(this.child)return;if(isTestEnv())throw Error(`Refusing to start imsg rpc in test environment; mock iMessage RPC client`);let args=[`rpc`];this.dbPath&&args.push(`--db`,this.dbPath);let child=spawn(this.cliPath,args,{stdio:[`pipe`,`pipe`,`pipe`]});this.child=child,this.reader=createInterface({input:child.stdout}),this.reader.on(`line`,line=>{let trimmed=line.trim();trimmed&&this.handleLine(trimmed)}),child.stderr?.on(`data`,chunk=>{let lines=chunk.toString().split(/\r?\n/);for(let line of lines)line.trim()&&this.runtime?.error?.(`imsg rpc: ${line.trim()}`)}),child.on(`error`,err=>{this.failAll(err instanceof Error?err:Error(String(err))),this.closedResolve?.()}),child.on(`close`,(code,signal)=>{if(code!==0&&code!==null){let reason=signal?`signal ${signal}`:`code ${code}`;this.failAll(Error(`imsg rpc exited (${reason})`))}else this.failAll(Error(`imsg rpc closed`));this.closedResolve?.()})}async stop(){if(!this.child)return;this.reader?.close(),this.reader=null,this.child.stdin?.end();let child=this.child;this.child=null,await Promise.race([this.closed,new Promise(resolve=>{setTimeout(()=>{child.killed||child.kill(`SIGTERM`),resolve()},500)})])}async waitForClose(){await this.closed}async request(method,params,opts){if(!this.child||!this.child.stdin)throw Error(`imsg rpc not running`);let id=this.nextId++,payload={jsonrpc:`2.0`,id,method,params:params??{}},line=`${JSON.stringify(payload)}\n`,timeoutMs=opts?.timeoutMs??DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS,response=new Promise((resolve,reject)=>{let key=String(id),timer=timeoutMs>0?setTimeout(()=>{this.pending.delete(key),reject(Error(`imsg rpc timeout (${method})`))},timeoutMs):void 0;this.pending.set(key,{resolve:value=>resolve(value),reject,timer})});return this.child.stdin.write(line),await response}handleLine(line){let parsed;try{parsed=JSON.parse(line)}catch(err){let detail=err instanceof Error?err.message:String(err);this.runtime?.error?.(`imsg rpc: failed to parse ${line}: ${detail}`);return}if(parsed.id!==void 0&&parsed.id!==null){let key=String(parsed.id),pending=this.pending.get(key);if(!pending)return;if(pending.timer&&clearTimeout(pending.timer),this.pending.delete(key),parsed.error){let baseMessage=parsed.error.message??`imsg rpc error`,details=parsed.error.data,code=parsed.error.code,suffixes=[];if(typeof code==`number`&&suffixes.push(`code=${code}`),details!==void 0){let detailText=typeof details==`string`?details:JSON.stringify(details,null,2);detailText&&suffixes.push(detailText)}let msg=suffixes.length>0?`${baseMessage}: ${suffixes.join(` `)}`:baseMessage;pending.reject(Error(msg));return}pending.resolve(parsed.result);return}parsed.method&&this.onNotification?.({method:parsed.method,params:parsed.params})}failAll(err){for(let[key,pending]of this.pending.entries())pending.timer&&clearTimeout(pending.timer),pending.reject(err),this.pending.delete(key)}};async function createIMessageRpcClient(opts={}){let client=new IMessageRpcClient(opts);return await client.start(),client}const LEADING_REPLY_TAG_RE=/^\s*\[\[\s*reply_to\s*:\s*([^\]\n]+)\s*\]\]\s*/i;function stripUnsafeReplyTagChars(value){let next=``;for(let ch of value){let code=ch.charCodeAt(0);code>=0&&code<=31||code===127||ch===`[`||ch===`]`||(next+=ch)}return next}function sanitizeReplyToId(rawReplyToId){let trimmed=rawReplyToId?.trim();if(!trimmed)return;let sanitized=stripUnsafeReplyTagChars(trimmed).trim();if(sanitized)return sanitized.length>256?sanitized.slice(0,256):sanitized}function prependReplyTagIfNeeded(message,replyToId){let resolvedReplyToId=sanitizeReplyToId(replyToId);if(!resolvedReplyToId)return message;let replyTag=`[[reply_to:${resolvedReplyToId}]]`,existingLeadingTag=message.match(LEADING_REPLY_TAG_RE);if(existingLeadingTag){let remainder=message.slice(existingLeadingTag[0].length).trimStart();return remainder?`${replyTag} ${remainder}`:replyTag}let trimmedMessage=message.trimStart();return trimmedMessage?`${replyTag} ${trimmedMessage}`:replyTag}function resolveMessageId(result){if(!result)return null;let raw=typeof result.messageId==`string`&&result.messageId.trim()||typeof result.message_id==`string`&&result.message_id.trim()||typeof result.id==`string`&&result.id.trim()||typeof result.guid==`string`&&result.guid.trim()||(typeof result.message_id==`number`?String(result.message_id):null)||(typeof result.id==`number`?String(result.id):null);return raw?String(raw).trim():null}async function sendMessageIMessage(to,text,opts={}){let cfg=opts.config??loadConfig(),account=opts.account??resolveIMessageAccount({cfg,accountId:opts.accountId}),cliPath=opts.cliPath?.trim()||account.config.cliPath?.trim()||`imsg`,dbPath=opts.dbPath?.trim()||account.config.dbPath?.trim(),target=parseIMessageTarget(opts.chatId?formatIMessageChatTarget(opts.chatId):to),service=opts.service??(target.kind===`handle`?target.service:void 0)??account.config.service,region=opts.region?.trim()||account.config.region?.trim()||`US`,maxBytes=typeof opts.maxBytes==`number`?opts.maxBytes:typeof account.config.mediaMaxMb==`number`?account.config.mediaMaxMb*1024*1024:16*1024*1024,message=text??``,filePath;if(opts.mediaUrl?.trim()){let resolved=await(opts.resolveAttachmentImpl??resolveOutboundAttachmentFromUrl)(opts.mediaUrl.trim(),maxBytes,{localRoots:opts.mediaLocalRoots});if(filePath=resolved.path,!message.trim()){let kind=mediaKindFromMime(resolved.contentType??void 0);kind&&(message=kind===`image`?`<media:image>`:`<media:${kind}>`)}}if(!message.trim()&&!filePath)throw Error(`iMessage send requires text or media`);if(message.trim()){let tableMode=resolveMarkdownTableMode({cfg,channel:`imessage`,accountId:account.accountId});message=convertMarkdownTables(message,tableMode)}message=prependReplyTagIfNeeded(message,opts.replyToId);let params={text:message,service:service||`auto`,region};filePath&&(params.file=filePath),target.kind===`chat_id`?params.chat_id=target.chatId:target.kind===`chat_guid`?params.chat_guid=target.chatGuid:target.kind===`chat_identifier`?params.chat_identifier=target.chatIdentifier:params.to=target.to;let client=opts.client??(opts.createClient?await opts.createClient({cliPath,dbPath}):await createIMessageRpcClient({cliPath,dbPath})),shouldClose=!opts.client;try{let result=await client.request(`send`,params,{timeoutMs:opts.timeoutMs});return{messageId:resolveMessageId(result)??(result?.ok?`ok`:`unknown`)}}finally{shouldClose&&await client.stop()}}export{isAllowedIMessageSender as a,formatIMessageChatTarget as i,createIMessageRpcClient as n,normalizeIMessageHandle as o,DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS as r,parseIMessageTarget as s,sendMessageIMessage as t};
@@ -1,4 +1,4 @@
1
- import{r as loadConfig}from"./io-3R_ZyUxB.js";import{t as resolvePreferredBuilderForceAgentsTmpDir}from"./tmp-builderforce-dir-CgcZDXhj.js";import{_ as maxBytesForKind,l as extensionForMime}from"./image-ops-C8IUQKjn.js";import{_ as resolveDiscordAccount,v as normalizeDiscordToken}from"./plugins-D5zP6ENo.js";import{a as requireTargetKind,i as parseTargetPrefixes,n as ensureTargetId,r as parseTargetMention,t as buildMessagingTarget}from"./targets-egOap37j.js";import{n as retryAsync,t as resolveRetryConfig}from"./retry-DlVhg5qu.js";import{i as chunkMarkdownTextWithMode,s as resolveChunkMode}from"./chunk-FCBlVOyo.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-P6uoUSFa.js";import{a as loadWebMedia,o as loadWebMediaRaw}from"./ir-5BNoIXZm.js";import{t as resolveFetch}from"./fetch-DnVtDecb.js";import{n as normalizePollInput,t as normalizePollDurationHours}from"./polls-IFZVG0cW.js";import{n as recordChannelActivity,r as createDiscordRetryRunner}from"./channel-activity-CCNDbdD3.js";import{t as convertMarkdownTables}from"./tables-ERcoWFDp.js";import path from"node:path";import crypto from"node:crypto";import fs from"node:fs/promises";import{execFile}from"node:child_process";import{promisify}from"node:util";import{ButtonStyle,ChannelType,MessageFlags,PermissionFlagsBits,Routes,TextInputStyle}from"discord-api-types/v10";import{Button,ChannelSelectMenu,CheckboxGroup,Container,Embed,File,Label,LinkButton,MediaGallery,MentionableSelectMenu,Modal,RadioGroup,RequestClient,RoleSelectMenu,Row,Section,Separator,StringSelectMenu,TextDisplay,TextInput,Thumbnail,UserSelectMenu,parseCustomId,serializePayload}from"@buape/carbon";import{PollLayoutType}from"discord-api-types/payloads/v10";function applyChannelMatchMeta(result,match){return match.matchKey&&match.matchSource&&(result.matchKey=match.matchKey,result.matchSource=match.matchSource),result}function resolveChannelMatchConfig(match,resolveEntry){return match.entry?applyChannelMatchMeta(resolveEntry(match.entry),match):null}function buildChannelKeyCandidates(...keys){let seen=new Set,candidates=[];for(let key of keys){if(typeof key!=`string`)continue;let trimmed=key.trim();!trimmed||seen.has(trimmed)||(seen.add(trimmed),candidates.push(trimmed))}return candidates}function resolveChannelEntryMatch(params){let entries=params.entries??{},match={};for(let key of params.keys)if(Object.prototype.hasOwnProperty.call(entries,key)){match.entry=entries[key],match.key=key;break}return params.wildcardKey&&Object.prototype.hasOwnProperty.call(entries,params.wildcardKey)&&(match.wildcardEntry=entries[params.wildcardKey],match.wildcardKey=params.wildcardKey),match}function resolveChannelEntryMatchWithFallback(params){let direct=resolveChannelEntryMatch({entries:params.entries,keys:params.keys,wildcardKey:params.wildcardKey});if(direct.entry&&direct.key)return{...direct,matchKey:direct.key,matchSource:`direct`};let normalizeKey=params.normalizeKey;if(normalizeKey){let normalizedKeys=params.keys.map(key=>normalizeKey(key)).filter(Boolean);if(normalizedKeys.length>0)for(let[entryKey,entry]of Object.entries(params.entries??{})){let normalizedEntry=normalizeKey(entryKey);if(normalizedEntry&&normalizedKeys.includes(normalizedEntry))return{...direct,entry,key:entryKey,matchKey:entryKey,matchSource:`direct`}}}let parentKeys=params.parentKeys??[];if(parentKeys.length>0){let parent=resolveChannelEntryMatch({entries:params.entries,keys:parentKeys});if(parent.entry&&parent.key)return{...direct,entry:parent.entry,key:parent.key,parentEntry:parent.entry,parentKey:parent.key,matchKey:parent.key,matchSource:`parent`};if(normalizeKey){let normalizedParentKeys=parentKeys.map(key=>normalizeKey(key)).filter(Boolean);if(normalizedParentKeys.length>0)for(let[entryKey,entry]of Object.entries(params.entries??{})){let normalizedEntry=normalizeKey(entryKey);if(normalizedEntry&&normalizedParentKeys.includes(normalizedEntry))return{...direct,entry,key:entryKey,parentEntry:entry,parentKey:entryKey,matchKey:entryKey,matchSource:`parent`}}}}return direct.wildcardEntry&&direct.wildcardKey?{...direct,entry:direct.wildcardEntry,key:direct.wildcardKey,matchKey:direct.wildcardKey,matchSource:`wildcard`}:direct}const DEFAULT_MAX_CHARS=2e3,FENCE_RE=/^( {0,3})(`{3,}|~{3,})(.*)$/;function countLines(text){return text?text.split(`
1
+ import{r as loadConfig}from"./io-BLBq4T2o.js";import{t as resolvePreferredBuilderForceAgentsTmpDir}from"./tmp-builderforce-dir-CgcZDXhj.js";import{_ as maxBytesForKind,l as extensionForMime}from"./image-ops-C8IUQKjn.js";import{_ as resolveDiscordAccount,v as normalizeDiscordToken}from"./plugins-D5zP6ENo.js";import{a as requireTargetKind,i as parseTargetPrefixes,n as ensureTargetId,r as parseTargetMention,t as buildMessagingTarget}from"./targets-egOap37j.js";import{n as retryAsync,t as resolveRetryConfig}from"./retry-DlVhg5qu.js";import{i as chunkMarkdownTextWithMode,s as resolveChunkMode}from"./chunk-FCBlVOyo.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-P6uoUSFa.js";import{a as loadWebMedia,o as loadWebMediaRaw}from"./ir-5BNoIXZm.js";import{t as resolveFetch}from"./fetch-DnVtDecb.js";import{n as normalizePollInput,t as normalizePollDurationHours}from"./polls-IFZVG0cW.js";import{n as recordChannelActivity,r as createDiscordRetryRunner}from"./channel-activity-CCNDbdD3.js";import{t as convertMarkdownTables}from"./tables-ERcoWFDp.js";import path from"node:path";import crypto from"node:crypto";import fs from"node:fs/promises";import{execFile}from"node:child_process";import{promisify}from"node:util";import{ButtonStyle,ChannelType,MessageFlags,PermissionFlagsBits,Routes,TextInputStyle}from"discord-api-types/v10";import{Button,ChannelSelectMenu,CheckboxGroup,Container,Embed,File,Label,LinkButton,MediaGallery,MentionableSelectMenu,Modal,RadioGroup,RequestClient,RoleSelectMenu,Row,Section,Separator,StringSelectMenu,TextDisplay,TextInput,Thumbnail,UserSelectMenu,parseCustomId,serializePayload}from"@buape/carbon";import{PollLayoutType}from"discord-api-types/payloads/v10";function applyChannelMatchMeta(result,match){return match.matchKey&&match.matchSource&&(result.matchKey=match.matchKey,result.matchSource=match.matchSource),result}function resolveChannelMatchConfig(match,resolveEntry){return match.entry?applyChannelMatchMeta(resolveEntry(match.entry),match):null}function buildChannelKeyCandidates(...keys){let seen=new Set,candidates=[];for(let key of keys){if(typeof key!=`string`)continue;let trimmed=key.trim();!trimmed||seen.has(trimmed)||(seen.add(trimmed),candidates.push(trimmed))}return candidates}function resolveChannelEntryMatch(params){let entries=params.entries??{},match={};for(let key of params.keys)if(Object.prototype.hasOwnProperty.call(entries,key)){match.entry=entries[key],match.key=key;break}return params.wildcardKey&&Object.prototype.hasOwnProperty.call(entries,params.wildcardKey)&&(match.wildcardEntry=entries[params.wildcardKey],match.wildcardKey=params.wildcardKey),match}function resolveChannelEntryMatchWithFallback(params){let direct=resolveChannelEntryMatch({entries:params.entries,keys:params.keys,wildcardKey:params.wildcardKey});if(direct.entry&&direct.key)return{...direct,matchKey:direct.key,matchSource:`direct`};let normalizeKey=params.normalizeKey;if(normalizeKey){let normalizedKeys=params.keys.map(key=>normalizeKey(key)).filter(Boolean);if(normalizedKeys.length>0)for(let[entryKey,entry]of Object.entries(params.entries??{})){let normalizedEntry=normalizeKey(entryKey);if(normalizedEntry&&normalizedKeys.includes(normalizedEntry))return{...direct,entry,key:entryKey,matchKey:entryKey,matchSource:`direct`}}}let parentKeys=params.parentKeys??[];if(parentKeys.length>0){let parent=resolveChannelEntryMatch({entries:params.entries,keys:parentKeys});if(parent.entry&&parent.key)return{...direct,entry:parent.entry,key:parent.key,parentEntry:parent.entry,parentKey:parent.key,matchKey:parent.key,matchSource:`parent`};if(normalizeKey){let normalizedParentKeys=parentKeys.map(key=>normalizeKey(key)).filter(Boolean);if(normalizedParentKeys.length>0)for(let[entryKey,entry]of Object.entries(params.entries??{})){let normalizedEntry=normalizeKey(entryKey);if(normalizedEntry&&normalizedParentKeys.includes(normalizedEntry))return{...direct,entry,key:entryKey,parentEntry:entry,parentKey:entryKey,matchKey:entryKey,matchSource:`parent`}}}}return direct.wildcardEntry&&direct.wildcardKey?{...direct,entry:direct.wildcardEntry,key:direct.wildcardKey,matchKey:direct.wildcardKey,matchSource:`wildcard`}:direct}const DEFAULT_MAX_CHARS=2e3,FENCE_RE=/^( {0,3})(`{3,}|~{3,})(.*)$/;function countLines(text){return text?text.split(`
2
2
  `).length:0}function parseFenceLine(line){let match=line.match(FENCE_RE);if(!match)return null;let indent=match[1]??``,marker=match[2]??``;return{indent,markerChar:marker[0]??"`",markerLen:marker.length,openLine:line}}function closeFenceLine(openFence){return`${openFence.indent}${openFence.markerChar.repeat(openFence.markerLen)}`}function closeFenceIfNeeded(text,openFence){if(!openFence)return text;let closeLine=closeFenceLine(openFence);return text?text.endsWith(`
3
3
  `)?`${text}${closeLine}`:`${text}\n${closeLine}`:closeLine}function splitLongLine(line,maxChars,opts){let limit=Math.max(1,Math.floor(maxChars));if(line.length<=limit)return[line];let out=[],remaining=line;for(;remaining.length>limit;){if(opts.preserveWhitespace){out.push(remaining.slice(0,limit)),remaining=remaining.slice(limit);continue}let window=remaining.slice(0,limit),breakIdx=-1;for(let i=window.length-1;i>=0;i--)if(/\s/.test(window[i])){breakIdx=i;break}breakIdx<=0&&(breakIdx=limit),out.push(remaining.slice(0,breakIdx)),remaining=remaining.slice(breakIdx)}return remaining.length&&out.push(remaining),out}function chunkDiscordText(text,opts={}){let maxChars=Math.max(1,Math.floor(opts.maxChars??DEFAULT_MAX_CHARS)),maxLines=Math.max(1,Math.floor(opts.maxLines??17)),body=text??``;if(!body)return[];if(body.length<=maxChars&&countLines(body)<=maxLines)return[body];let lines=body.split(`
4
4
  `),chunks=[],current=``,currentLines=0,openFence=null,flush=()=>{if(!current)return;let payload=closeFenceIfNeeded(current,openFence);payload.trim().length&&chunks.push(payload),current=``,currentLines=0,openFence&&(current=openFence.openLine,currentLines=1)};for(let originalLine of lines){let fenceInfo=parseFenceLine(originalLine),wasInsideFence=openFence!==null,nextOpenFence=openFence;fenceInfo&&(openFence?openFence.markerChar===fenceInfo.markerChar&&fenceInfo.markerLen>=openFence.markerLen&&(nextOpenFence=null):nextOpenFence=fenceInfo);let reserveChars=nextOpenFence?closeFenceLine(nextOpenFence).length+1:0,reserveLines=nextOpenFence?1:0,effectiveMaxChars=maxChars-reserveChars,effectiveMaxLines=maxLines-reserveLines,charLimit=effectiveMaxChars>0?effectiveMaxChars:maxChars,lineLimit=effectiveMaxLines>0?effectiveMaxLines:maxLines,prefixLen=current.length>0?current.length+1:0,segments=splitLongLine(originalLine,Math.max(1,charLimit-prefixLen),{preserveWhitespace:wasInsideFence});for(let segIndex=0;segIndex<segments.length;segIndex++){let segment=segments[segIndex],isLineContinuation=segIndex>0,addition=`${isLineContinuation?``:current.length>0?`
@@ -1 +1 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-C1VbcUOm.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./message-channel-z5YRpR2d.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./image-ops-CotJhwRR.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./accounts-DcoaLXKI.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"./outbound-attachment-BaTYE4qp.js";import{t as sendMessageIMessage}from"./send-UFtylOiq.js";import"./tables-CojSfTth.js";export{sendMessageIMessage};
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-pt7Tr4HA.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import"./message-channel-z5YRpR2d.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./image-ops-CotJhwRR.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./accounts-DcoaLXKI.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"./outbound-attachment-BaTYE4qp.js";import{t as sendMessageIMessage}from"./send-CYGOPcKq.js";import"./tables-CojSfTth.js";export{sendMessageIMessage};
@@ -1 +1 @@
1
- import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./bindings-DR59065T.js";import{h as sendMessageDiscord}from"./send-DyF1Xy9K.js";import"./fetch-guard-8mwt3-hm.js";import"./fetch-BuOLY9KP.js";import"./retry-DlVhg5qu.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./fetch-DnVtDecb.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";export{sendMessageDiscord};
1
+ import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./bindings-DR59065T.js";import{h as sendMessageDiscord}from"./send-ChGpVO3O.js";import"./fetch-guard-8mwt3-hm.js";import"./fetch-BuOLY9KP.js";import"./retry-DlVhg5qu.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./fetch-DnVtDecb.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";export{sendMessageDiscord};
@@ -1 +1 @@
1
- import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./bindings-DR59065T.js";import{t as sendMessageSlack}from"./send-DerUBvXW.js";import"./fetch-guard-8mwt3-hm.js";import"./fetch-BuOLY9KP.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";export{sendMessageSlack};
1
+ import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./bindings-DR59065T.js";import{t as sendMessageSlack}from"./send-Aw8wK3vK.js";import"./fetch-guard-8mwt3-hm.js";import"./fetch-BuOLY9KP.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";export{sendMessageSlack};