@seanhogg/builderforce-agents 2026.10.9 → 2026.10.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{acp-cli-DcKpPsJa.js → acp-cli-C23mmrQt.js} +1 -1
- package/dist/{acp-cli-BxH-eUDl.js → acp-cli-D6F-D5JB.js} +1 -1
- package/dist/{agent-cXF-aL0g.js → agent-B-2r1Lr_.js} +1 -1
- package/dist/{agent-wJmvciTM.js → agent-BI9qSnSp.js} +1 -1
- package/dist/{agentbot-cli-Cub3Abbt.js → agentbot-cli-Cyrhr5jX.js} +1 -1
- package/dist/{agentbot-cli-CTRvEfBp.js → agentbot-cli-sC55m-XS.js} +1 -1
- package/dist/{agents-Cr7WO73I.js → agents-CMThT_Bj.js} +1 -1
- package/dist/agents-Chz9nfm2.js +1 -0
- package/dist/{api-key-rotation-CHBjUwUJ.js → api-key-rotation-CyCi-UqR.js} +1 -1
- package/dist/{audio-preflight-CWFuqbao.js → audio-preflight-B411b2-y.js} +1 -1
- package/dist/{audio-preflight-F2e3Y4CW.js → audio-preflight-Cs4eUjQk.js} +1 -1
- package/dist/{audit-DGnEhZYe.js → audit-B-USV03V.js} +1 -1
- package/dist/{audit-DBjjjW93.js → audit-SKNPS-K2.js} +1 -1
- package/dist/auth-choice-CChsMy-F.js +1 -0
- package/dist/{auth-choice-9gZuOvPS.js → auth-choice-CCib_yVL.js} +1 -1
- package/dist/auth-choice-DSnpkrMc.js +1 -0
- package/dist/{auth-choice-BoZFVmEa.js → auth-choice-DzBqqq7i.js} +1 -1
- package/dist/auth-choice.apply-6f3Jb_lS.js +1 -0
- package/dist/{auth-choice.apply-CcatXiNo.js → auth-choice.apply-BgOXoS8X.js} +1 -1
- package/dist/{auth-choice.apply-BHLQeym9.js → auth-choice.apply-DBuvopiF.js} +1 -1
- package/dist/auth-choice.apply-DeXnLwVS.js +1 -0
- package/dist/auth-choice.apply.transformers-CZDuBaOr.js +1 -0
- package/dist/{auth-choice.apply.transformers-CIn3fs7K.js → auth-choice.apply.transformers-Df9l_jRz.js} +2 -2
- package/dist/{auth-choice.apply.transformers-1plI0MUg.js → auth-choice.apply.transformers-DmdxpHGz.js} +2 -2
- package/dist/{auth-choice.apply.transformers-D5OrjEHo.js → auth-choice.apply.transformers-dn7l6XyJ.js} +1 -1
- package/dist/{auth-json-D1ite-pW.js → auth-json-BB-VBn5E.js} +1 -1
- package/dist/{auth-json-CN3MWw57.js → auth-json-BVyos95N.js} +1 -1
- package/dist/{auth-json-HGu227VM.js → auth-json-CoOe4tEg.js} +1 -1
- package/dist/{auth-json-DZ7E50Y1.js → auth-json-wrKixZxh.js} +1 -1
- package/dist/{auth-profiles-C1VbcUOm.js → auth-profiles-pt7Tr4HA.js} +1 -1
- package/dist/{auth-token-CyVfNEQb.js → auth-token-BE67qxLw.js} +1 -1
- package/dist/{auth-token-CoQ5ePPl.js → auth-token-BPHeoBAW.js} +1 -1
- package/dist/{banner-DY-L7_eI.js → banner-ErBINvbk.js} +1 -1
- package/dist/{browser-cli-D2O94twn.js → browser-cli-BZc64-Xx.js} +1 -1
- package/dist/{browser-cli-CoRx_4iM.js → browser-cli-CoxVKdon.js} +1 -1
- package/dist/build-info.json +3 -3
- package/dist/{builderforce-BmrsVdFw.js → builderforce-B9187Tm9.js} +4 -4
- package/dist/{builderforce-Bwyw0GJ6.js → builderforce-BLqHwgeu.js} +4 -4
- package/dist/builderforce-api-DKgXl8BH.js +1 -0
- package/dist/builderforce-api-DcPAGsla.js +1 -0
- package/dist/builderforce-onboarding-CaPJZSvw.js +24 -0
- package/dist/builderforce-onboarding-RXFb0gct.js +24 -0
- package/dist/{builderforcellm-syscheck-CprBhARf.js → builderforcellm-syscheck-9ksvqHYX.js} +1 -1
- package/dist/{builderforcellm-syscheck-DrFJ638L.js → builderforcellm-syscheck-F5JMAr3p.js} +1 -1
- package/dist/{call-DxPWzV-k.js → call-BnAs_SER.js} +1 -1
- package/dist/{call-DFjBq0H2.js → call-D1Opj5ev.js} +1 -1
- package/dist/{call-DmAU4cRX.js → call-Du2LiaX6.js} +1 -1
- package/dist/{call-BbRf8gFM.js → call-T8ciwMTA.js} +1 -1
- package/dist/{channel-options-d4EwVQD0.js → channel-options-B7sRMp2v.js} +1 -1
- package/dist/{channel-options-CDixz6dT.js → channel-options-rhDBCtlp.js} +1 -1
- package/dist/{channel-web-DJa8JC9W.js → channel-web-CcCqUQrJ.js} +1 -1
- package/dist/{channels-cli-BgKy0MbE.js → channels-cli-BjnLW14T.js} +1 -1
- package/dist/{channels-cli-nNW0ezPM.js → channels-cli-DVWUBsmc.js} +1 -1
- package/dist/{chrome-BnEbJV3D.js → chrome-CFmcixaE.js} +1 -1
- package/dist/{chrome-a3X9_-nf.js → chrome-DXt86tmV.js} +1 -1
- package/dist/cli/daemon-cli.js +1 -1
- package/dist/{cli-DkWt7p2x.js → cli-BUqtALJK.js} +1 -1
- package/dist/{cli-C5MbcECQ.js → cli-K4reS6IS.js} +1 -1
- package/dist/{coding-tools.policy-NEPm7Mz1.js → coding-tools.policy-D9Ba8eDh.js} +1 -1
- package/dist/{coding-tools.policy-6qh9acJy.js → coding-tools.policy-ZhOdlcEI.js} +1 -1
- package/dist/{command-registry-COUcUWby.js → command-registry-B7uAoROP.js} +1 -1
- package/dist/{command-registry-4_K-lfW5.js → command-registry-CW16Mk2Y.js} +1 -1
- package/dist/{completion-cli-DlvHqL86.js → completion-cli-ZvXrCQqk.js} +1 -1
- package/dist/{completion-cli-B2qcVd6q.js → completion-cli-gyvx5ZXu.js} +1 -1
- package/dist/{completion-cli-DpFvU4Qn.js → completion-cli-n8UsdT91.js} +1 -1
- package/dist/{completion-cli-SdcQ-kQj.js → completion-cli-sKReGv3d.js} +1 -1
- package/dist/{config-_1Ca6jGb.js → config-BgV_FYSq.js} +1 -1
- package/dist/{config-toczWD3q.js → config-BpChMIJ6.js} +1 -1
- package/dist/{config-BTWlKwtB.js → config-D01EgOky.js} +1 -1
- package/dist/{config-27_FNba3.js → config-Dsnbi-a3.js} +1 -1
- package/dist/{config-cli-DeiQz5sY.js → config-cli-Bpo74mE5.js} +1 -1
- package/dist/{config-cli-CfczShaZ.js → config-cli-CF31O_5s.js} +1 -1
- package/dist/{config-guard-CD-Wq8kk.js → config-guard-BRUOk5YL.js} +1 -1
- package/dist/{config-guard-ClVl2FvD.js → config-guard-BUpQiSTW.js} +1 -1
- package/dist/{config-guard-B4in8l8I.js → config-guard-USCN-dq0.js} +1 -1
- package/dist/{config-validation-jpeXzoU3.js → config-validation-BGpSeNbh.js} +1 -1
- package/dist/{config-validation-C6u-z9bJ.js → config-validation-CdBJ-tZq.js} +1 -1
- package/dist/{configure-3W9C5LiT.js → configure-CWr61Ph2.js} +1 -1
- package/dist/configure-DhazB2qh.js +1 -0
- package/dist/{configure-BtXQW7ue.js → configure-DlcO1tWx.js} +1 -1
- package/dist/configure-MXheujvX.js +1 -0
- package/dist/{control-service-CJuuqNOE.js → control-service-2PkCt256.js} +1 -1
- package/dist/{control-service-qKfWP7VD.js → control-service-CcsbseZS.js} +1 -1
- package/dist/{control-service-izGyCWQs.js → control-service-qK1oboMo.js} +1 -1
- package/dist/{control-service-BbsswoMy.js → control-service-y3GYvIBg.js} +1 -1
- package/dist/{cron-cli-BrOM4s6N.js → cron-cli-BYu_lA8i.js} +1 -1
- package/dist/{cron-cli-CwtTX6pg.js → cron-cli-D_Og20iB.js} +1 -1
- package/dist/{daemon-cli-DyVsMf8p.js → daemon-cli-BNzthScZ.js} +1 -1
- package/dist/{daemon-cli-DlwOVDbt.js → daemon-cli-Bh3p0hui.js} +1 -1
- package/dist/{daemon-cli-Br0wu9xQ.js → daemon-cli-DxxKiKVN.js} +1 -1
- package/dist/{daemon-cli-DmicpZED.js → daemon-cli-emNxLkIw.js} +1 -1
- package/dist/{daemon-runtime-CtOr1ncS.js → daemon-runtime-9XitJmIL.js} +1 -1
- package/dist/{daemon-runtime-B4UjqdyJ.js → daemon-runtime-Dx800VUt.js} +1 -1
- package/dist/{deliver-BpLm3ktn.js → deliver--6OBF3LL.js} +1 -1
- package/dist/{deliver-9o_SE4ZK.js → deliver-ADpnRGRf.js} +1 -1
- package/dist/{deliver-D2VAVelb.js → deliver-BM6-damm.js} +1 -1
- package/dist/{deliver-BuZu68tp.js → deliver-CsG0cHbZ.js} +1 -1
- package/dist/{deps-CkJiJ6wc.js → deps-Dg_9rfXK.js} +1 -1
- package/dist/{devices-cli-BfXeDnbx.js → devices-cli-B8DXzcRP.js} +1 -1
- package/dist/{devices-cli-B9G6YOsS.js → devices-cli-BZkdWSx-.js} +1 -1
- package/dist/{directory-cli-BRCaiGOn.js → directory-cli-B78pAVI_.js} +1 -1
- package/dist/{directory-cli-D5ciZ5fY.js → directory-cli-CSaRkkL8.js} +1 -1
- package/dist/{dm-policy-shared-CRZpjRv0.js → dm-policy-shared-B9lW-AsK.js} +1 -1
- package/dist/{dm-policy-shared-Dhw9_6mi.js → dm-policy-shared-DYZ_T-az.js} +1 -1
- package/dist/{dns-cli-CgZ7oMcT.js → dns-cli-CLPGOFA1.js} +1 -1
- package/dist/{dns-cli-C4f4Tyij.js → dns-cli-dr5dHzfI.js} +1 -1
- package/dist/{doctor-completion-BSotFS6p.js → doctor-completion-94zme499.js} +1 -1
- package/dist/{doctor-completion-DVxbs-74.js → doctor-completion-CbF34DIH.js} +1 -1
- package/dist/{embedded-helpers-CEsr3aQ0.js → embedded-helpers-C9jpiwlw.js} +1 -1
- package/dist/{embedded-helpers-DK8_apW0.js → embedded-helpers-DdU30lmt.js} +1 -1
- package/dist/entry.js +1 -1
- package/dist/{exec-approvals-cli-YuOu7mVg.js → exec-approvals-cli-CS_uabo7.js} +1 -1
- package/dist/{exec-approvals-cli-BPFi82B0.js → exec-approvals-cli-ktB7M7WE.js} +1 -1
- package/dist/{gateway-cli-D2Bg1Um6.js → gateway-cli-CKcoLVMA.js} +5 -5
- package/dist/{gateway-cli-DFEo8C0z.js → gateway-cli-CuXBDBWe.js} +5 -5
- package/dist/{gateway-rpc-BXR_lVIx.js → gateway-rpc-B02y0PnE.js} +1 -1
- package/dist/{gateway-rpc-ByUcnQ7W.js → gateway-rpc-ff1RVb0_.js} +1 -1
- package/dist/{gemini-auth-CkD5jCPh.js → gemini-auth-DDR12zst.js} +1 -1
- package/dist/health-D0DZmCmh.js +1 -0
- package/dist/{health-yS3NRKvY.js → health-FO8MG5Ur.js} +1 -1
- package/dist/{health-DVo8a9yg.js → health-zrsgFZmR.js} +1 -1
- package/dist/{hooks-cli-B0lVee-j.js → hooks-cli-5Y4hnSX9.js} +1 -1
- package/dist/{hooks-cli-DsVmrQAG.js → hooks-cli-DpHZzRo2.js} +1 -1
- package/dist/index.js +2 -2
- package/dist/{ink-session-BitZ1wcY.js → ink-session-Dt9Q4iH-.js} +2 -2
- package/dist/{ink-session-CyAqXDla.js → ink-session-N8wCBzwk.js} +2 -2
- package/dist/{installs-CWd54ARy.js → installs-B_t2YXgq.js} +1 -1
- package/dist/{installs-C9A8QFiF.js → installs-DFiF4lGy.js} +1 -1
- package/dist/{io-3R_ZyUxB.js → io-BLBq4T2o.js} +1 -1
- package/dist/{io-DSIGyPrT.js → io-CXN4uLS2.js} +1 -1
- package/dist/{io-6jLoKffb.js → io-Ckd4NlvH.js} +1 -1
- package/dist/{io-CohJffHG.js → io-D9hC2aG0.js} +1 -1
- package/dist/{lifecycle-core-BpMvDXy1.js → lifecycle-core-D9Dg5Qps.js} +1 -1
- package/dist/{lifecycle-core-Dwb4gHjZ.js → lifecycle-core-uxjxTzFv.js} +1 -1
- package/dist/login-B3sDAgHb.js +1 -0
- package/dist/{login-C_ZdMOvv.js → login-CwwuaXtb.js} +1 -1
- package/dist/{login-DtDUyFO3.js → login-D1bVUPlv.js} +1 -1
- package/dist/{login-CEnjUo5c.js → login-GLDax56V.js} +1 -1
- package/dist/{login-qr-B9lyIZVD.js → login-qr-CbiUcBLy.js} +1 -1
- package/dist/{login-qr-BCBsxwhT.js → login-qr-Cp0YqK4e.js} +1 -1
- package/dist/{logs-cli-CdM5W3HE.js → logs-cli-Cy11HfSG.js} +1 -1
- package/dist/{logs-cli-jh5Xn3TD.js → logs-cli-nD36c-Y1.js} +1 -1
- package/dist/{manager-CRba8roB.js → manager-BeohB4-8.js} +1 -1
- package/dist/{manager-B3IJ_IKf.js → manager-CTTXDBt3.js} +1 -1
- package/dist/{manager-TGVy_fAb.js → manager-CoQMlcrf.js} +1 -1
- package/dist/{manager-DwywI_5-.js → manager-DSz61dXv.js} +1 -1
- package/dist/{memory-cli-BlayFTAM.js → memory-cli-BpAiRntI.js} +1 -1
- package/dist/{memory-cli-DRz4wtHk.js → memory-cli-CbkWGjRn.js} +1 -1
- package/dist/{memory-cli-PdyTQ84w.js → memory-cli-CrBMLM2P.js} +1 -1
- package/dist/{memory-cli-ivAs7q7v.js → memory-cli-CveeVOWH.js} +1 -1
- package/dist/{model-catalog-CQOdhMUY.js → model-catalog-B29yeBYS.js} +1 -1
- package/dist/{model-catalog-CiiFJX77.js → model-catalog-BeBXvbFm.js} +1 -1
- package/dist/model-catalog-CMKHKuBL.js +1 -0
- package/dist/{model-catalog-C6UrZ0uG.js → model-catalog-DjNiebr7.js} +1 -1
- package/dist/{model-discovery-C9Xm95uL.js → model-discovery-D0i1JpiL.js} +1 -1
- package/dist/{model-picker-swoSwauV.js → model-picker-CGDNPRPc.js} +1 -1
- package/dist/model-picker-CGEF8yhc.js +1 -0
- package/dist/model-picker-DeUNOC78.js +1 -0
- package/dist/{model-picker-BUePD7Zg.js → model-picker-EIhpfOZa.js} +1 -1
- package/dist/{model-selection-9bRFKBI_.js → model-selection-DG9J_VTz.js} +1 -1
- package/dist/{models-BNivsd2o.js → models-BjIzVQYX.js} +2 -2
- package/dist/{models-DQeSIY6M.js → models-JoqOgEF5.js} +1 -1
- package/dist/{models-cli-KokGgWeP.js → models-cli-B2zbchgs.js} +1 -1
- package/dist/{models-cli-BcNxU4P_.js → models-cli-CkFdc8NN.js} +2 -2
- package/dist/{node-cli-DIMh3X2F.js → node-cli-CXnuxiBq.js} +1 -1
- package/dist/{node-cli-EmTU-Gh0.js → node-cli-oVyjVnb7.js} +1 -1
- package/dist/{nodes-cli-BX8TznFK.js → nodes-cli-BBVotxNt.js} +1 -1
- package/dist/{nodes-cli-DyHovdAc.js → nodes-cli-DVMBSUhK.js} +1 -1
- package/dist/{onboard-DfMVh1bM.js → onboard-BItclJp0.js} +1 -1
- package/dist/{onboard-BVmZ4jMw.js → onboard-CqvHIvKj.js} +1 -1
- package/dist/{onboard-auth.credentials-yagR-VMG.js → onboard-auth.credentials-DneFSdYg.js} +1 -1
- package/dist/{onboard-auth.credentials-BuT-etnE.js → onboard-auth.credentials-DpitLlzw.js} +1 -1
- package/dist/onboard-channels-B91m5S3w.js +1 -0
- package/dist/onboard-channels-BOoPtYbF.js +1 -0
- package/dist/{onboard-channels-B6QDFkkK.js → onboard-channels-Dn0u5C-C.js} +1 -1
- package/dist/{onboard-channels-C8FCFn29.js → onboard-channels-vhtccaIV.js} +1 -1
- package/dist/onboard-custom-BN0uzSq_.js +1 -0
- package/dist/{onboard-custom-D1nd8Hlu.js → onboard-custom-BYIza2e7.js} +1 -1
- package/dist/onboard-custom-CCFthqto.js +1 -0
- package/dist/{onboard-custom-C_BI0ZXn.js → onboard-custom-Ckf0xKXY.js} +1 -1
- package/dist/{onboard-helpers-CGlLpagb.js → onboard-helpers-B8I5AVyb.js} +1 -1
- package/dist/{onboard-helpers-CckrS8_K.js → onboard-helpers-Ce_c4Raj.js} +1 -1
- package/dist/{onboard-helpers-Cf5dNq7-.js → onboard-helpers-CiHzTaFX.js} +1 -1
- package/dist/{onboard-helpers-BvIZ4-R5.js → onboard-helpers-DC-nMl-V.js} +1 -1
- package/dist/{onboard-interactive-DYJttZ2w.js → onboard-interactive-Cl2K3EYn.js} +1 -1
- package/dist/{onboard-interactive-zgjmwJz-.js → onboard-interactive-JNux9zfA.js} +1 -1
- package/dist/{onboard-interactive-B3-KBZbZ.js → onboard-interactive-J_ObFzeW.js} +1 -1
- package/dist/{onboard-interactive-Dc_7URYb.js → onboard-interactive-OUNsvlh0.js} +1 -1
- package/dist/{onboard-remote-D5lR2lVm.js → onboard-remote-0-q7MG9t.js} +1 -1
- package/dist/{onboard-remote-BmSyHww1.js → onboard-remote-CgAAEZpq.js} +1 -1
- package/dist/{onboard-remote-CzzQMZ3X.js → onboard-remote-DKXHDdBD.js} +1 -1
- package/dist/{onboard-remote-DcuX8b2g.js → onboard-remote-cB8j9RG-.js} +1 -1
- package/dist/{onboard-skills-ILHIeg1R.js → onboard-skills-47upVdA2.js} +1 -1
- package/dist/{onboard-skills-BPlNN_-T.js → onboard-skills-9Um4TL2x.js} +1 -1
- package/dist/{onboard-skills-DIhjDMom.js → onboard-skills-DhCmvhJY.js} +1 -1
- package/dist/{onboard-skills-CI1OtWsE.js → onboard-skills-mI2kfvdT.js} +1 -1
- package/dist/{onboarding-D4-HDbmU.js → onboarding-BSENgR9C.js} +5 -5
- package/dist/{onboarding-CP9rrz8y.js → onboarding-CIaZLNc1.js} +5 -5
- package/dist/{onboarding.finalize-C2kZi7F0.js → onboarding.finalize-BwOpvoPE.js} +1 -1
- package/dist/{onboarding.finalize-BfWXPgX7.js → onboarding.finalize-yMK-g7Uy.js} +1 -1
- package/dist/{onboarding.gateway-config-Cd7_bXVs.js → onboarding.gateway-config-Kn1O-QFl.js} +1 -1
- package/dist/{onboarding.gateway-config-Bd8HJkso.js → onboarding.gateway-config-huOjFf8D.js} +1 -1
- package/dist/{openai-model-default-Cp3nf21W.js → openai-model-default-CH2-2Hvk.js} +1 -1
- package/dist/{openai-model-default-BMRrqTmH.js → openai-model-default-pfoEzWYJ.js} +1 -1
- package/dist/{outbound-BRInCJD9.js → outbound-BdeHcMAo.js} +1 -1
- package/dist/{outbound-CAtBpFoD.js → outbound-BylJYD7n.js} +1 -1
- package/dist/{outbound-OI-t5zZ0.js → outbound-CAirtWr1.js} +1 -1
- package/dist/{outbound-CnIvOJlU.js → outbound-VNcvF2MG.js} +1 -1
- package/dist/{outbound-send-deps-m6DqOma_.js → outbound-send-deps-B3Lg-uqF.js} +1 -1
- package/dist/{pairing-cli-CEr0yEsc.js → pairing-cli-5RtPvz2i.js} +1 -1
- package/dist/{pairing-cli-Dxfoni-F.js → pairing-cli-C_Mj6Dy4.js} +1 -1
- package/dist/{pairing-labels-3j_iRYOO.js → pairing-labels-BJPrScRl.js} +1 -1
- package/dist/{pairing-labels-BW5jQZlr.js → pairing-labels-oA-nKTaW.js} +1 -1
- package/dist/{pairing-store-QDb6lhIU.js → pairing-store-YRy7EBgI.js} +1 -1
- package/dist/{pairing-store-CbvMJhD3.js → pairing-store-ti3FEkmr.js} +1 -1
- package/dist/{plugin-auto-enable-BV9K9Vhr.js → plugin-auto-enable-Cupr4wbt.js} +1 -1
- package/dist/{plugin-auto-enable-DDry2fA6.js → plugin-auto-enable-D8gKiE3F.js} +1 -1
- package/dist/plugin-registry-BEfyc2f_.js +1 -0
- package/dist/{plugin-registry-C-_GA65s.js → plugin-registry-BoPaef5I.js} +1 -1
- package/dist/{plugin-registry-SAdxNUwm.js → plugin-registry-CxnuHO_n.js} +1 -1
- package/dist/plugin-registry-D0tIqo8L.js +1 -0
- package/dist/plugin-sdk/{accounts-Cy3WCbWg.js → accounts-BwreSNAR.js} +1 -1
- package/dist/plugin-sdk/{active-listener-DVWVNlT9.js → active-listener-DpQ7aGYd.js} +1 -1
- package/dist/plugin-sdk/agent-runtime/src/infra/workflow-telemetry.d.ts +12 -1
- package/dist/plugin-sdk/{agent-scope-DgKN27hJ.js → agent-scope-BQByW0cD.js} +1 -1
- package/dist/plugin-sdk/{api-key-rotation-ftXf7mBZ.js → api-key-rotation-7YdImWrh.js} +1 -1
- package/dist/plugin-sdk/{audio-preflight-CfTmmeS-.js → audio-preflight-EbkaATDO.js} +1 -1
- package/dist/plugin-sdk/{auth-json-BrNBg87n.js → auth-json-DK6qod1_.js} +1 -1
- package/dist/plugin-sdk/{bindings-CH-YLOLC.js → bindings-CDEzl4kl.js} +1 -1
- package/dist/plugin-sdk/{channel-web-B6rg0Rbf.js → channel-web-D2KuONp0.js} +1 -1
- package/dist/plugin-sdk/{chrome-CuXP-hes.js → chrome-SOXFIkUM.js} +1 -1
- package/dist/plugin-sdk/{chunk-C94IAOuf.js → chunk-cW0POl22.js} +1 -1
- package/dist/plugin-sdk/{command-format-B3XMq_73.js → command-format-CAX9XFjI.js} +1 -1
- package/dist/plugin-sdk/{common-n0l_XN-S.js → common-BxEWhN2X.js} +1 -1
- package/dist/plugin-sdk/{config-DsXZsCkJ.js → config-v1EU9Ll8.js} +2 -2
- package/dist/plugin-sdk/{fetch-B-GxSYRO.js → fetch-DH0Y8iyO.js} +1 -1
- package/dist/plugin-sdk/index.js +1 -1
- package/dist/plugin-sdk/{login-_my8QwPP.js → login-d1zBgykF.js} +1 -1
- package/dist/plugin-sdk/{login-qr-BaePtXuG.js → login-qr-B6exvQnN.js} +1 -1
- package/dist/plugin-sdk/{manager-BsC-4ymy.js → manager-BH_bmGds.js} +1 -1
- package/dist/plugin-sdk/{markdown-tables-BUfhHgfs.js → markdown-tables-Epim9b-0.js} +1 -1
- package/dist/plugin-sdk/{message-channel-CuZ2xOAM.js → message-channel-sBPQc_-T.js} +1 -1
- package/dist/plugin-sdk/{model-catalog-yuiXVcmw.js → model-catalog-cXsza5GU.js} +1 -1
- package/dist/plugin-sdk/{model-selection-BtgvnqB5.js → model-selection-K82MAGlL.js} +1 -1
- package/dist/plugin-sdk/{outbound-D_attiyO.js → outbound-Chn_H1O7.js} +1 -1
- package/dist/plugin-sdk/{plugins-BdkC9v5E.js → plugins-CaUOZBVb.js} +1 -1
- package/dist/plugin-sdk/{pw-ai-A7Rathx6.js → pw-ai-BIiJF7ZD.js} +1 -1
- package/dist/plugin-sdk/{qmd-manager-Dxn0jCpE.js → qmd-manager-BRe5fGZw.js} +1 -1
- package/dist/plugin-sdk/{registry-CZHRcH-q.js → registry-DJq2Cvo9.js} +1 -1
- package/dist/plugin-sdk/{render-CuA_WRX5.js → render-BUCRXPIk.js} +1 -1
- package/dist/plugin-sdk/{replies-DmLfO-pg.js → replies-Cz5OD3qN.js} +1 -1
- package/dist/plugin-sdk/{reply-3-ne-N_7.js → reply-D5Uk7pUv.js} +9 -9
- package/dist/plugin-sdk/{reply-prefix-w7kAvH11.js → reply-prefix-CCymsmsP.js} +1 -1
- package/dist/plugin-sdk/{resolve-route-0sbvl4ZN.js → resolve-route-DN1J7Wyc.js} +1 -1
- package/dist/plugin-sdk/{runner-4UfrAQnx.js → runner-CYkuO7Fh.js} +4 -4
- package/dist/plugin-sdk/{session-BB-yfDWx.js → session-D5jHDo78.js} +1 -1
- package/dist/plugin-sdk/{sqlite-JjFgDV-H.js → sqlite-BlMLqMl8.js} +1 -1
- package/dist/plugin-sdk/{subsystem-D0Ril4rt.js → subsystem-COTa5Ly_.js} +1 -1
- package/dist/plugin-sdk/{tool-images-WRTP95FT.js → tool-images-DSpchb4x.js} +1 -1
- package/dist/plugin-sdk/{tool-loop-detection-sC_rhJfb.js → tool-loop-detection-BP6u-mbh.js} +1 -1
- package/dist/plugin-sdk/web-BbganhKi.js +1 -0
- package/dist/plugin-sdk/{whatsapp-actions-ThxQ5niy.js → whatsapp-actions-CZUqxmP1.js} +1 -1
- package/dist/{plugins-BIG8NDB9.js → plugins-Cx29kkDj.js} +1 -1
- package/dist/{plugins-iAq-Gr8l.js → plugins-DJqou2hi.js} +1 -1
- package/dist/{plugins-cli-CpaVUv_r.js → plugins-cli-Bu-A8aGy.js} +1 -1
- package/dist/{plugins-cli-CPkSgvdL.js → plugins-cli-CGFsQDVW.js} +1 -1
- package/dist/{program-context-BCwL3wlM.js → program-context-ClBa4lUj.js} +1 -1
- package/dist/{program-2w7Ue902.js → program-vVCzU0cH.js} +2 -2
- package/dist/{prompt-select-styled-hB_nLOn1.js → prompt-select-styled-BJPGccTJ.js} +1 -1
- package/dist/{prompt-select-styled-Dd5swW2b.js → prompt-select-styled-BK74z6FF.js} +1 -1
- package/dist/{provider-auth-helpers-BpTnp2Yr.js → provider-auth-helpers-B84m5VMc.js} +1 -1
- package/dist/{provider-auth-helpers-CJTG_tVx.js → provider-auth-helpers-hNwpK_hl.js} +1 -1
- package/dist/{provider-dispatcher-TWwBT2aH.js → provider-dispatcher-BjR5DE3O.js} +1 -1
- package/dist/provider-dispatcher-DgOeVjcL.js +1 -0
- package/dist/{provider-usage-BdrU4cIE.js → provider-usage-B-wPVN_j.js} +1 -1
- package/dist/{provider-usage-Bn4ZrnU7.js → provider-usage-B8lFHp0K.js} +1 -1
- package/dist/{push-apns-C4sJnHbO.js → push-apns-BTPPvY81.js} +1 -1
- package/dist/{push-apns-CiD3rrVv.js → push-apns-CscYUS0D.js} +1 -1
- package/dist/{pw-ai-DSEj1QrV.js → pw-ai-CLS_VZ8p.js} +1 -1
- package/dist/{pw-ai-dNZY-qBs.js → pw-ai-D5og_rIf.js} +1 -1
- package/dist/{qr-cli-qr-SFLZW.js → qr-cli-CAquM1Zk.js} +1 -1
- package/dist/{qr-cli-B45dCV0o.js → qr-cli-GsR8n1cm.js} +1 -1
- package/dist/{qr-cli-CMlAIzrD.js → qr-cli-kAKgaL-T.js} +1 -1
- package/dist/{qr-cli-CySNSEFj.js → qr-cli-uyxNf-cQ.js} +1 -1
- package/dist/{register.agent-BA6LIJSb.js → register.agent-BwTCfyeJ.js} +1 -1
- package/dist/{register.agent-D2uCH8jZ.js → register.agent-Dhdo3_7k.js} +1 -1
- package/dist/register.configure-B0m0G3ot.js +1 -0
- package/dist/register.configure-D3cbjmTz.js +1 -0
- package/dist/{register.maintenance-BELfCO_C.js → register.maintenance-C6ocMld2.js} +1 -1
- package/dist/{register.maintenance-DukWFS_D.js → register.maintenance-CbE2zSyc.js} +1 -1
- package/dist/{register.message-DiZRRAE5.js → register.message-Jn4u533_.js} +1 -1
- package/dist/{register.message-8iGDhO8h.js → register.message-Tu1hlM0m.js} +1 -1
- package/dist/{register.onboard-B9DMNfHE.js → register.onboard-B34211N6.js} +1 -1
- package/dist/{register.onboard-Dt7rzAq-.js → register.onboard-S1d2WAE4.js} +1 -1
- package/dist/{register.setup-CSF-2ImP.js → register.setup-CJPyAwCQ.js} +1 -1
- package/dist/{register.setup-BRRVPrx7.js → register.setup-Sg8f3nsH.js} +1 -1
- package/dist/{register.status-health-sessions-D6wdwPwV.js → register.status-health-sessions-BlgVxoZ4.js} +1 -1
- package/dist/{register.status-health-sessions-ZSufYw5j.js → register.status-health-sessions-DwADQJ74.js} +1 -1
- package/dist/{register.subclis-4eDV9jKH.js → register.subclis-C9V_M-Lk.js} +1 -1
- package/dist/{register.subclis-Cr9DoYcv.js → register.subclis-pWn9XObB.js} +1 -1
- package/dist/{replies-DbkT_5BV.js → replies-BOGMDhSN.js} +1 -1
- package/dist/{replies-CzV-RFUG.js → replies-BXbV02ik.js} +1 -1
- package/dist/{replies-DIBQzxGp.js → replies-CUv671JF.js} +1 -1
- package/dist/{replies-Bd2RPZwQ.js → replies-DokbEfJD.js} +1 -1
- package/dist/{reply-Cd3vVnD7.js → reply-GY1C8tcv.js} +10 -10
- package/dist/{routes-BzfLvF8W.js → routes-DZntyPY6.js} +1 -1
- package/dist/{routes-lclJHOYY.js → routes-_iZdG1Fo.js} +1 -1
- package/dist/{rpc-BLqXRn5R.js → rpc-CbUnwStf.js} +1 -1
- package/dist/{rpc-DcQNGQlj.js → rpc-Cwm4gchc.js} +1 -1
- package/dist/{run-main-DLcDEJgv.js → run-main-DQMbgbcF.js} +1 -1
- package/dist/{runner-DwWmciCt.js → runner-Cu9NJouV.js} +1 -1
- package/dist/{runner-SxCr9kXD.js → runner-eTTUbLAK.js} +1 -1
- package/dist/{sandbox-BZibn6PX.js → sandbox-C4AKi2EX.js} +1 -1
- package/dist/{sandbox-z9t_PRf9.js → sandbox-DvKMuAXL.js} +1 -1
- package/dist/{sandbox-cli-BtGs0dBR.js → sandbox-cli-C0LhzYq_.js} +1 -1
- package/dist/{sandbox-cli-B8FpLgyY.js → sandbox-cli-De0iaoHB.js} +1 -1
- package/dist/{security-cli-D8Q8I7fn.js → security-cli-BvEfiO8m.js} +1 -1
- package/dist/{security-cli-IIMR7Pb4.js → security-cli-BzsQ0XQh.js} +1 -1
- package/dist/{send-DnMzjS7L.js → send-2dRKMWtl.js} +1 -1
- package/dist/{send-DerUBvXW.js → send-Aw8wK3vK.js} +1 -1
- package/dist/{send-BvroeIQ6.js → send-B7H8Ae5j.js} +1 -1
- package/dist/{send-4d9NswaD.js → send-BP5osGBo.js} +1 -1
- package/dist/{send-BU_-BGmf.js → send-BVal50Bi.js} +1 -1
- package/dist/{send-CxG2suVM.js → send-Bbo7TXLx.js} +1 -1
- package/dist/{send-CBBziNqM.js → send-BxoVLIy1.js} +1 -1
- package/dist/{send-dDpSBSBo.js → send-COKUbcqs.js} +1 -1
- package/dist/{send--12DIueA.js → send-CTw3PqN4.js} +1 -1
- package/dist/{send-UFtylOiq.js → send-CYGOPcKq.js} +1 -1
- package/dist/{send-DyF1Xy9K.js → send-ChGpVO3O.js} +1 -1
- package/dist/{send-Q-uTkSFE.js → send-Cqea2UFo.js} +1 -1
- package/dist/{send-j15662lv.js → send-CrFWgJKx.js} +1 -1
- package/dist/{send-gDb60Hk-.js → send-CwK8QBR3.js} +1 -1
- package/dist/{send-CceNWtYE.js → send-DqR7Rxzm.js} +1 -1
- package/dist/{send-CJHXQvVl.js → send-DxwfUIN-.js} +1 -1
- package/dist/{send-ByCVQQVz.js → send-KgN1P41U.js} +1 -1
- package/dist/{send-B1rJLLpr.js → send-bNp87SIq.js} +1 -1
- package/dist/{send-B_1BtyfA.js → send-kkm_zrHQ.js} +1 -1
- package/dist/{send-BJDzwYJN.js → send-l3ge4wkC.js} +1 -1
- package/dist/{server-context-DJZT7Upf.js → server-context-CQ2v4BAx.js} +1 -1
- package/dist/{server-context-owOmmyUM.js → server-context-CttALzrW.js} +1 -1
- package/dist/{server-node-events-54d8Rmjl.js → server-node-events-CIMO6Vae.js} +1 -1
- package/dist/{server-node-events-CSFVqgxX.js → server-node-events-iCF2ngcN.js} +1 -1
- package/dist/{session-BzQdcCqN.js → session-BJHsjD3z.js} +1 -1
- package/dist/{session-4FpEJvkE.js → session-C_b1ttHJ.js} +1 -1
- package/dist/{session-dirs-OxQuIvJW.js → session-dirs-Bvbgw0GC.js} +1 -1
- package/dist/{session-dirs-D_ARkyw0.js → session-dirs-DHaoq7zc.js} +1 -1
- package/dist/{session-utils-GMvum00v.js → session-utils-Dxou8SbO.js} +1 -1
- package/dist/{sessions-Bl1wwotX.js → sessions-BA8Se_bT.js} +1 -1
- package/dist/{sessions-CdanN_ZI.js → sessions-BuZVmOWt.js} +1 -1
- package/dist/{sessions-B5dwRhUC.js → sessions-DvbW0FNJ.js} +1 -1
- package/dist/{sessions-B1t7qeEn.js → sessions-DvqsIg0M.js} +1 -1
- package/dist/{shared-xj-xaKFi.js → shared-BBOiNdjf.js} +1 -1
- package/dist/{shared-BPN3qd7G.js → shared-C2orjbTD.js} +1 -1
- package/dist/{skill-scanner-U3AJgjqc.js → skill-scanner-BEvov9QH.js} +1 -1
- package/dist/{skill-scanner-DEmbPsRh.js → skill-scanner-OTLeRZ_p.js} +1 -1
- package/dist/{skills-cli-CIdnXa3B.js → skills-cli-C1BOgB3y.js} +1 -1
- package/dist/{skills-cli-BXbGr7vl.js → skills-cli-CFT2Aq5R.js} +1 -1
- package/dist/{skills-install-Btw_GHbI.js → skills-install-LlKntDHa.js} +1 -1
- package/dist/{skills-install-DMHQRpIl.js → skills-install-tx5Mahav.js} +1 -1
- package/dist/{status-DXaDS_0w.js → status-Bh8V7kjv.js} +1 -1
- package/dist/{status-BxeKmkVr.js → status-BtBHmhQh.js} +1 -1
- package/dist/{status-BkcmeZg6.js → status-CpwD4y9B.js} +1 -1
- package/dist/status-CqaTmyih.js +1 -0
- package/dist/{status-DouJcFzf.js → status-yXz8PUbL.js} +1 -1
- package/dist/{status.update-C9iy31xr.js → status.update-CdgsLBPg.js} +1 -1
- package/dist/{status.update-KYyRSDZY.js → status.update-hzMro-BT.js} +1 -1
- package/dist/{subagent-registry-Dr20nzwk.js → subagent-registry-CaRUNwCj.js} +1 -1
- package/dist/{subagent-registry-CyGxu3kP.js → subagent-registry-DDEN4oJi.js} +10 -10
- package/dist/{subagent-registry-BiXkIDeh.js → subagent-registry-DYYfeIc3.js} +1 -1
- package/dist/{system-cli-b4YgXPHv.js → system-cli-4aii1JYf.js} +1 -1
- package/dist/{system-cli-C7YzJeP4.js → system-cli-CfkDD3FV.js} +1 -1
- package/dist/{tui-DylWbrDx.js → tui-DnVRxfI8.js} +2 -2
- package/dist/{tui-BwWMByVp.js → tui-JfWoLGIV.js} +2 -2
- package/dist/{tui-cli-C_TTgabr.js → tui-cli-CGjg2Eb5.js} +1 -1
- package/dist/{tui-cli-Bh1V8-w9.js → tui-cli-cd7Efw5u.js} +1 -1
- package/dist/{tui-setup-check-DJZCJokQ.js → tui-setup-check-BEHm9wwo.js} +1 -1
- package/dist/{tui-setup-check-BABAyl-e.js → tui-setup-check-DK8vdhLI.js} +1 -1
- package/dist/{tui-stream-assembler-ign_cPkv.js → tui-stream-assembler-8ud9oyMK.js} +1 -1
- package/dist/{tui-stream-assembler-q9GANTDr.js → tui-stream-assembler-Br15rhRH.js} +1 -1
- package/dist/{update-BUzcmoDf.js → update-B5yKFeGO.js} +1 -1
- package/dist/{update-D6U-V8Au.js → update-DodoQDCk.js} +1 -1
- package/dist/{update-cli-DUrUIrYQ.js → update-cli-CfJJcSUS.js} +1 -1
- package/dist/{update-cli-CA3LuuJ7.js → update-cli-x8Ocbf-0.js} +1 -1
- package/dist/{usage-cli-CfEg1_NZ.js → usage-cli-CN7L1YRG.js} +1 -1
- package/dist/{usage-cli-CpbYMXxS.js → usage-cli-CQmokGkG.js} +1 -1
- package/dist/{web-D-NSyF6b.js → web-BXLk9UT2.js} +1 -1
- package/dist/web-Btgs8oWv.js +1 -0
- package/dist/{webhooks-cli-B_f61rq7.js → webhooks-cli-DIo8p3lk.js} +1 -1
- package/dist/{webhooks-cli-Bi0t3w6P.js → webhooks-cli-DhxEtiFt.js} +1 -1
- package/dist/{whatsapp-actions-JbF2MrTV.js → whatsapp-actions-B7r9AyZN.js} +1 -1
- package/dist/{whatsapp-actions-BkCMhD9X.js → whatsapp-actions-DX2QU6Gs.js} +1 -1
- package/dist/{with-timeout-T07SJo4N.js → with-timeout-B_p5pWDv.js} +1 -1
- package/dist/{with-timeout-Bwq-GyUQ.js → with-timeout-GDLpcjW7.js} +1 -1
- package/dist/workflow-telemetry-BMTg5lPd.js +1 -0
- package/dist/workflow-telemetry-Bg8MVUr_.js +2 -0
- package/dist/workflow-telemetry-Do1UsYwM.js +1 -0
- package/dist/workflow-telemetry-DqBPhVL4.js +2 -0
- package/package.json +1 -1
- package/dist/agents-DsZ5vLKE.js +0 -1
- package/dist/auth-choice-Btd2Rxxd.js +0 -1
- package/dist/auth-choice-CVV9wRFN.js +0 -1
- package/dist/auth-choice.apply-BOK9XRCQ.js +0 -1
- package/dist/auth-choice.apply-Cv-BiV5Q.js +0 -1
- package/dist/auth-choice.apply.transformers-CXywS3GZ.js +0 -1
- package/dist/builderforce-onboarding-Dq6VUSKZ.js +0 -24
- package/dist/builderforce-onboarding-DuUfZ6oL.js +0 -24
- package/dist/configure-CWBBFk3F.js +0 -1
- package/dist/configure-fHVOAucW.js +0 -1
- package/dist/health-GLcAfqDz.js +0 -1
- package/dist/login-CPyEf5h6.js +0 -1
- package/dist/model-catalog-J7R-tJDu.js +0 -1
- package/dist/model-picker-D2bcWrtu.js +0 -1
- package/dist/model-picker-DO1HtEEm.js +0 -1
- package/dist/onboard-channels-CmqKsAoW.js +0 -1
- package/dist/onboard-channels-Db0P4iWl.js +0 -1
- package/dist/onboard-custom-BABqIYa4.js +0 -1
- package/dist/onboard-custom-VpW3UC8u.js +0 -1
- package/dist/plugin-registry-B-UOeWqM.js +0 -1
- package/dist/plugin-registry-BjMr3yXM.js +0 -1
- package/dist/plugin-sdk/web-CThgoHQp.js +0 -1
- package/dist/provider-dispatcher-C4nHaNqn.js +0 -1
- package/dist/register.configure-DAL38e7r.js +0 -1
- package/dist/register.configure-DZG7-WVi.js +0 -1
- package/dist/status-BTYqHVha.js +0 -1
- package/dist/web-P6QsgmSD.js +0 -1
- package/dist/workflow-telemetry-B8Im0mPk.js +0 -1
- package/dist/workflow-telemetry-DLEnm5TI.js +0 -2
- package/dist/workflow-telemetry-Dc_oseV7.js +0 -2
- package/dist/workflow-telemetry-Dkm3mofI.js +0 -1
- /package/dist/{devtools-CI7JyCXv.js → devtools-Cg4F-l9O.js} +0 -0
- /package/dist/{devtools-eMFaIsAT.js → devtools-Dl2DACSO.js} +0 -0
- /package/dist/{github-copilot-token-D3gHtNUu.js → github-copilot-token-BlyiXyTy.js} +0 -0
- /package/dist/{github-copilot-token-DHP2kAiN.js → github-copilot-token-D5sB2AUI.js} +0 -0
- /package/dist/{onboard-hooks-Cenav0eW.js → onboard-hooks-BaOSgxs9.js} +0 -0
- /package/dist/{onboard-hooks-Ce20rwpW.js → onboard-hooks-fO5eeDe_.js} +0 -0
- /package/dist/{qmd-manager-DVd_aWEV.js → qmd-manager-BgplOjHN.js} +0 -0
- /package/dist/{qmd-manager-keHvLmvP.js → qmd-manager-COUi_Fqb.js} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{in as ensureAuthProfileStore}from"./model-selection-
|
|
2
|
-
This handles coding tasks, complex reasoning, and everything the local brain defers.`,`Configure LLM`);let llmChoice=await promptAuthChoiceGrouped({prompter:params.prompter,store:await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),includeSkip:!1}),{applyAuthChoice}=await import(`./auth-choice.apply-
|
|
1
|
+
import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{in as ensureAuthProfileStore}from"./model-selection-DG9J_VTz.js";import{s as downloadBuilderForceAgentsLlmModel}from"./transformers-stream-D7nRu4Qu.js";import{t as promptAuthChoiceGrouped}from"./auth-choice-prompt-wkrUXDfB.js";import{r as applyPrimaryModel}from"./model-picker-EIhpfOZa.js";import path from"node:path";const BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID=`builderforcellm-local`,TRANSFORMERS_PROVIDER_ID=BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID,AMYGDALA_MODEL_ID=`HuggingFaceTB/SmolLM2-1.7B-Instruct`,AMYGDALA_DTYPE=`q4`,HIPPOCAMPUS_MODEL_ID=`onnx-community/Qwen3-0.6B-ONNX`,HIPPOCAMPUS_DTYPE=`q4f16`;function defaultCacheDir(){return path.join(resolveStateDir(),`models`)}function toModelKey(modelId){return`${TRANSFORMERS_PROVIDER_ID}/${modelId}`}function applyTransformersProviderConfig(cfg,amygdalaModelId,amygdalaDtype,hippocampusModelId,hippocampusDtype,cacheDir){return{...cfg,models:{...cfg.models,mode:cfg.models?.mode??`merge`,providers:{...cfg.models?.providers,[TRANSFORMERS_PROVIDER_ID]:{baseUrl:cacheDir,api:`transformers`,apiKey:`local`,models:[{id:amygdalaModelId,name:`amygdala (${amygdalaModelId})`,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:8192,maxTokens:2048,headers:{"x-transformers-dtype":amygdalaDtype,"x-brain-role":`amygdala`}},{id:hippocampusModelId,name:`hippocampus (${hippocampusModelId})`,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:40960,maxTokens:4096,headers:{"x-transformers-dtype":hippocampusDtype,"x-brain-role":`hippocampus`}}]}}},localBrain:{...cfg.localBrain,enabled:!0,models:{amygdala:{modelId:amygdalaModelId,dtype:amygdalaDtype},hippocampus:{modelId:hippocampusModelId,dtype:hippocampusDtype}}}}}function extractPrimaryModel(cfg){let model=cfg.agents?.defaults?.model;if(typeof model==`string`)return model;if(model&&typeof model==`object`)return model.primary}function setModelWithFallback(cfg,primary,fallback){let defaults=cfg.agents?.defaults,existingModel=defaults?.model;return{...cfg,agents:{...cfg.agents,defaults:{...defaults,model:{...typeof existingModel==`object`?existingModel:void 0,primary,fallbacks:[fallback]}}}}}async function downloadAndWireLocalBrain(opts){let nextConfig=opts.config,configuredModelKey=extractPrimaryModel(nextConfig),amygdalaModelId=nextConfig.localBrain?.models?.amygdala?.modelId??AMYGDALA_MODEL_ID,amygdalaDtype=nextConfig.localBrain?.models?.amygdala?.dtype??`q4`,hippocampusModelId=nextConfig.localBrain?.models?.hippocampus?.modelId??HIPPOCAMPUS_MODEL_ID,hippocampusDtype=nextConfig.localBrain?.models?.hippocampus?.dtype??HIPPOCAMPUS_DTYPE,cacheDir=defaultCacheDir();nextConfig=applyTransformersProviderConfig(nextConfig,amygdalaModelId,amygdalaDtype,hippocampusModelId,hippocampusDtype,cacheDir);let lastFile=``,amygdalaSpinner=opts.prompter.progress(`Downloading amygdala (${amygdalaModelId}, ${amygdalaDtype})… (~0.9 GB)`);try{await downloadBuilderForceAgentsLlmModel({modelId:amygdalaModelId,dtype:amygdalaDtype,cacheDir,onProgress:(file,pct)=>{file!==lastFile&&(lastFile=file),amygdalaSpinner.update(`Amygdala: ${path.basename(file)} — ${pct}%`)}}),amygdalaSpinner.stop(`Amygdala (fast router) downloaded and ready.`)}catch(err){let msg=err instanceof Error?err.message:String(err);return amygdalaSpinner.stop(`Amygdala download failed: ${msg}\nThe cortex (registered LLM) will be used without a local brain.\nRe-run "builderforce configure" to try again.`),{config:nextConfig}}lastFile=``;let hippoSpinner=opts.prompter.progress(`Downloading hippocampus (${hippocampusModelId}, ${hippocampusDtype})… (~2.3 GB)`);try{await downloadBuilderForceAgentsLlmModel({modelId:hippocampusModelId,dtype:hippocampusDtype,cacheDir,onProgress:(file,pct)=>{file!==lastFile&&(lastFile=file),hippoSpinner.update(`Hippocampus: ${path.basename(file)} — ${pct}%`)}}),hippoSpinner.stop(`Hippocampus (memory model) downloaded and ready.`)}catch(err){let msg=err instanceof Error?err.message:String(err);hippoSpinner.stop(`Hippocampus download failed: ${msg}\nAmygdala will run solo; hippocampus features disabled.\nRe-run "builderforce configure" to try again.`)}let localModelKey=toModelKey(amygdalaModelId);return nextConfig=configuredModelKey&&configuredModelKey!==localModelKey?setModelWithFallback(nextConfig,localModelKey,configuredModelKey):applyPrimaryModel(nextConfig,localModelKey),{config:nextConfig}}async function applyAuthChoiceTransformers(params){if(params.authChoice!==`builderforcellm-local`)return null;await params.prompter.note(`First, pick your main LLM provider.
|
|
2
|
+
This handles coding tasks, complex reasoning, and everything the local brain defers.`,`Configure LLM`);let llmChoice=await promptAuthChoiceGrouped({prompter:params.prompter,store:await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),includeSkip:!1}),{applyAuthChoice}=await import(`./auth-choice.apply-6f3Jb_lS.js`),nextConfig=(await applyAuthChoice({authChoice:llmChoice,config:params.config,prompter:params.prompter,runtime:params.runtime,setDefaultModel:!0})).config;return await params.prompter.confirm({message:`Enable local brain? (handles simple tasks, defers complex ones)`,initialValue:!0})?{config:(await downloadAndWireLocalBrain({config:nextConfig,prompter:params.prompter})).config}:{config:nextConfig}}export{HIPPOCAMPUS_MODEL_ID as a,applyTransformersProviderConfig as c,HIPPOCAMPUS_DTYPE as i,defaultCacheDir as l,AMYGDALA_MODEL_ID as n,TRANSFORMERS_PROVIDER_ID as o,BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID as r,applyAuthChoiceTransformers as s,AMYGDALA_DTYPE as t,downloadAndWireLocalBrain as u};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import{b as ensureAuthProfileStore}from"./auth-profiles-
|
|
2
|
-
This handles coding tasks, complex reasoning, and everything the local brain defers.`,`Configure LLM`);let llmChoice=await promptAuthChoiceGrouped({prompter:params.prompter,store:await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),includeSkip:!1}),{applyAuthChoice}=await import(`./auth-choice.apply-
|
|
1
|
+
import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import{b as ensureAuthProfileStore}from"./auth-profiles-pt7Tr4HA.js";import{s as downloadBuilderForceAgentsLlmModel}from"./transformers-stream-Buj40qHl.js";import{t as promptAuthChoiceGrouped}from"./auth-choice-prompt-bUhkxDnM.js";import{r as applyPrimaryModel}from"./model-picker-CGDNPRPc.js";import path from"node:path";const BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID=`builderforcellm-local`,TRANSFORMERS_PROVIDER_ID=BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID,AMYGDALA_MODEL_ID=`HuggingFaceTB/SmolLM2-1.7B-Instruct`,AMYGDALA_DTYPE=`q4`,HIPPOCAMPUS_MODEL_ID=`onnx-community/Qwen3-0.6B-ONNX`,HIPPOCAMPUS_DTYPE=`q4f16`;function defaultCacheDir(){return path.join(resolveStateDir(),`models`)}function toModelKey(modelId){return`${TRANSFORMERS_PROVIDER_ID}/${modelId}`}function applyTransformersProviderConfig(cfg,amygdalaModelId,amygdalaDtype,hippocampusModelId,hippocampusDtype,cacheDir){return{...cfg,models:{...cfg.models,mode:cfg.models?.mode??`merge`,providers:{...cfg.models?.providers,[TRANSFORMERS_PROVIDER_ID]:{baseUrl:cacheDir,api:`transformers`,apiKey:`local`,models:[{id:amygdalaModelId,name:`amygdala (${amygdalaModelId})`,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:8192,maxTokens:2048,headers:{"x-transformers-dtype":amygdalaDtype,"x-brain-role":`amygdala`}},{id:hippocampusModelId,name:`hippocampus (${hippocampusModelId})`,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:40960,maxTokens:4096,headers:{"x-transformers-dtype":hippocampusDtype,"x-brain-role":`hippocampus`}}]}}},localBrain:{...cfg.localBrain,enabled:!0,models:{amygdala:{modelId:amygdalaModelId,dtype:amygdalaDtype},hippocampus:{modelId:hippocampusModelId,dtype:hippocampusDtype}}}}}function extractPrimaryModel(cfg){let model=cfg.agents?.defaults?.model;if(typeof model==`string`)return model;if(model&&typeof model==`object`)return model.primary}function setModelWithFallback(cfg,primary,fallback){let defaults=cfg.agents?.defaults,existingModel=defaults?.model;return{...cfg,agents:{...cfg.agents,defaults:{...defaults,model:{...typeof existingModel==`object`?existingModel:void 0,primary,fallbacks:[fallback]}}}}}async function downloadAndWireLocalBrain(opts){let nextConfig=opts.config,configuredModelKey=extractPrimaryModel(nextConfig),amygdalaModelId=nextConfig.localBrain?.models?.amygdala?.modelId??AMYGDALA_MODEL_ID,amygdalaDtype=nextConfig.localBrain?.models?.amygdala?.dtype??`q4`,hippocampusModelId=nextConfig.localBrain?.models?.hippocampus?.modelId??HIPPOCAMPUS_MODEL_ID,hippocampusDtype=nextConfig.localBrain?.models?.hippocampus?.dtype??HIPPOCAMPUS_DTYPE,cacheDir=defaultCacheDir();nextConfig=applyTransformersProviderConfig(nextConfig,amygdalaModelId,amygdalaDtype,hippocampusModelId,hippocampusDtype,cacheDir);let lastFile=``,amygdalaSpinner=opts.prompter.progress(`Downloading amygdala (${amygdalaModelId}, ${amygdalaDtype})… (~0.9 GB)`);try{await downloadBuilderForceAgentsLlmModel({modelId:amygdalaModelId,dtype:amygdalaDtype,cacheDir,onProgress:(file,pct)=>{file!==lastFile&&(lastFile=file),amygdalaSpinner.update(`Amygdala: ${path.basename(file)} — ${pct}%`)}}),amygdalaSpinner.stop(`Amygdala (fast router) downloaded and ready.`)}catch(err){let msg=err instanceof Error?err.message:String(err);return amygdalaSpinner.stop(`Amygdala download failed: ${msg}\nThe cortex (registered LLM) will be used without a local brain.\nRe-run "builderforce configure" to try again.`),{config:nextConfig}}lastFile=``;let hippoSpinner=opts.prompter.progress(`Downloading hippocampus (${hippocampusModelId}, ${hippocampusDtype})… (~2.3 GB)`);try{await downloadBuilderForceAgentsLlmModel({modelId:hippocampusModelId,dtype:hippocampusDtype,cacheDir,onProgress:(file,pct)=>{file!==lastFile&&(lastFile=file),hippoSpinner.update(`Hippocampus: ${path.basename(file)} — ${pct}%`)}}),hippoSpinner.stop(`Hippocampus (memory model) downloaded and ready.`)}catch(err){let msg=err instanceof Error?err.message:String(err);hippoSpinner.stop(`Hippocampus download failed: ${msg}\nAmygdala will run solo; hippocampus features disabled.\nRe-run "builderforce configure" to try again.`)}let localModelKey=toModelKey(amygdalaModelId);return nextConfig=configuredModelKey&&configuredModelKey!==localModelKey?setModelWithFallback(nextConfig,localModelKey,configuredModelKey):applyPrimaryModel(nextConfig,localModelKey),{config:nextConfig}}async function applyAuthChoiceTransformers(params){if(params.authChoice!==`builderforcellm-local`)return null;await params.prompter.note(`First, pick your main LLM provider.
|
|
2
|
+
This handles coding tasks, complex reasoning, and everything the local brain defers.`,`Configure LLM`);let llmChoice=await promptAuthChoiceGrouped({prompter:params.prompter,store:await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),includeSkip:!1}),{applyAuthChoice}=await import(`./auth-choice.apply-DeXnLwVS.js`),nextConfig=(await applyAuthChoice({authChoice:llmChoice,config:params.config,prompter:params.prompter,runtime:params.runtime,setDefaultModel:!0})).config;return await params.prompter.confirm({message:`Enable local brain? (handles simple tasks, defers complex ones)`,initialValue:!0})?{config:(await downloadAndWireLocalBrain({config:nextConfig,prompter:params.prompter})).config}:{config:nextConfig}}export{HIPPOCAMPUS_MODEL_ID as a,applyTransformersProviderConfig as c,HIPPOCAMPUS_DTYPE as i,defaultCacheDir as l,AMYGDALA_MODEL_ID as n,TRANSFORMERS_PROVIDER_ID as o,BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID as r,applyAuthChoiceTransformers as s,AMYGDALA_DTYPE as t,downloadAndWireLocalBrain as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-
|
|
1
|
+
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./model-catalog-DjNiebr7.js";import"./transformers-stream-D7nRu4Qu.js";import"./shared-C2orjbTD.js";import"./model-picker-EIhpfOZa.js";import{u as downloadAndWireLocalBrain}from"./auth-choice.apply.transformers-Df9l_jRz.js";export{downloadAndWireLocalBrain};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-
|
|
1
|
+
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import{t as ensureAuthJsonFromAuthProfiles}from"./auth-json-CoOe4tEg.js";export{ensureAuthJsonFromAuthProfiles};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-pt7Tr4HA.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{t as ensureAuthJsonFromAuthProfiles}from"./auth-json-wrKixZxh.js";export{ensureAuthJsonFromAuthProfiles};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{in as ensureAuthProfileStore,u as normalizeProviderId}from"./model-selection-
|
|
1
|
+
import{in as ensureAuthProfileStore,u as normalizeProviderId}from"./model-selection-DG9J_VTz.js";import path from"node:path";import fs from"node:fs/promises";async function readAuthJson(filePath){try{let raw=await fs.readFile(filePath,`utf8`),parsed=JSON.parse(raw);return!parsed||typeof parsed!=`object`?{}:parsed}catch{return{}}}function convertCredential(cred){if(cred.type===`api_key`){let key=typeof cred.key==`string`?cred.key.trim():``;return key?{type:`api_key`,key}:null}if(cred.type===`token`){let token=typeof cred.token==`string`?cred.token.trim():``;if(!token)return null;let expires=typeof cred.expires==`number`?cred.expires:NaN;return Number.isFinite(expires)&&expires>0&&Date.now()>=expires?null:{type:`api_key`,key:token}}if(cred.type===`oauth`){let accessRaw=cred.access,refreshRaw=cred.refresh,expiresRaw=cred.expires,access=typeof accessRaw==`string`?accessRaw.trim():``,refresh=typeof refreshRaw==`string`?refreshRaw.trim():``,expires=typeof expiresRaw==`number`?expiresRaw:NaN;return!access||!refresh||!Number.isFinite(expires)||expires<=0?null:{type:`oauth`,access,refresh,expires}}return null}function credentialsEqual(a,b){return!a||typeof a!=`object`||a.type!==b.type?!1:a.type===`api_key`&&b.type===`api_key`?a.key===b.key:a.type===`oauth`&&b.type===`oauth`?a.access===b.access&&a.refresh===b.refresh&&a.expires===b.expires:!1}async function ensureAuthJsonFromAuthProfiles(agentDir){let store=await ensureAuthProfileStore(agentDir,{allowKeychainPrompt:!1}),authPath=path.join(agentDir,`auth.json`),providerCredentials=new Map;for(let[,cred]of Object.entries(store.profiles)){let provider=normalizeProviderId(String(cred.provider??``)).trim();if(!provider||providerCredentials.has(provider))continue;let converted=convertCredential(cred);converted&&providerCredentials.set(provider,converted)}if(providerCredentials.size===0)return{wrote:!1,authPath};let existing=await readAuthJson(authPath),changed=!1;for(let[provider,cred]of providerCredentials)credentialsEqual(existing[provider],cred)||(existing[provider]=cred,changed=!0);return changed?(await fs.mkdir(agentDir,{recursive:!0,mode:448}),await fs.writeFile(authPath,`${JSON.stringify(existing,null,2)}\n`,{mode:384}),{wrote:!0,authPath}):{wrote:!1,authPath}}export{ensureAuthJsonFromAuthProfiles as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{R as normalizeProviderId,b as ensureAuthProfileStore}from"./auth-profiles-
|
|
1
|
+
import{R as normalizeProviderId,b as ensureAuthProfileStore}from"./auth-profiles-pt7Tr4HA.js";import path from"node:path";import fs from"node:fs/promises";async function readAuthJson(filePath){try{let raw=await fs.readFile(filePath,`utf8`),parsed=JSON.parse(raw);return!parsed||typeof parsed!=`object`?{}:parsed}catch{return{}}}function convertCredential(cred){if(cred.type===`api_key`){let key=typeof cred.key==`string`?cred.key.trim():``;return key?{type:`api_key`,key}:null}if(cred.type===`token`){let token=typeof cred.token==`string`?cred.token.trim():``;if(!token)return null;let expires=typeof cred.expires==`number`?cred.expires:NaN;return Number.isFinite(expires)&&expires>0&&Date.now()>=expires?null:{type:`api_key`,key:token}}if(cred.type===`oauth`){let accessRaw=cred.access,refreshRaw=cred.refresh,expiresRaw=cred.expires,access=typeof accessRaw==`string`?accessRaw.trim():``,refresh=typeof refreshRaw==`string`?refreshRaw.trim():``,expires=typeof expiresRaw==`number`?expiresRaw:NaN;return!access||!refresh||!Number.isFinite(expires)||expires<=0?null:{type:`oauth`,access,refresh,expires}}return null}function credentialsEqual(a,b){return!a||typeof a!=`object`||a.type!==b.type?!1:a.type===`api_key`&&b.type===`api_key`?a.key===b.key:a.type===`oauth`&&b.type===`oauth`?a.access===b.access&&a.refresh===b.refresh&&a.expires===b.expires:!1}async function ensureAuthJsonFromAuthProfiles(agentDir){let store=await ensureAuthProfileStore(agentDir,{allowKeychainPrompt:!1}),authPath=path.join(agentDir,`auth.json`),providerCredentials=new Map;for(let[,cred]of Object.entries(store.profiles)){let provider=normalizeProviderId(String(cred.provider??``)).trim();if(!provider||providerCredentials.has(provider))continue;let converted=convertCredential(cred);converted&&providerCredentials.set(provider,converted)}if(providerCredentials.size===0)return{wrote:!1,authPath};let existing=await readAuthJson(authPath),changed=!1;for(let[provider,cred]of providerCredentials)credentialsEqual(existing[provider],cred)||(existing[provider]=cred,changed=!0);return changed?(await fs.mkdir(agentDir,{recursive:!0,mode:448}),await fs.writeFile(authPath,`${JSON.stringify(existing,null,2)}\n`,{mode:384}),{wrote:!0,authPath}):{wrote:!1,authPath}}export{ensureAuthJsonFromAuthProfiles as t};
|
|
@@ -52,7 +52,7 @@ Use this EXACT format:
|
|
|
52
52
|
Keep each section concise. Preserve exact file paths, function names, and error messages.`;customInstructions&&(basePrompt=`${basePrompt}\n\nAdditional focus: ${customInstructions}`);let promptText=`<conversation>\n${serializeConversation(defaultConvertToLlm(currentMessages))}\n</conversation>\n\n`;return previousSummary&&(promptText+=`<previous-summary>\n${previousSummary}\n</previous-summary>\n\n`),promptText+=basePrompt,(await nativeComplete({baseUrl:model.baseUrl,apiKey,defaultModel:model.id},{model:model.id,messages:[{role:`system`,content:`You are a context summarization assistant. Your task is to read a conversation between a user and an AI coding assistant, then produce a structured summary following the exact format specified.
|
|
53
53
|
|
|
54
54
|
Do NOT continue the conversation. Do NOT respond to any questions in the conversation. ONLY output the structured summary.`},{role:`user`,content:promptText}],extra:{max_tokens:maxTokens}},signal)).content}function isPersistable(role){return role===`user`||role===`assistant`||role===`toolResult`}var AgentSession=class{constructor(opts){this._isCompacting=!1,this.sessionManager=opts.sessionManager??SessionManager.create(opts.cwd??process.cwd()),this.settingsManager=opts.settingsManager??SettingsManager.create(opts.cwd);let tools=[...opts.tools??[],...opts.customTools??[]];this.agent=new Agent({model:opts.model,tools,systemPrompt:opts.systemPrompt,thinkingLevel:opts.thinkingLevel,convertToLlm:opts.convertToLlm,transformContext:opts.transformContext,getApiKey:opts.getApiKey,...opts.pickFallbackModel?{pickFallbackModel:opts.pickFallbackModel}:{},...opts.onModelFallback?{onModelFallback:opts.onModelFallback}:{}}),this.agent.sessionId=this.sessionManager.getSessionId(),opts.streamFn&&(this.agent.streamFn=opts.streamFn);let restored=this.sessionManager.buildSessionContext();restored.messages.length>0&&this.agent.replaceMessages(restored.messages),this.unsubscribe=this.agent.subscribe(event=>{event.type===`message_end`&&isPersistable(event.message.role)&&this.sessionManager.appendMessage(event.message)})}get sessionId(){return this.sessionManager.getSessionId()}get messages(){return this.agent.state.messages}get isStreaming(){return this.agent.isStreaming}get isCompacting(){return this._isCompacting}setCompacting(v){this._isCompacting=v}replaceMessages(ms){this.agent.replaceMessages(ms)}subscribe(fn){return this.agent.subscribe(fn)}async prompt(content,opts){let userContent=opts?.images?.length?[{type:`text`,text:content},...opts.images]:content;await this.agent.prompt([{role:`user`,content:userContent,timestamp:Date.now()}])}async steer(text){this.agent.steer({role:`user`,content:text,timestamp:Date.now()})}abort(){this.agent.abort()}abortCompaction(){this._compactionAbort?.abort()}async compact(customInstructions){this.setCompacting(!0),this._compactionAbort=new AbortController;try{let model=this.agent.state.model,apiKey=await this.agent.getApiKey?.(model.provider)??``,branch=this.sessionManager.getBranch();if(branch[branch.length-1]?.type===`compaction`)throw Error(`Already compacted`);let messageEntries=branch.filter(e=>e.type===`message`);if(messageEntries.length<2)throw Error(`Nothing to compact (session too small)`);let keepRecent=this.settingsManager.getCompactionKeepRecentTokens(),reserve=this.settingsManager.getCompactionReserveTokens(),tokensBefore=messageEntries.reduce((s,e)=>s+estimateTokens(e.message),0),acc=0,firstKeptIdx=messageEntries.length-1;for(let i=messageEntries.length-1;i>=0&&(acc+=estimateTokens(messageEntries[i].message),firstKeptIdx=i,!(acc>=keepRecent));i--);firstKeptIdx<=0&&(firstKeptIdx=Math.max(1,Math.floor(messageEntries.length/2)));let firstKeptEntryId=messageEntries[firstKeptIdx].id,summary=await generateSummary(messageEntries.slice(0,firstKeptIdx).map(e=>e.message),model,reserve,apiKey,this._compactionAbort.signal,customInstructions);return this.sessionManager.appendCompaction(summary,firstKeptEntryId,tokensBefore),this.agent.replaceMessages(this.sessionManager.buildSessionContext().messages),{summary,firstKeptEntryId,tokensBefore}}finally{this.setCompacting(!1)}}dispose(){this.unsubscribe()}};async function createAgentSession(options){return{session:new AgentSession(options)}}function toAgentToolResult(result){let content=[{type:`text`,text:JSON.stringify(result.data)}];for(let block of result.content??[])block.type===`text`?content.push({type:`text`,text:block.text}):block.type===`media`&&block.mediaType===`image`&&content.push({type:`image`,data:block.base64??block.uri??block.path??``,mimeType:block.mimeType??`image/png`});return{content,details:result}}function toAgentTool(def,provider,workspaceRoot,exposedName){let name=exposedName??def.name,parameters=def.schema.function.parameters;return{name,label:name,description:def.schema.function.description,parameters,execute:async(_toolCallId,params,signal,onUpdate)=>{let ctx={caps:provider,signal,workspaceRoot,...onUpdate?{onUpdate:partial=>onUpdate(toAgentToolResult(partial))}:{}};return toAgentToolResult(await def.execute(params??{},ctx))}}}function registryToAgentTools(registry,provider,workspaceRoot,aliases){return registry.toolsFor(provider).map(def=>toAgentTool(def,provider,workspaceRoot,aliases?.[def.name]))}const OLLAMA_NATIVE_BASE_URL=`http://127.0.0.1:11434`;function extractTextContent(content){return typeof content==`string`?content:Array.isArray(content)?content.filter(part=>part.type===`text`).map(part=>part.text).join(``):``}function extractOllamaImages(content){return Array.isArray(content)?content.filter(part=>part.type===`image`).map(part=>part.data):[]}function extractToolCalls(content){if(!Array.isArray(content))return[];let parts=content,result=[];for(let part of parts)part.type===`toolCall`?result.push({function:{name:part.name,arguments:part.arguments}}):part.type===`tool_use`&&result.push({function:{name:part.name,arguments:part.input}});return result}function convertToOllamaMessages(messages,system){let result=[];system&&result.push({role:`system`,content:system});for(let msg of messages){let{role}=msg;if(role===`user`){let text=extractTextContent(msg.content),images=extractOllamaImages(msg.content);result.push({role:`user`,content:text,...images.length>0?{images}:{}})}else if(role===`assistant`){let text=extractTextContent(msg.content),toolCalls=extractToolCalls(msg.content);result.push({role:`assistant`,content:text,...toolCalls.length>0?{tool_calls:toolCalls}:{}})}else if(role===`tool`||role===`toolResult`){let text=extractTextContent(msg.content),toolName=typeof msg.toolName==`string`?msg.toolName:void 0;result.push({role:`tool`,content:text,...toolName?{tool_name:toolName}:{}})}}return result}function extractOllamaTools(tools){if(!tools||!Array.isArray(tools))return[];let result=[];for(let tool of tools)typeof tool.name!=`string`||!tool.name||result.push({type:`function`,function:{name:tool.name,description:typeof tool.description==`string`?tool.description:``,parameters:tool.parameters??{}}});return result}function buildAssistantMessage(response,modelInfo){let content=[],text=response.message.content||response.message.reasoning||``;text&&content.push({type:`text`,text});let toolCalls=response.message.tool_calls;if(toolCalls&&toolCalls.length>0)for(let tc of toolCalls)content.push({type:`toolCall`,id:`ollama_call_${randomUUID()}`,name:tc.function.name,arguments:tc.function.arguments});let stopReason=toolCalls&&toolCalls.length>0?`toolUse`:`stop`,usage={input:response.prompt_eval_count??0,output:response.eval_count??0,cacheRead:0,cacheWrite:0,totalTokens:(response.prompt_eval_count??0)+(response.eval_count??0),cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};return{role:`assistant`,content,stopReason,api:modelInfo.api,provider:modelInfo.provider,model:modelInfo.id,usage,timestamp:Date.now()}}async function*parseNdjsonStream(reader){let decoder=new TextDecoder,buffer=``;for(;;){let{done,value}=await reader.read();if(done)break;buffer+=decoder.decode(value,{stream:!0});let lines=buffer.split(`
|
|
55
|
-
`);buffer=lines.pop()??``;for(let line of lines){let trimmed=line.trim();if(trimmed)try{yield JSON.parse(trimmed)}catch{console.warn(`[ollama-stream] Skipping malformed NDJSON line:`,trimmed.slice(0,120))}}}if(buffer.trim())try{yield JSON.parse(buffer.trim())}catch{console.warn(`[ollama-stream] Skipping malformed trailing data:`,buffer.trim().slice(0,120))}}function resolveOllamaChatUrl(baseUrl){return`${normalizeBaseUrl(baseUrl.trim()).replace(/\/v1$/i,``)||OLLAMA_NATIVE_BASE_URL}/api/chat`}function createOllamaStreamFn(baseUrl){let chatUrl=resolveOllamaChatUrl(baseUrl);return(model,context,options)=>{let stream=createAssistantMessageEventStream(),run=async()=>{try{let ollamaMessages=convertToOllamaMessages(context.messages??[],context.systemPrompt),ollamaTools=extractOllamaTools(context.tools),ollamaOptions={num_ctx:model.contextWindow??65536};typeof options?.temperature==`number`&&(ollamaOptions.temperature=options.temperature),typeof options?.maxTokens==`number`&&(ollamaOptions.num_predict=options.maxTokens);let body={model:model.id,messages:ollamaMessages,stream:!0,...ollamaTools.length>0?{tools:ollamaTools}:{},options:ollamaOptions},headers={"Content-Type":`application/json`,...options?.headers};options?.apiKey&&(headers.Authorization=`Bearer ${options.apiKey}`);let response=await fetch(chatUrl,{method:`POST`,headers,body:JSON.stringify(body),signal:options?.signal});if(!response.ok){let errorText=await response.text().catch(()=>`unknown error`);throw Error(`Ollama API error ${response.status}: ${errorText}`)}if(!response.body)throw Error(`Ollama API returned empty response body`);let reader=response.body.getReader(),accumulatedContent=``,accumulatedToolCalls=[],finalResponse;for await(let chunk of parseNdjsonStream(reader))if(chunk.message?.content?accumulatedContent+=chunk.message.content:chunk.message?.reasoning&&(accumulatedContent+=chunk.message.reasoning),chunk.message?.tool_calls&&accumulatedToolCalls.push(...chunk.message.tool_calls),chunk.done){finalResponse=chunk;break}if(!finalResponse)throw Error(`Ollama API stream ended without a final response`);finalResponse.message.content=accumulatedContent,accumulatedToolCalls.length>0&&(finalResponse.message.tool_calls=accumulatedToolCalls);let assistantMessage=buildAssistantMessage(finalResponse,{api:model.api,provider:model.provider,id:model.id}),reason=assistantMessage.stopReason===`toolUse`?`toolUse`:`stop`;stream.push({type:`done`,reason,message:assistantMessage})}catch(err){let errorMessage=err instanceof Error?err.message:String(err);stream.push({type:`error`,reason:`error`,error:{role:`assistant`,content:[],stopReason:`error`,errorMessage,api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},timestamp:Date.now()}})}finally{stream.end()}};return queueMicrotask(()=>void run()),stream}}const SYNTHETIC_BASE_URL=`https://api.synthetic.new/anthropic`,SYNTHETIC_DEFAULT_MODEL_ID=`hf:MiniMaxAI/MiniMax-M2.1`,SYNTHETIC_DEFAULT_MODEL_REF=`synthetic/${SYNTHETIC_DEFAULT_MODEL_ID}`,SYNTHETIC_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0},SYNTHETIC_MODEL_CATALOG=[{id:SYNTHETIC_DEFAULT_MODEL_ID,name:`MiniMax M2.1`,reasoning:!1,input:[`text`],contextWindow:192e3,maxTokens:65536},{id:`hf:moonshotai/Kimi-K2-Thinking`,name:`Kimi K2 Thinking`,reasoning:!0,input:[`text`],contextWindow:256e3,maxTokens:8192},{id:`hf:zai-org/GLM-4.7`,name:`GLM-4.7`,reasoning:!1,input:[`text`],contextWindow:198e3,maxTokens:128e3},{id:`hf:deepseek-ai/DeepSeek-R1-0528`,name:`DeepSeek R1 0528`,reasoning:!1,input:[`text`],contextWindow:128e3,maxTokens:8192},{id:`hf:deepseek-ai/DeepSeek-V3-0324`,name:`DeepSeek V3 0324`,reasoning:!1,input:[`text`],contextWindow:128e3,maxTokens:8192},{id:`hf:deepseek-ai/DeepSeek-V3.1`,name:`DeepSeek V3.1`,reasoning:!1,input:[`text`],contextWindow:128e3,maxTokens:8192},{id:`hf:deepseek-ai/DeepSeek-V3.1-Terminus`,name:`DeepSeek V3.1 Terminus`,reasoning:!1,input:[`text`],contextWindow:128e3,maxTokens:8192},{id:`hf:deepseek-ai/DeepSeek-V3.2`,name:`DeepSeek V3.2`,reasoning:!1,input:[`text`],contextWindow:159e3,maxTokens:8192},{id:`hf:meta-llama/Llama-3.3-70B-Instruct`,name:`Llama 3.3 70B Instruct`,reasoning:!1,input:[`text`],contextWindow:128e3,maxTokens:8192},{id:`hf:meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8`,name:`Llama 4 Maverick 17B 128E Instruct FP8`,reasoning:!1,input:[`text`],contextWindow:524e3,maxTokens:8192},{id:`hf:moonshotai/Kimi-K2-Instruct-0905`,name:`Kimi K2 Instruct 0905`,reasoning:!1,input:[`text`],contextWindow:256e3,maxTokens:8192},{id:`hf:moonshotai/Kimi-K2.5`,name:`Kimi K2.5`,reasoning:!0,input:[`text`],contextWindow:256e3,maxTokens:8192},{id:`hf:openai/gpt-oss-120b`,name:`GPT OSS 120B`,reasoning:!1,input:[`text`],contextWindow:128e3,maxTokens:8192},{id:`hf:Qwen/Qwen3-235B-A22B-Instruct-2507`,name:`Qwen3 235B A22B Instruct 2507`,reasoning:!1,input:[`text`],contextWindow:256e3,maxTokens:8192},{id:`hf:Qwen/Qwen3-Coder-480B-A35B-Instruct`,name:`Qwen3 Coder 480B A35B Instruct`,reasoning:!1,input:[`text`],contextWindow:256e3,maxTokens:8192},{id:`hf:Qwen/Qwen3-VL-235B-A22B-Instruct`,name:`Qwen3 VL 235B A22B Instruct`,reasoning:!1,input:[`text`,`image`],contextWindow:25e4,maxTokens:8192},{id:`hf:zai-org/GLM-4.5`,name:`GLM-4.5`,reasoning:!1,input:[`text`],contextWindow:128e3,maxTokens:128e3},{id:`hf:zai-org/GLM-4.6`,name:`GLM-4.6`,reasoning:!1,input:[`text`],contextWindow:198e3,maxTokens:128e3},{id:`hf:zai-org/GLM-5`,name:`GLM-5`,reasoning:!0,input:[`text`,`image`],contextWindow:256e3,maxTokens:128e3},{id:`hf:deepseek-ai/DeepSeek-V3`,name:`DeepSeek V3`,reasoning:!1,input:[`text`],contextWindow:128e3,maxTokens:8192},{id:`hf:Qwen/Qwen3-235B-A22B-Thinking-2507`,name:`Qwen3 235B A22B Thinking 2507`,reasoning:!0,input:[`text`],contextWindow:256e3,maxTokens:8192}];function buildSyntheticModelDefinition(entry){return{id:entry.id,name:entry.name,reasoning:entry.reasoning,input:[...entry.input],cost:SYNTHETIC_DEFAULT_COST,contextWindow:entry.contextWindow,maxTokens:entry.maxTokens}}const TOGETHER_BASE_URL=`https://api.together.xyz/v1`,TOGETHER_MODEL_CATALOG=[{id:`zai-org/GLM-4.7`,name:`GLM 4.7 Fp8`,reasoning:!1,input:[`text`],contextWindow:202752,maxTokens:8192,cost:{input:.45,output:2,cacheRead:.45,cacheWrite:2}},{id:`moonshotai/Kimi-K2.5`,name:`Kimi K2.5`,reasoning:!0,input:[`text`,`image`],cost:{input:.5,output:2.8,cacheRead:.5,cacheWrite:2.8},contextWindow:262144,maxTokens:32768},{id:`meta-llama/Llama-3.3-70B-Instruct-Turbo`,name:`Llama 3.3 70B Instruct Turbo`,reasoning:!1,input:[`text`],contextWindow:131072,maxTokens:8192,cost:{input:.88,output:.88,cacheRead:.88,cacheWrite:.88}},{id:`meta-llama/Llama-4-Scout-17B-16E-Instruct`,name:`Llama 4 Scout 17B 16E Instruct`,reasoning:!1,input:[`text`,`image`],contextWindow:1e7,maxTokens:32768,cost:{input:.18,output:.59,cacheRead:.18,cacheWrite:.18}},{id:`meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8`,name:`Llama 4 Maverick 17B 128E Instruct FP8`,reasoning:!1,input:[`text`,`image`],contextWindow:2e7,maxTokens:32768,cost:{input:.27,output:.85,cacheRead:.27,cacheWrite:.27}},{id:`deepseek-ai/DeepSeek-V3.1`,name:`DeepSeek V3.1`,reasoning:!1,input:[`text`],contextWindow:131072,maxTokens:8192,cost:{input:.6,output:1.25,cacheRead:.6,cacheWrite:.6}},{id:`deepseek-ai/DeepSeek-R1`,name:`DeepSeek R1`,reasoning:!0,input:[`text`],contextWindow:131072,maxTokens:8192,cost:{input:3,output:7,cacheRead:3,cacheWrite:3}},{id:`moonshotai/Kimi-K2-Instruct-0905`,name:`Kimi K2-Instruct 0905`,reasoning:!1,input:[`text`],contextWindow:262144,maxTokens:8192,cost:{input:1,output:3,cacheRead:1,cacheWrite:3}}];function buildTogetherModelDefinition(model){return{id:model.id,name:model.name,api:`openai-completions`,reasoning:model.reasoning,input:model.input,cost:model.cost,contextWindow:model.contextWindow,maxTokens:model.maxTokens}}const VENICE_BASE_URL=`https://api.venice.ai/api/v1`,VENICE_DEFAULT_MODEL_REF=`venice/llama-3.3-70b`,VENICE_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0},VENICE_MODEL_CATALOG=[{id:`llama-3.3-70b`,name:`Llama 3.3 70B`,reasoning:!1,input:[`text`],contextWindow:131072,maxTokens:8192,privacy:`private`},{id:`llama-3.2-3b`,name:`Llama 3.2 3B`,reasoning:!1,input:[`text`],contextWindow:131072,maxTokens:8192,privacy:`private`},{id:`hermes-3-llama-3.1-405b`,name:`Hermes 3 Llama 3.1 405B`,reasoning:!1,input:[`text`],contextWindow:131072,maxTokens:8192,privacy:`private`},{id:`qwen3-235b-a22b-thinking-2507`,name:`Qwen3 235B Thinking`,reasoning:!0,input:[`text`],contextWindow:131072,maxTokens:8192,privacy:`private`},{id:`qwen3-235b-a22b-instruct-2507`,name:`Qwen3 235B Instruct`,reasoning:!1,input:[`text`],contextWindow:131072,maxTokens:8192,privacy:`private`},{id:`qwen3-coder-480b-a35b-instruct`,name:`Qwen3 Coder 480B`,reasoning:!1,input:[`text`],contextWindow:262144,maxTokens:8192,privacy:`private`},{id:`qwen3-next-80b`,name:`Qwen3 Next 80B`,reasoning:!1,input:[`text`],contextWindow:262144,maxTokens:8192,privacy:`private`},{id:`qwen3-vl-235b-a22b`,name:`Qwen3 VL 235B (Vision)`,reasoning:!1,input:[`text`,`image`],contextWindow:262144,maxTokens:8192,privacy:`private`},{id:`qwen3-4b`,name:`Venice Small (Qwen3 4B)`,reasoning:!0,input:[`text`],contextWindow:32768,maxTokens:8192,privacy:`private`},{id:`deepseek-v3.2`,name:`DeepSeek V3.2`,reasoning:!0,input:[`text`],contextWindow:163840,maxTokens:8192,privacy:`private`},{id:`venice-uncensored`,name:`Venice Uncensored (Dolphin-Mistral)`,reasoning:!1,input:[`text`],contextWindow:32768,maxTokens:8192,privacy:`private`},{id:`mistral-31-24b`,name:`Venice Medium (Mistral)`,reasoning:!1,input:[`text`,`image`],contextWindow:131072,maxTokens:8192,privacy:`private`},{id:`google-gemma-3-27b-it`,name:`Google Gemma 3 27B Instruct`,reasoning:!1,input:[`text`,`image`],contextWindow:202752,maxTokens:8192,privacy:`private`},{id:`openai-gpt-oss-120b`,name:`OpenAI GPT OSS 120B`,reasoning:!1,input:[`text`],contextWindow:131072,maxTokens:8192,privacy:`private`},{id:`zai-org-glm-4.7`,name:`GLM 4.7`,reasoning:!0,input:[`text`],contextWindow:202752,maxTokens:8192,privacy:`private`},{id:`claude-opus-45`,name:`Claude Opus 4.5 (via Venice)`,reasoning:!0,input:[`text`,`image`],contextWindow:202752,maxTokens:8192,privacy:`anonymized`},{id:`claude-sonnet-45`,name:`Claude Sonnet 4.5 (via Venice)`,reasoning:!0,input:[`text`,`image`],contextWindow:202752,maxTokens:8192,privacy:`anonymized`},{id:`openai-gpt-52`,name:`GPT-5.2 (via Venice)`,reasoning:!0,input:[`text`],contextWindow:262144,maxTokens:8192,privacy:`anonymized`},{id:`openai-gpt-52-codex`,name:`GPT-5.2 Codex (via Venice)`,reasoning:!0,input:[`text`,`image`],contextWindow:262144,maxTokens:8192,privacy:`anonymized`},{id:`gemini-3-pro-preview`,name:`Gemini 3 Pro (via Venice)`,reasoning:!0,input:[`text`,`image`],contextWindow:202752,maxTokens:8192,privacy:`anonymized`},{id:`gemini-3-flash-preview`,name:`Gemini 3 Flash (via Venice)`,reasoning:!0,input:[`text`,`image`],contextWindow:262144,maxTokens:8192,privacy:`anonymized`},{id:`grok-41-fast`,name:`Grok 4.1 Fast (via Venice)`,reasoning:!0,input:[`text`,`image`],contextWindow:262144,maxTokens:8192,privacy:`anonymized`},{id:`grok-code-fast-1`,name:`Grok Code Fast 1 (via Venice)`,reasoning:!0,input:[`text`],contextWindow:262144,maxTokens:8192,privacy:`anonymized`},{id:`kimi-k2-thinking`,name:`Kimi K2 Thinking (via Venice)`,reasoning:!0,input:[`text`],contextWindow:262144,maxTokens:8192,privacy:`anonymized`},{id:`minimax-m21`,name:`MiniMax M2.1 (via Venice)`,reasoning:!0,input:[`text`],contextWindow:202752,maxTokens:8192,privacy:`anonymized`}];function buildVeniceModelDefinition(entry){return{id:entry.id,name:entry.name,reasoning:entry.reasoning,input:[...entry.input],cost:VENICE_DEFAULT_COST,contextWindow:entry.contextWindow,maxTokens:entry.maxTokens,compat:{supportsUsageInStreaming:!1}}}async function discoverVeniceModels(){if(process.env.VITEST)return VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition);try{let response=await fetch(`${VENICE_BASE_URL}/models`,{signal:AbortSignal.timeout(5e3)});if(!response.ok)return console.warn(`[venice-models] Failed to discover models: HTTP ${response.status}, using static catalog`),VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition);let data=await response.json();if(!Array.isArray(data.data)||data.data.length===0)return console.warn(`[venice-models] No models found from API, using static catalog`),VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition);let catalogById=new Map(VENICE_MODEL_CATALOG.map(m=>[m.id,m])),models=[];for(let apiModel of data.data){let catalogEntry=catalogById.get(apiModel.id);if(catalogEntry)models.push(buildVeniceModelDefinition(catalogEntry));else{let isReasoning=apiModel.model_spec.capabilities.supportsReasoning||apiModel.id.toLowerCase().includes(`thinking`)||apiModel.id.toLowerCase().includes(`reason`)||apiModel.id.toLowerCase().includes(`r1`),hasVision=apiModel.model_spec.capabilities.supportsVision;models.push({id:apiModel.id,name:apiModel.model_spec.name||apiModel.id,reasoning:isReasoning,input:hasVision?[`text`,`image`]:[`text`],cost:VENICE_DEFAULT_COST,contextWindow:apiModel.model_spec.availableContextTokens||128e3,maxTokens:8192,compat:{supportsUsageInStreaming:!1}})}}return models.length>0?models:VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition)}catch(error){return console.warn(`[venice-models] Discovery failed: ${String(error)}, using static catalog`),VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition)}}const MINIMAX_PORTAL_BASE_URL=`https://api.minimax.io/anthropic`,MINIMAX_DEFAULT_MODEL_ID=`MiniMax-M2.1`,MINIMAX_API_COST={input:15,output:60,cacheRead:2,cacheWrite:10};function buildMinimaxModel(params){return{id:params.id,name:params.name,reasoning:params.reasoning,input:params.input,cost:MINIMAX_API_COST,contextWindow:2e5,maxTokens:8192}}function buildMinimaxTextModel(params){return buildMinimaxModel({...params,input:[`text`]})}const XIAOMI_DEFAULT_MODEL_ID=`mimo-v2-flash`,XIAOMI_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0},MOONSHOT_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0},QWEN_PORTAL_DEFAULT_CONTEXT_WINDOW=128e3,QWEN_PORTAL_DEFAULT_MAX_TOKENS=8192,QWEN_PORTAL_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0},OLLAMA_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0},VLLM_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0},QIANFAN_BASE_URL=`https://qianfan.baidubce.com/v2`,QIANFAN_DEFAULT_MODEL_ID=`deepseek-v3.2`,QIANFAN_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0},NVIDIA_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0};function resolveOllamaApiBase(configuredBaseUrl){return configuredBaseUrl?normalizeBaseUrl(configuredBaseUrl).replace(/\/v1$/i,``):`http://127.0.0.1:11434`}function resolveFreetokenApiBase(configuredBaseUrl){return configuredBaseUrl?normalizeBaseUrl(configuredBaseUrl).replace(/\/v1$/i,``):`http://127.0.0.1:1919`}async function discoverOllamaModels(baseUrl){if(process.env.VITEST)return[];try{let apiBase=resolveOllamaApiBase(baseUrl),response=await fetch(`${apiBase}/api/tags`,{signal:AbortSignal.timeout(5e3)});if(!response.ok)return console.warn(`Failed to discover Ollama models: ${response.status}`),[];let data=await response.json();return!data.models||data.models.length===0?(console.warn(`No Ollama models found on local instance`),[]):data.models.map(model=>{let modelId=model.name;return{id:modelId,name:modelId,reasoning:modelId.toLowerCase().includes(`r1`)||modelId.toLowerCase().includes(`reasoning`),input:[`text`],cost:OLLAMA_DEFAULT_COST,contextWindow:128e3,maxTokens:8192}})}catch(error){return console.warn(`Failed to discover Ollama models: ${String(error)}`),[]}}async function discoverVllmModels(baseUrl,apiKey){if(process.env.VITEST)return[];let url=`${normalizeBaseUrl(baseUrl.trim())}/models`;try{let trimmedApiKey=apiKey?.trim(),response=await fetch(url,{headers:trimmedApiKey?{Authorization:`Bearer ${trimmedApiKey}`}:void 0,signal:AbortSignal.timeout(5e3)});if(!response.ok)return console.warn(`Failed to discover vLLM models: ${response.status}`),[];let models=(await response.json()).data??[];return models.length===0?(console.warn(`No vLLM models found on local instance`),[]):models.map(m=>({id:typeof m.id==`string`?m.id.trim():``})).filter(m=>!!m.id).map(m=>{let modelId=m.id,lower=modelId.toLowerCase();return{id:modelId,name:modelId,reasoning:lower.includes(`r1`)||lower.includes(`reasoning`)||lower.includes(`think`),input:[`text`],cost:VLLM_DEFAULT_COST,contextWindow:128e3,maxTokens:8192}})}catch(error){return console.warn(`Failed to discover vLLM models: ${String(error)}`),[]}}function normalizeApiKeyConfig(value){let trimmed=value.trim();return/^\$\{([A-Z0-9_]+)\}$/.exec(trimmed)?.[1]??trimmed}function resolveEnvApiKeyVarName(provider){let resolved=resolveEnvApiKey(provider);if(!resolved)return;let match=/^(?:env: |shell env: )([A-Z0-9_]+)$/.exec(resolved.source);return match?match[1]:void 0}function resolveAwsSdkApiKeyVarName(){return resolveAwsSdkEnvVarName()??`AWS_PROFILE`}function resolveApiKeyFromProfiles(params){let ids=listProfilesForProvider(params.store,params.provider);for(let id of ids){let cred=params.store.profiles[id];if(cred){if(cred.type===`api_key`)return cred.key;if(cred.type===`token`)return cred.token}}}function normalizeGoogleModelId(id){return id===`gemini-3-pro`?`gemini-3-pro-preview`:id===`gemini-3-flash`?`gemini-3-flash-preview`:id}function normalizeGoogleProvider(provider){let mutated=!1,models=provider.models.map(model=>{let nextId=normalizeGoogleModelId(model.id);return nextId===model.id?model:(mutated=!0,{...model,id:nextId})});return mutated?{...provider,models}:provider}async function normalizeProviders(params){let{providers}=params;if(!providers)return providers;let authStore=await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),mutated=!1,next={};for(let[key,provider]of Object.entries(providers)){let normalizedKey=key.trim(),normalizedProvider=provider;if(normalizedProvider.apiKey&&normalizeApiKeyConfig(normalizedProvider.apiKey)!==normalizedProvider.apiKey&&(mutated=!0,normalizedProvider={...normalizedProvider,apiKey:normalizeApiKeyConfig(normalizedProvider.apiKey)}),Array.isArray(normalizedProvider.models)&&normalizedProvider.models.length>0&&!normalizedProvider.apiKey?.trim())if((normalizedProvider.auth??(normalizedKey===`amazon-bedrock`?`aws-sdk`:void 0))===`aws-sdk`){let apiKey=resolveAwsSdkApiKeyVarName();mutated=!0,normalizedProvider={...normalizedProvider,apiKey}}else{let fromEnv=resolveEnvApiKeyVarName(normalizedKey),fromProfiles=resolveApiKeyFromProfiles({provider:normalizedKey,store:authStore}),apiKey=fromEnv??fromProfiles;apiKey?.trim()?(mutated=!0,normalizedProvider={...normalizedProvider,apiKey}):normalizedProvider.api===`transformers`&&(mutated=!0,normalizedProvider={...normalizedProvider,apiKey:`local`})}if(normalizedKey===`google`){let googleNormalized=normalizeGoogleProvider(normalizedProvider);googleNormalized!==normalizedProvider&&(mutated=!0),normalizedProvider=googleNormalized}next[key]=normalizedProvider}return mutated?next:providers}function buildMinimaxProvider(){return{baseUrl:MINIMAX_PORTAL_BASE_URL,api:`anthropic-messages`,models:[buildMinimaxTextModel({id:MINIMAX_DEFAULT_MODEL_ID,name:`MiniMax M2.1`,reasoning:!1}),buildMinimaxTextModel({id:`MiniMax-M2.1-lightning`,name:`MiniMax M2.1 Lightning`,reasoning:!1}),buildMinimaxModel({id:`MiniMax-VL-01`,name:`MiniMax VL 01`,reasoning:!1,input:[`text`,`image`]}),buildMinimaxTextModel({id:`MiniMax-M2.5`,name:`MiniMax M2.5`,reasoning:!0}),buildMinimaxTextModel({id:`MiniMax-M2.5-Lightning`,name:`MiniMax M2.5 Lightning`,reasoning:!0})]}}function buildMinimaxPortalProvider(){return{baseUrl:MINIMAX_PORTAL_BASE_URL,api:`anthropic-messages`,models:[buildMinimaxTextModel({id:MINIMAX_DEFAULT_MODEL_ID,name:`MiniMax M2.1`,reasoning:!1}),buildMinimaxTextModel({id:`MiniMax-M2.5`,name:`MiniMax M2.5`,reasoning:!0})]}}function buildMoonshotProvider(){return{baseUrl:`https://api.moonshot.ai/v1`,api:`openai-completions`,models:[{id:`kimi-k2.5`,name:`Kimi K2.5`,reasoning:!1,input:[`text`],cost:MOONSHOT_DEFAULT_COST,contextWindow:256e3,maxTokens:8192}]}}function buildQwenPortalProvider(){return{baseUrl:`https://portal.qwen.ai/v1`,api:`openai-completions`,models:[{id:`coder-model`,name:`Qwen Coder`,reasoning:!1,input:[`text`],cost:QWEN_PORTAL_DEFAULT_COST,contextWindow:QWEN_PORTAL_DEFAULT_CONTEXT_WINDOW,maxTokens:QWEN_PORTAL_DEFAULT_MAX_TOKENS},{id:`vision-model`,name:`Qwen Vision`,reasoning:!1,input:[`text`,`image`],cost:QWEN_PORTAL_DEFAULT_COST,contextWindow:QWEN_PORTAL_DEFAULT_CONTEXT_WINDOW,maxTokens:QWEN_PORTAL_DEFAULT_MAX_TOKENS}]}}function buildSyntheticProvider(){return{baseUrl:SYNTHETIC_BASE_URL,api:`anthropic-messages`,models:SYNTHETIC_MODEL_CATALOG.map(buildSyntheticModelDefinition)}}function buildXiaomiProvider(){return{baseUrl:`https://api.xiaomimimo.com/anthropic`,api:`anthropic-messages`,models:[{id:XIAOMI_DEFAULT_MODEL_ID,name:`Xiaomi MiMo V2 Flash`,reasoning:!1,input:[`text`],cost:XIAOMI_DEFAULT_COST,contextWindow:262144,maxTokens:8192}]}}async function buildVeniceProvider(){return{baseUrl:VENICE_BASE_URL,api:`openai-completions`,models:await discoverVeniceModels()}}function buildOllamaProviderSync(configuredBaseUrl){return{baseUrl:resolveOllamaApiBase(configuredBaseUrl),api:`ollama`,models:[]}}async function buildHuggingfaceProvider(apiKey){let resolvedSecret=apiKey?.trim()===``?``:/^[A-Z][A-Z0-9_]*$/.test(apiKey.trim())?(process.env[apiKey.trim()]??``).trim():apiKey.trim();return{baseUrl:HUGGINGFACE_BASE_URL,api:`openai-completions`,models:resolvedSecret===``?HUGGINGFACE_MODEL_CATALOG.map(buildHuggingfaceModelDefinition):await discoverHuggingfaceModels(resolvedSecret)}}function buildTogetherProvider(){return{baseUrl:TOGETHER_BASE_URL,api:`openai-completions`,models:TOGETHER_MODEL_CATALOG.map(buildTogetherModelDefinition)}}async function buildVllmProvider(params){let baseUrl=normalizeBaseUrl(params?.baseUrl?.trim()||`http://127.0.0.1:8000/v1`);return{baseUrl,api:`openai-completions`,models:await discoverVllmModels(baseUrl,params?.apiKey)}}function buildQianfanProvider(){return{baseUrl:QIANFAN_BASE_URL,api:`openai-completions`,models:[{id:QIANFAN_DEFAULT_MODEL_ID,name:`DEEPSEEK V3.2`,reasoning:!0,input:[`text`],cost:QIANFAN_DEFAULT_COST,contextWindow:98304,maxTokens:32768},{id:`ernie-5.0-thinking-preview`,name:`ERNIE-5.0-Thinking-Preview`,reasoning:!0,input:[`text`,`image`],cost:QIANFAN_DEFAULT_COST,contextWindow:119e3,maxTokens:64e3}]}}const BUILDERFORCE_AGENTSLLM_FREE_COST={input:0,output:0,cacheRead:0,cacheWrite:0};function buildBuilderForceAgentsllmProvider(){return{baseUrl:`https://api.builderforce.ai/llm/v1`,api:`openai-completions`,models:[{id:`auto`,name:`BuilderForceAgentsLLM Auto (free pool)`,reasoning:!1,input:[`text`],cost:BUILDERFORCE_AGENTSLLM_FREE_COST,contextWindow:262144,maxTokens:8192},{id:`poolside/laguna-s-2.1:free`,name:`Laguna S 2.1 coder (262k ctx)`,reasoning:!1,input:[`text`],cost:BUILDERFORCE_AGENTSLLM_FREE_COST,contextWindow:262144,maxTokens:8192},{id:`google/gemma-4-31b-it:free`,name:`Gemma 4 31B (262k ctx)`,reasoning:!1,input:[`text`],cost:BUILDERFORCE_AGENTSLLM_FREE_COST,contextWindow:262144,maxTokens:8192},{id:`nvidia/nemotron-3-super-120b-a12b:free`,name:`Nemotron 3 Super 120B (262k ctx)`,reasoning:!1,input:[`text`],cost:BUILDERFORCE_AGENTSLLM_FREE_COST,contextWindow:262144,maxTokens:8192}]}}function buildNvidiaProvider(){return{baseUrl:`https://integrate.api.nvidia.com/v1`,api:`openai-completions`,models:[{id:`nvidia/llama-3.1-nemotron-70b-instruct`,name:`NVIDIA Llama 3.1 Nemotron 70B Instruct`,reasoning:!1,input:[`text`],cost:NVIDIA_DEFAULT_COST,contextWindow:131072,maxTokens:4096},{id:`meta/llama-3.3-70b-instruct`,name:`Meta Llama 3.3 70B Instruct`,reasoning:!1,input:[`text`],cost:NVIDIA_DEFAULT_COST,contextWindow:131072,maxTokens:4096},{id:`nvidia/mistral-nemo-minitron-8b-8k-instruct`,name:`NVIDIA Mistral NeMo Minitron 8B Instruct`,reasoning:!1,input:[`text`],cost:NVIDIA_DEFAULT_COST,contextWindow:8192,maxTokens:2048}]}}const LLAMA_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0};function buildLlamaProvider(modelPath){let modelName=modelPath.split(/[/\\]/).pop()??modelPath;return{baseUrl:modelPath,api:`llama`,models:[{id:modelName,name:modelName,reasoning:!1,input:[`text`],cost:LLAMA_DEFAULT_COST,contextWindow:4096,maxTokens:2048}]}}async function resolveImplicitProviders(params){let providers={},authStore=await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),minimaxKey=resolveEnvApiKeyVarName(`minimax`)??resolveApiKeyFromProfiles({provider:`minimax`,store:authStore});minimaxKey&&(providers.minimax={...buildMinimaxProvider(),apiKey:minimaxKey}),listProfilesForProvider(authStore,`minimax-portal`).length>0&&(providers[`minimax-portal`]={...buildMinimaxPortalProvider(),apiKey:`minimax-oauth`});let moonshotKey=resolveEnvApiKeyVarName(`moonshot`)??resolveApiKeyFromProfiles({provider:`moonshot`,store:authStore});moonshotKey&&(providers.moonshot={...buildMoonshotProvider(),apiKey:moonshotKey});let syntheticKey=resolveEnvApiKeyVarName(`synthetic`)??resolveApiKeyFromProfiles({provider:`synthetic`,store:authStore});syntheticKey&&(providers.synthetic={...buildSyntheticProvider(),apiKey:syntheticKey});let veniceKey=resolveEnvApiKeyVarName(`venice`)??resolveApiKeyFromProfiles({provider:`venice`,store:authStore});veniceKey&&(providers.venice={...await buildVeniceProvider(),apiKey:veniceKey}),listProfilesForProvider(authStore,`qwen-portal`).length>0&&(providers[`qwen-portal`]={...buildQwenPortalProvider(),apiKey:`qwen-oauth`});let xiaomiKey=resolveEnvApiKeyVarName(`xiaomi`)??resolveApiKeyFromProfiles({provider:`xiaomi`,store:authStore});xiaomiKey&&(providers.xiaomi={...buildXiaomiProvider(),apiKey:xiaomiKey});let cloudflareProfiles=listProfilesForProvider(authStore,`cloudflare-ai-gateway`);for(let profileId of cloudflareProfiles){let cred=authStore.profiles[profileId];if(cred?.type!==`api_key`)continue;let accountId=cred.metadata?.accountId?.trim(),gatewayId=cred.metadata?.gatewayId?.trim();if(!accountId||!gatewayId)continue;let baseUrl=resolveCloudflareAiGatewayBaseUrl({accountId,gatewayId});if(!baseUrl)continue;let apiKey=resolveEnvApiKeyVarName(`cloudflare-ai-gateway`)??cred.key?.trim()??``;if(apiKey){providers[`cloudflare-ai-gateway`]={baseUrl,api:`anthropic-messages`,apiKey,models:[buildCloudflareAiGatewayModelDefinition()]};break}}let ollamaKey=resolveEnvApiKeyVarName(`ollama`)??resolveApiKeyFromProfiles({provider:`ollama`,store:authStore});if(ollamaKey){let ollamaBaseUrl=params.explicitProviders?.ollama?.baseUrl;providers.ollama={...buildOllamaProviderSync(ollamaBaseUrl),apiKey:ollamaKey}}if(!params.explicitProviders?.vllm){let vllmEnvVar=resolveEnvApiKeyVarName(`vllm`),vllmProfileKey=resolveApiKeyFromProfiles({provider:`vllm`,store:authStore}),vllmKey=vllmEnvVar??vllmProfileKey;vllmKey&&(providers.vllm={...await buildVllmProvider({apiKey:(vllmEnvVar?process.env[vllmEnvVar]?.trim()??``:vllmProfileKey??``)||void 0}),apiKey:vllmKey})}let togetherKey=resolveEnvApiKeyVarName(`together`)??resolveApiKeyFromProfiles({provider:`together`,store:authStore});togetherKey&&(providers.together={...buildTogetherProvider(),apiKey:togetherKey});let huggingfaceKey=resolveEnvApiKeyVarName(`huggingface`)??resolveApiKeyFromProfiles({provider:`huggingface`,store:authStore});huggingfaceKey&&(providers.huggingface={...await buildHuggingfaceProvider(huggingfaceKey),apiKey:huggingfaceKey});let qianfanKey=resolveEnvApiKeyVarName(`qianfan`)??resolveApiKeyFromProfiles({provider:`qianfan`,store:authStore});qianfanKey&&(providers.qianfan={...buildQianfanProvider(),apiKey:qianfanKey});let nvidiaKey=resolveEnvApiKeyVarName(`nvidia`)??resolveApiKeyFromProfiles({provider:`nvidia`,store:authStore});if(nvidiaKey&&(providers.nvidia={...buildNvidiaProvider(),apiKey:nvidiaKey}),providers.builderforcellm={...buildBuilderForceAgentsllmProvider(),apiKey:`builderforcellm-proxy`},!params.explicitProviders?.llama){let llamaModelPath=(process.env.BUILDERFORCE_AGENTS_LLAMA_MODEL_PATH??``).trim();llamaModelPath&&(providers.llama=buildLlamaProvider(llamaModelPath))}return providers}async function resolveImplicitCopilotProvider(params){let env=params.env??process.env,authStore=await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),hasProfile=listProfilesForProvider(authStore,`github-copilot`).length>0,githubToken=(env.COPILOT_GITHUB_TOKEN??env.GH_TOKEN??env.GITHUB_TOKEN??``).trim();if(!hasProfile&&!githubToken)return null;let selectedGithubToken=githubToken;if(!selectedGithubToken&&hasProfile){let profileId=listProfilesForProvider(authStore,`github-copilot`)[0],profile=profileId?authStore.profiles[profileId]:void 0;profile&&profile.type===`token`&&(selectedGithubToken=profile.token)}let{DEFAULT_COPILOT_API_BASE_URL,resolveCopilotApiToken}=await import(`./github-copilot-token-DHP2kAiN.js`),baseUrl=DEFAULT_COPILOT_API_BASE_URL;if(selectedGithubToken)try{baseUrl=(await resolveCopilotApiToken({githubToken:selectedGithubToken,env})).baseUrl}catch{baseUrl=DEFAULT_COPILOT_API_BASE_URL}return{baseUrl,api:`openai-responses`,models:getDefaultCopilotModelIds().map(buildCopilotModelDefinition)}}async function resolveImplicitBedrockProvider(params){let env=params.env??process.env,discoveryConfig=params.config?.models?.bedrockDiscovery,enabled=discoveryConfig?.enabled,hasAwsCreds=resolveAwsSdkEnvVarName(env)!==void 0;if(enabled===!1||enabled!==!0&&!hasAwsCreds)return null;let region=discoveryConfig?.region??env.AWS_REGION??env.AWS_DEFAULT_REGION??`us-east-1`,models=await discoverBedrockModels({region,config:discoveryConfig});return models.length===0?null:{baseUrl:`https://bedrock-runtime.${region}.amazonaws.com`,api:`bedrock-converse-stream`,auth:`aws-sdk`,models}}const OPENAI_CODEX_OAUTH_MODEL_PREFIXES=[`gpt-5.3-codex`];function normalizeAliasKey(value){return value.trim().toLowerCase()}function modelKey(provider,model){return`${provider}/${model}`}function normalizeProviderId(provider){let normalized=provider.trim().toLowerCase();return normalized===`z.ai`||normalized===`z-ai`?`zai`:normalized===`opencode-zen`?`opencode`:normalized===`qwen`?`qwen-portal`:normalized===`kimi-code`?`kimi-coding`:normalized}function findNormalizedProviderValue(entries,provider){if(!entries)return;let providerKey=normalizeProviderId(provider);for(let[key,value]of Object.entries(entries))if(normalizeProviderId(key)===providerKey)return value}function findNormalizedProviderKey(entries,provider){if(!entries)return;let providerKey=normalizeProviderId(provider);return Object.keys(entries).find(key=>normalizeProviderId(key)===providerKey)}function isCliProvider(provider,cfg){let normalized=normalizeProviderId(provider);if(normalized===`claude-cli`||normalized===`codex-cli`)return!0;let backends=cfg?.agents?.defaults?.cliBackends??{};return Object.keys(backends).some(key=>normalizeProviderId(key)===normalized)}function normalizeAnthropicModelId(model){let trimmed=model.trim();return trimmed&&(resolveAnthropicShortAlias(trimmed)??trimmed)}function normalizeProviderModelId(provider,model){return provider===`anthropic`?normalizeAnthropicModelId(model):provider===`google`?normalizeGoogleModelId(model):model}function shouldUseOpenAICodexProvider(provider,model){if(provider!==`openai`)return!1;let normalized=model.trim().toLowerCase();return normalized?OPENAI_CODEX_OAUTH_MODEL_PREFIXES.some(prefix=>normalized===prefix||normalized.startsWith(`${prefix}-`)):!1}function normalizeModelRef(provider,model){let normalizedProvider=normalizeProviderId(provider),normalizedModel=normalizeProviderModelId(normalizedProvider,model.trim());return shouldUseOpenAICodexProvider(normalizedProvider,normalizedModel)?{provider:`openai-codex`,model:normalizedModel}:{provider:normalizedProvider,model:normalizedModel}}function parseModelRef(raw,defaultProvider){let trimmed=raw.trim();if(!trimmed)return null;let slash=trimmed.indexOf(`/`);if(slash===-1)return normalizeModelRef(defaultProvider,trimmed);let providerRaw=trimmed.slice(0,slash).trim(),model=trimmed.slice(slash+1).trim();return!providerRaw||!model?null:normalizeModelRef(providerRaw,model)}function normalizeModelSelection(value){if(typeof value==`string`)return value.trim()||void 0;if(!value||typeof value!=`object`)return;let primary=value.primary;if(typeof primary==`string`)return primary.trim()||void 0}function resolveAllowlistModelKey(raw,defaultProvider){let parsed=parseModelRef(raw,defaultProvider);return parsed?modelKey(parsed.provider,parsed.model):null}function buildConfiguredAllowlistKeys(params){let rawAllowlist=Object.keys(params.cfg?.agents?.defaults?.models??{});if(rawAllowlist.length===0)return null;let keys=new Set;for(let raw of rawAllowlist){let key=resolveAllowlistModelKey(String(raw??``),params.defaultProvider);key&&keys.add(key)}return keys.size>0?keys:null}function buildModelAliasIndex(params){let byAlias=new Map,byKey=new Map,rawModels=params.cfg.agents?.defaults?.models??{};for(let[keyRaw,entryRaw]of Object.entries(rawModels)){let parsed=parseModelRef(String(keyRaw??``),params.defaultProvider);if(!parsed)continue;let alias=String(entryRaw?.alias??``).trim();if(!alias)continue;let aliasKey=normalizeAliasKey(alias);byAlias.set(aliasKey,{alias,ref:parsed});let key=modelKey(parsed.provider,parsed.model),existing=byKey.get(key)??[];existing.push(alias),byKey.set(key,existing)}return{byAlias,byKey}}function resolveModelRefFromString(params){let trimmed=params.raw.trim();if(!trimmed)return null;if(!trimmed.includes(`/`)){let aliasKey=normalizeAliasKey(trimmed),aliasMatch=params.aliasIndex?.byAlias.get(aliasKey);if(aliasMatch)return{ref:aliasMatch.ref,alias:aliasMatch.alias}}let parsed=parseModelRef(trimmed,params.defaultProvider);return parsed?{ref:parsed}:null}function resolveConfiguredModelRef(params){let rawModel=(()=>{let raw=params.cfg.agents?.defaults?.model;return typeof raw==`string`?raw.trim():raw?.primary?.trim()??``})();if(rawModel){let trimmed=rawModel.trim(),aliasIndex=buildModelAliasIndex({cfg:params.cfg,defaultProvider:params.defaultProvider});if(!trimmed.includes(`/`)){let aliasKey=normalizeAliasKey(trimmed),aliasMatch=aliasIndex.byAlias.get(aliasKey);return aliasMatch?aliasMatch.ref:(console.warn(`[builderforce] Model "${trimmed}" specified without provider. Falling back to "anthropic/${trimmed}". Please use "anthropic/${trimmed}" in your config.`),{provider:`anthropic`,model:trimmed})}let resolved=resolveModelRefFromString({raw:trimmed,defaultProvider:params.defaultProvider,aliasIndex});if(resolved)return resolved.ref}return{provider:params.defaultProvider,model:params.defaultModel}}function resolveDefaultModelForAgent(params){let agentModelOverride=params.agentId?resolveAgentModelPrimary(params.cfg,params.agentId):void 0;return resolveConfiguredModelRef({cfg:agentModelOverride&&agentModelOverride.length>0?{...params.cfg,agents:{...params.cfg.agents,defaults:{...params.cfg.agents?.defaults,model:{...typeof params.cfg.agents?.defaults?.model==`object`?params.cfg.agents.defaults.model:void 0,primary:agentModelOverride}}}}:params.cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL})}function resolveSubagentConfiguredModelSelection(params){let agentConfig=resolveAgentConfig(params.cfg,params.agentId);return normalizeModelSelection(agentConfig?.subagents?.model)??normalizeModelSelection(params.cfg.agents?.defaults?.subagents?.model)??normalizeModelSelection(agentConfig?.model)}function resolveSubagentSpawnModelSelection(params){let runtimeDefault=resolveDefaultModelForAgent({cfg:params.cfg,agentId:params.agentId});return normalizeModelSelection(params.modelOverride)??resolveSubagentConfiguredModelSelection({cfg:params.cfg,agentId:params.agentId})??normalizeModelSelection(params.cfg.agents?.defaults?.model?.primary)??`${runtimeDefault.provider}/${runtimeDefault.model}`}function buildAllowedModelSet(params){let rawAllowlist=(()=>{let modelMap=params.cfg.agents?.defaults?.models??{};return Object.keys(modelMap)})(),allowAny=rawAllowlist.length===0;logDebug(`[model-selection] buildAllowedModelSet: rawAllowlist=[${rawAllowlist.join(`, `)}] allowAny=${allowAny} defaultProvider=${params.defaultProvider} defaultModel=${params.defaultModel??`(none)`}`);let defaultModel=params.defaultModel?.trim(),defaultRef=defaultModel&¶ms.defaultProvider?parseModelRef(defaultModel,params.defaultProvider):null,defaultKey=defaultRef?modelKey(defaultRef.provider,defaultRef.model):void 0,catalogKeys=new Set(params.catalog.map(entry=>modelKey(entry.provider,entry.id)));if(allowAny)return defaultKey&&catalogKeys.add(defaultKey),{allowAny:!0,allowedCatalog:params.catalog,allowedKeys:catalogKeys};let allowedKeys=new Set,configuredProviders=params.cfg.models?.providers??{};for(let raw of rawAllowlist){let parsed=parseModelRef(String(raw),params.defaultProvider);if(!parsed)continue;let key=modelKey(parsed.provider,parsed.model),providerKey=normalizeProviderId(parsed.provider);isCliProvider(parsed.provider,params.cfg)||catalogKeys.has(key)||configuredProviders[providerKey],allowedKeys.add(key)}defaultKey&&allowedKeys.add(defaultKey);let allowedCatalog=params.catalog.filter(entry=>allowedKeys.has(modelKey(entry.provider,entry.id)));return allowedCatalog.length===0&&allowedKeys.size===0?(defaultKey&&catalogKeys.add(defaultKey),{allowAny:!0,allowedCatalog:params.catalog,allowedKeys:catalogKeys}):{allowAny:!1,allowedCatalog,allowedKeys}}function getModelRefStatus(params){let allowed=buildAllowedModelSet({cfg:params.cfg,catalog:params.catalog,defaultProvider:params.defaultProvider,defaultModel:params.defaultModel}),key=modelKey(params.ref.provider,params.ref.model),configuredProviderKey=findNormalizedProviderKey(params.cfg.models?.providers??{},params.ref.provider),inCatalog=params.catalog.some(entry=>modelKey(entry.provider,entry.id)===key),inAllowedKeys=allowed.allowedKeys.has(key),hasConfiguredProvider=!!configuredProviderKey,isCli=isCliProvider(params.ref.provider,params.cfg),isAllowed=allowed.allowAny||inAllowedKeys||hasConfiguredProvider||isCli;return logDebug(`[model-selection] getModelRefStatus: key=${key} inCatalog=${inCatalog} allowAny=${allowed.allowAny} inAllowedKeys=${inAllowedKeys} hasConfiguredProvider=${hasConfiguredProvider} (${configuredProviderKey??`none`}) isCli=${isCli} → allowed=${isAllowed}`),isAllowed||logWarn(`[model-selection] model REJECTED: ${key} — allowedKeys=[${[...allowed.allowedKeys].join(`, `)}] configuredProviders=[${Object.keys(params.cfg.models?.providers??{}).join(`, `)}]`),{key,inCatalog,allowAny:allowed.allowAny,allowed:isAllowed}}function resolveAllowedModelRef(params){let trimmed=params.raw.trim();if(!trimmed)return{error:`invalid model: empty`};let aliasIndex=buildModelAliasIndex({cfg:params.cfg,defaultProvider:params.defaultProvider}),resolved=resolveModelRefFromString({raw:trimmed,defaultProvider:params.defaultProvider,aliasIndex});if(logDebug(`[model-selection] resolveAllowedModelRef: raw="${trimmed}" defaultProvider=${params.defaultProvider} → resolved=${resolved?`${resolved.ref.provider}/${resolved.ref.model}`:`null`}`),!resolved)return{error:`invalid model: ${trimmed}`};let status=getModelRefStatus({cfg:params.cfg,catalog:params.catalog,ref:resolved.ref,defaultProvider:params.defaultProvider,defaultModel:params.defaultModel}),openRouterFallbackStatus=!status.allowed&&normalizeProviderId(params.defaultProvider)===`openrouter`&&!trimmed.toLowerCase().startsWith(`openrouter/`)&&trimmed.includes(`/`)?getModelRefStatus({cfg:params.cfg,catalog:params.catalog,ref:normalizeModelRef(`openrouter`,trimmed),defaultProvider:params.defaultProvider,defaultModel:params.defaultModel}):void 0;return openRouterFallbackStatus?.allowed?(logDebug(`[model-selection] resolveAllowedModelRef: OpenRouter fallback succeeded for "${trimmed}" → openrouter/${trimmed}`),{ref:normalizeModelRef(`openrouter`,trimmed),key:openRouterFallbackStatus.key}):status.allowed?{ref:resolved.ref,key:status.key}:(logWarn(`[model-selection] resolveAllowedModelRef FAILED: raw="${trimmed}" resolvedKey=${status.key} allowed=false (openRouterFallback=${openRouterFallbackStatus?`tried,allowed=${openRouterFallbackStatus.allowed}`:`skipped`})`),{error:`model not allowed: ${status.key}`})}function resolveThinkingDefault(params){return params.cfg.agents?.defaults?.thinkingDefault||(params.catalog?.find(entry=>entry.provider===params.provider&&entry.id===params.model)?.reasoning?`low`:`off`)}function resolveHooksGmailModel(params){let hooksModel=params.cfg.hooks?.gmail?.model;if(!hooksModel?.trim())return null;let aliasIndex=buildModelAliasIndex({cfg:params.cfg,defaultProvider:params.defaultProvider});return resolveModelRefFromString({raw:hooksModel,defaultProvider:params.defaultProvider,aliasIndex})?.ref??null}function isPidAlive(pid){if(!Number.isFinite(pid)||pid<=0)return!1;try{return process.kill(pid,0),!0}catch{return!1}}function resolveProcessScopedMap(key){let proc=process,existing=proc[key];if(existing)return existing;let created=new Map;return proc[key]=created,created}const HELD_LOCKS=resolveProcessScopedMap(Symbol.for(`builderforce.fileLockHeldLocks`));function computeDelayMs(retries,attempt){let base=Math.min(retries.maxTimeout,Math.max(retries.minTimeout,retries.minTimeout*retries.factor**attempt)),jitter=retries.randomize?1+Math.random():1;return Math.min(retries.maxTimeout,Math.round(base*jitter))}async function readLockPayload(lockPath){try{let raw=await fs$1.readFile(lockPath,`utf8`),parsed=JSON.parse(raw);return typeof parsed.pid!=`number`||typeof parsed.createdAt!=`string`?null:{pid:parsed.pid,createdAt:parsed.createdAt}}catch{return null}}async function resolveNormalizedFilePath(filePath){let resolved=path.resolve(filePath),dir=path.dirname(resolved);await fs$1.mkdir(dir,{recursive:!0});try{let realDir=await fs$1.realpath(dir);return path.join(realDir,path.basename(resolved))}catch{return resolved}}async function isStaleLock(lockPath,staleMs){let payload=await readLockPayload(lockPath);if(payload?.pid&&!isPidAlive(payload.pid))return!0;if(payload?.createdAt){let createdAt=Date.parse(payload.createdAt);if(!Number.isFinite(createdAt)||Date.now()-createdAt>staleMs)return!0}try{let stat=await fs$1.stat(lockPath);return Date.now()-stat.mtimeMs>staleMs}catch{return!0}}async function releaseHeldLock(normalizedFile){let current=HELD_LOCKS.get(normalizedFile);current&&(--current.count,!(current.count>0)&&(HELD_LOCKS.delete(normalizedFile),await current.handle.close().catch(()=>void 0),await fs$1.rm(current.lockPath,{force:!0}).catch(()=>void 0)))}async function acquireFileLock(filePath,options){let normalizedFile=await resolveNormalizedFilePath(filePath),lockPath=`${normalizedFile}.lock`,held=HELD_LOCKS.get(normalizedFile);if(held)return held.count+=1,{lockPath,release:()=>releaseHeldLock(normalizedFile)};let attempts=Math.max(1,options.retries.retries+1);for(let attempt=0;attempt<attempts;attempt+=1)try{let handle=await fs$1.open(lockPath,`wx`);return await handle.writeFile(JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()},null,2),`utf8`),HELD_LOCKS.set(normalizedFile,{count:1,handle,lockPath}),{lockPath,release:()=>releaseHeldLock(normalizedFile)}}catch(err){if(err.code!==`EEXIST`)throw err;if(await isStaleLock(lockPath,options.stale)){await fs$1.rm(lockPath,{force:!0}).catch(()=>void 0);continue}if(attempt>=attempts-1)break;await new Promise(resolve=>setTimeout(resolve,computeDelayMs(options.retries,attempt)))}throw Error(`file lock timeout for ${normalizedFile}`)}async function withFileLock(filePath,options,fn){let lock=await acquireFileLock(filePath,options);try{return await fn()}finally{await lock.release()}}createSubsystemLogger(`agents/auth-profiles`);async function cachedByKey(store,cacheKey,ttlMs,loader){let now=Date.now();if(ttlMs>0&&store.current&&store.current.cacheKey===cacheKey&&now-store.current.readAt<ttlMs)return store.current.value;let value=await loader();return ttlMs>0&&(store.current={value,readAt:now,cacheKey}),value}const qwenCliCache={current:null},minimaxCliCache={current:null};function resolveQwenCliCredentialsPath(homeDir){let baseDir=homeDir??resolveUserPath(`~`);return path.join(baseDir,`.qwen/oauth_creds.json`)}function resolveMiniMaxCliCredentialsPath(homeDir){let baseDir=homeDir??resolveUserPath(`~`);return path.join(baseDir,`.minimax/oauth_creds.json`)}async function readQwenCliCredentials(options){return readPortalCliOauthCredentials(resolveQwenCliCredentialsPath(options?.homeDir),`qwen-portal`)}async function readPortalCliOauthCredentials(credPath,provider){let raw=await loadJsonFile(credPath);if(!raw||typeof raw!=`object`)return null;let data=raw,accessToken=data.access_token,refreshToken=data.refresh_token,expiresAt=data.expiry_date;return typeof accessToken!=`string`||!accessToken||typeof refreshToken!=`string`||!refreshToken||typeof expiresAt!=`number`||!Number.isFinite(expiresAt)?null:{type:`oauth`,provider,access:accessToken,refresh:refreshToken,expires:expiresAt}}async function readMiniMaxCliCredentials(options){return readPortalCliOauthCredentials(resolveMiniMaxCliCredentialsPath(options?.homeDir),`minimax-portal`)}async function readQwenCliCredentialsCached(options){return cachedByKey(qwenCliCache,resolveQwenCliCredentialsPath(options?.homeDir),options?.ttlMs??0,()=>readQwenCliCredentials({homeDir:options?.homeDir}))}async function readMiniMaxCliCredentialsCached(options){return cachedByKey(minimaxCliCache,resolveMiniMaxCliCredentialsPath(options?.homeDir),options?.ttlMs??0,()=>readMiniMaxCliCredentials({homeDir:options?.homeDir}))}function shallowEqualOAuthCredentials(a,b){return!a||a.type!==`oauth`?!1:a.provider===b.provider&&a.access===b.access&&a.refresh===b.refresh&&a.expires===b.expires&&a.email===b.email&&a.enterpriseUrl===b.enterpriseUrl&&a.projectId===b.projectId&&a.accountId===b.accountId}function isExternalProfileFresh(cred,now){return!cred||cred.type!==`oauth`&&cred.type!==`token`||cred.provider!==`qwen-portal`&&cred.provider!==`minimax-portal`?!1:typeof cred.expires==`number`?cred.expires>now+6e5:!0}async function syncExternalCliCredentialsForProvider(store,profileId,provider,readCredentials,now){let existing=store.profiles[profileId],creds=!existing||existing.provider!==provider||!isExternalProfileFresh(existing,now)?await readCredentials():null;if(!creds)return!1;let existingOAuth=existing?.type===`oauth`?existing:void 0;return(!existingOAuth||existingOAuth.provider!==provider||existingOAuth.expires<=now||creds.expires>existingOAuth.expires)&&!shallowEqualOAuthCredentials(existingOAuth,creds)?(store.profiles[profileId]=creds,log$1.info(`synced ${provider} credentials from external cli`,{profileId,expires:new Date(creds.expires).toISOString()}),!0):!1}async function syncExternalCliCredentials(store){let mutated=!1,now=Date.now(),existingQwen=store.profiles[QWEN_CLI_PROFILE_ID],qwenCreds=!existingQwen||existingQwen.provider!==`qwen-portal`||!isExternalProfileFresh(existingQwen,now)?await readQwenCliCredentialsCached({ttlMs:EXTERNAL_CLI_SYNC_TTL_MS}):null;if(qwenCreds){let existing=store.profiles[QWEN_CLI_PROFILE_ID],existingOAuth=existing?.type===`oauth`?existing:void 0;(!existingOAuth||existingOAuth.provider!==`qwen-portal`||existingOAuth.expires<=now||qwenCreds.expires>existingOAuth.expires)&&!shallowEqualOAuthCredentials(existingOAuth,qwenCreds)&&(store.profiles[QWEN_CLI_PROFILE_ID]=qwenCreds,mutated=!0,log$1.info(`synced qwen credentials from qwen cli`,{profileId:QWEN_CLI_PROFILE_ID,expires:new Date(qwenCreds.expires).toISOString()}))}return await syncExternalCliCredentialsForProvider(store,`minimax-portal:minimax-cli`,`minimax-portal`,()=>readMiniMaxCliCredentialsCached({ttlMs:EXTERNAL_CLI_SYNC_TTL_MS}),now)&&(mutated=!0),mutated}function resolveBuilderForceAgentsAgentDir(){return resolveUserPath(process.env.BUILDERFORCE_AGENTS_AGENT_DIR?.trim()||process.env.PI_CODING_AGENT_DIR?.trim()||path.join(resolveStateDir(),`agents`,DEFAULT_AGENT_ID,`agent`))}function resolveAuthStorePath(agentDir){let resolved=resolveUserPath(agentDir??resolveBuilderForceAgentsAgentDir());return path.join(resolved,`auth-profiles.json`)}function resolveLegacyAuthStorePath(agentDir){let resolved=resolveUserPath(agentDir??resolveBuilderForceAgentsAgentDir());return path.join(resolved,`auth.json`)}function resolveAuthStorePathForDisplay(agentDir){let pathname=resolveAuthStorePath(agentDir);return pathname.startsWith(`~`)?pathname:resolveUserPath(pathname)}async function ensureAuthStoreFile(pathname){fs.existsSync(pathname)||await saveJsonFile(pathname,{version:1,profiles:{}})}async function updateAuthProfileStoreWithLock(params){let authPath=resolveAuthStorePath(params.agentDir);await ensureAuthStoreFile(authPath);try{return await withFileLock(authPath,AUTH_STORE_LOCK_OPTIONS,async()=>{let store=await ensureAuthProfileStore(params.agentDir);return params.updater(store)&&await saveAuthProfileStore(store,params.agentDir),store})}catch{return null}}function coerceLegacyStore(raw){if(!raw||typeof raw!=`object`)return null;let record=raw;if(`profiles`in record)return null;let entries={};for(let[key,value]of Object.entries(record)){if(!value||typeof value!=`object`)continue;let typed=value;typed.type!==`api_key`&&typed.type!==`oauth`&&typed.type!==`token`||(entries[key]={...typed,provider:String(typed.provider??key)})}return Object.keys(entries).length>0?entries:null}function coerceAuthStore(raw){if(!raw||typeof raw!=`object`)return null;let record=raw;if(!record.profiles||typeof record.profiles!=`object`)return null;let profiles=record.profiles,normalized={};for(let[key,value]of Object.entries(profiles)){if(!value||typeof value!=`object`)continue;let typed=value;typed.type!==`api_key`&&typed.type!==`oauth`&&typed.type!==`token`||typed.provider&&(normalized[key]=typed)}let order=record.order&&typeof record.order==`object`?Object.entries(record.order).reduce((acc,[provider,value])=>{if(!Array.isArray(value))return acc;let list=value.map(entry=>typeof entry==`string`?entry.trim():``).filter(Boolean);return list.length===0||(acc[provider]=list),acc},{}):void 0;return{version:Number(record.version??1),profiles:normalized,order,lastGood:record.lastGood&&typeof record.lastGood==`object`?record.lastGood:void 0,usageStats:record.usageStats&&typeof record.usageStats==`object`?record.usageStats:void 0}}function mergeRecord(base,override){if(!(!base&&!override))return base?override?{...base,...override}:{...base}:{...override}}function mergeAuthProfileStores(base,override){return Object.keys(override.profiles).length===0&&!override.order&&!override.lastGood&&!override.usageStats?base:{version:Math.max(base.version,override.version??base.version),profiles:{...base.profiles,...override.profiles},order:mergeRecord(base.order,override.order),lastGood:mergeRecord(base.lastGood,override.lastGood),usageStats:mergeRecord(base.usageStats,override.usageStats)}}async function mergeOAuthFileIntoStore(store){let oauthRaw=await loadJsonFile(resolveOAuthPath());if(!oauthRaw||typeof oauthRaw!=`object`)return!1;let oauthEntries=oauthRaw,mutated=!1;for(let[provider,creds]of Object.entries(oauthEntries)){if(!creds||typeof creds!=`object`)continue;let profileId=`${provider}:default`;store.profiles[profileId]||(store.profiles[profileId]={type:`oauth`,provider,...creds},mutated=!0)}return mutated}function applyLegacyStore(store,legacy){for(let[provider,cred]of Object.entries(legacy)){let profileId=`${provider}:default`;if(cred.type===`api_key`){store.profiles[profileId]={type:`api_key`,provider:String(cred.provider??provider),key:cred.key,...cred.email?{email:cred.email}:{}};continue}if(cred.type===`token`){store.profiles[profileId]={type:`token`,provider:String(cred.provider??provider),token:cred.token,...typeof cred.expires==`number`?{expires:cred.expires}:{},...cred.email?{email:cred.email}:{}};continue}store.profiles[profileId]={type:`oauth`,provider:String(cred.provider??provider),access:cred.access,refresh:cred.refresh,expires:cred.expires,...cred.enterpriseUrl?{enterpriseUrl:cred.enterpriseUrl}:{},...cred.projectId?{projectId:cred.projectId}:{},...cred.accountId?{accountId:cred.accountId}:{},...cred.email?{email:cred.email}:{}}}}async function loadAuthProfileStore(){let authPath=resolveAuthStorePath(),asStore=coerceAuthStore(await loadJsonFile(authPath));if(asStore)return await syncExternalCliCredentials(asStore)&&await saveJsonFile(authPath,asStore),asStore;let legacy=coerceLegacyStore(await loadJsonFile(resolveLegacyAuthStorePath()));if(legacy){let store={version:1,profiles:{}};return applyLegacyStore(store,legacy),await syncExternalCliCredentials(store),store}let store={version:1,profiles:{}};return await syncExternalCliCredentials(store),store}async function loadAuthProfileStoreForAgent(agentDir,_options){let authPath=resolveAuthStorePath(agentDir),asStore=coerceAuthStore(await loadJsonFile(authPath));if(asStore)return await syncExternalCliCredentials(asStore)&&await saveJsonFile(authPath,asStore),asStore;if(agentDir){let mainStore=coerceAuthStore(await loadJsonFile(resolveAuthStorePath()));if(mainStore&&Object.keys(mainStore.profiles).length>0)return await saveJsonFile(authPath,mainStore),log$1.info(`inherited auth-profiles from main agent`,{agentDir}),mainStore}let legacy=coerceLegacyStore(await loadJsonFile(resolveLegacyAuthStorePath(agentDir))),store={version:1,profiles:{}};legacy&&applyLegacyStore(store,legacy);let mergedOAuth=await mergeOAuthFileIntoStore(store),syncedCli=await syncExternalCliCredentials(store),shouldWrite=legacy!==null||mergedOAuth||syncedCli;if(shouldWrite&&await saveJsonFile(authPath,store),shouldWrite&&legacy!==null){let legacyPath=resolveLegacyAuthStorePath(agentDir);try{fs.unlinkSync(legacyPath)}catch(err){err?.code!==`ENOENT`&&log$1.warn(`failed to delete legacy auth.json after migration`,{err,legacyPath})}}return store}async function ensureAuthProfileStore(agentDir,options){let store=await loadAuthProfileStoreForAgent(agentDir,options),authPath=resolveAuthStorePath(agentDir),mainAuthPath=resolveAuthStorePath();return!agentDir||authPath===mainAuthPath?store:mergeAuthProfileStores(await loadAuthProfileStoreForAgent(void 0,options),store)}async function saveAuthProfileStore(store,agentDir){await saveJsonFile(resolveAuthStorePath(agentDir),{version:1,profiles:store.profiles,order:store.order??void 0,lastGood:store.lastGood??void 0,usageStats:store.usageStats??void 0})}function dedupeProfileIds(profileIds){return[...new Set(profileIds)]}async function setAuthProfileOrder(params){let providerKey=normalizeProviderId(params.provider),deduped=dedupeProfileIds(params.order&&Array.isArray(params.order)?params.order.map(entry=>String(entry).trim()).filter(Boolean):[]);return await updateAuthProfileStoreWithLock({agentDir:params.agentDir,updater:store=>(store.order=store.order??{},deduped.length===0?store.order[providerKey]?(delete store.order[providerKey],Object.keys(store.order).length===0&&(store.order=void 0),!0):!1:(store.order[providerKey]=deduped,!0))})}async function upsertAuthProfile(params){let credential=params.credential.type===`api_key`?{...params.credential,...typeof params.credential.key==`string`?{key:normalizeSecretInput(params.credential.key)}:{}}:params.credential.type===`token`?{...params.credential,token:normalizeSecretInput(params.credential.token)}:params.credential,store=await ensureAuthProfileStore(params.agentDir);store.profiles[params.profileId]=credential,await saveAuthProfileStore(store,params.agentDir)}async function upsertAuthProfileWithLock(params){return await updateAuthProfileStoreWithLock({agentDir:params.agentDir,updater:store=>(store.profiles[params.profileId]=params.credential,!0)})}function listProfilesForProvider(store,provider){let providerKey=normalizeProviderId(provider);return Object.entries(store.profiles).filter(([,cred])=>normalizeProviderId(cred.provider)===providerKey).map(([id])=>id)}async function markAuthProfileGood(params){let{store,provider,profileId,agentDir}=params,updated=await updateAuthProfileStoreWithLock({agentDir,updater:freshStore=>{let profile=freshStore.profiles[profileId];return!profile||profile.provider!==provider?!1:(freshStore.lastGood={...freshStore.lastGood,[provider]:profileId},!0)}});if(updated){store.lastGood=updated.lastGood;return}let profile=store.profiles[profileId];!profile||profile.provider!==provider||(store.lastGood={...store.lastGood,[provider]:profileId},await saveAuthProfileStore(store,agentDir))}function getProfileSuffix(profileId){let idx=profileId.indexOf(`:`);return idx<0?``:profileId.slice(idx+1)}function isEmailLike(value){let trimmed=value.trim();return trimmed?trimmed.includes(`@`)&&trimmed.includes(`.`):!1}function suggestOAuthProfileIdForLegacyDefault(params){let providerKey=normalizeProviderId(params.provider);if(getProfileSuffix(params.legacyProfileId)!==`default`)return null;let legacyCfg=params.cfg?.auth?.profiles?.[params.legacyProfileId];if(legacyCfg&&normalizeProviderId(legacyCfg.provider)===providerKey&&legacyCfg.mode!==`oauth`)return null;let oauthProfiles=listProfilesForProvider(params.store,providerKey).filter(id=>params.store.profiles[id]?.type===`oauth`);if(oauthProfiles.length===0)return null;let configuredEmail=legacyCfg?.email?.trim();if(configuredEmail){let byEmail=oauthProfiles.find(id=>{let cred=params.store.profiles[id];return!cred||cred.type!==`oauth`?!1:cred.email?.trim()===configuredEmail||id===`${providerKey}:${configuredEmail}`});if(byEmail)return byEmail}let lastGood=params.store.lastGood?.[providerKey]??params.store.lastGood?.[params.provider];if(lastGood&&oauthProfiles.includes(lastGood))return lastGood;let nonLegacy=oauthProfiles.filter(id=>id!==params.legacyProfileId);if(nonLegacy.length===1)return nonLegacy[0]??null;let emailLike=nonLegacy.filter(id=>isEmailLike(getProfileSuffix(id)));return emailLike.length===1?emailLike[0]??null:null}function repairOAuthProfileIdMismatch(params){let legacyProfileId=params.legacyProfileId??`${normalizeProviderId(params.provider)}:default`,legacyCfg=params.cfg.auth?.profiles?.[legacyProfileId];if(!legacyCfg||legacyCfg.mode!==`oauth`||normalizeProviderId(legacyCfg.provider)!==normalizeProviderId(params.provider))return{config:params.cfg,changes:[],migrated:!1};let toProfileId=suggestOAuthProfileIdForLegacyDefault({cfg:params.cfg,store:params.store,provider:params.provider,legacyProfileId});if(!toProfileId||toProfileId===legacyProfileId)return{config:params.cfg,changes:[],migrated:!1};let toCred=params.store.profiles[toProfileId],toEmail=toCred?.type===`oauth`?toCred.email?.trim():void 0,nextProfiles={...params.cfg.auth?.profiles};delete nextProfiles[legacyProfileId],nextProfiles[toProfileId]={...legacyCfg,...toEmail?{email:toEmail}:{}};let providerKey=normalizeProviderId(params.provider),nextOrder=(()=>{let order=params.cfg.auth?.order;if(!order)return;let resolvedKey=findNormalizedProviderKey(order,providerKey);if(!resolvedKey)return order;let existing=order[resolvedKey];if(!Array.isArray(existing))return order;let deduped=dedupeProfileIds(existing.map(id=>id===legacyProfileId?toProfileId:id).filter(id=>typeof id==`string`&&id.trim().length>0));return{...order,[resolvedKey]:deduped}})();return{config:{...params.cfg,auth:{...params.cfg.auth,profiles:nextProfiles,...nextOrder?{order:nextOrder}:{}}},changes:[`Auth: migrate ${legacyProfileId} → ${toProfileId} (OAuth profile id)`],migrated:!0,fromProfileId:legacyProfileId,toProfileId}}function formatAuthDoctorHint(params){let providerKey=normalizeProviderId(params.provider);if(providerKey!==`anthropic`)return``;let legacyProfileId=params.profileId??`anthropic:default`,suggested=suggestOAuthProfileIdForLegacyDefault({cfg:params.cfg,store:params.store,provider:providerKey,legacyProfileId});if(!suggested||suggested===legacyProfileId)return``;let storeOauthProfiles=listProfilesForProvider(params.store,providerKey).filter(id=>params.store.profiles[id]?.type===`oauth`).join(`, `),cfgMode=params.cfg?.auth?.profiles?.[legacyProfileId]?.mode,cfgProvider=params.cfg?.auth?.profiles?.[legacyProfileId]?.provider;return[`Doctor hint (for GitHub issue):`,`- provider: ${providerKey}`,`- config: ${legacyProfileId}${cfgProvider||cfgMode?` (provider=${cfgProvider??`?`}, mode=${cfgMode??`?`})`:``}`,`- auth store oauth profiles: ${storeOauthProfiles||`(none)`}`,`- suggested profile: ${suggested}`,`Fix: run "${formatCliCommand(`builderforce doctor --yes`)}"`].join(`
|
|
55
|
+
`);buffer=lines.pop()??``;for(let line of lines){let trimmed=line.trim();if(trimmed)try{yield JSON.parse(trimmed)}catch{console.warn(`[ollama-stream] Skipping malformed NDJSON line:`,trimmed.slice(0,120))}}}if(buffer.trim())try{yield JSON.parse(buffer.trim())}catch{console.warn(`[ollama-stream] Skipping malformed trailing data:`,buffer.trim().slice(0,120))}}function resolveOllamaChatUrl(baseUrl){return`${normalizeBaseUrl(baseUrl.trim()).replace(/\/v1$/i,``)||OLLAMA_NATIVE_BASE_URL}/api/chat`}function createOllamaStreamFn(baseUrl){let chatUrl=resolveOllamaChatUrl(baseUrl);return(model,context,options)=>{let stream=createAssistantMessageEventStream(),run=async()=>{try{let ollamaMessages=convertToOllamaMessages(context.messages??[],context.systemPrompt),ollamaTools=extractOllamaTools(context.tools),ollamaOptions={num_ctx:model.contextWindow??65536};typeof options?.temperature==`number`&&(ollamaOptions.temperature=options.temperature),typeof options?.maxTokens==`number`&&(ollamaOptions.num_predict=options.maxTokens);let body={model:model.id,messages:ollamaMessages,stream:!0,...ollamaTools.length>0?{tools:ollamaTools}:{},options:ollamaOptions},headers={"Content-Type":`application/json`,...options?.headers};options?.apiKey&&(headers.Authorization=`Bearer ${options.apiKey}`);let response=await fetch(chatUrl,{method:`POST`,headers,body:JSON.stringify(body),signal:options?.signal});if(!response.ok){let errorText=await response.text().catch(()=>`unknown error`);throw Error(`Ollama API error ${response.status}: ${errorText}`)}if(!response.body)throw Error(`Ollama API returned empty response body`);let reader=response.body.getReader(),accumulatedContent=``,accumulatedToolCalls=[],finalResponse;for await(let chunk of parseNdjsonStream(reader))if(chunk.message?.content?accumulatedContent+=chunk.message.content:chunk.message?.reasoning&&(accumulatedContent+=chunk.message.reasoning),chunk.message?.tool_calls&&accumulatedToolCalls.push(...chunk.message.tool_calls),chunk.done){finalResponse=chunk;break}if(!finalResponse)throw Error(`Ollama API stream ended without a final response`);finalResponse.message.content=accumulatedContent,accumulatedToolCalls.length>0&&(finalResponse.message.tool_calls=accumulatedToolCalls);let assistantMessage=buildAssistantMessage(finalResponse,{api:model.api,provider:model.provider,id:model.id}),reason=assistantMessage.stopReason===`toolUse`?`toolUse`:`stop`;stream.push({type:`done`,reason,message:assistantMessage})}catch(err){let errorMessage=err instanceof Error?err.message:String(err);stream.push({type:`error`,reason:`error`,error:{role:`assistant`,content:[],stopReason:`error`,errorMessage,api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},timestamp:Date.now()}})}finally{stream.end()}};return queueMicrotask(()=>void run()),stream}}const SYNTHETIC_BASE_URL=`https://api.synthetic.new/anthropic`,SYNTHETIC_DEFAULT_MODEL_ID=`hf:MiniMaxAI/MiniMax-M2.1`,SYNTHETIC_DEFAULT_MODEL_REF=`synthetic/${SYNTHETIC_DEFAULT_MODEL_ID}`,SYNTHETIC_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0},SYNTHETIC_MODEL_CATALOG=[{id:SYNTHETIC_DEFAULT_MODEL_ID,name:`MiniMax M2.1`,reasoning:!1,input:[`text`],contextWindow:192e3,maxTokens:65536},{id:`hf:moonshotai/Kimi-K2-Thinking`,name:`Kimi K2 Thinking`,reasoning:!0,input:[`text`],contextWindow:256e3,maxTokens:8192},{id:`hf:zai-org/GLM-4.7`,name:`GLM-4.7`,reasoning:!1,input:[`text`],contextWindow:198e3,maxTokens:128e3},{id:`hf:deepseek-ai/DeepSeek-R1-0528`,name:`DeepSeek R1 0528`,reasoning:!1,input:[`text`],contextWindow:128e3,maxTokens:8192},{id:`hf:deepseek-ai/DeepSeek-V3-0324`,name:`DeepSeek V3 0324`,reasoning:!1,input:[`text`],contextWindow:128e3,maxTokens:8192},{id:`hf:deepseek-ai/DeepSeek-V3.1`,name:`DeepSeek V3.1`,reasoning:!1,input:[`text`],contextWindow:128e3,maxTokens:8192},{id:`hf:deepseek-ai/DeepSeek-V3.1-Terminus`,name:`DeepSeek V3.1 Terminus`,reasoning:!1,input:[`text`],contextWindow:128e3,maxTokens:8192},{id:`hf:deepseek-ai/DeepSeek-V3.2`,name:`DeepSeek V3.2`,reasoning:!1,input:[`text`],contextWindow:159e3,maxTokens:8192},{id:`hf:meta-llama/Llama-3.3-70B-Instruct`,name:`Llama 3.3 70B Instruct`,reasoning:!1,input:[`text`],contextWindow:128e3,maxTokens:8192},{id:`hf:meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8`,name:`Llama 4 Maverick 17B 128E Instruct FP8`,reasoning:!1,input:[`text`],contextWindow:524e3,maxTokens:8192},{id:`hf:moonshotai/Kimi-K2-Instruct-0905`,name:`Kimi K2 Instruct 0905`,reasoning:!1,input:[`text`],contextWindow:256e3,maxTokens:8192},{id:`hf:moonshotai/Kimi-K2.5`,name:`Kimi K2.5`,reasoning:!0,input:[`text`],contextWindow:256e3,maxTokens:8192},{id:`hf:openai/gpt-oss-120b`,name:`GPT OSS 120B`,reasoning:!1,input:[`text`],contextWindow:128e3,maxTokens:8192},{id:`hf:Qwen/Qwen3-235B-A22B-Instruct-2507`,name:`Qwen3 235B A22B Instruct 2507`,reasoning:!1,input:[`text`],contextWindow:256e3,maxTokens:8192},{id:`hf:Qwen/Qwen3-Coder-480B-A35B-Instruct`,name:`Qwen3 Coder 480B A35B Instruct`,reasoning:!1,input:[`text`],contextWindow:256e3,maxTokens:8192},{id:`hf:Qwen/Qwen3-VL-235B-A22B-Instruct`,name:`Qwen3 VL 235B A22B Instruct`,reasoning:!1,input:[`text`,`image`],contextWindow:25e4,maxTokens:8192},{id:`hf:zai-org/GLM-4.5`,name:`GLM-4.5`,reasoning:!1,input:[`text`],contextWindow:128e3,maxTokens:128e3},{id:`hf:zai-org/GLM-4.6`,name:`GLM-4.6`,reasoning:!1,input:[`text`],contextWindow:198e3,maxTokens:128e3},{id:`hf:zai-org/GLM-5`,name:`GLM-5`,reasoning:!0,input:[`text`,`image`],contextWindow:256e3,maxTokens:128e3},{id:`hf:deepseek-ai/DeepSeek-V3`,name:`DeepSeek V3`,reasoning:!1,input:[`text`],contextWindow:128e3,maxTokens:8192},{id:`hf:Qwen/Qwen3-235B-A22B-Thinking-2507`,name:`Qwen3 235B A22B Thinking 2507`,reasoning:!0,input:[`text`],contextWindow:256e3,maxTokens:8192}];function buildSyntheticModelDefinition(entry){return{id:entry.id,name:entry.name,reasoning:entry.reasoning,input:[...entry.input],cost:SYNTHETIC_DEFAULT_COST,contextWindow:entry.contextWindow,maxTokens:entry.maxTokens}}const TOGETHER_BASE_URL=`https://api.together.xyz/v1`,TOGETHER_MODEL_CATALOG=[{id:`zai-org/GLM-4.7`,name:`GLM 4.7 Fp8`,reasoning:!1,input:[`text`],contextWindow:202752,maxTokens:8192,cost:{input:.45,output:2,cacheRead:.45,cacheWrite:2}},{id:`moonshotai/Kimi-K2.5`,name:`Kimi K2.5`,reasoning:!0,input:[`text`,`image`],cost:{input:.5,output:2.8,cacheRead:.5,cacheWrite:2.8},contextWindow:262144,maxTokens:32768},{id:`meta-llama/Llama-3.3-70B-Instruct-Turbo`,name:`Llama 3.3 70B Instruct Turbo`,reasoning:!1,input:[`text`],contextWindow:131072,maxTokens:8192,cost:{input:.88,output:.88,cacheRead:.88,cacheWrite:.88}},{id:`meta-llama/Llama-4-Scout-17B-16E-Instruct`,name:`Llama 4 Scout 17B 16E Instruct`,reasoning:!1,input:[`text`,`image`],contextWindow:1e7,maxTokens:32768,cost:{input:.18,output:.59,cacheRead:.18,cacheWrite:.18}},{id:`meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8`,name:`Llama 4 Maverick 17B 128E Instruct FP8`,reasoning:!1,input:[`text`,`image`],contextWindow:2e7,maxTokens:32768,cost:{input:.27,output:.85,cacheRead:.27,cacheWrite:.27}},{id:`deepseek-ai/DeepSeek-V3.1`,name:`DeepSeek V3.1`,reasoning:!1,input:[`text`],contextWindow:131072,maxTokens:8192,cost:{input:.6,output:1.25,cacheRead:.6,cacheWrite:.6}},{id:`deepseek-ai/DeepSeek-R1`,name:`DeepSeek R1`,reasoning:!0,input:[`text`],contextWindow:131072,maxTokens:8192,cost:{input:3,output:7,cacheRead:3,cacheWrite:3}},{id:`moonshotai/Kimi-K2-Instruct-0905`,name:`Kimi K2-Instruct 0905`,reasoning:!1,input:[`text`],contextWindow:262144,maxTokens:8192,cost:{input:1,output:3,cacheRead:1,cacheWrite:3}}];function buildTogetherModelDefinition(model){return{id:model.id,name:model.name,api:`openai-completions`,reasoning:model.reasoning,input:model.input,cost:model.cost,contextWindow:model.contextWindow,maxTokens:model.maxTokens}}const VENICE_BASE_URL=`https://api.venice.ai/api/v1`,VENICE_DEFAULT_MODEL_REF=`venice/llama-3.3-70b`,VENICE_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0},VENICE_MODEL_CATALOG=[{id:`llama-3.3-70b`,name:`Llama 3.3 70B`,reasoning:!1,input:[`text`],contextWindow:131072,maxTokens:8192,privacy:`private`},{id:`llama-3.2-3b`,name:`Llama 3.2 3B`,reasoning:!1,input:[`text`],contextWindow:131072,maxTokens:8192,privacy:`private`},{id:`hermes-3-llama-3.1-405b`,name:`Hermes 3 Llama 3.1 405B`,reasoning:!1,input:[`text`],contextWindow:131072,maxTokens:8192,privacy:`private`},{id:`qwen3-235b-a22b-thinking-2507`,name:`Qwen3 235B Thinking`,reasoning:!0,input:[`text`],contextWindow:131072,maxTokens:8192,privacy:`private`},{id:`qwen3-235b-a22b-instruct-2507`,name:`Qwen3 235B Instruct`,reasoning:!1,input:[`text`],contextWindow:131072,maxTokens:8192,privacy:`private`},{id:`qwen3-coder-480b-a35b-instruct`,name:`Qwen3 Coder 480B`,reasoning:!1,input:[`text`],contextWindow:262144,maxTokens:8192,privacy:`private`},{id:`qwen3-next-80b`,name:`Qwen3 Next 80B`,reasoning:!1,input:[`text`],contextWindow:262144,maxTokens:8192,privacy:`private`},{id:`qwen3-vl-235b-a22b`,name:`Qwen3 VL 235B (Vision)`,reasoning:!1,input:[`text`,`image`],contextWindow:262144,maxTokens:8192,privacy:`private`},{id:`qwen3-4b`,name:`Venice Small (Qwen3 4B)`,reasoning:!0,input:[`text`],contextWindow:32768,maxTokens:8192,privacy:`private`},{id:`deepseek-v3.2`,name:`DeepSeek V3.2`,reasoning:!0,input:[`text`],contextWindow:163840,maxTokens:8192,privacy:`private`},{id:`venice-uncensored`,name:`Venice Uncensored (Dolphin-Mistral)`,reasoning:!1,input:[`text`],contextWindow:32768,maxTokens:8192,privacy:`private`},{id:`mistral-31-24b`,name:`Venice Medium (Mistral)`,reasoning:!1,input:[`text`,`image`],contextWindow:131072,maxTokens:8192,privacy:`private`},{id:`google-gemma-3-27b-it`,name:`Google Gemma 3 27B Instruct`,reasoning:!1,input:[`text`,`image`],contextWindow:202752,maxTokens:8192,privacy:`private`},{id:`openai-gpt-oss-120b`,name:`OpenAI GPT OSS 120B`,reasoning:!1,input:[`text`],contextWindow:131072,maxTokens:8192,privacy:`private`},{id:`zai-org-glm-4.7`,name:`GLM 4.7`,reasoning:!0,input:[`text`],contextWindow:202752,maxTokens:8192,privacy:`private`},{id:`claude-opus-45`,name:`Claude Opus 4.5 (via Venice)`,reasoning:!0,input:[`text`,`image`],contextWindow:202752,maxTokens:8192,privacy:`anonymized`},{id:`claude-sonnet-45`,name:`Claude Sonnet 4.5 (via Venice)`,reasoning:!0,input:[`text`,`image`],contextWindow:202752,maxTokens:8192,privacy:`anonymized`},{id:`openai-gpt-52`,name:`GPT-5.2 (via Venice)`,reasoning:!0,input:[`text`],contextWindow:262144,maxTokens:8192,privacy:`anonymized`},{id:`openai-gpt-52-codex`,name:`GPT-5.2 Codex (via Venice)`,reasoning:!0,input:[`text`,`image`],contextWindow:262144,maxTokens:8192,privacy:`anonymized`},{id:`gemini-3-pro-preview`,name:`Gemini 3 Pro (via Venice)`,reasoning:!0,input:[`text`,`image`],contextWindow:202752,maxTokens:8192,privacy:`anonymized`},{id:`gemini-3-flash-preview`,name:`Gemini 3 Flash (via Venice)`,reasoning:!0,input:[`text`,`image`],contextWindow:262144,maxTokens:8192,privacy:`anonymized`},{id:`grok-41-fast`,name:`Grok 4.1 Fast (via Venice)`,reasoning:!0,input:[`text`,`image`],contextWindow:262144,maxTokens:8192,privacy:`anonymized`},{id:`grok-code-fast-1`,name:`Grok Code Fast 1 (via Venice)`,reasoning:!0,input:[`text`],contextWindow:262144,maxTokens:8192,privacy:`anonymized`},{id:`kimi-k2-thinking`,name:`Kimi K2 Thinking (via Venice)`,reasoning:!0,input:[`text`],contextWindow:262144,maxTokens:8192,privacy:`anonymized`},{id:`minimax-m21`,name:`MiniMax M2.1 (via Venice)`,reasoning:!0,input:[`text`],contextWindow:202752,maxTokens:8192,privacy:`anonymized`}];function buildVeniceModelDefinition(entry){return{id:entry.id,name:entry.name,reasoning:entry.reasoning,input:[...entry.input],cost:VENICE_DEFAULT_COST,contextWindow:entry.contextWindow,maxTokens:entry.maxTokens,compat:{supportsUsageInStreaming:!1}}}async function discoverVeniceModels(){if(process.env.VITEST)return VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition);try{let response=await fetch(`${VENICE_BASE_URL}/models`,{signal:AbortSignal.timeout(5e3)});if(!response.ok)return console.warn(`[venice-models] Failed to discover models: HTTP ${response.status}, using static catalog`),VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition);let data=await response.json();if(!Array.isArray(data.data)||data.data.length===0)return console.warn(`[venice-models] No models found from API, using static catalog`),VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition);let catalogById=new Map(VENICE_MODEL_CATALOG.map(m=>[m.id,m])),models=[];for(let apiModel of data.data){let catalogEntry=catalogById.get(apiModel.id);if(catalogEntry)models.push(buildVeniceModelDefinition(catalogEntry));else{let isReasoning=apiModel.model_spec.capabilities.supportsReasoning||apiModel.id.toLowerCase().includes(`thinking`)||apiModel.id.toLowerCase().includes(`reason`)||apiModel.id.toLowerCase().includes(`r1`),hasVision=apiModel.model_spec.capabilities.supportsVision;models.push({id:apiModel.id,name:apiModel.model_spec.name||apiModel.id,reasoning:isReasoning,input:hasVision?[`text`,`image`]:[`text`],cost:VENICE_DEFAULT_COST,contextWindow:apiModel.model_spec.availableContextTokens||128e3,maxTokens:8192,compat:{supportsUsageInStreaming:!1}})}}return models.length>0?models:VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition)}catch(error){return console.warn(`[venice-models] Discovery failed: ${String(error)}, using static catalog`),VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition)}}const MINIMAX_PORTAL_BASE_URL=`https://api.minimax.io/anthropic`,MINIMAX_DEFAULT_MODEL_ID=`MiniMax-M2.1`,MINIMAX_API_COST={input:15,output:60,cacheRead:2,cacheWrite:10};function buildMinimaxModel(params){return{id:params.id,name:params.name,reasoning:params.reasoning,input:params.input,cost:MINIMAX_API_COST,contextWindow:2e5,maxTokens:8192}}function buildMinimaxTextModel(params){return buildMinimaxModel({...params,input:[`text`]})}const XIAOMI_DEFAULT_MODEL_ID=`mimo-v2-flash`,XIAOMI_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0},MOONSHOT_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0},QWEN_PORTAL_DEFAULT_CONTEXT_WINDOW=128e3,QWEN_PORTAL_DEFAULT_MAX_TOKENS=8192,QWEN_PORTAL_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0},OLLAMA_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0},VLLM_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0},QIANFAN_BASE_URL=`https://qianfan.baidubce.com/v2`,QIANFAN_DEFAULT_MODEL_ID=`deepseek-v3.2`,QIANFAN_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0},NVIDIA_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0};function resolveOllamaApiBase(configuredBaseUrl){return configuredBaseUrl?normalizeBaseUrl(configuredBaseUrl).replace(/\/v1$/i,``):`http://127.0.0.1:11434`}function resolveFreetokenApiBase(configuredBaseUrl){return configuredBaseUrl?normalizeBaseUrl(configuredBaseUrl).replace(/\/v1$/i,``):`http://127.0.0.1:1919`}async function discoverOllamaModels(baseUrl){if(process.env.VITEST)return[];try{let apiBase=resolveOllamaApiBase(baseUrl),response=await fetch(`${apiBase}/api/tags`,{signal:AbortSignal.timeout(5e3)});if(!response.ok)return console.warn(`Failed to discover Ollama models: ${response.status}`),[];let data=await response.json();return!data.models||data.models.length===0?(console.warn(`No Ollama models found on local instance`),[]):data.models.map(model=>{let modelId=model.name;return{id:modelId,name:modelId,reasoning:modelId.toLowerCase().includes(`r1`)||modelId.toLowerCase().includes(`reasoning`),input:[`text`],cost:OLLAMA_DEFAULT_COST,contextWindow:128e3,maxTokens:8192}})}catch(error){return console.warn(`Failed to discover Ollama models: ${String(error)}`),[]}}async function discoverVllmModels(baseUrl,apiKey){if(process.env.VITEST)return[];let url=`${normalizeBaseUrl(baseUrl.trim())}/models`;try{let trimmedApiKey=apiKey?.trim(),response=await fetch(url,{headers:trimmedApiKey?{Authorization:`Bearer ${trimmedApiKey}`}:void 0,signal:AbortSignal.timeout(5e3)});if(!response.ok)return console.warn(`Failed to discover vLLM models: ${response.status}`),[];let models=(await response.json()).data??[];return models.length===0?(console.warn(`No vLLM models found on local instance`),[]):models.map(m=>({id:typeof m.id==`string`?m.id.trim():``})).filter(m=>!!m.id).map(m=>{let modelId=m.id,lower=modelId.toLowerCase();return{id:modelId,name:modelId,reasoning:lower.includes(`r1`)||lower.includes(`reasoning`)||lower.includes(`think`),input:[`text`],cost:VLLM_DEFAULT_COST,contextWindow:128e3,maxTokens:8192}})}catch(error){return console.warn(`Failed to discover vLLM models: ${String(error)}`),[]}}function normalizeApiKeyConfig(value){let trimmed=value.trim();return/^\$\{([A-Z0-9_]+)\}$/.exec(trimmed)?.[1]??trimmed}function resolveEnvApiKeyVarName(provider){let resolved=resolveEnvApiKey(provider);if(!resolved)return;let match=/^(?:env: |shell env: )([A-Z0-9_]+)$/.exec(resolved.source);return match?match[1]:void 0}function resolveAwsSdkApiKeyVarName(){return resolveAwsSdkEnvVarName()??`AWS_PROFILE`}function resolveApiKeyFromProfiles(params){let ids=listProfilesForProvider(params.store,params.provider);for(let id of ids){let cred=params.store.profiles[id];if(cred){if(cred.type===`api_key`)return cred.key;if(cred.type===`token`)return cred.token}}}function normalizeGoogleModelId(id){return id===`gemini-3-pro`?`gemini-3-pro-preview`:id===`gemini-3-flash`?`gemini-3-flash-preview`:id}function normalizeGoogleProvider(provider){let mutated=!1,models=provider.models.map(model=>{let nextId=normalizeGoogleModelId(model.id);return nextId===model.id?model:(mutated=!0,{...model,id:nextId})});return mutated?{...provider,models}:provider}async function normalizeProviders(params){let{providers}=params;if(!providers)return providers;let authStore=await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),mutated=!1,next={};for(let[key,provider]of Object.entries(providers)){let normalizedKey=key.trim(),normalizedProvider=provider;if(normalizedProvider.apiKey&&normalizeApiKeyConfig(normalizedProvider.apiKey)!==normalizedProvider.apiKey&&(mutated=!0,normalizedProvider={...normalizedProvider,apiKey:normalizeApiKeyConfig(normalizedProvider.apiKey)}),Array.isArray(normalizedProvider.models)&&normalizedProvider.models.length>0&&!normalizedProvider.apiKey?.trim())if((normalizedProvider.auth??(normalizedKey===`amazon-bedrock`?`aws-sdk`:void 0))===`aws-sdk`){let apiKey=resolveAwsSdkApiKeyVarName();mutated=!0,normalizedProvider={...normalizedProvider,apiKey}}else{let fromEnv=resolveEnvApiKeyVarName(normalizedKey),fromProfiles=resolveApiKeyFromProfiles({provider:normalizedKey,store:authStore}),apiKey=fromEnv??fromProfiles;apiKey?.trim()?(mutated=!0,normalizedProvider={...normalizedProvider,apiKey}):normalizedProvider.api===`transformers`&&(mutated=!0,normalizedProvider={...normalizedProvider,apiKey:`local`})}if(normalizedKey===`google`){let googleNormalized=normalizeGoogleProvider(normalizedProvider);googleNormalized!==normalizedProvider&&(mutated=!0),normalizedProvider=googleNormalized}next[key]=normalizedProvider}return mutated?next:providers}function buildMinimaxProvider(){return{baseUrl:MINIMAX_PORTAL_BASE_URL,api:`anthropic-messages`,models:[buildMinimaxTextModel({id:MINIMAX_DEFAULT_MODEL_ID,name:`MiniMax M2.1`,reasoning:!1}),buildMinimaxTextModel({id:`MiniMax-M2.1-lightning`,name:`MiniMax M2.1 Lightning`,reasoning:!1}),buildMinimaxModel({id:`MiniMax-VL-01`,name:`MiniMax VL 01`,reasoning:!1,input:[`text`,`image`]}),buildMinimaxTextModel({id:`MiniMax-M2.5`,name:`MiniMax M2.5`,reasoning:!0}),buildMinimaxTextModel({id:`MiniMax-M2.5-Lightning`,name:`MiniMax M2.5 Lightning`,reasoning:!0})]}}function buildMinimaxPortalProvider(){return{baseUrl:MINIMAX_PORTAL_BASE_URL,api:`anthropic-messages`,models:[buildMinimaxTextModel({id:MINIMAX_DEFAULT_MODEL_ID,name:`MiniMax M2.1`,reasoning:!1}),buildMinimaxTextModel({id:`MiniMax-M2.5`,name:`MiniMax M2.5`,reasoning:!0})]}}function buildMoonshotProvider(){return{baseUrl:`https://api.moonshot.ai/v1`,api:`openai-completions`,models:[{id:`kimi-k2.5`,name:`Kimi K2.5`,reasoning:!1,input:[`text`],cost:MOONSHOT_DEFAULT_COST,contextWindow:256e3,maxTokens:8192}]}}function buildQwenPortalProvider(){return{baseUrl:`https://portal.qwen.ai/v1`,api:`openai-completions`,models:[{id:`coder-model`,name:`Qwen Coder`,reasoning:!1,input:[`text`],cost:QWEN_PORTAL_DEFAULT_COST,contextWindow:QWEN_PORTAL_DEFAULT_CONTEXT_WINDOW,maxTokens:QWEN_PORTAL_DEFAULT_MAX_TOKENS},{id:`vision-model`,name:`Qwen Vision`,reasoning:!1,input:[`text`,`image`],cost:QWEN_PORTAL_DEFAULT_COST,contextWindow:QWEN_PORTAL_DEFAULT_CONTEXT_WINDOW,maxTokens:QWEN_PORTAL_DEFAULT_MAX_TOKENS}]}}function buildSyntheticProvider(){return{baseUrl:SYNTHETIC_BASE_URL,api:`anthropic-messages`,models:SYNTHETIC_MODEL_CATALOG.map(buildSyntheticModelDefinition)}}function buildXiaomiProvider(){return{baseUrl:`https://api.xiaomimimo.com/anthropic`,api:`anthropic-messages`,models:[{id:XIAOMI_DEFAULT_MODEL_ID,name:`Xiaomi MiMo V2 Flash`,reasoning:!1,input:[`text`],cost:XIAOMI_DEFAULT_COST,contextWindow:262144,maxTokens:8192}]}}async function buildVeniceProvider(){return{baseUrl:VENICE_BASE_URL,api:`openai-completions`,models:await discoverVeniceModels()}}function buildOllamaProviderSync(configuredBaseUrl){return{baseUrl:resolveOllamaApiBase(configuredBaseUrl),api:`ollama`,models:[]}}async function buildHuggingfaceProvider(apiKey){let resolvedSecret=apiKey?.trim()===``?``:/^[A-Z][A-Z0-9_]*$/.test(apiKey.trim())?(process.env[apiKey.trim()]??``).trim():apiKey.trim();return{baseUrl:HUGGINGFACE_BASE_URL,api:`openai-completions`,models:resolvedSecret===``?HUGGINGFACE_MODEL_CATALOG.map(buildHuggingfaceModelDefinition):await discoverHuggingfaceModels(resolvedSecret)}}function buildTogetherProvider(){return{baseUrl:TOGETHER_BASE_URL,api:`openai-completions`,models:TOGETHER_MODEL_CATALOG.map(buildTogetherModelDefinition)}}async function buildVllmProvider(params){let baseUrl=normalizeBaseUrl(params?.baseUrl?.trim()||`http://127.0.0.1:8000/v1`);return{baseUrl,api:`openai-completions`,models:await discoverVllmModels(baseUrl,params?.apiKey)}}function buildQianfanProvider(){return{baseUrl:QIANFAN_BASE_URL,api:`openai-completions`,models:[{id:QIANFAN_DEFAULT_MODEL_ID,name:`DEEPSEEK V3.2`,reasoning:!0,input:[`text`],cost:QIANFAN_DEFAULT_COST,contextWindow:98304,maxTokens:32768},{id:`ernie-5.0-thinking-preview`,name:`ERNIE-5.0-Thinking-Preview`,reasoning:!0,input:[`text`,`image`],cost:QIANFAN_DEFAULT_COST,contextWindow:119e3,maxTokens:64e3}]}}const BUILDERFORCE_AGENTSLLM_FREE_COST={input:0,output:0,cacheRead:0,cacheWrite:0};function buildBuilderForceAgentsllmProvider(){return{baseUrl:`https://api.builderforce.ai/llm/v1`,api:`openai-completions`,models:[{id:`auto`,name:`BuilderForceAgentsLLM Auto (free pool)`,reasoning:!1,input:[`text`],cost:BUILDERFORCE_AGENTSLLM_FREE_COST,contextWindow:262144,maxTokens:8192},{id:`poolside/laguna-s-2.1:free`,name:`Laguna S 2.1 coder (262k ctx)`,reasoning:!1,input:[`text`],cost:BUILDERFORCE_AGENTSLLM_FREE_COST,contextWindow:262144,maxTokens:8192},{id:`google/gemma-4-31b-it:free`,name:`Gemma 4 31B (262k ctx)`,reasoning:!1,input:[`text`],cost:BUILDERFORCE_AGENTSLLM_FREE_COST,contextWindow:262144,maxTokens:8192},{id:`nvidia/nemotron-3-super-120b-a12b:free`,name:`Nemotron 3 Super 120B (262k ctx)`,reasoning:!1,input:[`text`],cost:BUILDERFORCE_AGENTSLLM_FREE_COST,contextWindow:262144,maxTokens:8192}]}}function buildNvidiaProvider(){return{baseUrl:`https://integrate.api.nvidia.com/v1`,api:`openai-completions`,models:[{id:`nvidia/llama-3.1-nemotron-70b-instruct`,name:`NVIDIA Llama 3.1 Nemotron 70B Instruct`,reasoning:!1,input:[`text`],cost:NVIDIA_DEFAULT_COST,contextWindow:131072,maxTokens:4096},{id:`meta/llama-3.3-70b-instruct`,name:`Meta Llama 3.3 70B Instruct`,reasoning:!1,input:[`text`],cost:NVIDIA_DEFAULT_COST,contextWindow:131072,maxTokens:4096},{id:`nvidia/mistral-nemo-minitron-8b-8k-instruct`,name:`NVIDIA Mistral NeMo Minitron 8B Instruct`,reasoning:!1,input:[`text`],cost:NVIDIA_DEFAULT_COST,contextWindow:8192,maxTokens:2048}]}}const LLAMA_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0};function buildLlamaProvider(modelPath){let modelName=modelPath.split(/[/\\]/).pop()??modelPath;return{baseUrl:modelPath,api:`llama`,models:[{id:modelName,name:modelName,reasoning:!1,input:[`text`],cost:LLAMA_DEFAULT_COST,contextWindow:4096,maxTokens:2048}]}}async function resolveImplicitProviders(params){let providers={},authStore=await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),minimaxKey=resolveEnvApiKeyVarName(`minimax`)??resolveApiKeyFromProfiles({provider:`minimax`,store:authStore});minimaxKey&&(providers.minimax={...buildMinimaxProvider(),apiKey:minimaxKey}),listProfilesForProvider(authStore,`minimax-portal`).length>0&&(providers[`minimax-portal`]={...buildMinimaxPortalProvider(),apiKey:`minimax-oauth`});let moonshotKey=resolveEnvApiKeyVarName(`moonshot`)??resolveApiKeyFromProfiles({provider:`moonshot`,store:authStore});moonshotKey&&(providers.moonshot={...buildMoonshotProvider(),apiKey:moonshotKey});let syntheticKey=resolveEnvApiKeyVarName(`synthetic`)??resolveApiKeyFromProfiles({provider:`synthetic`,store:authStore});syntheticKey&&(providers.synthetic={...buildSyntheticProvider(),apiKey:syntheticKey});let veniceKey=resolveEnvApiKeyVarName(`venice`)??resolveApiKeyFromProfiles({provider:`venice`,store:authStore});veniceKey&&(providers.venice={...await buildVeniceProvider(),apiKey:veniceKey}),listProfilesForProvider(authStore,`qwen-portal`).length>0&&(providers[`qwen-portal`]={...buildQwenPortalProvider(),apiKey:`qwen-oauth`});let xiaomiKey=resolveEnvApiKeyVarName(`xiaomi`)??resolveApiKeyFromProfiles({provider:`xiaomi`,store:authStore});xiaomiKey&&(providers.xiaomi={...buildXiaomiProvider(),apiKey:xiaomiKey});let cloudflareProfiles=listProfilesForProvider(authStore,`cloudflare-ai-gateway`);for(let profileId of cloudflareProfiles){let cred=authStore.profiles[profileId];if(cred?.type!==`api_key`)continue;let accountId=cred.metadata?.accountId?.trim(),gatewayId=cred.metadata?.gatewayId?.trim();if(!accountId||!gatewayId)continue;let baseUrl=resolveCloudflareAiGatewayBaseUrl({accountId,gatewayId});if(!baseUrl)continue;let apiKey=resolveEnvApiKeyVarName(`cloudflare-ai-gateway`)??cred.key?.trim()??``;if(apiKey){providers[`cloudflare-ai-gateway`]={baseUrl,api:`anthropic-messages`,apiKey,models:[buildCloudflareAiGatewayModelDefinition()]};break}}let ollamaKey=resolveEnvApiKeyVarName(`ollama`)??resolveApiKeyFromProfiles({provider:`ollama`,store:authStore});if(ollamaKey){let ollamaBaseUrl=params.explicitProviders?.ollama?.baseUrl;providers.ollama={...buildOllamaProviderSync(ollamaBaseUrl),apiKey:ollamaKey}}if(!params.explicitProviders?.vllm){let vllmEnvVar=resolveEnvApiKeyVarName(`vllm`),vllmProfileKey=resolveApiKeyFromProfiles({provider:`vllm`,store:authStore}),vllmKey=vllmEnvVar??vllmProfileKey;vllmKey&&(providers.vllm={...await buildVllmProvider({apiKey:(vllmEnvVar?process.env[vllmEnvVar]?.trim()??``:vllmProfileKey??``)||void 0}),apiKey:vllmKey})}let togetherKey=resolveEnvApiKeyVarName(`together`)??resolveApiKeyFromProfiles({provider:`together`,store:authStore});togetherKey&&(providers.together={...buildTogetherProvider(),apiKey:togetherKey});let huggingfaceKey=resolveEnvApiKeyVarName(`huggingface`)??resolveApiKeyFromProfiles({provider:`huggingface`,store:authStore});huggingfaceKey&&(providers.huggingface={...await buildHuggingfaceProvider(huggingfaceKey),apiKey:huggingfaceKey});let qianfanKey=resolveEnvApiKeyVarName(`qianfan`)??resolveApiKeyFromProfiles({provider:`qianfan`,store:authStore});qianfanKey&&(providers.qianfan={...buildQianfanProvider(),apiKey:qianfanKey});let nvidiaKey=resolveEnvApiKeyVarName(`nvidia`)??resolveApiKeyFromProfiles({provider:`nvidia`,store:authStore});if(nvidiaKey&&(providers.nvidia={...buildNvidiaProvider(),apiKey:nvidiaKey}),providers.builderforcellm={...buildBuilderForceAgentsllmProvider(),apiKey:`builderforcellm-proxy`},!params.explicitProviders?.llama){let llamaModelPath=(process.env.BUILDERFORCE_AGENTS_LLAMA_MODEL_PATH??``).trim();llamaModelPath&&(providers.llama=buildLlamaProvider(llamaModelPath))}return providers}async function resolveImplicitCopilotProvider(params){let env=params.env??process.env,authStore=await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),hasProfile=listProfilesForProvider(authStore,`github-copilot`).length>0,githubToken=(env.COPILOT_GITHUB_TOKEN??env.GH_TOKEN??env.GITHUB_TOKEN??``).trim();if(!hasProfile&&!githubToken)return null;let selectedGithubToken=githubToken;if(!selectedGithubToken&&hasProfile){let profileId=listProfilesForProvider(authStore,`github-copilot`)[0],profile=profileId?authStore.profiles[profileId]:void 0;profile&&profile.type===`token`&&(selectedGithubToken=profile.token)}let{DEFAULT_COPILOT_API_BASE_URL,resolveCopilotApiToken}=await import(`./github-copilot-token-D5sB2AUI.js`),baseUrl=DEFAULT_COPILOT_API_BASE_URL;if(selectedGithubToken)try{baseUrl=(await resolveCopilotApiToken({githubToken:selectedGithubToken,env})).baseUrl}catch{baseUrl=DEFAULT_COPILOT_API_BASE_URL}return{baseUrl,api:`openai-responses`,models:getDefaultCopilotModelIds().map(buildCopilotModelDefinition)}}async function resolveImplicitBedrockProvider(params){let env=params.env??process.env,discoveryConfig=params.config?.models?.bedrockDiscovery,enabled=discoveryConfig?.enabled,hasAwsCreds=resolveAwsSdkEnvVarName(env)!==void 0;if(enabled===!1||enabled!==!0&&!hasAwsCreds)return null;let region=discoveryConfig?.region??env.AWS_REGION??env.AWS_DEFAULT_REGION??`us-east-1`,models=await discoverBedrockModels({region,config:discoveryConfig});return models.length===0?null:{baseUrl:`https://bedrock-runtime.${region}.amazonaws.com`,api:`bedrock-converse-stream`,auth:`aws-sdk`,models}}const OPENAI_CODEX_OAUTH_MODEL_PREFIXES=[`gpt-5.3-codex`];function normalizeAliasKey(value){return value.trim().toLowerCase()}function modelKey(provider,model){return`${provider}/${model}`}function normalizeProviderId(provider){let normalized=provider.trim().toLowerCase();return normalized===`z.ai`||normalized===`z-ai`?`zai`:normalized===`opencode-zen`?`opencode`:normalized===`qwen`?`qwen-portal`:normalized===`kimi-code`?`kimi-coding`:normalized}function findNormalizedProviderValue(entries,provider){if(!entries)return;let providerKey=normalizeProviderId(provider);for(let[key,value]of Object.entries(entries))if(normalizeProviderId(key)===providerKey)return value}function findNormalizedProviderKey(entries,provider){if(!entries)return;let providerKey=normalizeProviderId(provider);return Object.keys(entries).find(key=>normalizeProviderId(key)===providerKey)}function isCliProvider(provider,cfg){let normalized=normalizeProviderId(provider);if(normalized===`claude-cli`||normalized===`codex-cli`)return!0;let backends=cfg?.agents?.defaults?.cliBackends??{};return Object.keys(backends).some(key=>normalizeProviderId(key)===normalized)}function normalizeAnthropicModelId(model){let trimmed=model.trim();return trimmed&&(resolveAnthropicShortAlias(trimmed)??trimmed)}function normalizeProviderModelId(provider,model){return provider===`anthropic`?normalizeAnthropicModelId(model):provider===`google`?normalizeGoogleModelId(model):model}function shouldUseOpenAICodexProvider(provider,model){if(provider!==`openai`)return!1;let normalized=model.trim().toLowerCase();return normalized?OPENAI_CODEX_OAUTH_MODEL_PREFIXES.some(prefix=>normalized===prefix||normalized.startsWith(`${prefix}-`)):!1}function normalizeModelRef(provider,model){let normalizedProvider=normalizeProviderId(provider),normalizedModel=normalizeProviderModelId(normalizedProvider,model.trim());return shouldUseOpenAICodexProvider(normalizedProvider,normalizedModel)?{provider:`openai-codex`,model:normalizedModel}:{provider:normalizedProvider,model:normalizedModel}}function parseModelRef(raw,defaultProvider){let trimmed=raw.trim();if(!trimmed)return null;let slash=trimmed.indexOf(`/`);if(slash===-1)return normalizeModelRef(defaultProvider,trimmed);let providerRaw=trimmed.slice(0,slash).trim(),model=trimmed.slice(slash+1).trim();return!providerRaw||!model?null:normalizeModelRef(providerRaw,model)}function normalizeModelSelection(value){if(typeof value==`string`)return value.trim()||void 0;if(!value||typeof value!=`object`)return;let primary=value.primary;if(typeof primary==`string`)return primary.trim()||void 0}function resolveAllowlistModelKey(raw,defaultProvider){let parsed=parseModelRef(raw,defaultProvider);return parsed?modelKey(parsed.provider,parsed.model):null}function buildConfiguredAllowlistKeys(params){let rawAllowlist=Object.keys(params.cfg?.agents?.defaults?.models??{});if(rawAllowlist.length===0)return null;let keys=new Set;for(let raw of rawAllowlist){let key=resolveAllowlistModelKey(String(raw??``),params.defaultProvider);key&&keys.add(key)}return keys.size>0?keys:null}function buildModelAliasIndex(params){let byAlias=new Map,byKey=new Map,rawModels=params.cfg.agents?.defaults?.models??{};for(let[keyRaw,entryRaw]of Object.entries(rawModels)){let parsed=parseModelRef(String(keyRaw??``),params.defaultProvider);if(!parsed)continue;let alias=String(entryRaw?.alias??``).trim();if(!alias)continue;let aliasKey=normalizeAliasKey(alias);byAlias.set(aliasKey,{alias,ref:parsed});let key=modelKey(parsed.provider,parsed.model),existing=byKey.get(key)??[];existing.push(alias),byKey.set(key,existing)}return{byAlias,byKey}}function resolveModelRefFromString(params){let trimmed=params.raw.trim();if(!trimmed)return null;if(!trimmed.includes(`/`)){let aliasKey=normalizeAliasKey(trimmed),aliasMatch=params.aliasIndex?.byAlias.get(aliasKey);if(aliasMatch)return{ref:aliasMatch.ref,alias:aliasMatch.alias}}let parsed=parseModelRef(trimmed,params.defaultProvider);return parsed?{ref:parsed}:null}function resolveConfiguredModelRef(params){let rawModel=(()=>{let raw=params.cfg.agents?.defaults?.model;return typeof raw==`string`?raw.trim():raw?.primary?.trim()??``})();if(rawModel){let trimmed=rawModel.trim(),aliasIndex=buildModelAliasIndex({cfg:params.cfg,defaultProvider:params.defaultProvider});if(!trimmed.includes(`/`)){let aliasKey=normalizeAliasKey(trimmed),aliasMatch=aliasIndex.byAlias.get(aliasKey);return aliasMatch?aliasMatch.ref:(console.warn(`[builderforce] Model "${trimmed}" specified without provider. Falling back to "anthropic/${trimmed}". Please use "anthropic/${trimmed}" in your config.`),{provider:`anthropic`,model:trimmed})}let resolved=resolveModelRefFromString({raw:trimmed,defaultProvider:params.defaultProvider,aliasIndex});if(resolved)return resolved.ref}return{provider:params.defaultProvider,model:params.defaultModel}}function resolveDefaultModelForAgent(params){let agentModelOverride=params.agentId?resolveAgentModelPrimary(params.cfg,params.agentId):void 0;return resolveConfiguredModelRef({cfg:agentModelOverride&&agentModelOverride.length>0?{...params.cfg,agents:{...params.cfg.agents,defaults:{...params.cfg.agents?.defaults,model:{...typeof params.cfg.agents?.defaults?.model==`object`?params.cfg.agents.defaults.model:void 0,primary:agentModelOverride}}}}:params.cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL})}function resolveSubagentConfiguredModelSelection(params){let agentConfig=resolveAgentConfig(params.cfg,params.agentId);return normalizeModelSelection(agentConfig?.subagents?.model)??normalizeModelSelection(params.cfg.agents?.defaults?.subagents?.model)??normalizeModelSelection(agentConfig?.model)}function resolveSubagentSpawnModelSelection(params){let runtimeDefault=resolveDefaultModelForAgent({cfg:params.cfg,agentId:params.agentId});return normalizeModelSelection(params.modelOverride)??resolveSubagentConfiguredModelSelection({cfg:params.cfg,agentId:params.agentId})??normalizeModelSelection(params.cfg.agents?.defaults?.model?.primary)??`${runtimeDefault.provider}/${runtimeDefault.model}`}function buildAllowedModelSet(params){let rawAllowlist=(()=>{let modelMap=params.cfg.agents?.defaults?.models??{};return Object.keys(modelMap)})(),allowAny=rawAllowlist.length===0;logDebug(`[model-selection] buildAllowedModelSet: rawAllowlist=[${rawAllowlist.join(`, `)}] allowAny=${allowAny} defaultProvider=${params.defaultProvider} defaultModel=${params.defaultModel??`(none)`}`);let defaultModel=params.defaultModel?.trim(),defaultRef=defaultModel&¶ms.defaultProvider?parseModelRef(defaultModel,params.defaultProvider):null,defaultKey=defaultRef?modelKey(defaultRef.provider,defaultRef.model):void 0,catalogKeys=new Set(params.catalog.map(entry=>modelKey(entry.provider,entry.id)));if(allowAny)return defaultKey&&catalogKeys.add(defaultKey),{allowAny:!0,allowedCatalog:params.catalog,allowedKeys:catalogKeys};let allowedKeys=new Set,configuredProviders=params.cfg.models?.providers??{};for(let raw of rawAllowlist){let parsed=parseModelRef(String(raw),params.defaultProvider);if(!parsed)continue;let key=modelKey(parsed.provider,parsed.model),providerKey=normalizeProviderId(parsed.provider);isCliProvider(parsed.provider,params.cfg)||catalogKeys.has(key)||configuredProviders[providerKey],allowedKeys.add(key)}defaultKey&&allowedKeys.add(defaultKey);let allowedCatalog=params.catalog.filter(entry=>allowedKeys.has(modelKey(entry.provider,entry.id)));return allowedCatalog.length===0&&allowedKeys.size===0?(defaultKey&&catalogKeys.add(defaultKey),{allowAny:!0,allowedCatalog:params.catalog,allowedKeys:catalogKeys}):{allowAny:!1,allowedCatalog,allowedKeys}}function getModelRefStatus(params){let allowed=buildAllowedModelSet({cfg:params.cfg,catalog:params.catalog,defaultProvider:params.defaultProvider,defaultModel:params.defaultModel}),key=modelKey(params.ref.provider,params.ref.model),configuredProviderKey=findNormalizedProviderKey(params.cfg.models?.providers??{},params.ref.provider),inCatalog=params.catalog.some(entry=>modelKey(entry.provider,entry.id)===key),inAllowedKeys=allowed.allowedKeys.has(key),hasConfiguredProvider=!!configuredProviderKey,isCli=isCliProvider(params.ref.provider,params.cfg),isAllowed=allowed.allowAny||inAllowedKeys||hasConfiguredProvider||isCli;return logDebug(`[model-selection] getModelRefStatus: key=${key} inCatalog=${inCatalog} allowAny=${allowed.allowAny} inAllowedKeys=${inAllowedKeys} hasConfiguredProvider=${hasConfiguredProvider} (${configuredProviderKey??`none`}) isCli=${isCli} → allowed=${isAllowed}`),isAllowed||logWarn(`[model-selection] model REJECTED: ${key} — allowedKeys=[${[...allowed.allowedKeys].join(`, `)}] configuredProviders=[${Object.keys(params.cfg.models?.providers??{}).join(`, `)}]`),{key,inCatalog,allowAny:allowed.allowAny,allowed:isAllowed}}function resolveAllowedModelRef(params){let trimmed=params.raw.trim();if(!trimmed)return{error:`invalid model: empty`};let aliasIndex=buildModelAliasIndex({cfg:params.cfg,defaultProvider:params.defaultProvider}),resolved=resolveModelRefFromString({raw:trimmed,defaultProvider:params.defaultProvider,aliasIndex});if(logDebug(`[model-selection] resolveAllowedModelRef: raw="${trimmed}" defaultProvider=${params.defaultProvider} → resolved=${resolved?`${resolved.ref.provider}/${resolved.ref.model}`:`null`}`),!resolved)return{error:`invalid model: ${trimmed}`};let status=getModelRefStatus({cfg:params.cfg,catalog:params.catalog,ref:resolved.ref,defaultProvider:params.defaultProvider,defaultModel:params.defaultModel}),openRouterFallbackStatus=!status.allowed&&normalizeProviderId(params.defaultProvider)===`openrouter`&&!trimmed.toLowerCase().startsWith(`openrouter/`)&&trimmed.includes(`/`)?getModelRefStatus({cfg:params.cfg,catalog:params.catalog,ref:normalizeModelRef(`openrouter`,trimmed),defaultProvider:params.defaultProvider,defaultModel:params.defaultModel}):void 0;return openRouterFallbackStatus?.allowed?(logDebug(`[model-selection] resolveAllowedModelRef: OpenRouter fallback succeeded for "${trimmed}" → openrouter/${trimmed}`),{ref:normalizeModelRef(`openrouter`,trimmed),key:openRouterFallbackStatus.key}):status.allowed?{ref:resolved.ref,key:status.key}:(logWarn(`[model-selection] resolveAllowedModelRef FAILED: raw="${trimmed}" resolvedKey=${status.key} allowed=false (openRouterFallback=${openRouterFallbackStatus?`tried,allowed=${openRouterFallbackStatus.allowed}`:`skipped`})`),{error:`model not allowed: ${status.key}`})}function resolveThinkingDefault(params){return params.cfg.agents?.defaults?.thinkingDefault||(params.catalog?.find(entry=>entry.provider===params.provider&&entry.id===params.model)?.reasoning?`low`:`off`)}function resolveHooksGmailModel(params){let hooksModel=params.cfg.hooks?.gmail?.model;if(!hooksModel?.trim())return null;let aliasIndex=buildModelAliasIndex({cfg:params.cfg,defaultProvider:params.defaultProvider});return resolveModelRefFromString({raw:hooksModel,defaultProvider:params.defaultProvider,aliasIndex})?.ref??null}function isPidAlive(pid){if(!Number.isFinite(pid)||pid<=0)return!1;try{return process.kill(pid,0),!0}catch{return!1}}function resolveProcessScopedMap(key){let proc=process,existing=proc[key];if(existing)return existing;let created=new Map;return proc[key]=created,created}const HELD_LOCKS=resolveProcessScopedMap(Symbol.for(`builderforce.fileLockHeldLocks`));function computeDelayMs(retries,attempt){let base=Math.min(retries.maxTimeout,Math.max(retries.minTimeout,retries.minTimeout*retries.factor**attempt)),jitter=retries.randomize?1+Math.random():1;return Math.min(retries.maxTimeout,Math.round(base*jitter))}async function readLockPayload(lockPath){try{let raw=await fs$1.readFile(lockPath,`utf8`),parsed=JSON.parse(raw);return typeof parsed.pid!=`number`||typeof parsed.createdAt!=`string`?null:{pid:parsed.pid,createdAt:parsed.createdAt}}catch{return null}}async function resolveNormalizedFilePath(filePath){let resolved=path.resolve(filePath),dir=path.dirname(resolved);await fs$1.mkdir(dir,{recursive:!0});try{let realDir=await fs$1.realpath(dir);return path.join(realDir,path.basename(resolved))}catch{return resolved}}async function isStaleLock(lockPath,staleMs){let payload=await readLockPayload(lockPath);if(payload?.pid&&!isPidAlive(payload.pid))return!0;if(payload?.createdAt){let createdAt=Date.parse(payload.createdAt);if(!Number.isFinite(createdAt)||Date.now()-createdAt>staleMs)return!0}try{let stat=await fs$1.stat(lockPath);return Date.now()-stat.mtimeMs>staleMs}catch{return!0}}async function releaseHeldLock(normalizedFile){let current=HELD_LOCKS.get(normalizedFile);current&&(--current.count,!(current.count>0)&&(HELD_LOCKS.delete(normalizedFile),await current.handle.close().catch(()=>void 0),await fs$1.rm(current.lockPath,{force:!0}).catch(()=>void 0)))}async function acquireFileLock(filePath,options){let normalizedFile=await resolveNormalizedFilePath(filePath),lockPath=`${normalizedFile}.lock`,held=HELD_LOCKS.get(normalizedFile);if(held)return held.count+=1,{lockPath,release:()=>releaseHeldLock(normalizedFile)};let attempts=Math.max(1,options.retries.retries+1);for(let attempt=0;attempt<attempts;attempt+=1)try{let handle=await fs$1.open(lockPath,`wx`);return await handle.writeFile(JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()},null,2),`utf8`),HELD_LOCKS.set(normalizedFile,{count:1,handle,lockPath}),{lockPath,release:()=>releaseHeldLock(normalizedFile)}}catch(err){if(err.code!==`EEXIST`)throw err;if(await isStaleLock(lockPath,options.stale)){await fs$1.rm(lockPath,{force:!0}).catch(()=>void 0);continue}if(attempt>=attempts-1)break;await new Promise(resolve=>setTimeout(resolve,computeDelayMs(options.retries,attempt)))}throw Error(`file lock timeout for ${normalizedFile}`)}async function withFileLock(filePath,options,fn){let lock=await acquireFileLock(filePath,options);try{return await fn()}finally{await lock.release()}}createSubsystemLogger(`agents/auth-profiles`);async function cachedByKey(store,cacheKey,ttlMs,loader){let now=Date.now();if(ttlMs>0&&store.current&&store.current.cacheKey===cacheKey&&now-store.current.readAt<ttlMs)return store.current.value;let value=await loader();return ttlMs>0&&(store.current={value,readAt:now,cacheKey}),value}const qwenCliCache={current:null},minimaxCliCache={current:null};function resolveQwenCliCredentialsPath(homeDir){let baseDir=homeDir??resolveUserPath(`~`);return path.join(baseDir,`.qwen/oauth_creds.json`)}function resolveMiniMaxCliCredentialsPath(homeDir){let baseDir=homeDir??resolveUserPath(`~`);return path.join(baseDir,`.minimax/oauth_creds.json`)}async function readQwenCliCredentials(options){return readPortalCliOauthCredentials(resolveQwenCliCredentialsPath(options?.homeDir),`qwen-portal`)}async function readPortalCliOauthCredentials(credPath,provider){let raw=await loadJsonFile(credPath);if(!raw||typeof raw!=`object`)return null;let data=raw,accessToken=data.access_token,refreshToken=data.refresh_token,expiresAt=data.expiry_date;return typeof accessToken!=`string`||!accessToken||typeof refreshToken!=`string`||!refreshToken||typeof expiresAt!=`number`||!Number.isFinite(expiresAt)?null:{type:`oauth`,provider,access:accessToken,refresh:refreshToken,expires:expiresAt}}async function readMiniMaxCliCredentials(options){return readPortalCliOauthCredentials(resolveMiniMaxCliCredentialsPath(options?.homeDir),`minimax-portal`)}async function readQwenCliCredentialsCached(options){return cachedByKey(qwenCliCache,resolveQwenCliCredentialsPath(options?.homeDir),options?.ttlMs??0,()=>readQwenCliCredentials({homeDir:options?.homeDir}))}async function readMiniMaxCliCredentialsCached(options){return cachedByKey(minimaxCliCache,resolveMiniMaxCliCredentialsPath(options?.homeDir),options?.ttlMs??0,()=>readMiniMaxCliCredentials({homeDir:options?.homeDir}))}function shallowEqualOAuthCredentials(a,b){return!a||a.type!==`oauth`?!1:a.provider===b.provider&&a.access===b.access&&a.refresh===b.refresh&&a.expires===b.expires&&a.email===b.email&&a.enterpriseUrl===b.enterpriseUrl&&a.projectId===b.projectId&&a.accountId===b.accountId}function isExternalProfileFresh(cred,now){return!cred||cred.type!==`oauth`&&cred.type!==`token`||cred.provider!==`qwen-portal`&&cred.provider!==`minimax-portal`?!1:typeof cred.expires==`number`?cred.expires>now+6e5:!0}async function syncExternalCliCredentialsForProvider(store,profileId,provider,readCredentials,now){let existing=store.profiles[profileId],creds=!existing||existing.provider!==provider||!isExternalProfileFresh(existing,now)?await readCredentials():null;if(!creds)return!1;let existingOAuth=existing?.type===`oauth`?existing:void 0;return(!existingOAuth||existingOAuth.provider!==provider||existingOAuth.expires<=now||creds.expires>existingOAuth.expires)&&!shallowEqualOAuthCredentials(existingOAuth,creds)?(store.profiles[profileId]=creds,log$1.info(`synced ${provider} credentials from external cli`,{profileId,expires:new Date(creds.expires).toISOString()}),!0):!1}async function syncExternalCliCredentials(store){let mutated=!1,now=Date.now(),existingQwen=store.profiles[QWEN_CLI_PROFILE_ID],qwenCreds=!existingQwen||existingQwen.provider!==`qwen-portal`||!isExternalProfileFresh(existingQwen,now)?await readQwenCliCredentialsCached({ttlMs:EXTERNAL_CLI_SYNC_TTL_MS}):null;if(qwenCreds){let existing=store.profiles[QWEN_CLI_PROFILE_ID],existingOAuth=existing?.type===`oauth`?existing:void 0;(!existingOAuth||existingOAuth.provider!==`qwen-portal`||existingOAuth.expires<=now||qwenCreds.expires>existingOAuth.expires)&&!shallowEqualOAuthCredentials(existingOAuth,qwenCreds)&&(store.profiles[QWEN_CLI_PROFILE_ID]=qwenCreds,mutated=!0,log$1.info(`synced qwen credentials from qwen cli`,{profileId:QWEN_CLI_PROFILE_ID,expires:new Date(qwenCreds.expires).toISOString()}))}return await syncExternalCliCredentialsForProvider(store,`minimax-portal:minimax-cli`,`minimax-portal`,()=>readMiniMaxCliCredentialsCached({ttlMs:EXTERNAL_CLI_SYNC_TTL_MS}),now)&&(mutated=!0),mutated}function resolveBuilderForceAgentsAgentDir(){return resolveUserPath(process.env.BUILDERFORCE_AGENTS_AGENT_DIR?.trim()||process.env.PI_CODING_AGENT_DIR?.trim()||path.join(resolveStateDir(),`agents`,DEFAULT_AGENT_ID,`agent`))}function resolveAuthStorePath(agentDir){let resolved=resolveUserPath(agentDir??resolveBuilderForceAgentsAgentDir());return path.join(resolved,`auth-profiles.json`)}function resolveLegacyAuthStorePath(agentDir){let resolved=resolveUserPath(agentDir??resolveBuilderForceAgentsAgentDir());return path.join(resolved,`auth.json`)}function resolveAuthStorePathForDisplay(agentDir){let pathname=resolveAuthStorePath(agentDir);return pathname.startsWith(`~`)?pathname:resolveUserPath(pathname)}async function ensureAuthStoreFile(pathname){fs.existsSync(pathname)||await saveJsonFile(pathname,{version:1,profiles:{}})}async function updateAuthProfileStoreWithLock(params){let authPath=resolveAuthStorePath(params.agentDir);await ensureAuthStoreFile(authPath);try{return await withFileLock(authPath,AUTH_STORE_LOCK_OPTIONS,async()=>{let store=await ensureAuthProfileStore(params.agentDir);return params.updater(store)&&await saveAuthProfileStore(store,params.agentDir),store})}catch{return null}}function coerceLegacyStore(raw){if(!raw||typeof raw!=`object`)return null;let record=raw;if(`profiles`in record)return null;let entries={};for(let[key,value]of Object.entries(record)){if(!value||typeof value!=`object`)continue;let typed=value;typed.type!==`api_key`&&typed.type!==`oauth`&&typed.type!==`token`||(entries[key]={...typed,provider:String(typed.provider??key)})}return Object.keys(entries).length>0?entries:null}function coerceAuthStore(raw){if(!raw||typeof raw!=`object`)return null;let record=raw;if(!record.profiles||typeof record.profiles!=`object`)return null;let profiles=record.profiles,normalized={};for(let[key,value]of Object.entries(profiles)){if(!value||typeof value!=`object`)continue;let typed=value;typed.type!==`api_key`&&typed.type!==`oauth`&&typed.type!==`token`||typed.provider&&(normalized[key]=typed)}let order=record.order&&typeof record.order==`object`?Object.entries(record.order).reduce((acc,[provider,value])=>{if(!Array.isArray(value))return acc;let list=value.map(entry=>typeof entry==`string`?entry.trim():``).filter(Boolean);return list.length===0||(acc[provider]=list),acc},{}):void 0;return{version:Number(record.version??1),profiles:normalized,order,lastGood:record.lastGood&&typeof record.lastGood==`object`?record.lastGood:void 0,usageStats:record.usageStats&&typeof record.usageStats==`object`?record.usageStats:void 0}}function mergeRecord(base,override){if(!(!base&&!override))return base?override?{...base,...override}:{...base}:{...override}}function mergeAuthProfileStores(base,override){return Object.keys(override.profiles).length===0&&!override.order&&!override.lastGood&&!override.usageStats?base:{version:Math.max(base.version,override.version??base.version),profiles:{...base.profiles,...override.profiles},order:mergeRecord(base.order,override.order),lastGood:mergeRecord(base.lastGood,override.lastGood),usageStats:mergeRecord(base.usageStats,override.usageStats)}}async function mergeOAuthFileIntoStore(store){let oauthRaw=await loadJsonFile(resolveOAuthPath());if(!oauthRaw||typeof oauthRaw!=`object`)return!1;let oauthEntries=oauthRaw,mutated=!1;for(let[provider,creds]of Object.entries(oauthEntries)){if(!creds||typeof creds!=`object`)continue;let profileId=`${provider}:default`;store.profiles[profileId]||(store.profiles[profileId]={type:`oauth`,provider,...creds},mutated=!0)}return mutated}function applyLegacyStore(store,legacy){for(let[provider,cred]of Object.entries(legacy)){let profileId=`${provider}:default`;if(cred.type===`api_key`){store.profiles[profileId]={type:`api_key`,provider:String(cred.provider??provider),key:cred.key,...cred.email?{email:cred.email}:{}};continue}if(cred.type===`token`){store.profiles[profileId]={type:`token`,provider:String(cred.provider??provider),token:cred.token,...typeof cred.expires==`number`?{expires:cred.expires}:{},...cred.email?{email:cred.email}:{}};continue}store.profiles[profileId]={type:`oauth`,provider:String(cred.provider??provider),access:cred.access,refresh:cred.refresh,expires:cred.expires,...cred.enterpriseUrl?{enterpriseUrl:cred.enterpriseUrl}:{},...cred.projectId?{projectId:cred.projectId}:{},...cred.accountId?{accountId:cred.accountId}:{},...cred.email?{email:cred.email}:{}}}}async function loadAuthProfileStore(){let authPath=resolveAuthStorePath(),asStore=coerceAuthStore(await loadJsonFile(authPath));if(asStore)return await syncExternalCliCredentials(asStore)&&await saveJsonFile(authPath,asStore),asStore;let legacy=coerceLegacyStore(await loadJsonFile(resolveLegacyAuthStorePath()));if(legacy){let store={version:1,profiles:{}};return applyLegacyStore(store,legacy),await syncExternalCliCredentials(store),store}let store={version:1,profiles:{}};return await syncExternalCliCredentials(store),store}async function loadAuthProfileStoreForAgent(agentDir,_options){let authPath=resolveAuthStorePath(agentDir),asStore=coerceAuthStore(await loadJsonFile(authPath));if(asStore)return await syncExternalCliCredentials(asStore)&&await saveJsonFile(authPath,asStore),asStore;if(agentDir){let mainStore=coerceAuthStore(await loadJsonFile(resolveAuthStorePath()));if(mainStore&&Object.keys(mainStore.profiles).length>0)return await saveJsonFile(authPath,mainStore),log$1.info(`inherited auth-profiles from main agent`,{agentDir}),mainStore}let legacy=coerceLegacyStore(await loadJsonFile(resolveLegacyAuthStorePath(agentDir))),store={version:1,profiles:{}};legacy&&applyLegacyStore(store,legacy);let mergedOAuth=await mergeOAuthFileIntoStore(store),syncedCli=await syncExternalCliCredentials(store),shouldWrite=legacy!==null||mergedOAuth||syncedCli;if(shouldWrite&&await saveJsonFile(authPath,store),shouldWrite&&legacy!==null){let legacyPath=resolveLegacyAuthStorePath(agentDir);try{fs.unlinkSync(legacyPath)}catch(err){err?.code!==`ENOENT`&&log$1.warn(`failed to delete legacy auth.json after migration`,{err,legacyPath})}}return store}async function ensureAuthProfileStore(agentDir,options){let store=await loadAuthProfileStoreForAgent(agentDir,options),authPath=resolveAuthStorePath(agentDir),mainAuthPath=resolveAuthStorePath();return!agentDir||authPath===mainAuthPath?store:mergeAuthProfileStores(await loadAuthProfileStoreForAgent(void 0,options),store)}async function saveAuthProfileStore(store,agentDir){await saveJsonFile(resolveAuthStorePath(agentDir),{version:1,profiles:store.profiles,order:store.order??void 0,lastGood:store.lastGood??void 0,usageStats:store.usageStats??void 0})}function dedupeProfileIds(profileIds){return[...new Set(profileIds)]}async function setAuthProfileOrder(params){let providerKey=normalizeProviderId(params.provider),deduped=dedupeProfileIds(params.order&&Array.isArray(params.order)?params.order.map(entry=>String(entry).trim()).filter(Boolean):[]);return await updateAuthProfileStoreWithLock({agentDir:params.agentDir,updater:store=>(store.order=store.order??{},deduped.length===0?store.order[providerKey]?(delete store.order[providerKey],Object.keys(store.order).length===0&&(store.order=void 0),!0):!1:(store.order[providerKey]=deduped,!0))})}async function upsertAuthProfile(params){let credential=params.credential.type===`api_key`?{...params.credential,...typeof params.credential.key==`string`?{key:normalizeSecretInput(params.credential.key)}:{}}:params.credential.type===`token`?{...params.credential,token:normalizeSecretInput(params.credential.token)}:params.credential,store=await ensureAuthProfileStore(params.agentDir);store.profiles[params.profileId]=credential,await saveAuthProfileStore(store,params.agentDir)}async function upsertAuthProfileWithLock(params){return await updateAuthProfileStoreWithLock({agentDir:params.agentDir,updater:store=>(store.profiles[params.profileId]=params.credential,!0)})}function listProfilesForProvider(store,provider){let providerKey=normalizeProviderId(provider);return Object.entries(store.profiles).filter(([,cred])=>normalizeProviderId(cred.provider)===providerKey).map(([id])=>id)}async function markAuthProfileGood(params){let{store,provider,profileId,agentDir}=params,updated=await updateAuthProfileStoreWithLock({agentDir,updater:freshStore=>{let profile=freshStore.profiles[profileId];return!profile||profile.provider!==provider?!1:(freshStore.lastGood={...freshStore.lastGood,[provider]:profileId},!0)}});if(updated){store.lastGood=updated.lastGood;return}let profile=store.profiles[profileId];!profile||profile.provider!==provider||(store.lastGood={...store.lastGood,[provider]:profileId},await saveAuthProfileStore(store,agentDir))}function getProfileSuffix(profileId){let idx=profileId.indexOf(`:`);return idx<0?``:profileId.slice(idx+1)}function isEmailLike(value){let trimmed=value.trim();return trimmed?trimmed.includes(`@`)&&trimmed.includes(`.`):!1}function suggestOAuthProfileIdForLegacyDefault(params){let providerKey=normalizeProviderId(params.provider);if(getProfileSuffix(params.legacyProfileId)!==`default`)return null;let legacyCfg=params.cfg?.auth?.profiles?.[params.legacyProfileId];if(legacyCfg&&normalizeProviderId(legacyCfg.provider)===providerKey&&legacyCfg.mode!==`oauth`)return null;let oauthProfiles=listProfilesForProvider(params.store,providerKey).filter(id=>params.store.profiles[id]?.type===`oauth`);if(oauthProfiles.length===0)return null;let configuredEmail=legacyCfg?.email?.trim();if(configuredEmail){let byEmail=oauthProfiles.find(id=>{let cred=params.store.profiles[id];return!cred||cred.type!==`oauth`?!1:cred.email?.trim()===configuredEmail||id===`${providerKey}:${configuredEmail}`});if(byEmail)return byEmail}let lastGood=params.store.lastGood?.[providerKey]??params.store.lastGood?.[params.provider];if(lastGood&&oauthProfiles.includes(lastGood))return lastGood;let nonLegacy=oauthProfiles.filter(id=>id!==params.legacyProfileId);if(nonLegacy.length===1)return nonLegacy[0]??null;let emailLike=nonLegacy.filter(id=>isEmailLike(getProfileSuffix(id)));return emailLike.length===1?emailLike[0]??null:null}function repairOAuthProfileIdMismatch(params){let legacyProfileId=params.legacyProfileId??`${normalizeProviderId(params.provider)}:default`,legacyCfg=params.cfg.auth?.profiles?.[legacyProfileId];if(!legacyCfg||legacyCfg.mode!==`oauth`||normalizeProviderId(legacyCfg.provider)!==normalizeProviderId(params.provider))return{config:params.cfg,changes:[],migrated:!1};let toProfileId=suggestOAuthProfileIdForLegacyDefault({cfg:params.cfg,store:params.store,provider:params.provider,legacyProfileId});if(!toProfileId||toProfileId===legacyProfileId)return{config:params.cfg,changes:[],migrated:!1};let toCred=params.store.profiles[toProfileId],toEmail=toCred?.type===`oauth`?toCred.email?.trim():void 0,nextProfiles={...params.cfg.auth?.profiles};delete nextProfiles[legacyProfileId],nextProfiles[toProfileId]={...legacyCfg,...toEmail?{email:toEmail}:{}};let providerKey=normalizeProviderId(params.provider),nextOrder=(()=>{let order=params.cfg.auth?.order;if(!order)return;let resolvedKey=findNormalizedProviderKey(order,providerKey);if(!resolvedKey)return order;let existing=order[resolvedKey];if(!Array.isArray(existing))return order;let deduped=dedupeProfileIds(existing.map(id=>id===legacyProfileId?toProfileId:id).filter(id=>typeof id==`string`&&id.trim().length>0));return{...order,[resolvedKey]:deduped}})();return{config:{...params.cfg,auth:{...params.cfg.auth,profiles:nextProfiles,...nextOrder?{order:nextOrder}:{}}},changes:[`Auth: migrate ${legacyProfileId} → ${toProfileId} (OAuth profile id)`],migrated:!0,fromProfileId:legacyProfileId,toProfileId}}function formatAuthDoctorHint(params){let providerKey=normalizeProviderId(params.provider);if(providerKey!==`anthropic`)return``;let legacyProfileId=params.profileId??`anthropic:default`,suggested=suggestOAuthProfileIdForLegacyDefault({cfg:params.cfg,store:params.store,provider:providerKey,legacyProfileId});if(!suggested||suggested===legacyProfileId)return``;let storeOauthProfiles=listProfilesForProvider(params.store,providerKey).filter(id=>params.store.profiles[id]?.type===`oauth`).join(`, `),cfgMode=params.cfg?.auth?.profiles?.[legacyProfileId]?.mode,cfgProvider=params.cfg?.auth?.profiles?.[legacyProfileId]?.provider;return[`Doctor hint (for GitHub issue):`,`- provider: ${providerKey}`,`- config: ${legacyProfileId}${cfgProvider||cfgMode?` (provider=${cfgProvider??`?`}, mode=${cfgMode??`?`})`:``}`,`- auth store oauth profiles: ${storeOauthProfiles||`(none)`}`,`- suggested profile: ${suggested}`,`Fix: run "${formatCliCommand(`builderforce doctor --yes`)}"`].join(`
|
|
56
56
|
`)}let _randomBytes=null,_http=null;typeof process<`u`&&(process.versions?.node||process.versions?.bun)&&(import(`node:crypto`).then(m=>{_randomBytes=m.randomBytes}),import(`node:http`).then(m=>{_http=m}));function base64urlEncode(bytes){let binary=``;for(let byte of bytes)binary+=String.fromCharCode(byte);return btoa(binary).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=/g,``)}async function generatePKCE(){let verifierBytes=new Uint8Array(32);crypto.getRandomValues(verifierBytes);let verifier=base64urlEncode(verifierBytes),data=new TextEncoder().encode(verifier),hashBuffer=await crypto.subtle.digest(`SHA-256`,data);return{verifier,challenge:base64urlEncode(new Uint8Array(hashBuffer))}}const CLIENT_ID=`app_EMoamEEZ73f0CkXaXp7hrann`,TOKEN_URL=`https://auth.openai.com/oauth/token`,REDIRECT_URI=`http://localhost:1455/auth/callback`;function createState(){if(!_randomBytes)throw Error(`OpenAI Codex OAuth is only available in Node.js environments`);return _randomBytes(16).toString(`hex`)}function parseAuthorizationInput(input){let value=input.trim();if(!value)return{};try{let url=new URL(value);return{code:url.searchParams.get(`code`)??void 0,state:url.searchParams.get(`state`)??void 0}}catch{}if(value.includes(`#`)){let[code,state]=value.split(`#`,2);return{code,state}}if(value.includes(`code=`)){let params=new URLSearchParams(value);return{code:params.get(`code`)??void 0,state:params.get(`state`)??void 0}}return{code:value}}function decodeJwt(token){try{let parts=token.split(`.`);return parts.length===3?JSON.parse(atob(parts[1]??``)):null}catch{return null}}async function exchangeAuthorizationCode(code,verifier,redirectUri=REDIRECT_URI){let response=await fetch(TOKEN_URL,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({grant_type:`authorization_code`,client_id:CLIENT_ID,code,code_verifier:verifier,redirect_uri:redirectUri})});if(!response.ok)return{type:`failed`};let json=await response.json();return!json.access_token||!json.refresh_token||typeof json.expires_in!=`number`?{type:`failed`}:{type:`success`,access:json.access_token,refresh:json.refresh_token,expires:Date.now()+json.expires_in*1e3}}async function refreshAccessToken(refreshToken){try{let response=await fetch(TOKEN_URL,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({grant_type:`refresh_token`,refresh_token:refreshToken,client_id:CLIENT_ID})});if(!response.ok)return{type:`failed`};let json=await response.json();return!json.access_token||!json.refresh_token||typeof json.expires_in!=`number`?{type:`failed`}:{type:`success`,access:json.access_token,refresh:json.refresh_token,expires:Date.now()+json.expires_in*1e3}}catch{return{type:`failed`}}}async function createAuthorizationFlow(originator=`pi`){let{verifier,challenge}=await generatePKCE(),state=createState(),url=new URL(`https://auth.openai.com/oauth/authorize`);return url.searchParams.set(`response_type`,`code`),url.searchParams.set(`client_id`,CLIENT_ID),url.searchParams.set(`redirect_uri`,REDIRECT_URI),url.searchParams.set(`scope`,`openid profile email offline_access`),url.searchParams.set(`code_challenge`,challenge),url.searchParams.set(`code_challenge_method`,`S256`),url.searchParams.set(`state`,state),url.searchParams.set(`id_token_add_organizations`,`true`),url.searchParams.set(`codex_cli_simplified_flow`,`true`),url.searchParams.set(`originator`,originator),{verifier,state,url:url.toString()}}function startLocalOAuthServer(state){if(!_http)throw Error(`OpenAI Codex OAuth is only available in Node.js environments`);let lastCode=null,cancelled=!1,server=_http.createServer((req,res)=>{try{let url=new URL(req.url||``,`http://localhost`);if(url.pathname!==`/auth/callback`){res.statusCode=404,res.end(`Not found`);return}if(url.searchParams.get(`state`)!==state){res.statusCode=400,res.end(`State mismatch`);return}let code=url.searchParams.get(`code`);if(!code){res.statusCode=400,res.end(`Missing authorization code`);return}res.statusCode=200,res.setHeader(`Content-Type`,`text/html; charset=utf-8`),res.end(`<!doctype html>
|
|
57
57
|
<html lang="en"><head><meta charset="utf-8" /><title>Authentication successful</title></head>
|
|
58
58
|
<body><p>Authentication successful. Return to your terminal to continue.</p></body></html>`),lastCode=code}catch{res.statusCode=500,res.end(`Internal error`)}});return new Promise(resolve=>{server.listen(1455,`127.0.0.1`,()=>{resolve({close:()=>server.close(),cancelWait:()=>{cancelled=!0},waitForCode:async()=>{let sleep=()=>new Promise(r=>setTimeout(r,100));for(let i=0;i<600;i+=1){if(lastCode)return{code:lastCode};if(cancelled)return null;await sleep()}return null}})}).on(`error`,()=>{resolve({close:()=>{try{server.close()}catch{}},cancelWait:()=>{},waitForCode:async()=>null})})})}function getAccountId(accessToken){let accountId=decodeJwt(accessToken)?.[`https://api.openai.com/auth`]?.chatgpt_account_id;return typeof accountId==`string`&&accountId.length>0?accountId:null}async function loginOpenAICodex(options){let{verifier,state,url}=await createAuthorizationFlow(options.originator),server=await startLocalOAuthServer(state);options.onAuth({url,instructions:`A browser window should open. Complete login to finish.`});let code;try{if(options.onManualCodeInput){let manualCode,manualError,manualPromise=options.onManualCodeInput().then(input=>{manualCode=input,server.cancelWait()}).catch(err=>{manualError=err instanceof Error?err:Error(String(err)),server.cancelWait()}),result=await server.waitForCode();if(manualError)throw manualError;if(result?.code)code=result.code;else if(manualCode){let parsed=parseAuthorizationInput(manualCode);if(parsed.state&&parsed.state!==state)throw Error(`State mismatch`);code=parsed.code}if(!code){if(await manualPromise,manualError)throw manualError;if(manualCode){let parsed=parseAuthorizationInput(manualCode);if(parsed.state&&parsed.state!==state)throw Error(`State mismatch`);code=parsed.code}}}else{let result=await server.waitForCode();result?.code&&(code=result.code)}if(!code){let parsed=parseAuthorizationInput(await options.onPrompt({message:`Paste the authorization code (or full redirect URL):`}));if(parsed.state&&parsed.state!==state)throw Error(`State mismatch`);code=parsed.code}if(!code)throw Error(`Missing authorization code`);let tokenResult=await exchangeAuthorizationCode(code,verifier);if(tokenResult.type!==`success`)throw Error(`Token exchange failed`);let accountId=getAccountId(tokenResult.access);if(!accountId)throw Error(`Failed to extract accountId from token`);return{access:tokenResult.access,refresh:tokenResult.refresh,expires:tokenResult.expires,accountId}}finally{server.close()}}async function refreshOpenAICodexToken(refreshToken){let result=await refreshAccessToken(refreshToken);if(result.type!==`success`)throw Error(`Failed to refresh OpenAI Codex token`);let accountId=getAccountId(result.access);if(!accountId)throw Error(`Failed to extract accountId from token`);return{access:result.access,refresh:result.refresh,expires:result.expires,accountId}}const decode=s=>atob(s),ANTHROPIC_CLIENT_ID=decode(`OWQxYzI1MGEtZTYxYi00NGQ5LTg4ZWQtNTk0NGQxOTYyZjVl`);async function refreshAnthropicToken(refreshToken){let response=await fetch(`https://console.anthropic.com/v1/oauth/token`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({grant_type:`refresh_token`,client_id:ANTHROPIC_CLIENT_ID,refresh_token:refreshToken})});if(!response.ok)throw Error(`Anthropic token refresh failed: ${await response.text()}`);let data=await response.json();return{refresh:data.refresh_token,access:data.access_token,expires:Date.now()+data.expires_in*1e3-300*1e3}}const COPILOT_HEADERS={"User-Agent":`GitHubCopilotChat/0.35.0`,"Editor-Version":`vscode/1.107.0`,"Editor-Plugin-Version":`copilot-chat/0.35.0`,"Copilot-Integration-Id":`vscode-chat`};async function refreshGitHubCopilotToken(refreshToken,enterpriseDomain){let copilotTokenUrl=`https://api.${enterpriseDomain||`github.com`}/copilot_internal/v2/token`,response=await fetch(copilotTokenUrl,{headers:{Accept:`application/json`,Authorization:`Bearer ${refreshToken}`,...COPILOT_HEADERS}});if(!response.ok)throw Error(`Copilot token refresh failed: ${await response.text()}`);let raw=await response.json();if(typeof raw.token!=`string`||typeof raw.expires_at!=`number`)throw Error(`Invalid Copilot token response fields`);return{refresh:refreshToken,access:raw.token,expires:raw.expires_at*1e3-300*1e3,enterpriseUrl:enterpriseDomain}}async function refreshGoogleToken(refreshToken,projectId,clientId,clientSecret){let response=await fetch(`https://oauth2.googleapis.com/token`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:clientId,client_secret:clientSecret,refresh_token:refreshToken,grant_type:`refresh_token`})});if(!response.ok)throw Error(`Google token refresh failed: ${await response.text()}`);let data=await response.json();return{refresh:data.refresh_token||refreshToken,access:data.access_token,expires:Date.now()+data.expires_in*1e3-300*1e3,projectId}}const ANTIGRAVITY_CLIENT_ID=decode(`MTA3MTAwNjA2MDU5MS10bWhzc2luMmgyMWxjcmUyMzV2dG9sb2poNGc0MDNlcC5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbQ==`),ANTIGRAVITY_CLIENT_SECRET=decode(`R09DU1BYLUs1OEZXUjQ4NkxkTEoxbUxCOHNYQzR6NnFEQWY=`),GEMINI_CLIENT_ID=decode(`NjgxMjU1ODA5Mzk1LW9vOGZ0Mm9wcmRybnA5ZTNhcWY2YXYzaG1kaWIxMzVqLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29t`),GEMINI_CLIENT_SECRET=decode(`R09DU1BYLTR1SGdNUG0tMW83U2stZ2VWNkN1NWNsWEZzeGw=`),refreshAntigravityToken=(refreshToken,projectId)=>refreshGoogleToken(refreshToken,projectId,ANTIGRAVITY_CLIENT_ID,ANTIGRAVITY_CLIENT_SECRET),refreshGoogleCloudToken=(refreshToken,projectId)=>refreshGoogleToken(refreshToken,projectId,GEMINI_CLIENT_ID,GEMINI_CLIENT_SECRET),googleGetApiKey=c=>JSON.stringify({token:c.access,projectId:c.projectId}),providers=[{id:`anthropic`,name:`Anthropic (Claude Pro/Max)`,refreshToken:c=>refreshAnthropicToken(c.refresh),getApiKey:c=>c.access},{id:`github-copilot`,name:`GitHub Copilot`,refreshToken:c=>refreshGitHubCopilotToken(c.refresh,c.enterpriseUrl),getApiKey:c=>c.access},{id:`google-gemini-cli`,name:`Google Cloud Code Assist (Gemini CLI)`,refreshToken:c=>{let projectId=c.projectId;if(!projectId)throw Error(`Google Cloud credentials missing projectId`);return refreshGoogleCloudToken(c.refresh,projectId)},getApiKey:googleGetApiKey},{id:`google-antigravity`,name:`Antigravity (Gemini 3, Claude, GPT-OSS)`,refreshToken:c=>{let projectId=c.projectId;if(!projectId)throw Error(`Antigravity credentials missing projectId`);return refreshAntigravityToken(c.refresh,projectId)},getApiKey:googleGetApiKey},{id:`openai-codex`,name:`ChatGPT Plus/Pro (Codex Subscription)`,refreshToken:c=>refreshOpenAICodexToken(c.refresh),getApiKey:c=>c.access}],registry=new Map(providers.map(p=>[p.id,p]));function getOAuthProvider(id){return registry.get(id)}function getOAuthProviders(){return Array.from(registry.values())}async function getOAuthApiKey(providerId,credentials){let provider=getOAuthProvider(providerId);if(!provider)throw Error(`Unknown OAuth provider: ${providerId}`);let creds=credentials[providerId];if(!creds)return null;if(Date.now()>=creds.expires)try{creds=await provider.refreshToken(creds)}catch{throw Error(`Failed to refresh OAuth token for ${providerId}`)}return{newCredentials:creds,apiKey:provider.getApiKey(creds)}}async function refreshQwenPortalCredentials(credentials){if(!credentials.refresh?.trim())throw Error(`Qwen OAuth refresh token missing; re-authenticate.`);let response=await fetch(`https://chat.qwen.ai/api/v1/oauth2/token`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`,Accept:`application/json`},body:new URLSearchParams({grant_type:`refresh_token`,refresh_token:credentials.refresh,client_id:`f0304373b74a44d2b584a3fb70ca9e56`})});if(!response.ok){let text=await response.text();throw response.status===400?Error(`Qwen OAuth refresh token expired or invalid. Re-authenticate with \`${formatCliCommand(`builderforce models auth login --provider qwen-portal`)}\`.`):Error(`Qwen OAuth refresh failed: ${text||response.statusText}`)}let payload=await response.json();if(!payload.access_token||!payload.expires_in)throw Error(`Qwen OAuth refresh response missing access token.`);return{...credentials,access:payload.access_token,refresh:payload.refresh_token||credentials.refresh,expires:Date.now()+payload.expires_in*1e3}}const CHUTES_OAUTH_ISSUER=`https://api.chutes.ai`,CHUTES_AUTHORIZE_ENDPOINT=`${CHUTES_OAUTH_ISSUER}/idp/authorize`,CHUTES_TOKEN_ENDPOINT=`${CHUTES_OAUTH_ISSUER}/idp/token`,CHUTES_USERINFO_ENDPOINT=`${CHUTES_OAUTH_ISSUER}/idp/userinfo`;function generateChutesPkce(){let verifier=randomBytes(32).toString(`hex`);return{verifier,challenge:createHash(`sha256`).update(verifier).digest(`base64url`)}}function parseOAuthCallbackInput(input,expectedState){let trimmed=input.trim();if(!trimmed)return{error:`No input provided`};let url;try{url=new URL(trimmed)}catch{if(!/\s/.test(trimmed)&&!trimmed.includes(`://`)&&!trimmed.includes(`?`)&&!trimmed.includes(`=`))return{error:`Paste the full redirect URL (must include code + state).`};let qs=trimmed.startsWith(`?`)?trimmed:`?${trimmed}`;try{url=new URL(`http://localhost/${qs}`)}catch{return{error:`Paste the full redirect URL (must include code + state).`}}}let code=url.searchParams.get(`code`)?.trim(),state=url.searchParams.get(`state`)?.trim();return code?state?state===expectedState?{code,state}:{error:`OAuth state mismatch - possible CSRF attack. Please retry login.`}:{error:`Missing 'state' parameter. Paste the full redirect URL.`}:{error:`Missing 'code' parameter in URL`}}function coerceExpiresAt(expiresInSeconds,now){let value=now+Math.max(0,Math.floor(expiresInSeconds))*1e3-3e5;return Math.max(value,now+3e4)}async function fetchChutesUserInfo(params){let response=await(params.fetchFn??fetch)(CHUTES_USERINFO_ENDPOINT,{headers:{Authorization:`Bearer ${params.accessToken}`}});if(!response.ok)return null;let data=await response.json();return!data||typeof data!=`object`?null:data}async function exchangeChutesCodeForTokens(params){let fetchFn=params.fetchFn??fetch,now=params.now??Date.now(),body=new URLSearchParams({grant_type:`authorization_code`,client_id:params.app.clientId,code:params.code,redirect_uri:params.app.redirectUri,code_verifier:params.codeVerifier});params.app.clientSecret&&body.set(`client_secret`,params.app.clientSecret);let response=await fetchFn(CHUTES_TOKEN_ENDPOINT,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body});if(!response.ok){let text=await response.text();throw Error(`Chutes token exchange failed: ${text}`)}let data=await response.json(),access=data.access_token?.trim(),refresh=data.refresh_token?.trim(),expiresIn=data.expires_in??0;if(!access)throw Error(`Chutes token exchange returned no access_token`);if(!refresh)throw Error(`Chutes token exchange returned no refresh_token`);let info=await fetchChutesUserInfo({accessToken:access,fetchFn});return{access,refresh,expires:coerceExpiresAt(expiresIn,now),email:info?.username,accountId:info?.sub,clientId:params.app.clientId}}async function refreshChutesTokens(params){let fetchFn=params.fetchFn??fetch,now=params.now??Date.now(),refreshToken=params.credential.refresh?.trim();if(!refreshToken)throw Error(`Chutes OAuth credential is missing refresh token`);let clientId=params.credential.clientId?.trim()??process.env.CHUTES_CLIENT_ID?.trim();if(!clientId)throw Error(`Missing CHUTES_CLIENT_ID for Chutes OAuth refresh (set env var or re-auth).`);let clientSecret=process.env.CHUTES_CLIENT_SECRET?.trim()||void 0,body=new URLSearchParams({grant_type:`refresh_token`,client_id:clientId,refresh_token:refreshToken});clientSecret&&body.set(`client_secret`,clientSecret);let response=await fetchFn(CHUTES_TOKEN_ENDPOINT,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body});if(!response.ok){let text=await response.text();throw Error(`Chutes token refresh failed: ${text}`)}let data=await response.json(),access=data.access_token?.trim(),newRefresh=data.refresh_token?.trim(),expiresIn=data.expires_in??0;if(!access)throw Error(`Chutes token refresh returned no access_token`);return{...params.credential,access,refresh:newRefresh||refreshToken,expires:coerceExpiresAt(expiresIn,now),clientId}}const OAUTH_PROVIDER_IDS=new Set(getOAuthProviders().map(provider=>provider.id)),isOAuthProvider=provider=>OAUTH_PROVIDER_IDS.has(provider),resolveOAuthProvider=provider=>isOAuthProvider(provider)?provider:null;function isProfileConfigCompatible(params){let profileConfig=params.cfg?.auth?.profiles?.[params.profileId];return!(profileConfig&&profileConfig.provider!==params.provider||profileConfig&&profileConfig.mode!==params.mode&&!(params.allowOAuthTokenCompatibility&&profileConfig.mode===`oauth`&¶ms.mode===`token`))}function buildOAuthApiKey(provider,credentials){return provider===`google-gemini-cli`||provider===`google-antigravity`?JSON.stringify({token:credentials.access,projectId:credentials.projectId}):credentials.access}function buildApiKeyProfileResult(params){return{apiKey:params.apiKey,provider:params.provider,email:params.email}}function buildOAuthProfileResult(params){return buildApiKeyProfileResult({apiKey:buildOAuthApiKey(params.provider,params.credentials),provider:params.provider,email:params.email})}function isExpiredCredential(expires){return typeof expires==`number`&&Number.isFinite(expires)&&expires>0&&Date.now()>=expires}async function refreshOAuthTokenWithLock(params){let authPath=resolveAuthStorePath(params.agentDir);return await ensureAuthStoreFile(authPath),await withFileLock(authPath,AUTH_STORE_LOCK_OPTIONS,async()=>{let store=await ensureAuthProfileStore(params.agentDir),cred=store.profiles[params.profileId];if(!cred||cred.type!==`oauth`)return null;if(Date.now()<cred.expires)return{apiKey:buildOAuthApiKey(cred.provider,cred),newCredentials:cred};let oauthCreds={[cred.provider]:cred},result=String(cred.provider)===`chutes`?await(async()=>{let newCredentials=await refreshChutesTokens({credential:cred});return{apiKey:newCredentials.access,newCredentials}})():String(cred.provider)===`qwen-portal`?await(async()=>{let newCredentials=await refreshQwenPortalCredentials(cred);return{apiKey:newCredentials.access,newCredentials}})():await(async()=>{let oauthProvider=resolveOAuthProvider(cred.provider);return oauthProvider?await getOAuthApiKey(oauthProvider,oauthCreds):null})();return result?(store.profiles[params.profileId]={...cred,...result.newCredentials,type:`oauth`},await saveAuthProfileStore(store,params.agentDir),result):null})}async function tryResolveOAuthProfile(params){let{cfg,store,profileId}=params,cred=store.profiles[profileId];if(!cred||cred.type!==`oauth`||!isProfileConfigCompatible({cfg,profileId,provider:cred.provider,mode:cred.type}))return null;if(Date.now()<cred.expires)return buildOAuthProfileResult({provider:cred.provider,credentials:cred,email:cred.email});let refreshed=await refreshOAuthTokenWithLock({profileId,agentDir:params.agentDir});return refreshed?buildApiKeyProfileResult({apiKey:refreshed.apiKey,provider:cred.provider,email:cred.email}):null}async function resolveApiKeyForProfile(params){let{cfg,store,profileId}=params,cred=store.profiles[profileId];if(!cred||!isProfileConfigCompatible({cfg,profileId,provider:cred.provider,mode:cred.type,allowOAuthTokenCompatibility:!0}))return null;if(cred.type===`api_key`){let key=cred.key?.trim();return key?buildApiKeyProfileResult({apiKey:key,provider:cred.provider,email:cred.email}):null}if(cred.type===`token`){let token=cred.token?.trim();return!token||isExpiredCredential(cred.expires)?null:buildApiKeyProfileResult({apiKey:token,provider:cred.provider,email:cred.email})}if(Date.now()<cred.expires)return buildOAuthProfileResult({provider:cred.provider,credentials:cred,email:cred.email});try{let result=await refreshOAuthTokenWithLock({profileId,agentDir:params.agentDir});return result?buildApiKeyProfileResult({apiKey:result.apiKey,provider:cred.provider,email:cred.email}):null}catch(error){let refreshedStore=await ensureAuthProfileStore(params.agentDir),refreshed=refreshedStore.profiles[profileId];if(refreshed?.type===`oauth`&&Date.now()<refreshed.expires)return buildOAuthProfileResult({provider:refreshed.provider,credentials:refreshed,email:refreshed.email??cred.email});let fallbackProfileId=suggestOAuthProfileIdForLegacyDefault({cfg,store:refreshedStore,provider:cred.provider,legacyProfileId:profileId});if(fallbackProfileId&&fallbackProfileId!==profileId)try{let fallbackResolved=await tryResolveOAuthProfile({cfg,store:refreshedStore,profileId:fallbackProfileId,agentDir:params.agentDir});if(fallbackResolved)return fallbackResolved}catch{}if(params.agentDir)try{let mainCred=(await ensureAuthProfileStore(void 0)).profiles[profileId];if(mainCred?.type===`oauth`&&Date.now()<mainCred.expires)return refreshedStore.profiles[profileId]={...mainCred},await saveAuthProfileStore(refreshedStore,params.agentDir),log$1.info(`inherited fresh OAuth credentials from main agent`,{profileId,agentDir:params.agentDir,expires:new Date(mainCred.expires).toISOString()}),buildOAuthProfileResult({provider:mainCred.provider,credentials:mainCred,email:mainCred.email})}catch{}let message=error instanceof Error?error.message:String(error),hint=formatAuthDoctorHint({cfg,store:refreshedStore,provider:cred.provider,profileId});throw Error(`OAuth token refresh failed for ${cred.provider}: ${message}. Please try again or re-authenticate.`+(hint?`\n\n${hint}`:``),{cause:error})}}function resolveProfileUnusableUntil(stats){let values=[stats.cooldownUntil,stats.disabledUntil].filter(value=>typeof value==`number`).filter(value=>Number.isFinite(value)&&value>0);return values.length===0?null:Math.max(...values)}function isProfileInCooldown(store,profileId){let stats=store.usageStats?.[profileId];if(!stats)return!1;let unusableUntil=resolveProfileUnusableUntil(stats);return unusableUntil?Date.now()<unusableUntil:!1}function getSoonestCooldownExpiry(store,profileIds){let soonest=null;for(let id of profileIds){let stats=store.usageStats?.[id];if(!stats)continue;let until=resolveProfileUnusableUntil(stats);typeof until!=`number`||!Number.isFinite(until)||until<=0||(soonest===null||until<soonest)&&(soonest=until)}return soonest}function clearExpiredCooldowns(store,now){let usageStats=store.usageStats;if(!usageStats)return!1;let ts=now??Date.now(),mutated=!1;for(let[profileId,stats]of Object.entries(usageStats)){if(!stats)continue;let profileMutated=!1,cooldownExpired=typeof stats.cooldownUntil==`number`&&Number.isFinite(stats.cooldownUntil)&&stats.cooldownUntil>0&&ts>=stats.cooldownUntil,disabledExpired=typeof stats.disabledUntil==`number`&&Number.isFinite(stats.disabledUntil)&&stats.disabledUntil>0&&ts>=stats.disabledUntil;cooldownExpired&&(stats.cooldownUntil=void 0,profileMutated=!0),disabledExpired&&(stats.disabledUntil=void 0,stats.disabledReason=void 0,profileMutated=!0),profileMutated&&!resolveProfileUnusableUntil(stats)&&(stats.errorCount=0,stats.failureCounts=void 0),profileMutated&&(usageStats[profileId]=stats,mutated=!0)}return mutated}async function markAuthProfileUsed(params){let{store,profileId,agentDir}=params,updated=await updateAuthProfileStoreWithLock({agentDir,updater:freshStore=>freshStore.profiles[profileId]?(freshStore.usageStats=freshStore.usageStats??{},freshStore.usageStats[profileId]={...freshStore.usageStats[profileId],lastUsed:Date.now(),errorCount:0,cooldownUntil:void 0,disabledUntil:void 0,disabledReason:void 0,failureCounts:void 0},!0):!1});if(updated){store.usageStats=updated.usageStats;return}store.profiles[profileId]&&(store.usageStats=store.usageStats??{},store.usageStats[profileId]={...store.usageStats[profileId],lastUsed:Date.now(),errorCount:0,cooldownUntil:void 0,disabledUntil:void 0,disabledReason:void 0,failureCounts:void 0},await saveAuthProfileStore(store,agentDir))}function calculateAuthProfileCooldownMs(errorCount){let normalized=Math.max(1,errorCount);return Math.min(3600*1e3,60*1e3*5**Math.min(normalized-1,3))}function resolveAuthCooldownConfig(params){let defaults={billingBackoffHours:5,billingMaxHours:24,failureWindowHours:24},resolveHours=(value,fallback)=>typeof value==`number`&&Number.isFinite(value)&&value>0?value:fallback,cooldowns=params.cfg?.auth?.cooldowns,billingBackoffHours=resolveHours((()=>{let map=cooldowns?.billingBackoffHoursByProvider;if(map){for(let[key,value]of Object.entries(map))if(normalizeProviderId(key)===params.providerId)return value}})()??cooldowns?.billingBackoffHours,defaults.billingBackoffHours),billingMaxHours=resolveHours(cooldowns?.billingMaxHours,defaults.billingMaxHours),failureWindowHours=resolveHours(cooldowns?.failureWindowHours,defaults.failureWindowHours);return{billingBackoffMs:billingBackoffHours*60*60*1e3,billingMaxMs:billingMaxHours*60*60*1e3,failureWindowMs:failureWindowHours*60*60*1e3}}function calculateAuthProfileBillingDisableMsWithConfig(params){let normalized=Math.max(1,params.errorCount),baseMs=Math.max(6e4,params.baseMs),maxMs=Math.max(baseMs,params.maxMs),raw=baseMs*2**Math.min(normalized-1,10);return Math.min(maxMs,raw)}function resolveProfileUnusableUntilForDisplay(store,profileId){let stats=store.usageStats?.[profileId];return stats?resolveProfileUnusableUntil(stats):null}function computeNextProfileUsageStats(params){let windowMs=params.cfgResolved.failureWindowMs,windowExpired=typeof params.existing.lastFailureAt==`number`&¶ms.existing.lastFailureAt>0&¶ms.now-params.existing.lastFailureAt>windowMs,nextErrorCount=(windowExpired?0:params.existing.errorCount??0)+1,failureCounts=windowExpired?{}:{...params.existing.failureCounts};failureCounts[params.reason]=(failureCounts[params.reason]??0)+1;let updatedStats={...params.existing,errorCount:nextErrorCount,failureCounts,lastFailureAt:params.now};if(params.reason===`billing`){let backoffMs=calculateAuthProfileBillingDisableMsWithConfig({errorCount:failureCounts.billing??1,baseMs:params.cfgResolved.billingBackoffMs,maxMs:params.cfgResolved.billingMaxMs});updatedStats.disabledUntil=params.now+backoffMs,updatedStats.disabledReason=`billing`}else{let backoffMs=calculateAuthProfileCooldownMs(nextErrorCount);updatedStats.cooldownUntil=params.now+backoffMs}return updatedStats}async function markAuthProfileFailure(params){let{store,profileId,reason,agentDir,cfg}=params,updated=await updateAuthProfileStoreWithLock({agentDir,updater:freshStore=>{let profile=freshStore.profiles[profileId];if(!profile)return!1;freshStore.usageStats=freshStore.usageStats??{};let existing=freshStore.usageStats[profileId]??{},now=Date.now(),cfgResolved=resolveAuthCooldownConfig({cfg,providerId:normalizeProviderId(profile.provider)});return freshStore.usageStats[profileId]=computeNextProfileUsageStats({existing,now,reason,cfgResolved}),!0}});if(updated){store.usageStats=updated.usageStats;return}if(!store.profiles[profileId])return;store.usageStats=store.usageStats??{};let existing=store.usageStats[profileId]??{},now=Date.now(),cfgResolved=resolveAuthCooldownConfig({cfg,providerId:normalizeProviderId(store.profiles[profileId]?.provider??``)});store.usageStats[profileId]=computeNextProfileUsageStats({existing,now,reason,cfgResolved}),await saveAuthProfileStore(store,agentDir)}function resolveAuthProfileOrder(params){let{cfg,store,provider,preferredProfile}=params,providerKey=normalizeProviderId(provider),now=Date.now();clearExpiredCooldowns(store,now);let storedOrder=findNormalizedProviderValue(store.order,providerKey),configuredOrder=findNormalizedProviderValue(cfg?.auth?.order,providerKey),explicitOrder=storedOrder??configuredOrder,explicitProfiles=cfg?.auth?.profiles?Object.entries(cfg.auth.profiles).filter(([,profile])=>normalizeProviderId(profile.provider)===providerKey).map(([profileId])=>profileId):[],baseOrder=explicitOrder??(explicitProfiles.length>0?explicitProfiles:listProfilesForProvider(store,providerKey));if(baseOrder.length===0)return[];let deduped=dedupeProfileIds(baseOrder.filter(profileId=>{let cred=store.profiles[profileId];if(!cred||normalizeProviderId(cred.provider)!==providerKey)return!1;let profileConfig=cfg?.auth?.profiles?.[profileId];return profileConfig&&(normalizeProviderId(profileConfig.provider)!==providerKey||profileConfig.mode!==cred.type&&!(profileConfig.mode===`oauth`&&cred.type===`token`))?!1:cred.type===`api_key`?!!cred.key?.trim():cred.type===`token`?!(!cred.token?.trim()||typeof cred.expires==`number`&&Number.isFinite(cred.expires)&&cred.expires>0&&now>=cred.expires):cred.type===`oauth`?!!(cred.access?.trim()||cred.refresh?.trim()):!1}));if(explicitOrder&&explicitOrder.length>0){let available=[],inCooldown=[];for(let profileId of deduped){let cooldownUntil=resolveProfileUnusableUntil(store.usageStats?.[profileId]??{})??0;typeof cooldownUntil==`number`&&Number.isFinite(cooldownUntil)&&cooldownUntil>0&&now<cooldownUntil?inCooldown.push({profileId,cooldownUntil}):available.push(profileId)}let cooldownSorted=inCooldown.toSorted((a,b)=>a.cooldownUntil-b.cooldownUntil).map(entry=>entry.profileId),ordered=[...available,...cooldownSorted];return preferredProfile&&ordered.includes(preferredProfile)?[preferredProfile,...ordered.filter(e=>e!==preferredProfile)]:ordered}let sorted=orderProfilesByMode(deduped,store);return preferredProfile&&sorted.includes(preferredProfile)?[preferredProfile,...sorted.filter(e=>e!==preferredProfile)]:sorted}function orderProfilesByMode(order,store){let now=Date.now(),available=[],inCooldown=[];for(let profileId of order)isProfileInCooldown(store,profileId)?inCooldown.push(profileId):available.push(profileId);let sorted=available.map(profileId=>{let type=store.profiles[profileId]?.type;return{profileId,typeScore:type===`oauth`?0:type===`token`?1:type===`api_key`?2:3,lastUsed:store.usageStats?.[profileId]?.lastUsed??0}}).toSorted((a,b)=>a.typeScore===b.typeScore?a.lastUsed-b.lastUsed:a.typeScore-b.typeScore).map(entry=>entry.profileId),cooldownSorted=inCooldown.map(profileId=>({profileId,cooldownUntil:resolveProfileUnusableUntil(store.usageStats?.[profileId]??{})??now})).toSorted((a,b)=>a.cooldownUntil-b.cooldownUntil).map(entry=>entry.profileId);return[...sorted,...cooldownSorted]}export{buildXiaomiProvider as $,getShellEnvAppliedKeys as $t,buildConfiguredAllowlistKeys as A,scopeToken as At,resolveAllowedModelRef as B,createAssistantMessageEventStream as Bt,resolveAuthStorePath as C,estimateTokens as Ct,resolveProcessScopedMap as D,MODEL_ANALYTICS_PATH as Dt,withFileLock as E,profileWorkload as Et,modelKey as F,modelRef as Ft,resolveModelRefFromString as G,getCustomProviderApiKey as Gt,resolveConfiguredModelRef as H,CURRENT_SESSION_VERSION as Ht,normalizeModelRef as I,canUseToolDecision as It,resolveThinkingDefault as J,resolveAwsSdkEnvVarName as Jt,resolveSubagentConfiguredModelSelection as K,requireApiKey as Kt,normalizeModelSelection as L,stripReasoningTagsFromText as Lt,findNormalizedProviderValue as M,scopeHasSignal as Mt,getModelRefStatus as N,DEFAULT_ACTION_TYPE as Nt,isPidAlive as O,RUN_OUTCOME_PATH as Ot,isCliProvider as P,learnedRoutingEnabled as Pt,buildQianfanProvider as Q,normalizeSecretInput as Qt,normalizeProviderId as R,nativeStreamSimple as Rt,updateAuthProfileStoreWithLock as S,createAgentSession as St,resolveBuilderForceAgentsAgentDir as T,estimateTokensFromChars as Tt,resolveDefaultModelForAgent as U,SessionManager as Ut,resolveAllowlistModelKey as V,SettingsManager as Vt,resolveHooksGmailModel as W,getApiKeyForModel as Wt,QIANFAN_DEFAULT_MODEL_ID as X,resolveModelAuthMode as Xt,QIANFAN_BASE_URL as Y,resolveEnvApiKey as Yt,XIAOMI_DEFAULT_MODEL_ID as Z,normalizeOptionalSecretInput as Zt,setAuthProfileOrder as _,DEFAULT_PROVIDER as _n,SYNTHETIC_MODEL_CATALOG as _t,markAuthProfileUsed as a,getEnvApiKey as an,resolveImplicitCopilotProvider as at,ensureAuthProfileStore as b,CODEX_CLI_PROFILE_ID as bn,createOllamaStreamFn as bt,CHUTES_AUTHORIZE_ENDPOINT as c,HUGGINGFACE_MODEL_CATALOG as cn,VENICE_BASE_URL as ct,parseOAuthCallbackInput as d,isHuggingfacePolicyLocked as dn,buildVeniceModelDefinition as dt,getShellPathFromLoginShell as en,discoverOllamaModels as et,loginOpenAICodex as f,CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF as fn,TOGETHER_BASE_URL as ft,markAuthProfileGood as g,DEFAULT_MODEL as gn,SYNTHETIC_DEFAULT_MODEL_REF as gt,listProfilesForProvider as h,DEFAULT_CONTEXT_TOKENS as hn,SYNTHETIC_BASE_URL as ht,markAuthProfileFailure as i,shouldEnableShellEnvFallback as in,resolveImplicitBedrockProvider as it,buildModelAliasIndex as j,rankModelsForAction as jt,buildAllowedModelSet as k,OWN_TENANT_SCOPE_TOKEN as kt,exchangeChutesCodeForTokens as l,buildHuggingfaceModelDefinition as ln,VENICE_DEFAULT_MODEL_REF as lt,dedupeProfileIds as m,resolveCloudflareAiGatewayBaseUrl as mn,buildTogetherModelDefinition as mt,getSoonestCooldownExpiry as n,resolveShellEnvFallbackTimeoutMs as nn,normalizeProviders as nt,resolveProfileUnusableUntilForDisplay as o,getModel as on,resolveImplicitProviders as ot,repairOAuthProfileIdMismatch as p,buildCloudflareAiGatewayModelDefinition as pn,TOGETHER_MODEL_CATALOG as pt,resolveSubagentSpawnModelSelection as q,resolveApiKeyForProvider as qt,isProfileInCooldown as r,shouldDeferShellEnvFallback as rn,resolveFreetokenApiBase as rt,resolveApiKeyForProfile as s,HUGGINGFACE_BASE_URL as sn,resolveOllamaApiBase as st,resolveAuthProfileOrder as t,loadShellEnvFallback as tn,normalizeGoogleModelId as tt,generateChutesPkce as u,discoverHuggingfaceModels as un,VENICE_MODEL_CATALOG as ut,upsertAuthProfile as v,resolveAuthProfileDisplayLabel as vn,buildSyntheticModelDefinition as vt,resolveAuthStorePathForDisplay as w,CHARS_PER_TOKEN as wt,loadAuthProfileStore as x,registryToAgentTools as xt,upsertAuthProfileWithLock as y,CLAUDE_CLI_PROFILE_ID as yn,OLLAMA_NATIVE_BASE_URL as yt,parseModelRef as z,nativeComplete as zt};
|