@seanhogg/builderforce-agents 2026.9.5 → 2026.9.6

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 (205) hide show
  1. package/dist/{agent-CBRDuLO-.js → agent-59_cdTZl.js} +1 -1
  2. package/dist/{agent-CCY1r5YW.js → agent-CvMM49lm.js} +1 -1
  3. package/dist/{agents-DW3hte-y.js → agents-2d7A-Uwz.js} +1 -1
  4. package/dist/{agents-Ce4bN10e.js → agents-BdOgv61S.js} +1 -1
  5. package/dist/{audio-preflight-BvzGdNYy.js → audio-preflight-CmX2XJ3N.js} +1 -1
  6. package/dist/{audio-preflight-BYMboYmW.js → audio-preflight-Dnw3oDJr.js} +1 -1
  7. package/dist/{audio-preflight-CEOxJosQ.js → audio-preflight-HcRdB0oH.js} +1 -1
  8. package/dist/{audio-preflight-CswNxppe.js → audio-preflight-Sh649dxR.js} +1 -1
  9. package/dist/{auth-choice-DSLN0TLU.js → auth-choice-D06_TWBf.js} +1 -1
  10. package/dist/{auth-choice-BTrUlYmE.js → auth-choice-DyxxR025.js} +1 -1
  11. package/dist/{auth-choice.apply-BZ7E08Yb.js → auth-choice.apply-CUuLdlQd.js} +1 -1
  12. package/dist/{auth-choice.apply-D3EY1pZ3.js → auth-choice.apply-CfFhu_Vk.js} +1 -1
  13. package/dist/{auth-choice.apply-5dpCNO0l.js → auth-choice.apply-D57XA_d9.js} +1 -1
  14. package/dist/{auth-choice.apply-3tPFL-eH.js → auth-choice.apply-s_rOXFVz.js} +1 -1
  15. package/dist/{auth-choice.apply.transformers-B_Q6e8Yk.js → auth-choice.apply.transformers-CqQSUnsx.js} +1 -1
  16. package/dist/{auth-choice.apply.transformers-D1EzC906.js → auth-choice.apply.transformers-DXBWOilg.js} +1 -1
  17. package/dist/{auth-choice.apply.transformers-BJbpyCWs.js → auth-choice.apply.transformers-DizfkAmz.js} +1 -1
  18. package/dist/{auth-choice.apply.transformers-vLzCo5ew.js → auth-choice.apply.transformers-vyvtAxcX.js} +1 -1
  19. package/dist/{banner-DVNoUX5I.js → banner-BXpp_pEd.js} +1 -1
  20. package/dist/build-info.json +3 -3
  21. package/dist/{builderforce-Bs_G8kBN.js → builderforce-BdJAOfvE.js} +2 -2
  22. package/dist/{builderforce-BN_So1di.js → builderforce-BrFUSx35.js} +2 -2
  23. package/dist/{builderforce-directory-sync-BCZK4FYJ.js → builderforce-directory-sync-CFiQew6N.js} +1 -1
  24. package/dist/{builderforce-directory-sync-DHfiUf2g.js → builderforce-directory-sync-DIQQT09l.js} +1 -1
  25. package/dist/{builderforce-onboarding-Bbjz8F-r.js → builderforce-onboarding-CoGJY95Q.js} +1 -1
  26. package/dist/{builderforce-onboarding-8lL2bgtL.js → builderforce-onboarding-DyYM_cib.js} +1 -1
  27. package/dist/{builderforcellm-syscheck-CyZiwcdF.js → builderforcellm-syscheck-CfFrfeV2.js} +1 -1
  28. package/dist/{builderforcellm-syscheck-DMjMJNFI.js → builderforcellm-syscheck-DGZKIwPC.js} +1 -1
  29. package/dist/bundled/boot-md/handler.js +1 -1
  30. package/dist/bundled/session-memory/handler.js +1 -1
  31. package/dist/{channel-options-Zk5QnNPR.js → channel-options--DZ4jYy9.js} +1 -1
  32. package/dist/{channel-options-Cbz6vcgo.js → channel-options-xVK4amr4.js} +1 -1
  33. package/dist/{channel-web-1xD-Ad2T.js → channel-web-9vO41fn2.js} +1 -1
  34. package/dist/{channels-cli-CiVlP8_q.js → channels-cli-Ch1sZ58k.js} +1 -1
  35. package/dist/{channels-cli-BOcpgY_W.js → channels-cli-YMSOJUmp.js} +1 -1
  36. package/dist/chrome-Bi-3xZj-.js +4 -0
  37. package/dist/chrome-C6oWWmHX.js +4 -0
  38. package/dist/{cli-6znoaKr2.js → cli-gsxv7DrZ.js} +1 -1
  39. package/dist/{cli-BPwpRE1j.js → cli-zC5qoRAp.js} +1 -1
  40. package/dist/{command-registry-BTxAGdlS.js → command-registry-BXLjR3kb.js} +1 -1
  41. package/dist/{command-registry-BZINHmI9.js → command-registry-I83E6HLw.js} +1 -1
  42. package/dist/{completion-cli-BwCfUaHz.js → completion-cli-BQCxFDqY.js} +1 -1
  43. package/dist/{completion-cli-vR4Sx9zB.js → completion-cli-CDy8f_Fg.js} +1 -1
  44. package/dist/{completion-cli-C8kMJ401.js → completion-cli-DbIxXK1B.js} +1 -1
  45. package/dist/{completion-cli-D8WkqtSU.js → completion-cli-ydxyAE7J.js} +1 -1
  46. package/dist/{config-cli-BYFA4Nin.js → config-cli-5ZSrACPR.js} +1 -1
  47. package/dist/{config-cli-DVpEv0oj.js → config-cli-BvJso6op.js} +1 -1
  48. package/dist/{configure-COeSbyyP.js → configure-1e4C38zp.js} +1 -1
  49. package/dist/{configure-CW2bJ91q.js → configure-B_oI_bg-.js} +1 -1
  50. package/dist/{configure-B_juJzVi.js → configure-Dp71zeJI.js} +1 -1
  51. package/dist/{configure-CgkUUUpM.js → configure-NxmuXXEd.js} +1 -1
  52. package/dist/{deliver-qM1Zkf4i.js → deliver-C6HTqnzY.js} +1 -1
  53. package/dist/{deliver-BNMupwo6.js → deliver-CdwCHH01.js} +1 -1
  54. package/dist/{deliver-Bs-FVPQ4.js → deliver-DFhj1d_t.js} +1 -1
  55. package/dist/{deliver-C5lVQcrs.js → deliver-XGIFv80r.js} +1 -1
  56. package/dist/{deps-DWFMK9Xg.js → deps-C4YVdrEi.js} +1 -1
  57. package/dist/{doctor-completion-s5vcMc-C.js → doctor-completion-DhIR9uqB.js} +1 -1
  58. package/dist/{doctor-completion-BdMxCat-.js → doctor-completion-Dpy-8HV9.js} +1 -1
  59. package/dist/{embedded-CRoX1qTh.js → embedded-Cw4g0mzl.js} +7 -7
  60. package/dist/{embedded-DpSS2q2a.js → embedded-DG3sEMyg.js} +7 -7
  61. package/dist/{embedded-helpers-BrfnCpCe.js → embedded-helpers-3FEGD_4b.js} +1 -1
  62. package/dist/{embedded-helpers-Q5h1lA6D.js → embedded-helpers-DGDYymYx.js} +1 -1
  63. package/dist/entry.js +1 -1
  64. package/dist/extensionAPI.js +1 -1
  65. package/dist/{gateway-cli-oSSOT67p.js → gateway-cli-BBu6KI7r.js} +4 -4
  66. package/dist/{gateway-cli-DzxNTkvL.js → gateway-cli-CSmbpS6n.js} +4 -4
  67. package/dist/{health-_L8Avf4v.js → health-AOM42u9C.js} +1 -1
  68. package/dist/{health-hXlukqbf.js → health-CRIXA8je.js} +1 -1
  69. package/dist/{health-B_qWRpsT.js → health-Cuh0tZl2.js} +1 -1
  70. package/dist/{hooks-cli-C-vbyL2y.js → hooks-cli-BeqvyPiX.js} +1 -1
  71. package/dist/{hooks-cli-7gBXRQ81.js → hooks-cli-CYI9ZvNI.js} +1 -1
  72. package/dist/index.js +2 -2
  73. package/dist/{ink-session-DpO3VOYc.js → ink-session-MNcfJzij.js} +1 -1
  74. package/dist/{ink-session-CZj35xTR.js → ink-session-VqYNJYzq.js} +1 -1
  75. package/dist/llm-slug-generator.js +1 -1
  76. package/dist/{mamba-state-engine-CFwb8DcP.js → mamba-state-engine-BYmUnYwn.js} +1 -1
  77. package/dist/{mamba-state-engine-Ck2JCfL6.js → mamba-state-engine-BloJzrxU.js} +1 -1
  78. package/dist/{models-PPv9KRbb.js → models-B6kkCBLd.js} +1 -1
  79. package/dist/{models-cli-btaamH96.js → models-cli-C7u8eLls.js} +1 -1
  80. package/dist/{models-cli-BUDSwmIY.js → models-cli-DpbpZwjy.js} +1 -1
  81. package/dist/{models-DMrs_Zsc.js → models-hEa3avo7.js} +1 -1
  82. package/dist/{onboard-4JByma4r.js → onboard-BHlI_UVY.js} +2 -2
  83. package/dist/{onboard-Dq_XQQXY.js → onboard-BW5J0Ym8.js} +2 -2
  84. package/dist/{onboard-channels-Dzyeem1L.js → onboard-channels-BkrhZ79I.js} +1 -1
  85. package/dist/{onboard-channels-D4g6xuSC.js → onboard-channels-DXIqdoto.js} +1 -1
  86. package/dist/{onboard-channels-Dir2EguP.js → onboard-channels-V51s9X-h.js} +1 -1
  87. package/dist/{onboard-channels-UZOCuxN7.js → onboard-channels-fyGQ1v4S.js} +1 -1
  88. package/dist/{onboard-interactive-DvNhkCNr.js → onboard-interactive-ClPMlCIl.js} +1 -1
  89. package/dist/{onboard-interactive-DyyEDd9a.js → onboard-interactive-D6IBBU8m.js} +1 -1
  90. package/dist/{onboard-interactive-CwNfYxGe.js → onboard-interactive-DEeqmoeW.js} +1 -1
  91. package/dist/{onboard-interactive-Co2bcd7g.js → onboard-interactive-DSZak3YX.js} +1 -1
  92. package/dist/{onboarding-DBL-H1Qu.js → onboarding-CYOfGpd5.js} +3 -3
  93. package/dist/{onboarding-CIxLpuFP.js → onboarding-DIxm_q7P.js} +3 -3
  94. package/dist/{onboarding.finalize-CGGbkAOL.js → onboarding.finalize-Co5L0rNp.js} +1 -1
  95. package/dist/{onboarding.finalize-R3TfibWY.js → onboarding.finalize-DAwpQa7n.js} +1 -1
  96. package/dist/{outbound-send-deps-CsJgGsii.js → outbound-send-deps-Cys_MtmC.js} +1 -1
  97. package/dist/{plugin-registry-Ty9w94Rd.js → plugin-registry-BM1-sG-e.js} +1 -1
  98. package/dist/{plugin-registry-BkGhcUDV.js → plugin-registry-CAy3I1K1.js} +1 -1
  99. package/dist/{plugin-registry-BenvgIsJ.js → plugin-registry-DjmzOS3n.js} +1 -1
  100. package/dist/{plugin-registry-DZirturB.js → plugin-registry-l2iN7_1l.js} +1 -1
  101. package/dist/plugin-sdk/agent-runtime/src/builderforce/ports.d.ts +1 -1
  102. package/dist/plugin-sdk/agent-runtime/src/infra/limbic-system-service.d.ts +2 -3
  103. package/dist/plugin-sdk/{audio-preflight-lhP946UF.js → audio-preflight-BbtfbLzo.js} +1 -1
  104. package/dist/plugin-sdk/{channel-web-CzXHQXgb.js → channel-web-BHose9yJ.js} +1 -1
  105. package/dist/plugin-sdk/index.js +1 -1
  106. package/dist/plugin-sdk/packages/agent-tools/src/index.d.ts +0 -1
  107. package/dist/plugin-sdk/packages/agent-tools/src/psychometric-dims.d.ts +2 -2
  108. package/dist/plugin-sdk/packages/agent-tools/src/psychometrics.d.ts +38 -5
  109. package/dist/plugin-sdk/packages/agent-tools/src/spec.d.ts +3 -1
  110. package/dist/plugin-sdk/{reply-DkmZ32IH.js → reply-V98uAjNN.js} +5 -5
  111. package/dist/plugin-sdk/{runner-DeqVi2ay.js → runner-BpFNG45j.js} +1 -1
  112. package/dist/plugin-sdk/{src-yVjde9hC.js → src-pvdIxmTY.js} +2 -2
  113. package/dist/plugin-sdk/{tool-loop-detection-AO2R09bJ.js → tool-loop-detection-Bjiit8CZ.js} +1 -1
  114. package/dist/plugin-sdk/{web-D-h3WpSq.js → web-Bq6nGRsB.js} +1 -1
  115. package/dist/{plugins-r-hGfiMK.js → plugins-BbovMu2g.js} +1 -1
  116. package/dist/{plugins-ChYVZuHy.js → plugins-DrkC1ANW.js} +1 -1
  117. package/dist/{plugins-cli-CKQ2X7tA.js → plugins-cli-CqtTn-Gv.js} +1 -1
  118. package/dist/{plugins-cli-CB7e9eCK.js → plugins-cli-DWlQnRpV.js} +1 -1
  119. package/dist/{program-D71K23KC.js → program-DOGUG9Uz.js} +2 -2
  120. package/dist/{program-context-B9V62ZJg.js → program-context-DBtTOKkf.js} +1 -1
  121. package/dist/{project-context-Cnqfr64Z.js → project-context-C5KLsMTc.js} +1 -1
  122. package/dist/{project-context-DXP12xhk.js → project-context-Cg0S9eFT.js} +1 -1
  123. package/dist/project-context-DbBD_r4v.js +1 -0
  124. package/dist/project-context-nIzFswHk.js +1 -0
  125. package/dist/project-context-store-B96x1Lfk.js +1 -0
  126. package/dist/{project-context-store-C8TROXjr.js → project-context-store-BS994lZX.js} +1 -1
  127. package/dist/{project-context-store-ClFt-YDL.js → project-context-store-BSIWJD6S.js} +1 -1
  128. package/dist/project-context-store-BzX1YdMP.js +1 -0
  129. package/dist/{prompt-select-styled-Cect8vJu.js → prompt-select-styled-2q_0LOx1.js} +1 -1
  130. package/dist/{prompt-select-styled-CJBJZiX_.js → prompt-select-styled-D31D9EIl.js} +1 -1
  131. package/dist/{provider-auth-helpers-DItSj71N.js → provider-auth-helpers-9Ut-MHV9.js} +1 -1
  132. package/dist/{provider-auth-helpers-ByvJdQT3.js → provider-auth-helpers-u1GAP4Bi.js} +1 -1
  133. package/dist/{provider-dispatcher-E-RjX6WG.js → provider-dispatcher-4KsB_bCw.js} +1 -1
  134. package/dist/{provider-dispatcher-D6-kUWf8.js → provider-dispatcher-CG7kSp65.js} +1 -1
  135. package/dist/{push-apns-B6YfFR5s.js → push-apns-CEzi4ars.js} +1 -1
  136. package/dist/{push-apns-n8P3oclR.js → push-apns-oUAHr48A.js} +1 -1
  137. package/dist/{pw-ai-BpY-eMJT.js → pw-ai-CfV_5FWo.js} +1 -1
  138. package/dist/{pw-ai-Bu1w-1rC.js → pw-ai-Dx8XRyPq.js} +1 -1
  139. package/dist/{register.agent-CAsV5dRf.js → register.agent-C84ud-cS.js} +1 -1
  140. package/dist/{register.agent-DQ4zQymV.js → register.agent-Db9SzkZg.js} +1 -1
  141. package/dist/{register.configure-HcPL-Na2.js → register.configure-BfPiEcFk.js} +1 -1
  142. package/dist/{register.configure-B-xRsB-s.js → register.configure-WYMz_fwM.js} +1 -1
  143. package/dist/{register.connect-BcZeAJ1s.js → register.connect-CMN7lqC5.js} +1 -1
  144. package/dist/{register.connect-ChZQOiYF.js → register.connect-Dqhd81kK.js} +1 -1
  145. package/dist/{register.maintenance-C-7Arpam.js → register.maintenance-BpQE-3eC.js} +1 -1
  146. package/dist/{register.maintenance-Jdfg2LKA.js → register.maintenance-DjKxt-jl.js} +1 -1
  147. package/dist/{register.message-D1IU3K0a.js → register.message-C4Gf388m.js} +1 -1
  148. package/dist/{register.message-C3cFBIXY.js → register.message-D5A7-_wN.js} +1 -1
  149. package/dist/{register.onboard-DJ2QNnOi.js → register.onboard-BF5tXr7K.js} +1 -1
  150. package/dist/{register.onboard-DjrhC3jh.js → register.onboard-BO_OtYg9.js} +1 -1
  151. package/dist/{register.setup-BNUqkiVa.js → register.setup-BzDbYjEw.js} +1 -1
  152. package/dist/{register.setup-C8XgG5Zt.js → register.setup-CaWt1bhf.js} +1 -1
  153. package/dist/{register.status-health-sessions-DcqlqAhs.js → register.status-health-sessions-BbYzFw1X.js} +1 -1
  154. package/dist/{register.status-health-sessions-CBTZZ0Rh.js → register.status-health-sessions-CDD6Eoxf.js} +1 -1
  155. package/dist/{register.subclis-CqVl0uO4.js → register.subclis-Cfb5FUTI.js} +1 -1
  156. package/dist/{register.subclis-Meewq2dj.js → register.subclis-yYbEKj9a.js} +1 -1
  157. package/dist/{reply-BsRbeUhd.js → reply-CpGH-3If.js} +8 -8
  158. package/dist/{run-main-CFVoPcgN.js → run-main-B82VAQTQ.js} +1 -1
  159. package/dist/{runner-68-X3KHf.js → runner-BLCTET8O.js} +2 -2
  160. package/dist/{runner-CfNJMPWu.js → runner-C651oVfk.js} +2 -2
  161. package/dist/{runner-BgUG2-RV.js → runner-DCn9sBTn.js} +3 -3
  162. package/dist/{runner-BKHYCYMH.js → runner-xF3_-mDL.js} +3 -3
  163. package/dist/{server-node-events-DusCxrVm.js → server-node-events-Bam08x5E.js} +1 -1
  164. package/dist/{server-node-events-BahizW3Z.js → server-node-events-kbTUUaAA.js} +1 -1
  165. package/dist/{session-dirs-RIA98OsG.js → session-dirs-BBGuanHN.js} +1 -1
  166. package/dist/{session-dirs-Cutn9srI.js → session-dirs-DV-c-o7M.js} +1 -1
  167. package/dist/{src-BRo9ywDM.js → src-BM8G-tIl.js} +3 -3
  168. package/dist/{src-DxNC0IHE.js → src-D2-7sOAX.js} +3 -3
  169. package/dist/{src-NJhXretA.js → src-D5vOHX9i.js} +2 -2
  170. package/dist/{src-Enbbh3hH.js → src-Dptpvd0V.js} +2 -2
  171. package/dist/{status-DPza6sZ1.js → status-BcT4AI8l.js} +1 -1
  172. package/dist/{status-CMdPdaSM.js → status-C9D1ex2G.js} +1 -1
  173. package/dist/{status-CFDh5snF.js → status-D_YsiWpP.js} +1 -1
  174. package/dist/{status-SyaizSN6.js → status-V8zvPBOv.js} +1 -1
  175. package/dist/{status-C1toWVvJ.js → status-i_sJ6Ikx.js} +1 -1
  176. package/dist/{subagent-registry-oB_F2U2W.js → subagent-registry-BUKplZi1.js} +8 -8
  177. package/dist/{subagent-registry-DFzwOGge.js → subagent-registry-BgUoQjBB.js} +1 -1
  178. package/dist/{subagent-registry-C1opJIrJ.js → subagent-registry-DrrF3JoH.js} +1 -1
  179. package/dist/{tool-loop-detection-DxqiqYam.js → tool-loop-detection-Bv0aRyd6.js} +1 -1
  180. package/dist/{tool-loop-detection-3W6bLEza.js → tool-loop-detection-CgUkrbCZ.js} +1 -1
  181. package/dist/{tool-loop-detection-C3z1wqgV.js → tool-loop-detection-CshVZIOE.js} +1 -1
  182. package/dist/{tool-loop-detection-DNM8YCNW.js → tool-loop-detection-bpZ-S3A1.js} +1 -1
  183. package/dist/{tui-Dy1FnApe.js → tui-CdYI5f3k.js} +2 -2
  184. package/dist/{tui-lng2vIp3.js → tui-DgBGTw2s.js} +2 -2
  185. package/dist/{tui-cli-BTFEL897.js → tui-cli-BNeRzoEe.js} +1 -1
  186. package/dist/{tui-cli-D-cDh9DV.js → tui-cli-BZ--mp9s.js} +1 -1
  187. package/dist/{tui-stream-assembler-B_AQD4Kg.js → tui-stream-assembler-BNJE9PoS.js} +1 -1
  188. package/dist/{tui-stream-assembler-Bn1WXUGG.js → tui-stream-assembler-xFcJqFJ9.js} +1 -1
  189. package/dist/{update-cli-BdT4-P_D.js → update-cli-BATUCF7p.js} +1 -1
  190. package/dist/{update-cli-DMMSWPXh.js → update-cli-BRBoX_97.js} +1 -1
  191. package/dist/{web-BiSkmACr.js → web-BdYyXjsX.js} +1 -1
  192. package/dist/{web-CXrAweDC.js → web-C5hfXVCy.js} +1 -1
  193. package/dist/{web-BS6WUf7c.js → web-CsWqmV_E.js} +1 -1
  194. package/dist/{web-CfYUd-lX.js → web-fg3nA4Qq.js} +1 -1
  195. package/dist/{workflow-cli-Du4IfE1A.js → workflow-cli-D-o_-jfU.js} +1 -1
  196. package/dist/{workflow-cli-BuEKJ4ut.js → workflow-cli-DDWSXyi0.js} +1 -1
  197. package/package.json +6 -5
  198. package/dist/chrome-C6fODzE5.js +0 -4
  199. package/dist/chrome-Cm-kVyuA.js +0 -4
  200. package/dist/plugin-sdk/agent-runtime/src/builderforce/limbic.d.ts +0 -14
  201. package/dist/plugin-sdk/packages/agent-tools/src/limbic.d.ts +0 -104
  202. package/dist/project-context-DS52UwJZ.js +0 -1
  203. package/dist/project-context-PiiAmwVd.js +0 -1
  204. package/dist/project-context-store-B2GYSwld.js +0 -1
  205. package/dist/project-context-store-DNx9ScQ_.js +0 -1
