@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,2 +1,2 @@
1
- import{t as CONFIG_PATH}from"./paths-BHg-VHB4.js";import{L as colorize,R as isRich$1,S as shortenHomePath,z as theme}from"./utils-BP60e80M.js";import{Bt as getShellEnvAppliedKeys,Et as nativeComplete,F as modelKey,Ft as resolveAwsSdkEnvVarName,Gt as shouldEnableShellEnvFallback,H as resolveDefaultModelForAgent,It as resolveEnvApiKey,Kt as getEnvApiKey,L as normalizeProviderId,M as findNormalizedProviderValue,Mt as getCustomProviderApiKey,Pt as resolveApiKeyForProvider,R as parseModelRef,T as resolveBuilderForceAgentsAgentDir,V as resolveConfiguredModelRef,W as resolveModelRefFromString,_ as setAuthProfileOrder,an as resolveAuthProfileDisplayLabel,b as ensureAuthProfileStore,h as listProfilesForProvider,in as DEFAULT_PROVIDER,j as buildModelAliasIndex,o as resolveProfileUnusableUntilForDisplay,qt as getModel,rn as DEFAULT_MODEL,t as resolveAuthProfileOrder,v as upsertAuthProfile,w as resolveAuthStorePathForDisplay}from"./auth-profiles-BARnVAUE.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{a as resolveAgentModelFallbacksOverride,c as resolveAgentWorkspaceDir,i as resolveAgentDir,k as resolveDefaultAgentWorkspaceDir,l as resolveDefaultAgentId,o as resolveAgentModelPrimary}from"./agent-scope-BcoQBOwz.js";import{t as ensureAuthJsonFromAuthProfiles}from"./auth-json-DLweJwGc.js";import{r as loadConfig,y as parseDurationMs}from"./io-BySzqKzT.js";import{a as ensureBuilderForceAgentsModelsJson,i as discoverModels,r as discoverAuthStorage}from"./model-discovery-DxpimsRF.js";import{r as loadModelCatalog}from"./model-catalog-wcISK04b.js";import{An as buildAuthHealthSummary,Hr as resolveModel,Kr as describeFailoverError,On as maskApiKey,Ur as ANTIGRAVITY_OPUS_46_FORWARD_COMPAT_CANDIDATES,Wr as resolveForwardCompatModel,h as runEmbeddedAgent,jn as formatRemainingShort,kn as DEFAULT_OAUTH_WARN_MS}from"./subagent-registry-oB_F2U2W.js";import{i as resolveSessionTranscriptPath,s as resolveSessionTranscriptsDirForAgent}from"./paths-BQ9W7Bs0.js";import{i as resolveUsageProviderId,r as formatUsageWindowSummary,t as loadProviderUsageSummary}from"./provider-usage-BLkm6ojE.js";import{r as withProgressTotals}from"./progress-BQMO_-7I.js";import{d as openUrl}from"./onboard-helpers-Di5OXlap.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-CZOeG0sw.js";import{t as createClackPrompter}from"./clack-prompter-ZmHdfPGJ.js";import{t as renderTable}from"./table-CiK88EDX.js";import{t as inferParamBFromIdOrName}from"./model-param-b-CJADrq0m.js";import{n as redactSecrets}from"./format-DcTzfvef.js";import{a as isLocalBaseUrl,c as normalizeAlias,d as resolveModelTarget,f as updateConfig,i as formatTokenK,l as resolveKnownAgentId,n as ensureFlagCompatibility,o as loadValidConfigOrThrow,r as formatMs,s as mergePrimaryFallbackConfig,t as applyDefaultModelPrimaryUpdate,u as resolveModelKeysFromEntries}from"./shared-DjBPjC55.js";import{d as applyAuthProfileConfig,n as validateAnthropicSetupToken}from"./auth-token-DGaO7TMn.js";import{n as logConfigUpdated}from"./logging-CRzk-5ye.js";import{a as createVpsAwareOAuthHandlers,i as resolveProviderMatch,n as mergeConfigPatch,o as isRemoteEnvironment,r as pickAuthMethod,s as resolvePluginProviders,t as applyDefaultModel}from"./provider-auth-helpers-ByvJdQT3.js";import path from"node:path";import crypto from"node:crypto";import fs from"node:fs/promises";import{Type}from"@sinclair/typebox";import{cancel,confirm,isCancel,multiselect,select,text}from"@clack/prompts";async function modelsAliasesListCommand(opts,runtime){ensureFlagCompatibility(opts);let models=loadConfig().agents?.defaults?.models??{},aliases=Object.entries(models).reduce((acc,[modelKey,entry])=>{let alias=entry?.alias?.trim();return alias&&(acc[alias]=modelKey),acc},{});if(opts.json){runtime.log(JSON.stringify({aliases},null,2));return}if(opts.plain){for(let[alias,target]of Object.entries(aliases))runtime.log(`${alias} ${target}`);return}if(runtime.log(`Aliases (${Object.keys(aliases).length}):`),Object.keys(aliases).length===0){runtime.log(`- none`);return}for(let[alias,target]of Object.entries(aliases))runtime.log(`- ${alias} -> ${target}`)}async function modelsAliasesAddCommand(aliasRaw,modelRaw,runtime){let alias=normalizeAlias(aliasRaw),resolved=resolveModelTarget({raw:modelRaw,cfg:loadConfig()});await updateConfig(cfg=>{let modelKey=`${resolved.provider}/${resolved.model}`,nextModels={...cfg.agents?.defaults?.models};for(let[key,entry]of Object.entries(nextModels)){let existing=entry?.alias?.trim();if(existing&&existing===alias&&key!==modelKey)throw Error(`Alias ${alias} already points to ${key}.`)}return nextModels[modelKey]={...nextModels[modelKey]??{},alias},{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,models:nextModels}}}}),logConfigUpdated(runtime),runtime.log(`Alias ${alias} -> ${resolved.provider}/${resolved.model}`)}async function modelsAliasesRemoveCommand(aliasRaw,runtime){let alias=normalizeAlias(aliasRaw),updated=await updateConfig(cfg=>{let nextModels={...cfg.agents?.defaults?.models},found=!1;for(let[key,entry]of Object.entries(nextModels))if(entry?.alias?.trim()===alias){nextModels[key]={...entry,alias:void 0},found=!0;break}if(!found)throw Error(`Alias not found: ${alias}`);return{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,models:nextModels}}}});logConfigUpdated(runtime),(!updated.agents?.defaults?.models||Object.values(updated.agents.defaults.models).every(entry=>!entry?.alias?.trim()))&&runtime.log(`No aliases configured.`)}const confirm$1=params=>confirm({...params,message:stylePromptMessage(params.message)}),text$1=params=>text({...params,message:stylePromptMessage(params.message)}),select$1=params=>select({...params,message:stylePromptMessage(params.message),options:params.options.map(opt=>opt.hint===void 0?opt:{...opt,hint:stylePromptHint(opt.hint)})});function resolveTokenProvider(raw){let trimmed=raw?.trim();return trimmed?normalizeProviderId(trimmed)===`anthropic`?`anthropic`:`custom`:null}function resolveDefaultTokenProfileId(provider){return`${normalizeProviderId(provider)}:manual`}async function modelsAuthSetupTokenCommand(opts,runtime){let provider=resolveTokenProvider(opts.provider??`anthropic`);if(provider!==`anthropic`)throw Error(`Only --provider anthropic is supported for setup-token.`);if(!process.stdin.isTTY)throw Error(`setup-token requires an interactive TTY.`);if(!opts.yes&&!await confirm$1({message:"Have you run `claude setup-token` and copied the token?",initialValue:!0}))return;let tokenInput=await text$1({message:`Paste Anthropic setup-token`,validate:value=>validateAnthropicSetupToken(String(value??``))}),token=String(tokenInput??``).trim(),profileId=resolveDefaultTokenProfileId(provider);upsertAuthProfile({profileId,credential:{type:`token`,provider,token}}),await updateConfig(cfg=>applyAuthProfileConfig(cfg,{profileId,provider,mode:`token`})),logConfigUpdated(runtime),runtime.log(`Auth profile: ${profileId} (${provider}/token)`)}async function modelsAuthPasteTokenCommand(opts,runtime){let rawProvider=opts.provider?.trim();if(!rawProvider)throw Error(`Missing --provider.`);let provider=normalizeProviderId(rawProvider),profileId=opts.profileId?.trim()||resolveDefaultTokenProfileId(provider),tokenInput=await text$1({message:`Paste token for ${provider}`,validate:value=>value?.trim()?void 0:`Required`}),token=String(tokenInput??``).trim(),expires=opts.expiresIn?.trim()&&opts.expiresIn.trim().length>0?Date.now()+parseDurationMs(String(opts.expiresIn??``).trim(),{defaultUnit:`d`}):void 0;upsertAuthProfile({profileId,credential:{type:`token`,provider,token,...expires?{expires}:{}}}),await updateConfig(cfg=>applyAuthProfileConfig(cfg,{profileId,provider,mode:`token`})),logConfigUpdated(runtime),runtime.log(`Auth profile: ${profileId} (${provider}/token)`)}async function modelsAuthAddCommand(_opts,runtime){let provider=await select$1({message:`Token provider`,options:[{value:`anthropic`,label:`anthropic`},{value:`custom`,label:`custom (type provider id)`}]}),providerId=provider===`custom`?normalizeProviderId(String(await text$1({message:`Provider id`,validate:value=>value?.trim()?void 0:`Required`}))):provider;if(await select$1({message:`Token method`,options:[...providerId===`anthropic`?[{value:`setup-token`,label:`setup-token (claude)`,hint:"Paste a setup-token from `claude setup-token`"}]:[],{value:`paste`,label:`paste token`}]})===`setup-token`){await modelsAuthSetupTokenCommand({provider:providerId},runtime);return}let profileIdDefault=resolveDefaultTokenProfileId(providerId);await modelsAuthPasteTokenCommand({provider:providerId,profileId:String(await text$1({message:`Profile id`,initialValue:profileIdDefault,validate:value=>value?.trim()?void 0:`Required`})).trim(),expiresIn:await confirm$1({message:`Does this token expire?`,initialValue:!1})?String(await text$1({message:`Expires in (duration)`,initialValue:`365d`,validate:value=>{try{parseDurationMs(String(value??``),{defaultUnit:`d`});return}catch{return`Invalid duration (e.g. 365d, 12h, 30m)`}}})).trim():void 0},runtime)}function resolveRequestedLoginProviderOrThrow(providers,rawProvider){let requested=rawProvider?.trim();if(!requested)return null;let matched=resolveProviderMatch(providers,requested);if(matched)return matched;let available=providers.map(provider=>provider.id).filter(Boolean).toSorted((a,b)=>a.localeCompare(b)),availableText=available.length>0?available.join(`, `):`(none)`;throw Error(`Unknown provider "${requested}". Loaded providers: ${availableText}. Verify plugins via \`${formatCliCommand(`builderforce plugins list --json`)}\`.`)}function credentialMode(credential){return credential.type===`api_key`?`api_key`:credential.type===`token`?`token`:`oauth`}async function modelsAuthLoginCommand(opts,runtime){if(!process.stdin.isTTY)throw Error(`models auth login requires an interactive TTY.`);let config=await loadValidConfigOrThrow(),defaultAgentId=resolveDefaultAgentId(config),agentDir=resolveAgentDir(config,defaultAgentId),workspaceDir=resolveAgentWorkspaceDir(config,defaultAgentId)??resolveDefaultAgentWorkspaceDir(),providers=resolvePluginProviders({config,workspaceDir});if(providers.length===0)throw Error(`No provider plugins found. Install one via \`${formatCliCommand(`builderforce plugins install`)}\`.`);let prompter=createClackPrompter(),selectedProvider=resolveRequestedLoginProviderOrThrow(providers,opts.provider)??await prompter.select({message:`Select a provider`,options:providers.map(provider=>({value:provider.id,label:provider.label,hint:provider.docsPath?`Docs: ${provider.docsPath}`:void 0}))}).then(id=>resolveProviderMatch(providers,String(id)));if(!selectedProvider)throw Error(`Unknown provider. Use --provider <id> to pick a provider plugin.`);let chosenMethod=pickAuthMethod(selectedProvider,opts.method)??(selectedProvider.auth.length===1?selectedProvider.auth[0]:await prompter.select({message:`Auth method for ${selectedProvider.label}`,options:selectedProvider.auth.map(method=>({value:method.id,label:method.label,hint:method.hint}))}).then(id=>selectedProvider.auth.find(method=>method.id===String(id))));if(!chosenMethod)throw Error(`Unknown auth method. Use --method <id> to select one.`);let isRemote=isRemoteEnvironment(),result=await chosenMethod.run({config,agentDir,workspaceDir,prompter,runtime,isRemote,openUrl:async url=>{await openUrl(url)},oauth:{createVpsAwareHandlers:params=>createVpsAwareOAuthHandlers(params)}});for(let profile of result.profiles)upsertAuthProfile({profileId:profile.profileId,credential:profile.credential,agentDir});await updateConfig(cfg=>{let next=cfg;result.configPatch&&(next=mergeConfigPatch(next,result.configPatch));for(let profile of result.profiles)next=applyAuthProfileConfig(next,{profileId:profile.profileId,provider:profile.credential.provider,mode:credentialMode(profile.credential)});return opts.setDefault&&result.defaultModel&&(next=applyDefaultModel(next,result.defaultModel)),next}),logConfigUpdated(runtime);for(let profile of result.profiles)runtime.log(`Auth profile: ${profile.profileId} (${profile.credential.provider}/${credentialMode(profile.credential)})`);result.defaultModel&&runtime.log(opts.setDefault?`Default model set to ${result.defaultModel}`:`Default model available: ${result.defaultModel} (use --set-default to apply)`),result.notes&&result.notes.length>0&&await prompter.note(result.notes.join(`
1
+ import{t as CONFIG_PATH}from"./paths-BHg-VHB4.js";import{L as colorize,R as isRich$1,S as shortenHomePath,z as theme}from"./utils-BP60e80M.js";import{Bt as getShellEnvAppliedKeys,Et as nativeComplete,F as modelKey,Ft as resolveAwsSdkEnvVarName,Gt as shouldEnableShellEnvFallback,H as resolveDefaultModelForAgent,It as resolveEnvApiKey,Kt as getEnvApiKey,L as normalizeProviderId,M as findNormalizedProviderValue,Mt as getCustomProviderApiKey,Pt as resolveApiKeyForProvider,R as parseModelRef,T as resolveBuilderForceAgentsAgentDir,V as resolveConfiguredModelRef,W as resolveModelRefFromString,_ as setAuthProfileOrder,an as resolveAuthProfileDisplayLabel,b as ensureAuthProfileStore,h as listProfilesForProvider,in as DEFAULT_PROVIDER,j as buildModelAliasIndex,o as resolveProfileUnusableUntilForDisplay,qt as getModel,rn as DEFAULT_MODEL,t as resolveAuthProfileOrder,v as upsertAuthProfile,w as resolveAuthStorePathForDisplay}from"./auth-profiles-BARnVAUE.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{a as resolveAgentModelFallbacksOverride,c as resolveAgentWorkspaceDir,i as resolveAgentDir,k as resolveDefaultAgentWorkspaceDir,l as resolveDefaultAgentId,o as resolveAgentModelPrimary}from"./agent-scope-BcoQBOwz.js";import{t as ensureAuthJsonFromAuthProfiles}from"./auth-json-DLweJwGc.js";import{r as loadConfig,y as parseDurationMs}from"./io-BySzqKzT.js";import{a as ensureBuilderForceAgentsModelsJson,i as discoverModels,r as discoverAuthStorage}from"./model-discovery-DxpimsRF.js";import{r as loadModelCatalog}from"./model-catalog-wcISK04b.js";import{An as buildAuthHealthSummary,Hr as resolveModel,Kr as describeFailoverError,On as maskApiKey,Ur as ANTIGRAVITY_OPUS_46_FORWARD_COMPAT_CANDIDATES,Wr as resolveForwardCompatModel,h as runEmbeddedAgent,jn as formatRemainingShort,kn as DEFAULT_OAUTH_WARN_MS}from"./subagent-registry-BUKplZi1.js";import{i as resolveSessionTranscriptPath,s as resolveSessionTranscriptsDirForAgent}from"./paths-BQ9W7Bs0.js";import{i as resolveUsageProviderId,r as formatUsageWindowSummary,t as loadProviderUsageSummary}from"./provider-usage-BLkm6ojE.js";import{r as withProgressTotals}from"./progress-BQMO_-7I.js";import{d as openUrl}from"./onboard-helpers-Di5OXlap.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-CZOeG0sw.js";import{t as createClackPrompter}from"./clack-prompter-ZmHdfPGJ.js";import{t as renderTable}from"./table-CiK88EDX.js";import{t as inferParamBFromIdOrName}from"./model-param-b-CJADrq0m.js";import{n as redactSecrets}from"./format-DcTzfvef.js";import{a as isLocalBaseUrl,c as normalizeAlias,d as resolveModelTarget,f as updateConfig,i as formatTokenK,l as resolveKnownAgentId,n as ensureFlagCompatibility,o as loadValidConfigOrThrow,r as formatMs,s as mergePrimaryFallbackConfig,t as applyDefaultModelPrimaryUpdate,u as resolveModelKeysFromEntries}from"./shared-DjBPjC55.js";import{d as applyAuthProfileConfig,n as validateAnthropicSetupToken}from"./auth-token-DGaO7TMn.js";import{n as logConfigUpdated}from"./logging-CRzk-5ye.js";import{a as createVpsAwareOAuthHandlers,i as resolveProviderMatch,n as mergeConfigPatch,o as isRemoteEnvironment,r as pickAuthMethod,s as resolvePluginProviders,t as applyDefaultModel}from"./provider-auth-helpers-u1GAP4Bi.js";import path from"node:path";import crypto from"node:crypto";import fs from"node:fs/promises";import{Type}from"@sinclair/typebox";import{cancel,confirm,isCancel,multiselect,select,text}from"@clack/prompts";async function modelsAliasesListCommand(opts,runtime){ensureFlagCompatibility(opts);let models=loadConfig().agents?.defaults?.models??{},aliases=Object.entries(models).reduce((acc,[modelKey,entry])=>{let alias=entry?.alias?.trim();return alias&&(acc[alias]=modelKey),acc},{});if(opts.json){runtime.log(JSON.stringify({aliases},null,2));return}if(opts.plain){for(let[alias,target]of Object.entries(aliases))runtime.log(`${alias} ${target}`);return}if(runtime.log(`Aliases (${Object.keys(aliases).length}):`),Object.keys(aliases).length===0){runtime.log(`- none`);return}for(let[alias,target]of Object.entries(aliases))runtime.log(`- ${alias} -> ${target}`)}async function modelsAliasesAddCommand(aliasRaw,modelRaw,runtime){let alias=normalizeAlias(aliasRaw),resolved=resolveModelTarget({raw:modelRaw,cfg:loadConfig()});await updateConfig(cfg=>{let modelKey=`${resolved.provider}/${resolved.model}`,nextModels={...cfg.agents?.defaults?.models};for(let[key,entry]of Object.entries(nextModels)){let existing=entry?.alias?.trim();if(existing&&existing===alias&&key!==modelKey)throw Error(`Alias ${alias} already points to ${key}.`)}return nextModels[modelKey]={...nextModels[modelKey]??{},alias},{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,models:nextModels}}}}),logConfigUpdated(runtime),runtime.log(`Alias ${alias} -> ${resolved.provider}/${resolved.model}`)}async function modelsAliasesRemoveCommand(aliasRaw,runtime){let alias=normalizeAlias(aliasRaw),updated=await updateConfig(cfg=>{let nextModels={...cfg.agents?.defaults?.models},found=!1;for(let[key,entry]of Object.entries(nextModels))if(entry?.alias?.trim()===alias){nextModels[key]={...entry,alias:void 0},found=!0;break}if(!found)throw Error(`Alias not found: ${alias}`);return{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,models:nextModels}}}});logConfigUpdated(runtime),(!updated.agents?.defaults?.models||Object.values(updated.agents.defaults.models).every(entry=>!entry?.alias?.trim()))&&runtime.log(`No aliases configured.`)}const confirm$1=params=>confirm({...params,message:stylePromptMessage(params.message)}),text$1=params=>text({...params,message:stylePromptMessage(params.message)}),select$1=params=>select({...params,message:stylePromptMessage(params.message),options:params.options.map(opt=>opt.hint===void 0?opt:{...opt,hint:stylePromptHint(opt.hint)})});function resolveTokenProvider(raw){let trimmed=raw?.trim();return trimmed?normalizeProviderId(trimmed)===`anthropic`?`anthropic`:`custom`:null}function resolveDefaultTokenProfileId(provider){return`${normalizeProviderId(provider)}:manual`}async function modelsAuthSetupTokenCommand(opts,runtime){let provider=resolveTokenProvider(opts.provider??`anthropic`);if(provider!==`anthropic`)throw Error(`Only --provider anthropic is supported for setup-token.`);if(!process.stdin.isTTY)throw Error(`setup-token requires an interactive TTY.`);if(!opts.yes&&!await confirm$1({message:"Have you run `claude setup-token` and copied the token?",initialValue:!0}))return;let tokenInput=await text$1({message:`Paste Anthropic setup-token`,validate:value=>validateAnthropicSetupToken(String(value??``))}),token=String(tokenInput??``).trim(),profileId=resolveDefaultTokenProfileId(provider);upsertAuthProfile({profileId,credential:{type:`token`,provider,token}}),await updateConfig(cfg=>applyAuthProfileConfig(cfg,{profileId,provider,mode:`token`})),logConfigUpdated(runtime),runtime.log(`Auth profile: ${profileId} (${provider}/token)`)}async function modelsAuthPasteTokenCommand(opts,runtime){let rawProvider=opts.provider?.trim();if(!rawProvider)throw Error(`Missing --provider.`);let provider=normalizeProviderId(rawProvider),profileId=opts.profileId?.trim()||resolveDefaultTokenProfileId(provider),tokenInput=await text$1({message:`Paste token for ${provider}`,validate:value=>value?.trim()?void 0:`Required`}),token=String(tokenInput??``).trim(),expires=opts.expiresIn?.trim()&&opts.expiresIn.trim().length>0?Date.now()+parseDurationMs(String(opts.expiresIn??``).trim(),{defaultUnit:`d`}):void 0;upsertAuthProfile({profileId,credential:{type:`token`,provider,token,...expires?{expires}:{}}}),await updateConfig(cfg=>applyAuthProfileConfig(cfg,{profileId,provider,mode:`token`})),logConfigUpdated(runtime),runtime.log(`Auth profile: ${profileId} (${provider}/token)`)}async function modelsAuthAddCommand(_opts,runtime){let provider=await select$1({message:`Token provider`,options:[{value:`anthropic`,label:`anthropic`},{value:`custom`,label:`custom (type provider id)`}]}),providerId=provider===`custom`?normalizeProviderId(String(await text$1({message:`Provider id`,validate:value=>value?.trim()?void 0:`Required`}))):provider;if(await select$1({message:`Token method`,options:[...providerId===`anthropic`?[{value:`setup-token`,label:`setup-token (claude)`,hint:"Paste a setup-token from `claude setup-token`"}]:[],{value:`paste`,label:`paste token`}]})===`setup-token`){await modelsAuthSetupTokenCommand({provider:providerId},runtime);return}let profileIdDefault=resolveDefaultTokenProfileId(providerId);await modelsAuthPasteTokenCommand({provider:providerId,profileId:String(await text$1({message:`Profile id`,initialValue:profileIdDefault,validate:value=>value?.trim()?void 0:`Required`})).trim(),expiresIn:await confirm$1({message:`Does this token expire?`,initialValue:!1})?String(await text$1({message:`Expires in (duration)`,initialValue:`365d`,validate:value=>{try{parseDurationMs(String(value??``),{defaultUnit:`d`});return}catch{return`Invalid duration (e.g. 365d, 12h, 30m)`}}})).trim():void 0},runtime)}function resolveRequestedLoginProviderOrThrow(providers,rawProvider){let requested=rawProvider?.trim();if(!requested)return null;let matched=resolveProviderMatch(providers,requested);if(matched)return matched;let available=providers.map(provider=>provider.id).filter(Boolean).toSorted((a,b)=>a.localeCompare(b)),availableText=available.length>0?available.join(`, `):`(none)`;throw Error(`Unknown provider "${requested}". Loaded providers: ${availableText}. Verify plugins via \`${formatCliCommand(`builderforce plugins list --json`)}\`.`)}function credentialMode(credential){return credential.type===`api_key`?`api_key`:credential.type===`token`?`token`:`oauth`}async function modelsAuthLoginCommand(opts,runtime){if(!process.stdin.isTTY)throw Error(`models auth login requires an interactive TTY.`);let config=await loadValidConfigOrThrow(),defaultAgentId=resolveDefaultAgentId(config),agentDir=resolveAgentDir(config,defaultAgentId),workspaceDir=resolveAgentWorkspaceDir(config,defaultAgentId)??resolveDefaultAgentWorkspaceDir(),providers=resolvePluginProviders({config,workspaceDir});if(providers.length===0)throw Error(`No provider plugins found. Install one via \`${formatCliCommand(`builderforce plugins install`)}\`.`);let prompter=createClackPrompter(),selectedProvider=resolveRequestedLoginProviderOrThrow(providers,opts.provider)??await prompter.select({message:`Select a provider`,options:providers.map(provider=>({value:provider.id,label:provider.label,hint:provider.docsPath?`Docs: ${provider.docsPath}`:void 0}))}).then(id=>resolveProviderMatch(providers,String(id)));if(!selectedProvider)throw Error(`Unknown provider. Use --provider <id> to pick a provider plugin.`);let chosenMethod=pickAuthMethod(selectedProvider,opts.method)??(selectedProvider.auth.length===1?selectedProvider.auth[0]:await prompter.select({message:`Auth method for ${selectedProvider.label}`,options:selectedProvider.auth.map(method=>({value:method.id,label:method.label,hint:method.hint}))}).then(id=>selectedProvider.auth.find(method=>method.id===String(id))));if(!chosenMethod)throw Error(`Unknown auth method. Use --method <id> to select one.`);let isRemote=isRemoteEnvironment(),result=await chosenMethod.run({config,agentDir,workspaceDir,prompter,runtime,isRemote,openUrl:async url=>{await openUrl(url)},oauth:{createVpsAwareHandlers:params=>createVpsAwareOAuthHandlers(params)}});for(let profile of result.profiles)upsertAuthProfile({profileId:profile.profileId,credential:profile.credential,agentDir});await updateConfig(cfg=>{let next=cfg;result.configPatch&&(next=mergeConfigPatch(next,result.configPatch));for(let profile of result.profiles)next=applyAuthProfileConfig(next,{profileId:profile.profileId,provider:profile.credential.provider,mode:credentialMode(profile.credential)});return opts.setDefault&&result.defaultModel&&(next=applyDefaultModel(next,result.defaultModel)),next}),logConfigUpdated(runtime);for(let profile of result.profiles)runtime.log(`Auth profile: ${profile.profileId} (${profile.credential.provider}/${credentialMode(profile.credential)})`);result.defaultModel&&runtime.log(opts.setDefault?`Default model set to ${result.defaultModel}`:`Default model available: ${result.defaultModel} (use --set-default to apply)`),result.notes&&result.notes.length>0&&await prompter.note(result.notes.join(`
2
2
  `),`Provider notes`)}function resolveTargetAgent(cfg,raw){let agentId=resolveKnownAgentId({cfg,rawAgentId:raw})??resolveDefaultAgentId(cfg);return{agentId,agentDir:resolveAgentDir(cfg,agentId)}}function describeOrder(store,provider){let providerKey=normalizeProviderId(provider),order=store.order?.[providerKey];return Array.isArray(order)?order:[]}function resolveAuthOrderContext(opts){let rawProvider=opts.provider?.trim();if(!rawProvider)throw Error(`Missing --provider.`);let provider=normalizeProviderId(rawProvider),cfg=loadConfig(),{agentId,agentDir}=resolveTargetAgent(cfg,opts.agent);return{cfg,agentId,agentDir,provider}}async function modelsAuthOrderGetCommand(opts,runtime){let{agentId,agentDir,provider}=resolveAuthOrderContext(opts),order=describeOrder(await ensureAuthProfileStore(agentDir,{allowKeychainPrompt:!1}),provider);if(opts.json){runtime.log(JSON.stringify({agentId,agentDir,provider,authStorePath:shortenHomePath(`${agentDir}/auth-profiles.json`),order:order.length>0?order:null},null,2));return}runtime.log(`Agent: ${agentId}`),runtime.log(`Provider: ${provider}`),runtime.log(`Auth file: ${shortenHomePath(`${agentDir}/auth-profiles.json`)}`),runtime.log(order.length>0?`Order override: ${order.join(`, `)}`:`Order override: (none)`)}async function modelsAuthOrderClearCommand(opts,runtime){let{agentId,agentDir,provider}=resolveAuthOrderContext(opts);if(!await setAuthProfileOrder({agentDir,provider,order:null}))throw Error(`Failed to update auth-profiles.json (lock busy?).`);runtime.log(`Agent: ${agentId}`),runtime.log(`Provider: ${provider}`),runtime.log(`Cleared per-agent order override.`)}async function modelsAuthOrderSetCommand(opts,runtime){let{agentId,agentDir,provider}=resolveAuthOrderContext(opts),store=await ensureAuthProfileStore(agentDir,{allowKeychainPrompt:!1}),providerKey=provider,requested=(opts.order??[]).map(entry=>String(entry).trim()).filter(Boolean);if(requested.length===0)throw Error(`Missing profile ids. Provide one or more profile ids.`);for(let profileId of requested){let cred=store.profiles[profileId];if(!cred)throw Error(`Auth profile "${profileId}" not found in ${agentDir}.`);if(normalizeProviderId(cred.provider)!==providerKey)throw Error(`Auth profile "${profileId}" is for ${cred.provider}, not ${provider}.`)}let updated=await setAuthProfileOrder({agentDir,provider,order:requested});if(!updated)throw Error(`Failed to update auth-profiles.json (lock busy?).`);runtime.log(`Agent: ${agentId}`),runtime.log(`Provider: ${provider}`),runtime.log(`Order override: ${describeOrder(updated,provider).join(`, `)}`)}function getFallbacks(cfg,key){return cfg.agents?.defaults?.[key]?.fallbacks??[]}function patchDefaultsFallbacks(cfg,params){let existing=cfg.agents?.defaults?.[params.key];return{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,[params.key]:mergePrimaryFallbackConfig(existing,{fallbacks:params.fallbacks}),...params.models?{models:params.models}:void 0}}}}async function listFallbacksCommand(params,opts,runtime){ensureFlagCompatibility(opts);let fallbacks=getFallbacks(loadConfig(),params.key);if(opts.json){runtime.log(JSON.stringify({fallbacks},null,2));return}if(opts.plain){for(let entry of fallbacks)runtime.log(entry);return}if(runtime.log(`${params.label} (${fallbacks.length}):`),fallbacks.length===0){runtime.log(`- none`);return}for(let entry of fallbacks)runtime.log(`- ${entry}`)}async function addFallbackCommand(params,modelRaw,runtime){let updated=await updateConfig(cfg=>{let resolved=resolveModelTarget({raw:modelRaw,cfg}),targetKey=modelKey(resolved.provider,resolved.model),nextModels={...cfg.agents?.defaults?.models};nextModels[targetKey]||(nextModels[targetKey]={});let existing=getFallbacks(cfg,params.key);return resolveModelKeysFromEntries({cfg,entries:existing}).includes(targetKey)?cfg:patchDefaultsFallbacks(cfg,{key:params.key,fallbacks:[...existing,targetKey],models:nextModels})});logConfigUpdated(runtime),runtime.log(`${params.logPrefix}: ${getFallbacks(updated,params.key).join(`, `)}`)}async function removeFallbackCommand(params,modelRaw,runtime){let updated=await updateConfig(cfg=>{let resolved=resolveModelTarget({raw:modelRaw,cfg}),targetKey=modelKey(resolved.provider,resolved.model),aliasIndex=buildModelAliasIndex({cfg,defaultProvider:DEFAULT_PROVIDER}),existing=getFallbacks(cfg,params.key),filtered=existing.filter(entry=>{let resolvedEntry=resolveModelRefFromString({raw:String(entry??``),defaultProvider:DEFAULT_PROVIDER,aliasIndex});return resolvedEntry?modelKey(resolvedEntry.ref.provider,resolvedEntry.ref.model)!==targetKey:!0});if(filtered.length===existing.length)throw Error(`${params.notFoundLabel} not found: ${targetKey}`);return patchDefaultsFallbacks(cfg,{key:params.key,fallbacks:filtered})});logConfigUpdated(runtime),runtime.log(`${params.logPrefix}: ${getFallbacks(updated,params.key).join(`, `)}`)}async function clearFallbacksCommand(params,runtime){await updateConfig(cfg=>patchDefaultsFallbacks(cfg,{key:params.key,fallbacks:[]})),logConfigUpdated(runtime),runtime.log(params.clearedMessage)}async function modelsFallbacksListCommand(opts,runtime){return await listFallbacksCommand({label:`Fallbacks`,key:`model`},opts,runtime)}async function modelsFallbacksAddCommand(modelRaw,runtime){return await addFallbackCommand({label:`Fallbacks`,key:`model`,logPrefix:`Fallbacks`},modelRaw,runtime)}async function modelsFallbacksRemoveCommand(modelRaw,runtime){return await removeFallbackCommand({label:`Fallbacks`,key:`model`,notFoundLabel:`Fallback`,logPrefix:`Fallbacks`},modelRaw,runtime)}async function modelsFallbacksClearCommand(runtime){return await clearFallbacksCommand({key:`model`,clearedMessage:`Fallback list cleared.`},runtime)}async function modelsImageFallbacksListCommand(opts,runtime){return await listFallbacksCommand({label:`Image fallbacks`,key:`imageModel`},opts,runtime)}async function modelsImageFallbacksAddCommand(modelRaw,runtime){return await addFallbackCommand({label:`Image fallbacks`,key:`imageModel`,logPrefix:`Image fallbacks`},modelRaw,runtime)}async function modelsImageFallbacksRemoveCommand(modelRaw,runtime){return await removeFallbackCommand({label:`Image fallbacks`,key:`imageModel`,notFoundLabel:`Image fallback`,logPrefix:`Image fallbacks`},modelRaw,runtime)}async function modelsImageFallbacksClearCommand(runtime){return await clearFallbacksCommand({key:`imageModel`,clearedMessage:`Image fallback list cleared.`},runtime)}function resolveConfiguredEntries(cfg){let resolvedDefault=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),aliasIndex=buildModelAliasIndex({cfg,defaultProvider:DEFAULT_PROVIDER}),order=[],tagsByKey=new Map,aliasesByKey=new Map;for(let[key,aliases]of aliasIndex.byKey.entries())aliasesByKey.set(key,aliases);let addEntry=(ref,tag)=>{let key=modelKey(ref.provider,ref.model);tagsByKey.has(key)||(tagsByKey.set(key,new Set),order.push(key)),tagsByKey.get(key)?.add(tag)};addEntry(resolvedDefault,`default`);let modelConfig=cfg.agents?.defaults?.model,imageModelConfig=cfg.agents?.defaults?.imageModel,modelFallbacks=typeof modelConfig==`object`?modelConfig?.fallbacks??[]:[],imageFallbacks=typeof imageModelConfig==`object`?imageModelConfig?.fallbacks??[]:[],imagePrimary=imageModelConfig?.primary?.trim()??``;if(modelFallbacks.forEach((raw,idx)=>{let resolved=resolveModelRefFromString({raw:String(raw??``),defaultProvider:DEFAULT_PROVIDER,aliasIndex});resolved&&addEntry(resolved.ref,`fallback#${idx+1}`)}),imagePrimary){let resolved=resolveModelRefFromString({raw:imagePrimary,defaultProvider:DEFAULT_PROVIDER,aliasIndex});resolved&&addEntry(resolved.ref,`image`)}imageFallbacks.forEach((raw,idx)=>{let resolved=resolveModelRefFromString({raw:String(raw??``),defaultProvider:DEFAULT_PROVIDER,aliasIndex});resolved&&addEntry(resolved.ref,`img-fallback#${idx+1}`)});for(let key of Object.keys(cfg.agents?.defaults?.models??{})){let parsed=parseModelRef(String(key??``),DEFAULT_PROVIDER);parsed&&addEntry(parsed,`configured`)}return{entries:order.map(key=>{let slash=key.indexOf(`/`);return{key,ref:{provider:slash===-1?key:key.slice(0,slash),model:slash===-1?``:key.slice(slash+1)},tags:tagsByKey.get(key)??new Set,aliases:aliasesByKey.get(key)??[]}})}}const MODEL_AVAILABILITY_UNAVAILABLE_CODE=`MODEL_AVAILABILITY_UNAVAILABLE`;function formatErrorWithStack(err){return err instanceof Error?err.stack??`${err.name}: ${err.message}`:String(err)}function shouldFallbackToAuthHeuristics(err){return err instanceof Error?err.code===MODEL_AVAILABILITY_UNAVAILABLE_CODE:!1}const hasAuthForProvider=(provider,cfg,authStore)=>!cfg||!authStore?!1:!!(listProfilesForProvider(authStore,provider).length>0||provider===`amazon-bedrock`&&resolveAwsSdkEnvVarName()||resolveEnvApiKey(provider)||getCustomProviderApiKey(cfg,provider));function createAvailabilityUnavailableError(message){let err=Error(message);return err.code=MODEL_AVAILABILITY_UNAVAILABLE_CODE,err}function normalizeAvailabilityError(err){return shouldFallbackToAuthHeuristics(err)&&err instanceof Error?err:createAvailabilityUnavailableError(`Model availability unavailable: getAvailable() failed.\n${formatErrorWithStack(err)}`)}function validateAvailableModels(availableModels){if(!Array.isArray(availableModels))throw createAvailabilityUnavailableError(`Model availability unavailable: getAvailable() returned a non-array value.`);for(let model of availableModels)if(!model||typeof model!=`object`||typeof model.provider!=`string`||typeof model.id!=`string`)throw createAvailabilityUnavailableError(`Model availability unavailable: getAvailable() returned invalid model entries.`);return availableModels}function loadAvailableModels(registry){let availableModels;try{availableModels=registry.getAvailable()}catch(err){throw normalizeAvailabilityError(err)}try{return validateAvailableModels(availableModels)}catch(err){throw normalizeAvailabilityError(err)}}async function loadModelRegistry(cfg){await ensureBuilderForceAgentsModelsJson(cfg);let agentDir=resolveBuilderForceAgentsAgentDir();await ensureAuthJsonFromAuthProfiles(agentDir);let registry=discoverModels(discoverAuthStorage(agentDir),agentDir),appended=appendAntigravityForwardCompatModels(registry.getAll(),registry),models=appended.models,synthesizedForwardCompat=appended.synthesizedForwardCompat,availableKeys,availabilityErrorMessage;try{let availableModels=loadAvailableModels(registry);availableKeys=new Set(availableModels.map(model=>modelKey(model.provider,model.id)));for(let synthesized of synthesizedForwardCompat)hasAvailableTemplate(availableKeys,synthesized.templatePrefixes)&&availableKeys.add(synthesized.key)}catch(err){if(!shouldFallbackToAuthHeuristics(err))throw err;availableKeys=void 0,availabilityErrorMessage||=formatErrorWithStack(err)}return{registry,models,availableKeys,availabilityErrorMessage}}function appendAntigravityForwardCompatModels(models,modelRegistry){let nextModels=[...models],synthesizedForwardCompat=[];for(let candidate of ANTIGRAVITY_OPUS_46_FORWARD_COMPAT_CANDIDATES){let key=modelKey(`google-antigravity`,candidate.id);if(nextModels.some(model=>modelKey(model.provider,model.id)===key))continue;let fallback=resolveForwardCompatModel(`google-antigravity`,candidate.id,modelRegistry);fallback&&(nextModels.push(fallback),synthesizedForwardCompat.push({key,templatePrefixes:candidate.templatePrefixes}))}return{models:nextModels,synthesizedForwardCompat}}function hasAvailableTemplate(availableKeys,templatePrefixes){for(let key of availableKeys)if(templatePrefixes.some(prefix=>key.startsWith(prefix)))return!0;return!1}function toModelRow(params){let{model,key,tags,aliases=[],availableKeys,cfg,authStore}=params;if(!model)return{key,name:key,input:`-`,contextWindow:null,local:null,available:null,tags:[...tags,`missing`],missing:!0};let input=model.input.join(`+`)||`text`,local=isLocalBaseUrl(model.baseUrl),available=availableKeys===void 0?cfg&&authStore?hasAuthForProvider(model.provider,cfg,authStore):!1:availableKeys.has(modelKey(model.provider,model.id)),aliasTags=aliases.length>0?[`alias:${aliases.join(`,`)}`]:[],mergedTags=new Set(tags);if(aliasTags.length>0){for(let tag of mergedTags)(tag===`alias`||tag.startsWith(`alias:`))&&mergedTags.delete(tag);for(let tag of aliasTags)mergedTags.add(tag)}return{key,name:model.name||model.id,input,contextWindow:model.contextWindow??null,local,available,tags:Array.from(mergedTags),missing:!1}}const isRich=opts=>!!(isRich$1()&&!opts?.json&&!opts?.plain),pad=(value,size)=>value.padEnd(size),formatTag=(tag,rich)=>rich?tag===`default`?theme.success(tag):tag===`image`?theme.accentBright(tag):tag===`configured`?theme.accent(tag):tag===`missing`?theme.error(tag):tag.startsWith(`fallback#`)||tag.startsWith(`img-fallback#`)?theme.warn(tag):tag.startsWith(`alias:`)?theme.accentDim(tag):theme.muted(tag):tag,truncate=(value,max)=>value.length<=max?value:max<=3?value.slice(0,max):`${value.slice(0,max-3)}...`;function printModelTable(rows,runtime,opts={}){if(opts.json){runtime.log(JSON.stringify({count:rows.length,models:rows},null,2));return}if(opts.plain){for(let row of rows)runtime.log(row.key);return}let rich=isRich(opts),header=[pad(`Model`,42),pad(`Input`,10),pad(`Ctx`,8),pad(`Local`,5),pad(`Auth`,5),`Tags`].join(` `);runtime.log(rich?theme.heading(header):header);for(let row of rows){let keyLabel=pad(truncate(row.key,42),42),inputLabel=pad(row.input||`-`,10),ctxLabel=pad(formatTokenK(row.contextWindow),8),localLabel=pad(row.local===null?`-`:row.local?`yes`:`no`,5),authLabel=pad(row.available===null?`-`:row.available?`yes`:`no`,5),tagsLabel=row.tags.length>0?rich?row.tags.map(tag=>formatTag(tag,rich)).join(`,`):row.tags.join(`,`):``,coloredInput=colorize(rich,row.input.includes(`image`)?theme.accentBright:theme.info,inputLabel),coloredLocal=colorize(rich,row.local===null?theme.muted:row.local?theme.success:theme.muted,localLabel),coloredAuth=colorize(rich,row.available===null?theme.muted:row.available?theme.success:theme.error,authLabel),line=[rich?theme.accent(keyLabel):keyLabel,coloredInput,ctxLabel,coloredLocal,coloredAuth,tagsLabel].join(` `);runtime.log(line)}}async function modelsListCommand(opts,runtime){ensureFlagCompatibility(opts);let{loadConfig}=await import(`./config-DzAlOJby.js`),cfg=loadConfig(),authStore=await ensureAuthProfileStore(),providerFilter=(()=>{let raw=opts.provider?.trim();if(raw)return parseModelRef(`${raw}/_`,DEFAULT_PROVIDER)?.provider??raw.toLowerCase()})(),models=[],modelRegistry,availableKeys,availabilityErrorMessage;try{let loaded=await loadModelRegistry(cfg);modelRegistry=loaded.registry,models=loaded.models,availableKeys=loaded.availableKeys,availabilityErrorMessage=loaded.availabilityErrorMessage}catch(err){runtime.error(`Model registry unavailable:\n${formatErrorWithStack(err)}`),process.exitCode=1;return}availabilityErrorMessage!==void 0&&runtime.error(`Model availability lookup failed; falling back to auth heuristics for discovered models: ${availabilityErrorMessage}`);let modelByKey=new Map(models.map(model=>[modelKey(model.provider,model.id),model])),{entries}=resolveConfiguredEntries(cfg),configuredByKey=new Map(entries.map(entry=>[entry.key,entry])),rows=[];if(opts.all){let sorted=[...models].toSorted((a,b)=>{let p=a.provider.localeCompare(b.provider);return p===0?a.id.localeCompare(b.id):p});for(let model of sorted){if(providerFilter&&model.provider.toLowerCase()!==providerFilter||opts.local&&!isLocalBaseUrl(model.baseUrl))continue;let key=modelKey(model.provider,model.id),configured=configuredByKey.get(key);rows.push(toModelRow({model,key,tags:configured?Array.from(configured.tags):[],aliases:configured?.aliases??[],availableKeys,cfg,authStore}))}}else for(let entry of entries){if(providerFilter&&entry.ref.provider.toLowerCase()!==providerFilter)continue;let model=modelByKey.get(entry.key);if(!model&&modelRegistry){let forwardCompat=resolveForwardCompatModel(entry.ref.provider,entry.ref.model,modelRegistry);forwardCompat&&(model=forwardCompat,modelByKey.set(entry.key,forwardCompat))}model||=resolveModel(entry.ref.provider,entry.ref.model,void 0,cfg).model,!(opts.local&&model&&!isLocalBaseUrl(model.baseUrl))&&(opts.local&&!model||rows.push(toModelRow({model,key:entry.key,tags:Array.from(entry.tags),aliases:entry.aliases,availableKeys,cfg,authStore})))}if(rows.length===0){runtime.log(`No models found.`);return}printModelTable(rows,runtime,opts)}function resolveProviderAuthOverview(params){let{provider,cfg,store}=params,now=Date.now(),profiles=listProfilesForProvider(store,provider),withUnusableSuffix=(base,profileId)=>{let unusableUntil=resolveProfileUnusableUntilForDisplay(store,profileId);if(!unusableUntil||now>=unusableUntil)return base;let stats=store.usageStats?.[profileId];return`${base} [${typeof stats?.disabledUntil==`number`&&now<stats.disabledUntil?`disabled${stats.disabledReason?`:${stats.disabledReason}`:``}`:`cooldown`} ${formatRemainingShort(unusableUntil-now)}]`},labels=profiles.map(profileId=>{let profile=store.profiles[profileId];if(!profile)return`${profileId}=missing`;if(profile.type===`api_key`)return withUnusableSuffix(`${profileId}=${maskApiKey(profile.key??``)}`,profileId);if(profile.type===`token`)return withUnusableSuffix(`${profileId}=token:${maskApiKey(profile.token)}`,profileId);let display=resolveAuthProfileDisplayLabel({cfg,store,profileId}),suffix=display===profileId?``:display.startsWith(profileId)?display.slice(profileId.length).trim():`(${display})`;return withUnusableSuffix(`${profileId}=OAuth${suffix?` ${suffix}`:``}`,profileId)}),oauthCount=profiles.filter(id=>store.profiles[id]?.type===`oauth`).length,tokenCount=profiles.filter(id=>store.profiles[id]?.type===`token`).length,apiKeyCount=profiles.filter(id=>store.profiles[id]?.type===`api_key`).length,envKey=resolveEnvApiKey(provider),customKey=getCustomProviderApiKey(cfg,provider);return{provider,effective:profiles.length>0?{kind:`profiles`,detail:shortenHomePath(resolveAuthStorePathForDisplay())}:envKey?{kind:`env`,detail:envKey.source.includes(`OAUTH_TOKEN`)||envKey.source.toLowerCase().includes(`oauth`)?`OAuth (env)`:maskApiKey(envKey.apiKey)}:customKey?{kind:`models.json`,detail:maskApiKey(customKey)}:{kind:`missing`,detail:`missing`},profiles:{count:profiles.length,oauth:oauthCount,token:tokenCount,apiKey:apiKeyCount,labels},...envKey?{env:{value:envKey.source.includes(`OAUTH_TOKEN`)||envKey.source.toLowerCase().includes(`oauth`)?`OAuth (env)`:maskApiKey(envKey.apiKey),source:envKey.source}}:{},...customKey?{modelsJson:{value:maskApiKey(customKey),source:`models.json: ${shortenHomePath(params.modelsPath)}`}}:{}}}const toStatus=reason=>reason?reason===`auth`?`auth`:reason===`rate_limit`?`rate_limit`:reason===`billing`?`billing`:reason===`timeout`?`timeout`:reason===`format`?`format`:`unknown`:`unknown`;function buildCandidateMap(modelCandidates){let map=new Map;for(let raw of modelCandidates){let parsed=parseModelRef(String(raw??``),DEFAULT_PROVIDER);if(!parsed)continue;let list=map.get(parsed.provider)??[];list.includes(parsed.model)||list.push(parsed.model),map.set(parsed.provider,list)}return map}function selectProbeModel(params){let{provider,candidates,catalog}=params,direct=candidates.get(provider);if(direct&&direct.length>0)return{provider,model:direct[0]};let fromCatalog=catalog.find(entry=>entry.provider===provider);return fromCatalog?{provider:fromCatalog.provider,model:fromCatalog.id}:null}async function buildProbeTargets(params){let{cfg,providers,modelCandidates,options}=params,store=await ensureAuthProfileStore(),providerFilter=options.provider?.trim(),providerFilterKey=providerFilter?normalizeProviderId(providerFilter):null,profileFilter=new Set((options.profileIds??[]).map(id=>id.trim()).filter(Boolean));return loadModelCatalog({config:cfg}).then(catalog=>{let candidates=buildCandidateMap(modelCandidates),targets=[],results=[];for(let provider of providers){let providerKey=normalizeProviderId(provider);if(providerFilterKey&&providerKey!==providerFilterKey)continue;let model=selectProbeModel({provider:providerKey,candidates,catalog}),profileIds=listProfilesForProvider(store,providerKey),explicitOrder=findNormalizedProviderValue(store.order,providerKey)??findNormalizedProviderValue(cfg?.auth?.order,providerKey),allowedProfiles=explicitOrder&&explicitOrder.length>0?new Set(resolveAuthProfileOrder({cfg,store,provider:providerKey})):null,filteredProfiles=profileFilter.size?profileIds.filter(id=>profileFilter.has(id)):profileIds;if(filteredProfiles.length>0){for(let profileId of filteredProfiles){let mode=store.profiles[profileId]?.type,label=resolveAuthProfileDisplayLabel({cfg,store,profileId});if(explicitOrder&&!explicitOrder.includes(profileId)){results.push({provider:providerKey,model:model?`${model.provider}/${model.model}`:void 0,profileId,label,source:`profile`,mode,status:`unknown`,error:`Excluded by auth.order for this provider.`});continue}if(allowedProfiles&&!allowedProfiles.has(profileId)){results.push({provider:providerKey,model:model?`${model.provider}/${model.model}`:void 0,profileId,label,source:`profile`,mode,status:`unknown`,error:`Auth profile credentials are missing or expired.`});continue}if(!model){results.push({provider:providerKey,model:void 0,profileId,label,source:`profile`,mode,status:`no_model`,error:`No model available for probe`});continue}targets.push({provider:providerKey,model,profileId,label,source:`profile`,mode})}continue}if(profileFilter.size>0)continue;let envKey=resolveEnvApiKey(providerKey),customKey=getCustomProviderApiKey(cfg,providerKey);if(!envKey&&!customKey)continue;let label=envKey?`env`:`models.json`,source=envKey?`env`:`models.json`,mode=envKey?.source.includes(`OAUTH_TOKEN`)?`oauth`:`api_key`;if(!model){results.push({provider:providerKey,model:void 0,label,source,mode,status:`no_model`,error:`No model available for probe`});continue}targets.push({provider:providerKey,model,label,source,mode})}return{targets,results}})}async function probeTarget(params){let{cfg,agentId,agentDir,workspaceDir,sessionDir,target,timeoutMs,maxTokens}=params;if(!target.model)return{provider:target.provider,model:void 0,profileId:target.profileId,label:target.label,source:target.source,mode:target.mode,status:`no_model`,error:`No model available for probe`};let sessionId=`probe-${target.provider}-${crypto.randomUUID()}`,sessionFile=resolveSessionTranscriptPath(sessionId,agentId);await fs.mkdir(sessionDir,{recursive:!0});let start=Date.now();try{return await runEmbeddedAgent({sessionId,sessionFile,agentId,workspaceDir,agentDir,config:cfg,prompt:`Reply with OK. Do not use tools.`,provider:target.model.provider,model:target.model.model,authProfileId:target.profileId,authProfileIdSource:target.profileId?`user`:void 0,timeoutMs,runId:`probe-${crypto.randomUUID()}`,lane:`auth-probe:${target.provider}:${target.profileId??target.source}`,thinkLevel:`off`,reasoningLevel:`off`,verboseLevel:`off`,streamParams:{maxTokens}}),{provider:target.provider,model:`${target.model.provider}/${target.model.model}`,profileId:target.profileId,label:target.label,source:target.source,mode:target.mode,status:`ok`,latencyMs:Date.now()-start}}catch(err){let described=describeFailoverError(err);return{provider:target.provider,model:`${target.model.provider}/${target.model.model}`,profileId:target.profileId,label:target.label,source:target.source,mode:target.mode,status:toStatus(described.reason),error:redactSecrets(described.message),latencyMs:Date.now()-start}}}async function runTargetsWithConcurrency(params){let{cfg,targets,timeoutMs,maxTokens,onProgress}=params,concurrency=Math.max(1,Math.min(targets.length||1,params.concurrency)),agentId=resolveDefaultAgentId(cfg),agentDir=resolveBuilderForceAgentsAgentDir(),workspaceDir=resolveAgentWorkspaceDir(cfg,agentId)??resolveDefaultAgentWorkspaceDir(),sessionDir=resolveSessionTranscriptsDirForAgent(agentId);await fs.mkdir(workspaceDir,{recursive:!0});let completed=0,results=Array.from({length:targets.length}),cursor=0,worker=async()=>{for(;;){let index=cursor;if(cursor+=1,index>=targets.length)return;let target=targets[index];onProgress?.({completed,total:targets.length,label:`Probing ${target.provider}${target.profileId?` (${target.label})`:``}`}),results[index]=await probeTarget({cfg,agentId,agentDir,workspaceDir,sessionDir,target,timeoutMs,maxTokens}),completed+=1,onProgress?.({completed,total:targets.length})}};return await Promise.all(Array.from({length:concurrency},()=>worker())),results.filter(entry=>!!entry)}async function runAuthProbes(params){let startedAt=Date.now(),plan=await buildProbeTargets({cfg:params.cfg,providers:params.providers,modelCandidates:params.modelCandidates,options:params.options}),totalTargets=plan.targets.length;params.onProgress?.({completed:0,total:totalTargets});let results=totalTargets?await runTargetsWithConcurrency({cfg:params.cfg,targets:plan.targets,timeoutMs:params.options.timeoutMs,maxTokens:params.options.maxTokens,concurrency:params.options.concurrency,onProgress:params.onProgress}):[],finishedAt=Date.now();return{startedAt,finishedAt,durationMs:finishedAt-startedAt,totalTargets,options:params.options,results:[...plan.results,...results]}}function formatProbeLatency(latencyMs){return!latencyMs&&latencyMs!==0?`-`:formatMs(latencyMs)}function sortProbeResults(results){return results.slice().toSorted((a,b)=>{let provider=a.provider.localeCompare(b.provider);if(provider!==0)return provider;let aLabel=a.label||a.profileId||``,bLabel=b.label||b.profileId||``;return aLabel.localeCompare(bLabel)})}function describeProbeSummary(summary){return summary.totalTargets===0?`No probe targets.`:`Probed ${summary.totalTargets} target${summary.totalTargets===1?``:`s`} in ${formatMs(summary.durationMs)}`}async function modelsStatusCommand(opts,runtime){if(ensureFlagCompatibility(opts),opts.plain&&opts.probe)throw Error(`--probe cannot be used with --plain output.`);let cfg=loadConfig(),agentId=resolveKnownAgentId({cfg,rawAgentId:opts.agent}),agentDir=agentId?resolveAgentDir(cfg,agentId):resolveBuilderForceAgentsAgentDir(),agentModelPrimary=agentId?resolveAgentModelPrimary(cfg,agentId):void 0,agentFallbacksOverride=agentId?resolveAgentModelFallbacksOverride(cfg,agentId):void 0,resolved=agentId?resolveDefaultModelForAgent({cfg,agentId}):resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),modelConfig=cfg.agents?.defaults?.model,imageConfig=cfg.agents?.defaults?.imageModel,rawDefaultsModel=typeof modelConfig==`string`?modelConfig.trim():modelConfig?.primary?.trim()??``,rawModel=agentModelPrimary??rawDefaultsModel,resolvedLabel=`${resolved.provider}/${resolved.model}`,defaultLabel=rawModel||resolvedLabel,defaultsFallbacks=typeof modelConfig==`object`?modelConfig?.fallbacks??[]:[],fallbacks=agentFallbacksOverride??defaultsFallbacks,imageModel=typeof imageConfig==`string`?imageConfig.trim():imageConfig?.primary?.trim()??``,imageFallbacks=typeof imageConfig==`object`?imageConfig?.fallbacks??[]:[],aliases=Object.entries(cfg.agents?.defaults?.models??{}).reduce((acc,[key,entry])=>{let alias=typeof entry?.alias==`string`?entry.alias.trim():void 0;return alias&&(acc[alias]=key),acc},{}),allowed=Object.keys(cfg.agents?.defaults?.models??{}),store=await ensureAuthProfileStore(agentDir),modelsPath=path.join(agentDir,`models.json`),providersFromStore=new Set(Object.values(store.profiles).map(profile=>profile.provider).filter(p=>!!p)),providersFromConfig=new Set(Object.keys(cfg.models?.providers??{}).map(p=>typeof p==`string`?p.trim():``).filter(Boolean)),providersFromModels=new Set,providersInUse=new Set;for(let raw of[defaultLabel,...fallbacks,imageModel,...imageFallbacks,...allowed]){let parsed=parseModelRef(String(raw??``),DEFAULT_PROVIDER);parsed?.provider&&providersFromModels.add(parsed.provider)}for(let raw of[defaultLabel,...fallbacks,imageModel,...imageFallbacks]){let parsed=parseModelRef(String(raw??``),DEFAULT_PROVIDER);parsed?.provider&&providersInUse.add(parsed.provider)}let providersFromEnv=new Set;for(let provider of[`anthropic`,`github-copilot`,`google-vertex`,`openai`,`google`,`groq`,`cerebras`,`xai`,`openrouter`,`zai`,`mistral`,`synthetic`])resolveEnvApiKey(provider)&&providersFromEnv.add(provider);let providers=Array.from(new Set([...providersFromStore,...providersFromConfig,...providersFromModels,...providersFromEnv])).map(p=>typeof p==`string`?p.trim():``).filter(Boolean).toSorted((a,b)=>a.localeCompare(b)),applied=getShellEnvAppliedKeys(),shellFallbackEnabled=shouldEnableShellEnvFallback(process.env)||cfg.env?.shellEnv?.enabled===!0,providerAuth=providers.map(provider=>resolveProviderAuthOverview({provider,cfg,store,modelsPath})).filter(entry=>entry.profiles.count>0||!!entry.env||!!entry.modelsJson),providerAuthMap=new Map(providerAuth.map(entry=>[entry.provider,entry])),missingProvidersInUse=Array.from(providersInUse).filter(provider=>!providerAuthMap.has(provider)).toSorted((a,b)=>a.localeCompare(b)),probeProfileIds=opts.probeProfile?(Array.isArray(opts.probeProfile)?opts.probeProfile:[opts.probeProfile]).flatMap(value=>String(value??``).split(`,`)).map(value=>value.trim()).filter(Boolean):[],probeTimeoutMs=opts.probeTimeout?Number(opts.probeTimeout):8e3;if(!Number.isFinite(probeTimeoutMs)||probeTimeoutMs<=0)throw Error(`--probe-timeout must be a positive number (ms).`);let probeConcurrency=opts.probeConcurrency?Number(opts.probeConcurrency):2;if(!Number.isFinite(probeConcurrency)||probeConcurrency<=0)throw Error(`--probe-concurrency must be > 0.`);let probeMaxTokens=opts.probeMaxTokens?Number(opts.probeMaxTokens):8;if(!Number.isFinite(probeMaxTokens)||probeMaxTokens<=0)throw Error(`--probe-max-tokens must be > 0.`);let aliasIndex=buildModelAliasIndex({cfg,defaultProvider:DEFAULT_PROVIDER}),modelCandidates=[rawModel||resolvedLabel,...fallbacks,imageModel,...imageFallbacks,...allowed].filter(Boolean).map(raw=>resolveModelRefFromString({raw:String(raw??``),defaultProvider:DEFAULT_PROVIDER,aliasIndex})?.ref).filter(ref=>!!ref).map(ref=>`${ref.provider}/${ref.model}`),probeSummary;opts.probe&&(probeSummary=await withProgressTotals({label:`Probing auth profiles…`,total:1},async update=>await runAuthProbes({cfg,providers,modelCandidates,options:{provider:opts.probeProvider,profileIds:probeProfileIds,timeoutMs:probeTimeoutMs,concurrency:probeConcurrency,maxTokens:probeMaxTokens},onProgress:update})));let providersWithOauth=providerAuth.filter(entry=>entry.profiles.oauth>0||entry.profiles.token>0||entry.env?.value===`OAuth (env)`).map(entry=>{let count=entry.profiles.oauth+entry.profiles.token+(entry.env?.value===`OAuth (env)`?1:0);return`${entry.provider} (${count})`}),authHealth=buildAuthHealthSummary({store,cfg,warnAfterMs:DEFAULT_OAUTH_WARN_MS,providers}),oauthProfiles=authHealth.profiles.filter(profile=>profile.type===`oauth`||profile.type===`token`),unusableProfiles=(()=>{let now=Date.now(),out=[];for(let profileId of Object.keys(store.usageStats??{})){let unusableUntil=resolveProfileUnusableUntilForDisplay(store,profileId);if(!unusableUntil||now>=unusableUntil)continue;let stats=store.usageStats?.[profileId],kind=typeof stats?.disabledUntil==`number`&&now<stats.disabledUntil?`disabled`:`cooldown`;out.push({profileId,provider:store.profiles[profileId]?.provider,kind,reason:stats?.disabledReason,until:unusableUntil,remainingMs:unusableUntil-now})}return out.toSorted((a,b)=>a.remainingMs-b.remainingMs)})(),checkStatus=(()=>{let hasExpiredOrMissing=oauthProfiles.some(profile=>[`expired`,`missing`].includes(profile.status))||missingProvidersInUse.length>0,hasExpiring=oauthProfiles.some(profile=>profile.status===`expiring`);return hasExpiredOrMissing?1:hasExpiring?2:0})();if(opts.json){runtime.log(JSON.stringify({configPath:CONFIG_PATH,...agentId?{agentId}:{},agentDir,defaultModel:defaultLabel,resolvedDefault:resolvedLabel,fallbacks,imageModel:imageModel||null,imageFallbacks,...agentId?{modelConfig:{defaultSource:agentModelPrimary?`agent`:`defaults`,fallbacksSource:agentFallbacksOverride===void 0?`defaults`:`agent`}}:{},aliases,allowed,auth:{storePath:resolveAuthStorePathForDisplay(agentDir),shellEnvFallback:{enabled:shellFallbackEnabled,appliedKeys:applied},providersWithOAuth:providersWithOauth,missingProvidersInUse,providers:providerAuth,unusableProfiles,oauth:{warnAfterMs:authHealth.warnAfterMs,profiles:authHealth.profiles,providers:authHealth.providers},probes:probeSummary}},null,2)),opts.check&&runtime.exit(checkStatus);return}if(opts.plain){runtime.log(resolvedLabel),opts.check&&runtime.exit(checkStatus);return}let rich=isRich(opts),label=value=>colorize(rich,theme.accent,value.padEnd(14)),labelWithSource=(value,source)=>label(source?`${value} (${source})`:value),displayDefault=rawModel&&rawModel!==resolvedLabel?`${resolvedLabel} (from ${rawModel})`:resolvedLabel;runtime.log(`${label(`Config`)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,theme.info,shortenHomePath(CONFIG_PATH))}`),runtime.log(`${label(`Agent dir`)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,theme.info,shortenHomePath(agentDir))}`),runtime.log(`${labelWithSource(`Default`,agentId?agentModelPrimary?`agent`:`defaults`:void 0)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,theme.success,displayDefault)}`),runtime.log(`${labelWithSource(`Fallbacks (${fallbacks.length||0})`,agentId?agentFallbacksOverride===void 0?`defaults`:`agent`:void 0)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,fallbacks.length?theme.warn:theme.muted,fallbacks.length?fallbacks.join(`, `):`-`)}`),runtime.log(`${labelWithSource(`Image model`,agentId?`defaults`:void 0)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,imageModel?theme.accentBright:theme.muted,imageModel||`-`)}`),runtime.log(`${labelWithSource(`Image fallbacks (${imageFallbacks.length||0})`,agentId?`defaults`:void 0)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,imageFallbacks.length?theme.accentBright:theme.muted,imageFallbacks.length?imageFallbacks.join(`, `):`-`)}`),runtime.log(`${label(`Aliases (${Object.keys(aliases).length||0})`)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,Object.keys(aliases).length?theme.accent:theme.muted,Object.keys(aliases).length?Object.entries(aliases).map(([alias,target])=>rich?`${theme.accentDim(alias)} ${theme.muted(`->`)} ${theme.info(target)}`:`${alias} -> ${target}`).join(`, `):`-`)}`),runtime.log(`${label(`Configured models (${allowed.length||0})`)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,allowed.length?theme.info:theme.muted,allowed.length?allowed.join(`, `):`all`)}`),runtime.log(``),runtime.log(colorize(rich,theme.heading,`Auth overview`)),runtime.log(`${label(`Auth store`)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,theme.info,shortenHomePath(resolveAuthStorePathForDisplay(agentDir)))}`),runtime.log(`${label(`Shell env`)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,shellFallbackEnabled?theme.success:theme.muted,shellFallbackEnabled?`on`:`off`)}${applied.length?colorize(rich,theme.muted,` (applied: ${applied.join(`, `)})`):``}`),runtime.log(`${label(`Providers w/ OAuth/tokens (${providersWithOauth.length||0})`)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,providersWithOauth.length?theme.info:theme.muted,providersWithOauth.length?providersWithOauth.join(`, `):`-`)}`);let formatKey=key=>colorize(rich,theme.warn,key),formatKeyValue=(key,value)=>`${formatKey(key)}=${colorize(rich,theme.info,value)}`,formatSeparator=()=>colorize(rich,theme.muted,` | `);for(let entry of providerAuth){let separator=formatSeparator(),bits=[];bits.push(formatKeyValue(`effective`,`${colorize(rich,theme.accentBright,entry.effective.kind)}:${colorize(rich,theme.muted,entry.effective.detail)}`)),entry.profiles.count>0&&(bits.push(formatKeyValue(`profiles`,`${entry.profiles.count} (oauth=${entry.profiles.oauth}, token=${entry.profiles.token}, api_key=${entry.profiles.apiKey})`)),entry.profiles.labels.length>0&&bits.push(colorize(rich,theme.info,entry.profiles.labels.join(`, `)))),entry.env&&bits.push(formatKeyValue(`env`,`${entry.env.value}${separator}${formatKeyValue(`source`,entry.env.source)}`)),entry.modelsJson&&bits.push(formatKeyValue(`models.json`,`${entry.modelsJson.value}${separator}${formatKeyValue(`source`,entry.modelsJson.source)}`)),runtime.log(`- ${theme.heading(entry.provider)} ${bits.join(separator)}`)}if(missingProvidersInUse.length>0){runtime.log(``),runtime.log(colorize(rich,theme.heading,`Missing auth`));for(let provider of missingProvidersInUse){let hint=provider===`anthropic`?`Run \`claude setup-token\`, then \`${formatCliCommand(`builderforce models auth setup-token`)}\` or \`${formatCliCommand(`builderforce configure`)}\`.`:`Run \`${formatCliCommand(`builderforce configure`)}\` or set an API key env var.`;runtime.log(`- ${theme.heading(provider)} ${hint}`)}}if(runtime.log(``),runtime.log(colorize(rich,theme.heading,`OAuth/token status`)),oauthProfiles.length===0)runtime.log(colorize(rich,theme.muted,`- none`));else{let usageByProvider=new Map,usageProviders=Array.from(new Set(oauthProfiles.map(profile=>resolveUsageProviderId(profile.provider)).filter(provider=>!!provider)));if(usageProviders.length>0)try{let usageSummary=await loadProviderUsageSummary({providers:usageProviders,agentDir,timeoutMs:3500});for(let snapshot of usageSummary.providers){let formatted=formatUsageWindowSummary(snapshot,{now:Date.now(),maxWindows:2,includeResets:!0});formatted&&usageByProvider.set(snapshot.provider,formatted)}}catch{}let formatStatus=status=>status===`ok`?colorize(rich,theme.success,`ok`):status===`static`?colorize(rich,theme.muted,`static`):status===`expiring`?colorize(rich,theme.warn,`expiring`):status===`missing`?colorize(rich,theme.warn,`unknown`):colorize(rich,theme.error,`expired`),profilesByProvider=new Map;for(let profile of oauthProfiles){let current=profilesByProvider.get(profile.provider);current?current.push(profile):profilesByProvider.set(profile.provider,[profile])}for(let[provider,profiles]of profilesByProvider){let usageKey=resolveUsageProviderId(provider),usage=usageKey?usageByProvider.get(usageKey):void 0,usageSuffix=usage?colorize(rich,theme.muted,` usage: ${usage}`):``;runtime.log(`- ${colorize(rich,theme.heading,provider)}${usageSuffix}`);for(let profile of profiles){let labelText=profile.label||profile.profileId,label=colorize(rich,theme.accent,labelText),status=formatStatus(profile.status),expiry=profile.status===`static`?``:profile.expiresAt?` expires in ${formatRemainingShort(profile.remainingMs)}`:` expires unknown`;runtime.log(` - ${label} ${status}${expiry}`)}}}if(probeSummary)if(runtime.log(``),runtime.log(colorize(rich,theme.heading,`Auth probes`)),probeSummary.results.length===0)runtime.log(colorize(rich,theme.muted,`- none`));else{let tableWidth=Math.max(60,(process.stdout.columns??120)-1),sorted=sortProbeResults(probeSummary.results),statusColor=status=>status===`ok`?theme.success:status===`rate_limit`||status===`timeout`||status===`billing`?theme.warn:status===`auth`||status===`format`?theme.error:theme.muted,rows=sorted.map(result=>{let status=colorize(rich,statusColor(result.status),result.status),latency=formatProbeLatency(result.latencyMs),modelLabel=result.model??`${result.provider}/-`,modeLabel=result.mode?` ${colorize(rich,theme.muted,`(${result.mode})`)}`:``,profile=`${colorize(rich,theme.accent,result.label)}${modeLabel}`,detail=result.error?.trim(),detailLabel=detail?`\n${colorize(rich,theme.muted,`↳ ${detail}`)}`:``,statusLabel=`${status}${colorize(rich,theme.muted,` · ${latency}`)}${detailLabel}`;return{Model:colorize(rich,theme.heading,modelLabel),Profile:profile,Status:statusLabel}});runtime.log(renderTable({width:tableWidth,columns:[{key:`Model`,header:`Model`,minWidth:18},{key:`Profile`,header:`Profile`,minWidth:24},{key:`Status`,header:`Status`,minWidth:12}],rows}).trimEnd()),runtime.log(colorize(rich,theme.muted,describeProbeSummary(probeSummary)))}opts.check&&runtime.exit(checkStatus)}const TOOL_PING={name:`ping`,description:`Return OK.`,parameters:Type.Object({})};function normalizeCreatedAtMs(value){return typeof value!=`number`||!Number.isFinite(value)||value<=0?null:value>0xe8d4a51000?Math.round(value):Math.round(value*1e3)}function parseModality(modality){return modality&&modality.toLowerCase().split(/[^a-z]+/).filter(Boolean).includes(`image`)?[`text`,`image`]:[`text`]}function parseNumberString(value){if(typeof value==`number`&&Number.isFinite(value))return value;if(typeof value!=`string`)return null;let trimmed=value.trim();if(!trimmed)return null;let num=Number(trimmed);return Number.isFinite(num)?num:null}function parseOpenRouterPricing(value){if(!value||typeof value!=`object`)return null;let obj=value,prompt=parseNumberString(obj.prompt),completion=parseNumberString(obj.completion),request=parseNumberString(obj.request)??0,image=parseNumberString(obj.image)??0,webSearch=parseNumberString(obj.web_search)??0,internalReasoning=parseNumberString(obj.internal_reasoning)??0;return prompt===null||completion===null?null:{prompt,completion,request,image,webSearch,internalReasoning}}function isFreeOpenRouterModel(entry){return entry.id.endsWith(`:free`)?!0:entry.pricing?entry.pricing.prompt===0&&entry.pricing.completion===0:!1}async function withTimeout(timeoutMs,fn){let controller=new AbortController,timer=setTimeout(controller.abort.bind(controller),timeoutMs);try{return await fn(controller.signal)}finally{clearTimeout(timer)}}async function fetchOpenRouterModels(fetchImpl){let res=await fetchImpl(`https://openrouter.ai/api/v1/models`,{headers:{Accept:`application/json`}});if(!res.ok)throw Error(`OpenRouter /models failed: HTTP ${res.status}`);let payload=await res.json();return(Array.isArray(payload.data)?payload.data:[]).map(entry=>{if(!entry||typeof entry!=`object`)return null;let obj=entry,id=typeof obj.id==`string`?obj.id.trim():``;if(!id)return null;let name=typeof obj.name==`string`&&obj.name.trim()?obj.name.trim():id,contextLength=typeof obj.context_length==`number`&&Number.isFinite(obj.context_length)?obj.context_length:null,maxCompletionTokens=typeof obj.max_completion_tokens==`number`&&Number.isFinite(obj.max_completion_tokens)?obj.max_completion_tokens:typeof obj.max_output_tokens==`number`&&Number.isFinite(obj.max_output_tokens)?obj.max_output_tokens:null,supportedParameters=Array.isArray(obj.supported_parameters)?obj.supported_parameters.filter(value=>typeof value==`string`).map(value=>value.trim()).filter(Boolean):[];return{id,name,contextLength,maxCompletionTokens,supportedParameters,supportedParametersCount:supportedParameters.length,supportsToolsMeta:supportedParameters.includes(`tools`),modality:typeof obj.modality==`string`&&obj.modality.trim()?obj.modality.trim():null,inferredParamB:inferParamBFromIdOrName(`${id} ${name}`),createdAtMs:normalizeCreatedAtMs(obj.created_at),pricing:parseOpenRouterPricing(obj.pricing)}}).filter(entry=>!!entry)}async function probeTool(model,apiKey,timeoutMs){let context={messages:[{role:`user`,content:`Call the ping tool with {} and nothing else.`,timestamp:Date.now()}],tools:[TOOL_PING]},startedAt=Date.now();try{return(await withTimeout(timeoutMs,signal=>nativeComplete({baseUrl:model.baseUrl,apiKey,defaultModel:model.id},{model:model.id,messages:context.messages.map(m=>({role:m.role,content:m.content})),tools:context.tools?.map(t=>({type:`function`,function:{name:t.name,description:t.description,parameters:t.parameters}})),temperature:0,extra:{max_tokens:32,tool_choice:`required`}},signal))).toolCalls.length>0?{ok:!0,latencyMs:Date.now()-startedAt}:{ok:!1,latencyMs:Date.now()-startedAt,error:`No tool call returned`}}catch(err){return{ok:!1,latencyMs:Date.now()-startedAt,error:err instanceof Error?err.message:String(err)}}}async function probeImage(model,apiKey,timeoutMs){let context={messages:[{role:`user`,content:[{type:`text`,text:`Reply with OK.`},{type:`image`,data:`iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+X3mIAAAAASUVORK5CYII=`,mimeType:`image/png`}],timestamp:Date.now()}]},startedAt=Date.now();try{return await withTimeout(timeoutMs,signal=>nativeComplete({baseUrl:model.baseUrl,apiKey,defaultModel:model.id},{model:model.id,messages:context.messages.map(m=>({role:m.role,content:m.content})),temperature:0,extra:{max_tokens:16}},signal)),{ok:!0,latencyMs:Date.now()-startedAt}}catch(err){return{ok:!1,latencyMs:Date.now()-startedAt,error:err instanceof Error?err.message:String(err)}}}function ensureImageInput(model){return model.input.includes(`image`)?model:{...model,input:Array.from(new Set([...model.input,`image`]))}}function buildOpenRouterScanResult(params){let{entry,isFree}=params;return{id:entry.id,name:entry.name,provider:`openrouter`,modelRef:`openrouter/${entry.id}`,contextLength:entry.contextLength,maxCompletionTokens:entry.maxCompletionTokens,supportedParametersCount:entry.supportedParametersCount,supportsToolsMeta:entry.supportsToolsMeta,modality:entry.modality,inferredParamB:entry.inferredParamB,createdAtMs:entry.createdAtMs,pricing:entry.pricing,isFree,tool:params.tool,image:params.image}}async function mapWithConcurrency(items,concurrency,fn,opts){let limit=Math.max(1,Math.floor(concurrency)),results=Array.from({length:items.length},()=>void 0),nextIndex=0,completed=0,worker=async()=>{for(;;){let current=nextIndex;if(nextIndex+=1,current>=items.length)return;results[current]=await fn(items[current],current),completed+=1,opts?.onProgress?.(completed,items.length)}};return items.length===0?(opts?.onProgress?.(0,0),results):(await Promise.all(Array.from({length:Math.min(limit,items.length)},()=>worker())),results)}async function scanOpenRouterModels(options={}){let fetchImpl=options.fetchImpl??fetch,probe=options.probe??!0,apiKey=options.apiKey?.trim()||getEnvApiKey(`openrouter`)||``;if(probe&&!apiKey)throw Error(`Missing OpenRouter API key. Set OPENROUTER_API_KEY to run models scan.`);let timeoutMs=Math.max(1,Math.floor(options.timeoutMs??12e3)),concurrency=Math.max(1,Math.floor(options.concurrency??3)),minParamB=Math.max(0,Math.floor(options.minParamB??0)),maxAgeDays=Math.max(0,Math.floor(options.maxAgeDays??0)),providerFilter=options.providerFilter?.trim().toLowerCase()??``,catalog=await fetchOpenRouterModels(fetchImpl),now=Date.now(),filtered=catalog.filter(entry=>!(!isFreeOpenRouterModel(entry)||providerFilter&&(entry.id.split(`/`)[0]?.toLowerCase()??``)!==providerFilter||minParamB>0&&(entry.inferredParamB??0)<minParamB||maxAgeDays>0&&entry.createdAtMs&&(now-entry.createdAtMs)/(1440*60*1e3)>maxAgeDays)),baseModel=getModel(`openrouter`,`openrouter/auto`);return options.onProgress?.({phase:`probe`,completed:0,total:filtered.length}),mapWithConcurrency(filtered,concurrency,async entry=>{let isFree=isFreeOpenRouterModel(entry);if(!probe)return buildOpenRouterScanResult({entry,isFree,tool:{ok:!1,latencyMs:null,skipped:!0},image:{ok:!1,latencyMs:null,skipped:!0}});let model={...baseModel,id:entry.id,name:entry.name||entry.id,contextWindow:entry.contextLength??baseModel.contextWindow,maxTokens:entry.maxCompletionTokens??baseModel.maxTokens,input:parseModality(entry.modality),reasoning:baseModel.reasoning};return buildOpenRouterScanResult({entry,isFree,tool:await probeTool(model,apiKey,timeoutMs),image:model.input.includes(`image`)?await probeImage(ensureImageInput(model),apiKey,timeoutMs):{ok:!1,latencyMs:null,skipped:!0}})},{onProgress:(completed,total)=>options.onProgress?.({phase:`probe`,completed,total})})}const multiselect$1=params=>multiselect({...params,message:stylePromptMessage(params.message),options:params.options.map(opt=>opt.hint===void 0?opt:{...opt,hint:stylePromptHint(opt.hint)})});function guardPromptCancel(value,runtime){if(isCancel(value))throw cancel(stylePromptTitle(`Model scan cancelled.`)??`Model scan cancelled.`),runtime.exit(0),Error(`unreachable`);return value}function sortScanResults(results){return results.slice().toSorted((a,b)=>{let aImage=a.image.ok?1:0,bImage=b.image.ok?1:0;if(aImage!==bImage)return bImage-aImage;let aToolLatency=a.tool.latencyMs??1/0,bToolLatency=b.tool.latencyMs??1/0;return aToolLatency===bToolLatency?compareScanMetadata(a,b):aToolLatency-bToolLatency})}function sortImageResults(results){return results.slice().toSorted((a,b)=>{let aLatency=a.image.latencyMs??1/0,bLatency=b.image.latencyMs??1/0;return aLatency===bLatency?compareScanMetadata(a,b):aLatency-bLatency})}function compareScanMetadata(a,b){let aCtx=a.contextLength??0,bCtx=b.contextLength??0;if(aCtx!==bCtx)return bCtx-aCtx;let aParams=a.inferredParamB??0,bParams=b.inferredParamB??0;return aParams===bParams?a.modelRef.localeCompare(b.modelRef):bParams-aParams}function buildScanHint(result){return[result.tool.ok?`tool ${formatMs(result.tool.latencyMs)}`:`tool fail`,result.image.skipped?`img skip`:result.image.ok?`img ${formatMs(result.image.latencyMs)}`:`img fail`,result.contextLength?`ctx ${formatTokenK(result.contextLength)}`:`ctx ?`,result.inferredParamB?`${result.inferredParamB}b`:null].filter(Boolean).join(` | `)}function printScanSummary(results,runtime){let toolOk=results.filter(r=>r.tool.ok),imageOk=results.filter(r=>r.image.ok),toolImageOk=results.filter(r=>r.tool.ok&&r.image.ok),imageOnly=imageOk.filter(r=>!r.tool.ok);runtime.log(`Scan results: tested ${results.length}, tool ok ${toolOk.length}, image ok ${imageOk.length}, tool+image ok ${toolImageOk.length}, image only ${imageOnly.length}`)}function printScanTable(results,runtime){let header=[pad(`Model`,42),pad(`Tool`,10),pad(`Image`,10),pad(`Ctx`,8),pad(`Params`,8),`Notes`].join(` `);runtime.log(header);for(let entry of results){let modelLabel=pad(truncate(entry.modelRef,42),42),toolLabel=pad(entry.tool.ok?formatMs(entry.tool.latencyMs):`fail`,10),imageLabel=pad(entry.image.ok?formatMs(entry.image.latencyMs):entry.image.skipped?`skip`:`fail`,10),ctxLabel=pad(formatTokenK(entry.contextLength),8),paramsLabel=pad(entry.inferredParamB?`${entry.inferredParamB}b`:`-`,8),notes=entry.modality?`modality:${entry.modality}`:``;runtime.log([modelLabel,toolLabel,imageLabel,ctxLabel,paramsLabel,notes].join(` `))}}async function modelsScanCommand(opts,runtime){let minParams=opts.minParams?Number(opts.minParams):void 0;if(minParams!==void 0&&(!Number.isFinite(minParams)||minParams<0))throw Error(`--min-params must be >= 0`);let maxAgeDays=opts.maxAgeDays?Number(opts.maxAgeDays):void 0;if(maxAgeDays!==void 0&&(!Number.isFinite(maxAgeDays)||maxAgeDays<0))throw Error(`--max-age-days must be >= 0`);let maxCandidates=opts.maxCandidates?Number(opts.maxCandidates):6;if(!Number.isFinite(maxCandidates)||maxCandidates<=0)throw Error(`--max-candidates must be > 0`);let timeout=opts.timeout?Number(opts.timeout):void 0;if(timeout!==void 0&&(!Number.isFinite(timeout)||timeout<=0))throw Error(`--timeout must be > 0`);let concurrency=opts.concurrency?Number(opts.concurrency):void 0;if(concurrency!==void 0&&(!Number.isFinite(concurrency)||concurrency<=0))throw Error(`--concurrency must be > 0`);let cfg=loadConfig(),probe=opts.probe??!0,storedKey;if(probe)try{storedKey=(await resolveApiKeyForProvider({provider:`openrouter`,cfg})).apiKey}catch{storedKey=void 0}let results=await withProgressTotals({label:`Scanning OpenRouter models...`,indeterminate:!1,enabled:opts.json!==!0},async update=>await scanOpenRouterModels({apiKey:storedKey??void 0,minParamB:minParams,maxAgeDays,providerFilter:opts.provider,timeoutMs:timeout,concurrency,probe,onProgress:({phase,completed,total})=>{phase===`probe`&&update({completed,total,label:`${probe?`Probing models`:`Scanning models`} (${completed}/${total})`})}}));if(!probe){opts.json?runtime.log(JSON.stringify(results,null,2)):(runtime.log(`Found ${results.length} OpenRouter free models (metadata only; pass --probe to test tools/images).`),printScanTable(sortScanResults(results),runtime));return}let toolOk=results.filter(entry=>entry.tool.ok);if(toolOk.length===0)throw Error(`No tool-capable OpenRouter free models found.`);let sorted=sortScanResults(results),toolSorted=sortScanResults(toolOk),imageSorted=sortImageResults(results.filter(entry=>entry.image.ok)),imagePreferred=toolSorted.filter(entry=>entry.image.ok),preselected=(imagePreferred.length>0?imagePreferred:toolSorted).slice(0,Math.floor(maxCandidates)).map(entry=>entry.modelRef),imagePreselected=imageSorted.slice(0,Math.floor(maxCandidates)).map(entry=>entry.modelRef);opts.json||(printScanSummary(results,runtime),printScanTable(sorted,runtime));let noInput=opts.input===!1,canPrompt=process.stdin.isTTY&&!opts.yes&&!noInput&&!opts.json,selected=preselected,selectedImages=imagePreselected;if(canPrompt)selected=guardPromptCancel(await multiselect$1({message:`Select fallback models (ordered)`,options:toolSorted.map(entry=>({value:entry.modelRef,label:entry.modelRef,hint:buildScanHint(entry)})),initialValues:preselected}),runtime),imageSorted.length>0&&(selectedImages=guardPromptCancel(await multiselect$1({message:`Select image fallback models (ordered)`,options:imageSorted.map(entry=>({value:entry.modelRef,label:entry.modelRef,hint:buildScanHint(entry)})),initialValues:imagePreselected}),runtime));else if(!process.stdin.isTTY&&!opts.yes&&!noInput&&!opts.json)throw Error(`Non-interactive scan: pass --yes to apply defaults.`);if(selected.length===0)throw Error(`No models selected for fallbacks.`);if(opts.setImage&&selectedImages.length===0)throw Error(`No image-capable models selected for image model.`);if(await updateConfig(cfg=>{let nextModels={...cfg.agents?.defaults?.models};for(let entry of selected)nextModels[entry]||(nextModels[entry]={});for(let entry of selectedImages)nextModels[entry]||(nextModels[entry]={});let existingImageModel=cfg.agents?.defaults?.imageModel,nextImageModel=selectedImages.length>0?{...existingImageModel?.primary?{primary:existingImageModel.primary}:void 0,fallbacks:selectedImages,...opts.setImage?{primary:selectedImages[0]}:{}}:cfg.agents?.defaults?.imageModel,existingModel=cfg.agents?.defaults?.model,defaults={...cfg.agents?.defaults,model:{...existingModel?.primary?{primary:existingModel.primary}:void 0,fallbacks:selected,...opts.setDefault?{primary:selected[0]}:{}},...nextImageModel?{imageModel:nextImageModel}:{},models:nextModels};return{...cfg,agents:{...cfg.agents,defaults}}}),opts.json){runtime.log(JSON.stringify({selected,selectedImages,setDefault:!!opts.setDefault,setImage:!!opts.setImage,results,warnings:[]},null,2));return}logConfigUpdated(runtime),runtime.log(`Fallbacks: ${selected.join(`, `)}`),selectedImages.length>0&&runtime.log(`Image fallbacks: ${selectedImages.join(`, `)}`),opts.setDefault&&runtime.log(`Default model: ${selected[0]}`),opts.setImage&&selectedImages.length>0&&runtime.log(`Image model: ${selectedImages[0]}`)}async function modelsSetCommand(modelRaw,runtime){let updated=await updateConfig(cfg=>applyDefaultModelPrimaryUpdate({cfg,modelRaw,field:`model`}));logConfigUpdated(runtime),runtime.log(`Default model: ${updated.agents?.defaults?.model?.primary??modelRaw}`)}async function modelsSetImageCommand(modelRaw,runtime){let updated=await updateConfig(cfg=>applyDefaultModelPrimaryUpdate({cfg,modelRaw,field:`imageModel`}));logConfigUpdated(runtime),runtime.log(`Image model: ${updated.agents?.defaults?.imageModel?.primary??modelRaw}`)}export{modelsAliasesRemoveCommand as C,modelsAliasesListCommand as S,modelsAuthAddCommand as _,modelsListCommand as a,modelsAuthSetupTokenCommand as b,modelsImageFallbacksListCommand as c,modelsFallbacksClearCommand as d,modelsFallbacksListCommand as f,modelsAuthOrderSetCommand as g,modelsAuthOrderGetCommand as h,modelsStatusCommand as i,modelsImageFallbacksRemoveCommand as l,modelsAuthOrderClearCommand as m,modelsSetCommand as n,modelsImageFallbacksAddCommand as o,modelsFallbacksRemoveCommand as p,modelsScanCommand as r,modelsImageFallbacksClearCommand as s,modelsSetImageCommand as t,modelsFallbacksAddCommand as u,modelsAuthLoginCommand as v,modelsAliasesAddCommand as x,modelsAuthPasteTokenCommand as y};
@@ -1 +1 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-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"./auth-json-DLweJwGc.js";import"./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"./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{t as formatDocsLink}from"./links-B6LU5cXN.js";import{n as runCommandWithRuntime,t as resolveOptionFromCommand}from"./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"./note-BvXfFmlu.js";import"./clack-prompter-ZmHdfPGJ.js";import"./table-CiK88EDX.js";import"./shared-DjBPjC55.js";import"./onboard-auth.credentials-BSSFRvb0.js";import"./auth-token-DGaO7TMn.js";import"./logging-CRzk-5ye.js";import{c as githubCopilotLoginCommand}from"./provider-auth-helpers-ByvJdQT3.js";import{C as modelsAliasesRemoveCommand,S as modelsAliasesListCommand,_ as modelsAuthAddCommand,a as modelsListCommand,b as modelsAuthSetupTokenCommand,c as modelsImageFallbacksListCommand,d as modelsFallbacksClearCommand,f as modelsFallbacksListCommand,g as modelsAuthOrderSetCommand,h as modelsAuthOrderGetCommand,i as modelsStatusCommand,l as modelsImageFallbacksRemoveCommand,m as modelsAuthOrderClearCommand,n as modelsSetCommand,o as modelsImageFallbacksAddCommand,p as modelsFallbacksRemoveCommand,r as modelsScanCommand,s as modelsImageFallbacksClearCommand,t as modelsSetImageCommand,u as modelsFallbacksAddCommand,v as modelsAuthLoginCommand,x as modelsAliasesAddCommand,y as modelsAuthPasteTokenCommand}from"./models-PPv9KRbb.js";function runModelsCommand(action){return runCommandWithRuntime(defaultRuntime,action)}function registerModelsCli(program){let models=program.command(`models`).description(`Model discovery, scanning, and configuration`).option(`--status-json`,"Output JSON (alias for `models status --json`)",!1).option(`--status-plain`,"Plain output (alias for `models status --plain`)",!1).option(`--agent <id>`,`Agent id to inspect (overrides BUILDERFORCE_AGENTS_AGENT_DIR/PI_CODING_AGENT_DIR)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/models`,`docs.builderforce.ai/cli/models`)}\n`);models.command(`list`).description(`List models (configured by default)`).option(`--all`,`Show full model catalog`,!1).option(`--local`,`Filter to local models`,!1).option(`--provider <name>`,`Filter by provider`).option(`--json`,`Output JSON`,!1).option(`--plain`,`Plain line output`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsListCommand(opts,defaultRuntime)})}),models.command(`status`).description(`Show configured model state`).option(`--json`,`Output JSON`,!1).option(`--plain`,`Plain output`,!1).option(`--check`,`Exit non-zero if auth is expiring/expired (1=expired/missing, 2=expiring)`,!1).option(`--probe`,`Probe configured provider auth (live)`,!1).option(`--probe-provider <name>`,`Only probe a single provider`).option(`--probe-profile <id>`,`Only probe specific auth profile ids (repeat or comma-separated)`,(value,previous)=>{let next=Array.isArray(previous)?previous:previous?[previous]:[];return next.push(value),next}).option(`--probe-timeout <ms>`,`Per-probe timeout in ms`).option(`--probe-concurrency <n>`,`Concurrent probes`).option(`--probe-max-tokens <n>`,`Probe max tokens (best-effort)`).option(`--agent <id>`,`Agent id to inspect (overrides BUILDERFORCE_AGENTS_AGENT_DIR/PI_CODING_AGENT_DIR)`).action(async(opts,command)=>{let agent=resolveOptionFromCommand(command,`agent`)??opts.agent;await runModelsCommand(async()=>{await modelsStatusCommand({json:!!opts.json,plain:!!opts.plain,check:!!opts.check,probe:!!opts.probe,probeProvider:opts.probeProvider,probeProfile:opts.probeProfile,probeTimeout:opts.probeTimeout,probeConcurrency:opts.probeConcurrency,probeMaxTokens:opts.probeMaxTokens,agent},defaultRuntime)})}),models.command(`set`).description(`Set the default model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsSetCommand(model,defaultRuntime)})}),models.command(`set-image`).description(`Set the image model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsSetImageCommand(model,defaultRuntime)})});let aliases=models.command(`aliases`).description(`Manage model aliases`);aliases.command(`list`).description(`List model aliases`).option(`--json`,`Output JSON`,!1).option(`--plain`,`Plain output`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsAliasesListCommand(opts,defaultRuntime)})}),aliases.command(`add`).description(`Add or update a model alias`).argument(`<alias>`,`Alias name`).argument(`<model>`,`Model id or alias`).action(async(alias,model)=>{await runModelsCommand(async()=>{await modelsAliasesAddCommand(alias,model,defaultRuntime)})}),aliases.command(`remove`).description(`Remove a model alias`).argument(`<alias>`,`Alias name`).action(async alias=>{await runModelsCommand(async()=>{await modelsAliasesRemoveCommand(alias,defaultRuntime)})});let fallbacks=models.command(`fallbacks`).description(`Manage model fallback list`);fallbacks.command(`list`).description(`List fallback models`).option(`--json`,`Output JSON`,!1).option(`--plain`,`Plain output`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsFallbacksListCommand(opts,defaultRuntime)})}),fallbacks.command(`add`).description(`Add a fallback model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsFallbacksAddCommand(model,defaultRuntime)})}),fallbacks.command(`remove`).description(`Remove a fallback model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsFallbacksRemoveCommand(model,defaultRuntime)})}),fallbacks.command(`clear`).description(`Clear all fallback models`).action(async()=>{await runModelsCommand(async()=>{await modelsFallbacksClearCommand(defaultRuntime)})});let imageFallbacks=models.command(`image-fallbacks`).description(`Manage image model fallback list`);imageFallbacks.command(`list`).description(`List image fallback models`).option(`--json`,`Output JSON`,!1).option(`--plain`,`Plain output`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsImageFallbacksListCommand(opts,defaultRuntime)})}),imageFallbacks.command(`add`).description(`Add an image fallback model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsImageFallbacksAddCommand(model,defaultRuntime)})}),imageFallbacks.command(`remove`).description(`Remove an image fallback model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsImageFallbacksRemoveCommand(model,defaultRuntime)})}),imageFallbacks.command(`clear`).description(`Clear all image fallback models`).action(async()=>{await runModelsCommand(async()=>{await modelsImageFallbacksClearCommand(defaultRuntime)})}),models.command(`scan`).description(`Scan OpenRouter free models for tools + images`).option(`--min-params <b>`,`Minimum parameter size (billions)`).option(`--max-age-days <days>`,`Skip models older than N days`).option(`--provider <name>`,`Filter by provider prefix`).option(`--max-candidates <n>`,`Max fallback candidates`,`6`).option(`--timeout <ms>`,`Per-probe timeout in ms`).option(`--concurrency <n>`,`Probe concurrency`).option(`--no-probe`,`Skip live probes; list free candidates only`).option(`--yes`,`Accept defaults without prompting`,!1).option(`--no-input`,`Disable prompts (use defaults)`).option(`--set-default`,`Set agents.defaults.model to the first selection`,!1).option(`--set-image`,`Set agents.defaults.imageModel to the first image selection`,!1).option(`--json`,`Output JSON`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsScanCommand(opts,defaultRuntime)})}),models.action(async opts=>{await runModelsCommand(async()=>{await modelsStatusCommand({json:!!opts?.statusJson,plain:!!opts?.statusPlain,agent:opts?.agent},defaultRuntime)})});let auth=models.command(`auth`).description(`Manage model auth profiles`);auth.option(`--agent <id>`,`Agent id for auth order get/set/clear`),auth.action(()=>{auth.help()}),auth.command(`add`).description(`Interactive auth helper (setup-token or paste token)`).action(async()=>{await runModelsCommand(async()=>{await modelsAuthAddCommand({},defaultRuntime)})}),auth.command(`login`).description(`Run a provider plugin auth flow (OAuth/API key)`).option(`--provider <id>`,`Provider id registered by a plugin`).option(`--method <id>`,`Provider auth method id`).option(`--set-default`,`Apply the provider's default model recommendation`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsAuthLoginCommand({provider:opts.provider,method:opts.method,setDefault:!!opts.setDefault},defaultRuntime)})}),auth.command(`setup-token`).description(`Run a provider CLI to create/sync a token (TTY required)`).option(`--provider <name>`,`Provider id (default: anthropic)`).option(`--yes`,`Skip confirmation`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsAuthSetupTokenCommand({provider:opts.provider,yes:!!opts.yes},defaultRuntime)})}),auth.command(`paste-token`).description(`Paste a token into auth-profiles.json and update config`).requiredOption(`--provider <name>`,`Provider id (e.g. anthropic)`).option(`--profile-id <id>`,`Auth profile id (default: <provider>:manual)`).option(`--expires-in <duration>`,`Optional expiry duration (e.g. 365d, 12h). Stored as absolute expiresAt.`).action(async opts=>{await runModelsCommand(async()=>{await modelsAuthPasteTokenCommand({provider:opts.provider,profileId:opts.profileId,expiresIn:opts.expiresIn},defaultRuntime)})}),auth.command(`login-github-copilot`).description(`Login to GitHub Copilot via GitHub device flow (TTY required)`).option(`--profile-id <id>`,`Auth profile id (default: github-copilot:github)`).option(`--yes`,`Overwrite existing profile without prompting`,!1).action(async opts=>{await runModelsCommand(async()=>{await githubCopilotLoginCommand({profileId:opts.profileId,yes:!!opts.yes},defaultRuntime)})});let order=auth.command(`order`).description(`Manage per-agent auth profile order overrides`);order.command(`get`).description(`Show per-agent auth order override (from auth-profiles.json)`).requiredOption(`--provider <name>`,`Provider id (e.g. anthropic)`).option(`--agent <id>`,`Agent id (default: configured default agent)`).option(`--json`,`Output JSON`,!1).action(async(opts,command)=>{let agent=resolveOptionFromCommand(command,`agent`)??opts.agent;await runModelsCommand(async()=>{await modelsAuthOrderGetCommand({provider:opts.provider,agent,json:!!opts.json},defaultRuntime)})}),order.command(`set`).description(`Set per-agent auth order override (locks rotation to this list)`).requiredOption(`--provider <name>`,`Provider id (e.g. anthropic)`).option(`--agent <id>`,`Agent id (default: configured default agent)`).argument(`<profileIds...>`,`Auth profile ids (e.g. anthropic:default)`).action(async(profileIds,opts,command)=>{let agent=resolveOptionFromCommand(command,`agent`)??opts.agent;await runModelsCommand(async()=>{await modelsAuthOrderSetCommand({provider:opts.provider,agent,order:profileIds},defaultRuntime)})}),order.command(`clear`).description(`Clear per-agent auth order override (fall back to config/round-robin)`).requiredOption(`--provider <name>`,`Provider id (e.g. anthropic)`).option(`--agent <id>`,`Agent id (default: configured default agent)`).action(async(opts,command)=>{let agent=resolveOptionFromCommand(command,`agent`)??opts.agent;await runModelsCommand(async()=>{await modelsAuthOrderClearCommand({provider:opts.provider,agent},defaultRuntime)})})}export{registerModelsCli};
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-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"./auth-json-DLweJwGc.js";import"./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"./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{t as formatDocsLink}from"./links-B6LU5cXN.js";import{n as runCommandWithRuntime,t as resolveOptionFromCommand}from"./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"./note-BvXfFmlu.js";import"./clack-prompter-ZmHdfPGJ.js";import"./table-CiK88EDX.js";import"./shared-DjBPjC55.js";import"./onboard-auth.credentials-BSSFRvb0.js";import"./auth-token-DGaO7TMn.js";import"./logging-CRzk-5ye.js";import{c as githubCopilotLoginCommand}from"./provider-auth-helpers-u1GAP4Bi.js";import{C as modelsAliasesRemoveCommand,S as modelsAliasesListCommand,_ as modelsAuthAddCommand,a as modelsListCommand,b as modelsAuthSetupTokenCommand,c as modelsImageFallbacksListCommand,d as modelsFallbacksClearCommand,f as modelsFallbacksListCommand,g as modelsAuthOrderSetCommand,h as modelsAuthOrderGetCommand,i as modelsStatusCommand,l as modelsImageFallbacksRemoveCommand,m as modelsAuthOrderClearCommand,n as modelsSetCommand,o as modelsImageFallbacksAddCommand,p as modelsFallbacksRemoveCommand,r as modelsScanCommand,s as modelsImageFallbacksClearCommand,t as modelsSetImageCommand,u as modelsFallbacksAddCommand,v as modelsAuthLoginCommand,x as modelsAliasesAddCommand,y as modelsAuthPasteTokenCommand}from"./models-B6kkCBLd.js";function runModelsCommand(action){return runCommandWithRuntime(defaultRuntime,action)}function registerModelsCli(program){let models=program.command(`models`).description(`Model discovery, scanning, and configuration`).option(`--status-json`,"Output JSON (alias for `models status --json`)",!1).option(`--status-plain`,"Plain output (alias for `models status --plain`)",!1).option(`--agent <id>`,`Agent id to inspect (overrides BUILDERFORCE_AGENTS_AGENT_DIR/PI_CODING_AGENT_DIR)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/models`,`docs.builderforce.ai/cli/models`)}\n`);models.command(`list`).description(`List models (configured by default)`).option(`--all`,`Show full model catalog`,!1).option(`--local`,`Filter to local models`,!1).option(`--provider <name>`,`Filter by provider`).option(`--json`,`Output JSON`,!1).option(`--plain`,`Plain line output`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsListCommand(opts,defaultRuntime)})}),models.command(`status`).description(`Show configured model state`).option(`--json`,`Output JSON`,!1).option(`--plain`,`Plain output`,!1).option(`--check`,`Exit non-zero if auth is expiring/expired (1=expired/missing, 2=expiring)`,!1).option(`--probe`,`Probe configured provider auth (live)`,!1).option(`--probe-provider <name>`,`Only probe a single provider`).option(`--probe-profile <id>`,`Only probe specific auth profile ids (repeat or comma-separated)`,(value,previous)=>{let next=Array.isArray(previous)?previous:previous?[previous]:[];return next.push(value),next}).option(`--probe-timeout <ms>`,`Per-probe timeout in ms`).option(`--probe-concurrency <n>`,`Concurrent probes`).option(`--probe-max-tokens <n>`,`Probe max tokens (best-effort)`).option(`--agent <id>`,`Agent id to inspect (overrides BUILDERFORCE_AGENTS_AGENT_DIR/PI_CODING_AGENT_DIR)`).action(async(opts,command)=>{let agent=resolveOptionFromCommand(command,`agent`)??opts.agent;await runModelsCommand(async()=>{await modelsStatusCommand({json:!!opts.json,plain:!!opts.plain,check:!!opts.check,probe:!!opts.probe,probeProvider:opts.probeProvider,probeProfile:opts.probeProfile,probeTimeout:opts.probeTimeout,probeConcurrency:opts.probeConcurrency,probeMaxTokens:opts.probeMaxTokens,agent},defaultRuntime)})}),models.command(`set`).description(`Set the default model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsSetCommand(model,defaultRuntime)})}),models.command(`set-image`).description(`Set the image model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsSetImageCommand(model,defaultRuntime)})});let aliases=models.command(`aliases`).description(`Manage model aliases`);aliases.command(`list`).description(`List model aliases`).option(`--json`,`Output JSON`,!1).option(`--plain`,`Plain output`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsAliasesListCommand(opts,defaultRuntime)})}),aliases.command(`add`).description(`Add or update a model alias`).argument(`<alias>`,`Alias name`).argument(`<model>`,`Model id or alias`).action(async(alias,model)=>{await runModelsCommand(async()=>{await modelsAliasesAddCommand(alias,model,defaultRuntime)})}),aliases.command(`remove`).description(`Remove a model alias`).argument(`<alias>`,`Alias name`).action(async alias=>{await runModelsCommand(async()=>{await modelsAliasesRemoveCommand(alias,defaultRuntime)})});let fallbacks=models.command(`fallbacks`).description(`Manage model fallback list`);fallbacks.command(`list`).description(`List fallback models`).option(`--json`,`Output JSON`,!1).option(`--plain`,`Plain output`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsFallbacksListCommand(opts,defaultRuntime)})}),fallbacks.command(`add`).description(`Add a fallback model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsFallbacksAddCommand(model,defaultRuntime)})}),fallbacks.command(`remove`).description(`Remove a fallback model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsFallbacksRemoveCommand(model,defaultRuntime)})}),fallbacks.command(`clear`).description(`Clear all fallback models`).action(async()=>{await runModelsCommand(async()=>{await modelsFallbacksClearCommand(defaultRuntime)})});let imageFallbacks=models.command(`image-fallbacks`).description(`Manage image model fallback list`);imageFallbacks.command(`list`).description(`List image fallback models`).option(`--json`,`Output JSON`,!1).option(`--plain`,`Plain output`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsImageFallbacksListCommand(opts,defaultRuntime)})}),imageFallbacks.command(`add`).description(`Add an image fallback model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsImageFallbacksAddCommand(model,defaultRuntime)})}),imageFallbacks.command(`remove`).description(`Remove an image fallback model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsImageFallbacksRemoveCommand(model,defaultRuntime)})}),imageFallbacks.command(`clear`).description(`Clear all image fallback models`).action(async()=>{await runModelsCommand(async()=>{await modelsImageFallbacksClearCommand(defaultRuntime)})}),models.command(`scan`).description(`Scan OpenRouter free models for tools + images`).option(`--min-params <b>`,`Minimum parameter size (billions)`).option(`--max-age-days <days>`,`Skip models older than N days`).option(`--provider <name>`,`Filter by provider prefix`).option(`--max-candidates <n>`,`Max fallback candidates`,`6`).option(`--timeout <ms>`,`Per-probe timeout in ms`).option(`--concurrency <n>`,`Probe concurrency`).option(`--no-probe`,`Skip live probes; list free candidates only`).option(`--yes`,`Accept defaults without prompting`,!1).option(`--no-input`,`Disable prompts (use defaults)`).option(`--set-default`,`Set agents.defaults.model to the first selection`,!1).option(`--set-image`,`Set agents.defaults.imageModel to the first image selection`,!1).option(`--json`,`Output JSON`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsScanCommand(opts,defaultRuntime)})}),models.action(async opts=>{await runModelsCommand(async()=>{await modelsStatusCommand({json:!!opts?.statusJson,plain:!!opts?.statusPlain,agent:opts?.agent},defaultRuntime)})});let auth=models.command(`auth`).description(`Manage model auth profiles`);auth.option(`--agent <id>`,`Agent id for auth order get/set/clear`),auth.action(()=>{auth.help()}),auth.command(`add`).description(`Interactive auth helper (setup-token or paste token)`).action(async()=>{await runModelsCommand(async()=>{await modelsAuthAddCommand({},defaultRuntime)})}),auth.command(`login`).description(`Run a provider plugin auth flow (OAuth/API key)`).option(`--provider <id>`,`Provider id registered by a plugin`).option(`--method <id>`,`Provider auth method id`).option(`--set-default`,`Apply the provider's default model recommendation`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsAuthLoginCommand({provider:opts.provider,method:opts.method,setDefault:!!opts.setDefault},defaultRuntime)})}),auth.command(`setup-token`).description(`Run a provider CLI to create/sync a token (TTY required)`).option(`--provider <name>`,`Provider id (default: anthropic)`).option(`--yes`,`Skip confirmation`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsAuthSetupTokenCommand({provider:opts.provider,yes:!!opts.yes},defaultRuntime)})}),auth.command(`paste-token`).description(`Paste a token into auth-profiles.json and update config`).requiredOption(`--provider <name>`,`Provider id (e.g. anthropic)`).option(`--profile-id <id>`,`Auth profile id (default: <provider>:manual)`).option(`--expires-in <duration>`,`Optional expiry duration (e.g. 365d, 12h). Stored as absolute expiresAt.`).action(async opts=>{await runModelsCommand(async()=>{await modelsAuthPasteTokenCommand({provider:opts.provider,profileId:opts.profileId,expiresIn:opts.expiresIn},defaultRuntime)})}),auth.command(`login-github-copilot`).description(`Login to GitHub Copilot via GitHub device flow (TTY required)`).option(`--profile-id <id>`,`Auth profile id (default: github-copilot:github)`).option(`--yes`,`Overwrite existing profile without prompting`,!1).action(async opts=>{await runModelsCommand(async()=>{await githubCopilotLoginCommand({profileId:opts.profileId,yes:!!opts.yes},defaultRuntime)})});let order=auth.command(`order`).description(`Manage per-agent auth profile order overrides`);order.command(`get`).description(`Show per-agent auth order override (from auth-profiles.json)`).requiredOption(`--provider <name>`,`Provider id (e.g. anthropic)`).option(`--agent <id>`,`Agent id (default: configured default agent)`).option(`--json`,`Output JSON`,!1).action(async(opts,command)=>{let agent=resolveOptionFromCommand(command,`agent`)??opts.agent;await runModelsCommand(async()=>{await modelsAuthOrderGetCommand({provider:opts.provider,agent,json:!!opts.json},defaultRuntime)})}),order.command(`set`).description(`Set per-agent auth order override (locks rotation to this list)`).requiredOption(`--provider <name>`,`Provider id (e.g. anthropic)`).option(`--agent <id>`,`Agent id (default: configured default agent)`).argument(`<profileIds...>`,`Auth profile ids (e.g. anthropic:default)`).action(async(profileIds,opts,command)=>{let agent=resolveOptionFromCommand(command,`agent`)??opts.agent;await runModelsCommand(async()=>{await modelsAuthOrderSetCommand({provider:opts.provider,agent,order:profileIds},defaultRuntime)})}),order.command(`clear`).description(`Clear per-agent auth order override (fall back to config/round-robin)`).requiredOption(`--provider <name>`,`Provider id (e.g. anthropic)`).option(`--agent <id>`,`Agent id (default: configured default agent)`).action(async(opts,command)=>{let agent=resolveOptionFromCommand(command,`agent`)??opts.agent;await runModelsCommand(async()=>{await modelsAuthOrderClearCommand({provider:opts.provider,agent},defaultRuntime)})})}export{registerModelsCli};
@@ -1,2 +1,2 @@
1
- import{t as CONFIG_PATH}from"./paths-5FcIFMsj.js";import{B as theme,C as shortenHomePath,R as colorize,z as isRich$1}from"./utils-DbaBVFaK.js";import"./embedded-helpers-BrfnCpCe.js";import{Fr as ANTIGRAVITY_OPUS_46_FORWARD_COMPAT_CANDIDATES,Ir as resolveForwardCompatModel,Pr as resolveModel,Rr as describeFailoverError,ai as formatRemainingShort,ii as buildAuthHealthSummary,m as runEmbeddedAgent,ni as maskApiKey,ri as DEFAULT_OAUTH_WARN_MS}from"./reply-BsRbeUhd.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import{a as resolveAgentModelFallbacksOverride,c as resolveAgentWorkspaceDir,i as resolveAgentDir,k as resolveDefaultAgentWorkspaceDir,l as resolveDefaultAgentId,o as resolveAgentModelPrimary}from"./agent-scope-DPtjOxzp.js";import{Bt as listProfilesForProvider,Et as resolveAuthProfileOrder,Gt as ensureAuthProfileStore,Ht as setAuthProfileOrder,Q as nativeComplete,Ut as upsertAuthProfile,Xt as resolveBuilderForceAgentsAgentDir,Yt as resolveAuthStorePathForDisplay,_t as getModel,ct as resolveEnvApiKey,g as resolveModelRefFromString,gt as getEnvApiKey,ht as shouldEnableShellEnvFallback,i as findNormalizedProviderValue,it as getCustomProviderApiKey,jt as resolveProfileUnusableUntilForDisplay,l as normalizeProviderId,m as resolveDefaultModelForAgent,nn as resolveAuthProfileDisplayLabel,on as DEFAULT_MODEL,ot as resolveApiKeyForProvider,p as resolveConfiguredModelRef,r as buildModelAliasIndex,s as modelKey,sn as DEFAULT_PROVIDER,st as resolveAwsSdkEnvVarName,u as parseModelRef,ut as getShellEnvAppliedKeys}from"./model-selection-DX_WOc2P.js";import{t as formatCliCommand}from"./command-format-Dd7BgZsg.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import{r as loadConfig,y as parseDurationMs}from"./io-YzT_09GD.js";import"./manifest-registry-BVDm_CP0.js";import"./config-8x9ZIdfF.js";import"./runner-CfNJMPWu.js";import{a as discoverAuthStorage,o as discoverModels,r as loadModelCatalog,s as ensureBuilderForceAgentsModelsJson}from"./model-catalog-C7PdRY6w.js";import"./sandbox-DzuXOMNa.js";import"./chrome-Dk-WNIhp.js";import"./tailscale-B-VKIlWm.js";import"./auth-CDcrUXYB.js";import"./server-context-DsuST81W.js";import"./frontmatter-DyJ2unbL.js";import"./skills-B4r9m770.js";import"./plugin-skills-C39wi4uD.js";import"./routes-DoGqdgOP.js";import"./redact-C3oo7_aY.js";import"./errors-CjmtpPBP.js";import"./paths-C1QKdGJX.js";import"./ssrf-4MnoQ7Sz.js";import"./image-ops-CONrkLJK.js";import"./store-BoTKCB2d.js";import"./ports-BNC_iRpw.js";import"./trash-Czxs8cUf.js";import"./sessions-OZNhnSwZ.js";import"./message-channel-DrfCCUg4.js";import"./plugins-COtQnUML.js";import"./accounts-CTKk3xPO.js";import"./accounts-DFqpWzeU.js";import"./accounts-CbQihLRU.js";import"./bindings-DMDv84HS.js";import"./send-Dmzp1gNF.js";import"./send-DEgD1Cfd.js";import{i as resolveSessionTranscriptPath,s as resolveSessionTranscriptsDirForAgent}from"./paths-CkcK939O.js";import"./src-DxNC0IHE.js";import"./tool-images-DsKy1uNN.js";import"./tool-display-TRKLY-yH.js";import"./fetch-guard-BQuCLA1C.js";import"./api-key-rotation-ChHXb1Pq.js";import"./fetch-CDeJQlzN.js";import"./sqlite-DEiKj1vi.js";import"./tokens-Ct4DyfhX.js";import"./project-context-store-C8TROXjr.js";import"./with-timeout-YbYylXgf.js";import"./deliver-C5lVQcrs.js";import"./send-DlPwTVpG.js";import"./workspace-ChbaDWgp.js";import"./reply-prefix-BwtP84WV.js";import"./memory-cli-DWEtZrJ5.js";import"./manager-VPNjVm0W.js";import"./retry-Jis-ZZfm.js";import"./client-DhlZRznX.js";import"./call-DwWslKWv.js";import"./common-NHQnma5l.js";import"./chunk-h7FZEwW2.js";import"./markdown-tables-DOq8FfUr.js";import"./ir-AM9J0QtO.js";import"./render-CSLaFZoy.js";import"./builderforcellm-syscheck-DMjMJNFI.js";import"./send-DglIOKdS.js";import"./outbound-attachment-TWzrIR9Q.js";import"./fetch-B6_hd7w9.js";import"./delivery-queue-BZWZDdpJ.js";import"./channel-activity-qRD5c3VV.js";import"./tables-DirB1oU7.js";import"./pairing-store-DIpKOfDK.js";import{t as formatDocsLink}from"./links-CYRGsVCu.js";import{n as runCommandWithRuntime,t as resolveOptionFromCommand}from"./cli-utils-BLNnV_WG.js";import"./help-format-NhTn4dWd.js";import{r as withProgressTotals}from"./progress-OKwbfa23.js";import"./resolve-route-BvfmiLqC.js";import"./replies-BoxyKuBS.js";import"./refresh-DgTiir08.js";import"./coding-tools.policy-BJQuylwM.js";import"./send-BgdpJymE.js";import{d as openUrl}from"./onboard-helpers-CPmBeDvt.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BwwmGo3-.js";import"./pairing-labels-CELZqNBC.js";import"./session-cost-usage-pgxrRRW4.js";import{i as resolveUsageProviderId,r as formatUsageWindowSummary,t as loadProviderUsageSummary}from"./provider-usage-CbH7sm73.js";import"./active-listener-DBdxNyOd.js";import"./exec-approvals-kmxxyvIe.js";import"./nodes-screen-BWDONgPE.js";import"./project-context-Cnqfr64Z.js";import"./control-service-BhSaBRxC.js";import"./stagger-NaB6u1z1.js";import"./channel-selection-CQ5MM7Hi.js";import"./mamba-state-engine-Ck2JCfL6.js";import"./transformers-stream-QS2dnQob.js";import{t as ensureAuthJsonFromAuthProfiles}from"./auth-json-CDdxvLVq.js";import"./note-CvzMolLy.js";import{t as createClackPrompter}from"./clack-prompter-6Booc-eg.js";import{t as renderTable}from"./table-BKeTpiIp.js";import{t as inferParamBFromIdOrName}from"./model-param-b-B3MqwsZ2.js";import{n as redactSecrets}from"./format-BSpNzPhe.js";import{a as isLocalBaseUrl,c as normalizeAlias,d as resolveModelTarget,f as updateConfig,i as formatTokenK,l as resolveKnownAgentId,n as ensureFlagCompatibility,o as loadValidConfigOrThrow,r as formatMs,s as mergePrimaryFallbackConfig,t as applyDefaultModelPrimaryUpdate,u as resolveModelKeysFromEntries}from"./shared-eZqGzEHT.js";import"./onboard-auth.credentials-YrdiGOgn.js";import{d as applyAuthProfileConfig,n as validateAnthropicSetupToken}from"./auth-token-CWT7TW8z.js";import{n as logConfigUpdated}from"./logging-9jbJihk2.js";import{a as createVpsAwareOAuthHandlers,c as githubCopilotLoginCommand,i as resolveProviderMatch,n as mergeConfigPatch,o as isRemoteEnvironment,r as pickAuthMethod,s as resolvePluginProviders,t as applyDefaultModel}from"./provider-auth-helpers-DItSj71N.js";import path from"node:path";import crypto from"node:crypto";import fs from"node:fs/promises";import{Type}from"@sinclair/typebox";import{cancel,confirm,isCancel,multiselect,select,text}from"@clack/prompts";async function modelsAliasesListCommand(opts,runtime){ensureFlagCompatibility(opts);let models=loadConfig().agents?.defaults?.models??{},aliases=Object.entries(models).reduce((acc,[modelKey,entry])=>{let alias=entry?.alias?.trim();return alias&&(acc[alias]=modelKey),acc},{});if(opts.json){runtime.log(JSON.stringify({aliases},null,2));return}if(opts.plain){for(let[alias,target]of Object.entries(aliases))runtime.log(`${alias} ${target}`);return}if(runtime.log(`Aliases (${Object.keys(aliases).length}):`),Object.keys(aliases).length===0){runtime.log(`- none`);return}for(let[alias,target]of Object.entries(aliases))runtime.log(`- ${alias} -> ${target}`)}async function modelsAliasesAddCommand(aliasRaw,modelRaw,runtime){let alias=normalizeAlias(aliasRaw),resolved=resolveModelTarget({raw:modelRaw,cfg:loadConfig()});await updateConfig(cfg=>{let modelKey=`${resolved.provider}/${resolved.model}`,nextModels={...cfg.agents?.defaults?.models};for(let[key,entry]of Object.entries(nextModels)){let existing=entry?.alias?.trim();if(existing&&existing===alias&&key!==modelKey)throw Error(`Alias ${alias} already points to ${key}.`)}return nextModels[modelKey]={...nextModels[modelKey]??{},alias},{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,models:nextModels}}}}),logConfigUpdated(runtime),runtime.log(`Alias ${alias} -> ${resolved.provider}/${resolved.model}`)}async function modelsAliasesRemoveCommand(aliasRaw,runtime){let alias=normalizeAlias(aliasRaw),updated=await updateConfig(cfg=>{let nextModels={...cfg.agents?.defaults?.models},found=!1;for(let[key,entry]of Object.entries(nextModels))if(entry?.alias?.trim()===alias){nextModels[key]={...entry,alias:void 0},found=!0;break}if(!found)throw Error(`Alias not found: ${alias}`);return{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,models:nextModels}}}});logConfigUpdated(runtime),(!updated.agents?.defaults?.models||Object.values(updated.agents.defaults.models).every(entry=>!entry?.alias?.trim()))&&runtime.log(`No aliases configured.`)}const confirm$1=params=>confirm({...params,message:stylePromptMessage(params.message)}),text$1=params=>text({...params,message:stylePromptMessage(params.message)}),select$1=params=>select({...params,message:stylePromptMessage(params.message),options:params.options.map(opt=>opt.hint===void 0?opt:{...opt,hint:stylePromptHint(opt.hint)})});function resolveTokenProvider(raw){let trimmed=raw?.trim();return trimmed?normalizeProviderId(trimmed)===`anthropic`?`anthropic`:`custom`:null}function resolveDefaultTokenProfileId(provider){return`${normalizeProviderId(provider)}:manual`}async function modelsAuthSetupTokenCommand(opts,runtime){let provider=resolveTokenProvider(opts.provider??`anthropic`);if(provider!==`anthropic`)throw Error(`Only --provider anthropic is supported for setup-token.`);if(!process.stdin.isTTY)throw Error(`setup-token requires an interactive TTY.`);if(!opts.yes&&!await confirm$1({message:"Have you run `claude setup-token` and copied the token?",initialValue:!0}))return;let tokenInput=await text$1({message:`Paste Anthropic setup-token`,validate:value=>validateAnthropicSetupToken(String(value??``))}),token=String(tokenInput??``).trim(),profileId=resolveDefaultTokenProfileId(provider);upsertAuthProfile({profileId,credential:{type:`token`,provider,token}}),await updateConfig(cfg=>applyAuthProfileConfig(cfg,{profileId,provider,mode:`token`})),logConfigUpdated(runtime),runtime.log(`Auth profile: ${profileId} (${provider}/token)`)}async function modelsAuthPasteTokenCommand(opts,runtime){let rawProvider=opts.provider?.trim();if(!rawProvider)throw Error(`Missing --provider.`);let provider=normalizeProviderId(rawProvider),profileId=opts.profileId?.trim()||resolveDefaultTokenProfileId(provider),tokenInput=await text$1({message:`Paste token for ${provider}`,validate:value=>value?.trim()?void 0:`Required`}),token=String(tokenInput??``).trim(),expires=opts.expiresIn?.trim()&&opts.expiresIn.trim().length>0?Date.now()+parseDurationMs(String(opts.expiresIn??``).trim(),{defaultUnit:`d`}):void 0;upsertAuthProfile({profileId,credential:{type:`token`,provider,token,...expires?{expires}:{}}}),await updateConfig(cfg=>applyAuthProfileConfig(cfg,{profileId,provider,mode:`token`})),logConfigUpdated(runtime),runtime.log(`Auth profile: ${profileId} (${provider}/token)`)}async function modelsAuthAddCommand(_opts,runtime){let provider=await select$1({message:`Token provider`,options:[{value:`anthropic`,label:`anthropic`},{value:`custom`,label:`custom (type provider id)`}]}),providerId=provider===`custom`?normalizeProviderId(String(await text$1({message:`Provider id`,validate:value=>value?.trim()?void 0:`Required`}))):provider;if(await select$1({message:`Token method`,options:[...providerId===`anthropic`?[{value:`setup-token`,label:`setup-token (claude)`,hint:"Paste a setup-token from `claude setup-token`"}]:[],{value:`paste`,label:`paste token`}]})===`setup-token`){await modelsAuthSetupTokenCommand({provider:providerId},runtime);return}let profileIdDefault=resolveDefaultTokenProfileId(providerId);await modelsAuthPasteTokenCommand({provider:providerId,profileId:String(await text$1({message:`Profile id`,initialValue:profileIdDefault,validate:value=>value?.trim()?void 0:`Required`})).trim(),expiresIn:await confirm$1({message:`Does this token expire?`,initialValue:!1})?String(await text$1({message:`Expires in (duration)`,initialValue:`365d`,validate:value=>{try{parseDurationMs(String(value??``),{defaultUnit:`d`});return}catch{return`Invalid duration (e.g. 365d, 12h, 30m)`}}})).trim():void 0},runtime)}function resolveRequestedLoginProviderOrThrow(providers,rawProvider){let requested=rawProvider?.trim();if(!requested)return null;let matched=resolveProviderMatch(providers,requested);if(matched)return matched;let available=providers.map(provider=>provider.id).filter(Boolean).toSorted((a,b)=>a.localeCompare(b)),availableText=available.length>0?available.join(`, `):`(none)`;throw Error(`Unknown provider "${requested}". Loaded providers: ${availableText}. Verify plugins via \`${formatCliCommand(`builderforce plugins list --json`)}\`.`)}function credentialMode(credential){return credential.type===`api_key`?`api_key`:credential.type===`token`?`token`:`oauth`}async function modelsAuthLoginCommand(opts,runtime){if(!process.stdin.isTTY)throw Error(`models auth login requires an interactive TTY.`);let config=await loadValidConfigOrThrow(),defaultAgentId=resolveDefaultAgentId(config),agentDir=resolveAgentDir(config,defaultAgentId),workspaceDir=resolveAgentWorkspaceDir(config,defaultAgentId)??resolveDefaultAgentWorkspaceDir(),providers=resolvePluginProviders({config,workspaceDir});if(providers.length===0)throw Error(`No provider plugins found. Install one via \`${formatCliCommand(`builderforce plugins install`)}\`.`);let prompter=createClackPrompter(),selectedProvider=resolveRequestedLoginProviderOrThrow(providers,opts.provider)??await prompter.select({message:`Select a provider`,options:providers.map(provider=>({value:provider.id,label:provider.label,hint:provider.docsPath?`Docs: ${provider.docsPath}`:void 0}))}).then(id=>resolveProviderMatch(providers,String(id)));if(!selectedProvider)throw Error(`Unknown provider. Use --provider <id> to pick a provider plugin.`);let chosenMethod=pickAuthMethod(selectedProvider,opts.method)??(selectedProvider.auth.length===1?selectedProvider.auth[0]:await prompter.select({message:`Auth method for ${selectedProvider.label}`,options:selectedProvider.auth.map(method=>({value:method.id,label:method.label,hint:method.hint}))}).then(id=>selectedProvider.auth.find(method=>method.id===String(id))));if(!chosenMethod)throw Error(`Unknown auth method. Use --method <id> to select one.`);let isRemote=isRemoteEnvironment(),result=await chosenMethod.run({config,agentDir,workspaceDir,prompter,runtime,isRemote,openUrl:async url=>{await openUrl(url)},oauth:{createVpsAwareHandlers:params=>createVpsAwareOAuthHandlers(params)}});for(let profile of result.profiles)upsertAuthProfile({profileId:profile.profileId,credential:profile.credential,agentDir});await updateConfig(cfg=>{let next=cfg;result.configPatch&&(next=mergeConfigPatch(next,result.configPatch));for(let profile of result.profiles)next=applyAuthProfileConfig(next,{profileId:profile.profileId,provider:profile.credential.provider,mode:credentialMode(profile.credential)});return opts.setDefault&&result.defaultModel&&(next=applyDefaultModel(next,result.defaultModel)),next}),logConfigUpdated(runtime);for(let profile of result.profiles)runtime.log(`Auth profile: ${profile.profileId} (${profile.credential.provider}/${credentialMode(profile.credential)})`);result.defaultModel&&runtime.log(opts.setDefault?`Default model set to ${result.defaultModel}`:`Default model available: ${result.defaultModel} (use --set-default to apply)`),result.notes&&result.notes.length>0&&await prompter.note(result.notes.join(`
1
+ import{t as CONFIG_PATH}from"./paths-5FcIFMsj.js";import{B as theme,C as shortenHomePath,R as colorize,z as isRich$1}from"./utils-DbaBVFaK.js";import"./embedded-helpers-3FEGD_4b.js";import{Fr as ANTIGRAVITY_OPUS_46_FORWARD_COMPAT_CANDIDATES,Ir as resolveForwardCompatModel,Pr as resolveModel,Rr as describeFailoverError,ai as formatRemainingShort,ii as buildAuthHealthSummary,m as runEmbeddedAgent,ni as maskApiKey,ri as DEFAULT_OAUTH_WARN_MS}from"./reply-CpGH-3If.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import{a as resolveAgentModelFallbacksOverride,c as resolveAgentWorkspaceDir,i as resolveAgentDir,k as resolveDefaultAgentWorkspaceDir,l as resolveDefaultAgentId,o as resolveAgentModelPrimary}from"./agent-scope-DPtjOxzp.js";import{Bt as listProfilesForProvider,Et as resolveAuthProfileOrder,Gt as ensureAuthProfileStore,Ht as setAuthProfileOrder,Q as nativeComplete,Ut as upsertAuthProfile,Xt as resolveBuilderForceAgentsAgentDir,Yt as resolveAuthStorePathForDisplay,_t as getModel,ct as resolveEnvApiKey,g as resolveModelRefFromString,gt as getEnvApiKey,ht as shouldEnableShellEnvFallback,i as findNormalizedProviderValue,it as getCustomProviderApiKey,jt as resolveProfileUnusableUntilForDisplay,l as normalizeProviderId,m as resolveDefaultModelForAgent,nn as resolveAuthProfileDisplayLabel,on as DEFAULT_MODEL,ot as resolveApiKeyForProvider,p as resolveConfiguredModelRef,r as buildModelAliasIndex,s as modelKey,sn as DEFAULT_PROVIDER,st as resolveAwsSdkEnvVarName,u as parseModelRef,ut as getShellEnvAppliedKeys}from"./model-selection-DX_WOc2P.js";import{t as formatCliCommand}from"./command-format-Dd7BgZsg.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import{r as loadConfig,y as parseDurationMs}from"./io-YzT_09GD.js";import"./manifest-registry-BVDm_CP0.js";import"./config-8x9ZIdfF.js";import"./runner-C651oVfk.js";import{a as discoverAuthStorage,o as discoverModels,r as loadModelCatalog,s as ensureBuilderForceAgentsModelsJson}from"./model-catalog-C7PdRY6w.js";import"./sandbox-DzuXOMNa.js";import"./chrome-Dk-WNIhp.js";import"./tailscale-B-VKIlWm.js";import"./auth-CDcrUXYB.js";import"./server-context-DsuST81W.js";import"./frontmatter-DyJ2unbL.js";import"./skills-B4r9m770.js";import"./plugin-skills-C39wi4uD.js";import"./routes-DoGqdgOP.js";import"./redact-C3oo7_aY.js";import"./errors-CjmtpPBP.js";import"./paths-C1QKdGJX.js";import"./ssrf-4MnoQ7Sz.js";import"./image-ops-CONrkLJK.js";import"./store-BoTKCB2d.js";import"./ports-BNC_iRpw.js";import"./trash-Czxs8cUf.js";import"./sessions-OZNhnSwZ.js";import"./message-channel-DrfCCUg4.js";import"./plugins-COtQnUML.js";import"./accounts-CTKk3xPO.js";import"./accounts-DFqpWzeU.js";import"./accounts-CbQihLRU.js";import"./bindings-DMDv84HS.js";import"./send-Dmzp1gNF.js";import"./send-DEgD1Cfd.js";import{i as resolveSessionTranscriptPath,s as resolveSessionTranscriptsDirForAgent}from"./paths-CkcK939O.js";import"./src-D2-7sOAX.js";import"./tool-images-DsKy1uNN.js";import"./tool-display-TRKLY-yH.js";import"./fetch-guard-BQuCLA1C.js";import"./api-key-rotation-ChHXb1Pq.js";import"./fetch-CDeJQlzN.js";import"./sqlite-DEiKj1vi.js";import"./tokens-Ct4DyfhX.js";import"./project-context-store-BS994lZX.js";import"./with-timeout-YbYylXgf.js";import"./deliver-XGIFv80r.js";import"./send-DlPwTVpG.js";import"./workspace-ChbaDWgp.js";import"./reply-prefix-BwtP84WV.js";import"./memory-cli-DWEtZrJ5.js";import"./manager-VPNjVm0W.js";import"./retry-Jis-ZZfm.js";import"./client-DhlZRznX.js";import"./call-DwWslKWv.js";import"./common-NHQnma5l.js";import"./chunk-h7FZEwW2.js";import"./markdown-tables-DOq8FfUr.js";import"./ir-AM9J0QtO.js";import"./render-CSLaFZoy.js";import"./builderforcellm-syscheck-DGZKIwPC.js";import"./send-DglIOKdS.js";import"./outbound-attachment-TWzrIR9Q.js";import"./fetch-B6_hd7w9.js";import"./delivery-queue-BZWZDdpJ.js";import"./channel-activity-qRD5c3VV.js";import"./tables-DirB1oU7.js";import"./pairing-store-DIpKOfDK.js";import{t as formatDocsLink}from"./links-CYRGsVCu.js";import{n as runCommandWithRuntime,t as resolveOptionFromCommand}from"./cli-utils-BLNnV_WG.js";import"./help-format-NhTn4dWd.js";import{r as withProgressTotals}from"./progress-OKwbfa23.js";import"./resolve-route-BvfmiLqC.js";import"./replies-BoxyKuBS.js";import"./refresh-DgTiir08.js";import"./coding-tools.policy-BJQuylwM.js";import"./send-BgdpJymE.js";import{d as openUrl}from"./onboard-helpers-CPmBeDvt.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BwwmGo3-.js";import"./pairing-labels-CELZqNBC.js";import"./session-cost-usage-pgxrRRW4.js";import{i as resolveUsageProviderId,r as formatUsageWindowSummary,t as loadProviderUsageSummary}from"./provider-usage-CbH7sm73.js";import"./active-listener-DBdxNyOd.js";import"./exec-approvals-kmxxyvIe.js";import"./nodes-screen-BWDONgPE.js";import"./project-context-Cg0S9eFT.js";import"./control-service-BhSaBRxC.js";import"./stagger-NaB6u1z1.js";import"./channel-selection-CQ5MM7Hi.js";import"./mamba-state-engine-BloJzrxU.js";import"./transformers-stream-QS2dnQob.js";import{t as ensureAuthJsonFromAuthProfiles}from"./auth-json-CDdxvLVq.js";import"./note-CvzMolLy.js";import{t as createClackPrompter}from"./clack-prompter-6Booc-eg.js";import{t as renderTable}from"./table-BKeTpiIp.js";import{t as inferParamBFromIdOrName}from"./model-param-b-B3MqwsZ2.js";import{n as redactSecrets}from"./format-BSpNzPhe.js";import{a as isLocalBaseUrl,c as normalizeAlias,d as resolveModelTarget,f as updateConfig,i as formatTokenK,l as resolveKnownAgentId,n as ensureFlagCompatibility,o as loadValidConfigOrThrow,r as formatMs,s as mergePrimaryFallbackConfig,t as applyDefaultModelPrimaryUpdate,u as resolveModelKeysFromEntries}from"./shared-eZqGzEHT.js";import"./onboard-auth.credentials-YrdiGOgn.js";import{d as applyAuthProfileConfig,n as validateAnthropicSetupToken}from"./auth-token-CWT7TW8z.js";import{n as logConfigUpdated}from"./logging-9jbJihk2.js";import{a as createVpsAwareOAuthHandlers,c as githubCopilotLoginCommand,i as resolveProviderMatch,n as mergeConfigPatch,o as isRemoteEnvironment,r as pickAuthMethod,s as resolvePluginProviders,t as applyDefaultModel}from"./provider-auth-helpers-9Ut-MHV9.js";import path from"node:path";import crypto from"node:crypto";import fs from"node:fs/promises";import{Type}from"@sinclair/typebox";import{cancel,confirm,isCancel,multiselect,select,text}from"@clack/prompts";async function modelsAliasesListCommand(opts,runtime){ensureFlagCompatibility(opts);let models=loadConfig().agents?.defaults?.models??{},aliases=Object.entries(models).reduce((acc,[modelKey,entry])=>{let alias=entry?.alias?.trim();return alias&&(acc[alias]=modelKey),acc},{});if(opts.json){runtime.log(JSON.stringify({aliases},null,2));return}if(opts.plain){for(let[alias,target]of Object.entries(aliases))runtime.log(`${alias} ${target}`);return}if(runtime.log(`Aliases (${Object.keys(aliases).length}):`),Object.keys(aliases).length===0){runtime.log(`- none`);return}for(let[alias,target]of Object.entries(aliases))runtime.log(`- ${alias} -> ${target}`)}async function modelsAliasesAddCommand(aliasRaw,modelRaw,runtime){let alias=normalizeAlias(aliasRaw),resolved=resolveModelTarget({raw:modelRaw,cfg:loadConfig()});await updateConfig(cfg=>{let modelKey=`${resolved.provider}/${resolved.model}`,nextModels={...cfg.agents?.defaults?.models};for(let[key,entry]of Object.entries(nextModels)){let existing=entry?.alias?.trim();if(existing&&existing===alias&&key!==modelKey)throw Error(`Alias ${alias} already points to ${key}.`)}return nextModels[modelKey]={...nextModels[modelKey]??{},alias},{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,models:nextModels}}}}),logConfigUpdated(runtime),runtime.log(`Alias ${alias} -> ${resolved.provider}/${resolved.model}`)}async function modelsAliasesRemoveCommand(aliasRaw,runtime){let alias=normalizeAlias(aliasRaw),updated=await updateConfig(cfg=>{let nextModels={...cfg.agents?.defaults?.models},found=!1;for(let[key,entry]of Object.entries(nextModels))if(entry?.alias?.trim()===alias){nextModels[key]={...entry,alias:void 0},found=!0;break}if(!found)throw Error(`Alias not found: ${alias}`);return{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,models:nextModels}}}});logConfigUpdated(runtime),(!updated.agents?.defaults?.models||Object.values(updated.agents.defaults.models).every(entry=>!entry?.alias?.trim()))&&runtime.log(`No aliases configured.`)}const confirm$1=params=>confirm({...params,message:stylePromptMessage(params.message)}),text$1=params=>text({...params,message:stylePromptMessage(params.message)}),select$1=params=>select({...params,message:stylePromptMessage(params.message),options:params.options.map(opt=>opt.hint===void 0?opt:{...opt,hint:stylePromptHint(opt.hint)})});function resolveTokenProvider(raw){let trimmed=raw?.trim();return trimmed?normalizeProviderId(trimmed)===`anthropic`?`anthropic`:`custom`:null}function resolveDefaultTokenProfileId(provider){return`${normalizeProviderId(provider)}:manual`}async function modelsAuthSetupTokenCommand(opts,runtime){let provider=resolveTokenProvider(opts.provider??`anthropic`);if(provider!==`anthropic`)throw Error(`Only --provider anthropic is supported for setup-token.`);if(!process.stdin.isTTY)throw Error(`setup-token requires an interactive TTY.`);if(!opts.yes&&!await confirm$1({message:"Have you run `claude setup-token` and copied the token?",initialValue:!0}))return;let tokenInput=await text$1({message:`Paste Anthropic setup-token`,validate:value=>validateAnthropicSetupToken(String(value??``))}),token=String(tokenInput??``).trim(),profileId=resolveDefaultTokenProfileId(provider);upsertAuthProfile({profileId,credential:{type:`token`,provider,token}}),await updateConfig(cfg=>applyAuthProfileConfig(cfg,{profileId,provider,mode:`token`})),logConfigUpdated(runtime),runtime.log(`Auth profile: ${profileId} (${provider}/token)`)}async function modelsAuthPasteTokenCommand(opts,runtime){let rawProvider=opts.provider?.trim();if(!rawProvider)throw Error(`Missing --provider.`);let provider=normalizeProviderId(rawProvider),profileId=opts.profileId?.trim()||resolveDefaultTokenProfileId(provider),tokenInput=await text$1({message:`Paste token for ${provider}`,validate:value=>value?.trim()?void 0:`Required`}),token=String(tokenInput??``).trim(),expires=opts.expiresIn?.trim()&&opts.expiresIn.trim().length>0?Date.now()+parseDurationMs(String(opts.expiresIn??``).trim(),{defaultUnit:`d`}):void 0;upsertAuthProfile({profileId,credential:{type:`token`,provider,token,...expires?{expires}:{}}}),await updateConfig(cfg=>applyAuthProfileConfig(cfg,{profileId,provider,mode:`token`})),logConfigUpdated(runtime),runtime.log(`Auth profile: ${profileId} (${provider}/token)`)}async function modelsAuthAddCommand(_opts,runtime){let provider=await select$1({message:`Token provider`,options:[{value:`anthropic`,label:`anthropic`},{value:`custom`,label:`custom (type provider id)`}]}),providerId=provider===`custom`?normalizeProviderId(String(await text$1({message:`Provider id`,validate:value=>value?.trim()?void 0:`Required`}))):provider;if(await select$1({message:`Token method`,options:[...providerId===`anthropic`?[{value:`setup-token`,label:`setup-token (claude)`,hint:"Paste a setup-token from `claude setup-token`"}]:[],{value:`paste`,label:`paste token`}]})===`setup-token`){await modelsAuthSetupTokenCommand({provider:providerId},runtime);return}let profileIdDefault=resolveDefaultTokenProfileId(providerId);await modelsAuthPasteTokenCommand({provider:providerId,profileId:String(await text$1({message:`Profile id`,initialValue:profileIdDefault,validate:value=>value?.trim()?void 0:`Required`})).trim(),expiresIn:await confirm$1({message:`Does this token expire?`,initialValue:!1})?String(await text$1({message:`Expires in (duration)`,initialValue:`365d`,validate:value=>{try{parseDurationMs(String(value??``),{defaultUnit:`d`});return}catch{return`Invalid duration (e.g. 365d, 12h, 30m)`}}})).trim():void 0},runtime)}function resolveRequestedLoginProviderOrThrow(providers,rawProvider){let requested=rawProvider?.trim();if(!requested)return null;let matched=resolveProviderMatch(providers,requested);if(matched)return matched;let available=providers.map(provider=>provider.id).filter(Boolean).toSorted((a,b)=>a.localeCompare(b)),availableText=available.length>0?available.join(`, `):`(none)`;throw Error(`Unknown provider "${requested}". Loaded providers: ${availableText}. Verify plugins via \`${formatCliCommand(`builderforce plugins list --json`)}\`.`)}function credentialMode(credential){return credential.type===`api_key`?`api_key`:credential.type===`token`?`token`:`oauth`}async function modelsAuthLoginCommand(opts,runtime){if(!process.stdin.isTTY)throw Error(`models auth login requires an interactive TTY.`);let config=await loadValidConfigOrThrow(),defaultAgentId=resolveDefaultAgentId(config),agentDir=resolveAgentDir(config,defaultAgentId),workspaceDir=resolveAgentWorkspaceDir(config,defaultAgentId)??resolveDefaultAgentWorkspaceDir(),providers=resolvePluginProviders({config,workspaceDir});if(providers.length===0)throw Error(`No provider plugins found. Install one via \`${formatCliCommand(`builderforce plugins install`)}\`.`);let prompter=createClackPrompter(),selectedProvider=resolveRequestedLoginProviderOrThrow(providers,opts.provider)??await prompter.select({message:`Select a provider`,options:providers.map(provider=>({value:provider.id,label:provider.label,hint:provider.docsPath?`Docs: ${provider.docsPath}`:void 0}))}).then(id=>resolveProviderMatch(providers,String(id)));if(!selectedProvider)throw Error(`Unknown provider. Use --provider <id> to pick a provider plugin.`);let chosenMethod=pickAuthMethod(selectedProvider,opts.method)??(selectedProvider.auth.length===1?selectedProvider.auth[0]:await prompter.select({message:`Auth method for ${selectedProvider.label}`,options:selectedProvider.auth.map(method=>({value:method.id,label:method.label,hint:method.hint}))}).then(id=>selectedProvider.auth.find(method=>method.id===String(id))));if(!chosenMethod)throw Error(`Unknown auth method. Use --method <id> to select one.`);let isRemote=isRemoteEnvironment(),result=await chosenMethod.run({config,agentDir,workspaceDir,prompter,runtime,isRemote,openUrl:async url=>{await openUrl(url)},oauth:{createVpsAwareHandlers:params=>createVpsAwareOAuthHandlers(params)}});for(let profile of result.profiles)upsertAuthProfile({profileId:profile.profileId,credential:profile.credential,agentDir});await updateConfig(cfg=>{let next=cfg;result.configPatch&&(next=mergeConfigPatch(next,result.configPatch));for(let profile of result.profiles)next=applyAuthProfileConfig(next,{profileId:profile.profileId,provider:profile.credential.provider,mode:credentialMode(profile.credential)});return opts.setDefault&&result.defaultModel&&(next=applyDefaultModel(next,result.defaultModel)),next}),logConfigUpdated(runtime);for(let profile of result.profiles)runtime.log(`Auth profile: ${profile.profileId} (${profile.credential.provider}/${credentialMode(profile.credential)})`);result.defaultModel&&runtime.log(opts.setDefault?`Default model set to ${result.defaultModel}`:`Default model available: ${result.defaultModel} (use --set-default to apply)`),result.notes&&result.notes.length>0&&await prompter.note(result.notes.join(`
2
2
  `),`Provider notes`)}function resolveTargetAgent(cfg,raw){let agentId=resolveKnownAgentId({cfg,rawAgentId:raw})??resolveDefaultAgentId(cfg);return{agentId,agentDir:resolveAgentDir(cfg,agentId)}}function describeOrder(store,provider){let providerKey=normalizeProviderId(provider),order=store.order?.[providerKey];return Array.isArray(order)?order:[]}function resolveAuthOrderContext(opts){let rawProvider=opts.provider?.trim();if(!rawProvider)throw Error(`Missing --provider.`);let provider=normalizeProviderId(rawProvider),cfg=loadConfig(),{agentId,agentDir}=resolveTargetAgent(cfg,opts.agent);return{cfg,agentId,agentDir,provider}}async function modelsAuthOrderGetCommand(opts,runtime){let{agentId,agentDir,provider}=resolveAuthOrderContext(opts),order=describeOrder(await ensureAuthProfileStore(agentDir,{allowKeychainPrompt:!1}),provider);if(opts.json){runtime.log(JSON.stringify({agentId,agentDir,provider,authStorePath:shortenHomePath(`${agentDir}/auth-profiles.json`),order:order.length>0?order:null},null,2));return}runtime.log(`Agent: ${agentId}`),runtime.log(`Provider: ${provider}`),runtime.log(`Auth file: ${shortenHomePath(`${agentDir}/auth-profiles.json`)}`),runtime.log(order.length>0?`Order override: ${order.join(`, `)}`:`Order override: (none)`)}async function modelsAuthOrderClearCommand(opts,runtime){let{agentId,agentDir,provider}=resolveAuthOrderContext(opts);if(!await setAuthProfileOrder({agentDir,provider,order:null}))throw Error(`Failed to update auth-profiles.json (lock busy?).`);runtime.log(`Agent: ${agentId}`),runtime.log(`Provider: ${provider}`),runtime.log(`Cleared per-agent order override.`)}async function modelsAuthOrderSetCommand(opts,runtime){let{agentId,agentDir,provider}=resolveAuthOrderContext(opts),store=await ensureAuthProfileStore(agentDir,{allowKeychainPrompt:!1}),providerKey=provider,requested=(opts.order??[]).map(entry=>String(entry).trim()).filter(Boolean);if(requested.length===0)throw Error(`Missing profile ids. Provide one or more profile ids.`);for(let profileId of requested){let cred=store.profiles[profileId];if(!cred)throw Error(`Auth profile "${profileId}" not found in ${agentDir}.`);if(normalizeProviderId(cred.provider)!==providerKey)throw Error(`Auth profile "${profileId}" is for ${cred.provider}, not ${provider}.`)}let updated=await setAuthProfileOrder({agentDir,provider,order:requested});if(!updated)throw Error(`Failed to update auth-profiles.json (lock busy?).`);runtime.log(`Agent: ${agentId}`),runtime.log(`Provider: ${provider}`),runtime.log(`Order override: ${describeOrder(updated,provider).join(`, `)}`)}function getFallbacks(cfg,key){return cfg.agents?.defaults?.[key]?.fallbacks??[]}function patchDefaultsFallbacks(cfg,params){let existing=cfg.agents?.defaults?.[params.key];return{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,[params.key]:mergePrimaryFallbackConfig(existing,{fallbacks:params.fallbacks}),...params.models?{models:params.models}:void 0}}}}async function listFallbacksCommand(params,opts,runtime){ensureFlagCompatibility(opts);let fallbacks=getFallbacks(loadConfig(),params.key);if(opts.json){runtime.log(JSON.stringify({fallbacks},null,2));return}if(opts.plain){for(let entry of fallbacks)runtime.log(entry);return}if(runtime.log(`${params.label} (${fallbacks.length}):`),fallbacks.length===0){runtime.log(`- none`);return}for(let entry of fallbacks)runtime.log(`- ${entry}`)}async function addFallbackCommand(params,modelRaw,runtime){let updated=await updateConfig(cfg=>{let resolved=resolveModelTarget({raw:modelRaw,cfg}),targetKey=modelKey(resolved.provider,resolved.model),nextModels={...cfg.agents?.defaults?.models};nextModels[targetKey]||(nextModels[targetKey]={});let existing=getFallbacks(cfg,params.key);return resolveModelKeysFromEntries({cfg,entries:existing}).includes(targetKey)?cfg:patchDefaultsFallbacks(cfg,{key:params.key,fallbacks:[...existing,targetKey],models:nextModels})});logConfigUpdated(runtime),runtime.log(`${params.logPrefix}: ${getFallbacks(updated,params.key).join(`, `)}`)}async function removeFallbackCommand(params,modelRaw,runtime){let updated=await updateConfig(cfg=>{let resolved=resolveModelTarget({raw:modelRaw,cfg}),targetKey=modelKey(resolved.provider,resolved.model),aliasIndex=buildModelAliasIndex({cfg,defaultProvider:DEFAULT_PROVIDER}),existing=getFallbacks(cfg,params.key),filtered=existing.filter(entry=>{let resolvedEntry=resolveModelRefFromString({raw:String(entry??``),defaultProvider:DEFAULT_PROVIDER,aliasIndex});return resolvedEntry?modelKey(resolvedEntry.ref.provider,resolvedEntry.ref.model)!==targetKey:!0});if(filtered.length===existing.length)throw Error(`${params.notFoundLabel} not found: ${targetKey}`);return patchDefaultsFallbacks(cfg,{key:params.key,fallbacks:filtered})});logConfigUpdated(runtime),runtime.log(`${params.logPrefix}: ${getFallbacks(updated,params.key).join(`, `)}`)}async function clearFallbacksCommand(params,runtime){await updateConfig(cfg=>patchDefaultsFallbacks(cfg,{key:params.key,fallbacks:[]})),logConfigUpdated(runtime),runtime.log(params.clearedMessage)}async function modelsFallbacksListCommand(opts,runtime){return await listFallbacksCommand({label:`Fallbacks`,key:`model`},opts,runtime)}async function modelsFallbacksAddCommand(modelRaw,runtime){return await addFallbackCommand({label:`Fallbacks`,key:`model`,logPrefix:`Fallbacks`},modelRaw,runtime)}async function modelsFallbacksRemoveCommand(modelRaw,runtime){return await removeFallbackCommand({label:`Fallbacks`,key:`model`,notFoundLabel:`Fallback`,logPrefix:`Fallbacks`},modelRaw,runtime)}async function modelsFallbacksClearCommand(runtime){return await clearFallbacksCommand({key:`model`,clearedMessage:`Fallback list cleared.`},runtime)}async function modelsImageFallbacksListCommand(opts,runtime){return await listFallbacksCommand({label:`Image fallbacks`,key:`imageModel`},opts,runtime)}async function modelsImageFallbacksAddCommand(modelRaw,runtime){return await addFallbackCommand({label:`Image fallbacks`,key:`imageModel`,logPrefix:`Image fallbacks`},modelRaw,runtime)}async function modelsImageFallbacksRemoveCommand(modelRaw,runtime){return await removeFallbackCommand({label:`Image fallbacks`,key:`imageModel`,notFoundLabel:`Image fallback`,logPrefix:`Image fallbacks`},modelRaw,runtime)}async function modelsImageFallbacksClearCommand(runtime){return await clearFallbacksCommand({key:`imageModel`,clearedMessage:`Image fallback list cleared.`},runtime)}function resolveConfiguredEntries(cfg){let resolvedDefault=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),aliasIndex=buildModelAliasIndex({cfg,defaultProvider:DEFAULT_PROVIDER}),order=[],tagsByKey=new Map,aliasesByKey=new Map;for(let[key,aliases]of aliasIndex.byKey.entries())aliasesByKey.set(key,aliases);let addEntry=(ref,tag)=>{let key=modelKey(ref.provider,ref.model);tagsByKey.has(key)||(tagsByKey.set(key,new Set),order.push(key)),tagsByKey.get(key)?.add(tag)};addEntry(resolvedDefault,`default`);let modelConfig=cfg.agents?.defaults?.model,imageModelConfig=cfg.agents?.defaults?.imageModel,modelFallbacks=typeof modelConfig==`object`?modelConfig?.fallbacks??[]:[],imageFallbacks=typeof imageModelConfig==`object`?imageModelConfig?.fallbacks??[]:[],imagePrimary=imageModelConfig?.primary?.trim()??``;if(modelFallbacks.forEach((raw,idx)=>{let resolved=resolveModelRefFromString({raw:String(raw??``),defaultProvider:DEFAULT_PROVIDER,aliasIndex});resolved&&addEntry(resolved.ref,`fallback#${idx+1}`)}),imagePrimary){let resolved=resolveModelRefFromString({raw:imagePrimary,defaultProvider:DEFAULT_PROVIDER,aliasIndex});resolved&&addEntry(resolved.ref,`image`)}imageFallbacks.forEach((raw,idx)=>{let resolved=resolveModelRefFromString({raw:String(raw??``),defaultProvider:DEFAULT_PROVIDER,aliasIndex});resolved&&addEntry(resolved.ref,`img-fallback#${idx+1}`)});for(let key of Object.keys(cfg.agents?.defaults?.models??{})){let parsed=parseModelRef(String(key??``),DEFAULT_PROVIDER);parsed&&addEntry(parsed,`configured`)}return{entries:order.map(key=>{let slash=key.indexOf(`/`);return{key,ref:{provider:slash===-1?key:key.slice(0,slash),model:slash===-1?``:key.slice(slash+1)},tags:tagsByKey.get(key)??new Set,aliases:aliasesByKey.get(key)??[]}})}}const MODEL_AVAILABILITY_UNAVAILABLE_CODE=`MODEL_AVAILABILITY_UNAVAILABLE`;function formatErrorWithStack(err){return err instanceof Error?err.stack??`${err.name}: ${err.message}`:String(err)}function shouldFallbackToAuthHeuristics(err){return err instanceof Error?err.code===MODEL_AVAILABILITY_UNAVAILABLE_CODE:!1}const hasAuthForProvider=(provider,cfg,authStore)=>!cfg||!authStore?!1:!!(listProfilesForProvider(authStore,provider).length>0||provider===`amazon-bedrock`&&resolveAwsSdkEnvVarName()||resolveEnvApiKey(provider)||getCustomProviderApiKey(cfg,provider));function createAvailabilityUnavailableError(message){let err=Error(message);return err.code=MODEL_AVAILABILITY_UNAVAILABLE_CODE,err}function normalizeAvailabilityError(err){return shouldFallbackToAuthHeuristics(err)&&err instanceof Error?err:createAvailabilityUnavailableError(`Model availability unavailable: getAvailable() failed.\n${formatErrorWithStack(err)}`)}function validateAvailableModels(availableModels){if(!Array.isArray(availableModels))throw createAvailabilityUnavailableError(`Model availability unavailable: getAvailable() returned a non-array value.`);for(let model of availableModels)if(!model||typeof model!=`object`||typeof model.provider!=`string`||typeof model.id!=`string`)throw createAvailabilityUnavailableError(`Model availability unavailable: getAvailable() returned invalid model entries.`);return availableModels}function loadAvailableModels(registry){let availableModels;try{availableModels=registry.getAvailable()}catch(err){throw normalizeAvailabilityError(err)}try{return validateAvailableModels(availableModels)}catch(err){throw normalizeAvailabilityError(err)}}async function loadModelRegistry(cfg){await ensureBuilderForceAgentsModelsJson(cfg);let agentDir=resolveBuilderForceAgentsAgentDir();await ensureAuthJsonFromAuthProfiles(agentDir);let registry=discoverModels(discoverAuthStorage(agentDir),agentDir),appended=appendAntigravityForwardCompatModels(registry.getAll(),registry),models=appended.models,synthesizedForwardCompat=appended.synthesizedForwardCompat,availableKeys,availabilityErrorMessage;try{let availableModels=loadAvailableModels(registry);availableKeys=new Set(availableModels.map(model=>modelKey(model.provider,model.id)));for(let synthesized of synthesizedForwardCompat)hasAvailableTemplate(availableKeys,synthesized.templatePrefixes)&&availableKeys.add(synthesized.key)}catch(err){if(!shouldFallbackToAuthHeuristics(err))throw err;availableKeys=void 0,availabilityErrorMessage||=formatErrorWithStack(err)}return{registry,models,availableKeys,availabilityErrorMessage}}function appendAntigravityForwardCompatModels(models,modelRegistry){let nextModels=[...models],synthesizedForwardCompat=[];for(let candidate of ANTIGRAVITY_OPUS_46_FORWARD_COMPAT_CANDIDATES){let key=modelKey(`google-antigravity`,candidate.id);if(nextModels.some(model=>modelKey(model.provider,model.id)===key))continue;let fallback=resolveForwardCompatModel(`google-antigravity`,candidate.id,modelRegistry);fallback&&(nextModels.push(fallback),synthesizedForwardCompat.push({key,templatePrefixes:candidate.templatePrefixes}))}return{models:nextModels,synthesizedForwardCompat}}function hasAvailableTemplate(availableKeys,templatePrefixes){for(let key of availableKeys)if(templatePrefixes.some(prefix=>key.startsWith(prefix)))return!0;return!1}function toModelRow(params){let{model,key,tags,aliases=[],availableKeys,cfg,authStore}=params;if(!model)return{key,name:key,input:`-`,contextWindow:null,local:null,available:null,tags:[...tags,`missing`],missing:!0};let input=model.input.join(`+`)||`text`,local=isLocalBaseUrl(model.baseUrl),available=availableKeys===void 0?cfg&&authStore?hasAuthForProvider(model.provider,cfg,authStore):!1:availableKeys.has(modelKey(model.provider,model.id)),aliasTags=aliases.length>0?[`alias:${aliases.join(`,`)}`]:[],mergedTags=new Set(tags);if(aliasTags.length>0){for(let tag of mergedTags)(tag===`alias`||tag.startsWith(`alias:`))&&mergedTags.delete(tag);for(let tag of aliasTags)mergedTags.add(tag)}return{key,name:model.name||model.id,input,contextWindow:model.contextWindow??null,local,available,tags:Array.from(mergedTags),missing:!1}}const isRich=opts=>!!(isRich$1()&&!opts?.json&&!opts?.plain),pad=(value,size)=>value.padEnd(size),formatTag=(tag,rich)=>rich?tag===`default`?theme.success(tag):tag===`image`?theme.accentBright(tag):tag===`configured`?theme.accent(tag):tag===`missing`?theme.error(tag):tag.startsWith(`fallback#`)||tag.startsWith(`img-fallback#`)?theme.warn(tag):tag.startsWith(`alias:`)?theme.accentDim(tag):theme.muted(tag):tag,truncate=(value,max)=>value.length<=max?value:max<=3?value.slice(0,max):`${value.slice(0,max-3)}...`;function printModelTable(rows,runtime,opts={}){if(opts.json){runtime.log(JSON.stringify({count:rows.length,models:rows},null,2));return}if(opts.plain){for(let row of rows)runtime.log(row.key);return}let rich=isRich(opts),header=[pad(`Model`,42),pad(`Input`,10),pad(`Ctx`,8),pad(`Local`,5),pad(`Auth`,5),`Tags`].join(` `);runtime.log(rich?theme.heading(header):header);for(let row of rows){let keyLabel=pad(truncate(row.key,42),42),inputLabel=pad(row.input||`-`,10),ctxLabel=pad(formatTokenK(row.contextWindow),8),localLabel=pad(row.local===null?`-`:row.local?`yes`:`no`,5),authLabel=pad(row.available===null?`-`:row.available?`yes`:`no`,5),tagsLabel=row.tags.length>0?rich?row.tags.map(tag=>formatTag(tag,rich)).join(`,`):row.tags.join(`,`):``,coloredInput=colorize(rich,row.input.includes(`image`)?theme.accentBright:theme.info,inputLabel),coloredLocal=colorize(rich,row.local===null?theme.muted:row.local?theme.success:theme.muted,localLabel),coloredAuth=colorize(rich,row.available===null?theme.muted:row.available?theme.success:theme.error,authLabel),line=[rich?theme.accent(keyLabel):keyLabel,coloredInput,ctxLabel,coloredLocal,coloredAuth,tagsLabel].join(` `);runtime.log(line)}}async function modelsListCommand(opts,runtime){ensureFlagCompatibility(opts);let{loadConfig}=await import(`./config-CdG-6F5h.js`),cfg=loadConfig(),authStore=await ensureAuthProfileStore(),providerFilter=(()=>{let raw=opts.provider?.trim();if(raw)return parseModelRef(`${raw}/_`,DEFAULT_PROVIDER)?.provider??raw.toLowerCase()})(),models=[],modelRegistry,availableKeys,availabilityErrorMessage;try{let loaded=await loadModelRegistry(cfg);modelRegistry=loaded.registry,models=loaded.models,availableKeys=loaded.availableKeys,availabilityErrorMessage=loaded.availabilityErrorMessage}catch(err){runtime.error(`Model registry unavailable:\n${formatErrorWithStack(err)}`),process.exitCode=1;return}availabilityErrorMessage!==void 0&&runtime.error(`Model availability lookup failed; falling back to auth heuristics for discovered models: ${availabilityErrorMessage}`);let modelByKey=new Map(models.map(model=>[modelKey(model.provider,model.id),model])),{entries}=resolveConfiguredEntries(cfg),configuredByKey=new Map(entries.map(entry=>[entry.key,entry])),rows=[];if(opts.all){let sorted=[...models].toSorted((a,b)=>{let p=a.provider.localeCompare(b.provider);return p===0?a.id.localeCompare(b.id):p});for(let model of sorted){if(providerFilter&&model.provider.toLowerCase()!==providerFilter||opts.local&&!isLocalBaseUrl(model.baseUrl))continue;let key=modelKey(model.provider,model.id),configured=configuredByKey.get(key);rows.push(toModelRow({model,key,tags:configured?Array.from(configured.tags):[],aliases:configured?.aliases??[],availableKeys,cfg,authStore}))}}else for(let entry of entries){if(providerFilter&&entry.ref.provider.toLowerCase()!==providerFilter)continue;let model=modelByKey.get(entry.key);if(!model&&modelRegistry){let forwardCompat=resolveForwardCompatModel(entry.ref.provider,entry.ref.model,modelRegistry);forwardCompat&&(model=forwardCompat,modelByKey.set(entry.key,forwardCompat))}model||=resolveModel(entry.ref.provider,entry.ref.model,void 0,cfg).model,!(opts.local&&model&&!isLocalBaseUrl(model.baseUrl))&&(opts.local&&!model||rows.push(toModelRow({model,key:entry.key,tags:Array.from(entry.tags),aliases:entry.aliases,availableKeys,cfg,authStore})))}if(rows.length===0){runtime.log(`No models found.`);return}printModelTable(rows,runtime,opts)}function resolveProviderAuthOverview(params){let{provider,cfg,store}=params,now=Date.now(),profiles=listProfilesForProvider(store,provider),withUnusableSuffix=(base,profileId)=>{let unusableUntil=resolveProfileUnusableUntilForDisplay(store,profileId);if(!unusableUntil||now>=unusableUntil)return base;let stats=store.usageStats?.[profileId];return`${base} [${typeof stats?.disabledUntil==`number`&&now<stats.disabledUntil?`disabled${stats.disabledReason?`:${stats.disabledReason}`:``}`:`cooldown`} ${formatRemainingShort(unusableUntil-now)}]`},labels=profiles.map(profileId=>{let profile=store.profiles[profileId];if(!profile)return`${profileId}=missing`;if(profile.type===`api_key`)return withUnusableSuffix(`${profileId}=${maskApiKey(profile.key??``)}`,profileId);if(profile.type===`token`)return withUnusableSuffix(`${profileId}=token:${maskApiKey(profile.token)}`,profileId);let display=resolveAuthProfileDisplayLabel({cfg,store,profileId}),suffix=display===profileId?``:display.startsWith(profileId)?display.slice(profileId.length).trim():`(${display})`;return withUnusableSuffix(`${profileId}=OAuth${suffix?` ${suffix}`:``}`,profileId)}),oauthCount=profiles.filter(id=>store.profiles[id]?.type===`oauth`).length,tokenCount=profiles.filter(id=>store.profiles[id]?.type===`token`).length,apiKeyCount=profiles.filter(id=>store.profiles[id]?.type===`api_key`).length,envKey=resolveEnvApiKey(provider),customKey=getCustomProviderApiKey(cfg,provider);return{provider,effective:profiles.length>0?{kind:`profiles`,detail:shortenHomePath(resolveAuthStorePathForDisplay())}:envKey?{kind:`env`,detail:envKey.source.includes(`OAUTH_TOKEN`)||envKey.source.toLowerCase().includes(`oauth`)?`OAuth (env)`:maskApiKey(envKey.apiKey)}:customKey?{kind:`models.json`,detail:maskApiKey(customKey)}:{kind:`missing`,detail:`missing`},profiles:{count:profiles.length,oauth:oauthCount,token:tokenCount,apiKey:apiKeyCount,labels},...envKey?{env:{value:envKey.source.includes(`OAUTH_TOKEN`)||envKey.source.toLowerCase().includes(`oauth`)?`OAuth (env)`:maskApiKey(envKey.apiKey),source:envKey.source}}:{},...customKey?{modelsJson:{value:maskApiKey(customKey),source:`models.json: ${shortenHomePath(params.modelsPath)}`}}:{}}}const toStatus=reason=>reason?reason===`auth`?`auth`:reason===`rate_limit`?`rate_limit`:reason===`billing`?`billing`:reason===`timeout`?`timeout`:reason===`format`?`format`:`unknown`:`unknown`;function buildCandidateMap(modelCandidates){let map=new Map;for(let raw of modelCandidates){let parsed=parseModelRef(String(raw??``),DEFAULT_PROVIDER);if(!parsed)continue;let list=map.get(parsed.provider)??[];list.includes(parsed.model)||list.push(parsed.model),map.set(parsed.provider,list)}return map}function selectProbeModel(params){let{provider,candidates,catalog}=params,direct=candidates.get(provider);if(direct&&direct.length>0)return{provider,model:direct[0]};let fromCatalog=catalog.find(entry=>entry.provider===provider);return fromCatalog?{provider:fromCatalog.provider,model:fromCatalog.id}:null}async function buildProbeTargets(params){let{cfg,providers,modelCandidates,options}=params,store=await ensureAuthProfileStore(),providerFilter=options.provider?.trim(),providerFilterKey=providerFilter?normalizeProviderId(providerFilter):null,profileFilter=new Set((options.profileIds??[]).map(id=>id.trim()).filter(Boolean));return loadModelCatalog({config:cfg}).then(catalog=>{let candidates=buildCandidateMap(modelCandidates),targets=[],results=[];for(let provider of providers){let providerKey=normalizeProviderId(provider);if(providerFilterKey&&providerKey!==providerFilterKey)continue;let model=selectProbeModel({provider:providerKey,candidates,catalog}),profileIds=listProfilesForProvider(store,providerKey),explicitOrder=findNormalizedProviderValue(store.order,providerKey)??findNormalizedProviderValue(cfg?.auth?.order,providerKey),allowedProfiles=explicitOrder&&explicitOrder.length>0?new Set(resolveAuthProfileOrder({cfg,store,provider:providerKey})):null,filteredProfiles=profileFilter.size?profileIds.filter(id=>profileFilter.has(id)):profileIds;if(filteredProfiles.length>0){for(let profileId of filteredProfiles){let mode=store.profiles[profileId]?.type,label=resolveAuthProfileDisplayLabel({cfg,store,profileId});if(explicitOrder&&!explicitOrder.includes(profileId)){results.push({provider:providerKey,model:model?`${model.provider}/${model.model}`:void 0,profileId,label,source:`profile`,mode,status:`unknown`,error:`Excluded by auth.order for this provider.`});continue}if(allowedProfiles&&!allowedProfiles.has(profileId)){results.push({provider:providerKey,model:model?`${model.provider}/${model.model}`:void 0,profileId,label,source:`profile`,mode,status:`unknown`,error:`Auth profile credentials are missing or expired.`});continue}if(!model){results.push({provider:providerKey,model:void 0,profileId,label,source:`profile`,mode,status:`no_model`,error:`No model available for probe`});continue}targets.push({provider:providerKey,model,profileId,label,source:`profile`,mode})}continue}if(profileFilter.size>0)continue;let envKey=resolveEnvApiKey(providerKey),customKey=getCustomProviderApiKey(cfg,providerKey);if(!envKey&&!customKey)continue;let label=envKey?`env`:`models.json`,source=envKey?`env`:`models.json`,mode=envKey?.source.includes(`OAUTH_TOKEN`)?`oauth`:`api_key`;if(!model){results.push({provider:providerKey,model:void 0,label,source,mode,status:`no_model`,error:`No model available for probe`});continue}targets.push({provider:providerKey,model,label,source,mode})}return{targets,results}})}async function probeTarget(params){let{cfg,agentId,agentDir,workspaceDir,sessionDir,target,timeoutMs,maxTokens}=params;if(!target.model)return{provider:target.provider,model:void 0,profileId:target.profileId,label:target.label,source:target.source,mode:target.mode,status:`no_model`,error:`No model available for probe`};let sessionId=`probe-${target.provider}-${crypto.randomUUID()}`,sessionFile=resolveSessionTranscriptPath(sessionId,agentId);await fs.mkdir(sessionDir,{recursive:!0});let start=Date.now();try{return await runEmbeddedAgent({sessionId,sessionFile,agentId,workspaceDir,agentDir,config:cfg,prompt:`Reply with OK. Do not use tools.`,provider:target.model.provider,model:target.model.model,authProfileId:target.profileId,authProfileIdSource:target.profileId?`user`:void 0,timeoutMs,runId:`probe-${crypto.randomUUID()}`,lane:`auth-probe:${target.provider}:${target.profileId??target.source}`,thinkLevel:`off`,reasoningLevel:`off`,verboseLevel:`off`,streamParams:{maxTokens}}),{provider:target.provider,model:`${target.model.provider}/${target.model.model}`,profileId:target.profileId,label:target.label,source:target.source,mode:target.mode,status:`ok`,latencyMs:Date.now()-start}}catch(err){let described=describeFailoverError(err);return{provider:target.provider,model:`${target.model.provider}/${target.model.model}`,profileId:target.profileId,label:target.label,source:target.source,mode:target.mode,status:toStatus(described.reason),error:redactSecrets(described.message),latencyMs:Date.now()-start}}}async function runTargetsWithConcurrency(params){let{cfg,targets,timeoutMs,maxTokens,onProgress}=params,concurrency=Math.max(1,Math.min(targets.length||1,params.concurrency)),agentId=resolveDefaultAgentId(cfg),agentDir=resolveBuilderForceAgentsAgentDir(),workspaceDir=resolveAgentWorkspaceDir(cfg,agentId)??resolveDefaultAgentWorkspaceDir(),sessionDir=resolveSessionTranscriptsDirForAgent(agentId);await fs.mkdir(workspaceDir,{recursive:!0});let completed=0,results=Array.from({length:targets.length}),cursor=0,worker=async()=>{for(;;){let index=cursor;if(cursor+=1,index>=targets.length)return;let target=targets[index];onProgress?.({completed,total:targets.length,label:`Probing ${target.provider}${target.profileId?` (${target.label})`:``}`}),results[index]=await probeTarget({cfg,agentId,agentDir,workspaceDir,sessionDir,target,timeoutMs,maxTokens}),completed+=1,onProgress?.({completed,total:targets.length})}};return await Promise.all(Array.from({length:concurrency},()=>worker())),results.filter(entry=>!!entry)}async function runAuthProbes(params){let startedAt=Date.now(),plan=await buildProbeTargets({cfg:params.cfg,providers:params.providers,modelCandidates:params.modelCandidates,options:params.options}),totalTargets=plan.targets.length;params.onProgress?.({completed:0,total:totalTargets});let results=totalTargets?await runTargetsWithConcurrency({cfg:params.cfg,targets:plan.targets,timeoutMs:params.options.timeoutMs,maxTokens:params.options.maxTokens,concurrency:params.options.concurrency,onProgress:params.onProgress}):[],finishedAt=Date.now();return{startedAt,finishedAt,durationMs:finishedAt-startedAt,totalTargets,options:params.options,results:[...plan.results,...results]}}function formatProbeLatency(latencyMs){return!latencyMs&&latencyMs!==0?`-`:formatMs(latencyMs)}function sortProbeResults(results){return results.slice().toSorted((a,b)=>{let provider=a.provider.localeCompare(b.provider);if(provider!==0)return provider;let aLabel=a.label||a.profileId||``,bLabel=b.label||b.profileId||``;return aLabel.localeCompare(bLabel)})}function describeProbeSummary(summary){return summary.totalTargets===0?`No probe targets.`:`Probed ${summary.totalTargets} target${summary.totalTargets===1?``:`s`} in ${formatMs(summary.durationMs)}`}async function modelsStatusCommand(opts,runtime){if(ensureFlagCompatibility(opts),opts.plain&&opts.probe)throw Error(`--probe cannot be used with --plain output.`);let cfg=loadConfig(),agentId=resolveKnownAgentId({cfg,rawAgentId:opts.agent}),agentDir=agentId?resolveAgentDir(cfg,agentId):resolveBuilderForceAgentsAgentDir(),agentModelPrimary=agentId?resolveAgentModelPrimary(cfg,agentId):void 0,agentFallbacksOverride=agentId?resolveAgentModelFallbacksOverride(cfg,agentId):void 0,resolved=agentId?resolveDefaultModelForAgent({cfg,agentId}):resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),modelConfig=cfg.agents?.defaults?.model,imageConfig=cfg.agents?.defaults?.imageModel,rawDefaultsModel=typeof modelConfig==`string`?modelConfig.trim():modelConfig?.primary?.trim()??``,rawModel=agentModelPrimary??rawDefaultsModel,resolvedLabel=`${resolved.provider}/${resolved.model}`,defaultLabel=rawModel||resolvedLabel,defaultsFallbacks=typeof modelConfig==`object`?modelConfig?.fallbacks??[]:[],fallbacks=agentFallbacksOverride??defaultsFallbacks,imageModel=typeof imageConfig==`string`?imageConfig.trim():imageConfig?.primary?.trim()??``,imageFallbacks=typeof imageConfig==`object`?imageConfig?.fallbacks??[]:[],aliases=Object.entries(cfg.agents?.defaults?.models??{}).reduce((acc,[key,entry])=>{let alias=typeof entry?.alias==`string`?entry.alias.trim():void 0;return alias&&(acc[alias]=key),acc},{}),allowed=Object.keys(cfg.agents?.defaults?.models??{}),store=await ensureAuthProfileStore(agentDir),modelsPath=path.join(agentDir,`models.json`),providersFromStore=new Set(Object.values(store.profiles).map(profile=>profile.provider).filter(p=>!!p)),providersFromConfig=new Set(Object.keys(cfg.models?.providers??{}).map(p=>typeof p==`string`?p.trim():``).filter(Boolean)),providersFromModels=new Set,providersInUse=new Set;for(let raw of[defaultLabel,...fallbacks,imageModel,...imageFallbacks,...allowed]){let parsed=parseModelRef(String(raw??``),DEFAULT_PROVIDER);parsed?.provider&&providersFromModels.add(parsed.provider)}for(let raw of[defaultLabel,...fallbacks,imageModel,...imageFallbacks]){let parsed=parseModelRef(String(raw??``),DEFAULT_PROVIDER);parsed?.provider&&providersInUse.add(parsed.provider)}let providersFromEnv=new Set;for(let provider of[`anthropic`,`github-copilot`,`google-vertex`,`openai`,`google`,`groq`,`cerebras`,`xai`,`openrouter`,`zai`,`mistral`,`synthetic`])resolveEnvApiKey(provider)&&providersFromEnv.add(provider);let providers=Array.from(new Set([...providersFromStore,...providersFromConfig,...providersFromModels,...providersFromEnv])).map(p=>typeof p==`string`?p.trim():``).filter(Boolean).toSorted((a,b)=>a.localeCompare(b)),applied=getShellEnvAppliedKeys(),shellFallbackEnabled=shouldEnableShellEnvFallback(process.env)||cfg.env?.shellEnv?.enabled===!0,providerAuth=providers.map(provider=>resolveProviderAuthOverview({provider,cfg,store,modelsPath})).filter(entry=>entry.profiles.count>0||!!entry.env||!!entry.modelsJson),providerAuthMap=new Map(providerAuth.map(entry=>[entry.provider,entry])),missingProvidersInUse=Array.from(providersInUse).filter(provider=>!providerAuthMap.has(provider)).toSorted((a,b)=>a.localeCompare(b)),probeProfileIds=opts.probeProfile?(Array.isArray(opts.probeProfile)?opts.probeProfile:[opts.probeProfile]).flatMap(value=>String(value??``).split(`,`)).map(value=>value.trim()).filter(Boolean):[],probeTimeoutMs=opts.probeTimeout?Number(opts.probeTimeout):8e3;if(!Number.isFinite(probeTimeoutMs)||probeTimeoutMs<=0)throw Error(`--probe-timeout must be a positive number (ms).`);let probeConcurrency=opts.probeConcurrency?Number(opts.probeConcurrency):2;if(!Number.isFinite(probeConcurrency)||probeConcurrency<=0)throw Error(`--probe-concurrency must be > 0.`);let probeMaxTokens=opts.probeMaxTokens?Number(opts.probeMaxTokens):8;if(!Number.isFinite(probeMaxTokens)||probeMaxTokens<=0)throw Error(`--probe-max-tokens must be > 0.`);let aliasIndex=buildModelAliasIndex({cfg,defaultProvider:DEFAULT_PROVIDER}),modelCandidates=[rawModel||resolvedLabel,...fallbacks,imageModel,...imageFallbacks,...allowed].filter(Boolean).map(raw=>resolveModelRefFromString({raw:String(raw??``),defaultProvider:DEFAULT_PROVIDER,aliasIndex})?.ref).filter(ref=>!!ref).map(ref=>`${ref.provider}/${ref.model}`),probeSummary;opts.probe&&(probeSummary=await withProgressTotals({label:`Probing auth profiles…`,total:1},async update=>await runAuthProbes({cfg,providers,modelCandidates,options:{provider:opts.probeProvider,profileIds:probeProfileIds,timeoutMs:probeTimeoutMs,concurrency:probeConcurrency,maxTokens:probeMaxTokens},onProgress:update})));let providersWithOauth=providerAuth.filter(entry=>entry.profiles.oauth>0||entry.profiles.token>0||entry.env?.value===`OAuth (env)`).map(entry=>{let count=entry.profiles.oauth+entry.profiles.token+(entry.env?.value===`OAuth (env)`?1:0);return`${entry.provider} (${count})`}),authHealth=buildAuthHealthSummary({store,cfg,warnAfterMs:DEFAULT_OAUTH_WARN_MS,providers}),oauthProfiles=authHealth.profiles.filter(profile=>profile.type===`oauth`||profile.type===`token`),unusableProfiles=(()=>{let now=Date.now(),out=[];for(let profileId of Object.keys(store.usageStats??{})){let unusableUntil=resolveProfileUnusableUntilForDisplay(store,profileId);if(!unusableUntil||now>=unusableUntil)continue;let stats=store.usageStats?.[profileId],kind=typeof stats?.disabledUntil==`number`&&now<stats.disabledUntil?`disabled`:`cooldown`;out.push({profileId,provider:store.profiles[profileId]?.provider,kind,reason:stats?.disabledReason,until:unusableUntil,remainingMs:unusableUntil-now})}return out.toSorted((a,b)=>a.remainingMs-b.remainingMs)})(),checkStatus=(()=>{let hasExpiredOrMissing=oauthProfiles.some(profile=>[`expired`,`missing`].includes(profile.status))||missingProvidersInUse.length>0,hasExpiring=oauthProfiles.some(profile=>profile.status===`expiring`);return hasExpiredOrMissing?1:hasExpiring?2:0})();if(opts.json){runtime.log(JSON.stringify({configPath:CONFIG_PATH,...agentId?{agentId}:{},agentDir,defaultModel:defaultLabel,resolvedDefault:resolvedLabel,fallbacks,imageModel:imageModel||null,imageFallbacks,...agentId?{modelConfig:{defaultSource:agentModelPrimary?`agent`:`defaults`,fallbacksSource:agentFallbacksOverride===void 0?`defaults`:`agent`}}:{},aliases,allowed,auth:{storePath:resolveAuthStorePathForDisplay(agentDir),shellEnvFallback:{enabled:shellFallbackEnabled,appliedKeys:applied},providersWithOAuth:providersWithOauth,missingProvidersInUse,providers:providerAuth,unusableProfiles,oauth:{warnAfterMs:authHealth.warnAfterMs,profiles:authHealth.profiles,providers:authHealth.providers},probes:probeSummary}},null,2)),opts.check&&runtime.exit(checkStatus);return}if(opts.plain){runtime.log(resolvedLabel),opts.check&&runtime.exit(checkStatus);return}let rich=isRich(opts),label=value=>colorize(rich,theme.accent,value.padEnd(14)),labelWithSource=(value,source)=>label(source?`${value} (${source})`:value),displayDefault=rawModel&&rawModel!==resolvedLabel?`${resolvedLabel} (from ${rawModel})`:resolvedLabel;runtime.log(`${label(`Config`)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,theme.info,shortenHomePath(CONFIG_PATH))}`),runtime.log(`${label(`Agent dir`)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,theme.info,shortenHomePath(agentDir))}`),runtime.log(`${labelWithSource(`Default`,agentId?agentModelPrimary?`agent`:`defaults`:void 0)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,theme.success,displayDefault)}`),runtime.log(`${labelWithSource(`Fallbacks (${fallbacks.length||0})`,agentId?agentFallbacksOverride===void 0?`defaults`:`agent`:void 0)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,fallbacks.length?theme.warn:theme.muted,fallbacks.length?fallbacks.join(`, `):`-`)}`),runtime.log(`${labelWithSource(`Image model`,agentId?`defaults`:void 0)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,imageModel?theme.accentBright:theme.muted,imageModel||`-`)}`),runtime.log(`${labelWithSource(`Image fallbacks (${imageFallbacks.length||0})`,agentId?`defaults`:void 0)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,imageFallbacks.length?theme.accentBright:theme.muted,imageFallbacks.length?imageFallbacks.join(`, `):`-`)}`),runtime.log(`${label(`Aliases (${Object.keys(aliases).length||0})`)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,Object.keys(aliases).length?theme.accent:theme.muted,Object.keys(aliases).length?Object.entries(aliases).map(([alias,target])=>rich?`${theme.accentDim(alias)} ${theme.muted(`->`)} ${theme.info(target)}`:`${alias} -> ${target}`).join(`, `):`-`)}`),runtime.log(`${label(`Configured models (${allowed.length||0})`)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,allowed.length?theme.info:theme.muted,allowed.length?allowed.join(`, `):`all`)}`),runtime.log(``),runtime.log(colorize(rich,theme.heading,`Auth overview`)),runtime.log(`${label(`Auth store`)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,theme.info,shortenHomePath(resolveAuthStorePathForDisplay(agentDir)))}`),runtime.log(`${label(`Shell env`)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,shellFallbackEnabled?theme.success:theme.muted,shellFallbackEnabled?`on`:`off`)}${applied.length?colorize(rich,theme.muted,` (applied: ${applied.join(`, `)})`):``}`),runtime.log(`${label(`Providers w/ OAuth/tokens (${providersWithOauth.length||0})`)}${colorize(rich,theme.muted,`:`)} ${colorize(rich,providersWithOauth.length?theme.info:theme.muted,providersWithOauth.length?providersWithOauth.join(`, `):`-`)}`);let formatKey=key=>colorize(rich,theme.warn,key),formatKeyValue=(key,value)=>`${formatKey(key)}=${colorize(rich,theme.info,value)}`,formatSeparator=()=>colorize(rich,theme.muted,` | `);for(let entry of providerAuth){let separator=formatSeparator(),bits=[];bits.push(formatKeyValue(`effective`,`${colorize(rich,theme.accentBright,entry.effective.kind)}:${colorize(rich,theme.muted,entry.effective.detail)}`)),entry.profiles.count>0&&(bits.push(formatKeyValue(`profiles`,`${entry.profiles.count} (oauth=${entry.profiles.oauth}, token=${entry.profiles.token}, api_key=${entry.profiles.apiKey})`)),entry.profiles.labels.length>0&&bits.push(colorize(rich,theme.info,entry.profiles.labels.join(`, `)))),entry.env&&bits.push(formatKeyValue(`env`,`${entry.env.value}${separator}${formatKeyValue(`source`,entry.env.source)}`)),entry.modelsJson&&bits.push(formatKeyValue(`models.json`,`${entry.modelsJson.value}${separator}${formatKeyValue(`source`,entry.modelsJson.source)}`)),runtime.log(`- ${theme.heading(entry.provider)} ${bits.join(separator)}`)}if(missingProvidersInUse.length>0){runtime.log(``),runtime.log(colorize(rich,theme.heading,`Missing auth`));for(let provider of missingProvidersInUse){let hint=provider===`anthropic`?`Run \`claude setup-token\`, then \`${formatCliCommand(`builderforce models auth setup-token`)}\` or \`${formatCliCommand(`builderforce configure`)}\`.`:`Run \`${formatCliCommand(`builderforce configure`)}\` or set an API key env var.`;runtime.log(`- ${theme.heading(provider)} ${hint}`)}}if(runtime.log(``),runtime.log(colorize(rich,theme.heading,`OAuth/token status`)),oauthProfiles.length===0)runtime.log(colorize(rich,theme.muted,`- none`));else{let usageByProvider=new Map,usageProviders=Array.from(new Set(oauthProfiles.map(profile=>resolveUsageProviderId(profile.provider)).filter(provider=>!!provider)));if(usageProviders.length>0)try{let usageSummary=await loadProviderUsageSummary({providers:usageProviders,agentDir,timeoutMs:3500});for(let snapshot of usageSummary.providers){let formatted=formatUsageWindowSummary(snapshot,{now:Date.now(),maxWindows:2,includeResets:!0});formatted&&usageByProvider.set(snapshot.provider,formatted)}}catch{}let formatStatus=status=>status===`ok`?colorize(rich,theme.success,`ok`):status===`static`?colorize(rich,theme.muted,`static`):status===`expiring`?colorize(rich,theme.warn,`expiring`):status===`missing`?colorize(rich,theme.warn,`unknown`):colorize(rich,theme.error,`expired`),profilesByProvider=new Map;for(let profile of oauthProfiles){let current=profilesByProvider.get(profile.provider);current?current.push(profile):profilesByProvider.set(profile.provider,[profile])}for(let[provider,profiles]of profilesByProvider){let usageKey=resolveUsageProviderId(provider),usage=usageKey?usageByProvider.get(usageKey):void 0,usageSuffix=usage?colorize(rich,theme.muted,` usage: ${usage}`):``;runtime.log(`- ${colorize(rich,theme.heading,provider)}${usageSuffix}`);for(let profile of profiles){let labelText=profile.label||profile.profileId,label=colorize(rich,theme.accent,labelText),status=formatStatus(profile.status),expiry=profile.status===`static`?``:profile.expiresAt?` expires in ${formatRemainingShort(profile.remainingMs)}`:` expires unknown`;runtime.log(` - ${label} ${status}${expiry}`)}}}if(probeSummary)if(runtime.log(``),runtime.log(colorize(rich,theme.heading,`Auth probes`)),probeSummary.results.length===0)runtime.log(colorize(rich,theme.muted,`- none`));else{let tableWidth=Math.max(60,(process.stdout.columns??120)-1),sorted=sortProbeResults(probeSummary.results),statusColor=status=>status===`ok`?theme.success:status===`rate_limit`||status===`timeout`||status===`billing`?theme.warn:status===`auth`||status===`format`?theme.error:theme.muted,rows=sorted.map(result=>{let status=colorize(rich,statusColor(result.status),result.status),latency=formatProbeLatency(result.latencyMs),modelLabel=result.model??`${result.provider}/-`,modeLabel=result.mode?` ${colorize(rich,theme.muted,`(${result.mode})`)}`:``,profile=`${colorize(rich,theme.accent,result.label)}${modeLabel}`,detail=result.error?.trim(),detailLabel=detail?`\n${colorize(rich,theme.muted,`↳ ${detail}`)}`:``,statusLabel=`${status}${colorize(rich,theme.muted,` · ${latency}`)}${detailLabel}`;return{Model:colorize(rich,theme.heading,modelLabel),Profile:profile,Status:statusLabel}});runtime.log(renderTable({width:tableWidth,columns:[{key:`Model`,header:`Model`,minWidth:18},{key:`Profile`,header:`Profile`,minWidth:24},{key:`Status`,header:`Status`,minWidth:12}],rows}).trimEnd()),runtime.log(colorize(rich,theme.muted,describeProbeSummary(probeSummary)))}opts.check&&runtime.exit(checkStatus)}const TOOL_PING={name:`ping`,description:`Return OK.`,parameters:Type.Object({})};function normalizeCreatedAtMs(value){return typeof value!=`number`||!Number.isFinite(value)||value<=0?null:value>0xe8d4a51000?Math.round(value):Math.round(value*1e3)}function parseModality(modality){return modality&&modality.toLowerCase().split(/[^a-z]+/).filter(Boolean).includes(`image`)?[`text`,`image`]:[`text`]}function parseNumberString(value){if(typeof value==`number`&&Number.isFinite(value))return value;if(typeof value!=`string`)return null;let trimmed=value.trim();if(!trimmed)return null;let num=Number(trimmed);return Number.isFinite(num)?num:null}function parseOpenRouterPricing(value){if(!value||typeof value!=`object`)return null;let obj=value,prompt=parseNumberString(obj.prompt),completion=parseNumberString(obj.completion),request=parseNumberString(obj.request)??0,image=parseNumberString(obj.image)??0,webSearch=parseNumberString(obj.web_search)??0,internalReasoning=parseNumberString(obj.internal_reasoning)??0;return prompt===null||completion===null?null:{prompt,completion,request,image,webSearch,internalReasoning}}function isFreeOpenRouterModel(entry){return entry.id.endsWith(`:free`)?!0:entry.pricing?entry.pricing.prompt===0&&entry.pricing.completion===0:!1}async function withTimeout(timeoutMs,fn){let controller=new AbortController,timer=setTimeout(controller.abort.bind(controller),timeoutMs);try{return await fn(controller.signal)}finally{clearTimeout(timer)}}async function fetchOpenRouterModels(fetchImpl){let res=await fetchImpl(`https://openrouter.ai/api/v1/models`,{headers:{Accept:`application/json`}});if(!res.ok)throw Error(`OpenRouter /models failed: HTTP ${res.status}`);let payload=await res.json();return(Array.isArray(payload.data)?payload.data:[]).map(entry=>{if(!entry||typeof entry!=`object`)return null;let obj=entry,id=typeof obj.id==`string`?obj.id.trim():``;if(!id)return null;let name=typeof obj.name==`string`&&obj.name.trim()?obj.name.trim():id,contextLength=typeof obj.context_length==`number`&&Number.isFinite(obj.context_length)?obj.context_length:null,maxCompletionTokens=typeof obj.max_completion_tokens==`number`&&Number.isFinite(obj.max_completion_tokens)?obj.max_completion_tokens:typeof obj.max_output_tokens==`number`&&Number.isFinite(obj.max_output_tokens)?obj.max_output_tokens:null,supportedParameters=Array.isArray(obj.supported_parameters)?obj.supported_parameters.filter(value=>typeof value==`string`).map(value=>value.trim()).filter(Boolean):[];return{id,name,contextLength,maxCompletionTokens,supportedParameters,supportedParametersCount:supportedParameters.length,supportsToolsMeta:supportedParameters.includes(`tools`),modality:typeof obj.modality==`string`&&obj.modality.trim()?obj.modality.trim():null,inferredParamB:inferParamBFromIdOrName(`${id} ${name}`),createdAtMs:normalizeCreatedAtMs(obj.created_at),pricing:parseOpenRouterPricing(obj.pricing)}}).filter(entry=>!!entry)}async function probeTool(model,apiKey,timeoutMs){let context={messages:[{role:`user`,content:`Call the ping tool with {} and nothing else.`,timestamp:Date.now()}],tools:[TOOL_PING]},startedAt=Date.now();try{return(await withTimeout(timeoutMs,signal=>nativeComplete({baseUrl:model.baseUrl,apiKey,defaultModel:model.id},{model:model.id,messages:context.messages.map(m=>({role:m.role,content:m.content})),tools:context.tools?.map(t=>({type:`function`,function:{name:t.name,description:t.description,parameters:t.parameters}})),temperature:0,extra:{max_tokens:32,tool_choice:`required`}},signal))).toolCalls.length>0?{ok:!0,latencyMs:Date.now()-startedAt}:{ok:!1,latencyMs:Date.now()-startedAt,error:`No tool call returned`}}catch(err){return{ok:!1,latencyMs:Date.now()-startedAt,error:err instanceof Error?err.message:String(err)}}}async function probeImage(model,apiKey,timeoutMs){let context={messages:[{role:`user`,content:[{type:`text`,text:`Reply with OK.`},{type:`image`,data:`iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+X3mIAAAAASUVORK5CYII=`,mimeType:`image/png`}],timestamp:Date.now()}]},startedAt=Date.now();try{return await withTimeout(timeoutMs,signal=>nativeComplete({baseUrl:model.baseUrl,apiKey,defaultModel:model.id},{model:model.id,messages:context.messages.map(m=>({role:m.role,content:m.content})),temperature:0,extra:{max_tokens:16}},signal)),{ok:!0,latencyMs:Date.now()-startedAt}}catch(err){return{ok:!1,latencyMs:Date.now()-startedAt,error:err instanceof Error?err.message:String(err)}}}function ensureImageInput(model){return model.input.includes(`image`)?model:{...model,input:Array.from(new Set([...model.input,`image`]))}}function buildOpenRouterScanResult(params){let{entry,isFree}=params;return{id:entry.id,name:entry.name,provider:`openrouter`,modelRef:`openrouter/${entry.id}`,contextLength:entry.contextLength,maxCompletionTokens:entry.maxCompletionTokens,supportedParametersCount:entry.supportedParametersCount,supportsToolsMeta:entry.supportsToolsMeta,modality:entry.modality,inferredParamB:entry.inferredParamB,createdAtMs:entry.createdAtMs,pricing:entry.pricing,isFree,tool:params.tool,image:params.image}}async function mapWithConcurrency(items,concurrency,fn,opts){let limit=Math.max(1,Math.floor(concurrency)),results=Array.from({length:items.length},()=>void 0),nextIndex=0,completed=0,worker=async()=>{for(;;){let current=nextIndex;if(nextIndex+=1,current>=items.length)return;results[current]=await fn(items[current],current),completed+=1,opts?.onProgress?.(completed,items.length)}};return items.length===0?(opts?.onProgress?.(0,0),results):(await Promise.all(Array.from({length:Math.min(limit,items.length)},()=>worker())),results)}async function scanOpenRouterModels(options={}){let fetchImpl=options.fetchImpl??fetch,probe=options.probe??!0,apiKey=options.apiKey?.trim()||getEnvApiKey(`openrouter`)||``;if(probe&&!apiKey)throw Error(`Missing OpenRouter API key. Set OPENROUTER_API_KEY to run models scan.`);let timeoutMs=Math.max(1,Math.floor(options.timeoutMs??12e3)),concurrency=Math.max(1,Math.floor(options.concurrency??3)),minParamB=Math.max(0,Math.floor(options.minParamB??0)),maxAgeDays=Math.max(0,Math.floor(options.maxAgeDays??0)),providerFilter=options.providerFilter?.trim().toLowerCase()??``,catalog=await fetchOpenRouterModels(fetchImpl),now=Date.now(),filtered=catalog.filter(entry=>!(!isFreeOpenRouterModel(entry)||providerFilter&&(entry.id.split(`/`)[0]?.toLowerCase()??``)!==providerFilter||minParamB>0&&(entry.inferredParamB??0)<minParamB||maxAgeDays>0&&entry.createdAtMs&&(now-entry.createdAtMs)/(1440*60*1e3)>maxAgeDays)),baseModel=getModel(`openrouter`,`openrouter/auto`);return options.onProgress?.({phase:`probe`,completed:0,total:filtered.length}),mapWithConcurrency(filtered,concurrency,async entry=>{let isFree=isFreeOpenRouterModel(entry);if(!probe)return buildOpenRouterScanResult({entry,isFree,tool:{ok:!1,latencyMs:null,skipped:!0},image:{ok:!1,latencyMs:null,skipped:!0}});let model={...baseModel,id:entry.id,name:entry.name||entry.id,contextWindow:entry.contextLength??baseModel.contextWindow,maxTokens:entry.maxCompletionTokens??baseModel.maxTokens,input:parseModality(entry.modality),reasoning:baseModel.reasoning};return buildOpenRouterScanResult({entry,isFree,tool:await probeTool(model,apiKey,timeoutMs),image:model.input.includes(`image`)?await probeImage(ensureImageInput(model),apiKey,timeoutMs):{ok:!1,latencyMs:null,skipped:!0}})},{onProgress:(completed,total)=>options.onProgress?.({phase:`probe`,completed,total})})}const multiselect$1=params=>multiselect({...params,message:stylePromptMessage(params.message),options:params.options.map(opt=>opt.hint===void 0?opt:{...opt,hint:stylePromptHint(opt.hint)})});function guardPromptCancel(value,runtime){if(isCancel(value))throw cancel(stylePromptTitle(`Model scan cancelled.`)??`Model scan cancelled.`),runtime.exit(0),Error(`unreachable`);return value}function sortScanResults(results){return results.slice().toSorted((a,b)=>{let aImage=a.image.ok?1:0,bImage=b.image.ok?1:0;if(aImage!==bImage)return bImage-aImage;let aToolLatency=a.tool.latencyMs??1/0,bToolLatency=b.tool.latencyMs??1/0;return aToolLatency===bToolLatency?compareScanMetadata(a,b):aToolLatency-bToolLatency})}function sortImageResults(results){return results.slice().toSorted((a,b)=>{let aLatency=a.image.latencyMs??1/0,bLatency=b.image.latencyMs??1/0;return aLatency===bLatency?compareScanMetadata(a,b):aLatency-bLatency})}function compareScanMetadata(a,b){let aCtx=a.contextLength??0,bCtx=b.contextLength??0;if(aCtx!==bCtx)return bCtx-aCtx;let aParams=a.inferredParamB??0,bParams=b.inferredParamB??0;return aParams===bParams?a.modelRef.localeCompare(b.modelRef):bParams-aParams}function buildScanHint(result){return[result.tool.ok?`tool ${formatMs(result.tool.latencyMs)}`:`tool fail`,result.image.skipped?`img skip`:result.image.ok?`img ${formatMs(result.image.latencyMs)}`:`img fail`,result.contextLength?`ctx ${formatTokenK(result.contextLength)}`:`ctx ?`,result.inferredParamB?`${result.inferredParamB}b`:null].filter(Boolean).join(` | `)}function printScanSummary(results,runtime){let toolOk=results.filter(r=>r.tool.ok),imageOk=results.filter(r=>r.image.ok),toolImageOk=results.filter(r=>r.tool.ok&&r.image.ok),imageOnly=imageOk.filter(r=>!r.tool.ok);runtime.log(`Scan results: tested ${results.length}, tool ok ${toolOk.length}, image ok ${imageOk.length}, tool+image ok ${toolImageOk.length}, image only ${imageOnly.length}`)}function printScanTable(results,runtime){let header=[pad(`Model`,42),pad(`Tool`,10),pad(`Image`,10),pad(`Ctx`,8),pad(`Params`,8),`Notes`].join(` `);runtime.log(header);for(let entry of results){let modelLabel=pad(truncate(entry.modelRef,42),42),toolLabel=pad(entry.tool.ok?formatMs(entry.tool.latencyMs):`fail`,10),imageLabel=pad(entry.image.ok?formatMs(entry.image.latencyMs):entry.image.skipped?`skip`:`fail`,10),ctxLabel=pad(formatTokenK(entry.contextLength),8),paramsLabel=pad(entry.inferredParamB?`${entry.inferredParamB}b`:`-`,8),notes=entry.modality?`modality:${entry.modality}`:``;runtime.log([modelLabel,toolLabel,imageLabel,ctxLabel,paramsLabel,notes].join(` `))}}async function modelsScanCommand(opts,runtime){let minParams=opts.minParams?Number(opts.minParams):void 0;if(minParams!==void 0&&(!Number.isFinite(minParams)||minParams<0))throw Error(`--min-params must be >= 0`);let maxAgeDays=opts.maxAgeDays?Number(opts.maxAgeDays):void 0;if(maxAgeDays!==void 0&&(!Number.isFinite(maxAgeDays)||maxAgeDays<0))throw Error(`--max-age-days must be >= 0`);let maxCandidates=opts.maxCandidates?Number(opts.maxCandidates):6;if(!Number.isFinite(maxCandidates)||maxCandidates<=0)throw Error(`--max-candidates must be > 0`);let timeout=opts.timeout?Number(opts.timeout):void 0;if(timeout!==void 0&&(!Number.isFinite(timeout)||timeout<=0))throw Error(`--timeout must be > 0`);let concurrency=opts.concurrency?Number(opts.concurrency):void 0;if(concurrency!==void 0&&(!Number.isFinite(concurrency)||concurrency<=0))throw Error(`--concurrency must be > 0`);let cfg=loadConfig(),probe=opts.probe??!0,storedKey;if(probe)try{storedKey=(await resolveApiKeyForProvider({provider:`openrouter`,cfg})).apiKey}catch{storedKey=void 0}let results=await withProgressTotals({label:`Scanning OpenRouter models...`,indeterminate:!1,enabled:opts.json!==!0},async update=>await scanOpenRouterModels({apiKey:storedKey??void 0,minParamB:minParams,maxAgeDays,providerFilter:opts.provider,timeoutMs:timeout,concurrency,probe,onProgress:({phase,completed,total})=>{phase===`probe`&&update({completed,total,label:`${probe?`Probing models`:`Scanning models`} (${completed}/${total})`})}}));if(!probe){opts.json?runtime.log(JSON.stringify(results,null,2)):(runtime.log(`Found ${results.length} OpenRouter free models (metadata only; pass --probe to test tools/images).`),printScanTable(sortScanResults(results),runtime));return}let toolOk=results.filter(entry=>entry.tool.ok);if(toolOk.length===0)throw Error(`No tool-capable OpenRouter free models found.`);let sorted=sortScanResults(results),toolSorted=sortScanResults(toolOk),imageSorted=sortImageResults(results.filter(entry=>entry.image.ok)),imagePreferred=toolSorted.filter(entry=>entry.image.ok),preselected=(imagePreferred.length>0?imagePreferred:toolSorted).slice(0,Math.floor(maxCandidates)).map(entry=>entry.modelRef),imagePreselected=imageSorted.slice(0,Math.floor(maxCandidates)).map(entry=>entry.modelRef);opts.json||(printScanSummary(results,runtime),printScanTable(sorted,runtime));let noInput=opts.input===!1,canPrompt=process.stdin.isTTY&&!opts.yes&&!noInput&&!opts.json,selected=preselected,selectedImages=imagePreselected;if(canPrompt)selected=guardPromptCancel(await multiselect$1({message:`Select fallback models (ordered)`,options:toolSorted.map(entry=>({value:entry.modelRef,label:entry.modelRef,hint:buildScanHint(entry)})),initialValues:preselected}),runtime),imageSorted.length>0&&(selectedImages=guardPromptCancel(await multiselect$1({message:`Select image fallback models (ordered)`,options:imageSorted.map(entry=>({value:entry.modelRef,label:entry.modelRef,hint:buildScanHint(entry)})),initialValues:imagePreselected}),runtime));else if(!process.stdin.isTTY&&!opts.yes&&!noInput&&!opts.json)throw Error(`Non-interactive scan: pass --yes to apply defaults.`);if(selected.length===0)throw Error(`No models selected for fallbacks.`);if(opts.setImage&&selectedImages.length===0)throw Error(`No image-capable models selected for image model.`);if(await updateConfig(cfg=>{let nextModels={...cfg.agents?.defaults?.models};for(let entry of selected)nextModels[entry]||(nextModels[entry]={});for(let entry of selectedImages)nextModels[entry]||(nextModels[entry]={});let existingImageModel=cfg.agents?.defaults?.imageModel,nextImageModel=selectedImages.length>0?{...existingImageModel?.primary?{primary:existingImageModel.primary}:void 0,fallbacks:selectedImages,...opts.setImage?{primary:selectedImages[0]}:{}}:cfg.agents?.defaults?.imageModel,existingModel=cfg.agents?.defaults?.model,defaults={...cfg.agents?.defaults,model:{...existingModel?.primary?{primary:existingModel.primary}:void 0,fallbacks:selected,...opts.setDefault?{primary:selected[0]}:{}},...nextImageModel?{imageModel:nextImageModel}:{},models:nextModels};return{...cfg,agents:{...cfg.agents,defaults}}}),opts.json){runtime.log(JSON.stringify({selected,selectedImages,setDefault:!!opts.setDefault,setImage:!!opts.setImage,results,warnings:[]},null,2));return}logConfigUpdated(runtime),runtime.log(`Fallbacks: ${selected.join(`, `)}`),selectedImages.length>0&&runtime.log(`Image fallbacks: ${selectedImages.join(`, `)}`),opts.setDefault&&runtime.log(`Default model: ${selected[0]}`),opts.setImage&&selectedImages.length>0&&runtime.log(`Image model: ${selectedImages[0]}`)}async function modelsSetCommand(modelRaw,runtime){let updated=await updateConfig(cfg=>applyDefaultModelPrimaryUpdate({cfg,modelRaw,field:`model`}));logConfigUpdated(runtime),runtime.log(`Default model: ${updated.agents?.defaults?.model?.primary??modelRaw}`)}async function modelsSetImageCommand(modelRaw,runtime){let updated=await updateConfig(cfg=>applyDefaultModelPrimaryUpdate({cfg,modelRaw,field:`imageModel`}));logConfigUpdated(runtime),runtime.log(`Image model: ${updated.agents?.defaults?.imageModel?.primary??modelRaw}`)}function runModelsCommand(action){return runCommandWithRuntime(defaultRuntime,action)}function registerModelsCli(program){let models=program.command(`models`).description(`Model discovery, scanning, and configuration`).option(`--status-json`,"Output JSON (alias for `models status --json`)",!1).option(`--status-plain`,"Plain output (alias for `models status --plain`)",!1).option(`--agent <id>`,`Agent id to inspect (overrides BUILDERFORCE_AGENTS_AGENT_DIR/PI_CODING_AGENT_DIR)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/models`,`docs.builderforce.ai/cli/models`)}\n`);models.command(`list`).description(`List models (configured by default)`).option(`--all`,`Show full model catalog`,!1).option(`--local`,`Filter to local models`,!1).option(`--provider <name>`,`Filter by provider`).option(`--json`,`Output JSON`,!1).option(`--plain`,`Plain line output`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsListCommand(opts,defaultRuntime)})}),models.command(`status`).description(`Show configured model state`).option(`--json`,`Output JSON`,!1).option(`--plain`,`Plain output`,!1).option(`--check`,`Exit non-zero if auth is expiring/expired (1=expired/missing, 2=expiring)`,!1).option(`--probe`,`Probe configured provider auth (live)`,!1).option(`--probe-provider <name>`,`Only probe a single provider`).option(`--probe-profile <id>`,`Only probe specific auth profile ids (repeat or comma-separated)`,(value,previous)=>{let next=Array.isArray(previous)?previous:previous?[previous]:[];return next.push(value),next}).option(`--probe-timeout <ms>`,`Per-probe timeout in ms`).option(`--probe-concurrency <n>`,`Concurrent probes`).option(`--probe-max-tokens <n>`,`Probe max tokens (best-effort)`).option(`--agent <id>`,`Agent id to inspect (overrides BUILDERFORCE_AGENTS_AGENT_DIR/PI_CODING_AGENT_DIR)`).action(async(opts,command)=>{let agent=resolveOptionFromCommand(command,`agent`)??opts.agent;await runModelsCommand(async()=>{await modelsStatusCommand({json:!!opts.json,plain:!!opts.plain,check:!!opts.check,probe:!!opts.probe,probeProvider:opts.probeProvider,probeProfile:opts.probeProfile,probeTimeout:opts.probeTimeout,probeConcurrency:opts.probeConcurrency,probeMaxTokens:opts.probeMaxTokens,agent},defaultRuntime)})}),models.command(`set`).description(`Set the default model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsSetCommand(model,defaultRuntime)})}),models.command(`set-image`).description(`Set the image model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsSetImageCommand(model,defaultRuntime)})});let aliases=models.command(`aliases`).description(`Manage model aliases`);aliases.command(`list`).description(`List model aliases`).option(`--json`,`Output JSON`,!1).option(`--plain`,`Plain output`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsAliasesListCommand(opts,defaultRuntime)})}),aliases.command(`add`).description(`Add or update a model alias`).argument(`<alias>`,`Alias name`).argument(`<model>`,`Model id or alias`).action(async(alias,model)=>{await runModelsCommand(async()=>{await modelsAliasesAddCommand(alias,model,defaultRuntime)})}),aliases.command(`remove`).description(`Remove a model alias`).argument(`<alias>`,`Alias name`).action(async alias=>{await runModelsCommand(async()=>{await modelsAliasesRemoveCommand(alias,defaultRuntime)})});let fallbacks=models.command(`fallbacks`).description(`Manage model fallback list`);fallbacks.command(`list`).description(`List fallback models`).option(`--json`,`Output JSON`,!1).option(`--plain`,`Plain output`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsFallbacksListCommand(opts,defaultRuntime)})}),fallbacks.command(`add`).description(`Add a fallback model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsFallbacksAddCommand(model,defaultRuntime)})}),fallbacks.command(`remove`).description(`Remove a fallback model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsFallbacksRemoveCommand(model,defaultRuntime)})}),fallbacks.command(`clear`).description(`Clear all fallback models`).action(async()=>{await runModelsCommand(async()=>{await modelsFallbacksClearCommand(defaultRuntime)})});let imageFallbacks=models.command(`image-fallbacks`).description(`Manage image model fallback list`);imageFallbacks.command(`list`).description(`List image fallback models`).option(`--json`,`Output JSON`,!1).option(`--plain`,`Plain output`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsImageFallbacksListCommand(opts,defaultRuntime)})}),imageFallbacks.command(`add`).description(`Add an image fallback model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsImageFallbacksAddCommand(model,defaultRuntime)})}),imageFallbacks.command(`remove`).description(`Remove an image fallback model`).argument(`<model>`,`Model id or alias`).action(async model=>{await runModelsCommand(async()=>{await modelsImageFallbacksRemoveCommand(model,defaultRuntime)})}),imageFallbacks.command(`clear`).description(`Clear all image fallback models`).action(async()=>{await runModelsCommand(async()=>{await modelsImageFallbacksClearCommand(defaultRuntime)})}),models.command(`scan`).description(`Scan OpenRouter free models for tools + images`).option(`--min-params <b>`,`Minimum parameter size (billions)`).option(`--max-age-days <days>`,`Skip models older than N days`).option(`--provider <name>`,`Filter by provider prefix`).option(`--max-candidates <n>`,`Max fallback candidates`,`6`).option(`--timeout <ms>`,`Per-probe timeout in ms`).option(`--concurrency <n>`,`Probe concurrency`).option(`--no-probe`,`Skip live probes; list free candidates only`).option(`--yes`,`Accept defaults without prompting`,!1).option(`--no-input`,`Disable prompts (use defaults)`).option(`--set-default`,`Set agents.defaults.model to the first selection`,!1).option(`--set-image`,`Set agents.defaults.imageModel to the first image selection`,!1).option(`--json`,`Output JSON`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsScanCommand(opts,defaultRuntime)})}),models.action(async opts=>{await runModelsCommand(async()=>{await modelsStatusCommand({json:!!opts?.statusJson,plain:!!opts?.statusPlain,agent:opts?.agent},defaultRuntime)})});let auth=models.command(`auth`).description(`Manage model auth profiles`);auth.option(`--agent <id>`,`Agent id for auth order get/set/clear`),auth.action(()=>{auth.help()}),auth.command(`add`).description(`Interactive auth helper (setup-token or paste token)`).action(async()=>{await runModelsCommand(async()=>{await modelsAuthAddCommand({},defaultRuntime)})}),auth.command(`login`).description(`Run a provider plugin auth flow (OAuth/API key)`).option(`--provider <id>`,`Provider id registered by a plugin`).option(`--method <id>`,`Provider auth method id`).option(`--set-default`,`Apply the provider's default model recommendation`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsAuthLoginCommand({provider:opts.provider,method:opts.method,setDefault:!!opts.setDefault},defaultRuntime)})}),auth.command(`setup-token`).description(`Run a provider CLI to create/sync a token (TTY required)`).option(`--provider <name>`,`Provider id (default: anthropic)`).option(`--yes`,`Skip confirmation`,!1).action(async opts=>{await runModelsCommand(async()=>{await modelsAuthSetupTokenCommand({provider:opts.provider,yes:!!opts.yes},defaultRuntime)})}),auth.command(`paste-token`).description(`Paste a token into auth-profiles.json and update config`).requiredOption(`--provider <name>`,`Provider id (e.g. anthropic)`).option(`--profile-id <id>`,`Auth profile id (default: <provider>:manual)`).option(`--expires-in <duration>`,`Optional expiry duration (e.g. 365d, 12h). Stored as absolute expiresAt.`).action(async opts=>{await runModelsCommand(async()=>{await modelsAuthPasteTokenCommand({provider:opts.provider,profileId:opts.profileId,expiresIn:opts.expiresIn},defaultRuntime)})}),auth.command(`login-github-copilot`).description(`Login to GitHub Copilot via GitHub device flow (TTY required)`).option(`--profile-id <id>`,`Auth profile id (default: github-copilot:github)`).option(`--yes`,`Overwrite existing profile without prompting`,!1).action(async opts=>{await runModelsCommand(async()=>{await githubCopilotLoginCommand({profileId:opts.profileId,yes:!!opts.yes},defaultRuntime)})});let order=auth.command(`order`).description(`Manage per-agent auth profile order overrides`);order.command(`get`).description(`Show per-agent auth order override (from auth-profiles.json)`).requiredOption(`--provider <name>`,`Provider id (e.g. anthropic)`).option(`--agent <id>`,`Agent id (default: configured default agent)`).option(`--json`,`Output JSON`,!1).action(async(opts,command)=>{let agent=resolveOptionFromCommand(command,`agent`)??opts.agent;await runModelsCommand(async()=>{await modelsAuthOrderGetCommand({provider:opts.provider,agent,json:!!opts.json},defaultRuntime)})}),order.command(`set`).description(`Set per-agent auth order override (locks rotation to this list)`).requiredOption(`--provider <name>`,`Provider id (e.g. anthropic)`).option(`--agent <id>`,`Agent id (default: configured default agent)`).argument(`<profileIds...>`,`Auth profile ids (e.g. anthropic:default)`).action(async(profileIds,opts,command)=>{let agent=resolveOptionFromCommand(command,`agent`)??opts.agent;await runModelsCommand(async()=>{await modelsAuthOrderSetCommand({provider:opts.provider,agent,order:profileIds},defaultRuntime)})}),order.command(`clear`).description(`Clear per-agent auth order override (fall back to config/round-robin)`).requiredOption(`--provider <name>`,`Provider id (e.g. anthropic)`).option(`--agent <id>`,`Agent id (default: configured default agent)`).action(async(opts,command)=>{let agent=resolveOptionFromCommand(command,`agent`)??opts.agent;await runModelsCommand(async()=>{await modelsAuthOrderClearCommand({provider:opts.provider,agent},defaultRuntime)})})}export{registerModelsCli};
@@ -1 +1 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-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"./auth-json-DLweJwGc.js";import"./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"./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"./note-BvXfFmlu.js";import"./clack-prompter-ZmHdfPGJ.js";import"./table-CiK88EDX.js";import"./shared-DjBPjC55.js";import"./onboard-auth.credentials-BSSFRvb0.js";import"./auth-token-DGaO7TMn.js";import"./logging-CRzk-5ye.js";import"./provider-auth-helpers-ByvJdQT3.js";import{a as modelsListCommand,i as modelsStatusCommand}from"./models-PPv9KRbb.js";export{modelsListCommand,modelsStatusCommand};
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-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"./auth-json-DLweJwGc.js";import"./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"./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"./note-BvXfFmlu.js";import"./clack-prompter-ZmHdfPGJ.js";import"./table-CiK88EDX.js";import"./shared-DjBPjC55.js";import"./onboard-auth.credentials-BSSFRvb0.js";import"./auth-token-DGaO7TMn.js";import"./logging-CRzk-5ye.js";import"./provider-auth-helpers-u1GAP4Bi.js";import{a as modelsListCommand,i as modelsStatusCommand}from"./models-B6kkCBLd.js";export{modelsListCommand,modelsStatusCommand};