@@ -1 +1 @@
1
- import"./paths-BHg-VHB4.js";import{a as getPrimaryCommand,c as hasHelpOrVersion,i as getPositiveIntFlagValue,n as getCommandPath,o as getVerboseFlag,r as getFlagValue,s as hasFlag}from"./argv-BgQk38nl.js";import{t as normalizeWindowsArgv}from"./windows-argv-ClCYQujd.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import{p as defaultRuntime,r as enableConsoleCapture}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import{r as normalizeEnv,t as isTruthyEnvValue}from"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-BARnVAUE.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import{G as loadDotEnv,U as VERSION}from"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./model-discovery-DxpimsRF.js";import"./model-catalog-wcISK04b.js";import"./frontmatter-DgRc5y_l.js";import"./skills-W00EPvKR.js";import"./plugin-skills-BSUncenp.js";import"./refresh-bgGvF0aF.js";import"./client-DeQ0LbP9.js";import"./call-CjC3SRPv.js";import"./message-channel-C-yw5fZm.js";import"./subagent-registry-oB_F2U2W.js";import"./sessions-ko0LxxGk.js";import"./src-BRo9ywDM.js";import"./project-context-store-ClFt-YDL.js";import"./tokens-BNwTTeJb.js";import"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import"./send-gG3CFJwv.js";import"./send-DqJCViFb.js";import"./with-timeout-By0c7Ur9.js";import"./deliver-Bs-FVPQ4.js";import"./accounts-DoJYLMfS.js";import"./send-mCN63Hkn.js";import"./image-ops-Bg9yFwjX.js";import"./redact-bWj_-q3j.js";import"./errors-t5wHPcwh.js";import"./embedded-helpers-Q5h1lA6D.js";import"./sandbox-BcH7kS1y.js";import"./chrome-IJYO1tSE.js";import"./tailscale-CgCG7AVQ.js";import"./auth-B4Kn3eee.js";import"./server-context-D3iiIzvV.js";import"./routes-7QTsp3sA.js";import"./paths-GamzES41.js";import"./ssrf-BiSQzdcA.js";import"./store-C5LmVaEC.js";import"./ports-LqFTyTSK.js";import"./trash-zs6gNxed.js";import"./accounts-BT-NzzBc.js";import"./paths-BQ9W7Bs0.js";import"./tool-images-DV2HMmx4.js";import"./workspace-Cz9mCy0P.js";import"./reply-prefix-9hmbzubX.js";import"./sqlite-BEgCClMz.js";import"./memory-cli-COgt0ROi.js";import"./manager-Cob4Ofzr.js";import"./gemini-auth-BZgBIY0M.js";import"./retry-Cc6xusE8.js";import"./common-BRdxH-uH.js";import{c as installUnhandledRejectionHandler,u as installUncaughtExceptionHandler}from"./runner-68-X3KHf.js";import"./tool-display-BIswnHaq.js";import"./chunk-UPhdkZNp.js";import"./markdown-tables-CpqWBduK.js";import"./fetch-guard-CoGEds8D.js";import"./fetch-CUsKv8oj.js";import"./ir-6L-eU4id.js";import"./render-1ABBE2Y6.js";import"./builderforcellm-syscheck-CyZiwcdF.js";import"./session-utils-VCGKYbgW.js";import"./coding-tools.policy-DIeVRurg.js";import"./pairing-store-tegvJa08.js";import"./fetch-CrbOFvsL.js";import"./exec-approvals-Cn0K-HtJ.js";import"./nodes-screen-OI7tHqlU.js";import"./session-cost-usage-BgZfN_WR.js";import"./provider-usage-BLkm6ojE.js";import"./send-BIR1Jhc5.js";import"./outbound-attachment-3GZbMqo1.js";import"./delivery-queue-DQXq7KUU.js";import"./project-context-DXP12xhk.js";import"./control-service-Cml__v8i.js";import"./stagger-CUH5rlmS.js";import"./channel-selection-DFf_nAm7.js";import"./send-9rUcCK7O.js";import"./resolve-route-D3X-bXU-.js";import"./channel-activity-By7lsk7N.js";import"./tables-DZSV6me6.js";import"./links-B6LU5cXN.js";import"./cli-utils-ByV85M53.js";import"./help-format-DIDk_7gh.js";import"./progress-BQMO_-7I.js";import"./replies-CL0uQgU7.js";import"./onboard-helpers-Di5OXlap.js";import"./prompt-style-CZOeG0sw.js";import"./pairing-labels-DofkNLS2.js";import"./active-listener-BC31MA4v.js";import"./mamba-state-engine-CFwb8DcP.js";import"./transformers-stream-nSL4Xu31.js";import{t as ensureBuilderForceAgentsCliOnPath}from"./path-env-C8yugxL0.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-Ty9w94Rd.js";import{t as assertSupportedRuntime}from"./runtime-guard-BThrXAmT.js";import{t as emitCliBanner}from"./banner-DVNoUX5I.js";import{t as ensureConfigReady}from"./config-guard-DtDYoBA4.js";import process$1 from"node:process";import"node:url";const routeHealth={match:path=>path[0]===`health`,loadPlugins:!0,run:async argv=>{let json=hasFlag(argv,`--json`),verbose=getVerboseFlag(argv,{includeDebug:!0}),timeoutMs=getPositiveIntFlagValue(argv,`--timeout`);if(timeoutMs===null)return!1;let{healthCommand}=await import(`./health-_L8Avf4v.js`);return await healthCommand({json,timeoutMs,verbose},defaultRuntime),!0}},routeStatus={match:path=>path[0]===`status`,loadPlugins:!0,run:async argv=>{let json=hasFlag(argv,`--json`),deep=hasFlag(argv,`--deep`),all=hasFlag(argv,`--all`),usage=hasFlag(argv,`--usage`),verbose=getVerboseFlag(argv,{includeDebug:!0}),timeoutMs=getPositiveIntFlagValue(argv,`--timeout`);if(timeoutMs===null)return!1;let{statusCommand}=await import(`./status-CMdPdaSM.js`);return await statusCommand({json,deep,all,usage,timeoutMs,verbose},defaultRuntime),!0}},routeSessions={match:path=>path[0]===`sessions`,run:async argv=>{let json=hasFlag(argv,`--json`),store=getFlagValue(argv,`--store`);if(store===null)return!1;let active=getFlagValue(argv,`--active`);if(active===null)return!1;let{sessionsCommand}=await import(`./sessions-DShMHTnj.js`);return await sessionsCommand({json,store,active},defaultRuntime),!0}},routeAgentsList={match:path=>path[0]===`agents`&&path[1]===`list`,run:async argv=>{let json=hasFlag(argv,`--json`),bindings=hasFlag(argv,`--bindings`),{agentsListCommand}=await import(`./agents-Ce4bN10e.js`);return await agentsListCommand({json,bindings},defaultRuntime),!0}},routeMemoryStatus={match:path=>path[0]===`memory`&&path[1]===`status`,run:async argv=>{let agent=getFlagValue(argv,`--agent`);if(agent===null)return!1;let json=hasFlag(argv,`--json`),deep=hasFlag(argv,`--deep`),index=hasFlag(argv,`--index`),verbose=hasFlag(argv,`--verbose`),{runMemoryStatus}=await import(`./memory-cli-DQv_2ugw.js`);return await runMemoryStatus({agent,json,deep,index,verbose}),!0}};function getCommandPositionals(argv){let out=[],args=argv.slice(2);for(let arg of args){if(!arg||arg===`--`)break;arg.startsWith(`-`)||out.push(arg)}return out}function getFlagValues(argv,name){let values=[],args=argv.slice(2);for(let i=0;i<args.length;i+=1){let arg=args[i];if(!arg||arg===`--`)break;if(arg===name){let next=args[i+1];if(!next||next===`--`||next.startsWith(`-`))return null;values.push(next),i+=1;continue}if(arg.startsWith(`${name}=`)){let value=arg.slice(name.length+1).trim();if(!value)return null;values.push(value)}}return values}const routes=[routeHealth,routeStatus,routeSessions,routeAgentsList,routeMemoryStatus,{match:path=>path[0]===`config`&&path[1]===`get`,run:async argv=>{let pathArg=getCommandPositionals(argv)[2];if(!pathArg)return!1;let json=hasFlag(argv,`--json`),{runConfigGet}=await import(`./config-cli-DVpEv0oj.js`);return await runConfigGet({path:pathArg,json}),!0}},{match:path=>path[0]===`config`&&path[1]===`unset`,run:async argv=>{let pathArg=getCommandPositionals(argv)[2];if(!pathArg)return!1;let{runConfigUnset}=await import(`./config-cli-DVpEv0oj.js`);return await runConfigUnset({path:pathArg}),!0}},{match:path=>path[0]===`models`&&path[1]===`list`,run:async argv=>{let provider=getFlagValue(argv,`--provider`);if(provider===null)return!1;let all=hasFlag(argv,`--all`),local=hasFlag(argv,`--local`),json=hasFlag(argv,`--json`),plain=hasFlag(argv,`--plain`),{modelsListCommand}=await import(`./models-DMrs_Zsc.js`);return await modelsListCommand({all,local,provider,json,plain},defaultRuntime),!0}},{match:path=>path[0]===`models`&&path[1]===`status`,run:async argv=>{let probeProvider=getFlagValue(argv,`--probe-provider`);if(probeProvider===null)return!1;let probeTimeout=getFlagValue(argv,`--probe-timeout`);if(probeTimeout===null)return!1;let probeConcurrency=getFlagValue(argv,`--probe-concurrency`);if(probeConcurrency===null)return!1;let probeMaxTokens=getFlagValue(argv,`--probe-max-tokens`);if(probeMaxTokens===null)return!1;let agent=getFlagValue(argv,`--agent`);if(agent===null)return!1;let probeProfileValues=getFlagValues(argv,`--probe-profile`);if(probeProfileValues===null)return!1;let probeProfile=probeProfileValues.length===0?void 0:probeProfileValues.length===1?probeProfileValues[0]:probeProfileValues,json=hasFlag(argv,`--json`),plain=hasFlag(argv,`--plain`),check=hasFlag(argv,`--check`),probe=hasFlag(argv,`--probe`),{modelsStatusCommand}=await import(`./models-DMrs_Zsc.js`);return await modelsStatusCommand({json,plain,check,probe,probeProvider,probeProfile,probeTimeout,probeConcurrency,probeMaxTokens,agent},defaultRuntime),!0}}];function findRoutedCommand(path){for(let route of routes)if(route.match(path))return route;return null}async function prepareRoutedCommand(params){emitCliBanner(VERSION,{argv:params.argv}),await ensureConfigReady({runtime:defaultRuntime,commandPath:params.commandPath}),params.loadPlugins&&ensurePluginRegistryLoaded()}async function tryRouteCli(argv){if(isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_DISABLE_ROUTE_FIRST)||hasHelpOrVersion(argv))return!1;let path=getCommandPath(argv,2);if(!path[0])return!1;let route=findRoutedCommand(path);return route?(await prepareRoutedCommand({argv,commandPath:path,loadPlugins:route.loadPlugins}),route.run(argv)):!1}function rewriteUpdateFlagArgv(argv){let index=argv.indexOf(`--update`);if(index===-1)return argv;let next=[...argv];return next.splice(index,1,`update`),next}function shouldSkipPluginCommandRegistration(params){return params.hasBuiltinPrimary?!0:params.primary?!1:hasHelpOrVersion(params.argv)}function shouldEnsureCliPath(argv){if(hasHelpOrVersion(argv))return!1;let[primary,secondary]=getCommandPath(argv,2);return primary?!(primary===`status`||primary===`health`||primary===`sessions`||primary===`config`&&(secondary===`get`||secondary===`unset`)||primary===`models`&&(secondary===`list`||secondary===`status`)):!0}async function runCli(argv=process$1.argv){let normalizedArgv=normalizeWindowsArgv(argv);if(loadDotEnv({quiet:!0}),normalizeEnv(),shouldEnsureCliPath(normalizedArgv)&&ensureBuilderForceAgentsCliOnPath(),assertSupportedRuntime(),await tryRouteCli(normalizedArgv))return;enableConsoleCapture();let{buildProgram}=await import(`./program-D71K23KC.js`),program=buildProgram();installUnhandledRejectionHandler(),installUncaughtExceptionHandler();let parseArgv=rewriteUpdateFlagArgv(normalizedArgv),primary=getPrimaryCommand(parseArgv);if(primary){let{getProgramContext}=await import(`./program-context-BenlTDzh.js`),ctx=getProgramContext(program);if(ctx){let{registerCoreCliByName}=await import(`./command-registry-BZINHmI9.js`);await registerCoreCliByName(program,ctx,primary,parseArgv)}let{registerSubCliByName}=await import(`./register.subclis-CqVl0uO4.js`);await registerSubCliByName(program,primary)}if(!shouldSkipPluginCommandRegistration({argv:parseArgv,primary,hasBuiltinPrimary:primary!==null&&program.commands.some(command=>command.name()===primary)})){let{registerPluginCliCommands}=await import(`./cli-6znoaKr2.js`),{loadConfig}=await import(`./config-DzAlOJby.js`);registerPluginCliCommands(program,loadConfig())}await program.parseAsync(parseArgv)}export{runCli};
1
+ import"./paths-BHg-VHB4.js";import{a as getPrimaryCommand,c as hasHelpOrVersion,i as getPositiveIntFlagValue,n as getCommandPath,o as getVerboseFlag,r as getFlagValue,s as hasFlag}from"./argv-BgQk38nl.js";import{t as normalizeWindowsArgv}from"./windows-argv-ClCYQujd.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import{p as defaultRuntime,r as enableConsoleCapture}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import{r as normalizeEnv,t as isTruthyEnvValue}from"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-BARnVAUE.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import{G as loadDotEnv,U as VERSION}from"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./model-discovery-DxpimsRF.js";import"./model-catalog-wcISK04b.js";import"./frontmatter-DgRc5y_l.js";import"./skills-W00EPvKR.js";import"./plugin-skills-BSUncenp.js";import"./refresh-bgGvF0aF.js";import"./client-DeQ0LbP9.js";import"./call-CjC3SRPv.js";import"./message-channel-C-yw5fZm.js";import"./subagent-registry-BUKplZi1.js";import"./sessions-ko0LxxGk.js";import"./src-BM8G-tIl.js";import"./project-context-store-BSIWJD6S.js";import"./tokens-BNwTTeJb.js";import"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import"./send-gG3CFJwv.js";import"./send-DqJCViFb.js";import"./with-timeout-By0c7Ur9.js";import"./deliver-DFhj1d_t.js";import"./accounts-DoJYLMfS.js";import"./send-mCN63Hkn.js";import"./image-ops-Bg9yFwjX.js";import"./redact-bWj_-q3j.js";import"./errors-t5wHPcwh.js";import"./embedded-helpers-DGDYymYx.js";import"./sandbox-BcH7kS1y.js";import"./chrome-IJYO1tSE.js";import"./tailscale-CgCG7AVQ.js";import"./auth-B4Kn3eee.js";import"./server-context-D3iiIzvV.js";import"./routes-7QTsp3sA.js";import"./paths-GamzES41.js";import"./ssrf-BiSQzdcA.js";import"./store-C5LmVaEC.js";import"./ports-LqFTyTSK.js";import"./trash-zs6gNxed.js";import"./accounts-BT-NzzBc.js";import"./paths-BQ9W7Bs0.js";import"./tool-images-DV2HMmx4.js";import"./workspace-Cz9mCy0P.js";import"./reply-prefix-9hmbzubX.js";import"./sqlite-BEgCClMz.js";import"./memory-cli-COgt0ROi.js";import"./manager-Cob4Ofzr.js";import"./gemini-auth-BZgBIY0M.js";import"./retry-Cc6xusE8.js";import"./common-BRdxH-uH.js";import{c as installUnhandledRejectionHandler,u as installUncaughtExceptionHandler}from"./runner-BLCTET8O.js";import"./tool-display-BIswnHaq.js";import"./chunk-UPhdkZNp.js";import"./markdown-tables-CpqWBduK.js";import"./fetch-guard-CoGEds8D.js";import"./fetch-CUsKv8oj.js";import"./ir-6L-eU4id.js";import"./render-1ABBE2Y6.js";import"./builderforcellm-syscheck-CfFrfeV2.js";import"./session-utils-VCGKYbgW.js";import"./coding-tools.policy-DIeVRurg.js";import"./pairing-store-tegvJa08.js";import"./fetch-CrbOFvsL.js";import"./exec-approvals-Cn0K-HtJ.js";import"./nodes-screen-OI7tHqlU.js";import"./session-cost-usage-BgZfN_WR.js";import"./provider-usage-BLkm6ojE.js";import"./send-BIR1Jhc5.js";import"./outbound-attachment-3GZbMqo1.js";import"./delivery-queue-DQXq7KUU.js";import"./project-context-C5KLsMTc.js";import"./control-service-Cml__v8i.js";import"./stagger-CUH5rlmS.js";import"./channel-selection-DFf_nAm7.js";import"./send-9rUcCK7O.js";import"./resolve-route-D3X-bXU-.js";import"./channel-activity-By7lsk7N.js";import"./tables-DZSV6me6.js";import"./links-B6LU5cXN.js";import"./cli-utils-ByV85M53.js";import"./help-format-DIDk_7gh.js";import"./progress-BQMO_-7I.js";import"./replies-CL0uQgU7.js";import"./onboard-helpers-Di5OXlap.js";import"./prompt-style-CZOeG0sw.js";import"./pairing-labels-DofkNLS2.js";import"./active-listener-BC31MA4v.js";import"./mamba-state-engine-BYmUnYwn.js";import"./transformers-stream-nSL4Xu31.js";import{t as ensureBuilderForceAgentsCliOnPath}from"./path-env-C8yugxL0.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-BM1-sG-e.js";import{t as assertSupportedRuntime}from"./runtime-guard-BThrXAmT.js";import{t as emitCliBanner}from"./banner-BXpp_pEd.js";import{t as ensureConfigReady}from"./config-guard-DtDYoBA4.js";import process$1 from"node:process";import"node:url";const routeHealth={match:path=>path[0]===`health`,loadPlugins:!0,run:async argv=>{let json=hasFlag(argv,`--json`),verbose=getVerboseFlag(argv,{includeDebug:!0}),timeoutMs=getPositiveIntFlagValue(argv,`--timeout`);if(timeoutMs===null)return!1;let{healthCommand}=await import(`./health-AOM42u9C.js`);return await healthCommand({json,timeoutMs,verbose},defaultRuntime),!0}},routeStatus={match:path=>path[0]===`status`,loadPlugins:!0,run:async argv=>{let json=hasFlag(argv,`--json`),deep=hasFlag(argv,`--deep`),all=hasFlag(argv,`--all`),usage=hasFlag(argv,`--usage`),verbose=getVerboseFlag(argv,{includeDebug:!0}),timeoutMs=getPositiveIntFlagValue(argv,`--timeout`);if(timeoutMs===null)return!1;let{statusCommand}=await import(`./status-C9D1ex2G.js`);return await statusCommand({json,deep,all,usage,timeoutMs,verbose},defaultRuntime),!0}},routeSessions={match:path=>path[0]===`sessions`,run:async argv=>{let json=hasFlag(argv,`--json`),store=getFlagValue(argv,`--store`);if(store===null)return!1;let active=getFlagValue(argv,`--active`);if(active===null)return!1;let{sessionsCommand}=await import(`./sessions-DShMHTnj.js`);return await sessionsCommand({json,store,active},defaultRuntime),!0}},routeAgentsList={match:path=>path[0]===`agents`&&path[1]===`list`,run:async argv=>{let json=hasFlag(argv,`--json`),bindings=hasFlag(argv,`--bindings`),{agentsListCommand}=await import(`./agents-BdOgv61S.js`);return await agentsListCommand({json,bindings},defaultRuntime),!0}},routeMemoryStatus={match:path=>path[0]===`memory`&&path[1]===`status`,run:async argv=>{let agent=getFlagValue(argv,`--agent`);if(agent===null)return!1;let json=hasFlag(argv,`--json`),deep=hasFlag(argv,`--deep`),index=hasFlag(argv,`--index`),verbose=hasFlag(argv,`--verbose`),{runMemoryStatus}=await import(`./memory-cli-DQv_2ugw.js`);return await runMemoryStatus({agent,json,deep,index,verbose}),!0}};function getCommandPositionals(argv){let out=[],args=argv.slice(2);for(let arg of args){if(!arg||arg===`--`)break;arg.startsWith(`-`)||out.push(arg)}return out}function getFlagValues(argv,name){let values=[],args=argv.slice(2);for(let i=0;i<args.length;i+=1){let arg=args[i];if(!arg||arg===`--`)break;if(arg===name){let next=args[i+1];if(!next||next===`--`||next.startsWith(`-`))return null;values.push(next),i+=1;continue}if(arg.startsWith(`${name}=`)){let value=arg.slice(name.length+1).trim();if(!value)return null;values.push(value)}}return values}const routes=[routeHealth,routeStatus,routeSessions,routeAgentsList,routeMemoryStatus,{match:path=>path[0]===`config`&&path[1]===`get`,run:async argv=>{let pathArg=getCommandPositionals(argv)[2];if(!pathArg)return!1;let json=hasFlag(argv,`--json`),{runConfigGet}=await import(`./config-cli-BvJso6op.js`);return await runConfigGet({path:pathArg,json}),!0}},{match:path=>path[0]===`config`&&path[1]===`unset`,run:async argv=>{let pathArg=getCommandPositionals(argv)[2];if(!pathArg)return!1;let{runConfigUnset}=await import(`./config-cli-BvJso6op.js`);return await runConfigUnset({path:pathArg}),!0}},{match:path=>path[0]===`models`&&path[1]===`list`,run:async argv=>{let provider=getFlagValue(argv,`--provider`);if(provider===null)return!1;let all=hasFlag(argv,`--all`),local=hasFlag(argv,`--local`),json=hasFlag(argv,`--json`),plain=hasFlag(argv,`--plain`),{modelsListCommand}=await import(`./models-hEa3avo7.js`);return await modelsListCommand({all,local,provider,json,plain},defaultRuntime),!0}},{match:path=>path[0]===`models`&&path[1]===`status`,run:async argv=>{let probeProvider=getFlagValue(argv,`--probe-provider`);if(probeProvider===null)return!1;let probeTimeout=getFlagValue(argv,`--probe-timeout`);if(probeTimeout===null)return!1;let probeConcurrency=getFlagValue(argv,`--probe-concurrency`);if(probeConcurrency===null)return!1;let probeMaxTokens=getFlagValue(argv,`--probe-max-tokens`);if(probeMaxTokens===null)return!1;let agent=getFlagValue(argv,`--agent`);if(agent===null)return!1;let probeProfileValues=getFlagValues(argv,`--probe-profile`);if(probeProfileValues===null)return!1;let probeProfile=probeProfileValues.length===0?void 0:probeProfileValues.length===1?probeProfileValues[0]:probeProfileValues,json=hasFlag(argv,`--json`),plain=hasFlag(argv,`--plain`),check=hasFlag(argv,`--check`),probe=hasFlag(argv,`--probe`),{modelsStatusCommand}=await import(`./models-hEa3avo7.js`);return await modelsStatusCommand({json,plain,check,probe,probeProvider,probeProfile,probeTimeout,probeConcurrency,probeMaxTokens,agent},defaultRuntime),!0}}];function findRoutedCommand(path){for(let route of routes)if(route.match(path))return route;return null}async function prepareRoutedCommand(params){emitCliBanner(VERSION,{argv:params.argv}),await ensureConfigReady({runtime:defaultRuntime,commandPath:params.commandPath}),params.loadPlugins&&ensurePluginRegistryLoaded()}async function tryRouteCli(argv){if(isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_DISABLE_ROUTE_FIRST)||hasHelpOrVersion(argv))return!1;let path=getCommandPath(argv,2);if(!path[0])return!1;let route=findRoutedCommand(path);return route?(await prepareRoutedCommand({argv,commandPath:path,loadPlugins:route.loadPlugins}),route.run(argv)):!1}function rewriteUpdateFlagArgv(argv){let index=argv.indexOf(`--update`);if(index===-1)return argv;let next=[...argv];return next.splice(index,1,`update`),next}function shouldSkipPluginCommandRegistration(params){return params.hasBuiltinPrimary?!0:params.primary?!1:hasHelpOrVersion(params.argv)}function shouldEnsureCliPath(argv){if(hasHelpOrVersion(argv))return!1;let[primary,secondary]=getCommandPath(argv,2);return primary?!(primary===`status`||primary===`health`||primary===`sessions`||primary===`config`&&(secondary===`get`||secondary===`unset`)||primary===`models`&&(secondary===`list`||secondary===`status`)):!0}async function runCli(argv=process$1.argv){let normalizedArgv=normalizeWindowsArgv(argv);if(loadDotEnv({quiet:!0}),normalizeEnv(),shouldEnsureCliPath(normalizedArgv)&&ensureBuilderForceAgentsCliOnPath(),assertSupportedRuntime(),await tryRouteCli(normalizedArgv))return;enableConsoleCapture();let{buildProgram}=await import(`./program-DOGUG9Uz.js`),program=buildProgram();installUnhandledRejectionHandler(),installUncaughtExceptionHandler();let parseArgv=rewriteUpdateFlagArgv(normalizedArgv),primary=getPrimaryCommand(parseArgv);if(primary){let{getProgramContext}=await import(`./program-context-BenlTDzh.js`),ctx=getProgramContext(program);if(ctx){let{registerCoreCliByName}=await import(`./command-registry-I83E6HLw.js`);await registerCoreCliByName(program,ctx,primary,parseArgv)}let{registerSubCliByName}=await import(`./register.subclis-Cfb5FUTI.js`);await registerSubCliByName(program,primary)}if(!shouldSkipPluginCommandRegistration({argv:parseArgv,primary,hasBuiltinPrimary:primary!==null&&program.commands.some(command=>command.name()===primary)})){let{registerPluginCliCommands}=await import(`./cli-gsxv7DrZ.js`),{loadConfig}=await import(`./config-DzAlOJby.js`);registerPluginCliCommands(program,loadConfig())}await program.parseAsync(parseArgv)}export{runCli};
@@ -1,4 +1,4 @@
1
- import{P as shouldLogVerbose,d as isRecord,j as logVerbose}from"./utils-BP60e80M.js";import{Et as nativeComplete,L as normalizeProviderId,Nt as requireApiKey,Pt as resolveApiKeyForProvider,et as normalizeGoogleModelId,jt as getApiKeyForModel,wt as stripReasoningTagsFromText,zt as normalizeSecretInput}from"./auth-profiles-BARnVAUE.js";import{t as logDebug}from"./logger-AbH8mdkv.js";import{n as runExec}from"./exec-CGuYALEs.js";import{t as normalizeBaseUrl$1}from"./normalize-base-url-CaRxuDMW.js";import{i as readSharedEnvVar,n as isTruthyFlag,r as readRuntimeEnvVar,t as isOfflineMode}from"./env-file-BIKVpYUN.js";import{a as ensureBuilderForceAgentsModelsJson,i as discoverModels,r as discoverAuthStorage}from"./model-discovery-DxpimsRF.js";import{i as modelSupportsVision,r as loadModelCatalog,t as findModelInCatalog}from"./model-catalog-wcISK04b.js";import{t as normalizeChatType}from"./chat-type-C5S9AYMO.js";import{c as detectMime,f as isAudioFileName,m as kindFromMime,u as getFileExtension}from"./image-ops-Bg9yFwjX.js";import{r as formatUncaughtError,t as extractErrorCode}from"./errors-t5wHPcwh.js";import{W as sanitizeUserFacingText}from"./embedded-helpers-Q5h1lA6D.js";import{n as collectProviderApiKeysForExecution,r as executeWithApiKeyRotation,t as parseGeminiAuth}from"./gemini-auth-BZgBIY0M.js";import{n as resolveToolDisplay,t as formatToolDetail}from"./tool-display-BIswnHaq.js";import{n as fetchWithTimeout}from"./fetch-timeout-DykxEVWb.js";import{t as fetchWithSsrFGuard}from"./fetch-guard-CoGEds8D.js";import{n as fetchRemoteMedia,t as MediaFetchError}from"./fetch-CUsKv8oj.js";import process$1 from"node:process";import os from"node:os";import path from"node:path";import{constants}from"node:fs";import crypto from"node:crypto";import{fileURLToPath}from"node:url";import fs$1 from"node:fs/promises";function extractTextFromChatContent(content,opts){let normalize=opts?.normalizeText??(text=>text.replace(/\s+/g,` `).trim()),joinWith=opts?.joinWith??` `;if(typeof content==`string`)return normalize(opts?.sanitizeText?opts.sanitizeText(content):content)||null;if(!Array.isArray(content))return null;let chunks=[];for(let block of content){if(!block||typeof block!=`object`||block.type!==`text`)continue;let text=block.text;if(typeof text!=`string`)continue;let value=opts?.sanitizeText?opts.sanitizeText(text):text;value.trim()&&chunks.push(value)}return normalize(chunks.join(joinWith))||null}function isAssistantMessage(msg){return msg?.role===`assistant`}function stripMinimaxToolCallXml(text){if(!text||!/minimax:tool_call/i.test(text))return text;let cleaned=text.replace(/<invoke\b[^>]*>[\s\S]*?<\/invoke>/gi,``);return cleaned=cleaned.replace(/<\/?minimax:tool_call>/gi,``),cleaned}function stripDowngradedToolCallText(text){if(!text||!/\[Tool (?:Call|Result)/i.test(text)&&!/\[Historical context/i.test(text))return text;let consumeJsonish=(input,start,options)=>{let{allowLeadingNewlines=!1}=options??{},index=start;for(;index<input.length;){let ch=input[index];if(ch===` `||ch===` `){index+=1;continue}if(allowLeadingNewlines&&(ch===`
1
+ import{P as shouldLogVerbose,d as isRecord,j as logVerbose}from"./utils-BP60e80M.js";import{Et as nativeComplete,L as normalizeProviderId,Nt as requireApiKey,Pt as resolveApiKeyForProvider,et as normalizeGoogleModelId,jt as getApiKeyForModel,wt as stripReasoningTagsFromText,zt as normalizeSecretInput}from"./auth-profiles-BARnVAUE.js";import{t as logDebug}from"./logger-AbH8mdkv.js";import{n as runExec}from"./exec-CGuYALEs.js";import{t as normalizeBaseUrl$1}from"./normalize-base-url-CaRxuDMW.js";import{i as readSharedEnvVar,n as isTruthyFlag,r as readRuntimeEnvVar,t as isOfflineMode}from"./env-file-BIKVpYUN.js";import{a as ensureBuilderForceAgentsModelsJson,i as discoverModels,r as discoverAuthStorage}from"./model-discovery-DxpimsRF.js";import{i as modelSupportsVision,r as loadModelCatalog,t as findModelInCatalog}from"./model-catalog-wcISK04b.js";import{t as normalizeChatType}from"./chat-type-C5S9AYMO.js";import{c as detectMime,f as isAudioFileName,m as kindFromMime,u as getFileExtension}from"./image-ops-Bg9yFwjX.js";import{r as formatUncaughtError,t as extractErrorCode}from"./errors-t5wHPcwh.js";import{W as sanitizeUserFacingText}from"./embedded-helpers-DGDYymYx.js";import{n as collectProviderApiKeysForExecution,r as executeWithApiKeyRotation,t as parseGeminiAuth}from"./gemini-auth-BZgBIY0M.js";import{n as resolveToolDisplay,t as formatToolDetail}from"./tool-display-BIswnHaq.js";import{n as fetchWithTimeout}from"./fetch-timeout-DykxEVWb.js";import{t as fetchWithSsrFGuard}from"./fetch-guard-CoGEds8D.js";import{n as fetchRemoteMedia,t as MediaFetchError}from"./fetch-CUsKv8oj.js";import process$1 from"node:process";import os from"node:os";import path from"node:path";import{constants}from"node:fs";import crypto from"node:crypto";import{fileURLToPath}from"node:url";import fs$1 from"node:fs/promises";function extractTextFromChatContent(content,opts){let normalize=opts?.normalizeText??(text=>text.replace(/\s+/g,` `).trim()),joinWith=opts?.joinWith??` `;if(typeof content==`string`)return normalize(opts?.sanitizeText?opts.sanitizeText(content):content)||null;if(!Array.isArray(content))return null;let chunks=[];for(let block of content){if(!block||typeof block!=`object`||block.type!==`text`)continue;let text=block.text;if(typeof text!=`string`)continue;let value=opts?.sanitizeText?opts.sanitizeText(text):text;value.trim()&&chunks.push(value)}return normalize(chunks.join(joinWith))||null}function isAssistantMessage(msg){return msg?.role===`assistant`}function stripMinimaxToolCallXml(text){if(!text||!/minimax:tool_call/i.test(text))return text;let cleaned=text.replace(/<invoke\b[^>]*>[\s\S]*?<\/invoke>/gi,``);return cleaned=cleaned.replace(/<\/?minimax:tool_call>/gi,``),cleaned}function stripDowngradedToolCallText(text){if(!text||!/\[Tool (?:Call|Result)/i.test(text)&&!/\[Historical context/i.test(text))return text;let consumeJsonish=(input,start,options)=>{let{allowLeadingNewlines=!1}=options??{},index=start;for(;index<input.length;){let ch=input[index];if(ch===` `||ch===` `){index+=1;continue}if(allowLeadingNewlines&&(ch===`
2
2
  `||ch===`\r`)){index+=1;continue}break}if(index>=input.length)return null;let startChar=input[index];if(startChar===`{`||startChar===`[`){let depth=0,inString=!1,escape=!1;for(let i=index;i<input.length;i+=1){let ch=input[i];if(inString){escape?escape=!1:ch===`\\`?escape=!0:ch===`"`&&(inString=!1);continue}if(ch===`"`){inString=!0;continue}if(ch===`{`||ch===`[`){depth+=1;continue}if((ch===`}`||ch===`]`)&&(--depth,depth===0))return i+1}return null}if(startChar===`"`){let escape=!1;for(let i=index+1;i<input.length;i+=1){let ch=input[i];if(escape){escape=!1;continue}if(ch===`\\`){escape=!0;continue}if(ch===`"`)return i+1}return null}let end=index;for(;end<input.length&&input[end]!==`
3
3
  `&&input[end]!==`\r`;)end+=1;return end},cleaned=(input=>{let markerRe=/\[Tool Call:[^\]]*\]/gi,result=``,cursor=0;for(let match of input.matchAll(markerRe)){let start=match.index??0;if(start<cursor)continue;result+=input.slice(cursor,start);let index=start+match[0].length;for(;index<input.length&&(input[index]===` `||input[index]===` `);)index+=1;for(input[index]===`\r`&&(index+=1),input[index]===`
4
4
  `&&(index+=1);index<input.length&&(input[index]===` `||input[index]===` `);)index+=1;if(input.slice(index,index+9).toLowerCase()===`arguments`){index+=9,input[index]===`:`&&(index+=1),input[index]===` `&&(index+=1);let end=consumeJsonish(input,index,{allowLeadingNewlines:!0});end!==null&&(index=end)}(input[index]===`
@@ -9,5 +9,5 @@ import{P as shouldLogVerbose,d as isRecord,j as logVerbose}from"./utils-BP60e80M
9
9
  `).trim():``}function formatReasoningMessage(text){let trimmed=text.trim();return trimmed?`Reasoning:\n${trimmed.split(`
10
10
  `).map(line=>line&&`_${line}_`).join(`
11
11
  `)}`:``}function splitThinkingTaggedText(text){let trimmedStart=text.trimStart();if(!trimmedStart.startsWith(`<`)||!/<\s*(?:think(?:ing)?|thought|antthinking)\s*>/i.test(trimmedStart)||!/<\s*\/\s*(?:think(?:ing)?|thought|antthinking)\s*>/i.test(text))return null;let scanRe=/<\s*(\/?)\s*(?:think(?:ing)?|thought|antthinking)\s*>/gi,inThinking=!1,cursor=0,thinkingStart=0,blocks=[],pushText=value=>{value&&blocks.push({type:`text`,text:value})},pushThinking=value=>{let cleaned=value.trim();cleaned&&blocks.push({type:`thinking`,thinking:cleaned})};for(let match of text.matchAll(scanRe)){let index=match.index??0,isClose=!!match[1]?.includes(`/`);if(!inThinking&&!isClose){pushText(text.slice(cursor,index)),thinkingStart=index+match[0].length,inThinking=!0;continue}inThinking&&isClose&&(pushThinking(text.slice(thinkingStart,index)),cursor=index+match[0].length,inThinking=!1)}return inThinking||(pushText(text.slice(cursor)),!blocks.some(b=>b.type===`thinking`))?null:blocks}function promoteThinkingTagsToBlocks(message){if(!Array.isArray(message.content)||message.content.some(block=>block.type===`thinking`))return;let next=[],changed=!1;for(let block of message.content){if(block.type!==`text`){next.push(block);continue}let split=splitThinkingTaggedText(block.text);if(!split){next.push(block);continue}changed=!0;for(let part of split)if(part.type===`thinking`)next.push({type:`thinking`,thinking:part.thinking});else if(part.type===`text`){let cleaned=part.text.trimStart();cleaned&&next.push({type:`text`,text:cleaned})}}changed&&(message.content=next)}function extractThinkingFromTaggedText(text){if(!text)return``;let scanRe=/<\s*(\/?)\s*(?:think(?:ing)?|thought|antthinking)\s*>/gi,result=``,lastIndex=0,inThinking=!1;for(let match of text.matchAll(scanRe)){let idx=match.index??0;inThinking&&(result+=text.slice(lastIndex,idx)),inThinking=match[1]!==`/`,lastIndex=idx+match[0].length}return result.trim()}function extractThinkingFromTaggedStream(text){if(!text)return``;let closed=extractThinkingFromTaggedText(text);if(closed)return closed;let openRe=/<\s*(?:think(?:ing)?|thought|antthinking)\s*>/gi,closeRe=/<\s*\/\s*(?:think(?:ing)?|thought|antthinking)\s*>/gi,openMatches=[...text.matchAll(openRe)];if(openMatches.length===0)return``;let closeMatches=[...text.matchAll(closeRe)],lastOpen=openMatches[openMatches.length-1],lastClose=closeMatches[closeMatches.length-1];if(lastClose&&(lastClose.index??-1)>(lastOpen.index??-1))return closed;let start=(lastOpen.index??0)+lastOpen[0].length;return text.slice(start).trim()}function inferToolMetaFromArgs(toolName,args){return formatToolDetail(resolveToolDisplay({name:toolName,args}))}function formatTemplateValue(value){return value==null?``:typeof value==`string`?value:typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value):typeof value==`symbol`||typeof value==`function`?value.toString():Array.isArray(value)?value.flatMap(entry=>entry==null?[]:typeof entry==`string`?[entry]:typeof entry==`number`||typeof entry==`boolean`||typeof entry==`bigint`?[String(entry)]:[]).join(`,`):``}function applyTemplate(str,ctx){return str?str.replace(/{{\s*(\w+)\s*}}/g,(_,key)=>{let value=ctx[key];return formatTemplateValue(value)}):``}const MB=1024*1024,DEFAULT_MAX_CHARS_BY_CAPABILITY={image:500,audio:void 0,video:500},DEFAULT_MAX_BYTES={image:10*MB,audio:20*MB,video:50*MB},DEFAULT_TIMEOUT_SECONDS={image:60,audio:60,video:120},DEFAULT_PROMPT={image:`Describe the image.`,audio:`Transcribe the audio.`,video:`Describe the video.`};70*MB;const DEFAULT_AUDIO_MODELS={groq:`whisper-large-v3-turbo`,openai:`gpt-4o-mini-transcribe`,deepgram:`nova-3`},AUTO_AUDIO_KEY_PROVIDERS=[`openai`,`groq`,`deepgram`,`google`],AUTO_IMAGE_KEY_PROVIDERS=[`openai`,`anthropic`,`google`,`minimax`,`zai`],AUTO_VIDEO_KEY_PROVIDERS=[`google`],DEFAULT_IMAGE_MODELS={openai:`gpt-5-mini`,anthropic:`claude-opus-4-6`,google:`gemini-3-flash-preview`,minimax:`MiniMax-VL-01`,zai:`glm-4.6v`},CLI_OUTPUT_MAX_BUFFER=5*MB;function coerceApiHost(params){let env=params.env??process.env,raw=params.apiHost?.trim()||env.MINIMAX_API_HOST?.trim()||params.modelBaseUrl?.trim()||`https://api.minimax.io`;try{return new URL(raw).origin}catch{}try{return new URL(`https://${raw}`).origin}catch{return`https://api.minimax.io`}}function pickString(rec,key){let v=rec[key];return typeof v==`string`?v:``}async function minimaxUnderstandImage(params){let apiKey=normalizeSecretInput(params.apiKey);if(!apiKey)throw Error(`MiniMax VLM: apiKey required`);let prompt=params.prompt.trim();if(!prompt)throw Error(`MiniMax VLM: prompt required`);let imageDataUrl=params.imageDataUrl.trim();if(!imageDataUrl)throw Error(`MiniMax VLM: imageDataUrl required`);if(!/^data:image\/(png|jpeg|webp);base64,/i.test(imageDataUrl))throw Error(`MiniMax VLM: imageDataUrl must be a base64 data:image/(png|jpeg|webp) URL`);let host=coerceApiHost({apiHost:params.apiHost,modelBaseUrl:params.modelBaseUrl}),url=new URL(`/v1/coding_plan/vlm`,host).toString(),res=await fetch(url,{method:`POST`,headers:{Authorization:`Bearer ${apiKey}`,"Content-Type":`application/json`,"MM-API-Source":`BuilderForceAgents`},body:JSON.stringify({prompt,image_url:imageDataUrl})}),traceId=res.headers.get(`Trace-Id`)??``;if(!res.ok){let body=await res.text().catch(()=>``),trace=traceId?` Trace-Id: ${traceId}`:``;throw Error(`MiniMax VLM request failed (${res.status} ${res.statusText}).${trace}${body?` Body: ${body.slice(0,400)}`:``}`)}let json=await res.json().catch(()=>null);if(!isRecord(json)){let trace=traceId?` Trace-Id: ${traceId}`:``;throw Error(`MiniMax VLM response was not JSON.${trace}`)}let baseResp=isRecord(json.base_resp)?json.base_resp:{},code=typeof baseResp.status_code==`number`?baseResp.status_code:-1;if(code!==0){let msg=(baseResp.status_msg??``).trim(),trace=traceId?` Trace-Id: ${traceId}`:``;throw Error(`MiniMax VLM API error (${code})${msg?`: ${msg}`:``}.${trace}`)}let content=pickString(json,`content`).trim();if(!content){let trace=traceId?` Trace-Id: ${traceId}`:``;throw Error(`MiniMax VLM returned no content.${trace}`)}return content}function decodeDataUrl(dataUrl){let trimmed=dataUrl.trim(),match=/^data:([^;,]+);base64,([a-z0-9+/=\r\n]+)$/i.exec(trimmed);if(!match)throw Error(`Invalid data URL (expected base64 data: URL).`);let mimeType=(match[1]??``).trim().toLowerCase();if(!mimeType.startsWith(`image/`))throw Error(`Unsupported data URL type: ${mimeType||`unknown`}`);let b64=(match[2]??``).trim(),buffer=Buffer.from(b64,`base64`);if(buffer.length===0)throw Error(`Invalid data URL: empty payload.`);return{buffer,mimeType,kind:`image`}}function coerceImageAssistantText(params){let stop=params.message.stopReason,errorMessage=params.message.errorMessage?.trim();if(stop===`error`||stop===`aborted`)throw Error(errorMessage?`Image model failed (${params.provider}/${params.model}): ${errorMessage}`:`Image model failed (${params.provider}/${params.model})`);if(errorMessage)throw Error(`Image model failed (${params.provider}/${params.model}): ${errorMessage}`);let text=extractAssistantText(params.message);if(text.trim())return text.trim();throw Error(`Image model returned no text (${params.provider}/${params.model}).`)}function coerceImageModelConfig(cfg){let imageModel=cfg?.agents?.defaults?.imageModel,primary=typeof imageModel==`string`?imageModel.trim():imageModel?.primary,fallbacks=typeof imageModel==`object`?imageModel?.fallbacks??[]:[];return{...primary?.trim()?{primary:primary.trim()}:{},...fallbacks.length>0?{fallbacks}:{}}}function resolveProviderVisionModelFromConfig(params){let models=params.cfg?.models?.providers?.[params.provider]?.models??[],id=(((params.provider===`minimax`?models.find(m=>(m?.id??``).trim()===`MiniMax-VL-01`&&Array.isArray(m?.input)&&m.input.includes(`image`)):null)??models.find(m=>!!(m?.id??``).trim()&&m.input?.includes(`image`)))?.id??``).trim();return id?`${params.provider}/${id}`:null}async function describeImageWithModel(params){await ensureBuilderForceAgentsModelsJson(params.cfg,params.agentDir);let authStorage=discoverAuthStorage(params.agentDir),model=discoverModels(authStorage,params.agentDir).find(params.provider,params.model);if(!model)throw Error(`Unknown model: ${params.provider}/${params.model}`);if(!model.input?.includes(`image`))throw Error(`Model does not support images: ${params.provider}/${params.model}`);let apiKey=requireApiKey(await getApiKeyForModel({model,cfg:params.cfg,agentDir:params.agentDir,profileId:params.profile,preferredProfile:params.preferredProfile}),model.provider);authStorage.setRuntimeApiKey(model.provider,apiKey);let base64=params.buffer.toString(`base64`);if(model.provider===`minimax`)return{text:await minimaxUnderstandImage({apiKey,prompt:params.prompt??`Describe the image.`,imageDataUrl:`data:${params.mime??`image/jpeg`};base64,${base64}`,modelBaseUrl:model.baseUrl}),model:model.id};let visionMessages={messages:[{role:`user`,content:[{type:`text`,text:params.prompt??`Describe the image.`},{type:`image`,data:base64,mimeType:params.mime??`image/jpeg`}],timestamp:Date.now()}]}.messages.map(m=>({role:m.role,content:Array.isArray(m.content)?m.content.map(c=>c.type===`image`?{type:`image_url`,image_url:{url:`data:${c.mimeType};base64,${c.data}`}}:{type:`text`,text:c.text}):m.content})),res=await nativeComplete({baseUrl:model.baseUrl,apiKey,defaultModel:model.id},{model:model.id,messages:visionMessages,extra:{max_tokens:params.maxTokens??512}});return{text:coerceImageAssistantText({message:{role:`assistant`,content:[{type:`text`,text:res.content}],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:res.finishReason===`error`?`error`:`stop`,timestamp:Date.now()},provider:model.provider,model:model.id}),model:model.id}}const anthropicProvider={id:`anthropic`,capabilities:[`image`],describeImage:describeImageWithModel};function normalizeBaseUrl(baseUrl,fallback){return normalizeBaseUrl$1(baseUrl?.trim()||fallback)}async function fetchWithTimeoutGuarded(url,init,timeoutMs,fetchFn,options){return await fetchWithSsrFGuard({url,fetchImpl:fetchFn,init,timeoutMs,policy:options?.ssrfPolicy,lookupFn:options?.lookupFn,pinDns:options?.pinDns})}async function readErrorResponse(res){try{let collapsed=(await res.text()).replace(/\s+/g,` `).trim();return collapsed?collapsed.length<=300?collapsed:`${collapsed.slice(0,300)}…`:void 0}catch{return}}async function assertOkOrThrowHttpError(res,label){if(res.ok)return;let detail=await readErrorResponse(res),suffix=detail?`: ${detail}`:``;throw Error(`${label} (HTTP ${res.status})${suffix}`)}function resolveModel$1(model){return model?.trim()||`nova-3`}async function transcribeDeepgramAudio(params){let fetchFn=params.fetchFn??fetch,baseUrl=normalizeBaseUrl(params.baseUrl,`https://api.deepgram.com/v1`),allowPrivate=!!params.baseUrl?.trim(),model=resolveModel$1(params.model),url=new URL(`${baseUrl}/listen`);if(url.searchParams.set(`model`,model),params.language?.trim()&&url.searchParams.set(`language`,params.language.trim()),params.query)for(let[key,value]of Object.entries(params.query))value!==void 0&&url.searchParams.set(key,String(value));let headers=new Headers(params.headers);headers.has(`authorization`)||headers.set(`authorization`,`Token ${params.apiKey}`),headers.has(`content-type`)||headers.set(`content-type`,params.mime??`application/octet-stream`);let body=new Uint8Array(params.buffer),{response:res,release}=await fetchWithTimeoutGuarded(url.toString(),{method:`POST`,headers,body},params.timeoutMs,fetchFn,allowPrivate?{ssrfPolicy:{allowPrivateNetwork:!0}}:void 0);try{await assertOkOrThrowHttpError(res,`Audio transcription failed`);let transcript=(await res.json()).results?.channels?.[0]?.alternatives?.[0]?.transcript?.trim();if(!transcript)throw Error(`Audio transcription response missing transcript`);return{text:transcript,model}}finally{await release()}}const deepgramProvider={id:`deepgram`,capabilities:[`audio`],transcribeAudio:transcribeDeepgramAudio};async function generateGeminiInlineDataText(params){let fetchFn=params.fetchFn??fetch,baseUrl=normalizeBaseUrl(params.baseUrl,params.defaultBaseUrl),allowPrivate=!!params.baseUrl?.trim(),model=(()=>{let trimmed=params.model?.trim();return trimmed?normalizeGoogleModelId(trimmed):params.defaultModel})(),url=`${baseUrl}/models/${model}:generateContent`,authHeaders=parseGeminiAuth(params.apiKey),headers=new Headers(params.headers);for(let[key,value]of Object.entries(authHeaders.headers))headers.has(key)||headers.set(key,value);let body={contents:[{role:`user`,parts:[{text:params.prompt?.trim()||params.defaultPrompt},{inline_data:{mime_type:params.mime??params.defaultMime,data:params.buffer.toString(`base64`)}}]}]},{response:res,release}=await fetchWithTimeoutGuarded(url,{method:`POST`,headers,body:JSON.stringify(body)},params.timeoutMs,fetchFn,allowPrivate?{ssrfPolicy:{allowPrivateNetwork:!0}}:void 0);try{await assertOkOrThrowHttpError(res,params.httpErrorLabel);let text=((await res.json()).candidates?.[0]?.content?.parts??[]).map(part=>part?.text?.trim()).filter(Boolean).join(`
12
- `);if(!text)throw Error(params.missingTextError);return{text,model}}finally{await release()}}async function transcribeGeminiAudio(params){let{text,model}=await generateGeminiInlineDataText({...params,defaultBaseUrl:`https://generativelanguage.googleapis.com/v1beta`,defaultModel:`gemini-3-flash-preview`,defaultPrompt:`Transcribe the audio.`,defaultMime:`audio/wav`,httpErrorLabel:`Audio transcription failed`,missingTextError:`Audio transcription response missing text`});return{text,model}}async function describeGeminiVideo(params){let{text,model}=await generateGeminiInlineDataText({...params,defaultBaseUrl:`https://generativelanguage.googleapis.com/v1beta`,defaultModel:`gemini-3-flash-preview`,defaultPrompt:`Describe the video.`,defaultMime:`video/mp4`,httpErrorLabel:`Video description failed`,missingTextError:`Video description response missing text`});return{text,model}}const googleProvider={id:`google`,capabilities:[`image`,`audio`,`video`],describeImage:describeImageWithModel,transcribeAudio:transcribeGeminiAudio,describeVideo:describeGeminiVideo};function resolveModel(model){return model?.trim()||`gpt-4o-mini-transcribe`}async function transcribeOpenAiCompatibleAudio(params){let fetchFn=params.fetchFn??fetch,baseUrl=normalizeBaseUrl(params.baseUrl,`https://api.openai.com/v1`),allowPrivate=!!params.baseUrl?.trim(),url=`${baseUrl}/audio/transcriptions`,model=resolveModel(params.model),form=new FormData,fileName=params.fileName?.trim()||path.basename(params.fileName)||`audio`,bytes=new Uint8Array(params.buffer),blob=new Blob([bytes],{type:params.mime??`application/octet-stream`});form.append(`file`,blob,fileName),form.append(`model`,model),params.language?.trim()&&form.append(`language`,params.language.trim()),params.prompt?.trim()&&form.append(`prompt`,params.prompt.trim());let headers=new Headers(params.headers);headers.has(`authorization`)||headers.set(`authorization`,`Bearer ${params.apiKey}`);let{response:res,release}=await fetchWithTimeoutGuarded(url,{method:`POST`,headers,body:form},params.timeoutMs,fetchFn,allowPrivate?{ssrfPolicy:{allowPrivateNetwork:!0}}:void 0);try{await assertOkOrThrowHttpError(res,`Audio transcription failed`);let text=(await res.json()).text?.trim();if(!text)throw Error(`Audio transcription response missing text`);return{text,model}}finally{await release()}}const PROVIDERS=[{id:`groq`,capabilities:[`audio`],transcribeAudio:req=>transcribeOpenAiCompatibleAudio({...req,baseUrl:req.baseUrl??`https://api.groq.com/openai/v1`})},{id:`openai`,capabilities:[`image`],describeImage:describeImageWithModel,transcribeAudio:transcribeOpenAiCompatibleAudio},googleProvider,anthropicProvider,{id:`minimax`,capabilities:[`image`],describeImage:describeImageWithModel},{id:`zai`,capabilities:[`image`],describeImage:describeImageWithModel},deepgramProvider];function normalizeMediaProviderId(id){let normalized=normalizeProviderId(id);return normalized===`gemini`?`google`:normalized}function buildMediaUnderstandingRegistry(overrides){let registry=new Map;for(let provider of PROVIDERS)registry.set(normalizeMediaProviderId(provider.id),provider);if(overrides)for(let[key,provider]of Object.entries(overrides)){let normalizedKey=normalizeMediaProviderId(key),existing=registry.get(normalizedKey),merged=existing?{...existing,...provider,capabilities:provider.capabilities??existing.capabilities}:provider;registry.set(normalizedKey,merged)}return registry}function getMediaUnderstandingProvider(id,registry){return registry.get(normalizeMediaProviderId(id))}function normalizeDecision(value){let normalized=value?.trim().toLowerCase();if(normalized===`allow`)return`allow`;if(normalized===`deny`)return`deny`}function normalizeMatch(value){return value?.trim().toLowerCase()||void 0}function normalizeMediaUnderstandingChatType(raw){return normalizeChatType(raw??void 0)}function resolveMediaUnderstandingScope(params){let scope=params.scope;if(!scope)return`allow`;let channel=normalizeMatch(params.channel),chatType=normalizeMediaUnderstandingChatType(params.chatType),sessionKey=normalizeMatch(params.sessionKey)??``;for(let rule of scope.rules??[]){if(!rule)continue;let action=normalizeDecision(rule.action)??`allow`,match=rule.match??{},matchChannel=normalizeMatch(match.channel),matchChatType=normalizeMediaUnderstandingChatType(match.chatType),matchPrefix=normalizeMatch(match.keyPrefix);if(!(matchChannel&&matchChannel!==channel)&&!(matchChatType&&matchChatType!==chatType)&&!(matchPrefix&&!sessionKey.startsWith(matchPrefix)))return action}return normalizeDecision(scope.default)??`allow`}function resolveTimeoutMs(seconds,fallbackSeconds){let value=typeof seconds==`number`&&Number.isFinite(seconds)?seconds:fallbackSeconds;return Math.max(1e3,Math.floor(value*1e3))}function resolvePrompt(capability,prompt,maxChars){let base=prompt?.trim()||DEFAULT_PROMPT[capability];return!maxChars||capability===`audio`?base:`${base} Respond in at most ${maxChars} characters.`}function resolveMaxChars(params){let{capability,entry,cfg}=params,configured=entry.maxChars??params.config?.maxChars??cfg.tools?.media?.[capability]?.maxChars;return typeof configured==`number`?configured:DEFAULT_MAX_CHARS_BY_CAPABILITY[capability]}function resolveMaxBytes(params){let configured=params.entry.maxBytes??params.config?.maxBytes??params.cfg.tools?.media?.[params.capability]?.maxBytes;return typeof configured==`number`?configured:DEFAULT_MAX_BYTES[params.capability]}function resolveScopeDecision(params){return resolveMediaUnderstandingScope({scope:params.scope,sessionKey:params.ctx.SessionKey,channel:params.ctx.Surface??params.ctx.Provider,chatType:normalizeMediaUnderstandingChatType(params.ctx.ChatType)})}function resolveEntryCapabilities(params){if((params.entry.type??(params.entry.command?`cli`:`provider`))===`cli`)return;let providerId=normalizeMediaProviderId(params.entry.provider??``);if(providerId)return params.providerRegistry.get(providerId)?.capabilities}function resolveModelEntries(params){let{cfg,capability,config}=params,sharedModels=cfg.tools?.media?.models??[],entries=[...(config?.models??[]).map(entry=>({entry,source:`capability`})),...sharedModels.map(entry=>({entry,source:`shared`}))];return entries.length===0?[]:entries.filter(({entry,source})=>{let caps=entry.capabilities&&entry.capabilities.length>0?entry.capabilities:source===`shared`?resolveEntryCapabilities({entry,providerRegistry:params.providerRegistry}):void 0;return!caps||caps.length===0?source===`shared`?(shouldLogVerbose()&&logVerbose(`Skipping shared media model without capabilities: ${entry.provider??entry.command??`unknown`}`),!1):!0:caps.includes(capability)}).map(({entry})=>entry)}function resolveConcurrency(cfg){let configured=cfg.tools?.media?.concurrency;return typeof configured==`number`&&Number.isFinite(configured)&&configured>0?Math.floor(configured):2}async function loadWorkspaceContext(workspaceDir){try{let{loadProjectContext}=await import(`./project-context-store-DNx9ScQ_.js`);return await loadProjectContext(workspaceDir)}catch(err){return logDebug(`[error-report] could not read project context: ${String(err)}`),null}}function isPlatformErrorReportingEnabled(){return isOfflineMode()?!1:isTruthyFlag(readRuntimeEnvVar(`BUILDERFORCE_ERROR_REPORTING`))}async function sendRuntimeErrorReport(error,report){if(!isPlatformErrorReportingEnabled())return;let message=error instanceof Error?error.message:String(error),stack=error instanceof Error?error.stack??null:null,apiKey=readSharedEnvVar(`BUILDERFORCE_API_KEY`);if(!apiKey)return;let ctx=report.workspaceDir?await loadWorkspaceContext(report.workspaceDir):null,agentHostId=ctx?.builderforce?.instanceId;if(!agentHostId)return;let projectIdRaw=ctx?.builderforce?.projectId?Number(ctx.builderforce.projectId):NaN,projectId=Number.isFinite(projectIdRaw)&&projectIdRaw>0?projectIdRaw:null,base=normalizeBaseUrl$1(readSharedEnvVar(`BUILDERFORCE_URL`)??`https://api.builderforce.ai`);try{let res=await fetch(`${base}/api/quality-ingest/client-report`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${apiKey}`,"X-AgentHost-Id":String(agentHostId)},body:JSON.stringify({source:`agent-runtime`,projectId,events:[{type:error instanceof Error?error.name:`AgentRuntimeError`,message,stack,level:report.level??`error`,operation:report.operation,timestamp:new Date().toISOString(),context:report.context??{}}]}),signal:AbortSignal.timeout(8e3)});res.ok||logDebug(`[error-report] returned HTTP ${res.status}`)}catch(err){logDebug(`[error-report] failed: ${String(err)}`)}}async function reportAndExit(error,options){console.error(options.label,formatUncaughtError(error)),isPlatformErrorReportingEnabled()&&await Promise.race([sendRuntimeErrorReport(error,{operation:options.operation,level:`fatal`,workspaceDir:options.workspaceDir??process$1.cwd()}),new Promise(resolve=>setTimeout(resolve,5e3).unref?.())]).catch(reportingError=>{logDebug(`[fatal-exit] crash report failed: ${String(reportingError)}`)}),process$1.exit(options.exitCode??1)}function installUncaughtExceptionHandler(workspaceDir){process$1.on(`uncaughtException`,error=>{reportAndExit(error,{operation:`uncaughtException`,label:`[builderforce] Uncaught exception:`,workspaceDir})})}const handlers=new Set,FATAL_ERROR_CODES=new Set([`ERR_OUT_OF_MEMORY`,`ERR_SCRIPT_EXECUTION_TIMEOUT`,`ERR_WORKER_OUT_OF_MEMORY`,`ERR_WORKER_UNCAUGHT_EXCEPTION`,`ERR_WORKER_INITIALIZATION_FAILED`]),CONFIG_ERROR_CODES=new Set([`INVALID_CONFIG`,`MISSING_API_KEY`,`MISSING_CREDENTIALS`]),TRANSIENT_NETWORK_CODES=new Set([`ECONNRESET`,`ECONNREFUSED`,`ENOTFOUND`,`ETIMEDOUT`,`ESOCKETTIMEDOUT`,`ECONNABORTED`,`EPIPE`,`EHOSTUNREACH`,`ENETUNREACH`,`EAI_AGAIN`,`UND_ERR_CONNECT_TIMEOUT`,`UND_ERR_DNS_RESOLVE_FAILED`,`UND_ERR_CONNECT`,`UND_ERR_SOCKET`,`UND_ERR_HEADERS_TIMEOUT`,`UND_ERR_BODY_TIMEOUT`]);function getErrorCause(err){if(!(!err||typeof err!=`object`))return err.cause}function extractErrorCodeWithCause(err){return extractErrorCode(err)||extractErrorCode(getErrorCause(err))}function isAbortError(err){return!err||typeof err!=`object`?!1:(`name`in err?String(err.name):``)===`AbortError`||(`message`in err&&typeof err.message==`string`?err.message:``)===`This operation was aborted`}function isFatalError(err){let code=extractErrorCodeWithCause(err);return code!==void 0&&FATAL_ERROR_CODES.has(code)}function isConfigError(err){let code=extractErrorCodeWithCause(err);return code!==void 0&&CONFIG_ERROR_CODES.has(code)}function isTransientNetworkError(err){if(!err)return!1;let code=extractErrorCodeWithCause(err);if(code&&TRANSIENT_NETWORK_CODES.has(code))return!0;if(err instanceof TypeError&&err.message===`fetch failed`){let cause=getErrorCause(err);return cause?isTransientNetworkError(cause):!0}let cause=getErrorCause(err);return cause&&cause!==err?isTransientNetworkError(cause):err instanceof AggregateError&&err.errors?.length?err.errors.some(e=>isTransientNetworkError(e)):!1}function registerUnhandledRejectionHandler(handler){return handlers.add(handler),()=>{handlers.delete(handler)}}function isUnhandledRejectionHandled(reason){for(let handler of handlers)try{if(handler(reason))return!0}catch(err){console.error(`[builderforce] Unhandled rejection handler failed:`,err instanceof Error?err.stack??err.message:err)}return!1}function installUnhandledRejectionHandler(){process$1.on(`unhandledRejection`,(reason,_promise)=>{if(!isUnhandledRejectionHandled(reason)){if(isAbortError(reason)){console.warn(`[builderforce] Suppressed AbortError:`,formatUncaughtError(reason));return}if(isFatalError(reason)){reportAndExit(reason,{operation:`unhandledRejection:fatal`,label:`[builderforce] FATAL unhandled rejection:`});return}if(isConfigError(reason)){reportAndExit(reason,{operation:`unhandledRejection:config`,label:`[builderforce] CONFIGURATION ERROR - requires fix:`});return}if(isTransientNetworkError(reason)){console.warn(`[builderforce] Non-fatal unhandled rejection (continuing):`,formatUncaughtError(reason));return}reportAndExit(reason,{operation:`unhandledRejection`,label:`[builderforce] Unhandled promise rejection:`})}})}var MediaUnderstandingSkipError=class extends Error{constructor(reason,message){super(message),this.reason=reason,this.name=`MediaUnderstandingSkipError`}};function isMediaUnderstandingSkipError(err){return err instanceof MediaUnderstandingSkipError}function normalizeAttachmentPath(raw){let value=raw?.trim();if(value){if(value.startsWith(`file://`))try{return fileURLToPath(value)}catch{return}return value}}function normalizeAttachments(ctx){let pathsFromArray=Array.isArray(ctx.MediaPaths)?ctx.MediaPaths:void 0,urlsFromArray=Array.isArray(ctx.MediaUrls)?ctx.MediaUrls:void 0,typesFromArray=Array.isArray(ctx.MediaTypes)?ctx.MediaTypes:void 0,resolveMime=(count,index)=>{let typeHint=typesFromArray?.[index];return(typeof typeHint==`string`?typeHint.trim():``)||(count===1?ctx.MediaType:void 0)};if(pathsFromArray&&pathsFromArray.length>0){let count=pathsFromArray.length,urls=urlsFromArray&&urlsFromArray.length>0?urlsFromArray:void 0;return pathsFromArray.map((value,index)=>({path:value?.trim()||void 0,url:urls?.[index]??ctx.MediaUrl,mime:resolveMime(count,index),index})).filter(entry=>!!(entry.path?.trim()||entry.url?.trim()))}if(urlsFromArray&&urlsFromArray.length>0){let count=urlsFromArray.length;return urlsFromArray.map((value,index)=>({path:void 0,url:value?.trim()||void 0,mime:resolveMime(count,index),index})).filter(entry=>!!entry.url?.trim())}let pathValue=ctx.MediaPath?.trim(),url=ctx.MediaUrl?.trim();return!pathValue&&!url?[]:[{path:pathValue||void 0,url:url||void 0,mime:ctx.MediaType,index:0}]}function resolveAttachmentKind(attachment){let kind=kindFromMime(attachment.mime);if(kind===`image`||kind===`audio`||kind===`video`)return kind;let ext=getFileExtension(attachment.path??attachment.url);return ext?[`.mp4`,`.mov`,`.mkv`,`.webm`,`.avi`,`.m4v`].includes(ext)?`video`:isAudioFileName(attachment.path??attachment.url)?`audio`:[`.png`,`.jpg`,`.jpeg`,`.webp`,`.gif`,`.bmp`,`.tiff`,`.tif`].includes(ext)?`image`:`unknown`:`unknown`}function isVideoAttachment(attachment){return resolveAttachmentKind(attachment)===`video`}function isAudioAttachment(attachment){return resolveAttachmentKind(attachment)===`audio`}function isImageAttachment(attachment){return resolveAttachmentKind(attachment)===`image`}function resolveRequestUrl(input){return typeof input==`string`?input:input instanceof URL?input.toString():input.url}function orderAttachments(attachments,prefer){if(!prefer||prefer===`first`)return attachments;if(prefer===`last`)return[...attachments].toReversed();if(prefer===`path`){let withPath=attachments.filter(item=>item.path),withoutPath=attachments.filter(item=>!item.path);return[...withPath,...withoutPath]}if(prefer===`url`){let withUrl=attachments.filter(item=>item.url),withoutUrl=attachments.filter(item=>!item.url);return[...withUrl,...withoutUrl]}return attachments}function selectAttachments(params){let{capability,attachments,policy}=params,matches=attachments.filter(item=>capability===`audio`&&item.alreadyTranscribed?!1:capability===`image`?isImageAttachment(item):capability===`audio`?isAudioAttachment(item):isVideoAttachment(item));if(matches.length===0)return[];let ordered=orderAttachments(matches,policy?.prefer),mode=policy?.mode??`first`,maxAttachments=policy?.maxAttachments??1;return mode===`all`?ordered.slice(0,Math.max(1,maxAttachments)):ordered.slice(0,1)}var MediaAttachmentCache=class{constructor(attachments){this.entries=new Map,this.attachments=attachments;for(let attachment of attachments)this.entries.set(attachment.index,{attachment})}async getBuffer(params){let entry=await this.ensureEntry(params.attachmentIndex);if(entry.buffer){if(entry.buffer.length>params.maxBytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`);return{buffer:entry.buffer,mime:entry.bufferMime,fileName:entry.bufferFileName??`media-${params.attachmentIndex+1}`,size:entry.buffer.length}}if(entry.resolvedPath){let size=await this.ensureLocalStat(entry);if(entry.resolvedPath){if(size!==void 0&&size>params.maxBytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`);let buffer=await fs$1.readFile(entry.resolvedPath);return entry.buffer=buffer,entry.bufferMime=entry.bufferMime??entry.attachment.mime??await detectMime({buffer,filePath:entry.resolvedPath}),entry.bufferFileName=path.basename(entry.resolvedPath)||`media-${params.attachmentIndex+1}`,{buffer,mime:entry.bufferMime,fileName:entry.bufferFileName,size:buffer.length}}}let url=entry.attachment.url?.trim();if(!url)throw new MediaUnderstandingSkipError(`empty`,`Attachment ${params.attachmentIndex+1} has no path or URL.`);try{let fetched=await fetchRemoteMedia({url,fetchImpl:(input,init)=>fetchWithTimeout(resolveRequestUrl(input),init??{},params.timeoutMs,fetch),maxBytes:params.maxBytes});return entry.buffer=fetched.buffer,entry.bufferMime=entry.attachment.mime??fetched.contentType??await detectMime({buffer:fetched.buffer,filePath:fetched.fileName??url}),entry.bufferFileName=fetched.fileName??`media-${params.attachmentIndex+1}`,{buffer:fetched.buffer,mime:entry.bufferMime,fileName:entry.bufferFileName,size:fetched.buffer.length}}catch(err){throw err instanceof MediaFetchError&&err.code===`max_bytes`?new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`):isAbortError(err)?new MediaUnderstandingSkipError(`timeout`,`Attachment ${params.attachmentIndex+1} timed out while fetching.`):err}}async getPath(params){let entry=await this.ensureEntry(params.attachmentIndex);if(entry.resolvedPath){if(params.maxBytes){let size=await this.ensureLocalStat(entry);if(entry.resolvedPath&&size!==void 0&&size>params.maxBytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`)}if(entry.resolvedPath)return{path:entry.resolvedPath}}if(entry.tempPath){if(params.maxBytes&&entry.buffer&&entry.buffer.length>params.maxBytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`);return{path:entry.tempPath,cleanup:entry.tempCleanup}}let maxBytes=params.maxBytes??1/0,bufferResult=await this.getBuffer({attachmentIndex:params.attachmentIndex,maxBytes,timeoutMs:params.timeoutMs}),extension=path.extname(bufferResult.fileName||``)||``,tmpPath=path.join(os.tmpdir(),`builderforce-media-${crypto.randomUUID()}${extension}`);return await fs$1.writeFile(tmpPath,bufferResult.buffer),entry.tempPath=tmpPath,entry.tempCleanup=async()=>{await fs$1.unlink(tmpPath).catch(()=>{})},{path:tmpPath,cleanup:entry.tempCleanup}}async cleanup(){let cleanups=[];for(let entry of this.entries.values())entry.tempCleanup&&=(cleanups.push(Promise.resolve(entry.tempCleanup())),void 0);await Promise.all(cleanups)}async ensureEntry(attachmentIndex){let existing=this.entries.get(attachmentIndex);if(existing)return existing.resolvedPath||=this.resolveLocalPath(existing.attachment),existing;let attachment=this.attachments.find(item=>item.index===attachmentIndex)??{index:attachmentIndex},entry={attachment,resolvedPath:this.resolveLocalPath(attachment)};return this.entries.set(attachmentIndex,entry),entry}resolveLocalPath(attachment){let rawPath=normalizeAttachmentPath(attachment.path);if(rawPath)return path.isAbsolute(rawPath)?rawPath:path.resolve(rawPath)}async ensureLocalStat(entry){if(entry.resolvedPath){if(entry.statSize!==void 0)return entry.statSize;try{let stat=await fs$1.stat(entry.resolvedPath);if(!stat.isFile()){entry.resolvedPath=void 0;return}return entry.statSize=stat.size,stat.size}catch(err){entry.resolvedPath=void 0,shouldLogVerbose()&&logVerbose(`Failed to read attachment ${entry.attachment.index+1}: ${String(err)}`);return}}}};async function fileExists(filePath){if(!filePath)return!1;try{return await fs$1.stat(filePath),!0}catch{return!1}}function extractLastJsonObject(raw){let trimmed=raw.trim(),start=trimmed.lastIndexOf(`{`);if(start===-1)return null;let slice=trimmed.slice(start);try{return JSON.parse(slice)}catch{return null}}function extractGeminiResponse(raw){let payload=extractLastJsonObject(raw);if(!payload||typeof payload!=`object`)return null;let response=payload.response;return typeof response==`string`&&response.trim()||null}function estimateBase64Size(bytes){return Math.ceil(bytes/3)*4}function resolveVideoMaxBase64Bytes(maxBytes){let expanded=Math.floor(4/3*maxBytes);return Math.min(expanded,73400320)}function trimOutput(text,maxChars){let trimmed=text.trim();return!maxChars||trimmed.length<=maxChars?trimmed:trimmed.slice(0,maxChars).trim()}function extractSherpaOnnxText(raw){let tryParse=value=>{let trimmed=value.trim();if(!trimmed)return null;let head=trimmed[0];if(head!==`{`&&head!==`"`)return null;try{let parsed=JSON.parse(trimmed);if(typeof parsed==`string`)return tryParse(parsed);if(parsed&&typeof parsed==`object`){let text=parsed.text;if(typeof text==`string`&&text.trim())return text.trim()}}catch{}return null},direct=tryParse(raw);if(direct)return direct;let lines=raw.split(`
12
+ `);if(!text)throw Error(params.missingTextError);return{text,model}}finally{await release()}}async function transcribeGeminiAudio(params){let{text,model}=await generateGeminiInlineDataText({...params,defaultBaseUrl:`https://generativelanguage.googleapis.com/v1beta`,defaultModel:`gemini-3-flash-preview`,defaultPrompt:`Transcribe the audio.`,defaultMime:`audio/wav`,httpErrorLabel:`Audio transcription failed`,missingTextError:`Audio transcription response missing text`});return{text,model}}async function describeGeminiVideo(params){let{text,model}=await generateGeminiInlineDataText({...params,defaultBaseUrl:`https://generativelanguage.googleapis.com/v1beta`,defaultModel:`gemini-3-flash-preview`,defaultPrompt:`Describe the video.`,defaultMime:`video/mp4`,httpErrorLabel:`Video description failed`,missingTextError:`Video description response missing text`});return{text,model}}const googleProvider={id:`google`,capabilities:[`image`,`audio`,`video`],describeImage:describeImageWithModel,transcribeAudio:transcribeGeminiAudio,describeVideo:describeGeminiVideo};function resolveModel(model){return model?.trim()||`gpt-4o-mini-transcribe`}async function transcribeOpenAiCompatibleAudio(params){let fetchFn=params.fetchFn??fetch,baseUrl=normalizeBaseUrl(params.baseUrl,`https://api.openai.com/v1`),allowPrivate=!!params.baseUrl?.trim(),url=`${baseUrl}/audio/transcriptions`,model=resolveModel(params.model),form=new FormData,fileName=params.fileName?.trim()||path.basename(params.fileName)||`audio`,bytes=new Uint8Array(params.buffer),blob=new Blob([bytes],{type:params.mime??`application/octet-stream`});form.append(`file`,blob,fileName),form.append(`model`,model),params.language?.trim()&&form.append(`language`,params.language.trim()),params.prompt?.trim()&&form.append(`prompt`,params.prompt.trim());let headers=new Headers(params.headers);headers.has(`authorization`)||headers.set(`authorization`,`Bearer ${params.apiKey}`);let{response:res,release}=await fetchWithTimeoutGuarded(url,{method:`POST`,headers,body:form},params.timeoutMs,fetchFn,allowPrivate?{ssrfPolicy:{allowPrivateNetwork:!0}}:void 0);try{await assertOkOrThrowHttpError(res,`Audio transcription failed`);let text=(await res.json()).text?.trim();if(!text)throw Error(`Audio transcription response missing text`);return{text,model}}finally{await release()}}const PROVIDERS=[{id:`groq`,capabilities:[`audio`],transcribeAudio:req=>transcribeOpenAiCompatibleAudio({...req,baseUrl:req.baseUrl??`https://api.groq.com/openai/v1`})},{id:`openai`,capabilities:[`image`],describeImage:describeImageWithModel,transcribeAudio:transcribeOpenAiCompatibleAudio},googleProvider,anthropicProvider,{id:`minimax`,capabilities:[`image`],describeImage:describeImageWithModel},{id:`zai`,capabilities:[`image`],describeImage:describeImageWithModel},deepgramProvider];function normalizeMediaProviderId(id){let normalized=normalizeProviderId(id);return normalized===`gemini`?`google`:normalized}function buildMediaUnderstandingRegistry(overrides){let registry=new Map;for(let provider of PROVIDERS)registry.set(normalizeMediaProviderId(provider.id),provider);if(overrides)for(let[key,provider]of Object.entries(overrides)){let normalizedKey=normalizeMediaProviderId(key),existing=registry.get(normalizedKey),merged=existing?{...existing,...provider,capabilities:provider.capabilities??existing.capabilities}:provider;registry.set(normalizedKey,merged)}return registry}function getMediaUnderstandingProvider(id,registry){return registry.get(normalizeMediaProviderId(id))}function normalizeDecision(value){let normalized=value?.trim().toLowerCase();if(normalized===`allow`)return`allow`;if(normalized===`deny`)return`deny`}function normalizeMatch(value){return value?.trim().toLowerCase()||void 0}function normalizeMediaUnderstandingChatType(raw){return normalizeChatType(raw??void 0)}function resolveMediaUnderstandingScope(params){let scope=params.scope;if(!scope)return`allow`;let channel=normalizeMatch(params.channel),chatType=normalizeMediaUnderstandingChatType(params.chatType),sessionKey=normalizeMatch(params.sessionKey)??``;for(let rule of scope.rules??[]){if(!rule)continue;let action=normalizeDecision(rule.action)??`allow`,match=rule.match??{},matchChannel=normalizeMatch(match.channel),matchChatType=normalizeMediaUnderstandingChatType(match.chatType),matchPrefix=normalizeMatch(match.keyPrefix);if(!(matchChannel&&matchChannel!==channel)&&!(matchChatType&&matchChatType!==chatType)&&!(matchPrefix&&!sessionKey.startsWith(matchPrefix)))return action}return normalizeDecision(scope.default)??`allow`}function resolveTimeoutMs(seconds,fallbackSeconds){let value=typeof seconds==`number`&&Number.isFinite(seconds)?seconds:fallbackSeconds;return Math.max(1e3,Math.floor(value*1e3))}function resolvePrompt(capability,prompt,maxChars){let base=prompt?.trim()||DEFAULT_PROMPT[capability];return!maxChars||capability===`audio`?base:`${base} Respond in at most ${maxChars} characters.`}function resolveMaxChars(params){let{capability,entry,cfg}=params,configured=entry.maxChars??params.config?.maxChars??cfg.tools?.media?.[capability]?.maxChars;return typeof configured==`number`?configured:DEFAULT_MAX_CHARS_BY_CAPABILITY[capability]}function resolveMaxBytes(params){let configured=params.entry.maxBytes??params.config?.maxBytes??params.cfg.tools?.media?.[params.capability]?.maxBytes;return typeof configured==`number`?configured:DEFAULT_MAX_BYTES[params.capability]}function resolveScopeDecision(params){return resolveMediaUnderstandingScope({scope:params.scope,sessionKey:params.ctx.SessionKey,channel:params.ctx.Surface??params.ctx.Provider,chatType:normalizeMediaUnderstandingChatType(params.ctx.ChatType)})}function resolveEntryCapabilities(params){if((params.entry.type??(params.entry.command?`cli`:`provider`))===`cli`)return;let providerId=normalizeMediaProviderId(params.entry.provider??``);if(providerId)return params.providerRegistry.get(providerId)?.capabilities}function resolveModelEntries(params){let{cfg,capability,config}=params,sharedModels=cfg.tools?.media?.models??[],entries=[...(config?.models??[]).map(entry=>({entry,source:`capability`})),...sharedModels.map(entry=>({entry,source:`shared`}))];return entries.length===0?[]:entries.filter(({entry,source})=>{let caps=entry.capabilities&&entry.capabilities.length>0?entry.capabilities:source===`shared`?resolveEntryCapabilities({entry,providerRegistry:params.providerRegistry}):void 0;return!caps||caps.length===0?source===`shared`?(shouldLogVerbose()&&logVerbose(`Skipping shared media model without capabilities: ${entry.provider??entry.command??`unknown`}`),!1):!0:caps.includes(capability)}).map(({entry})=>entry)}function resolveConcurrency(cfg){let configured=cfg.tools?.media?.concurrency;return typeof configured==`number`&&Number.isFinite(configured)&&configured>0?Math.floor(configured):2}async function loadWorkspaceContext(workspaceDir){try{let{loadProjectContext}=await import(`./project-context-store-B96x1Lfk.js`);return await loadProjectContext(workspaceDir)}catch(err){return logDebug(`[error-report] could not read project context: ${String(err)}`),null}}function isPlatformErrorReportingEnabled(){return isOfflineMode()?!1:isTruthyFlag(readRuntimeEnvVar(`BUILDERFORCE_ERROR_REPORTING`))}async function sendRuntimeErrorReport(error,report){if(!isPlatformErrorReportingEnabled())return;let message=error instanceof Error?error.message:String(error),stack=error instanceof Error?error.stack??null:null,apiKey=readSharedEnvVar(`BUILDERFORCE_API_KEY`);if(!apiKey)return;let ctx=report.workspaceDir?await loadWorkspaceContext(report.workspaceDir):null,agentHostId=ctx?.builderforce?.instanceId;if(!agentHostId)return;let projectIdRaw=ctx?.builderforce?.projectId?Number(ctx.builderforce.projectId):NaN,projectId=Number.isFinite(projectIdRaw)&&projectIdRaw>0?projectIdRaw:null,base=normalizeBaseUrl$1(readSharedEnvVar(`BUILDERFORCE_URL`)??`https://api.builderforce.ai`);try{let res=await fetch(`${base}/api/quality-ingest/client-report`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${apiKey}`,"X-AgentHost-Id":String(agentHostId)},body:JSON.stringify({source:`agent-runtime`,projectId,events:[{type:error instanceof Error?error.name:`AgentRuntimeError`,message,stack,level:report.level??`error`,operation:report.operation,timestamp:new Date().toISOString(),context:report.context??{}}]}),signal:AbortSignal.timeout(8e3)});res.ok||logDebug(`[error-report] returned HTTP ${res.status}`)}catch(err){logDebug(`[error-report] failed: ${String(err)}`)}}async function reportAndExit(error,options){console.error(options.label,formatUncaughtError(error)),isPlatformErrorReportingEnabled()&&await Promise.race([sendRuntimeErrorReport(error,{operation:options.operation,level:`fatal`,workspaceDir:options.workspaceDir??process$1.cwd()}),new Promise(resolve=>setTimeout(resolve,5e3).unref?.())]).catch(reportingError=>{logDebug(`[fatal-exit] crash report failed: ${String(reportingError)}`)}),process$1.exit(options.exitCode??1)}function installUncaughtExceptionHandler(workspaceDir){process$1.on(`uncaughtException`,error=>{reportAndExit(error,{operation:`uncaughtException`,label:`[builderforce] Uncaught exception:`,workspaceDir})})}const handlers=new Set,FATAL_ERROR_CODES=new Set([`ERR_OUT_OF_MEMORY`,`ERR_SCRIPT_EXECUTION_TIMEOUT`,`ERR_WORKER_OUT_OF_MEMORY`,`ERR_WORKER_UNCAUGHT_EXCEPTION`,`ERR_WORKER_INITIALIZATION_FAILED`]),CONFIG_ERROR_CODES=new Set([`INVALID_CONFIG`,`MISSING_API_KEY`,`MISSING_CREDENTIALS`]),TRANSIENT_NETWORK_CODES=new Set([`ECONNRESET`,`ECONNREFUSED`,`ENOTFOUND`,`ETIMEDOUT`,`ESOCKETTIMEDOUT`,`ECONNABORTED`,`EPIPE`,`EHOSTUNREACH`,`ENETUNREACH`,`EAI_AGAIN`,`UND_ERR_CONNECT_TIMEOUT`,`UND_ERR_DNS_RESOLVE_FAILED`,`UND_ERR_CONNECT`,`UND_ERR_SOCKET`,`UND_ERR_HEADERS_TIMEOUT`,`UND_ERR_BODY_TIMEOUT`]);function getErrorCause(err){if(!(!err||typeof err!=`object`))return err.cause}function extractErrorCodeWithCause(err){return extractErrorCode(err)||extractErrorCode(getErrorCause(err))}function isAbortError(err){return!err||typeof err!=`object`?!1:(`name`in err?String(err.name):``)===`AbortError`||(`message`in err&&typeof err.message==`string`?err.message:``)===`This operation was aborted`}function isFatalError(err){let code=extractErrorCodeWithCause(err);return code!==void 0&&FATAL_ERROR_CODES.has(code)}function isConfigError(err){let code=extractErrorCodeWithCause(err);return code!==void 0&&CONFIG_ERROR_CODES.has(code)}function isTransientNetworkError(err){if(!err)return!1;let code=extractErrorCodeWithCause(err);if(code&&TRANSIENT_NETWORK_CODES.has(code))return!0;if(err instanceof TypeError&&err.message===`fetch failed`){let cause=getErrorCause(err);return cause?isTransientNetworkError(cause):!0}let cause=getErrorCause(err);return cause&&cause!==err?isTransientNetworkError(cause):err instanceof AggregateError&&err.errors?.length?err.errors.some(e=>isTransientNetworkError(e)):!1}function registerUnhandledRejectionHandler(handler){return handlers.add(handler),()=>{handlers.delete(handler)}}function isUnhandledRejectionHandled(reason){for(let handler of handlers)try{if(handler(reason))return!0}catch(err){console.error(`[builderforce] Unhandled rejection handler failed:`,err instanceof Error?err.stack??err.message:err)}return!1}function installUnhandledRejectionHandler(){process$1.on(`unhandledRejection`,(reason,_promise)=>{if(!isUnhandledRejectionHandled(reason)){if(isAbortError(reason)){console.warn(`[builderforce] Suppressed AbortError:`,formatUncaughtError(reason));return}if(isFatalError(reason)){reportAndExit(reason,{operation:`unhandledRejection:fatal`,label:`[builderforce] FATAL unhandled rejection:`});return}if(isConfigError(reason)){reportAndExit(reason,{operation:`unhandledRejection:config`,label:`[builderforce] CONFIGURATION ERROR - requires fix:`});return}if(isTransientNetworkError(reason)){console.warn(`[builderforce] Non-fatal unhandled rejection (continuing):`,formatUncaughtError(reason));return}reportAndExit(reason,{operation:`unhandledRejection`,label:`[builderforce] Unhandled promise rejection:`})}})}var MediaUnderstandingSkipError=class extends Error{constructor(reason,message){super(message),this.reason=reason,this.name=`MediaUnderstandingSkipError`}};function isMediaUnderstandingSkipError(err){return err instanceof MediaUnderstandingSkipError}function normalizeAttachmentPath(raw){let value=raw?.trim();if(value){if(value.startsWith(`file://`))try{return fileURLToPath(value)}catch{return}return value}}function normalizeAttachments(ctx){let pathsFromArray=Array.isArray(ctx.MediaPaths)?ctx.MediaPaths:void 0,urlsFromArray=Array.isArray(ctx.MediaUrls)?ctx.MediaUrls:void 0,typesFromArray=Array.isArray(ctx.MediaTypes)?ctx.MediaTypes:void 0,resolveMime=(count,index)=>{let typeHint=typesFromArray?.[index];return(typeof typeHint==`string`?typeHint.trim():``)||(count===1?ctx.MediaType:void 0)};if(pathsFromArray&&pathsFromArray.length>0){let count=pathsFromArray.length,urls=urlsFromArray&&urlsFromArray.length>0?urlsFromArray:void 0;return pathsFromArray.map((value,index)=>({path:value?.trim()||void 0,url:urls?.[index]??ctx.MediaUrl,mime:resolveMime(count,index),index})).filter(entry=>!!(entry.path?.trim()||entry.url?.trim()))}if(urlsFromArray&&urlsFromArray.length>0){let count=urlsFromArray.length;return urlsFromArray.map((value,index)=>({path:void 0,url:value?.trim()||void 0,mime:resolveMime(count,index),index})).filter(entry=>!!entry.url?.trim())}let pathValue=ctx.MediaPath?.trim(),url=ctx.MediaUrl?.trim();return!pathValue&&!url?[]:[{path:pathValue||void 0,url:url||void 0,mime:ctx.MediaType,index:0}]}function resolveAttachmentKind(attachment){let kind=kindFromMime(attachment.mime);if(kind===`image`||kind===`audio`||kind===`video`)return kind;let ext=getFileExtension(attachment.path??attachment.url);return ext?[`.mp4`,`.mov`,`.mkv`,`.webm`,`.avi`,`.m4v`].includes(ext)?`video`:isAudioFileName(attachment.path??attachment.url)?`audio`:[`.png`,`.jpg`,`.jpeg`,`.webp`,`.gif`,`.bmp`,`.tiff`,`.tif`].includes(ext)?`image`:`unknown`:`unknown`}function isVideoAttachment(attachment){return resolveAttachmentKind(attachment)===`video`}function isAudioAttachment(attachment){return resolveAttachmentKind(attachment)===`audio`}function isImageAttachment(attachment){return resolveAttachmentKind(attachment)===`image`}function resolveRequestUrl(input){return typeof input==`string`?input:input instanceof URL?input.toString():input.url}function orderAttachments(attachments,prefer){if(!prefer||prefer===`first`)return attachments;if(prefer===`last`)return[...attachments].toReversed();if(prefer===`path`){let withPath=attachments.filter(item=>item.path),withoutPath=attachments.filter(item=>!item.path);return[...withPath,...withoutPath]}if(prefer===`url`){let withUrl=attachments.filter(item=>item.url),withoutUrl=attachments.filter(item=>!item.url);return[...withUrl,...withoutUrl]}return attachments}function selectAttachments(params){let{capability,attachments,policy}=params,matches=attachments.filter(item=>capability===`audio`&&item.alreadyTranscribed?!1:capability===`image`?isImageAttachment(item):capability===`audio`?isAudioAttachment(item):isVideoAttachment(item));if(matches.length===0)return[];let ordered=orderAttachments(matches,policy?.prefer),mode=policy?.mode??`first`,maxAttachments=policy?.maxAttachments??1;return mode===`all`?ordered.slice(0,Math.max(1,maxAttachments)):ordered.slice(0,1)}var MediaAttachmentCache=class{constructor(attachments){this.entries=new Map,this.attachments=attachments;for(let attachment of attachments)this.entries.set(attachment.index,{attachment})}async getBuffer(params){let entry=await this.ensureEntry(params.attachmentIndex);if(entry.buffer){if(entry.buffer.length>params.maxBytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`);return{buffer:entry.buffer,mime:entry.bufferMime,fileName:entry.bufferFileName??`media-${params.attachmentIndex+1}`,size:entry.buffer.length}}if(entry.resolvedPath){let size=await this.ensureLocalStat(entry);if(entry.resolvedPath){if(size!==void 0&&size>params.maxBytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`);let buffer=await fs$1.readFile(entry.resolvedPath);return entry.buffer=buffer,entry.bufferMime=entry.bufferMime??entry.attachment.mime??await detectMime({buffer,filePath:entry.resolvedPath}),entry.bufferFileName=path.basename(entry.resolvedPath)||`media-${params.attachmentIndex+1}`,{buffer,mime:entry.bufferMime,fileName:entry.bufferFileName,size:buffer.length}}}let url=entry.attachment.url?.trim();if(!url)throw new MediaUnderstandingSkipError(`empty`,`Attachment ${params.attachmentIndex+1} has no path or URL.`);try{let fetched=await fetchRemoteMedia({url,fetchImpl:(input,init)=>fetchWithTimeout(resolveRequestUrl(input),init??{},params.timeoutMs,fetch),maxBytes:params.maxBytes});return entry.buffer=fetched.buffer,entry.bufferMime=entry.attachment.mime??fetched.contentType??await detectMime({buffer:fetched.buffer,filePath:fetched.fileName??url}),entry.bufferFileName=fetched.fileName??`media-${params.attachmentIndex+1}`,{buffer:fetched.buffer,mime:entry.bufferMime,fileName:entry.bufferFileName,size:fetched.buffer.length}}catch(err){throw err instanceof MediaFetchError&&err.code===`max_bytes`?new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`):isAbortError(err)?new MediaUnderstandingSkipError(`timeout`,`Attachment ${params.attachmentIndex+1} timed out while fetching.`):err}}async getPath(params){let entry=await this.ensureEntry(params.attachmentIndex);if(entry.resolvedPath){if(params.maxBytes){let size=await this.ensureLocalStat(entry);if(entry.resolvedPath&&size!==void 0&&size>params.maxBytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`)}if(entry.resolvedPath)return{path:entry.resolvedPath}}if(entry.tempPath){if(params.maxBytes&&entry.buffer&&entry.buffer.length>params.maxBytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`);return{path:entry.tempPath,cleanup:entry.tempCleanup}}let maxBytes=params.maxBytes??1/0,bufferResult=await this.getBuffer({attachmentIndex:params.attachmentIndex,maxBytes,timeoutMs:params.timeoutMs}),extension=path.extname(bufferResult.fileName||``)||``,tmpPath=path.join(os.tmpdir(),`builderforce-media-${crypto.randomUUID()}${extension}`);return await fs$1.writeFile(tmpPath,bufferResult.buffer),entry.tempPath=tmpPath,entry.tempCleanup=async()=>{await fs$1.unlink(tmpPath).catch(()=>{})},{path:tmpPath,cleanup:entry.tempCleanup}}async cleanup(){let cleanups=[];for(let entry of this.entries.values())entry.tempCleanup&&=(cleanups.push(Promise.resolve(entry.tempCleanup())),void 0);await Promise.all(cleanups)}async ensureEntry(attachmentIndex){let existing=this.entries.get(attachmentIndex);if(existing)return existing.resolvedPath||=this.resolveLocalPath(existing.attachment),existing;let attachment=this.attachments.find(item=>item.index===attachmentIndex)??{index:attachmentIndex},entry={attachment,resolvedPath:this.resolveLocalPath(attachment)};return this.entries.set(attachmentIndex,entry),entry}resolveLocalPath(attachment){let rawPath=normalizeAttachmentPath(attachment.path);if(rawPath)return path.isAbsolute(rawPath)?rawPath:path.resolve(rawPath)}async ensureLocalStat(entry){if(entry.resolvedPath){if(entry.statSize!==void 0)return entry.statSize;try{let stat=await fs$1.stat(entry.resolvedPath);if(!stat.isFile()){entry.resolvedPath=void 0;return}return entry.statSize=stat.size,stat.size}catch(err){entry.resolvedPath=void 0,shouldLogVerbose()&&logVerbose(`Failed to read attachment ${entry.attachment.index+1}: ${String(err)}`);return}}}};async function fileExists(filePath){if(!filePath)return!1;try{return await fs$1.stat(filePath),!0}catch{return!1}}function extractLastJsonObject(raw){let trimmed=raw.trim(),start=trimmed.lastIndexOf(`{`);if(start===-1)return null;let slice=trimmed.slice(start);try{return JSON.parse(slice)}catch{return null}}function extractGeminiResponse(raw){let payload=extractLastJsonObject(raw);if(!payload||typeof payload!=`object`)return null;let response=payload.response;return typeof response==`string`&&response.trim()||null}function estimateBase64Size(bytes){return Math.ceil(bytes/3)*4}function resolveVideoMaxBase64Bytes(maxBytes){let expanded=Math.floor(4/3*maxBytes);return Math.min(expanded,73400320)}function trimOutput(text,maxChars){let trimmed=text.trim();return!maxChars||trimmed.length<=maxChars?trimmed:trimmed.slice(0,maxChars).trim()}function extractSherpaOnnxText(raw){let tryParse=value=>{let trimmed=value.trim();if(!trimmed)return null;let head=trimmed[0];if(head!==`{`&&head!==`"`)return null;try{let parsed=JSON.parse(trimmed);if(typeof parsed==`string`)return tryParse(parsed);if(parsed&&typeof parsed==`object`){let text=parsed.text;if(typeof text==`string`&&text.trim())return text.trim()}}catch{}return null},direct=tryParse(raw);if(direct)return direct;let lines=raw.split(`
13
13
  `).map(line=>line.trim()).filter(Boolean);for(let i=lines.length-1;i>=0;--i){let parsed=tryParse(lines[i]??``);if(parsed)return parsed}return null}function commandBase(command){return path.parse(command).name}function findArgValue(args,keys){for(let i=0;i<args.length;i+=1)if(keys.includes(args[i]??``)){let value=args[i+1];if(value)return value}}function hasArg(args,keys){return args.some(arg=>keys.includes(arg))}function resolveWhisperOutputPath(args,mediaPath){let outputDir=findArgValue(args,[`--output_dir`,`-o`]),outputFormat=findArgValue(args,[`--output_format`]);if(!outputDir||!outputFormat||!outputFormat.split(`,`).map(value=>value.trim()).includes(`txt`))return null;let base=path.parse(mediaPath).name;return path.join(outputDir,`${base}.txt`)}function resolveWhisperCppOutputPath(args){if(!hasArg(args,[`-otxt`,`--output-txt`]))return null;let outputBase=findArgValue(args,[`-of`,`--output-file`]);return outputBase?`${outputBase}.txt`:null}async function resolveCliOutput(params){let commandId=commandBase(params.command),fileOutput=commandId===`whisper-cli`?resolveWhisperCppOutputPath(params.args):commandId===`whisper`?resolveWhisperOutputPath(params.args,params.mediaPath):null;if(fileOutput&&await fileExists(fileOutput))try{let content=await fs$1.readFile(fileOutput,`utf8`);if(content.trim())return content.trim()}catch{}if(commandId===`gemini`){let response=extractGeminiResponse(params.stdout);if(response)return response}if(commandId===`sherpa-onnx-offline`){let response=extractSherpaOnnxText(params.stdout);if(response)return response}return params.stdout.trim()}function normalizeProviderQuery(options){if(!options)return;let query={};for(let[key,value]of Object.entries(options))value!==void 0&&(query[key]=value);return Object.keys(query).length>0?query:void 0}function buildDeepgramCompatQuery(options){if(!options)return;let query={};return typeof options.detectLanguage==`boolean`&&(query.detect_language=options.detectLanguage),typeof options.punctuate==`boolean`&&(query.punctuate=options.punctuate),typeof options.smartFormat==`boolean`&&(query.smart_format=options.smartFormat),Object.keys(query).length>0?query:void 0}function normalizeDeepgramQueryKeys(query){let normalized={...query};return`detectLanguage`in normalized&&(normalized.detect_language=normalized.detectLanguage,delete normalized.detectLanguage),`smartFormat`in normalized&&(normalized.smart_format=normalized.smartFormat,delete normalized.smartFormat),normalized}function resolveProviderQuery(params){let{providerId,config,entry}=params,mergedOptions=normalizeProviderQuery({...config?.providerOptions?.[providerId],...entry.providerOptions?.[providerId]});if(providerId!==`deepgram`)return mergedOptions;let query=normalizeDeepgramQueryKeys(mergedOptions??{}),compat=buildDeepgramCompatQuery({...config?.deepgram,...entry.deepgram});for(let[key,value]of Object.entries(compat??{}))query[key]===void 0&&(query[key]=value);return Object.keys(query).length>0?query:void 0}function buildModelDecision(params){if(params.entryType===`cli`){let command=params.entry.command?.trim();return{type:`cli`,provider:command??`cli`,model:params.entry.model??command,outcome:params.outcome,reason:params.reason}}let providerIdRaw=params.entry.provider?.trim();return{type:`provider`,provider:(providerIdRaw?normalizeMediaProviderId(providerIdRaw):void 0)??providerIdRaw,model:params.entry.model,outcome:params.outcome,reason:params.reason}}function resolveEntryRunOptions(params){let{capability,entry,cfg}=params,maxBytes=resolveMaxBytes({capability,entry,cfg,config:params.config}),maxChars=resolveMaxChars({capability,entry,cfg,config:params.config});return{maxBytes,maxChars,timeoutMs:resolveTimeoutMs(entry.timeoutSeconds??params.config?.timeoutSeconds??cfg.tools?.media?.[capability]?.timeoutSeconds,DEFAULT_TIMEOUT_SECONDS[capability]),prompt:resolvePrompt(capability,entry.prompt??params.config?.prompt??cfg.tools?.media?.[capability]?.prompt,maxChars)}}async function resolveProviderExecutionAuth(params){let auth=await resolveApiKeyForProvider({provider:params.providerId,cfg:params.cfg,profileId:params.entry.profile,preferredProfile:params.entry.preferredProfile,agentDir:params.agentDir});return{apiKeys:collectProviderApiKeysForExecution({provider:params.providerId,primaryApiKey:requireApiKey(auth,params.providerId)}),providerConfig:params.cfg.models?.providers?.[params.providerId]}}function formatDecisionSummary(decision){let total=decision.attachments.length,success=decision.attachments.filter(entry=>entry.chosen?.outcome===`success`).length,chosen=decision.attachments.find(entry=>entry.chosen)?.chosen,provider=chosen?.provider?.trim(),model=chosen?.model?.trim(),modelLabel=provider?model?`${provider}/${model}`:provider:void 0,reason=decision.attachments.flatMap(entry=>entry.attempts.map(attempt=>attempt.reason).filter(Boolean)).find(Boolean),shortReason=reason?reason.split(`:`)[0]?.trim():void 0,countLabel=total>0?` (${success}/${total})`:``,viaLabel=modelLabel?` via ${modelLabel}`:``,reasonLabel=shortReason?` reason=${shortReason}`:``;return`${decision.capability}: ${decision.outcome}${countLabel}${viaLabel}${reasonLabel}`}async function runProviderEntry(params){let{entry,capability,cfg}=params,providerIdRaw=entry.provider?.trim();if(!providerIdRaw)throw Error(`Provider entry missing provider for ${capability}`);let providerId=normalizeMediaProviderId(providerIdRaw),{maxBytes,maxChars,timeoutMs,prompt}=resolveEntryRunOptions({capability,entry,cfg,config:params.config});if(capability===`image`){if(!params.agentDir)throw Error(`Image understanding requires agentDir`);let modelId=entry.model?.trim();if(!modelId)throw Error(`Image understanding requires model id`);let media=await params.cache.getBuffer({attachmentIndex:params.attachmentIndex,maxBytes,timeoutMs}),provider=getMediaUnderstandingProvider(providerId,params.providerRegistry),result=provider?.describeImage?await provider.describeImage({buffer:media.buffer,fileName:media.fileName,mime:media.mime,model:modelId,provider:providerId,prompt,timeoutMs,profile:entry.profile,preferredProfile:entry.preferredProfile,agentDir:params.agentDir,cfg:params.cfg}):await describeImageWithModel({buffer:media.buffer,fileName:media.fileName,mime:media.mime,model:modelId,provider:providerId,prompt,timeoutMs,profile:entry.profile,preferredProfile:entry.preferredProfile,agentDir:params.agentDir,cfg:params.cfg});return{kind:`image.description`,attachmentIndex:params.attachmentIndex,text:trimOutput(result.text,maxChars),provider:providerId,model:result.model??modelId}}let provider=getMediaUnderstandingProvider(providerId,params.providerRegistry);if(!provider)throw Error(`Media provider not available: ${providerId}`);if(capability===`audio`){if(!provider.transcribeAudio)throw Error(`Audio transcription provider "${providerId}" not available.`);let transcribeAudio=provider.transcribeAudio,media=await params.cache.getBuffer({attachmentIndex:params.attachmentIndex,maxBytes,timeoutMs}),{apiKeys,providerConfig}=await resolveProviderExecutionAuth({providerId,cfg,entry,agentDir:params.agentDir}),baseUrl=entry.baseUrl??params.config?.baseUrl??providerConfig?.baseUrl,mergedHeaders={...providerConfig?.headers,...params.config?.headers,...entry.headers},headers=Object.keys(mergedHeaders).length>0?mergedHeaders:void 0,providerQuery=resolveProviderQuery({providerId,config:params.config,entry}),model=entry.model?.trim()||DEFAULT_AUDIO_MODELS[providerId]||entry.model,result=await executeWithApiKeyRotation({provider:providerId,apiKeys,execute:async apiKey=>transcribeAudio({buffer:media.buffer,fileName:media.fileName,mime:media.mime,apiKey,baseUrl,headers,model,language:entry.language??params.config?.language??cfg.tools?.media?.audio?.language,prompt,query:providerQuery,timeoutMs})});return{kind:`audio.transcription`,attachmentIndex:params.attachmentIndex,text:trimOutput(result.text,maxChars),provider:providerId,model:result.model??model}}if(!provider.describeVideo)throw Error(`Video understanding provider "${providerId}" not available.`);let describeVideo=provider.describeVideo,media=await params.cache.getBuffer({attachmentIndex:params.attachmentIndex,maxBytes,timeoutMs}),estimatedBase64Bytes=estimateBase64Size(media.size),maxBase64Bytes=resolveVideoMaxBase64Bytes(maxBytes);if(estimatedBase64Bytes>maxBase64Bytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Video attachment ${params.attachmentIndex+1} base64 payload ${estimatedBase64Bytes} exceeds ${maxBase64Bytes}`);let{apiKeys,providerConfig}=await resolveProviderExecutionAuth({providerId,cfg,entry,agentDir:params.agentDir}),result=await executeWithApiKeyRotation({provider:providerId,apiKeys,execute:apiKey=>describeVideo({buffer:media.buffer,fileName:media.fileName,mime:media.mime,apiKey,baseUrl:providerConfig?.baseUrl,headers:providerConfig?.headers,model:entry.model,prompt,timeoutMs})});return{kind:`video.description`,attachmentIndex:params.attachmentIndex,text:trimOutput(result.text,maxChars),provider:providerId,model:result.model??entry.model}}async function runCliEntry(params){let{entry,capability,cfg,ctx}=params,command=entry.command?.trim(),args=entry.args??[];if(!command)throw Error(`CLI entry missing command for ${capability}`);let{maxBytes,maxChars,timeoutMs,prompt}=resolveEntryRunOptions({capability,entry,cfg,config:params.config}),pathResult=await params.cache.getPath({attachmentIndex:params.attachmentIndex,maxBytes,timeoutMs}),outputDir=await fs$1.mkdtemp(path.join(os.tmpdir(),`builderforce-media-cli-`)),mediaPath=pathResult.path,outputBase=path.join(outputDir,path.parse(mediaPath).name),templCtx={...ctx,MediaPath:mediaPath,MediaDir:path.dirname(mediaPath),OutputDir:outputDir,OutputBase:outputBase,Prompt:prompt,MaxChars:maxChars},argv=[command,...args].map((part,index)=>index===0?part:applyTemplate(part,templCtx));try{shouldLogVerbose()&&logVerbose(`Media understanding via CLI: ${argv.join(` `)}`);let{stdout}=await runExec(argv[0],argv.slice(1),{timeoutMs,maxBuffer:CLI_OUTPUT_MAX_BUFFER}),text=trimOutput(await resolveCliOutput({command,args:argv.slice(1),stdout,mediaPath}),maxChars);return text?{kind:capability===`audio`?`audio.transcription`:`${capability}.description`,attachmentIndex:params.attachmentIndex,text,provider:`cli`,model:command}:null}finally{await fs$1.rm(outputDir,{recursive:!0,force:!0}).catch(()=>{})}}function buildProviderRegistry(overrides){return buildMediaUnderstandingRegistry(overrides)}function normalizeMediaAttachments(ctx){return normalizeAttachments(ctx)}function createMediaAttachmentCache(attachments){return new MediaAttachmentCache(attachments)}const binaryCache=new Map,geminiProbeCache=new Map;function expandHomeDir(value){if(!value.startsWith(`~`))return value;let home=os.homedir();return value===`~`?home:value.startsWith(`~/`)?path.join(home,value.slice(2)):value}function hasPathSeparator(value){return value.includes(`/`)||value.includes(`\\`)}function candidateBinaryNames(name){if(process.platform!==`win32`||path.extname(name))return[name];let pathext=(process.env.PATHEXT??`.EXE;.CMD;.BAT;.COM`).split(`;`).map(item=>item.trim()).filter(Boolean).map(item=>item.startsWith(`.`)?item:`.${item}`);return[name,...Array.from(new Set(pathext)).map(item=>`${name}${item}`)]}async function isExecutable(filePath){try{return(await fs$1.stat(filePath)).isFile()?(process.platform===`win32`||await fs$1.access(filePath,constants.X_OK),!0):!1}catch{return!1}}async function findBinary(name){let cached=binaryCache.get(name);if(cached)return cached;let resolved=(async()=>{let direct=expandHomeDir(name.trim());if(direct&&hasPathSeparator(direct)){for(let candidate of candidateBinaryNames(direct))if(await isExecutable(candidate))return candidate}let searchName=name.trim();if(!searchName)return null;let pathEntries=(process.env.PATH??``).split(path.delimiter),candidates=candidateBinaryNames(searchName);for(let entryRaw of pathEntries){let entry=expandHomeDir(entryRaw.trim().replace(/^"(.*)"$/,`$1`));if(entry)for(let candidate of candidates){let fullPath=path.join(entry,candidate);if(await isExecutable(fullPath))return fullPath}}return null})();return binaryCache.set(name,resolved),resolved}async function hasBinary(name){return!!await findBinary(name)}async function probeGeminiCli(){let cached=geminiProbeCache.get(`gemini`);if(cached)return cached;let resolved=(async()=>{if(!await hasBinary(`gemini`))return!1;try{let{stdout}=await runExec(`gemini`,[`--output-format`,`json`,`ok`],{timeoutMs:8e3});return!!(extractGeminiResponse(stdout)??stdout.toLowerCase().includes(`ok`))}catch{return!1}})();return geminiProbeCache.set(`gemini`,resolved),resolved}async function resolveLocalWhisperCppEntry(){if(!await hasBinary(`whisper-cli`))return null;let envModel=process.env.WHISPER_CPP_MODEL?.trim(),modelPath=envModel&&await fileExists(envModel)?envModel:`/opt/homebrew/share/whisper-cpp/for-tests-ggml-tiny.bin`;return await fileExists(modelPath)?{type:`cli`,command:`whisper-cli`,args:[`-m`,modelPath,`-otxt`,`-of`,`{{OutputBase}}`,`-np`,`-nt`,`{{MediaPath}}`]}:null}async function resolveLocalWhisperEntry(){return await hasBinary(`whisper`)?{type:`cli`,command:`whisper`,args:[`--model`,`turbo`,`--output_format`,`txt`,`--output_dir`,`{{OutputDir}}`,`--verbose`,`False`,`{{MediaPath}}`]}:null}async function resolveSherpaOnnxEntry(){if(!await hasBinary(`sherpa-onnx-offline`))return null;let modelDir=process.env.SHERPA_ONNX_MODEL_DIR?.trim();if(!modelDir)return null;let tokens=path.join(modelDir,`tokens.txt`),encoder=path.join(modelDir,`encoder.onnx`),decoder=path.join(modelDir,`decoder.onnx`),joiner=path.join(modelDir,`joiner.onnx`);return!await fileExists(tokens)||!await fileExists(encoder)||!await fileExists(decoder)||!await fileExists(joiner)?null:{type:`cli`,command:`sherpa-onnx-offline`,args:[`--tokens=${tokens}`,`--encoder=${encoder}`,`--decoder=${decoder}`,`--joiner=${joiner}`,`{{MediaPath}}`]}}async function resolveLocalAudioEntry(){return await resolveSherpaOnnxEntry()||await resolveLocalWhisperCppEntry()||await resolveLocalWhisperEntry()}async function resolveGeminiCliEntry(_capability){return await probeGeminiCli()?{type:`cli`,command:`gemini`,args:[`--output-format`,`json`,`--allowed-tools`,`read_many_files`,`--include-directories`,`{{MediaDir}}`,`{{Prompt}}`,`Use read_many_files to read {{MediaPath}} and respond with only the text output.`]}:null}async function resolveKeyEntry(params){let{cfg,agentDir,providerRegistry,capability}=params,checkProvider=async(providerId,model)=>{let provider=getMediaUnderstandingProvider(providerId,providerRegistry);if(!provider||capability===`audio`&&!provider.transcribeAudio||capability===`image`&&!provider.describeImage||capability===`video`&&!provider.describeVideo)return null;try{return await resolveApiKeyForProvider({provider:providerId,cfg,agentDir}),{type:`provider`,provider:providerId,model}}catch{return null}};if(capability===`image`){let activeProvider=params.activeModel?.provider?.trim();if(activeProvider){let activeEntry=await checkProvider(activeProvider,params.activeModel?.model);if(activeEntry)return activeEntry}for(let providerId of AUTO_IMAGE_KEY_PROVIDERS){let model=DEFAULT_IMAGE_MODELS[providerId],entry=await checkProvider(providerId,model);if(entry)return entry}return null}if(capability===`video`){let activeProvider=params.activeModel?.provider?.trim();if(activeProvider){let activeEntry=await checkProvider(activeProvider,params.activeModel?.model);if(activeEntry)return activeEntry}for(let providerId of AUTO_VIDEO_KEY_PROVIDERS){let entry=await checkProvider(providerId,void 0);if(entry)return entry}return null}let activeProvider=params.activeModel?.provider?.trim();if(activeProvider){let activeEntry=await checkProvider(activeProvider,params.activeModel?.model);if(activeEntry)return activeEntry}for(let providerId of AUTO_AUDIO_KEY_PROVIDERS){let entry=await checkProvider(providerId,void 0);if(entry)return entry}return null}function resolveImageModelFromAgentDefaults(cfg){let imageModel=cfg.agents?.defaults?.imageModel;if(!imageModel)return[];let refs=[];if(typeof imageModel==`string`)imageModel.trim()&&refs.push(imageModel.trim());else{imageModel.primary?.trim()&&refs.push(imageModel.primary.trim());for(let fb of imageModel.fallbacks??[])fb?.trim()&&refs.push(fb.trim())}let entries=[];for(let ref of refs){let slashIdx=ref.indexOf(`/`);slashIdx<=0||slashIdx>=ref.length-1||entries.push({type:`provider`,provider:ref.slice(0,slashIdx),model:ref.slice(slashIdx+1)})}return entries}async function resolveAutoEntries(params){let activeEntry=await resolveActiveModelEntry(params);if(activeEntry)return[activeEntry];if(params.capability===`audio`){let localAudio=await resolveLocalAudioEntry();if(localAudio)return[localAudio]}if(params.capability===`image`){let imageModelEntries=resolveImageModelFromAgentDefaults(params.cfg);if(imageModelEntries.length>0)return imageModelEntries}let gemini=await resolveGeminiCliEntry(params.capability);if(gemini)return[gemini];let keys=await resolveKeyEntry(params);return keys?[keys]:[]}async function resolveAutoImageModel(params){let providerRegistry=buildProviderRegistry(),toActive=entry=>{if(!entry||entry.type===`cli`)return null;let provider=entry.provider;if(!provider)return null;let model=entry.model??DEFAULT_IMAGE_MODELS[provider];return model?{provider,model}:null};return toActive(await resolveActiveModelEntry({cfg:params.cfg,agentDir:params.agentDir,providerRegistry,capability:`image`,activeModel:params.activeModel}))||toActive(await resolveKeyEntry({cfg:params.cfg,agentDir:params.agentDir,providerRegistry,capability:`image`,activeModel:params.activeModel}))}async function resolveActiveModelEntry(params){let activeProviderRaw=params.activeModel?.provider?.trim();if(!activeProviderRaw)return null;let providerId=normalizeMediaProviderId(activeProviderRaw);if(!providerId)return null;let provider=getMediaUnderstandingProvider(providerId,params.providerRegistry);if(!provider||params.capability===`audio`&&!provider.transcribeAudio||params.capability===`image`&&!provider.describeImage||params.capability===`video`&&!provider.describeVideo)return null;try{await resolveApiKeyForProvider({provider:providerId,cfg:params.cfg,agentDir:params.agentDir})}catch{return null}return{type:`provider`,provider:providerId,model:params.activeModel?.model}}async function runAttachmentEntries(params){let{entries,capability}=params,attempts=[];for(let entry of entries){let entryType=entry.type??(entry.command?`cli`:`provider`);try{let result=entryType===`cli`?await runCliEntry({capability,entry,cfg:params.cfg,ctx:params.ctx,attachmentIndex:params.attachmentIndex,cache:params.cache,config:params.config}):await runProviderEntry({capability,entry,cfg:params.cfg,ctx:params.ctx,attachmentIndex:params.attachmentIndex,cache:params.cache,agentDir:params.agentDir,providerRegistry:params.providerRegistry,config:params.config});if(result){let decision=buildModelDecision({entry,entryType,outcome:`success`});return result.provider&&(decision.provider=result.provider),result.model&&(decision.model=result.model),attempts.push(decision),{output:result,attempts}}attempts.push(buildModelDecision({entry,entryType,outcome:`skipped`,reason:`empty output`}))}catch(err){if(isMediaUnderstandingSkipError(err)){attempts.push(buildModelDecision({entry,entryType,outcome:`skipped`,reason:`${err.reason}: ${err.message}`})),shouldLogVerbose()&&logVerbose(`Skipping ${capability} model due to ${err.reason}: ${err.message}`);continue}attempts.push(buildModelDecision({entry,entryType,outcome:`failed`,reason:String(err)})),shouldLogVerbose()&&logVerbose(`${capability} understanding failed: ${String(err)}`)}}return{output:null,attempts}}async function runCapability(params){let{capability,cfg,ctx}=params,config=params.config??cfg.tools?.media?.[capability];if(config?.enabled===!1)return{outputs:[],decision:{capability,outcome:`disabled`,attachments:[]}};let attachmentPolicy=config?.attachments,selected=selectAttachments({capability,attachments:params.media,policy:attachmentPolicy});if(selected.length===0)return{outputs:[],decision:{capability,outcome:`no-attachment`,attachments:[]}};if(resolveScopeDecision({scope:config?.scope,ctx})===`deny`)return shouldLogVerbose()&&logVerbose(`${capability} understanding disabled by scope policy.`),{outputs:[],decision:{capability,outcome:`scope-deny`,attachments:selected.map(item=>({attachmentIndex:item.index,attempts:[]}))}};let activeProvider=params.activeModel?.provider?.trim();if(capability===`image`&&activeProvider&&modelSupportsVision(findModelInCatalog(await loadModelCatalog({config:cfg}),activeProvider,params.activeModel?.model??``))){shouldLogVerbose()&&logVerbose(`Skipping image understanding: primary model supports vision natively`);let model=params.activeModel?.model?.trim();return{outputs:[],decision:{capability,outcome:`skipped`,attachments:selected.map(item=>{let attempt={type:`provider`,provider:activeProvider,model:model||void 0,outcome:`skipped`,reason:`primary model supports vision natively`};return{attachmentIndex:item.index,attempts:[attempt],chosen:attempt}})}}}let resolvedEntries=resolveModelEntries({cfg,capability,config,providerRegistry:params.providerRegistry});if(resolvedEntries.length===0&&(resolvedEntries=await resolveAutoEntries({cfg,agentDir:params.agentDir,providerRegistry:params.providerRegistry,capability,activeModel:params.activeModel})),resolvedEntries.length===0)return{outputs:[],decision:{capability,outcome:`skipped`,attachments:selected.map(item=>({attachmentIndex:item.index,attempts:[]}))}};let outputs=[],attachmentDecisions=[];for(let attachment of selected){let{output,attempts}=await runAttachmentEntries({capability,cfg,ctx,attachmentIndex:attachment.index,agentDir:params.agentDir,providerRegistry:params.providerRegistry,cache:params.attachments,entries:resolvedEntries,config});output&&outputs.push(output),attachmentDecisions.push({attachmentIndex:attachment.index,attempts,chosen:attempts.find(attempt=>attempt.outcome===`success`)})}let decision={capability,outcome:outputs.length>0?`success`:`skipped`,attachments:attachmentDecisions};return shouldLogVerbose()&&logVerbose(`Media understanding ${formatDecisionSummary(decision)}`),{outputs,decision}}export{promoteThinkingTagsToBlocks as A,extractAssistantText as C,formatReasoningMessage as D,extractThinkingFromTaggedText as E,stripMinimaxToolCallXml as M,stripThinkingTagsFromText as N,inferToolMetaFromArgs as O,extractTextFromChatContent as P,applyTemplate as S,extractThinkingFromTaggedStream as T,coerceImageModelConfig as _,runCapability as a,minimaxUnderstandImage as b,installUnhandledRejectionHandler as c,resolveConcurrency as d,resolveTimeoutMs as f,coerceImageAssistantText as g,describeImageWithModel as h,resolveAutoImageModel as i,stripDowngradedToolCallText as j,isAssistantMessage as k,registerUnhandledRejectionHandler as l,resolveMediaUnderstandingScope as m,createMediaAttachmentCache as n,isAudioAttachment as o,normalizeMediaUnderstandingChatType as p,normalizeMediaAttachments as r,resolveAttachmentKind as s,buildProviderRegistry as t,installUncaughtExceptionHandler as u,decodeDataUrl as v,extractAssistantThinking as w,CLI_OUTPUT_MAX_BUFFER as x,resolveProviderVisionModelFromConfig as y};
@@ -1,4 +1,4 @@
1
- import{F as shouldLogVerbose,M as logVerbose,f as isRecord}from"./utils-DbaBVFaK.js";import{N as sanitizeUserFacingText}from"./embedded-helpers-BrfnCpCe.js";import{t as logDebug}from"./logger-Bch0bx9c.js";import{n as runExec}from"./exec-DdcIjeyn.js";import{E as normalizeGoogleModelId,Q as nativeComplete,X as stripReasoningTagsFromText,at as requireApiKey,l as normalizeProviderId,ot as resolveApiKeyForProvider,rt as getApiKeyForModel,tn as normalizeSecretInput}from"./model-selection-DX_WOc2P.js";import{t as normalizeBaseUrl$1}from"./normalize-base-url-Dz6Za7Ks.js";import{i as readSharedEnvVar,n as isTruthyFlag,r as readRuntimeEnvVar,t as isOfflineMode}from"./env-file-BI2jpOmF.js";import{t as normalizeChatType}from"./chat-type-BIcMq5LD.js";import{a as discoverAuthStorage,i as modelSupportsVision,o as discoverModels,r as loadModelCatalog,s as ensureBuilderForceAgentsModelsJson,t as findModelInCatalog}from"./model-catalog-C7PdRY6w.js";import{r as formatUncaughtError,t as extractErrorCode}from"./errors-CjmtpPBP.js";import{c as detectMime,f as isAudioFileName,m as kindFromMime,u as getFileExtension}from"./image-ops-CONrkLJK.js";import{n as resolveToolDisplay,t as formatToolDetail}from"./tool-display-TRKLY-yH.js";import{n as fetchWithTimeout}from"./fetch-timeout-D8-LocJa.js";import{t as fetchWithSsrFGuard}from"./fetch-guard-BQuCLA1C.js";import{n as executeWithApiKeyRotation,r as parseGeminiAuth,t as collectProviderApiKeysForExecution}from"./api-key-rotation-ChHXb1Pq.js";import{n as fetchRemoteMedia,t as MediaFetchError}from"./fetch-CDeJQlzN.js";import process$1 from"node:process";import{fileURLToPath}from"node:url";import{constants}from"node:fs";import os from"node:os";import path from"node:path";import crypto from"node:crypto";import fs$1 from"node:fs/promises";function formatTemplateValue(value){return value==null?``:typeof value==`string`?value:typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value):typeof value==`symbol`||typeof value==`function`?value.toString():Array.isArray(value)?value.flatMap(entry=>entry==null?[]:typeof entry==`string`?[entry]:typeof entry==`number`||typeof entry==`boolean`||typeof entry==`bigint`?[String(entry)]:[]).join(`,`):``}function applyTemplate(str,ctx){return str?str.replace(/{{\s*(\w+)\s*}}/g,(_,key)=>{let value=ctx[key];return formatTemplateValue(value)}):``}const MB=1024*1024,DEFAULT_MAX_CHARS_BY_CAPABILITY={image:500,audio:void 0,video:500},DEFAULT_MAX_BYTES={image:10*MB,audio:20*MB,video:50*MB},DEFAULT_TIMEOUT_SECONDS={image:60,audio:60,video:120},DEFAULT_PROMPT={image:`Describe the image.`,audio:`Transcribe the audio.`,video:`Describe the video.`};70*MB;const DEFAULT_AUDIO_MODELS={groq:`whisper-large-v3-turbo`,openai:`gpt-4o-mini-transcribe`,deepgram:`nova-3`},AUTO_AUDIO_KEY_PROVIDERS=[`openai`,`groq`,`deepgram`,`google`],AUTO_IMAGE_KEY_PROVIDERS=[`openai`,`anthropic`,`google`,`minimax`,`zai`],AUTO_VIDEO_KEY_PROVIDERS=[`google`],DEFAULT_IMAGE_MODELS={openai:`gpt-5-mini`,anthropic:`claude-opus-4-6`,google:`gemini-3-flash-preview`,minimax:`MiniMax-VL-01`,zai:`glm-4.6v`},CLI_OUTPUT_MAX_BUFFER=5*MB;function coerceApiHost(params){let env=params.env??process.env,raw=params.apiHost?.trim()||env.MINIMAX_API_HOST?.trim()||params.modelBaseUrl?.trim()||`https://api.minimax.io`;try{return new URL(raw).origin}catch{}try{return new URL(`https://${raw}`).origin}catch{return`https://api.minimax.io`}}function pickString(rec,key){let v=rec[key];return typeof v==`string`?v:``}async function minimaxUnderstandImage(params){let apiKey=normalizeSecretInput(params.apiKey);if(!apiKey)throw Error(`MiniMax VLM: apiKey required`);let prompt=params.prompt.trim();if(!prompt)throw Error(`MiniMax VLM: prompt required`);let imageDataUrl=params.imageDataUrl.trim();if(!imageDataUrl)throw Error(`MiniMax VLM: imageDataUrl required`);if(!/^data:image\/(png|jpeg|webp);base64,/i.test(imageDataUrl))throw Error(`MiniMax VLM: imageDataUrl must be a base64 data:image/(png|jpeg|webp) URL`);let host=coerceApiHost({apiHost:params.apiHost,modelBaseUrl:params.modelBaseUrl}),url=new URL(`/v1/coding_plan/vlm`,host).toString(),res=await fetch(url,{method:`POST`,headers:{Authorization:`Bearer ${apiKey}`,"Content-Type":`application/json`,"MM-API-Source":`BuilderForceAgents`},body:JSON.stringify({prompt,image_url:imageDataUrl})}),traceId=res.headers.get(`Trace-Id`)??``;if(!res.ok){let body=await res.text().catch(()=>``),trace=traceId?` Trace-Id: ${traceId}`:``;throw Error(`MiniMax VLM request failed (${res.status} ${res.statusText}).${trace}${body?` Body: ${body.slice(0,400)}`:``}`)}let json=await res.json().catch(()=>null);if(!isRecord(json)){let trace=traceId?` Trace-Id: ${traceId}`:``;throw Error(`MiniMax VLM response was not JSON.${trace}`)}let baseResp=isRecord(json.base_resp)?json.base_resp:{},code=typeof baseResp.status_code==`number`?baseResp.status_code:-1;if(code!==0){let msg=(baseResp.status_msg??``).trim(),trace=traceId?` Trace-Id: ${traceId}`:``;throw Error(`MiniMax VLM API error (${code})${msg?`: ${msg}`:``}.${trace}`)}let content=pickString(json,`content`).trim();if(!content){let trace=traceId?` Trace-Id: ${traceId}`:``;throw Error(`MiniMax VLM returned no content.${trace}`)}return content}function extractTextFromChatContent(content,opts){let normalize=opts?.normalizeText??(text=>text.replace(/\s+/g,` `).trim()),joinWith=opts?.joinWith??` `;if(typeof content==`string`)return normalize(opts?.sanitizeText?opts.sanitizeText(content):content)||null;if(!Array.isArray(content))return null;let chunks=[];for(let block of content){if(!block||typeof block!=`object`||block.type!==`text`)continue;let text=block.text;if(typeof text!=`string`)continue;let value=opts?.sanitizeText?opts.sanitizeText(text):text;value.trim()&&chunks.push(value)}return normalize(chunks.join(joinWith))||null}function isAssistantMessage(msg){return msg?.role===`assistant`}function stripMinimaxToolCallXml(text){if(!text||!/minimax:tool_call/i.test(text))return text;let cleaned=text.replace(/<invoke\b[^>]*>[\s\S]*?<\/invoke>/gi,``);return cleaned=cleaned.replace(/<\/?minimax:tool_call>/gi,``),cleaned}function stripDowngradedToolCallText(text){if(!text||!/\[Tool (?:Call|Result)/i.test(text)&&!/\[Historical context/i.test(text))return text;let consumeJsonish=(input,start,options)=>{let{allowLeadingNewlines=!1}=options??{},index=start;for(;index<input.length;){let ch=input[index];if(ch===` `||ch===` `){index+=1;continue}if(allowLeadingNewlines&&(ch===`
1
+ import{F as shouldLogVerbose,M as logVerbose,f as isRecord}from"./utils-DbaBVFaK.js";import{N as sanitizeUserFacingText}from"./embedded-helpers-3FEGD_4b.js";import{t as logDebug}from"./logger-Bch0bx9c.js";import{n as runExec}from"./exec-DdcIjeyn.js";import{E as normalizeGoogleModelId,Q as nativeComplete,X as stripReasoningTagsFromText,at as requireApiKey,l as normalizeProviderId,ot as resolveApiKeyForProvider,rt as getApiKeyForModel,tn as normalizeSecretInput}from"./model-selection-DX_WOc2P.js";import{t as normalizeBaseUrl$1}from"./normalize-base-url-Dz6Za7Ks.js";import{i as readSharedEnvVar,n as isTruthyFlag,r as readRuntimeEnvVar,t as isOfflineMode}from"./env-file-BI2jpOmF.js";import{t as normalizeChatType}from"./chat-type-BIcMq5LD.js";import{a as discoverAuthStorage,i as modelSupportsVision,o as discoverModels,r as loadModelCatalog,s as ensureBuilderForceAgentsModelsJson,t as findModelInCatalog}from"./model-catalog-C7PdRY6w.js";import{r as formatUncaughtError,t as extractErrorCode}from"./errors-CjmtpPBP.js";import{c as detectMime,f as isAudioFileName,m as kindFromMime,u as getFileExtension}from"./image-ops-CONrkLJK.js";import{n as resolveToolDisplay,t as formatToolDetail}from"./tool-display-TRKLY-yH.js";import{n as fetchWithTimeout}from"./fetch-timeout-D8-LocJa.js";import{t as fetchWithSsrFGuard}from"./fetch-guard-BQuCLA1C.js";import{n as executeWithApiKeyRotation,r as parseGeminiAuth,t as collectProviderApiKeysForExecution}from"./api-key-rotation-ChHXb1Pq.js";import{n as fetchRemoteMedia,t as MediaFetchError}from"./fetch-CDeJQlzN.js";import process$1 from"node:process";import{fileURLToPath}from"node:url";import{constants}from"node:fs";import os from"node:os";import path from"node:path";import crypto from"node:crypto";import fs$1 from"node:fs/promises";function formatTemplateValue(value){return value==null?``:typeof value==`string`?value:typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value):typeof value==`symbol`||typeof value==`function`?value.toString():Array.isArray(value)?value.flatMap(entry=>entry==null?[]:typeof entry==`string`?[entry]:typeof entry==`number`||typeof entry==`boolean`||typeof entry==`bigint`?[String(entry)]:[]).join(`,`):``}function applyTemplate(str,ctx){return str?str.replace(/{{\s*(\w+)\s*}}/g,(_,key)=>{let value=ctx[key];return formatTemplateValue(value)}):``}const MB=1024*1024,DEFAULT_MAX_CHARS_BY_CAPABILITY={image:500,audio:void 0,video:500},DEFAULT_MAX_BYTES={image:10*MB,audio:20*MB,video:50*MB},DEFAULT_TIMEOUT_SECONDS={image:60,audio:60,video:120},DEFAULT_PROMPT={image:`Describe the image.`,audio:`Transcribe the audio.`,video:`Describe the video.`};70*MB;const DEFAULT_AUDIO_MODELS={groq:`whisper-large-v3-turbo`,openai:`gpt-4o-mini-transcribe`,deepgram:`nova-3`},AUTO_AUDIO_KEY_PROVIDERS=[`openai`,`groq`,`deepgram`,`google`],AUTO_IMAGE_KEY_PROVIDERS=[`openai`,`anthropic`,`google`,`minimax`,`zai`],AUTO_VIDEO_KEY_PROVIDERS=[`google`],DEFAULT_IMAGE_MODELS={openai:`gpt-5-mini`,anthropic:`claude-opus-4-6`,google:`gemini-3-flash-preview`,minimax:`MiniMax-VL-01`,zai:`glm-4.6v`},CLI_OUTPUT_MAX_BUFFER=5*MB;function coerceApiHost(params){let env=params.env??process.env,raw=params.apiHost?.trim()||env.MINIMAX_API_HOST?.trim()||params.modelBaseUrl?.trim()||`https://api.minimax.io`;try{return new URL(raw).origin}catch{}try{return new URL(`https://${raw}`).origin}catch{return`https://api.minimax.io`}}function pickString(rec,key){let v=rec[key];return typeof v==`string`?v:``}async function minimaxUnderstandImage(params){let apiKey=normalizeSecretInput(params.apiKey);if(!apiKey)throw Error(`MiniMax VLM: apiKey required`);let prompt=params.prompt.trim();if(!prompt)throw Error(`MiniMax VLM: prompt required`);let imageDataUrl=params.imageDataUrl.trim();if(!imageDataUrl)throw Error(`MiniMax VLM: imageDataUrl required`);if(!/^data:image\/(png|jpeg|webp);base64,/i.test(imageDataUrl))throw Error(`MiniMax VLM: imageDataUrl must be a base64 data:image/(png|jpeg|webp) URL`);let host=coerceApiHost({apiHost:params.apiHost,modelBaseUrl:params.modelBaseUrl}),url=new URL(`/v1/coding_plan/vlm`,host).toString(),res=await fetch(url,{method:`POST`,headers:{Authorization:`Bearer ${apiKey}`,"Content-Type":`application/json`,"MM-API-Source":`BuilderForceAgents`},body:JSON.stringify({prompt,image_url:imageDataUrl})}),traceId=res.headers.get(`Trace-Id`)??``;if(!res.ok){let body=await res.text().catch(()=>``),trace=traceId?` Trace-Id: ${traceId}`:``;throw Error(`MiniMax VLM request failed (${res.status} ${res.statusText}).${trace}${body?` Body: ${body.slice(0,400)}`:``}`)}let json=await res.json().catch(()=>null);if(!isRecord(json)){let trace=traceId?` Trace-Id: ${traceId}`:``;throw Error(`MiniMax VLM response was not JSON.${trace}`)}let baseResp=isRecord(json.base_resp)?json.base_resp:{},code=typeof baseResp.status_code==`number`?baseResp.status_code:-1;if(code!==0){let msg=(baseResp.status_msg??``).trim(),trace=traceId?` Trace-Id: ${traceId}`:``;throw Error(`MiniMax VLM API error (${code})${msg?`: ${msg}`:``}.${trace}`)}let content=pickString(json,`content`).trim();if(!content){let trace=traceId?` Trace-Id: ${traceId}`:``;throw Error(`MiniMax VLM returned no content.${trace}`)}return content}function extractTextFromChatContent(content,opts){let normalize=opts?.normalizeText??(text=>text.replace(/\s+/g,` `).trim()),joinWith=opts?.joinWith??` `;if(typeof content==`string`)return normalize(opts?.sanitizeText?opts.sanitizeText(content):content)||null;if(!Array.isArray(content))return null;let chunks=[];for(let block of content){if(!block||typeof block!=`object`||block.type!==`text`)continue;let text=block.text;if(typeof text!=`string`)continue;let value=opts?.sanitizeText?opts.sanitizeText(text):text;value.trim()&&chunks.push(value)}return normalize(chunks.join(joinWith))||null}function isAssistantMessage(msg){return msg?.role===`assistant`}function stripMinimaxToolCallXml(text){if(!text||!/minimax:tool_call/i.test(text))return text;let cleaned=text.replace(/<invoke\b[^>]*>[\s\S]*?<\/invoke>/gi,``);return cleaned=cleaned.replace(/<\/?minimax:tool_call>/gi,``),cleaned}function stripDowngradedToolCallText(text){if(!text||!/\[Tool (?:Call|Result)/i.test(text)&&!/\[Historical context/i.test(text))return text;let consumeJsonish=(input,start,options)=>{let{allowLeadingNewlines=!1}=options??{},index=start;for(;index<input.length;){let ch=input[index];if(ch===` `||ch===` `){index+=1;continue}if(allowLeadingNewlines&&(ch===`
2
2
  `||ch===`\r`)){index+=1;continue}break}if(index>=input.length)return null;let startChar=input[index];if(startChar===`{`||startChar===`[`){let depth=0,inString=!1,escape=!1;for(let i=index;i<input.length;i+=1){let ch=input[i];if(inString){escape?escape=!1:ch===`\\`?escape=!0:ch===`"`&&(inString=!1);continue}if(ch===`"`){inString=!0;continue}if(ch===`{`||ch===`[`){depth+=1;continue}if((ch===`}`||ch===`]`)&&(--depth,depth===0))return i+1}return null}if(startChar===`"`){let escape=!1;for(let i=index+1;i<input.length;i+=1){let ch=input[i];if(escape){escape=!1;continue}if(ch===`\\`){escape=!0;continue}if(ch===`"`)return i+1}return null}let end=index;for(;end<input.length&&input[end]!==`
3
3
  `&&input[end]!==`\r`;)end+=1;return end},cleaned=(input=>{let markerRe=/\[Tool Call:[^\]]*\]/gi,result=``,cursor=0;for(let match of input.matchAll(markerRe)){let start=match.index??0;if(start<cursor)continue;result+=input.slice(cursor,start);let index=start+match[0].length;for(;index<input.length&&(input[index]===` `||input[index]===` `);)index+=1;for(input[index]===`\r`&&(index+=1),input[index]===`
4
4
  `&&(index+=1);index<input.length&&(input[index]===` `||input[index]===` `);)index+=1;if(input.slice(index,index+9).toLowerCase()===`arguments`){index+=9,input[index]===`:`&&(index+=1),input[index]===` `&&(index+=1);let end=consumeJsonish(input,index,{allowLeadingNewlines:!0});end!==null&&(index=end)}(input[index]===`
@@ -9,5 +9,5 @@ import{F as shouldLogVerbose,M as logVerbose,f as isRecord}from"./utils-DbaBVFaK
9
9
  `).trim():``}function formatReasoningMessage(text){let trimmed=text.trim();return trimmed?`Reasoning:\n${trimmed.split(`
10
10
  `).map(line=>line&&`_${line}_`).join(`
11
11
  `)}`:``}function splitThinkingTaggedText(text){let trimmedStart=text.trimStart();if(!trimmedStart.startsWith(`<`)||!/<\s*(?:think(?:ing)?|thought|antthinking)\s*>/i.test(trimmedStart)||!/<\s*\/\s*(?:think(?:ing)?|thought|antthinking)\s*>/i.test(text))return null;let scanRe=/<\s*(\/?)\s*(?:think(?:ing)?|thought|antthinking)\s*>/gi,inThinking=!1,cursor=0,thinkingStart=0,blocks=[],pushText=value=>{value&&blocks.push({type:`text`,text:value})},pushThinking=value=>{let cleaned=value.trim();cleaned&&blocks.push({type:`thinking`,thinking:cleaned})};for(let match of text.matchAll(scanRe)){let index=match.index??0,isClose=!!match[1]?.includes(`/`);if(!inThinking&&!isClose){pushText(text.slice(cursor,index)),thinkingStart=index+match[0].length,inThinking=!0;continue}inThinking&&isClose&&(pushThinking(text.slice(thinkingStart,index)),cursor=index+match[0].length,inThinking=!1)}return inThinking||(pushText(text.slice(cursor)),!blocks.some(b=>b.type===`thinking`))?null:blocks}function promoteThinkingTagsToBlocks(message){if(!Array.isArray(message.content)||message.content.some(block=>block.type===`thinking`))return;let next=[],changed=!1;for(let block of message.content){if(block.type!==`text`){next.push(block);continue}let split=splitThinkingTaggedText(block.text);if(!split){next.push(block);continue}changed=!0;for(let part of split)if(part.type===`thinking`)next.push({type:`thinking`,thinking:part.thinking});else if(part.type===`text`){let cleaned=part.text.trimStart();cleaned&&next.push({type:`text`,text:cleaned})}}changed&&(message.content=next)}function extractThinkingFromTaggedText(text){if(!text)return``;let scanRe=/<\s*(\/?)\s*(?:think(?:ing)?|thought|antthinking)\s*>/gi,result=``,lastIndex=0,inThinking=!1;for(let match of text.matchAll(scanRe)){let idx=match.index??0;inThinking&&(result+=text.slice(lastIndex,idx)),inThinking=match[1]!==`/`,lastIndex=idx+match[0].length}return result.trim()}function extractThinkingFromTaggedStream(text){if(!text)return``;let closed=extractThinkingFromTaggedText(text);if(closed)return closed;let openRe=/<\s*(?:think(?:ing)?|thought|antthinking)\s*>/gi,closeRe=/<\s*\/\s*(?:think(?:ing)?|thought|antthinking)\s*>/gi,openMatches=[...text.matchAll(openRe)];if(openMatches.length===0)return``;let closeMatches=[...text.matchAll(closeRe)],lastOpen=openMatches[openMatches.length-1],lastClose=closeMatches[closeMatches.length-1];if(lastClose&&(lastClose.index??-1)>(lastOpen.index??-1))return closed;let start=(lastOpen.index??0)+lastOpen[0].length;return text.slice(start).trim()}function inferToolMetaFromArgs(toolName,args){return formatToolDetail(resolveToolDisplay({name:toolName,args}))}function decodeDataUrl(dataUrl){let trimmed=dataUrl.trim(),match=/^data:([^;,]+);base64,([a-z0-9+/=\r\n]+)$/i.exec(trimmed);if(!match)throw Error(`Invalid data URL (expected base64 data: URL).`);let mimeType=(match[1]??``).trim().toLowerCase();if(!mimeType.startsWith(`image/`))throw Error(`Unsupported data URL type: ${mimeType||`unknown`}`);let b64=(match[2]??``).trim(),buffer=Buffer.from(b64,`base64`);if(buffer.length===0)throw Error(`Invalid data URL: empty payload.`);return{buffer,mimeType,kind:`image`}}function coerceImageAssistantText(params){let stop=params.message.stopReason,errorMessage=params.message.errorMessage?.trim();if(stop===`error`||stop===`aborted`)throw Error(errorMessage?`Image model failed (${params.provider}/${params.model}): ${errorMessage}`:`Image model failed (${params.provider}/${params.model})`);if(errorMessage)throw Error(`Image model failed (${params.provider}/${params.model}): ${errorMessage}`);let text=extractAssistantText(params.message);if(text.trim())return text.trim();throw Error(`Image model returned no text (${params.provider}/${params.model}).`)}function coerceImageModelConfig(cfg){let imageModel=cfg?.agents?.defaults?.imageModel,primary=typeof imageModel==`string`?imageModel.trim():imageModel?.primary,fallbacks=typeof imageModel==`object`?imageModel?.fallbacks??[]:[];return{...primary?.trim()?{primary:primary.trim()}:{},...fallbacks.length>0?{fallbacks}:{}}}function resolveProviderVisionModelFromConfig(params){let models=params.cfg?.models?.providers?.[params.provider]?.models??[],id=(((params.provider===`minimax`?models.find(m=>(m?.id??``).trim()===`MiniMax-VL-01`&&Array.isArray(m?.input)&&m.input.includes(`image`)):null)??models.find(m=>!!(m?.id??``).trim()&&m.input?.includes(`image`)))?.id??``).trim();return id?`${params.provider}/${id}`:null}async function describeImageWithModel(params){await ensureBuilderForceAgentsModelsJson(params.cfg,params.agentDir);let authStorage=discoverAuthStorage(params.agentDir),model=discoverModels(authStorage,params.agentDir).find(params.provider,params.model);if(!model)throw Error(`Unknown model: ${params.provider}/${params.model}`);if(!model.input?.includes(`image`))throw Error(`Model does not support images: ${params.provider}/${params.model}`);let apiKey=requireApiKey(await getApiKeyForModel({model,cfg:params.cfg,agentDir:params.agentDir,profileId:params.profile,preferredProfile:params.preferredProfile}),model.provider);authStorage.setRuntimeApiKey(model.provider,apiKey);let base64=params.buffer.toString(`base64`);if(model.provider===`minimax`)return{text:await minimaxUnderstandImage({apiKey,prompt:params.prompt??`Describe the image.`,imageDataUrl:`data:${params.mime??`image/jpeg`};base64,${base64}`,modelBaseUrl:model.baseUrl}),model:model.id};let visionMessages={messages:[{role:`user`,content:[{type:`text`,text:params.prompt??`Describe the image.`},{type:`image`,data:base64,mimeType:params.mime??`image/jpeg`}],timestamp:Date.now()}]}.messages.map(m=>({role:m.role,content:Array.isArray(m.content)?m.content.map(c=>c.type===`image`?{type:`image_url`,image_url:{url:`data:${c.mimeType};base64,${c.data}`}}:{type:`text`,text:c.text}):m.content})),res=await nativeComplete({baseUrl:model.baseUrl,apiKey,defaultModel:model.id},{model:model.id,messages:visionMessages,extra:{max_tokens:params.maxTokens??512}});return{text:coerceImageAssistantText({message:{role:`assistant`,content:[{type:`text`,text:res.content}],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:res.finishReason===`error`?`error`:`stop`,timestamp:Date.now()},provider:model.provider,model:model.id}),model:model.id}}const anthropicProvider={id:`anthropic`,capabilities:[`image`],describeImage:describeImageWithModel};function normalizeBaseUrl(baseUrl,fallback){return normalizeBaseUrl$1(baseUrl?.trim()||fallback)}async function fetchWithTimeoutGuarded(url,init,timeoutMs,fetchFn,options){return await fetchWithSsrFGuard({url,fetchImpl:fetchFn,init,timeoutMs,policy:options?.ssrfPolicy,lookupFn:options?.lookupFn,pinDns:options?.pinDns})}async function readErrorResponse(res){try{let collapsed=(await res.text()).replace(/\s+/g,` `).trim();return collapsed?collapsed.length<=300?collapsed:`${collapsed.slice(0,300)}…`:void 0}catch{return}}async function assertOkOrThrowHttpError(res,label){if(res.ok)return;let detail=await readErrorResponse(res),suffix=detail?`: ${detail}`:``;throw Error(`${label} (HTTP ${res.status})${suffix}`)}function resolveModel$1(model){return model?.trim()||`nova-3`}async function transcribeDeepgramAudio(params){let fetchFn=params.fetchFn??fetch,baseUrl=normalizeBaseUrl(params.baseUrl,`https://api.deepgram.com/v1`),allowPrivate=!!params.baseUrl?.trim(),model=resolveModel$1(params.model),url=new URL(`${baseUrl}/listen`);if(url.searchParams.set(`model`,model),params.language?.trim()&&url.searchParams.set(`language`,params.language.trim()),params.query)for(let[key,value]of Object.entries(params.query))value!==void 0&&url.searchParams.set(key,String(value));let headers=new Headers(params.headers);headers.has(`authorization`)||headers.set(`authorization`,`Token ${params.apiKey}`),headers.has(`content-type`)||headers.set(`content-type`,params.mime??`application/octet-stream`);let body=new Uint8Array(params.buffer),{response:res,release}=await fetchWithTimeoutGuarded(url.toString(),{method:`POST`,headers,body},params.timeoutMs,fetchFn,allowPrivate?{ssrfPolicy:{allowPrivateNetwork:!0}}:void 0);try{await assertOkOrThrowHttpError(res,`Audio transcription failed`);let transcript=(await res.json()).results?.channels?.[0]?.alternatives?.[0]?.transcript?.trim();if(!transcript)throw Error(`Audio transcription response missing transcript`);return{text:transcript,model}}finally{await release()}}const deepgramProvider={id:`deepgram`,capabilities:[`audio`],transcribeAudio:transcribeDeepgramAudio};async function generateGeminiInlineDataText(params){let fetchFn=params.fetchFn??fetch,baseUrl=normalizeBaseUrl(params.baseUrl,params.defaultBaseUrl),allowPrivate=!!params.baseUrl?.trim(),model=(()=>{let trimmed=params.model?.trim();return trimmed?normalizeGoogleModelId(trimmed):params.defaultModel})(),url=`${baseUrl}/models/${model}:generateContent`,authHeaders=parseGeminiAuth(params.apiKey),headers=new Headers(params.headers);for(let[key,value]of Object.entries(authHeaders.headers))headers.has(key)||headers.set(key,value);let body={contents:[{role:`user`,parts:[{text:params.prompt?.trim()||params.defaultPrompt},{inline_data:{mime_type:params.mime??params.defaultMime,data:params.buffer.toString(`base64`)}}]}]},{response:res,release}=await fetchWithTimeoutGuarded(url,{method:`POST`,headers,body:JSON.stringify(body)},params.timeoutMs,fetchFn,allowPrivate?{ssrfPolicy:{allowPrivateNetwork:!0}}:void 0);try{await assertOkOrThrowHttpError(res,params.httpErrorLabel);let text=((await res.json()).candidates?.[0]?.content?.parts??[]).map(part=>part?.text?.trim()).filter(Boolean).join(`
12
- `);if(!text)throw Error(params.missingTextError);return{text,model}}finally{await release()}}async function transcribeGeminiAudio(params){let{text,model}=await generateGeminiInlineDataText({...params,defaultBaseUrl:`https://generativelanguage.googleapis.com/v1beta`,defaultModel:`gemini-3-flash-preview`,defaultPrompt:`Transcribe the audio.`,defaultMime:`audio/wav`,httpErrorLabel:`Audio transcription failed`,missingTextError:`Audio transcription response missing text`});return{text,model}}async function describeGeminiVideo(params){let{text,model}=await generateGeminiInlineDataText({...params,defaultBaseUrl:`https://generativelanguage.googleapis.com/v1beta`,defaultModel:`gemini-3-flash-preview`,defaultPrompt:`Describe the video.`,defaultMime:`video/mp4`,httpErrorLabel:`Video description failed`,missingTextError:`Video description response missing text`});return{text,model}}const googleProvider={id:`google`,capabilities:[`image`,`audio`,`video`],describeImage:describeImageWithModel,transcribeAudio:transcribeGeminiAudio,describeVideo:describeGeminiVideo};function resolveModel(model){return model?.trim()||`gpt-4o-mini-transcribe`}async function transcribeOpenAiCompatibleAudio(params){let fetchFn=params.fetchFn??fetch,baseUrl=normalizeBaseUrl(params.baseUrl,`https://api.openai.com/v1`),allowPrivate=!!params.baseUrl?.trim(),url=`${baseUrl}/audio/transcriptions`,model=resolveModel(params.model),form=new FormData,fileName=params.fileName?.trim()||path.basename(params.fileName)||`audio`,bytes=new Uint8Array(params.buffer),blob=new Blob([bytes],{type:params.mime??`application/octet-stream`});form.append(`file`,blob,fileName),form.append(`model`,model),params.language?.trim()&&form.append(`language`,params.language.trim()),params.prompt?.trim()&&form.append(`prompt`,params.prompt.trim());let headers=new Headers(params.headers);headers.has(`authorization`)||headers.set(`authorization`,`Bearer ${params.apiKey}`);let{response:res,release}=await fetchWithTimeoutGuarded(url,{method:`POST`,headers,body:form},params.timeoutMs,fetchFn,allowPrivate?{ssrfPolicy:{allowPrivateNetwork:!0}}:void 0);try{await assertOkOrThrowHttpError(res,`Audio transcription failed`);let text=(await res.json()).text?.trim();if(!text)throw Error(`Audio transcription response missing text`);return{text,model}}finally{await release()}}const PROVIDERS=[{id:`groq`,capabilities:[`audio`],transcribeAudio:req=>transcribeOpenAiCompatibleAudio({...req,baseUrl:req.baseUrl??`https://api.groq.com/openai/v1`})},{id:`openai`,capabilities:[`image`],describeImage:describeImageWithModel,transcribeAudio:transcribeOpenAiCompatibleAudio},googleProvider,anthropicProvider,{id:`minimax`,capabilities:[`image`],describeImage:describeImageWithModel},{id:`zai`,capabilities:[`image`],describeImage:describeImageWithModel},deepgramProvider];function normalizeMediaProviderId(id){let normalized=normalizeProviderId(id);return normalized===`gemini`?`google`:normalized}function buildMediaUnderstandingRegistry(overrides){let registry=new Map;for(let provider of PROVIDERS)registry.set(normalizeMediaProviderId(provider.id),provider);if(overrides)for(let[key,provider]of Object.entries(overrides)){let normalizedKey=normalizeMediaProviderId(key),existing=registry.get(normalizedKey),merged=existing?{...existing,...provider,capabilities:provider.capabilities??existing.capabilities}:provider;registry.set(normalizedKey,merged)}return registry}function getMediaUnderstandingProvider(id,registry){return registry.get(normalizeMediaProviderId(id))}function normalizeDecision(value){let normalized=value?.trim().toLowerCase();if(normalized===`allow`)return`allow`;if(normalized===`deny`)return`deny`}function normalizeMatch(value){return value?.trim().toLowerCase()||void 0}function normalizeMediaUnderstandingChatType(raw){return normalizeChatType(raw??void 0)}function resolveMediaUnderstandingScope(params){let scope=params.scope;if(!scope)return`allow`;let channel=normalizeMatch(params.channel),chatType=normalizeMediaUnderstandingChatType(params.chatType),sessionKey=normalizeMatch(params.sessionKey)??``;for(let rule of scope.rules??[]){if(!rule)continue;let action=normalizeDecision(rule.action)??`allow`,match=rule.match??{},matchChannel=normalizeMatch(match.channel),matchChatType=normalizeMediaUnderstandingChatType(match.chatType),matchPrefix=normalizeMatch(match.keyPrefix);if(!(matchChannel&&matchChannel!==channel)&&!(matchChatType&&matchChatType!==chatType)&&!(matchPrefix&&!sessionKey.startsWith(matchPrefix)))return action}return normalizeDecision(scope.default)??`allow`}function resolveTimeoutMs(seconds,fallbackSeconds){let value=typeof seconds==`number`&&Number.isFinite(seconds)?seconds:fallbackSeconds;return Math.max(1e3,Math.floor(value*1e3))}function resolvePrompt(capability,prompt,maxChars){let base=prompt?.trim()||DEFAULT_PROMPT[capability];return!maxChars||capability===`audio`?base:`${base} Respond in at most ${maxChars} characters.`}function resolveMaxChars(params){let{capability,entry,cfg}=params,configured=entry.maxChars??params.config?.maxChars??cfg.tools?.media?.[capability]?.maxChars;return typeof configured==`number`?configured:DEFAULT_MAX_CHARS_BY_CAPABILITY[capability]}function resolveMaxBytes(params){let configured=params.entry.maxBytes??params.config?.maxBytes??params.cfg.tools?.media?.[params.capability]?.maxBytes;return typeof configured==`number`?configured:DEFAULT_MAX_BYTES[params.capability]}function resolveScopeDecision(params){return resolveMediaUnderstandingScope({scope:params.scope,sessionKey:params.ctx.SessionKey,channel:params.ctx.Surface??params.ctx.Provider,chatType:normalizeMediaUnderstandingChatType(params.ctx.ChatType)})}function resolveEntryCapabilities(params){if((params.entry.type??(params.entry.command?`cli`:`provider`))===`cli`)return;let providerId=normalizeMediaProviderId(params.entry.provider??``);if(providerId)return params.providerRegistry.get(providerId)?.capabilities}function resolveModelEntries(params){let{cfg,capability,config}=params,sharedModels=cfg.tools?.media?.models??[],entries=[...(config?.models??[]).map(entry=>({entry,source:`capability`})),...sharedModels.map(entry=>({entry,source:`shared`}))];return entries.length===0?[]:entries.filter(({entry,source})=>{let caps=entry.capabilities&&entry.capabilities.length>0?entry.capabilities:source===`shared`?resolveEntryCapabilities({entry,providerRegistry:params.providerRegistry}):void 0;return!caps||caps.length===0?source===`shared`?(shouldLogVerbose()&&logVerbose(`Skipping shared media model without capabilities: ${entry.provider??entry.command??`unknown`}`),!1):!0:caps.includes(capability)}).map(({entry})=>entry)}function resolveConcurrency(cfg){let configured=cfg.tools?.media?.concurrency;return typeof configured==`number`&&Number.isFinite(configured)&&configured>0?Math.floor(configured):2}async function loadWorkspaceContext(workspaceDir){try{let{loadProjectContext}=await import(`./project-context-store-B2GYSwld.js`);return await loadProjectContext(workspaceDir)}catch(err){return logDebug(`[error-report] could not read project context: ${String(err)}`),null}}function isPlatformErrorReportingEnabled(){return isOfflineMode()?!1:isTruthyFlag(readRuntimeEnvVar(`BUILDERFORCE_ERROR_REPORTING`))}async function sendRuntimeErrorReport(error,report){if(!isPlatformErrorReportingEnabled())return;let message=error instanceof Error?error.message:String(error),stack=error instanceof Error?error.stack??null:null,apiKey=readSharedEnvVar(`BUILDERFORCE_API_KEY`);if(!apiKey)return;let ctx=report.workspaceDir?await loadWorkspaceContext(report.workspaceDir):null,agentHostId=ctx?.builderforce?.instanceId;if(!agentHostId)return;let projectIdRaw=ctx?.builderforce?.projectId?Number(ctx.builderforce.projectId):NaN,projectId=Number.isFinite(projectIdRaw)&&projectIdRaw>0?projectIdRaw:null,base=normalizeBaseUrl$1(readSharedEnvVar(`BUILDERFORCE_URL`)??`https://api.builderforce.ai`);try{let res=await fetch(`${base}/api/quality-ingest/client-report`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${apiKey}`,"X-AgentHost-Id":String(agentHostId)},body:JSON.stringify({source:`agent-runtime`,projectId,events:[{type:error instanceof Error?error.name:`AgentRuntimeError`,message,stack,level:report.level??`error`,operation:report.operation,timestamp:new Date().toISOString(),context:report.context??{}}]}),signal:AbortSignal.timeout(8e3)});res.ok||logDebug(`[error-report] returned HTTP ${res.status}`)}catch(err){logDebug(`[error-report] failed: ${String(err)}`)}}async function reportAndExit(error,options){console.error(options.label,formatUncaughtError(error)),isPlatformErrorReportingEnabled()&&await Promise.race([sendRuntimeErrorReport(error,{operation:options.operation,level:`fatal`,workspaceDir:options.workspaceDir??process$1.cwd()}),new Promise(resolve=>setTimeout(resolve,5e3).unref?.())]).catch(reportingError=>{logDebug(`[fatal-exit] crash report failed: ${String(reportingError)}`)}),process$1.exit(options.exitCode??1)}function installUncaughtExceptionHandler(workspaceDir){process$1.on(`uncaughtException`,error=>{reportAndExit(error,{operation:`uncaughtException`,label:`[builderforce] Uncaught exception:`,workspaceDir})})}const handlers=new Set,FATAL_ERROR_CODES=new Set([`ERR_OUT_OF_MEMORY`,`ERR_SCRIPT_EXECUTION_TIMEOUT`,`ERR_WORKER_OUT_OF_MEMORY`,`ERR_WORKER_UNCAUGHT_EXCEPTION`,`ERR_WORKER_INITIALIZATION_FAILED`]),CONFIG_ERROR_CODES=new Set([`INVALID_CONFIG`,`MISSING_API_KEY`,`MISSING_CREDENTIALS`]),TRANSIENT_NETWORK_CODES=new Set([`ECONNRESET`,`ECONNREFUSED`,`ENOTFOUND`,`ETIMEDOUT`,`ESOCKETTIMEDOUT`,`ECONNABORTED`,`EPIPE`,`EHOSTUNREACH`,`ENETUNREACH`,`EAI_AGAIN`,`UND_ERR_CONNECT_TIMEOUT`,`UND_ERR_DNS_RESOLVE_FAILED`,`UND_ERR_CONNECT`,`UND_ERR_SOCKET`,`UND_ERR_HEADERS_TIMEOUT`,`UND_ERR_BODY_TIMEOUT`]);function getErrorCause(err){if(!(!err||typeof err!=`object`))return err.cause}function extractErrorCodeWithCause(err){return extractErrorCode(err)||extractErrorCode(getErrorCause(err))}function isAbortError(err){return!err||typeof err!=`object`?!1:(`name`in err?String(err.name):``)===`AbortError`||(`message`in err&&typeof err.message==`string`?err.message:``)===`This operation was aborted`}function isFatalError(err){let code=extractErrorCodeWithCause(err);return code!==void 0&&FATAL_ERROR_CODES.has(code)}function isConfigError(err){let code=extractErrorCodeWithCause(err);return code!==void 0&&CONFIG_ERROR_CODES.has(code)}function isTransientNetworkError(err){if(!err)return!1;let code=extractErrorCodeWithCause(err);if(code&&TRANSIENT_NETWORK_CODES.has(code))return!0;if(err instanceof TypeError&&err.message===`fetch failed`){let cause=getErrorCause(err);return cause?isTransientNetworkError(cause):!0}let cause=getErrorCause(err);return cause&&cause!==err?isTransientNetworkError(cause):err instanceof AggregateError&&err.errors?.length?err.errors.some(e=>isTransientNetworkError(e)):!1}function registerUnhandledRejectionHandler(handler){return handlers.add(handler),()=>{handlers.delete(handler)}}function isUnhandledRejectionHandled(reason){for(let handler of handlers)try{if(handler(reason))return!0}catch(err){console.error(`[builderforce] Unhandled rejection handler failed:`,err instanceof Error?err.stack??err.message:err)}return!1}function installUnhandledRejectionHandler(){process$1.on(`unhandledRejection`,(reason,_promise)=>{if(!isUnhandledRejectionHandled(reason)){if(isAbortError(reason)){console.warn(`[builderforce] Suppressed AbortError:`,formatUncaughtError(reason));return}if(isFatalError(reason)){reportAndExit(reason,{operation:`unhandledRejection:fatal`,label:`[builderforce] FATAL unhandled rejection:`});return}if(isConfigError(reason)){reportAndExit(reason,{operation:`unhandledRejection:config`,label:`[builderforce] CONFIGURATION ERROR - requires fix:`});return}if(isTransientNetworkError(reason)){console.warn(`[builderforce] Non-fatal unhandled rejection (continuing):`,formatUncaughtError(reason));return}reportAndExit(reason,{operation:`unhandledRejection`,label:`[builderforce] Unhandled promise rejection:`})}})}var MediaUnderstandingSkipError=class extends Error{constructor(reason,message){super(message),this.reason=reason,this.name=`MediaUnderstandingSkipError`}};function isMediaUnderstandingSkipError(err){return err instanceof MediaUnderstandingSkipError}function normalizeAttachmentPath(raw){let value=raw?.trim();if(value){if(value.startsWith(`file://`))try{return fileURLToPath(value)}catch{return}return value}}function normalizeAttachments(ctx){let pathsFromArray=Array.isArray(ctx.MediaPaths)?ctx.MediaPaths:void 0,urlsFromArray=Array.isArray(ctx.MediaUrls)?ctx.MediaUrls:void 0,typesFromArray=Array.isArray(ctx.MediaTypes)?ctx.MediaTypes:void 0,resolveMime=(count,index)=>{let typeHint=typesFromArray?.[index];return(typeof typeHint==`string`?typeHint.trim():``)||(count===1?ctx.MediaType:void 0)};if(pathsFromArray&&pathsFromArray.length>0){let count=pathsFromArray.length,urls=urlsFromArray&&urlsFromArray.length>0?urlsFromArray:void 0;return pathsFromArray.map((value,index)=>({path:value?.trim()||void 0,url:urls?.[index]??ctx.MediaUrl,mime:resolveMime(count,index),index})).filter(entry=>!!(entry.path?.trim()||entry.url?.trim()))}if(urlsFromArray&&urlsFromArray.length>0){let count=urlsFromArray.length;return urlsFromArray.map((value,index)=>({path:void 0,url:value?.trim()||void 0,mime:resolveMime(count,index),index})).filter(entry=>!!entry.url?.trim())}let pathValue=ctx.MediaPath?.trim(),url=ctx.MediaUrl?.trim();return!pathValue&&!url?[]:[{path:pathValue||void 0,url:url||void 0,mime:ctx.MediaType,index:0}]}function resolveAttachmentKind(attachment){let kind=kindFromMime(attachment.mime);if(kind===`image`||kind===`audio`||kind===`video`)return kind;let ext=getFileExtension(attachment.path??attachment.url);return ext?[`.mp4`,`.mov`,`.mkv`,`.webm`,`.avi`,`.m4v`].includes(ext)?`video`:isAudioFileName(attachment.path??attachment.url)?`audio`:[`.png`,`.jpg`,`.jpeg`,`.webp`,`.gif`,`.bmp`,`.tiff`,`.tif`].includes(ext)?`image`:`unknown`:`unknown`}function isVideoAttachment(attachment){return resolveAttachmentKind(attachment)===`video`}function isAudioAttachment(attachment){return resolveAttachmentKind(attachment)===`audio`}function isImageAttachment(attachment){return resolveAttachmentKind(attachment)===`image`}function resolveRequestUrl(input){return typeof input==`string`?input:input instanceof URL?input.toString():input.url}function orderAttachments(attachments,prefer){if(!prefer||prefer===`first`)return attachments;if(prefer===`last`)return[...attachments].toReversed();if(prefer===`path`){let withPath=attachments.filter(item=>item.path),withoutPath=attachments.filter(item=>!item.path);return[...withPath,...withoutPath]}if(prefer===`url`){let withUrl=attachments.filter(item=>item.url),withoutUrl=attachments.filter(item=>!item.url);return[...withUrl,...withoutUrl]}return attachments}function selectAttachments(params){let{capability,attachments,policy}=params,matches=attachments.filter(item=>capability===`audio`&&item.alreadyTranscribed?!1:capability===`image`?isImageAttachment(item):capability===`audio`?isAudioAttachment(item):isVideoAttachment(item));if(matches.length===0)return[];let ordered=orderAttachments(matches,policy?.prefer),mode=policy?.mode??`first`,maxAttachments=policy?.maxAttachments??1;return mode===`all`?ordered.slice(0,Math.max(1,maxAttachments)):ordered.slice(0,1)}var MediaAttachmentCache=class{constructor(attachments){this.entries=new Map,this.attachments=attachments;for(let attachment of attachments)this.entries.set(attachment.index,{attachment})}async getBuffer(params){let entry=await this.ensureEntry(params.attachmentIndex);if(entry.buffer){if(entry.buffer.length>params.maxBytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`);return{buffer:entry.buffer,mime:entry.bufferMime,fileName:entry.bufferFileName??`media-${params.attachmentIndex+1}`,size:entry.buffer.length}}if(entry.resolvedPath){let size=await this.ensureLocalStat(entry);if(entry.resolvedPath){if(size!==void 0&&size>params.maxBytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`);let buffer=await fs$1.readFile(entry.resolvedPath);return entry.buffer=buffer,entry.bufferMime=entry.bufferMime??entry.attachment.mime??await detectMime({buffer,filePath:entry.resolvedPath}),entry.bufferFileName=path.basename(entry.resolvedPath)||`media-${params.attachmentIndex+1}`,{buffer,mime:entry.bufferMime,fileName:entry.bufferFileName,size:buffer.length}}}let url=entry.attachment.url?.trim();if(!url)throw new MediaUnderstandingSkipError(`empty`,`Attachment ${params.attachmentIndex+1} has no path or URL.`);try{let fetched=await fetchRemoteMedia({url,fetchImpl:(input,init)=>fetchWithTimeout(resolveRequestUrl(input),init??{},params.timeoutMs,fetch),maxBytes:params.maxBytes});return entry.buffer=fetched.buffer,entry.bufferMime=entry.attachment.mime??fetched.contentType??await detectMime({buffer:fetched.buffer,filePath:fetched.fileName??url}),entry.bufferFileName=fetched.fileName??`media-${params.attachmentIndex+1}`,{buffer:fetched.buffer,mime:entry.bufferMime,fileName:entry.bufferFileName,size:fetched.buffer.length}}catch(err){throw err instanceof MediaFetchError&&err.code===`max_bytes`?new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`):isAbortError(err)?new MediaUnderstandingSkipError(`timeout`,`Attachment ${params.attachmentIndex+1} timed out while fetching.`):err}}async getPath(params){let entry=await this.ensureEntry(params.attachmentIndex);if(entry.resolvedPath){if(params.maxBytes){let size=await this.ensureLocalStat(entry);if(entry.resolvedPath&&size!==void 0&&size>params.maxBytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`)}if(entry.resolvedPath)return{path:entry.resolvedPath}}if(entry.tempPath){if(params.maxBytes&&entry.buffer&&entry.buffer.length>params.maxBytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`);return{path:entry.tempPath,cleanup:entry.tempCleanup}}let maxBytes=params.maxBytes??1/0,bufferResult=await this.getBuffer({attachmentIndex:params.attachmentIndex,maxBytes,timeoutMs:params.timeoutMs}),extension=path.extname(bufferResult.fileName||``)||``,tmpPath=path.join(os.tmpdir(),`builderforce-media-${crypto.randomUUID()}${extension}`);return await fs$1.writeFile(tmpPath,bufferResult.buffer),entry.tempPath=tmpPath,entry.tempCleanup=async()=>{await fs$1.unlink(tmpPath).catch(()=>{})},{path:tmpPath,cleanup:entry.tempCleanup}}async cleanup(){let cleanups=[];for(let entry of this.entries.values())entry.tempCleanup&&=(cleanups.push(Promise.resolve(entry.tempCleanup())),void 0);await Promise.all(cleanups)}async ensureEntry(attachmentIndex){let existing=this.entries.get(attachmentIndex);if(existing)return existing.resolvedPath||=this.resolveLocalPath(existing.attachment),existing;let attachment=this.attachments.find(item=>item.index===attachmentIndex)??{index:attachmentIndex},entry={attachment,resolvedPath:this.resolveLocalPath(attachment)};return this.entries.set(attachmentIndex,entry),entry}resolveLocalPath(attachment){let rawPath=normalizeAttachmentPath(attachment.path);if(rawPath)return path.isAbsolute(rawPath)?rawPath:path.resolve(rawPath)}async ensureLocalStat(entry){if(entry.resolvedPath){if(entry.statSize!==void 0)return entry.statSize;try{let stat=await fs$1.stat(entry.resolvedPath);if(!stat.isFile()){entry.resolvedPath=void 0;return}return entry.statSize=stat.size,stat.size}catch(err){entry.resolvedPath=void 0,shouldLogVerbose()&&logVerbose(`Failed to read attachment ${entry.attachment.index+1}: ${String(err)}`);return}}}};async function fileExists(filePath){if(!filePath)return!1;try{return await fs$1.stat(filePath),!0}catch{return!1}}function extractLastJsonObject(raw){let trimmed=raw.trim(),start=trimmed.lastIndexOf(`{`);if(start===-1)return null;let slice=trimmed.slice(start);try{return JSON.parse(slice)}catch{return null}}function extractGeminiResponse(raw){let payload=extractLastJsonObject(raw);if(!payload||typeof payload!=`object`)return null;let response=payload.response;return typeof response==`string`&&response.trim()||null}function estimateBase64Size(bytes){return Math.ceil(bytes/3)*4}function resolveVideoMaxBase64Bytes(maxBytes){let expanded=Math.floor(4/3*maxBytes);return Math.min(expanded,73400320)}function trimOutput(text,maxChars){let trimmed=text.trim();return!maxChars||trimmed.length<=maxChars?trimmed:trimmed.slice(0,maxChars).trim()}function extractSherpaOnnxText(raw){let tryParse=value=>{let trimmed=value.trim();if(!trimmed)return null;let head=trimmed[0];if(head!==`{`&&head!==`"`)return null;try{let parsed=JSON.parse(trimmed);if(typeof parsed==`string`)return tryParse(parsed);if(parsed&&typeof parsed==`object`){let text=parsed.text;if(typeof text==`string`&&text.trim())return text.trim()}}catch{}return null},direct=tryParse(raw);if(direct)return direct;let lines=raw.split(`
12
+ `);if(!text)throw Error(params.missingTextError);return{text,model}}finally{await release()}}async function transcribeGeminiAudio(params){let{text,model}=await generateGeminiInlineDataText({...params,defaultBaseUrl:`https://generativelanguage.googleapis.com/v1beta`,defaultModel:`gemini-3-flash-preview`,defaultPrompt:`Transcribe the audio.`,defaultMime:`audio/wav`,httpErrorLabel:`Audio transcription failed`,missingTextError:`Audio transcription response missing text`});return{text,model}}async function describeGeminiVideo(params){let{text,model}=await generateGeminiInlineDataText({...params,defaultBaseUrl:`https://generativelanguage.googleapis.com/v1beta`,defaultModel:`gemini-3-flash-preview`,defaultPrompt:`Describe the video.`,defaultMime:`video/mp4`,httpErrorLabel:`Video description failed`,missingTextError:`Video description response missing text`});return{text,model}}const googleProvider={id:`google`,capabilities:[`image`,`audio`,`video`],describeImage:describeImageWithModel,transcribeAudio:transcribeGeminiAudio,describeVideo:describeGeminiVideo};function resolveModel(model){return model?.trim()||`gpt-4o-mini-transcribe`}async function transcribeOpenAiCompatibleAudio(params){let fetchFn=params.fetchFn??fetch,baseUrl=normalizeBaseUrl(params.baseUrl,`https://api.openai.com/v1`),allowPrivate=!!params.baseUrl?.trim(),url=`${baseUrl}/audio/transcriptions`,model=resolveModel(params.model),form=new FormData,fileName=params.fileName?.trim()||path.basename(params.fileName)||`audio`,bytes=new Uint8Array(params.buffer),blob=new Blob([bytes],{type:params.mime??`application/octet-stream`});form.append(`file`,blob,fileName),form.append(`model`,model),params.language?.trim()&&form.append(`language`,params.language.trim()),params.prompt?.trim()&&form.append(`prompt`,params.prompt.trim());let headers=new Headers(params.headers);headers.has(`authorization`)||headers.set(`authorization`,`Bearer ${params.apiKey}`);let{response:res,release}=await fetchWithTimeoutGuarded(url,{method:`POST`,headers,body:form},params.timeoutMs,fetchFn,allowPrivate?{ssrfPolicy:{allowPrivateNetwork:!0}}:void 0);try{await assertOkOrThrowHttpError(res,`Audio transcription failed`);let text=(await res.json()).text?.trim();if(!text)throw Error(`Audio transcription response missing text`);return{text,model}}finally{await release()}}const PROVIDERS=[{id:`groq`,capabilities:[`audio`],transcribeAudio:req=>transcribeOpenAiCompatibleAudio({...req,baseUrl:req.baseUrl??`https://api.groq.com/openai/v1`})},{id:`openai`,capabilities:[`image`],describeImage:describeImageWithModel,transcribeAudio:transcribeOpenAiCompatibleAudio},googleProvider,anthropicProvider,{id:`minimax`,capabilities:[`image`],describeImage:describeImageWithModel},{id:`zai`,capabilities:[`image`],describeImage:describeImageWithModel},deepgramProvider];function normalizeMediaProviderId(id){let normalized=normalizeProviderId(id);return normalized===`gemini`?`google`:normalized}function buildMediaUnderstandingRegistry(overrides){let registry=new Map;for(let provider of PROVIDERS)registry.set(normalizeMediaProviderId(provider.id),provider);if(overrides)for(let[key,provider]of Object.entries(overrides)){let normalizedKey=normalizeMediaProviderId(key),existing=registry.get(normalizedKey),merged=existing?{...existing,...provider,capabilities:provider.capabilities??existing.capabilities}:provider;registry.set(normalizedKey,merged)}return registry}function getMediaUnderstandingProvider(id,registry){return registry.get(normalizeMediaProviderId(id))}function normalizeDecision(value){let normalized=value?.trim().toLowerCase();if(normalized===`allow`)return`allow`;if(normalized===`deny`)return`deny`}function normalizeMatch(value){return value?.trim().toLowerCase()||void 0}function normalizeMediaUnderstandingChatType(raw){return normalizeChatType(raw??void 0)}function resolveMediaUnderstandingScope(params){let scope=params.scope;if(!scope)return`allow`;let channel=normalizeMatch(params.channel),chatType=normalizeMediaUnderstandingChatType(params.chatType),sessionKey=normalizeMatch(params.sessionKey)??``;for(let rule of scope.rules??[]){if(!rule)continue;let action=normalizeDecision(rule.action)??`allow`,match=rule.match??{},matchChannel=normalizeMatch(match.channel),matchChatType=normalizeMediaUnderstandingChatType(match.chatType),matchPrefix=normalizeMatch(match.keyPrefix);if(!(matchChannel&&matchChannel!==channel)&&!(matchChatType&&matchChatType!==chatType)&&!(matchPrefix&&!sessionKey.startsWith(matchPrefix)))return action}return normalizeDecision(scope.default)??`allow`}function resolveTimeoutMs(seconds,fallbackSeconds){let value=typeof seconds==`number`&&Number.isFinite(seconds)?seconds:fallbackSeconds;return Math.max(1e3,Math.floor(value*1e3))}function resolvePrompt(capability,prompt,maxChars){let base=prompt?.trim()||DEFAULT_PROMPT[capability];return!maxChars||capability===`audio`?base:`${base} Respond in at most ${maxChars} characters.`}function resolveMaxChars(params){let{capability,entry,cfg}=params,configured=entry.maxChars??params.config?.maxChars??cfg.tools?.media?.[capability]?.maxChars;return typeof configured==`number`?configured:DEFAULT_MAX_CHARS_BY_CAPABILITY[capability]}function resolveMaxBytes(params){let configured=params.entry.maxBytes??params.config?.maxBytes??params.cfg.tools?.media?.[params.capability]?.maxBytes;return typeof configured==`number`?configured:DEFAULT_MAX_BYTES[params.capability]}function resolveScopeDecision(params){return resolveMediaUnderstandingScope({scope:params.scope,sessionKey:params.ctx.SessionKey,channel:params.ctx.Surface??params.ctx.Provider,chatType:normalizeMediaUnderstandingChatType(params.ctx.ChatType)})}function resolveEntryCapabilities(params){if((params.entry.type??(params.entry.command?`cli`:`provider`))===`cli`)return;let providerId=normalizeMediaProviderId(params.entry.provider??``);if(providerId)return params.providerRegistry.get(providerId)?.capabilities}function resolveModelEntries(params){let{cfg,capability,config}=params,sharedModels=cfg.tools?.media?.models??[],entries=[...(config?.models??[]).map(entry=>({entry,source:`capability`})),...sharedModels.map(entry=>({entry,source:`shared`}))];return entries.length===0?[]:entries.filter(({entry,source})=>{let caps=entry.capabilities&&entry.capabilities.length>0?entry.capabilities:source===`shared`?resolveEntryCapabilities({entry,providerRegistry:params.providerRegistry}):void 0;return!caps||caps.length===0?source===`shared`?(shouldLogVerbose()&&logVerbose(`Skipping shared media model without capabilities: ${entry.provider??entry.command??`unknown`}`),!1):!0:caps.includes(capability)}).map(({entry})=>entry)}function resolveConcurrency(cfg){let configured=cfg.tools?.media?.concurrency;return typeof configured==`number`&&Number.isFinite(configured)&&configured>0?Math.floor(configured):2}async function loadWorkspaceContext(workspaceDir){try{let{loadProjectContext}=await import(`./project-context-store-BzX1YdMP.js`);return await loadProjectContext(workspaceDir)}catch(err){return logDebug(`[error-report] could not read project context: ${String(err)}`),null}}function isPlatformErrorReportingEnabled(){return isOfflineMode()?!1:isTruthyFlag(readRuntimeEnvVar(`BUILDERFORCE_ERROR_REPORTING`))}async function sendRuntimeErrorReport(error,report){if(!isPlatformErrorReportingEnabled())return;let message=error instanceof Error?error.message:String(error),stack=error instanceof Error?error.stack??null:null,apiKey=readSharedEnvVar(`BUILDERFORCE_API_KEY`);if(!apiKey)return;let ctx=report.workspaceDir?await loadWorkspaceContext(report.workspaceDir):null,agentHostId=ctx?.builderforce?.instanceId;if(!agentHostId)return;let projectIdRaw=ctx?.builderforce?.projectId?Number(ctx.builderforce.projectId):NaN,projectId=Number.isFinite(projectIdRaw)&&projectIdRaw>0?projectIdRaw:null,base=normalizeBaseUrl$1(readSharedEnvVar(`BUILDERFORCE_URL`)??`https://api.builderforce.ai`);try{let res=await fetch(`${base}/api/quality-ingest/client-report`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${apiKey}`,"X-AgentHost-Id":String(agentHostId)},body:JSON.stringify({source:`agent-runtime`,projectId,events:[{type:error instanceof Error?error.name:`AgentRuntimeError`,message,stack,level:report.level??`error`,operation:report.operation,timestamp:new Date().toISOString(),context:report.context??{}}]}),signal:AbortSignal.timeout(8e3)});res.ok||logDebug(`[error-report] returned HTTP ${res.status}`)}catch(err){logDebug(`[error-report] failed: ${String(err)}`)}}async function reportAndExit(error,options){console.error(options.label,formatUncaughtError(error)),isPlatformErrorReportingEnabled()&&await Promise.race([sendRuntimeErrorReport(error,{operation:options.operation,level:`fatal`,workspaceDir:options.workspaceDir??process$1.cwd()}),new Promise(resolve=>setTimeout(resolve,5e3).unref?.())]).catch(reportingError=>{logDebug(`[fatal-exit] crash report failed: ${String(reportingError)}`)}),process$1.exit(options.exitCode??1)}function installUncaughtExceptionHandler(workspaceDir){process$1.on(`uncaughtException`,error=>{reportAndExit(error,{operation:`uncaughtException`,label:`[builderforce] Uncaught exception:`,workspaceDir})})}const handlers=new Set,FATAL_ERROR_CODES=new Set([`ERR_OUT_OF_MEMORY`,`ERR_SCRIPT_EXECUTION_TIMEOUT`,`ERR_WORKER_OUT_OF_MEMORY`,`ERR_WORKER_UNCAUGHT_EXCEPTION`,`ERR_WORKER_INITIALIZATION_FAILED`]),CONFIG_ERROR_CODES=new Set([`INVALID_CONFIG`,`MISSING_API_KEY`,`MISSING_CREDENTIALS`]),TRANSIENT_NETWORK_CODES=new Set([`ECONNRESET`,`ECONNREFUSED`,`ENOTFOUND`,`ETIMEDOUT`,`ESOCKETTIMEDOUT`,`ECONNABORTED`,`EPIPE`,`EHOSTUNREACH`,`ENETUNREACH`,`EAI_AGAIN`,`UND_ERR_CONNECT_TIMEOUT`,`UND_ERR_DNS_RESOLVE_FAILED`,`UND_ERR_CONNECT`,`UND_ERR_SOCKET`,`UND_ERR_HEADERS_TIMEOUT`,`UND_ERR_BODY_TIMEOUT`]);function getErrorCause(err){if(!(!err||typeof err!=`object`))return err.cause}function extractErrorCodeWithCause(err){return extractErrorCode(err)||extractErrorCode(getErrorCause(err))}function isAbortError(err){return!err||typeof err!=`object`?!1:(`name`in err?String(err.name):``)===`AbortError`||(`message`in err&&typeof err.message==`string`?err.message:``)===`This operation was aborted`}function isFatalError(err){let code=extractErrorCodeWithCause(err);return code!==void 0&&FATAL_ERROR_CODES.has(code)}function isConfigError(err){let code=extractErrorCodeWithCause(err);return code!==void 0&&CONFIG_ERROR_CODES.has(code)}function isTransientNetworkError(err){if(!err)return!1;let code=extractErrorCodeWithCause(err);if(code&&TRANSIENT_NETWORK_CODES.has(code))return!0;if(err instanceof TypeError&&err.message===`fetch failed`){let cause=getErrorCause(err);return cause?isTransientNetworkError(cause):!0}let cause=getErrorCause(err);return cause&&cause!==err?isTransientNetworkError(cause):err instanceof AggregateError&&err.errors?.length?err.errors.some(e=>isTransientNetworkError(e)):!1}function registerUnhandledRejectionHandler(handler){return handlers.add(handler),()=>{handlers.delete(handler)}}function isUnhandledRejectionHandled(reason){for(let handler of handlers)try{if(handler(reason))return!0}catch(err){console.error(`[builderforce] Unhandled rejection handler failed:`,err instanceof Error?err.stack??err.message:err)}return!1}function installUnhandledRejectionHandler(){process$1.on(`unhandledRejection`,(reason,_promise)=>{if(!isUnhandledRejectionHandled(reason)){if(isAbortError(reason)){console.warn(`[builderforce] Suppressed AbortError:`,formatUncaughtError(reason));return}if(isFatalError(reason)){reportAndExit(reason,{operation:`unhandledRejection:fatal`,label:`[builderforce] FATAL unhandled rejection:`});return}if(isConfigError(reason)){reportAndExit(reason,{operation:`unhandledRejection:config`,label:`[builderforce] CONFIGURATION ERROR - requires fix:`});return}if(isTransientNetworkError(reason)){console.warn(`[builderforce] Non-fatal unhandled rejection (continuing):`,formatUncaughtError(reason));return}reportAndExit(reason,{operation:`unhandledRejection`,label:`[builderforce] Unhandled promise rejection:`})}})}var MediaUnderstandingSkipError=class extends Error{constructor(reason,message){super(message),this.reason=reason,this.name=`MediaUnderstandingSkipError`}};function isMediaUnderstandingSkipError(err){return err instanceof MediaUnderstandingSkipError}function normalizeAttachmentPath(raw){let value=raw?.trim();if(value){if(value.startsWith(`file://`))try{return fileURLToPath(value)}catch{return}return value}}function normalizeAttachments(ctx){let pathsFromArray=Array.isArray(ctx.MediaPaths)?ctx.MediaPaths:void 0,urlsFromArray=Array.isArray(ctx.MediaUrls)?ctx.MediaUrls:void 0,typesFromArray=Array.isArray(ctx.MediaTypes)?ctx.MediaTypes:void 0,resolveMime=(count,index)=>{let typeHint=typesFromArray?.[index];return(typeof typeHint==`string`?typeHint.trim():``)||(count===1?ctx.MediaType:void 0)};if(pathsFromArray&&pathsFromArray.length>0){let count=pathsFromArray.length,urls=urlsFromArray&&urlsFromArray.length>0?urlsFromArray:void 0;return pathsFromArray.map((value,index)=>({path:value?.trim()||void 0,url:urls?.[index]??ctx.MediaUrl,mime:resolveMime(count,index),index})).filter(entry=>!!(entry.path?.trim()||entry.url?.trim()))}if(urlsFromArray&&urlsFromArray.length>0){let count=urlsFromArray.length;return urlsFromArray.map((value,index)=>({path:void 0,url:value?.trim()||void 0,mime:resolveMime(count,index),index})).filter(entry=>!!entry.url?.trim())}let pathValue=ctx.MediaPath?.trim(),url=ctx.MediaUrl?.trim();return!pathValue&&!url?[]:[{path:pathValue||void 0,url:url||void 0,mime:ctx.MediaType,index:0}]}function resolveAttachmentKind(attachment){let kind=kindFromMime(attachment.mime);if(kind===`image`||kind===`audio`||kind===`video`)return kind;let ext=getFileExtension(attachment.path??attachment.url);return ext?[`.mp4`,`.mov`,`.mkv`,`.webm`,`.avi`,`.m4v`].includes(ext)?`video`:isAudioFileName(attachment.path??attachment.url)?`audio`:[`.png`,`.jpg`,`.jpeg`,`.webp`,`.gif`,`.bmp`,`.tiff`,`.tif`].includes(ext)?`image`:`unknown`:`unknown`}function isVideoAttachment(attachment){return resolveAttachmentKind(attachment)===`video`}function isAudioAttachment(attachment){return resolveAttachmentKind(attachment)===`audio`}function isImageAttachment(attachment){return resolveAttachmentKind(attachment)===`image`}function resolveRequestUrl(input){return typeof input==`string`?input:input instanceof URL?input.toString():input.url}function orderAttachments(attachments,prefer){if(!prefer||prefer===`first`)return attachments;if(prefer===`last`)return[...attachments].toReversed();if(prefer===`path`){let withPath=attachments.filter(item=>item.path),withoutPath=attachments.filter(item=>!item.path);return[...withPath,...withoutPath]}if(prefer===`url`){let withUrl=attachments.filter(item=>item.url),withoutUrl=attachments.filter(item=>!item.url);return[...withUrl,...withoutUrl]}return attachments}function selectAttachments(params){let{capability,attachments,policy}=params,matches=attachments.filter(item=>capability===`audio`&&item.alreadyTranscribed?!1:capability===`image`?isImageAttachment(item):capability===`audio`?isAudioAttachment(item):isVideoAttachment(item));if(matches.length===0)return[];let ordered=orderAttachments(matches,policy?.prefer),mode=policy?.mode??`first`,maxAttachments=policy?.maxAttachments??1;return mode===`all`?ordered.slice(0,Math.max(1,maxAttachments)):ordered.slice(0,1)}var MediaAttachmentCache=class{constructor(attachments){this.entries=new Map,this.attachments=attachments;for(let attachment of attachments)this.entries.set(attachment.index,{attachment})}async getBuffer(params){let entry=await this.ensureEntry(params.attachmentIndex);if(entry.buffer){if(entry.buffer.length>params.maxBytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`);return{buffer:entry.buffer,mime:entry.bufferMime,fileName:entry.bufferFileName??`media-${params.attachmentIndex+1}`,size:entry.buffer.length}}if(entry.resolvedPath){let size=await this.ensureLocalStat(entry);if(entry.resolvedPath){if(size!==void 0&&size>params.maxBytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`);let buffer=await fs$1.readFile(entry.resolvedPath);return entry.buffer=buffer,entry.bufferMime=entry.bufferMime??entry.attachment.mime??await detectMime({buffer,filePath:entry.resolvedPath}),entry.bufferFileName=path.basename(entry.resolvedPath)||`media-${params.attachmentIndex+1}`,{buffer,mime:entry.bufferMime,fileName:entry.bufferFileName,size:buffer.length}}}let url=entry.attachment.url?.trim();if(!url)throw new MediaUnderstandingSkipError(`empty`,`Attachment ${params.attachmentIndex+1} has no path or URL.`);try{let fetched=await fetchRemoteMedia({url,fetchImpl:(input,init)=>fetchWithTimeout(resolveRequestUrl(input),init??{},params.timeoutMs,fetch),maxBytes:params.maxBytes});return entry.buffer=fetched.buffer,entry.bufferMime=entry.attachment.mime??fetched.contentType??await detectMime({buffer:fetched.buffer,filePath:fetched.fileName??url}),entry.bufferFileName=fetched.fileName??`media-${params.attachmentIndex+1}`,{buffer:fetched.buffer,mime:entry.bufferMime,fileName:entry.bufferFileName,size:fetched.buffer.length}}catch(err){throw err instanceof MediaFetchError&&err.code===`max_bytes`?new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`):isAbortError(err)?new MediaUnderstandingSkipError(`timeout`,`Attachment ${params.attachmentIndex+1} timed out while fetching.`):err}}async getPath(params){let entry=await this.ensureEntry(params.attachmentIndex);if(entry.resolvedPath){if(params.maxBytes){let size=await this.ensureLocalStat(entry);if(entry.resolvedPath&&size!==void 0&&size>params.maxBytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`)}if(entry.resolvedPath)return{path:entry.resolvedPath}}if(entry.tempPath){if(params.maxBytes&&entry.buffer&&entry.buffer.length>params.maxBytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Attachment ${params.attachmentIndex+1} exceeds maxBytes ${params.maxBytes}`);return{path:entry.tempPath,cleanup:entry.tempCleanup}}let maxBytes=params.maxBytes??1/0,bufferResult=await this.getBuffer({attachmentIndex:params.attachmentIndex,maxBytes,timeoutMs:params.timeoutMs}),extension=path.extname(bufferResult.fileName||``)||``,tmpPath=path.join(os.tmpdir(),`builderforce-media-${crypto.randomUUID()}${extension}`);return await fs$1.writeFile(tmpPath,bufferResult.buffer),entry.tempPath=tmpPath,entry.tempCleanup=async()=>{await fs$1.unlink(tmpPath).catch(()=>{})},{path:tmpPath,cleanup:entry.tempCleanup}}async cleanup(){let cleanups=[];for(let entry of this.entries.values())entry.tempCleanup&&=(cleanups.push(Promise.resolve(entry.tempCleanup())),void 0);await Promise.all(cleanups)}async ensureEntry(attachmentIndex){let existing=this.entries.get(attachmentIndex);if(existing)return existing.resolvedPath||=this.resolveLocalPath(existing.attachment),existing;let attachment=this.attachments.find(item=>item.index===attachmentIndex)??{index:attachmentIndex},entry={attachment,resolvedPath:this.resolveLocalPath(attachment)};return this.entries.set(attachmentIndex,entry),entry}resolveLocalPath(attachment){let rawPath=normalizeAttachmentPath(attachment.path);if(rawPath)return path.isAbsolute(rawPath)?rawPath:path.resolve(rawPath)}async ensureLocalStat(entry){if(entry.resolvedPath){if(entry.statSize!==void 0)return entry.statSize;try{let stat=await fs$1.stat(entry.resolvedPath);if(!stat.isFile()){entry.resolvedPath=void 0;return}return entry.statSize=stat.size,stat.size}catch(err){entry.resolvedPath=void 0,shouldLogVerbose()&&logVerbose(`Failed to read attachment ${entry.attachment.index+1}: ${String(err)}`);return}}}};async function fileExists(filePath){if(!filePath)return!1;try{return await fs$1.stat(filePath),!0}catch{return!1}}function extractLastJsonObject(raw){let trimmed=raw.trim(),start=trimmed.lastIndexOf(`{`);if(start===-1)return null;let slice=trimmed.slice(start);try{return JSON.parse(slice)}catch{return null}}function extractGeminiResponse(raw){let payload=extractLastJsonObject(raw);if(!payload||typeof payload!=`object`)return null;let response=payload.response;return typeof response==`string`&&response.trim()||null}function estimateBase64Size(bytes){return Math.ceil(bytes/3)*4}function resolveVideoMaxBase64Bytes(maxBytes){let expanded=Math.floor(4/3*maxBytes);return Math.min(expanded,73400320)}function trimOutput(text,maxChars){let trimmed=text.trim();return!maxChars||trimmed.length<=maxChars?trimmed:trimmed.slice(0,maxChars).trim()}function extractSherpaOnnxText(raw){let tryParse=value=>{let trimmed=value.trim();if(!trimmed)return null;let head=trimmed[0];if(head!==`{`&&head!==`"`)return null;try{let parsed=JSON.parse(trimmed);if(typeof parsed==`string`)return tryParse(parsed);if(parsed&&typeof parsed==`object`){let text=parsed.text;if(typeof text==`string`&&text.trim())return text.trim()}}catch{}return null},direct=tryParse(raw);if(direct)return direct;let lines=raw.split(`
13
13
  `).map(line=>line.trim()).filter(Boolean);for(let i=lines.length-1;i>=0;--i){let parsed=tryParse(lines[i]??``);if(parsed)return parsed}return null}function commandBase(command){return path.parse(command).name}function findArgValue(args,keys){for(let i=0;i<args.length;i+=1)if(keys.includes(args[i]??``)){let value=args[i+1];if(value)return value}}function hasArg(args,keys){return args.some(arg=>keys.includes(arg))}function resolveWhisperOutputPath(args,mediaPath){let outputDir=findArgValue(args,[`--output_dir`,`-o`]),outputFormat=findArgValue(args,[`--output_format`]);if(!outputDir||!outputFormat||!outputFormat.split(`,`).map(value=>value.trim()).includes(`txt`))return null;let base=path.parse(mediaPath).name;return path.join(outputDir,`${base}.txt`)}function resolveWhisperCppOutputPath(args){if(!hasArg(args,[`-otxt`,`--output-txt`]))return null;let outputBase=findArgValue(args,[`-of`,`--output-file`]);return outputBase?`${outputBase}.txt`:null}async function resolveCliOutput(params){let commandId=commandBase(params.command),fileOutput=commandId===`whisper-cli`?resolveWhisperCppOutputPath(params.args):commandId===`whisper`?resolveWhisperOutputPath(params.args,params.mediaPath):null;if(fileOutput&&await fileExists(fileOutput))try{let content=await fs$1.readFile(fileOutput,`utf8`);if(content.trim())return content.trim()}catch{}if(commandId===`gemini`){let response=extractGeminiResponse(params.stdout);if(response)return response}if(commandId===`sherpa-onnx-offline`){let response=extractSherpaOnnxText(params.stdout);if(response)return response}return params.stdout.trim()}function normalizeProviderQuery(options){if(!options)return;let query={};for(let[key,value]of Object.entries(options))value!==void 0&&(query[key]=value);return Object.keys(query).length>0?query:void 0}function buildDeepgramCompatQuery(options){if(!options)return;let query={};return typeof options.detectLanguage==`boolean`&&(query.detect_language=options.detectLanguage),typeof options.punctuate==`boolean`&&(query.punctuate=options.punctuate),typeof options.smartFormat==`boolean`&&(query.smart_format=options.smartFormat),Object.keys(query).length>0?query:void 0}function normalizeDeepgramQueryKeys(query){let normalized={...query};return`detectLanguage`in normalized&&(normalized.detect_language=normalized.detectLanguage,delete normalized.detectLanguage),`smartFormat`in normalized&&(normalized.smart_format=normalized.smartFormat,delete normalized.smartFormat),normalized}function resolveProviderQuery(params){let{providerId,config,entry}=params,mergedOptions=normalizeProviderQuery({...config?.providerOptions?.[providerId],...entry.providerOptions?.[providerId]});if(providerId!==`deepgram`)return mergedOptions;let query=normalizeDeepgramQueryKeys(mergedOptions??{}),compat=buildDeepgramCompatQuery({...config?.deepgram,...entry.deepgram});for(let[key,value]of Object.entries(compat??{}))query[key]===void 0&&(query[key]=value);return Object.keys(query).length>0?query:void 0}function buildModelDecision(params){if(params.entryType===`cli`){let command=params.entry.command?.trim();return{type:`cli`,provider:command??`cli`,model:params.entry.model??command,outcome:params.outcome,reason:params.reason}}let providerIdRaw=params.entry.provider?.trim();return{type:`provider`,provider:(providerIdRaw?normalizeMediaProviderId(providerIdRaw):void 0)??providerIdRaw,model:params.entry.model,outcome:params.outcome,reason:params.reason}}function resolveEntryRunOptions(params){let{capability,entry,cfg}=params,maxBytes=resolveMaxBytes({capability,entry,cfg,config:params.config}),maxChars=resolveMaxChars({capability,entry,cfg,config:params.config});return{maxBytes,maxChars,timeoutMs:resolveTimeoutMs(entry.timeoutSeconds??params.config?.timeoutSeconds??cfg.tools?.media?.[capability]?.timeoutSeconds,DEFAULT_TIMEOUT_SECONDS[capability]),prompt:resolvePrompt(capability,entry.prompt??params.config?.prompt??cfg.tools?.media?.[capability]?.prompt,maxChars)}}async function resolveProviderExecutionAuth(params){let auth=await resolveApiKeyForProvider({provider:params.providerId,cfg:params.cfg,profileId:params.entry.profile,preferredProfile:params.entry.preferredProfile,agentDir:params.agentDir});return{apiKeys:collectProviderApiKeysForExecution({provider:params.providerId,primaryApiKey:requireApiKey(auth,params.providerId)}),providerConfig:params.cfg.models?.providers?.[params.providerId]}}function formatDecisionSummary(decision){let total=decision.attachments.length,success=decision.attachments.filter(entry=>entry.chosen?.outcome===`success`).length,chosen=decision.attachments.find(entry=>entry.chosen)?.chosen,provider=chosen?.provider?.trim(),model=chosen?.model?.trim(),modelLabel=provider?model?`${provider}/${model}`:provider:void 0,reason=decision.attachments.flatMap(entry=>entry.attempts.map(attempt=>attempt.reason).filter(Boolean)).find(Boolean),shortReason=reason?reason.split(`:`)[0]?.trim():void 0,countLabel=total>0?` (${success}/${total})`:``,viaLabel=modelLabel?` via ${modelLabel}`:``,reasonLabel=shortReason?` reason=${shortReason}`:``;return`${decision.capability}: ${decision.outcome}${countLabel}${viaLabel}${reasonLabel}`}async function runProviderEntry(params){let{entry,capability,cfg}=params,providerIdRaw=entry.provider?.trim();if(!providerIdRaw)throw Error(`Provider entry missing provider for ${capability}`);let providerId=normalizeMediaProviderId(providerIdRaw),{maxBytes,maxChars,timeoutMs,prompt}=resolveEntryRunOptions({capability,entry,cfg,config:params.config});if(capability===`image`){if(!params.agentDir)throw Error(`Image understanding requires agentDir`);let modelId=entry.model?.trim();if(!modelId)throw Error(`Image understanding requires model id`);let media=await params.cache.getBuffer({attachmentIndex:params.attachmentIndex,maxBytes,timeoutMs}),provider=getMediaUnderstandingProvider(providerId,params.providerRegistry),result=provider?.describeImage?await provider.describeImage({buffer:media.buffer,fileName:media.fileName,mime:media.mime,model:modelId,provider:providerId,prompt,timeoutMs,profile:entry.profile,preferredProfile:entry.preferredProfile,agentDir:params.agentDir,cfg:params.cfg}):await describeImageWithModel({buffer:media.buffer,fileName:media.fileName,mime:media.mime,model:modelId,provider:providerId,prompt,timeoutMs,profile:entry.profile,preferredProfile:entry.preferredProfile,agentDir:params.agentDir,cfg:params.cfg});return{kind:`image.description`,attachmentIndex:params.attachmentIndex,text:trimOutput(result.text,maxChars),provider:providerId,model:result.model??modelId}}let provider=getMediaUnderstandingProvider(providerId,params.providerRegistry);if(!provider)throw Error(`Media provider not available: ${providerId}`);if(capability===`audio`){if(!provider.transcribeAudio)throw Error(`Audio transcription provider "${providerId}" not available.`);let transcribeAudio=provider.transcribeAudio,media=await params.cache.getBuffer({attachmentIndex:params.attachmentIndex,maxBytes,timeoutMs}),{apiKeys,providerConfig}=await resolveProviderExecutionAuth({providerId,cfg,entry,agentDir:params.agentDir}),baseUrl=entry.baseUrl??params.config?.baseUrl??providerConfig?.baseUrl,mergedHeaders={...providerConfig?.headers,...params.config?.headers,...entry.headers},headers=Object.keys(mergedHeaders).length>0?mergedHeaders:void 0,providerQuery=resolveProviderQuery({providerId,config:params.config,entry}),model=entry.model?.trim()||DEFAULT_AUDIO_MODELS[providerId]||entry.model,result=await executeWithApiKeyRotation({provider:providerId,apiKeys,execute:async apiKey=>transcribeAudio({buffer:media.buffer,fileName:media.fileName,mime:media.mime,apiKey,baseUrl,headers,model,language:entry.language??params.config?.language??cfg.tools?.media?.audio?.language,prompt,query:providerQuery,timeoutMs})});return{kind:`audio.transcription`,attachmentIndex:params.attachmentIndex,text:trimOutput(result.text,maxChars),provider:providerId,model:result.model??model}}if(!provider.describeVideo)throw Error(`Video understanding provider "${providerId}" not available.`);let describeVideo=provider.describeVideo,media=await params.cache.getBuffer({attachmentIndex:params.attachmentIndex,maxBytes,timeoutMs}),estimatedBase64Bytes=estimateBase64Size(media.size),maxBase64Bytes=resolveVideoMaxBase64Bytes(maxBytes);if(estimatedBase64Bytes>maxBase64Bytes)throw new MediaUnderstandingSkipError(`maxBytes`,`Video attachment ${params.attachmentIndex+1} base64 payload ${estimatedBase64Bytes} exceeds ${maxBase64Bytes}`);let{apiKeys,providerConfig}=await resolveProviderExecutionAuth({providerId,cfg,entry,agentDir:params.agentDir}),result=await executeWithApiKeyRotation({provider:providerId,apiKeys,execute:apiKey=>describeVideo({buffer:media.buffer,fileName:media.fileName,mime:media.mime,apiKey,baseUrl:providerConfig?.baseUrl,headers:providerConfig?.headers,model:entry.model,prompt,timeoutMs})});return{kind:`video.description`,attachmentIndex:params.attachmentIndex,text:trimOutput(result.text,maxChars),provider:providerId,model:result.model??entry.model}}async function runCliEntry(params){let{entry,capability,cfg,ctx}=params,command=entry.command?.trim(),args=entry.args??[];if(!command)throw Error(`CLI entry missing command for ${capability}`);let{maxBytes,maxChars,timeoutMs,prompt}=resolveEntryRunOptions({capability,entry,cfg,config:params.config}),pathResult=await params.cache.getPath({attachmentIndex:params.attachmentIndex,maxBytes,timeoutMs}),outputDir=await fs$1.mkdtemp(path.join(os.tmpdir(),`builderforce-media-cli-`)),mediaPath=pathResult.path,outputBase=path.join(outputDir,path.parse(mediaPath).name),templCtx={...ctx,MediaPath:mediaPath,MediaDir:path.dirname(mediaPath),OutputDir:outputDir,OutputBase:outputBase,Prompt:prompt,MaxChars:maxChars},argv=[command,...args].map((part,index)=>index===0?part:applyTemplate(part,templCtx));try{shouldLogVerbose()&&logVerbose(`Media understanding via CLI: ${argv.join(` `)}`);let{stdout}=await runExec(argv[0],argv.slice(1),{timeoutMs,maxBuffer:CLI_OUTPUT_MAX_BUFFER}),text=trimOutput(await resolveCliOutput({command,args:argv.slice(1),stdout,mediaPath}),maxChars);return text?{kind:capability===`audio`?`audio.transcription`:`${capability}.description`,attachmentIndex:params.attachmentIndex,text,provider:`cli`,model:command}:null}finally{await fs$1.rm(outputDir,{recursive:!0,force:!0}).catch(()=>{})}}function buildProviderRegistry(overrides){return buildMediaUnderstandingRegistry(overrides)}function normalizeMediaAttachments(ctx){return normalizeAttachments(ctx)}function createMediaAttachmentCache(attachments){return new MediaAttachmentCache(attachments)}const binaryCache=new Map,geminiProbeCache=new Map;function expandHomeDir(value){if(!value.startsWith(`~`))return value;let home=os.homedir();return value===`~`?home:value.startsWith(`~/`)?path.join(home,value.slice(2)):value}function hasPathSeparator(value){return value.includes(`/`)||value.includes(`\\`)}function candidateBinaryNames(name){if(process.platform!==`win32`||path.extname(name))return[name];let pathext=(process.env.PATHEXT??`.EXE;.CMD;.BAT;.COM`).split(`;`).map(item=>item.trim()).filter(Boolean).map(item=>item.startsWith(`.`)?item:`.${item}`);return[name,...Array.from(new Set(pathext)).map(item=>`${name}${item}`)]}async function isExecutable(filePath){try{return(await fs$1.stat(filePath)).isFile()?(process.platform===`win32`||await fs$1.access(filePath,constants.X_OK),!0):!1}catch{return!1}}async function findBinary(name){let cached=binaryCache.get(name);if(cached)return cached;let resolved=(async()=>{let direct=expandHomeDir(name.trim());if(direct&&hasPathSeparator(direct)){for(let candidate of candidateBinaryNames(direct))if(await isExecutable(candidate))return candidate}let searchName=name.trim();if(!searchName)return null;let pathEntries=(process.env.PATH??``).split(path.delimiter),candidates=candidateBinaryNames(searchName);for(let entryRaw of pathEntries){let entry=expandHomeDir(entryRaw.trim().replace(/^"(.*)"$/,`$1`));if(entry)for(let candidate of candidates){let fullPath=path.join(entry,candidate);if(await isExecutable(fullPath))return fullPath}}return null})();return binaryCache.set(name,resolved),resolved}async function hasBinary(name){return!!await findBinary(name)}async function probeGeminiCli(){let cached=geminiProbeCache.get(`gemini`);if(cached)return cached;let resolved=(async()=>{if(!await hasBinary(`gemini`))return!1;try{let{stdout}=await runExec(`gemini`,[`--output-format`,`json`,`ok`],{timeoutMs:8e3});return!!(extractGeminiResponse(stdout)??stdout.toLowerCase().includes(`ok`))}catch{return!1}})();return geminiProbeCache.set(`gemini`,resolved),resolved}async function resolveLocalWhisperCppEntry(){if(!await hasBinary(`whisper-cli`))return null;let envModel=process.env.WHISPER_CPP_MODEL?.trim(),modelPath=envModel&&await fileExists(envModel)?envModel:`/opt/homebrew/share/whisper-cpp/for-tests-ggml-tiny.bin`;return await fileExists(modelPath)?{type:`cli`,command:`whisper-cli`,args:[`-m`,modelPath,`-otxt`,`-of`,`{{OutputBase}}`,`-np`,`-nt`,`{{MediaPath}}`]}:null}async function resolveLocalWhisperEntry(){return await hasBinary(`whisper`)?{type:`cli`,command:`whisper`,args:[`--model`,`turbo`,`--output_format`,`txt`,`--output_dir`,`{{OutputDir}}`,`--verbose`,`False`,`{{MediaPath}}`]}:null}async function resolveSherpaOnnxEntry(){if(!await hasBinary(`sherpa-onnx-offline`))return null;let modelDir=process.env.SHERPA_ONNX_MODEL_DIR?.trim();if(!modelDir)return null;let tokens=path.join(modelDir,`tokens.txt`),encoder=path.join(modelDir,`encoder.onnx`),decoder=path.join(modelDir,`decoder.onnx`),joiner=path.join(modelDir,`joiner.onnx`);return!await fileExists(tokens)||!await fileExists(encoder)||!await fileExists(decoder)||!await fileExists(joiner)?null:{type:`cli`,command:`sherpa-onnx-offline`,args:[`--tokens=${tokens}`,`--encoder=${encoder}`,`--decoder=${decoder}`,`--joiner=${joiner}`,`{{MediaPath}}`]}}async function resolveLocalAudioEntry(){return await resolveSherpaOnnxEntry()||await resolveLocalWhisperCppEntry()||await resolveLocalWhisperEntry()}async function resolveGeminiCliEntry(_capability){return await probeGeminiCli()?{type:`cli`,command:`gemini`,args:[`--output-format`,`json`,`--allowed-tools`,`read_many_files`,`--include-directories`,`{{MediaDir}}`,`{{Prompt}}`,`Use read_many_files to read {{MediaPath}} and respond with only the text output.`]}:null}async function resolveKeyEntry(params){let{cfg,agentDir,providerRegistry,capability}=params,checkProvider=async(providerId,model)=>{let provider=getMediaUnderstandingProvider(providerId,providerRegistry);if(!provider||capability===`audio`&&!provider.transcribeAudio||capability===`image`&&!provider.describeImage||capability===`video`&&!provider.describeVideo)return null;try{return await resolveApiKeyForProvider({provider:providerId,cfg,agentDir}),{type:`provider`,provider:providerId,model}}catch{return null}};if(capability===`image`){let activeProvider=params.activeModel?.provider?.trim();if(activeProvider){let activeEntry=await checkProvider(activeProvider,params.activeModel?.model);if(activeEntry)return activeEntry}for(let providerId of AUTO_IMAGE_KEY_PROVIDERS){let model=DEFAULT_IMAGE_MODELS[providerId],entry=await checkProvider(providerId,model);if(entry)return entry}return null}if(capability===`video`){let activeProvider=params.activeModel?.provider?.trim();if(activeProvider){let activeEntry=await checkProvider(activeProvider,params.activeModel?.model);if(activeEntry)return activeEntry}for(let providerId of AUTO_VIDEO_KEY_PROVIDERS){let entry=await checkProvider(providerId,void 0);if(entry)return entry}return null}let activeProvider=params.activeModel?.provider?.trim();if(activeProvider){let activeEntry=await checkProvider(activeProvider,params.activeModel?.model);if(activeEntry)return activeEntry}for(let providerId of AUTO_AUDIO_KEY_PROVIDERS){let entry=await checkProvider(providerId,void 0);if(entry)return entry}return null}function resolveImageModelFromAgentDefaults(cfg){let imageModel=cfg.agents?.defaults?.imageModel;if(!imageModel)return[];let refs=[];if(typeof imageModel==`string`)imageModel.trim()&&refs.push(imageModel.trim());else{imageModel.primary?.trim()&&refs.push(imageModel.primary.trim());for(let fb of imageModel.fallbacks??[])fb?.trim()&&refs.push(fb.trim())}let entries=[];for(let ref of refs){let slashIdx=ref.indexOf(`/`);slashIdx<=0||slashIdx>=ref.length-1||entries.push({type:`provider`,provider:ref.slice(0,slashIdx),model:ref.slice(slashIdx+1)})}return entries}async function resolveAutoEntries(params){let activeEntry=await resolveActiveModelEntry(params);if(activeEntry)return[activeEntry];if(params.capability===`audio`){let localAudio=await resolveLocalAudioEntry();if(localAudio)return[localAudio]}if(params.capability===`image`){let imageModelEntries=resolveImageModelFromAgentDefaults(params.cfg);if(imageModelEntries.length>0)return imageModelEntries}let gemini=await resolveGeminiCliEntry(params.capability);if(gemini)return[gemini];let keys=await resolveKeyEntry(params);return keys?[keys]:[]}async function resolveAutoImageModel(params){let providerRegistry=buildProviderRegistry(),toActive=entry=>{if(!entry||entry.type===`cli`)return null;let provider=entry.provider;if(!provider)return null;let model=entry.model??DEFAULT_IMAGE_MODELS[provider];return model?{provider,model}:null};return toActive(await resolveActiveModelEntry({cfg:params.cfg,agentDir:params.agentDir,providerRegistry,capability:`image`,activeModel:params.activeModel}))||toActive(await resolveKeyEntry({cfg:params.cfg,agentDir:params.agentDir,providerRegistry,capability:`image`,activeModel:params.activeModel}))}async function resolveActiveModelEntry(params){let activeProviderRaw=params.activeModel?.provider?.trim();if(!activeProviderRaw)return null;let providerId=normalizeMediaProviderId(activeProviderRaw);if(!providerId)return null;let provider=getMediaUnderstandingProvider(providerId,params.providerRegistry);if(!provider||params.capability===`audio`&&!provider.transcribeAudio||params.capability===`image`&&!provider.describeImage||params.capability===`video`&&!provider.describeVideo)return null;try{await resolveApiKeyForProvider({provider:providerId,cfg:params.cfg,agentDir:params.agentDir})}catch{return null}return{type:`provider`,provider:providerId,model:params.activeModel?.model}}async function runAttachmentEntries(params){let{entries,capability}=params,attempts=[];for(let entry of entries){let entryType=entry.type??(entry.command?`cli`:`provider`);try{let result=entryType===`cli`?await runCliEntry({capability,entry,cfg:params.cfg,ctx:params.ctx,attachmentIndex:params.attachmentIndex,cache:params.cache,config:params.config}):await runProviderEntry({capability,entry,cfg:params.cfg,ctx:params.ctx,attachmentIndex:params.attachmentIndex,cache:params.cache,agentDir:params.agentDir,providerRegistry:params.providerRegistry,config:params.config});if(result){let decision=buildModelDecision({entry,entryType,outcome:`success`});return result.provider&&(decision.provider=result.provider),result.model&&(decision.model=result.model),attempts.push(decision),{output:result,attempts}}attempts.push(buildModelDecision({entry,entryType,outcome:`skipped`,reason:`empty output`}))}catch(err){if(isMediaUnderstandingSkipError(err)){attempts.push(buildModelDecision({entry,entryType,outcome:`skipped`,reason:`${err.reason}: ${err.message}`})),shouldLogVerbose()&&logVerbose(`Skipping ${capability} model due to ${err.reason}: ${err.message}`);continue}attempts.push(buildModelDecision({entry,entryType,outcome:`failed`,reason:String(err)})),shouldLogVerbose()&&logVerbose(`${capability} understanding failed: ${String(err)}`)}}return{output:null,attempts}}async function runCapability(params){let{capability,cfg,ctx}=params,config=params.config??cfg.tools?.media?.[capability];if(config?.enabled===!1)return{outputs:[],decision:{capability,outcome:`disabled`,attachments:[]}};let attachmentPolicy=config?.attachments,selected=selectAttachments({capability,attachments:params.media,policy:attachmentPolicy});if(selected.length===0)return{outputs:[],decision:{capability,outcome:`no-attachment`,attachments:[]}};if(resolveScopeDecision({scope:config?.scope,ctx})===`deny`)return shouldLogVerbose()&&logVerbose(`${capability} understanding disabled by scope policy.`),{outputs:[],decision:{capability,outcome:`scope-deny`,attachments:selected.map(item=>({attachmentIndex:item.index,attempts:[]}))}};let activeProvider=params.activeModel?.provider?.trim();if(capability===`image`&&activeProvider&&modelSupportsVision(findModelInCatalog(await loadModelCatalog({config:cfg}),activeProvider,params.activeModel?.model??``))){shouldLogVerbose()&&logVerbose(`Skipping image understanding: primary model supports vision natively`);let model=params.activeModel?.model?.trim();return{outputs:[],decision:{capability,outcome:`skipped`,attachments:selected.map(item=>{let attempt={type:`provider`,provider:activeProvider,model:model||void 0,outcome:`skipped`,reason:`primary model supports vision natively`};return{attachmentIndex:item.index,attempts:[attempt],chosen:attempt}})}}}let resolvedEntries=resolveModelEntries({cfg,capability,config,providerRegistry:params.providerRegistry});if(resolvedEntries.length===0&&(resolvedEntries=await resolveAutoEntries({cfg,agentDir:params.agentDir,providerRegistry:params.providerRegistry,capability,activeModel:params.activeModel})),resolvedEntries.length===0)return{outputs:[],decision:{capability,outcome:`skipped`,attachments:selected.map(item=>({attachmentIndex:item.index,attempts:[]}))}};let outputs=[],attachmentDecisions=[];for(let attachment of selected){let{output,attempts}=await runAttachmentEntries({capability,cfg,ctx,attachmentIndex:attachment.index,agentDir:params.agentDir,providerRegistry:params.providerRegistry,cache:params.attachments,entries:resolvedEntries,config});output&&outputs.push(output),attachmentDecisions.push({attachmentIndex:attachment.index,attempts,chosen:attempts.find(attempt=>attempt.outcome===`success`)})}let decision={capability,outcome:outputs.length>0?`success`:`skipped`,attachments:attachmentDecisions};return shouldLogVerbose()&&logVerbose(`Media understanding ${formatDecisionSummary(decision)}`),{outputs,decision}}export{stripMinimaxToolCallXml as A,extractThinkingFromTaggedStream as C,isAssistantMessage as D,inferToolMetaFromArgs as E,applyTemplate as F,extractTextFromChatContent as M,minimaxUnderstandImage as N,promoteThinkingTagsToBlocks as O,CLI_OUTPUT_MAX_BUFFER as P,extractAssistantThinking as S,formatReasoningMessage as T,coerceImageAssistantText as _,runCapability as a,resolveProviderVisionModelFromConfig as b,installUnhandledRejectionHandler as c,reportAndExit as d,resolveConcurrency as f,describeImageWithModel as g,resolveMediaUnderstandingScope as h,resolveAutoImageModel as i,stripThinkingTagsFromText as j,stripDowngradedToolCallText as k,registerUnhandledRejectionHandler as l,normalizeMediaUnderstandingChatType as m,createMediaAttachmentCache as n,isAudioAttachment as o,resolveTimeoutMs as p,normalizeMediaAttachments as r,resolveAttachmentKind as s,buildProviderRegistry as t,installUncaughtExceptionHandler as u,coerceImageModelConfig as v,extractThinkingFromTaggedText as w,extractAssistantText as x,decodeDataUrl as y};