@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 +1 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-pt7Tr4HA.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./paths-ClsbsPQP.js";import"./sqlite-CIGM1WKg.js";import{n as runMemoryStatus,t as registerMemoryCli}from"./memory-cli-CveeVOWH.js";import"./manager-BeohB4-8.js";import"./gemini-auth-DDR12zst.js";import"./retry-B151Hej5.js";import"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";export{registerMemoryCli,runMemoryStatus};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{B as theme,C as shortenHomePath,P as setVerbose,R as colorize,S as shortenHomeInString,b as resolveUserPath,z as isRich}from"./utils-DbaBVFaK.js";import{i as defaultRuntime,t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-DPtjOxzp.js";import{r as loadConfig,y as parseDurationMs}from"./io-3R_ZyUxB.js";import{n as formatErrorMessage}from"./errors-B1MIg3g-.js";import{s as resolveSessionTranscriptsDirForAgent}from"./paths-DJ6rztqJ.js";import{c as getDefaultMemoryDirs,l as getDefaultMemoryFilePaths,m as normalizeExtraMemoryPaths,p as listMemoryFiles}from"./sqlite-C39E12XS.js";import{t as splitShellArgs}from"./shell-argv-Df-Tbj65.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import{r as withManager}from"./cli-utils-LBYKdNFb.js";import{t as formatHelpExamples}from"./help-format-Qfk2vDNX.js";import{n as withProgress,r as withProgressTotals}from"./progress-BfOtdN6b.js";import fs from"node:fs";import os from"node:os";import path from"node:path";import fs$1 from"node:fs/promises";const DEFAULT_QMD_LIMITS={maxResults:6,maxSnippetChars:700,maxInjectedChars:4e3,timeoutMs:4e3},DEFAULT_QMD_SCOPE={default:`deny`,rules:[{action:`allow`,match:{chatType:`direct`}}]};function sanitizeName(input){return input.toLowerCase().replace(/[^a-z0-9-]+/g,`-`).replace(/^-+|-+$/g,``)||`collection`}function scopeCollectionBase(base,agentId){return`${base}-${sanitizeName(agentId)}`}function ensureUniqueName(base,existing){let name=sanitizeName(base);if(!existing.has(name))return existing.add(name),name;let suffix=2;for(;existing.has(`${name}-${suffix}`);)suffix+=1;let unique=`${name}-${suffix}`;return existing.add(unique),unique}function resolvePath(raw,workspaceDir){let trimmed=raw.trim();if(!trimmed)throw Error(`path required`);return trimmed.startsWith(`~`)||path.isAbsolute(trimmed)?path.normalize(resolveUserPath(trimmed)):path.normalize(path.resolve(workspaceDir,trimmed))}function resolveIntervalMs(raw){let value=raw?.trim();if(!value)return parseDurationMs(`5m`,{defaultUnit:`m`});try{return parseDurationMs(value,{defaultUnit:`m`})}catch{return parseDurationMs(`5m`,{defaultUnit:`m`})}}function resolveEmbedIntervalMs(raw){let value=raw?.trim();if(!value)return parseDurationMs(`60m`,{defaultUnit:`m`});try{return parseDurationMs(value,{defaultUnit:`m`})}catch{return parseDurationMs(`60m`,{defaultUnit:`m`})}}function resolveDebounceMs(raw){return typeof raw==`number`&&Number.isFinite(raw)&&raw>=0?Math.floor(raw):15e3}function resolveTimeoutMs(raw,fallback){return typeof raw==`number`&&Number.isFinite(raw)&&raw>0?Math.floor(raw):fallback}function resolveLimits(raw){let parsed={...DEFAULT_QMD_LIMITS};return raw?.maxResults&&raw.maxResults>0&&(parsed.maxResults=Math.floor(raw.maxResults)),raw?.maxSnippetChars&&raw.maxSnippetChars>0&&(parsed.maxSnippetChars=Math.floor(raw.maxSnippetChars)),raw?.maxInjectedChars&&raw.maxInjectedChars>0&&(parsed.maxInjectedChars=Math.floor(raw.maxInjectedChars)),raw?.timeoutMs&&raw.timeoutMs>0&&(parsed.timeoutMs=Math.floor(raw.timeoutMs)),parsed}function resolveSearchMode(raw){return raw===`search`||raw===`vsearch`||raw===`query`?raw:`search`}function resolveSessionConfig(cfg,workspaceDir){let enabled=!!cfg?.enabled,exportDirRaw=cfg?.exportDir?.trim();return{enabled,exportDir:exportDirRaw?resolvePath(exportDirRaw,workspaceDir):void 0,retentionDays:cfg?.retentionDays&&cfg.retentionDays>0?Math.floor(cfg.retentionDays):void 0}}function resolveCustomPaths(rawPaths,workspaceDir,existing,agentId){if(!rawPaths?.length)return[];let collections=[];return rawPaths.forEach((entry,index)=>{let trimmedPath=entry?.path?.trim();if(!trimmedPath)return;let resolved;try{resolved=resolvePath(trimmedPath,workspaceDir)}catch{return}let pattern=entry.pattern?.trim()||`**/*.md`,name=ensureUniqueName(scopeCollectionBase(entry.name?.trim()||`custom-${index+1}`,agentId),existing);collections.push({name,path:resolved,pattern,kind:`custom`})}),collections}function resolveDefaultCollections(include,workspaceDir,existing,agentId){if(!include)return[];let collections=[],filePaths=getDefaultMemoryFilePaths(workspaceDir),fileBases=[`memory-root`,`memory-alt`];filePaths.forEach((p,idx)=>{let base=fileBases[idx]||`memory-file-${idx+1}`;collections.push({name:ensureUniqueName(scopeCollectionBase(base,agentId),existing),path:p,pattern:path.basename(p),kind:`memory`})});let dirPaths=getDefaultMemoryDirs(workspaceDir),dirBases=[`memory-dir`,`builderforce-memory-dir`];return dirPaths.forEach((p,idx)=>{let base=dirBases[idx]||`memory-dir-${idx+1}`;collections.push({name:ensureUniqueName(scopeCollectionBase(base,agentId),existing),path:p,pattern:`**/*.md`,kind:`memory`})}),collections}function resolveMemoryBackendConfig(params){let backend=params.cfg.memory?.backend??`builtin`,citations=params.cfg.memory?.citations??`auto`;if(backend!==`qmd`)return{backend:`builtin`,citations};let workspaceDir=resolveAgentWorkspaceDir(params.cfg,params.agentId),qmdCfg=params.cfg.memory?.qmd,includeDefaultMemory=qmdCfg?.includeDefaultMemory!==!1,nameSet=new Set,collections=[...resolveDefaultCollections(includeDefaultMemory,workspaceDir,nameSet,params.agentId),...resolveCustomPaths(qmdCfg?.paths,workspaceDir,nameSet,params.agentId)],rawCommand=qmdCfg?.command?.trim()||`qmd`;return{backend:`qmd`,citations,qmd:{command:splitShellArgs(rawCommand)?.[0]||rawCommand.split(/\s+/)[0]||`qmd`,searchMode:resolveSearchMode(qmdCfg?.searchMode),collections,includeDefaultMemory,sessions:resolveSessionConfig(qmdCfg?.sessions,workspaceDir),update:{intervalMs:resolveIntervalMs(qmdCfg?.update?.interval),debounceMs:resolveDebounceMs(qmdCfg?.update?.debounceMs),onBoot:qmdCfg?.update?.onBoot!==!1,waitForBootSync:qmdCfg?.update?.waitForBootSync===!0,embedIntervalMs:resolveEmbedIntervalMs(qmdCfg?.update?.embedInterval),commandTimeoutMs:resolveTimeoutMs(qmdCfg?.update?.commandTimeoutMs,3e4),updateTimeoutMs:resolveTimeoutMs(qmdCfg?.update?.updateTimeoutMs,12e4),embedTimeoutMs:resolveTimeoutMs(qmdCfg?.update?.embedTimeoutMs,12e4)},limits:resolveLimits(qmdCfg?.limits),scope:qmdCfg?.scope??DEFAULT_QMD_SCOPE}}}const log=createSubsystemLogger(`memory`),QMD_MANAGER_CACHE=new Map;async function getMemorySearchManager(params){let resolved=resolveMemoryBackendConfig(params);if(resolved.backend===`qmd`&&resolved.qmd){let statusOnly=params.purpose===`status`,cacheKey=buildQmdCacheKey(params.agentId,resolved.qmd);if(!statusOnly){let cached=QMD_MANAGER_CACHE.get(cacheKey);if(cached)return{manager:cached}}try{let{QmdMemoryManager}=await import(`./qmd-manager-keHvLmvP.js`),primary=await QmdMemoryManager.create({cfg:params.cfg,agentId:params.agentId,resolved,mode:statusOnly?`status`:`full`});if(primary){if(statusOnly)return{manager:primary};let wrapper=new FallbackMemoryManager({primary,fallbackFactory:async()=>{let{MemoryIndexManager}=await import(`./manager-B3IJ_IKf.js`);return await MemoryIndexManager.get(params)}},()=>QMD_MANAGER_CACHE.delete(cacheKey));return QMD_MANAGER_CACHE.set(cacheKey,wrapper),{manager:wrapper}}}catch(err){let message=err instanceof Error?err.message:String(err);log.warn(`qmd memory unavailable; falling back to builtin: ${message}`)}}try{let{MemoryIndexManager}=await import(`./manager-B3IJ_IKf.js`);return{manager:await MemoryIndexManager.get(params)}}catch(err){return{manager:null,error:err instanceof Error?err.message:String(err)}}}var FallbackMemoryManager=class{constructor(deps,onClose){this.deps=deps,this.onClose=onClose,this.fallback=null,this.primaryFailed=!1,this.cacheEvicted=!1}async search(query,opts){if(!this.primaryFailed)try{return await this.deps.primary.search(query,opts)}catch(err){this.primaryFailed=!0,this.lastError=err instanceof Error?err.message:String(err),log.warn(`qmd memory failed; switching to builtin index: ${this.lastError}`),await this.deps.primary.close?.().catch(()=>{}),this.evictCacheEntry()}let fallback=await this.ensureFallback();if(fallback)return await fallback.search(query,opts);throw Error(this.lastError??`memory search unavailable`)}async readFile(params){if(!this.primaryFailed)return await this.deps.primary.readFile(params);let fallback=await this.ensureFallback();if(fallback)return await fallback.readFile(params);throw Error(this.lastError??`memory read unavailable`)}status(){if(!this.primaryFailed)return this.deps.primary.status();let fallbackStatus=this.fallback?.status(),fallbackInfo={from:`qmd`,reason:this.lastError??`unknown`};if(fallbackStatus){let custom=fallbackStatus.custom??{};return{...fallbackStatus,fallback:fallbackInfo,custom:{...custom,fallback:{disabled:!0,reason:this.lastError??`unknown`}}}}let primaryStatus=this.deps.primary.status(),custom=primaryStatus.custom??{};return{...primaryStatus,fallback:fallbackInfo,custom:{...custom,fallback:{disabled:!0,reason:this.lastError??`unknown`}}}}async sync(params){if(!this.primaryFailed){await this.deps.primary.sync?.(params);return}await(await this.ensureFallback())?.sync?.(params)}async probeEmbeddingAvailability(){if(!this.primaryFailed)return await this.deps.primary.probeEmbeddingAvailability();let fallback=await this.ensureFallback();return fallback?await fallback.probeEmbeddingAvailability():{ok:!1,error:this.lastError??`memory embeddings unavailable`}}async probeVectorAvailability(){return this.primaryFailed?await(await this.ensureFallback())?.probeVectorAvailability()??!1:await this.deps.primary.probeVectorAvailability()}async close(){await this.deps.primary.close?.(),await this.fallback?.close?.(),this.evictCacheEntry()}async ensureFallback(){if(this.fallback)return this.fallback;let fallback;try{if(fallback=await this.deps.fallbackFactory(),!fallback)return log.warn(`memory fallback requested but builtin index is unavailable`),null}catch(err){let message=err instanceof Error?err.message:String(err);return log.warn(`memory fallback unavailable: ${message}`),null}return this.fallback=fallback,this.fallback}evictCacheEntry(){this.cacheEvicted||(this.cacheEvicted=!0,this.onClose?.())}};function buildQmdCacheKey(agentId,config){return`${agentId}:${stableSerialize(config)}`}function stableSerialize(value){return JSON.stringify(sortValue(value))}function sortValue(value){if(Array.isArray(value))return value.map(entry=>sortValue(entry));if(value&&typeof value==`object`){let sortedEntries=Object.keys(value).toSorted((a,b)=>a.localeCompare(b)).map(key=>[key,sortValue(value[key])]);return Object.fromEntries(sortedEntries)}return value}function formatSourceLabel(source,workspaceDir,agentId){if(source===`memory`)return shortenHomeInString(`memory (${path.join(workspaceDir,`.builderforce`,`MEMORY.md`)} + ${path.join(workspaceDir,`.builderforce`,`memory`)}${path.sep}*.md)`);if(source===`sessions`){let stateDir=resolveStateDir(process.env,os.homedir);return shortenHomeInString(`sessions (${path.join(stateDir,`agents`,agentId,`sessions`)}${path.sep}*.jsonl)`)}return source}function resolveAgent(cfg,agent){return agent?.trim()||resolveDefaultAgentId(cfg)}function resolveAgentIds(cfg,agent){let trimmed=agent?.trim();if(trimmed)return[trimmed];let list=cfg.agents?.list??[];return list.length>0?list.map(entry=>entry.id).filter(Boolean):[resolveDefaultAgentId(cfg)]}function formatExtraPaths(workspaceDir,extraPaths){return normalizeExtraMemoryPaths(workspaceDir,extraPaths).map(entry=>shortenHomePath(entry))}async function checkReadableFile(pathname){try{return await fs$1.access(pathname,fs.constants.R_OK),{exists:!0}}catch(err){let code=err.code;return code===`ENOENT`?{exists:!1}:{exists:!0,issue:`${shortenHomePath(pathname)} not readable (${code??`error`})`}}}async function scanSessionFiles(agentId){let issues=[],sessionsDir=resolveSessionTranscriptsDirForAgent(agentId);try{return{source:`sessions`,totalFiles:(await fs$1.readdir(sessionsDir,{withFileTypes:!0})).filter(entry=>entry.isFile()&&entry.name.endsWith(`.jsonl`)).length,issues}}catch(err){let code=err.code;return code===`ENOENT`?(issues.push(`sessions directory missing (${shortenHomePath(sessionsDir)})`),{source:`sessions`,totalFiles:0,issues}):(issues.push(`sessions directory not accessible (${shortenHomePath(sessionsDir)}): ${code??`error`}`),{source:`sessions`,totalFiles:null,issues})}}async function scanMemoryFiles(workspaceDir,extraPaths=[]){let issues=[],[memoryFile,altMemoryFile]=getDefaultMemoryFilePaths(workspaceDir),[legacyMemoryDir,builderforceMemoryDir]=getDefaultMemoryDirs(workspaceDir),memoryDir=legacyMemoryDir,primary=await checkReadableFile(memoryFile),alt=await checkReadableFile(altMemoryFile);primary.issue&&issues.push(primary.issue),alt.issue&&issues.push(alt.issue);let resolvedExtraPaths=normalizeExtraMemoryPaths(workspaceDir,extraPaths);for(let extraPath of resolvedExtraPaths)try{if((await fs$1.lstat(extraPath)).isSymbolicLink())continue;let extraCheck=await checkReadableFile(extraPath);extraCheck.issue&&issues.push(extraCheck.issue)}catch(err){let code=err.code;code===`ENOENT`?issues.push(`additional memory path missing (${shortenHomePath(extraPath)})`):issues.push(`additional memory path not accessible (${shortenHomePath(extraPath)}): ${code??`error`}`)}let dirReadable=null,dirChecked=``,dirsToCheck=[memoryDir,builderforceMemoryDir];for(let dir of dirsToCheck)try{await fs$1.access(dir,fs.constants.R_OK),dirReadable=!0,dirChecked=dir;break}catch(err){let code=err.code;if(code!==`ENOENT`){issues.push(`memory directory not accessible (${shortenHomePath(dir)}): ${code??`error`}`),dirReadable=null,dirChecked=dir;break}}dirReadable===null&&dirChecked===``&&issues.push(`memory directories missing (${shortenHomePath(memoryDir)} and ${shortenHomePath(builderforceMemoryDir)})`);let listed=[],listedOk=!1;try{listed=await listMemoryFiles(workspaceDir,resolvedExtraPaths),listedOk=!0}catch(err){let code=err.code;if(dirReadable!==null){let reportDir=dirChecked||memoryDir;issues.push(`memory directory scan failed (${shortenHomePath(reportDir)}): ${code??`error`}`),dirReadable=null}}let totalFiles=0;if(dirReadable===null)totalFiles=null;else{let files=new Set(listedOk?listed:[]);listedOk||(primary.exists&&files.add(memoryFile),alt.exists&&files.add(altMemoryFile)),totalFiles=files.size}return(totalFiles??0)===0&&issues.length===0&&issues.push(`no memory files found in ${shortenHomePath(workspaceDir)}`),{source:`memory`,totalFiles,issues}}async function summarizeQmdIndexArtifact(manager){let status=manager.status?.();if(!status||status.backend!==`qmd`)return null;let dbPath=status.dbPath?.trim();if(!dbPath)return null;let stat;try{stat=await fs$1.stat(dbPath)}catch(err){let code=err.code;throw code===`ENOENT`?Error(`QMD index file not found: ${shortenHomePath(dbPath)}`,{cause:err}):Error(`QMD index file check failed: ${shortenHomePath(dbPath)} (${code??`error`})`,{cause:err})}if(!stat.isFile()||stat.size<=0)throw Error(`QMD index file is empty: ${shortenHomePath(dbPath)}`);return`QMD index: ${shortenHomePath(dbPath)} (${stat.size} bytes)`}async function scanMemorySources(params){let scans=[],extraPaths=params.extraPaths??[];for(let source of params.sources)source===`memory`&&scans.push(await scanMemoryFiles(params.workspaceDir,extraPaths)),source===`sessions`&&scans.push(await scanSessionFiles(params.agentId));let issues=scans.flatMap(scan=>scan.issues),totals=scans.map(scan=>scan.totalFiles),numericTotals=totals.filter(total=>total!==null);return{sources:scans,totalFiles:totals.some(total=>total===null)?null:numericTotals.reduce((sum,total)=>sum+total,0),issues}}async function runMemoryStatus(opts){setVerbose(!!opts.verbose);let cfg=loadConfig(),agentIds=resolveAgentIds(cfg,opts.agent),allResults=[];for(let agentId of agentIds){let managerPurpose=opts.index?`default`:`status`;await withManager({getManager:()=>getMemorySearchManager({cfg,agentId,purpose:managerPurpose}),onMissing:error=>defaultRuntime.log(error??`Memory search disabled.`),onCloseError:err=>defaultRuntime.error(`Memory manager close failed: ${formatErrorMessage(err)}`),close:async manager=>{await manager.close?.()},run:async manager=>{let deep=!!(opts.deep||opts.index),embeddingProbe,indexError,syncFn=manager.sync?manager.sync.bind(manager):void 0;deep?(await withProgress({label:`Checking memory…`,total:2},async progress=>{progress.setLabel(`Probing vector…`),await manager.probeVectorAvailability(),progress.tick(),progress.setLabel(`Probing embeddings…`),embeddingProbe=await manager.probeEmbeddingAvailability(),progress.tick()}),opts.index&&syncFn?await withProgressTotals({label:`Indexing memory…`,total:0,fallback:opts.verbose?`line`:void 0},async(update,progress)=>{try{await syncFn({reason:`cli`,force:!!opts.force,progress:syncUpdate=>{update({completed:syncUpdate.completed,total:syncUpdate.total,label:syncUpdate.label}),syncUpdate.label&&progress.setLabel(syncUpdate.label)}})}catch(err){indexError=formatErrorMessage(err),defaultRuntime.error(`Memory index failed: ${indexError}`),process.exitCode=1}}):opts.index&&!syncFn&&defaultRuntime.log(`Memory backend does not support manual reindex.`)):await manager.probeVectorAvailability();let status=manager.status(),sources=status.sources?.length?status.sources:[`memory`],workspaceDir=status.workspaceDir,scan=workspaceDir?await scanMemorySources({workspaceDir,agentId,sources,extraPaths:status.extraPaths}):void 0;allResults.push({agentId,status,embeddingProbe,indexError,scan})}})}if(opts.json){defaultRuntime.log(JSON.stringify(allResults,null,2));return}let rich=isRich(),heading=text=>colorize(rich,theme.heading,text),muted=text=>colorize(rich,theme.muted,text),info=text=>colorize(rich,theme.info,text),success=text=>colorize(rich,theme.success,text),warn=text=>colorize(rich,theme.warn,text),accent=text=>colorize(rich,theme.accent,text),label=text=>muted(`${text}:`);for(let result of allResults){let{agentId,status,embeddingProbe,indexError,scan}=result,filesIndexed=status.files??0,chunksIndexed=status.chunks??0,totalFiles=scan?.totalFiles??null,indexedLabel=totalFiles===null?`${filesIndexed}/? files · ${chunksIndexed} chunks`:`${filesIndexed}/${totalFiles} files · ${chunksIndexed} chunks`;if(opts.index){let line=indexError?`Memory index failed: ${indexError}`:`Memory index complete.`;defaultRuntime.log(line)}let requestedProvider=status.requestedProvider??status.provider,modelLabel=status.model??status.provider,storePath=status.dbPath?shortenHomePath(status.dbPath):`<unknown>`,workspacePath=status.workspaceDir?shortenHomePath(status.workspaceDir):`<unknown>`,sourceList=status.sources?.length?status.sources.join(`, `):null,extraPaths=status.workspaceDir?formatExtraPaths(status.workspaceDir,status.extraPaths??[]):[],lines=[`${heading(`Memory Search`)} ${muted(`(${agentId})`)}`,`${label(`Provider`)} ${info(status.provider)} ${muted(`(requested: ${requestedProvider})`)}`,`${label(`Model`)} ${info(modelLabel)}`,sourceList?`${label(`Sources`)} ${info(sourceList)}`:null,extraPaths.length?`${label(`Extra paths`)} ${info(extraPaths.join(`, `))}`:null,`${label(`Indexed`)} ${success(indexedLabel)}`,`${label(`Dirty`)} ${status.dirty?warn(`yes`):muted(`no`)}`,`${label(`Store`)} ${info(storePath)}`,`${label(`Workspace`)} ${info(workspacePath)}`].filter(Boolean);if(embeddingProbe){let state=embeddingProbe.ok?`ready`:`unavailable`,stateColor=embeddingProbe.ok?theme.success:theme.warn;lines.push(`${label(`Embeddings`)} ${colorize(rich,stateColor,state)}`),embeddingProbe.error&&lines.push(`${label(`Embeddings error`)} ${warn(embeddingProbe.error)}`)}if(status.sourceCounts?.length){lines.push(label(`By source`));for(let entry of status.sourceCounts){let total=scan?.sources?.find(scanEntry=>scanEntry.source===entry.source)?.totalFiles,counts=total===null?`${entry.files}/? files · ${entry.chunks} chunks`:`${entry.files}/${total} files · ${entry.chunks} chunks`;lines.push(` ${accent(entry.source)} ${muted(`·`)} ${muted(counts)}`)}}if(status.fallback&&lines.push(`${label(`Fallback`)} ${warn(status.fallback.from)}`),status.vector){let vectorState=status.vector.enabled?status.vector.available===void 0?`unknown`:status.vector.available?`ready`:`unavailable`:`disabled`,vectorColor=vectorState===`ready`?theme.success:vectorState===`unavailable`?theme.warn:theme.muted;lines.push(`${label(`Vector`)} ${colorize(rich,vectorColor,vectorState)}`),status.vector.dims&&lines.push(`${label(`Vector dims`)} ${info(String(status.vector.dims))}`),status.vector.extensionPath&&lines.push(`${label(`Vector path`)} ${info(shortenHomePath(status.vector.extensionPath))}`),status.vector.loadError&&lines.push(`${label(`Vector error`)} ${warn(status.vector.loadError)}`)}if(status.fts){let ftsState=status.fts.enabled?status.fts.available?`ready`:`unavailable`:`disabled`,ftsColor=ftsState===`ready`?theme.success:ftsState===`unavailable`?theme.warn:theme.muted;lines.push(`${label(`FTS`)} ${colorize(rich,ftsColor,ftsState)}`),status.fts.error&&lines.push(`${label(`FTS error`)} ${warn(status.fts.error)}`)}if(status.cache){let cacheState=status.cache.enabled?`enabled`:`disabled`,cacheColor=status.cache.enabled?theme.success:theme.muted,suffix=status.cache.enabled&&typeof status.cache.entries==`number`?` (${status.cache.entries} entries)`:``;lines.push(`${label(`Embedding cache`)} ${colorize(rich,cacheColor,cacheState)}${suffix}`),status.cache.enabled&&typeof status.cache.maxEntries==`number`&&lines.push(`${label(`Cache cap`)} ${info(String(status.cache.maxEntries))}`)}if(status.batch){let batchState=status.batch.enabled?`enabled`:`disabled`,batchColor=status.batch.enabled?theme.success:theme.warn,batchSuffix=` (failures ${status.batch.failures}/${status.batch.limit})`;lines.push(`${label(`Batch`)} ${colorize(rich,batchColor,batchState)}${muted(batchSuffix)}`),status.batch.lastError&&lines.push(`${label(`Batch error`)} ${warn(status.batch.lastError)}`)}if(status.fallback?.reason&&lines.push(muted(status.fallback.reason)),indexError&&lines.push(`${label(`Index error`)} ${warn(indexError)}`),scan?.issues.length){lines.push(label(`Issues`));for(let issue of scan.issues)lines.push(` ${warn(issue)}`)}defaultRuntime.log(lines.join(`
|
|
1
|
+
import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{B as theme,C as shortenHomePath,P as setVerbose,R as colorize,S as shortenHomeInString,b as resolveUserPath,z as isRich}from"./utils-DbaBVFaK.js";import{i as defaultRuntime,t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-DPtjOxzp.js";import{r as loadConfig,y as parseDurationMs}from"./io-BLBq4T2o.js";import{n as formatErrorMessage}from"./errors-B1MIg3g-.js";import{s as resolveSessionTranscriptsDirForAgent}from"./paths-DJ6rztqJ.js";import{c as getDefaultMemoryDirs,l as getDefaultMemoryFilePaths,m as normalizeExtraMemoryPaths,p as listMemoryFiles}from"./sqlite-C39E12XS.js";import{t as splitShellArgs}from"./shell-argv-Df-Tbj65.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import{r as withManager}from"./cli-utils-LBYKdNFb.js";import{t as formatHelpExamples}from"./help-format-Qfk2vDNX.js";import{n as withProgress,r as withProgressTotals}from"./progress-BfOtdN6b.js";import fs from"node:fs";import os from"node:os";import path from"node:path";import fs$1 from"node:fs/promises";const DEFAULT_QMD_LIMITS={maxResults:6,maxSnippetChars:700,maxInjectedChars:4e3,timeoutMs:4e3},DEFAULT_QMD_SCOPE={default:`deny`,rules:[{action:`allow`,match:{chatType:`direct`}}]};function sanitizeName(input){return input.toLowerCase().replace(/[^a-z0-9-]+/g,`-`).replace(/^-+|-+$/g,``)||`collection`}function scopeCollectionBase(base,agentId){return`${base}-${sanitizeName(agentId)}`}function ensureUniqueName(base,existing){let name=sanitizeName(base);if(!existing.has(name))return existing.add(name),name;let suffix=2;for(;existing.has(`${name}-${suffix}`);)suffix+=1;let unique=`${name}-${suffix}`;return existing.add(unique),unique}function resolvePath(raw,workspaceDir){let trimmed=raw.trim();if(!trimmed)throw Error(`path required`);return trimmed.startsWith(`~`)||path.isAbsolute(trimmed)?path.normalize(resolveUserPath(trimmed)):path.normalize(path.resolve(workspaceDir,trimmed))}function resolveIntervalMs(raw){let value=raw?.trim();if(!value)return parseDurationMs(`5m`,{defaultUnit:`m`});try{return parseDurationMs(value,{defaultUnit:`m`})}catch{return parseDurationMs(`5m`,{defaultUnit:`m`})}}function resolveEmbedIntervalMs(raw){let value=raw?.trim();if(!value)return parseDurationMs(`60m`,{defaultUnit:`m`});try{return parseDurationMs(value,{defaultUnit:`m`})}catch{return parseDurationMs(`60m`,{defaultUnit:`m`})}}function resolveDebounceMs(raw){return typeof raw==`number`&&Number.isFinite(raw)&&raw>=0?Math.floor(raw):15e3}function resolveTimeoutMs(raw,fallback){return typeof raw==`number`&&Number.isFinite(raw)&&raw>0?Math.floor(raw):fallback}function resolveLimits(raw){let parsed={...DEFAULT_QMD_LIMITS};return raw?.maxResults&&raw.maxResults>0&&(parsed.maxResults=Math.floor(raw.maxResults)),raw?.maxSnippetChars&&raw.maxSnippetChars>0&&(parsed.maxSnippetChars=Math.floor(raw.maxSnippetChars)),raw?.maxInjectedChars&&raw.maxInjectedChars>0&&(parsed.maxInjectedChars=Math.floor(raw.maxInjectedChars)),raw?.timeoutMs&&raw.timeoutMs>0&&(parsed.timeoutMs=Math.floor(raw.timeoutMs)),parsed}function resolveSearchMode(raw){return raw===`search`||raw===`vsearch`||raw===`query`?raw:`search`}function resolveSessionConfig(cfg,workspaceDir){let enabled=!!cfg?.enabled,exportDirRaw=cfg?.exportDir?.trim();return{enabled,exportDir:exportDirRaw?resolvePath(exportDirRaw,workspaceDir):void 0,retentionDays:cfg?.retentionDays&&cfg.retentionDays>0?Math.floor(cfg.retentionDays):void 0}}function resolveCustomPaths(rawPaths,workspaceDir,existing,agentId){if(!rawPaths?.length)return[];let collections=[];return rawPaths.forEach((entry,index)=>{let trimmedPath=entry?.path?.trim();if(!trimmedPath)return;let resolved;try{resolved=resolvePath(trimmedPath,workspaceDir)}catch{return}let pattern=entry.pattern?.trim()||`**/*.md`,name=ensureUniqueName(scopeCollectionBase(entry.name?.trim()||`custom-${index+1}`,agentId),existing);collections.push({name,path:resolved,pattern,kind:`custom`})}),collections}function resolveDefaultCollections(include,workspaceDir,existing,agentId){if(!include)return[];let collections=[],filePaths=getDefaultMemoryFilePaths(workspaceDir),fileBases=[`memory-root`,`memory-alt`];filePaths.forEach((p,idx)=>{let base=fileBases[idx]||`memory-file-${idx+1}`;collections.push({name:ensureUniqueName(scopeCollectionBase(base,agentId),existing),path:p,pattern:path.basename(p),kind:`memory`})});let dirPaths=getDefaultMemoryDirs(workspaceDir),dirBases=[`memory-dir`,`builderforce-memory-dir`];return dirPaths.forEach((p,idx)=>{let base=dirBases[idx]||`memory-dir-${idx+1}`;collections.push({name:ensureUniqueName(scopeCollectionBase(base,agentId),existing),path:p,pattern:`**/*.md`,kind:`memory`})}),collections}function resolveMemoryBackendConfig(params){let backend=params.cfg.memory?.backend??`builtin`,citations=params.cfg.memory?.citations??`auto`;if(backend!==`qmd`)return{backend:`builtin`,citations};let workspaceDir=resolveAgentWorkspaceDir(params.cfg,params.agentId),qmdCfg=params.cfg.memory?.qmd,includeDefaultMemory=qmdCfg?.includeDefaultMemory!==!1,nameSet=new Set,collections=[...resolveDefaultCollections(includeDefaultMemory,workspaceDir,nameSet,params.agentId),...resolveCustomPaths(qmdCfg?.paths,workspaceDir,nameSet,params.agentId)],rawCommand=qmdCfg?.command?.trim()||`qmd`;return{backend:`qmd`,citations,qmd:{command:splitShellArgs(rawCommand)?.[0]||rawCommand.split(/\s+/)[0]||`qmd`,searchMode:resolveSearchMode(qmdCfg?.searchMode),collections,includeDefaultMemory,sessions:resolveSessionConfig(qmdCfg?.sessions,workspaceDir),update:{intervalMs:resolveIntervalMs(qmdCfg?.update?.interval),debounceMs:resolveDebounceMs(qmdCfg?.update?.debounceMs),onBoot:qmdCfg?.update?.onBoot!==!1,waitForBootSync:qmdCfg?.update?.waitForBootSync===!0,embedIntervalMs:resolveEmbedIntervalMs(qmdCfg?.update?.embedInterval),commandTimeoutMs:resolveTimeoutMs(qmdCfg?.update?.commandTimeoutMs,3e4),updateTimeoutMs:resolveTimeoutMs(qmdCfg?.update?.updateTimeoutMs,12e4),embedTimeoutMs:resolveTimeoutMs(qmdCfg?.update?.embedTimeoutMs,12e4)},limits:resolveLimits(qmdCfg?.limits),scope:qmdCfg?.scope??DEFAULT_QMD_SCOPE}}}const log=createSubsystemLogger(`memory`),QMD_MANAGER_CACHE=new Map;async function getMemorySearchManager(params){let resolved=resolveMemoryBackendConfig(params);if(resolved.backend===`qmd`&&resolved.qmd){let statusOnly=params.purpose===`status`,cacheKey=buildQmdCacheKey(params.agentId,resolved.qmd);if(!statusOnly){let cached=QMD_MANAGER_CACHE.get(cacheKey);if(cached)return{manager:cached}}try{let{QmdMemoryManager}=await import(`./qmd-manager-COUi_Fqb.js`),primary=await QmdMemoryManager.create({cfg:params.cfg,agentId:params.agentId,resolved,mode:statusOnly?`status`:`full`});if(primary){if(statusOnly)return{manager:primary};let wrapper=new FallbackMemoryManager({primary,fallbackFactory:async()=>{let{MemoryIndexManager}=await import(`./manager-CTTXDBt3.js`);return await MemoryIndexManager.get(params)}},()=>QMD_MANAGER_CACHE.delete(cacheKey));return QMD_MANAGER_CACHE.set(cacheKey,wrapper),{manager:wrapper}}}catch(err){let message=err instanceof Error?err.message:String(err);log.warn(`qmd memory unavailable; falling back to builtin: ${message}`)}}try{let{MemoryIndexManager}=await import(`./manager-CTTXDBt3.js`);return{manager:await MemoryIndexManager.get(params)}}catch(err){return{manager:null,error:err instanceof Error?err.message:String(err)}}}var FallbackMemoryManager=class{constructor(deps,onClose){this.deps=deps,this.onClose=onClose,this.fallback=null,this.primaryFailed=!1,this.cacheEvicted=!1}async search(query,opts){if(!this.primaryFailed)try{return await this.deps.primary.search(query,opts)}catch(err){this.primaryFailed=!0,this.lastError=err instanceof Error?err.message:String(err),log.warn(`qmd memory failed; switching to builtin index: ${this.lastError}`),await this.deps.primary.close?.().catch(()=>{}),this.evictCacheEntry()}let fallback=await this.ensureFallback();if(fallback)return await fallback.search(query,opts);throw Error(this.lastError??`memory search unavailable`)}async readFile(params){if(!this.primaryFailed)return await this.deps.primary.readFile(params);let fallback=await this.ensureFallback();if(fallback)return await fallback.readFile(params);throw Error(this.lastError??`memory read unavailable`)}status(){if(!this.primaryFailed)return this.deps.primary.status();let fallbackStatus=this.fallback?.status(),fallbackInfo={from:`qmd`,reason:this.lastError??`unknown`};if(fallbackStatus){let custom=fallbackStatus.custom??{};return{...fallbackStatus,fallback:fallbackInfo,custom:{...custom,fallback:{disabled:!0,reason:this.lastError??`unknown`}}}}let primaryStatus=this.deps.primary.status(),custom=primaryStatus.custom??{};return{...primaryStatus,fallback:fallbackInfo,custom:{...custom,fallback:{disabled:!0,reason:this.lastError??`unknown`}}}}async sync(params){if(!this.primaryFailed){await this.deps.primary.sync?.(params);return}await(await this.ensureFallback())?.sync?.(params)}async probeEmbeddingAvailability(){if(!this.primaryFailed)return await this.deps.primary.probeEmbeddingAvailability();let fallback=await this.ensureFallback();return fallback?await fallback.probeEmbeddingAvailability():{ok:!1,error:this.lastError??`memory embeddings unavailable`}}async probeVectorAvailability(){return this.primaryFailed?await(await this.ensureFallback())?.probeVectorAvailability()??!1:await this.deps.primary.probeVectorAvailability()}async close(){await this.deps.primary.close?.(),await this.fallback?.close?.(),this.evictCacheEntry()}async ensureFallback(){if(this.fallback)return this.fallback;let fallback;try{if(fallback=await this.deps.fallbackFactory(),!fallback)return log.warn(`memory fallback requested but builtin index is unavailable`),null}catch(err){let message=err instanceof Error?err.message:String(err);return log.warn(`memory fallback unavailable: ${message}`),null}return this.fallback=fallback,this.fallback}evictCacheEntry(){this.cacheEvicted||(this.cacheEvicted=!0,this.onClose?.())}};function buildQmdCacheKey(agentId,config){return`${agentId}:${stableSerialize(config)}`}function stableSerialize(value){return JSON.stringify(sortValue(value))}function sortValue(value){if(Array.isArray(value))return value.map(entry=>sortValue(entry));if(value&&typeof value==`object`){let sortedEntries=Object.keys(value).toSorted((a,b)=>a.localeCompare(b)).map(key=>[key,sortValue(value[key])]);return Object.fromEntries(sortedEntries)}return value}function formatSourceLabel(source,workspaceDir,agentId){if(source===`memory`)return shortenHomeInString(`memory (${path.join(workspaceDir,`.builderforce`,`MEMORY.md`)} + ${path.join(workspaceDir,`.builderforce`,`memory`)}${path.sep}*.md)`);if(source===`sessions`){let stateDir=resolveStateDir(process.env,os.homedir);return shortenHomeInString(`sessions (${path.join(stateDir,`agents`,agentId,`sessions`)}${path.sep}*.jsonl)`)}return source}function resolveAgent(cfg,agent){return agent?.trim()||resolveDefaultAgentId(cfg)}function resolveAgentIds(cfg,agent){let trimmed=agent?.trim();if(trimmed)return[trimmed];let list=cfg.agents?.list??[];return list.length>0?list.map(entry=>entry.id).filter(Boolean):[resolveDefaultAgentId(cfg)]}function formatExtraPaths(workspaceDir,extraPaths){return normalizeExtraMemoryPaths(workspaceDir,extraPaths).map(entry=>shortenHomePath(entry))}async function checkReadableFile(pathname){try{return await fs$1.access(pathname,fs.constants.R_OK),{exists:!0}}catch(err){let code=err.code;return code===`ENOENT`?{exists:!1}:{exists:!0,issue:`${shortenHomePath(pathname)} not readable (${code??`error`})`}}}async function scanSessionFiles(agentId){let issues=[],sessionsDir=resolveSessionTranscriptsDirForAgent(agentId);try{return{source:`sessions`,totalFiles:(await fs$1.readdir(sessionsDir,{withFileTypes:!0})).filter(entry=>entry.isFile()&&entry.name.endsWith(`.jsonl`)).length,issues}}catch(err){let code=err.code;return code===`ENOENT`?(issues.push(`sessions directory missing (${shortenHomePath(sessionsDir)})`),{source:`sessions`,totalFiles:0,issues}):(issues.push(`sessions directory not accessible (${shortenHomePath(sessionsDir)}): ${code??`error`}`),{source:`sessions`,totalFiles:null,issues})}}async function scanMemoryFiles(workspaceDir,extraPaths=[]){let issues=[],[memoryFile,altMemoryFile]=getDefaultMemoryFilePaths(workspaceDir),[legacyMemoryDir,builderforceMemoryDir]=getDefaultMemoryDirs(workspaceDir),memoryDir=legacyMemoryDir,primary=await checkReadableFile(memoryFile),alt=await checkReadableFile(altMemoryFile);primary.issue&&issues.push(primary.issue),alt.issue&&issues.push(alt.issue);let resolvedExtraPaths=normalizeExtraMemoryPaths(workspaceDir,extraPaths);for(let extraPath of resolvedExtraPaths)try{if((await fs$1.lstat(extraPath)).isSymbolicLink())continue;let extraCheck=await checkReadableFile(extraPath);extraCheck.issue&&issues.push(extraCheck.issue)}catch(err){let code=err.code;code===`ENOENT`?issues.push(`additional memory path missing (${shortenHomePath(extraPath)})`):issues.push(`additional memory path not accessible (${shortenHomePath(extraPath)}): ${code??`error`}`)}let dirReadable=null,dirChecked=``,dirsToCheck=[memoryDir,builderforceMemoryDir];for(let dir of dirsToCheck)try{await fs$1.access(dir,fs.constants.R_OK),dirReadable=!0,dirChecked=dir;break}catch(err){let code=err.code;if(code!==`ENOENT`){issues.push(`memory directory not accessible (${shortenHomePath(dir)}): ${code??`error`}`),dirReadable=null,dirChecked=dir;break}}dirReadable===null&&dirChecked===``&&issues.push(`memory directories missing (${shortenHomePath(memoryDir)} and ${shortenHomePath(builderforceMemoryDir)})`);let listed=[],listedOk=!1;try{listed=await listMemoryFiles(workspaceDir,resolvedExtraPaths),listedOk=!0}catch(err){let code=err.code;if(dirReadable!==null){let reportDir=dirChecked||memoryDir;issues.push(`memory directory scan failed (${shortenHomePath(reportDir)}): ${code??`error`}`),dirReadable=null}}let totalFiles=0;if(dirReadable===null)totalFiles=null;else{let files=new Set(listedOk?listed:[]);listedOk||(primary.exists&&files.add(memoryFile),alt.exists&&files.add(altMemoryFile)),totalFiles=files.size}return(totalFiles??0)===0&&issues.length===0&&issues.push(`no memory files found in ${shortenHomePath(workspaceDir)}`),{source:`memory`,totalFiles,issues}}async function summarizeQmdIndexArtifact(manager){let status=manager.status?.();if(!status||status.backend!==`qmd`)return null;let dbPath=status.dbPath?.trim();if(!dbPath)return null;let stat;try{stat=await fs$1.stat(dbPath)}catch(err){let code=err.code;throw code===`ENOENT`?Error(`QMD index file not found: ${shortenHomePath(dbPath)}`,{cause:err}):Error(`QMD index file check failed: ${shortenHomePath(dbPath)} (${code??`error`})`,{cause:err})}if(!stat.isFile()||stat.size<=0)throw Error(`QMD index file is empty: ${shortenHomePath(dbPath)}`);return`QMD index: ${shortenHomePath(dbPath)} (${stat.size} bytes)`}async function scanMemorySources(params){let scans=[],extraPaths=params.extraPaths??[];for(let source of params.sources)source===`memory`&&scans.push(await scanMemoryFiles(params.workspaceDir,extraPaths)),source===`sessions`&&scans.push(await scanSessionFiles(params.agentId));let issues=scans.flatMap(scan=>scan.issues),totals=scans.map(scan=>scan.totalFiles),numericTotals=totals.filter(total=>total!==null);return{sources:scans,totalFiles:totals.some(total=>total===null)?null:numericTotals.reduce((sum,total)=>sum+total,0),issues}}async function runMemoryStatus(opts){setVerbose(!!opts.verbose);let cfg=loadConfig(),agentIds=resolveAgentIds(cfg,opts.agent),allResults=[];for(let agentId of agentIds){let managerPurpose=opts.index?`default`:`status`;await withManager({getManager:()=>getMemorySearchManager({cfg,agentId,purpose:managerPurpose}),onMissing:error=>defaultRuntime.log(error??`Memory search disabled.`),onCloseError:err=>defaultRuntime.error(`Memory manager close failed: ${formatErrorMessage(err)}`),close:async manager=>{await manager.close?.()},run:async manager=>{let deep=!!(opts.deep||opts.index),embeddingProbe,indexError,syncFn=manager.sync?manager.sync.bind(manager):void 0;deep?(await withProgress({label:`Checking memory…`,total:2},async progress=>{progress.setLabel(`Probing vector…`),await manager.probeVectorAvailability(),progress.tick(),progress.setLabel(`Probing embeddings…`),embeddingProbe=await manager.probeEmbeddingAvailability(),progress.tick()}),opts.index&&syncFn?await withProgressTotals({label:`Indexing memory…`,total:0,fallback:opts.verbose?`line`:void 0},async(update,progress)=>{try{await syncFn({reason:`cli`,force:!!opts.force,progress:syncUpdate=>{update({completed:syncUpdate.completed,total:syncUpdate.total,label:syncUpdate.label}),syncUpdate.label&&progress.setLabel(syncUpdate.label)}})}catch(err){indexError=formatErrorMessage(err),defaultRuntime.error(`Memory index failed: ${indexError}`),process.exitCode=1}}):opts.index&&!syncFn&&defaultRuntime.log(`Memory backend does not support manual reindex.`)):await manager.probeVectorAvailability();let status=manager.status(),sources=status.sources?.length?status.sources:[`memory`],workspaceDir=status.workspaceDir,scan=workspaceDir?await scanMemorySources({workspaceDir,agentId,sources,extraPaths:status.extraPaths}):void 0;allResults.push({agentId,status,embeddingProbe,indexError,scan})}})}if(opts.json){defaultRuntime.log(JSON.stringify(allResults,null,2));return}let rich=isRich(),heading=text=>colorize(rich,theme.heading,text),muted=text=>colorize(rich,theme.muted,text),info=text=>colorize(rich,theme.info,text),success=text=>colorize(rich,theme.success,text),warn=text=>colorize(rich,theme.warn,text),accent=text=>colorize(rich,theme.accent,text),label=text=>muted(`${text}:`);for(let result of allResults){let{agentId,status,embeddingProbe,indexError,scan}=result,filesIndexed=status.files??0,chunksIndexed=status.chunks??0,totalFiles=scan?.totalFiles??null,indexedLabel=totalFiles===null?`${filesIndexed}/? files · ${chunksIndexed} chunks`:`${filesIndexed}/${totalFiles} files · ${chunksIndexed} chunks`;if(opts.index){let line=indexError?`Memory index failed: ${indexError}`:`Memory index complete.`;defaultRuntime.log(line)}let requestedProvider=status.requestedProvider??status.provider,modelLabel=status.model??status.provider,storePath=status.dbPath?shortenHomePath(status.dbPath):`<unknown>`,workspacePath=status.workspaceDir?shortenHomePath(status.workspaceDir):`<unknown>`,sourceList=status.sources?.length?status.sources.join(`, `):null,extraPaths=status.workspaceDir?formatExtraPaths(status.workspaceDir,status.extraPaths??[]):[],lines=[`${heading(`Memory Search`)} ${muted(`(${agentId})`)}`,`${label(`Provider`)} ${info(status.provider)} ${muted(`(requested: ${requestedProvider})`)}`,`${label(`Model`)} ${info(modelLabel)}`,sourceList?`${label(`Sources`)} ${info(sourceList)}`:null,extraPaths.length?`${label(`Extra paths`)} ${info(extraPaths.join(`, `))}`:null,`${label(`Indexed`)} ${success(indexedLabel)}`,`${label(`Dirty`)} ${status.dirty?warn(`yes`):muted(`no`)}`,`${label(`Store`)} ${info(storePath)}`,`${label(`Workspace`)} ${info(workspacePath)}`].filter(Boolean);if(embeddingProbe){let state=embeddingProbe.ok?`ready`:`unavailable`,stateColor=embeddingProbe.ok?theme.success:theme.warn;lines.push(`${label(`Embeddings`)} ${colorize(rich,stateColor,state)}`),embeddingProbe.error&&lines.push(`${label(`Embeddings error`)} ${warn(embeddingProbe.error)}`)}if(status.sourceCounts?.length){lines.push(label(`By source`));for(let entry of status.sourceCounts){let total=scan?.sources?.find(scanEntry=>scanEntry.source===entry.source)?.totalFiles,counts=total===null?`${entry.files}/? files · ${entry.chunks} chunks`:`${entry.files}/${total} files · ${entry.chunks} chunks`;lines.push(` ${accent(entry.source)} ${muted(`·`)} ${muted(counts)}`)}}if(status.fallback&&lines.push(`${label(`Fallback`)} ${warn(status.fallback.from)}`),status.vector){let vectorState=status.vector.enabled?status.vector.available===void 0?`unknown`:status.vector.available?`ready`:`unavailable`:`disabled`,vectorColor=vectorState===`ready`?theme.success:vectorState===`unavailable`?theme.warn:theme.muted;lines.push(`${label(`Vector`)} ${colorize(rich,vectorColor,vectorState)}`),status.vector.dims&&lines.push(`${label(`Vector dims`)} ${info(String(status.vector.dims))}`),status.vector.extensionPath&&lines.push(`${label(`Vector path`)} ${info(shortenHomePath(status.vector.extensionPath))}`),status.vector.loadError&&lines.push(`${label(`Vector error`)} ${warn(status.vector.loadError)}`)}if(status.fts){let ftsState=status.fts.enabled?status.fts.available?`ready`:`unavailable`:`disabled`,ftsColor=ftsState===`ready`?theme.success:ftsState===`unavailable`?theme.warn:theme.muted;lines.push(`${label(`FTS`)} ${colorize(rich,ftsColor,ftsState)}`),status.fts.error&&lines.push(`${label(`FTS error`)} ${warn(status.fts.error)}`)}if(status.cache){let cacheState=status.cache.enabled?`enabled`:`disabled`,cacheColor=status.cache.enabled?theme.success:theme.muted,suffix=status.cache.enabled&&typeof status.cache.entries==`number`?` (${status.cache.entries} entries)`:``;lines.push(`${label(`Embedding cache`)} ${colorize(rich,cacheColor,cacheState)}${suffix}`),status.cache.enabled&&typeof status.cache.maxEntries==`number`&&lines.push(`${label(`Cache cap`)} ${info(String(status.cache.maxEntries))}`)}if(status.batch){let batchState=status.batch.enabled?`enabled`:`disabled`,batchColor=status.batch.enabled?theme.success:theme.warn,batchSuffix=` (failures ${status.batch.failures}/${status.batch.limit})`;lines.push(`${label(`Batch`)} ${colorize(rich,batchColor,batchState)}${muted(batchSuffix)}`),status.batch.lastError&&lines.push(`${label(`Batch error`)} ${warn(status.batch.lastError)}`)}if(status.fallback?.reason&&lines.push(muted(status.fallback.reason)),indexError&&lines.push(`${label(`Index error`)} ${warn(indexError)}`),scan?.issues.length){lines.push(label(`Issues`));for(let issue of scan.issues)lines.push(` ${warn(issue)}`)}defaultRuntime.log(lines.join(`
|
|
2
2
|
`)),defaultRuntime.log(``)}}function registerMemoryCli(program){let memory=program.command(`memory`).description(`Search, inspect, and reindex memory files`).addHelpText(`after`,()=>`\n${theme.heading(`Examples:`)}\n${formatHelpExamples([[`builderforce memory status`,`Show index and provider status.`],[`builderforce memory index --force`,`Force a full reindex.`],[`builderforce memory search --query "deployment notes"`,`Search indexed memory entries.`],[`builderforce memory status --json`,`Output machine-readable JSON.`]])}\n\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/memory`,`docs.builderforce.ai/cli/memory`)}\n`);memory.command(`status`).description(`Show memory search index status`).option(`--agent <id>`,`Agent id (default: default agent)`).option(`--json`,`Print JSON`).option(`--deep`,`Probe embedding provider availability`).option(`--index`,`Reindex if dirty (implies --deep)`).option(`--verbose`,`Verbose logging`,!1).action(async opts=>{await runMemoryStatus(opts)}),memory.command(`index`).description(`Reindex memory files`).option(`--agent <id>`,`Agent id (default: default agent)`).option(`--force`,`Force full reindex`,!1).option(`--verbose`,`Verbose logging`,!1).action(async opts=>{setVerbose(!!opts.verbose);let cfg=loadConfig(),agentIds=resolveAgentIds(cfg,opts.agent);for(let agentId of agentIds)await withManager({getManager:()=>getMemorySearchManager({cfg,agentId}),onMissing:error=>defaultRuntime.log(error??`Memory search disabled.`),onCloseError:err=>defaultRuntime.error(`Memory manager close failed: ${formatErrorMessage(err)}`),close:async manager=>{await manager.close?.()},run:async manager=>{try{let syncFn=manager.sync?manager.sync.bind(manager):void 0;if(opts.verbose){let status=manager.status(),rich=isRich(),heading=text=>colorize(rich,theme.heading,text),muted=text=>colorize(rich,theme.muted,text),info=text=>colorize(rich,theme.info,text),warn=text=>colorize(rich,theme.warn,text),label=text=>muted(`${text}:`),sourceLabels=(status.sources??[]).map(source=>formatSourceLabel(source,status.workspaceDir??``,agentId)),extraPaths=status.workspaceDir?formatExtraPaths(status.workspaceDir,status.extraPaths??[]):[],requestedProvider=status.requestedProvider??status.provider,modelLabel=status.model??status.provider,lines=[`${heading(`Memory Index`)} ${muted(`(${agentId})`)}`,`${label(`Provider`)} ${info(status.provider)} ${muted(`(requested: ${requestedProvider})`)}`,`${label(`Model`)} ${info(modelLabel)}`,sourceLabels.length?`${label(`Sources`)} ${info(sourceLabels.join(`, `))}`:null,extraPaths.length?`${label(`Extra paths`)} ${info(extraPaths.join(`, `))}`:null].filter(Boolean);status.fallback&&lines.push(`${label(`Fallback`)} ${warn(status.fallback.from)}`),defaultRuntime.log(lines.join(`
|
|
3
3
|
`)),defaultRuntime.log(``)}let startedAt=Date.now(),lastLabel=`Indexing memory…`,lastCompleted=0,lastTotal=0,formatElapsed=()=>{let elapsedMs=Math.max(0,Date.now()-startedAt),seconds=Math.floor(elapsedMs/1e3),minutes=Math.floor(seconds/60),remainingSeconds=seconds%60;return`${minutes}:${String(remainingSeconds).padStart(2,`0`)}`},formatEta=()=>{if(lastTotal<=0||lastCompleted<=0)return null;let elapsedMs=Math.max(1,Date.now()-startedAt),rate=lastCompleted/elapsedMs;if(!Number.isFinite(rate)||rate<=0)return null;let remainingMs=Math.max(0,(lastTotal-lastCompleted)/rate),seconds=Math.floor(remainingMs/1e3),minutes=Math.floor(seconds/60),remainingSeconds=seconds%60;return`${minutes}:${String(remainingSeconds).padStart(2,`0`)}`},buildLabel=()=>{let elapsed=formatElapsed(),eta=formatEta();return eta?`${lastLabel} · elapsed ${elapsed} · eta ${eta}`:`${lastLabel} · elapsed ${elapsed}`};if(!syncFn){defaultRuntime.log(`Memory backend does not support manual reindex.`);return}await withProgressTotals({label:`Indexing memory…`,total:0,fallback:opts.verbose?`line`:void 0},async(update,progress)=>{let interval=setInterval(()=>{progress.setLabel(buildLabel())},1e3);try{await syncFn({reason:`cli`,force:!!opts.force,progress:syncUpdate=>{syncUpdate.label&&(lastLabel=syncUpdate.label),lastCompleted=syncUpdate.completed,lastTotal=syncUpdate.total,update({completed:syncUpdate.completed,total:syncUpdate.total,label:buildLabel()}),progress.setLabel(buildLabel())}})}finally{clearInterval(interval)}});let qmdIndexSummary=await summarizeQmdIndexArtifact(manager);qmdIndexSummary&&defaultRuntime.log(qmdIndexSummary),defaultRuntime.log(`Memory index updated (${agentId}).`)}catch(err){let message=formatErrorMessage(err);defaultRuntime.error(`Memory index failed (${agentId}): ${message}`),process.exitCode=1}}})}),memory.command(`search`).description(`Search memory files`).argument(`<query>`,`Search query`).option(`--agent <id>`,`Agent id (default: default agent)`).option(`--max-results <n>`,`Max results`,value=>Number(value)).option(`--min-score <n>`,`Minimum score`,value=>Number(value)).option(`--json`,`Print JSON`).action(async(query,opts)=>{let cfg=loadConfig(),agentId=resolveAgent(cfg,opts.agent);await withManager({getManager:()=>getMemorySearchManager({cfg,agentId}),onMissing:error=>defaultRuntime.log(error??`Memory search disabled.`),onCloseError:err=>defaultRuntime.error(`Memory manager close failed: ${formatErrorMessage(err)}`),close:async manager=>{await manager.close?.()},run:async manager=>{let results;try{results=await manager.search(query,{maxResults:opts.maxResults,minScore:opts.minScore})}catch(err){let message=formatErrorMessage(err);defaultRuntime.error(`Memory search failed: ${message}`),process.exitCode=1;return}if(opts.json){defaultRuntime.log(JSON.stringify({results},null,2));return}if(results.length===0){defaultRuntime.log(`No matches.`);return}let rich=isRich(),lines=[];for(let result of results)lines.push(`${colorize(rich,theme.success,result.score.toFixed(3))} ${colorize(rich,theme.accent,`${shortenHomePath(result.path)}:${result.startLine}-${result.endLine}`)}`),lines.push(colorize(rich,theme.muted,result.snippet)),lines.push(``);defaultRuntime.log(lines.join(`
|
|
4
4
|
`).trim())}})})}export{resolveMemoryBackendConfig as i,runMemoryStatus as n,getMemorySearchManager as r,registerMemoryCli as t};
|
|
@@ -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"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-DJ6rztqJ.js";import"./api-key-rotation-CyCi-UqR.js";import"./sqlite-C39E12XS.js";import{t as registerMemoryCli}from"./memory-cli-CbkWGjRn.js";import"./manager-DSz61dXv.js";import"./retry-DlVhg5qu.js";import"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";export{registerMemoryCli};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import{L as colorize,N as setVerbose,R as isRich,S as shortenHomePath,x as shortenHomeInString,y as resolveUserPath,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime,t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-CufEmNj_.js";import{r as loadConfig,y as parseDurationMs}from"./io-CohJffHG.js";import{n as formatErrorMessage}from"./errors-tAt19c1E.js";import{s as resolveSessionTranscriptsDirForAgent}from"./paths-ClsbsPQP.js";import{t as splitShellArgs}from"./shell-argv-CQHzAUbz.js";import{c as getDefaultMemoryDirs,l as getDefaultMemoryFilePaths,m as normalizeExtraMemoryPaths,p as listMemoryFiles}from"./sqlite-CIGM1WKg.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import{r as withManager}from"./cli-utils-C9pW69LF.js";import{t as formatHelpExamples}from"./help-format-CfFf-w62.js";import{n as withProgress,r as withProgressTotals}from"./progress-Cqb-jAjT.js";import os from"node:os";import path from"node:path";import fs from"node:fs";import fs$1 from"node:fs/promises";const DEFAULT_QMD_LIMITS={maxResults:6,maxSnippetChars:700,maxInjectedChars:4e3,timeoutMs:4e3},DEFAULT_QMD_SCOPE={default:`deny`,rules:[{action:`allow`,match:{chatType:`direct`}}]};function sanitizeName(input){return input.toLowerCase().replace(/[^a-z0-9-]+/g,`-`).replace(/^-+|-+$/g,``)||`collection`}function scopeCollectionBase(base,agentId){return`${base}-${sanitizeName(agentId)}`}function ensureUniqueName(base,existing){let name=sanitizeName(base);if(!existing.has(name))return existing.add(name),name;let suffix=2;for(;existing.has(`${name}-${suffix}`);)suffix+=1;let unique=`${name}-${suffix}`;return existing.add(unique),unique}function resolvePath(raw,workspaceDir){let trimmed=raw.trim();if(!trimmed)throw Error(`path required`);return trimmed.startsWith(`~`)||path.isAbsolute(trimmed)?path.normalize(resolveUserPath(trimmed)):path.normalize(path.resolve(workspaceDir,trimmed))}function resolveIntervalMs(raw){let value=raw?.trim();if(!value)return parseDurationMs(`5m`,{defaultUnit:`m`});try{return parseDurationMs(value,{defaultUnit:`m`})}catch{return parseDurationMs(`5m`,{defaultUnit:`m`})}}function resolveEmbedIntervalMs(raw){let value=raw?.trim();if(!value)return parseDurationMs(`60m`,{defaultUnit:`m`});try{return parseDurationMs(value,{defaultUnit:`m`})}catch{return parseDurationMs(`60m`,{defaultUnit:`m`})}}function resolveDebounceMs(raw){return typeof raw==`number`&&Number.isFinite(raw)&&raw>=0?Math.floor(raw):15e3}function resolveTimeoutMs(raw,fallback){return typeof raw==`number`&&Number.isFinite(raw)&&raw>0?Math.floor(raw):fallback}function resolveLimits(raw){let parsed={...DEFAULT_QMD_LIMITS};return raw?.maxResults&&raw.maxResults>0&&(parsed.maxResults=Math.floor(raw.maxResults)),raw?.maxSnippetChars&&raw.maxSnippetChars>0&&(parsed.maxSnippetChars=Math.floor(raw.maxSnippetChars)),raw?.maxInjectedChars&&raw.maxInjectedChars>0&&(parsed.maxInjectedChars=Math.floor(raw.maxInjectedChars)),raw?.timeoutMs&&raw.timeoutMs>0&&(parsed.timeoutMs=Math.floor(raw.timeoutMs)),parsed}function resolveSearchMode(raw){return raw===`search`||raw===`vsearch`||raw===`query`?raw:`search`}function resolveSessionConfig(cfg,workspaceDir){let enabled=!!cfg?.enabled,exportDirRaw=cfg?.exportDir?.trim();return{enabled,exportDir:exportDirRaw?resolvePath(exportDirRaw,workspaceDir):void 0,retentionDays:cfg?.retentionDays&&cfg.retentionDays>0?Math.floor(cfg.retentionDays):void 0}}function resolveCustomPaths(rawPaths,workspaceDir,existing,agentId){if(!rawPaths?.length)return[];let collections=[];return rawPaths.forEach((entry,index)=>{let trimmedPath=entry?.path?.trim();if(!trimmedPath)return;let resolved;try{resolved=resolvePath(trimmedPath,workspaceDir)}catch{return}let pattern=entry.pattern?.trim()||`**/*.md`,name=ensureUniqueName(scopeCollectionBase(entry.name?.trim()||`custom-${index+1}`,agentId),existing);collections.push({name,path:resolved,pattern,kind:`custom`})}),collections}function resolveDefaultCollections(include,workspaceDir,existing,agentId){if(!include)return[];let collections=[],filePaths=getDefaultMemoryFilePaths(workspaceDir),fileBases=[`memory-root`,`memory-alt`];filePaths.forEach((p,idx)=>{let base=fileBases[idx]||`memory-file-${idx+1}`;collections.push({name:ensureUniqueName(scopeCollectionBase(base,agentId),existing),path:p,pattern:path.basename(p),kind:`memory`})});let dirPaths=getDefaultMemoryDirs(workspaceDir),dirBases=[`memory-dir`,`builderforce-memory-dir`];return dirPaths.forEach((p,idx)=>{let base=dirBases[idx]||`memory-dir-${idx+1}`;collections.push({name:ensureUniqueName(scopeCollectionBase(base,agentId),existing),path:p,pattern:`**/*.md`,kind:`memory`})}),collections}function resolveMemoryBackendConfig(params){let backend=params.cfg.memory?.backend??`builtin`,citations=params.cfg.memory?.citations??`auto`;if(backend!==`qmd`)return{backend:`builtin`,citations};let workspaceDir=resolveAgentWorkspaceDir(params.cfg,params.agentId),qmdCfg=params.cfg.memory?.qmd,includeDefaultMemory=qmdCfg?.includeDefaultMemory!==!1,nameSet=new Set,collections=[...resolveDefaultCollections(includeDefaultMemory,workspaceDir,nameSet,params.agentId),...resolveCustomPaths(qmdCfg?.paths,workspaceDir,nameSet,params.agentId)],rawCommand=qmdCfg?.command?.trim()||`qmd`;return{backend:`qmd`,citations,qmd:{command:splitShellArgs(rawCommand)?.[0]||rawCommand.split(/\s+/)[0]||`qmd`,searchMode:resolveSearchMode(qmdCfg?.searchMode),collections,includeDefaultMemory,sessions:resolveSessionConfig(qmdCfg?.sessions,workspaceDir),update:{intervalMs:resolveIntervalMs(qmdCfg?.update?.interval),debounceMs:resolveDebounceMs(qmdCfg?.update?.debounceMs),onBoot:qmdCfg?.update?.onBoot!==!1,waitForBootSync:qmdCfg?.update?.waitForBootSync===!0,embedIntervalMs:resolveEmbedIntervalMs(qmdCfg?.update?.embedInterval),commandTimeoutMs:resolveTimeoutMs(qmdCfg?.update?.commandTimeoutMs,3e4),updateTimeoutMs:resolveTimeoutMs(qmdCfg?.update?.updateTimeoutMs,12e4),embedTimeoutMs:resolveTimeoutMs(qmdCfg?.update?.embedTimeoutMs,12e4)},limits:resolveLimits(qmdCfg?.limits),scope:qmdCfg?.scope??DEFAULT_QMD_SCOPE}}}const log=createSubsystemLogger(`memory`),QMD_MANAGER_CACHE=new Map;async function getMemorySearchManager(params){let resolved=resolveMemoryBackendConfig(params);if(resolved.backend===`qmd`&&resolved.qmd){let statusOnly=params.purpose===`status`,cacheKey=buildQmdCacheKey(params.agentId,resolved.qmd);if(!statusOnly){let cached=QMD_MANAGER_CACHE.get(cacheKey);if(cached)return{manager:cached}}try{let{QmdMemoryManager}=await import(`./qmd-manager-DVd_aWEV.js`),primary=await QmdMemoryManager.create({cfg:params.cfg,agentId:params.agentId,resolved,mode:statusOnly?`status`:`full`});if(primary){if(statusOnly)return{manager:primary};let wrapper=new FallbackMemoryManager({primary,fallbackFactory:async()=>{let{MemoryIndexManager}=await import(`./manager-TGVy_fAb.js`);return await MemoryIndexManager.get(params)}},()=>QMD_MANAGER_CACHE.delete(cacheKey));return QMD_MANAGER_CACHE.set(cacheKey,wrapper),{manager:wrapper}}}catch(err){let message=err instanceof Error?err.message:String(err);log.warn(`qmd memory unavailable; falling back to builtin: ${message}`)}}try{let{MemoryIndexManager}=await import(`./manager-TGVy_fAb.js`);return{manager:await MemoryIndexManager.get(params)}}catch(err){return{manager:null,error:err instanceof Error?err.message:String(err)}}}var FallbackMemoryManager=class{constructor(deps,onClose){this.deps=deps,this.onClose=onClose,this.fallback=null,this.primaryFailed=!1,this.cacheEvicted=!1}async search(query,opts){if(!this.primaryFailed)try{return await this.deps.primary.search(query,opts)}catch(err){this.primaryFailed=!0,this.lastError=err instanceof Error?err.message:String(err),log.warn(`qmd memory failed; switching to builtin index: ${this.lastError}`),await this.deps.primary.close?.().catch(()=>{}),this.evictCacheEntry()}let fallback=await this.ensureFallback();if(fallback)return await fallback.search(query,opts);throw Error(this.lastError??`memory search unavailable`)}async readFile(params){if(!this.primaryFailed)return await this.deps.primary.readFile(params);let fallback=await this.ensureFallback();if(fallback)return await fallback.readFile(params);throw Error(this.lastError??`memory read unavailable`)}status(){if(!this.primaryFailed)return this.deps.primary.status();let fallbackStatus=this.fallback?.status(),fallbackInfo={from:`qmd`,reason:this.lastError??`unknown`};if(fallbackStatus){let custom=fallbackStatus.custom??{};return{...fallbackStatus,fallback:fallbackInfo,custom:{...custom,fallback:{disabled:!0,reason:this.lastError??`unknown`}}}}let primaryStatus=this.deps.primary.status(),custom=primaryStatus.custom??{};return{...primaryStatus,fallback:fallbackInfo,custom:{...custom,fallback:{disabled:!0,reason:this.lastError??`unknown`}}}}async sync(params){if(!this.primaryFailed){await this.deps.primary.sync?.(params);return}await(await this.ensureFallback())?.sync?.(params)}async probeEmbeddingAvailability(){if(!this.primaryFailed)return await this.deps.primary.probeEmbeddingAvailability();let fallback=await this.ensureFallback();return fallback?await fallback.probeEmbeddingAvailability():{ok:!1,error:this.lastError??`memory embeddings unavailable`}}async probeVectorAvailability(){return this.primaryFailed?await(await this.ensureFallback())?.probeVectorAvailability()??!1:await this.deps.primary.probeVectorAvailability()}async close(){await this.deps.primary.close?.(),await this.fallback?.close?.(),this.evictCacheEntry()}async ensureFallback(){if(this.fallback)return this.fallback;let fallback;try{if(fallback=await this.deps.fallbackFactory(),!fallback)return log.warn(`memory fallback requested but builtin index is unavailable`),null}catch(err){let message=err instanceof Error?err.message:String(err);return log.warn(`memory fallback unavailable: ${message}`),null}return this.fallback=fallback,this.fallback}evictCacheEntry(){this.cacheEvicted||(this.cacheEvicted=!0,this.onClose?.())}};function buildQmdCacheKey(agentId,config){return`${agentId}:${stableSerialize(config)}`}function stableSerialize(value){return JSON.stringify(sortValue(value))}function sortValue(value){if(Array.isArray(value))return value.map(entry=>sortValue(entry));if(value&&typeof value==`object`){let sortedEntries=Object.keys(value).toSorted((a,b)=>a.localeCompare(b)).map(key=>[key,sortValue(value[key])]);return Object.fromEntries(sortedEntries)}return value}function formatSourceLabel(source,workspaceDir,agentId){if(source===`memory`)return shortenHomeInString(`memory (${path.join(workspaceDir,`.builderforce`,`MEMORY.md`)} + ${path.join(workspaceDir,`.builderforce`,`memory`)}${path.sep}*.md)`);if(source===`sessions`){let stateDir=resolveStateDir(process.env,os.homedir);return shortenHomeInString(`sessions (${path.join(stateDir,`agents`,agentId,`sessions`)}${path.sep}*.jsonl)`)}return source}function resolveAgent(cfg,agent){return agent?.trim()||resolveDefaultAgentId(cfg)}function resolveAgentIds(cfg,agent){let trimmed=agent?.trim();if(trimmed)return[trimmed];let list=cfg.agents?.list??[];return list.length>0?list.map(entry=>entry.id).filter(Boolean):[resolveDefaultAgentId(cfg)]}function formatExtraPaths(workspaceDir,extraPaths){return normalizeExtraMemoryPaths(workspaceDir,extraPaths).map(entry=>shortenHomePath(entry))}async function checkReadableFile(pathname){try{return await fs$1.access(pathname,fs.constants.R_OK),{exists:!0}}catch(err){let code=err.code;return code===`ENOENT`?{exists:!1}:{exists:!0,issue:`${shortenHomePath(pathname)} not readable (${code??`error`})`}}}async function scanSessionFiles(agentId){let issues=[],sessionsDir=resolveSessionTranscriptsDirForAgent(agentId);try{return{source:`sessions`,totalFiles:(await fs$1.readdir(sessionsDir,{withFileTypes:!0})).filter(entry=>entry.isFile()&&entry.name.endsWith(`.jsonl`)).length,issues}}catch(err){let code=err.code;return code===`ENOENT`?(issues.push(`sessions directory missing (${shortenHomePath(sessionsDir)})`),{source:`sessions`,totalFiles:0,issues}):(issues.push(`sessions directory not accessible (${shortenHomePath(sessionsDir)}): ${code??`error`}`),{source:`sessions`,totalFiles:null,issues})}}async function scanMemoryFiles(workspaceDir,extraPaths=[]){let issues=[],[memoryFile,altMemoryFile]=getDefaultMemoryFilePaths(workspaceDir),[legacyMemoryDir,builderforceMemoryDir]=getDefaultMemoryDirs(workspaceDir),memoryDir=legacyMemoryDir,primary=await checkReadableFile(memoryFile),alt=await checkReadableFile(altMemoryFile);primary.issue&&issues.push(primary.issue),alt.issue&&issues.push(alt.issue);let resolvedExtraPaths=normalizeExtraMemoryPaths(workspaceDir,extraPaths);for(let extraPath of resolvedExtraPaths)try{if((await fs$1.lstat(extraPath)).isSymbolicLink())continue;let extraCheck=await checkReadableFile(extraPath);extraCheck.issue&&issues.push(extraCheck.issue)}catch(err){let code=err.code;code===`ENOENT`?issues.push(`additional memory path missing (${shortenHomePath(extraPath)})`):issues.push(`additional memory path not accessible (${shortenHomePath(extraPath)}): ${code??`error`}`)}let dirReadable=null,dirChecked=``,dirsToCheck=[memoryDir,builderforceMemoryDir];for(let dir of dirsToCheck)try{await fs$1.access(dir,fs.constants.R_OK),dirReadable=!0,dirChecked=dir;break}catch(err){let code=err.code;if(code!==`ENOENT`){issues.push(`memory directory not accessible (${shortenHomePath(dir)}): ${code??`error`}`),dirReadable=null,dirChecked=dir;break}}dirReadable===null&&dirChecked===``&&issues.push(`memory directories missing (${shortenHomePath(memoryDir)} and ${shortenHomePath(builderforceMemoryDir)})`);let listed=[],listedOk=!1;try{listed=await listMemoryFiles(workspaceDir,resolvedExtraPaths),listedOk=!0}catch(err){let code=err.code;if(dirReadable!==null){let reportDir=dirChecked||memoryDir;issues.push(`memory directory scan failed (${shortenHomePath(reportDir)}): ${code??`error`}`),dirReadable=null}}let totalFiles=0;if(dirReadable===null)totalFiles=null;else{let files=new Set(listedOk?listed:[]);listedOk||(primary.exists&&files.add(memoryFile),alt.exists&&files.add(altMemoryFile)),totalFiles=files.size}return(totalFiles??0)===0&&issues.length===0&&issues.push(`no memory files found in ${shortenHomePath(workspaceDir)}`),{source:`memory`,totalFiles,issues}}async function summarizeQmdIndexArtifact(manager){let status=manager.status?.();if(!status||status.backend!==`qmd`)return null;let dbPath=status.dbPath?.trim();if(!dbPath)return null;let stat;try{stat=await fs$1.stat(dbPath)}catch(err){let code=err.code;throw code===`ENOENT`?Error(`QMD index file not found: ${shortenHomePath(dbPath)}`,{cause:err}):Error(`QMD index file check failed: ${shortenHomePath(dbPath)} (${code??`error`})`,{cause:err})}if(!stat.isFile()||stat.size<=0)throw Error(`QMD index file is empty: ${shortenHomePath(dbPath)}`);return`QMD index: ${shortenHomePath(dbPath)} (${stat.size} bytes)`}async function scanMemorySources(params){let scans=[],extraPaths=params.extraPaths??[];for(let source of params.sources)source===`memory`&&scans.push(await scanMemoryFiles(params.workspaceDir,extraPaths)),source===`sessions`&&scans.push(await scanSessionFiles(params.agentId));let issues=scans.flatMap(scan=>scan.issues),totals=scans.map(scan=>scan.totalFiles),numericTotals=totals.filter(total=>total!==null);return{sources:scans,totalFiles:totals.some(total=>total===null)?null:numericTotals.reduce((sum,total)=>sum+total,0),issues}}async function runMemoryStatus(opts){setVerbose(!!opts.verbose);let cfg=loadConfig(),agentIds=resolveAgentIds(cfg,opts.agent),allResults=[];for(let agentId of agentIds){let managerPurpose=opts.index?`default`:`status`;await withManager({getManager:()=>getMemorySearchManager({cfg,agentId,purpose:managerPurpose}),onMissing:error=>defaultRuntime.log(error??`Memory search disabled.`),onCloseError:err=>defaultRuntime.error(`Memory manager close failed: ${formatErrorMessage(err)}`),close:async manager=>{await manager.close?.()},run:async manager=>{let deep=!!(opts.deep||opts.index),embeddingProbe,indexError,syncFn=manager.sync?manager.sync.bind(manager):void 0;deep?(await withProgress({label:`Checking memory…`,total:2},async progress=>{progress.setLabel(`Probing vector…`),await manager.probeVectorAvailability(),progress.tick(),progress.setLabel(`Probing embeddings…`),embeddingProbe=await manager.probeEmbeddingAvailability(),progress.tick()}),opts.index&&syncFn?await withProgressTotals({label:`Indexing memory…`,total:0,fallback:opts.verbose?`line`:void 0},async(update,progress)=>{try{await syncFn({reason:`cli`,force:!!opts.force,progress:syncUpdate=>{update({completed:syncUpdate.completed,total:syncUpdate.total,label:syncUpdate.label}),syncUpdate.label&&progress.setLabel(syncUpdate.label)}})}catch(err){indexError=formatErrorMessage(err),defaultRuntime.error(`Memory index failed: ${indexError}`),process.exitCode=1}}):opts.index&&!syncFn&&defaultRuntime.log(`Memory backend does not support manual reindex.`)):await manager.probeVectorAvailability();let status=manager.status(),sources=status.sources?.length?status.sources:[`memory`],workspaceDir=status.workspaceDir,scan=workspaceDir?await scanMemorySources({workspaceDir,agentId,sources,extraPaths:status.extraPaths}):void 0;allResults.push({agentId,status,embeddingProbe,indexError,scan})}})}if(opts.json){defaultRuntime.log(JSON.stringify(allResults,null,2));return}let rich=isRich(),heading=text=>colorize(rich,theme.heading,text),muted=text=>colorize(rich,theme.muted,text),info=text=>colorize(rich,theme.info,text),success=text=>colorize(rich,theme.success,text),warn=text=>colorize(rich,theme.warn,text),accent=text=>colorize(rich,theme.accent,text),label=text=>muted(`${text}:`);for(let result of allResults){let{agentId,status,embeddingProbe,indexError,scan}=result,filesIndexed=status.files??0,chunksIndexed=status.chunks??0,totalFiles=scan?.totalFiles??null,indexedLabel=totalFiles===null?`${filesIndexed}/? files · ${chunksIndexed} chunks`:`${filesIndexed}/${totalFiles} files · ${chunksIndexed} chunks`;if(opts.index){let line=indexError?`Memory index failed: ${indexError}`:`Memory index complete.`;defaultRuntime.log(line)}let requestedProvider=status.requestedProvider??status.provider,modelLabel=status.model??status.provider,storePath=status.dbPath?shortenHomePath(status.dbPath):`<unknown>`,workspacePath=status.workspaceDir?shortenHomePath(status.workspaceDir):`<unknown>`,sourceList=status.sources?.length?status.sources.join(`, `):null,extraPaths=status.workspaceDir?formatExtraPaths(status.workspaceDir,status.extraPaths??[]):[],lines=[`${heading(`Memory Search`)} ${muted(`(${agentId})`)}`,`${label(`Provider`)} ${info(status.provider)} ${muted(`(requested: ${requestedProvider})`)}`,`${label(`Model`)} ${info(modelLabel)}`,sourceList?`${label(`Sources`)} ${info(sourceList)}`:null,extraPaths.length?`${label(`Extra paths`)} ${info(extraPaths.join(`, `))}`:null,`${label(`Indexed`)} ${success(indexedLabel)}`,`${label(`Dirty`)} ${status.dirty?warn(`yes`):muted(`no`)}`,`${label(`Store`)} ${info(storePath)}`,`${label(`Workspace`)} ${info(workspacePath)}`].filter(Boolean);if(embeddingProbe){let state=embeddingProbe.ok?`ready`:`unavailable`,stateColor=embeddingProbe.ok?theme.success:theme.warn;lines.push(`${label(`Embeddings`)} ${colorize(rich,stateColor,state)}`),embeddingProbe.error&&lines.push(`${label(`Embeddings error`)} ${warn(embeddingProbe.error)}`)}if(status.sourceCounts?.length){lines.push(label(`By source`));for(let entry of status.sourceCounts){let total=scan?.sources?.find(scanEntry=>scanEntry.source===entry.source)?.totalFiles,counts=total===null?`${entry.files}/? files · ${entry.chunks} chunks`:`${entry.files}/${total} files · ${entry.chunks} chunks`;lines.push(` ${accent(entry.source)} ${muted(`·`)} ${muted(counts)}`)}}if(status.fallback&&lines.push(`${label(`Fallback`)} ${warn(status.fallback.from)}`),status.vector){let vectorState=status.vector.enabled?status.vector.available===void 0?`unknown`:status.vector.available?`ready`:`unavailable`:`disabled`,vectorColor=vectorState===`ready`?theme.success:vectorState===`unavailable`?theme.warn:theme.muted;lines.push(`${label(`Vector`)} ${colorize(rich,vectorColor,vectorState)}`),status.vector.dims&&lines.push(`${label(`Vector dims`)} ${info(String(status.vector.dims))}`),status.vector.extensionPath&&lines.push(`${label(`Vector path`)} ${info(shortenHomePath(status.vector.extensionPath))}`),status.vector.loadError&&lines.push(`${label(`Vector error`)} ${warn(status.vector.loadError)}`)}if(status.fts){let ftsState=status.fts.enabled?status.fts.available?`ready`:`unavailable`:`disabled`,ftsColor=ftsState===`ready`?theme.success:ftsState===`unavailable`?theme.warn:theme.muted;lines.push(`${label(`FTS`)} ${colorize(rich,ftsColor,ftsState)}`),status.fts.error&&lines.push(`${label(`FTS error`)} ${warn(status.fts.error)}`)}if(status.cache){let cacheState=status.cache.enabled?`enabled`:`disabled`,cacheColor=status.cache.enabled?theme.success:theme.muted,suffix=status.cache.enabled&&typeof status.cache.entries==`number`?` (${status.cache.entries} entries)`:``;lines.push(`${label(`Embedding cache`)} ${colorize(rich,cacheColor,cacheState)}${suffix}`),status.cache.enabled&&typeof status.cache.maxEntries==`number`&&lines.push(`${label(`Cache cap`)} ${info(String(status.cache.maxEntries))}`)}if(status.batch){let batchState=status.batch.enabled?`enabled`:`disabled`,batchColor=status.batch.enabled?theme.success:theme.warn,batchSuffix=` (failures ${status.batch.failures}/${status.batch.limit})`;lines.push(`${label(`Batch`)} ${colorize(rich,batchColor,batchState)}${muted(batchSuffix)}`),status.batch.lastError&&lines.push(`${label(`Batch error`)} ${warn(status.batch.lastError)}`)}if(status.fallback?.reason&&lines.push(muted(status.fallback.reason)),indexError&&lines.push(`${label(`Index error`)} ${warn(indexError)}`),scan?.issues.length){lines.push(label(`Issues`));for(let issue of scan.issues)lines.push(` ${warn(issue)}`)}defaultRuntime.log(lines.join(`
|
|
1
|
+
import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import{L as colorize,N as setVerbose,R as isRich,S as shortenHomePath,x as shortenHomeInString,y as resolveUserPath,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime,t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-CufEmNj_.js";import{r as loadConfig,y as parseDurationMs}from"./io-D9hC2aG0.js";import{n as formatErrorMessage}from"./errors-tAt19c1E.js";import{s as resolveSessionTranscriptsDirForAgent}from"./paths-ClsbsPQP.js";import{t as splitShellArgs}from"./shell-argv-CQHzAUbz.js";import{c as getDefaultMemoryDirs,l as getDefaultMemoryFilePaths,m as normalizeExtraMemoryPaths,p as listMemoryFiles}from"./sqlite-CIGM1WKg.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import{r as withManager}from"./cli-utils-C9pW69LF.js";import{t as formatHelpExamples}from"./help-format-CfFf-w62.js";import{n as withProgress,r as withProgressTotals}from"./progress-Cqb-jAjT.js";import os from"node:os";import path from"node:path";import fs from"node:fs";import fs$1 from"node:fs/promises";const DEFAULT_QMD_LIMITS={maxResults:6,maxSnippetChars:700,maxInjectedChars:4e3,timeoutMs:4e3},DEFAULT_QMD_SCOPE={default:`deny`,rules:[{action:`allow`,match:{chatType:`direct`}}]};function sanitizeName(input){return input.toLowerCase().replace(/[^a-z0-9-]+/g,`-`).replace(/^-+|-+$/g,``)||`collection`}function scopeCollectionBase(base,agentId){return`${base}-${sanitizeName(agentId)}`}function ensureUniqueName(base,existing){let name=sanitizeName(base);if(!existing.has(name))return existing.add(name),name;let suffix=2;for(;existing.has(`${name}-${suffix}`);)suffix+=1;let unique=`${name}-${suffix}`;return existing.add(unique),unique}function resolvePath(raw,workspaceDir){let trimmed=raw.trim();if(!trimmed)throw Error(`path required`);return trimmed.startsWith(`~`)||path.isAbsolute(trimmed)?path.normalize(resolveUserPath(trimmed)):path.normalize(path.resolve(workspaceDir,trimmed))}function resolveIntervalMs(raw){let value=raw?.trim();if(!value)return parseDurationMs(`5m`,{defaultUnit:`m`});try{return parseDurationMs(value,{defaultUnit:`m`})}catch{return parseDurationMs(`5m`,{defaultUnit:`m`})}}function resolveEmbedIntervalMs(raw){let value=raw?.trim();if(!value)return parseDurationMs(`60m`,{defaultUnit:`m`});try{return parseDurationMs(value,{defaultUnit:`m`})}catch{return parseDurationMs(`60m`,{defaultUnit:`m`})}}function resolveDebounceMs(raw){return typeof raw==`number`&&Number.isFinite(raw)&&raw>=0?Math.floor(raw):15e3}function resolveTimeoutMs(raw,fallback){return typeof raw==`number`&&Number.isFinite(raw)&&raw>0?Math.floor(raw):fallback}function resolveLimits(raw){let parsed={...DEFAULT_QMD_LIMITS};return raw?.maxResults&&raw.maxResults>0&&(parsed.maxResults=Math.floor(raw.maxResults)),raw?.maxSnippetChars&&raw.maxSnippetChars>0&&(parsed.maxSnippetChars=Math.floor(raw.maxSnippetChars)),raw?.maxInjectedChars&&raw.maxInjectedChars>0&&(parsed.maxInjectedChars=Math.floor(raw.maxInjectedChars)),raw?.timeoutMs&&raw.timeoutMs>0&&(parsed.timeoutMs=Math.floor(raw.timeoutMs)),parsed}function resolveSearchMode(raw){return raw===`search`||raw===`vsearch`||raw===`query`?raw:`search`}function resolveSessionConfig(cfg,workspaceDir){let enabled=!!cfg?.enabled,exportDirRaw=cfg?.exportDir?.trim();return{enabled,exportDir:exportDirRaw?resolvePath(exportDirRaw,workspaceDir):void 0,retentionDays:cfg?.retentionDays&&cfg.retentionDays>0?Math.floor(cfg.retentionDays):void 0}}function resolveCustomPaths(rawPaths,workspaceDir,existing,agentId){if(!rawPaths?.length)return[];let collections=[];return rawPaths.forEach((entry,index)=>{let trimmedPath=entry?.path?.trim();if(!trimmedPath)return;let resolved;try{resolved=resolvePath(trimmedPath,workspaceDir)}catch{return}let pattern=entry.pattern?.trim()||`**/*.md`,name=ensureUniqueName(scopeCollectionBase(entry.name?.trim()||`custom-${index+1}`,agentId),existing);collections.push({name,path:resolved,pattern,kind:`custom`})}),collections}function resolveDefaultCollections(include,workspaceDir,existing,agentId){if(!include)return[];let collections=[],filePaths=getDefaultMemoryFilePaths(workspaceDir),fileBases=[`memory-root`,`memory-alt`];filePaths.forEach((p,idx)=>{let base=fileBases[idx]||`memory-file-${idx+1}`;collections.push({name:ensureUniqueName(scopeCollectionBase(base,agentId),existing),path:p,pattern:path.basename(p),kind:`memory`})});let dirPaths=getDefaultMemoryDirs(workspaceDir),dirBases=[`memory-dir`,`builderforce-memory-dir`];return dirPaths.forEach((p,idx)=>{let base=dirBases[idx]||`memory-dir-${idx+1}`;collections.push({name:ensureUniqueName(scopeCollectionBase(base,agentId),existing),path:p,pattern:`**/*.md`,kind:`memory`})}),collections}function resolveMemoryBackendConfig(params){let backend=params.cfg.memory?.backend??`builtin`,citations=params.cfg.memory?.citations??`auto`;if(backend!==`qmd`)return{backend:`builtin`,citations};let workspaceDir=resolveAgentWorkspaceDir(params.cfg,params.agentId),qmdCfg=params.cfg.memory?.qmd,includeDefaultMemory=qmdCfg?.includeDefaultMemory!==!1,nameSet=new Set,collections=[...resolveDefaultCollections(includeDefaultMemory,workspaceDir,nameSet,params.agentId),...resolveCustomPaths(qmdCfg?.paths,workspaceDir,nameSet,params.agentId)],rawCommand=qmdCfg?.command?.trim()||`qmd`;return{backend:`qmd`,citations,qmd:{command:splitShellArgs(rawCommand)?.[0]||rawCommand.split(/\s+/)[0]||`qmd`,searchMode:resolveSearchMode(qmdCfg?.searchMode),collections,includeDefaultMemory,sessions:resolveSessionConfig(qmdCfg?.sessions,workspaceDir),update:{intervalMs:resolveIntervalMs(qmdCfg?.update?.interval),debounceMs:resolveDebounceMs(qmdCfg?.update?.debounceMs),onBoot:qmdCfg?.update?.onBoot!==!1,waitForBootSync:qmdCfg?.update?.waitForBootSync===!0,embedIntervalMs:resolveEmbedIntervalMs(qmdCfg?.update?.embedInterval),commandTimeoutMs:resolveTimeoutMs(qmdCfg?.update?.commandTimeoutMs,3e4),updateTimeoutMs:resolveTimeoutMs(qmdCfg?.update?.updateTimeoutMs,12e4),embedTimeoutMs:resolveTimeoutMs(qmdCfg?.update?.embedTimeoutMs,12e4)},limits:resolveLimits(qmdCfg?.limits),scope:qmdCfg?.scope??DEFAULT_QMD_SCOPE}}}const log=createSubsystemLogger(`memory`),QMD_MANAGER_CACHE=new Map;async function getMemorySearchManager(params){let resolved=resolveMemoryBackendConfig(params);if(resolved.backend===`qmd`&&resolved.qmd){let statusOnly=params.purpose===`status`,cacheKey=buildQmdCacheKey(params.agentId,resolved.qmd);if(!statusOnly){let cached=QMD_MANAGER_CACHE.get(cacheKey);if(cached)return{manager:cached}}try{let{QmdMemoryManager}=await import(`./qmd-manager-BgplOjHN.js`),primary=await QmdMemoryManager.create({cfg:params.cfg,agentId:params.agentId,resolved,mode:statusOnly?`status`:`full`});if(primary){if(statusOnly)return{manager:primary};let wrapper=new FallbackMemoryManager({primary,fallbackFactory:async()=>{let{MemoryIndexManager}=await import(`./manager-CoQMlcrf.js`);return await MemoryIndexManager.get(params)}},()=>QMD_MANAGER_CACHE.delete(cacheKey));return QMD_MANAGER_CACHE.set(cacheKey,wrapper),{manager:wrapper}}}catch(err){let message=err instanceof Error?err.message:String(err);log.warn(`qmd memory unavailable; falling back to builtin: ${message}`)}}try{let{MemoryIndexManager}=await import(`./manager-CoQMlcrf.js`);return{manager:await MemoryIndexManager.get(params)}}catch(err){return{manager:null,error:err instanceof Error?err.message:String(err)}}}var FallbackMemoryManager=class{constructor(deps,onClose){this.deps=deps,this.onClose=onClose,this.fallback=null,this.primaryFailed=!1,this.cacheEvicted=!1}async search(query,opts){if(!this.primaryFailed)try{return await this.deps.primary.search(query,opts)}catch(err){this.primaryFailed=!0,this.lastError=err instanceof Error?err.message:String(err),log.warn(`qmd memory failed; switching to builtin index: ${this.lastError}`),await this.deps.primary.close?.().catch(()=>{}),this.evictCacheEntry()}let fallback=await this.ensureFallback();if(fallback)return await fallback.search(query,opts);throw Error(this.lastError??`memory search unavailable`)}async readFile(params){if(!this.primaryFailed)return await this.deps.primary.readFile(params);let fallback=await this.ensureFallback();if(fallback)return await fallback.readFile(params);throw Error(this.lastError??`memory read unavailable`)}status(){if(!this.primaryFailed)return this.deps.primary.status();let fallbackStatus=this.fallback?.status(),fallbackInfo={from:`qmd`,reason:this.lastError??`unknown`};if(fallbackStatus){let custom=fallbackStatus.custom??{};return{...fallbackStatus,fallback:fallbackInfo,custom:{...custom,fallback:{disabled:!0,reason:this.lastError??`unknown`}}}}let primaryStatus=this.deps.primary.status(),custom=primaryStatus.custom??{};return{...primaryStatus,fallback:fallbackInfo,custom:{...custom,fallback:{disabled:!0,reason:this.lastError??`unknown`}}}}async sync(params){if(!this.primaryFailed){await this.deps.primary.sync?.(params);return}await(await this.ensureFallback())?.sync?.(params)}async probeEmbeddingAvailability(){if(!this.primaryFailed)return await this.deps.primary.probeEmbeddingAvailability();let fallback=await this.ensureFallback();return fallback?await fallback.probeEmbeddingAvailability():{ok:!1,error:this.lastError??`memory embeddings unavailable`}}async probeVectorAvailability(){return this.primaryFailed?await(await this.ensureFallback())?.probeVectorAvailability()??!1:await this.deps.primary.probeVectorAvailability()}async close(){await this.deps.primary.close?.(),await this.fallback?.close?.(),this.evictCacheEntry()}async ensureFallback(){if(this.fallback)return this.fallback;let fallback;try{if(fallback=await this.deps.fallbackFactory(),!fallback)return log.warn(`memory fallback requested but builtin index is unavailable`),null}catch(err){let message=err instanceof Error?err.message:String(err);return log.warn(`memory fallback unavailable: ${message}`),null}return this.fallback=fallback,this.fallback}evictCacheEntry(){this.cacheEvicted||(this.cacheEvicted=!0,this.onClose?.())}};function buildQmdCacheKey(agentId,config){return`${agentId}:${stableSerialize(config)}`}function stableSerialize(value){return JSON.stringify(sortValue(value))}function sortValue(value){if(Array.isArray(value))return value.map(entry=>sortValue(entry));if(value&&typeof value==`object`){let sortedEntries=Object.keys(value).toSorted((a,b)=>a.localeCompare(b)).map(key=>[key,sortValue(value[key])]);return Object.fromEntries(sortedEntries)}return value}function formatSourceLabel(source,workspaceDir,agentId){if(source===`memory`)return shortenHomeInString(`memory (${path.join(workspaceDir,`.builderforce`,`MEMORY.md`)} + ${path.join(workspaceDir,`.builderforce`,`memory`)}${path.sep}*.md)`);if(source===`sessions`){let stateDir=resolveStateDir(process.env,os.homedir);return shortenHomeInString(`sessions (${path.join(stateDir,`agents`,agentId,`sessions`)}${path.sep}*.jsonl)`)}return source}function resolveAgent(cfg,agent){return agent?.trim()||resolveDefaultAgentId(cfg)}function resolveAgentIds(cfg,agent){let trimmed=agent?.trim();if(trimmed)return[trimmed];let list=cfg.agents?.list??[];return list.length>0?list.map(entry=>entry.id).filter(Boolean):[resolveDefaultAgentId(cfg)]}function formatExtraPaths(workspaceDir,extraPaths){return normalizeExtraMemoryPaths(workspaceDir,extraPaths).map(entry=>shortenHomePath(entry))}async function checkReadableFile(pathname){try{return await fs$1.access(pathname,fs.constants.R_OK),{exists:!0}}catch(err){let code=err.code;return code===`ENOENT`?{exists:!1}:{exists:!0,issue:`${shortenHomePath(pathname)} not readable (${code??`error`})`}}}async function scanSessionFiles(agentId){let issues=[],sessionsDir=resolveSessionTranscriptsDirForAgent(agentId);try{return{source:`sessions`,totalFiles:(await fs$1.readdir(sessionsDir,{withFileTypes:!0})).filter(entry=>entry.isFile()&&entry.name.endsWith(`.jsonl`)).length,issues}}catch(err){let code=err.code;return code===`ENOENT`?(issues.push(`sessions directory missing (${shortenHomePath(sessionsDir)})`),{source:`sessions`,totalFiles:0,issues}):(issues.push(`sessions directory not accessible (${shortenHomePath(sessionsDir)}): ${code??`error`}`),{source:`sessions`,totalFiles:null,issues})}}async function scanMemoryFiles(workspaceDir,extraPaths=[]){let issues=[],[memoryFile,altMemoryFile]=getDefaultMemoryFilePaths(workspaceDir),[legacyMemoryDir,builderforceMemoryDir]=getDefaultMemoryDirs(workspaceDir),memoryDir=legacyMemoryDir,primary=await checkReadableFile(memoryFile),alt=await checkReadableFile(altMemoryFile);primary.issue&&issues.push(primary.issue),alt.issue&&issues.push(alt.issue);let resolvedExtraPaths=normalizeExtraMemoryPaths(workspaceDir,extraPaths);for(let extraPath of resolvedExtraPaths)try{if((await fs$1.lstat(extraPath)).isSymbolicLink())continue;let extraCheck=await checkReadableFile(extraPath);extraCheck.issue&&issues.push(extraCheck.issue)}catch(err){let code=err.code;code===`ENOENT`?issues.push(`additional memory path missing (${shortenHomePath(extraPath)})`):issues.push(`additional memory path not accessible (${shortenHomePath(extraPath)}): ${code??`error`}`)}let dirReadable=null,dirChecked=``,dirsToCheck=[memoryDir,builderforceMemoryDir];for(let dir of dirsToCheck)try{await fs$1.access(dir,fs.constants.R_OK),dirReadable=!0,dirChecked=dir;break}catch(err){let code=err.code;if(code!==`ENOENT`){issues.push(`memory directory not accessible (${shortenHomePath(dir)}): ${code??`error`}`),dirReadable=null,dirChecked=dir;break}}dirReadable===null&&dirChecked===``&&issues.push(`memory directories missing (${shortenHomePath(memoryDir)} and ${shortenHomePath(builderforceMemoryDir)})`);let listed=[],listedOk=!1;try{listed=await listMemoryFiles(workspaceDir,resolvedExtraPaths),listedOk=!0}catch(err){let code=err.code;if(dirReadable!==null){let reportDir=dirChecked||memoryDir;issues.push(`memory directory scan failed (${shortenHomePath(reportDir)}): ${code??`error`}`),dirReadable=null}}let totalFiles=0;if(dirReadable===null)totalFiles=null;else{let files=new Set(listedOk?listed:[]);listedOk||(primary.exists&&files.add(memoryFile),alt.exists&&files.add(altMemoryFile)),totalFiles=files.size}return(totalFiles??0)===0&&issues.length===0&&issues.push(`no memory files found in ${shortenHomePath(workspaceDir)}`),{source:`memory`,totalFiles,issues}}async function summarizeQmdIndexArtifact(manager){let status=manager.status?.();if(!status||status.backend!==`qmd`)return null;let dbPath=status.dbPath?.trim();if(!dbPath)return null;let stat;try{stat=await fs$1.stat(dbPath)}catch(err){let code=err.code;throw code===`ENOENT`?Error(`QMD index file not found: ${shortenHomePath(dbPath)}`,{cause:err}):Error(`QMD index file check failed: ${shortenHomePath(dbPath)} (${code??`error`})`,{cause:err})}if(!stat.isFile()||stat.size<=0)throw Error(`QMD index file is empty: ${shortenHomePath(dbPath)}`);return`QMD index: ${shortenHomePath(dbPath)} (${stat.size} bytes)`}async function scanMemorySources(params){let scans=[],extraPaths=params.extraPaths??[];for(let source of params.sources)source===`memory`&&scans.push(await scanMemoryFiles(params.workspaceDir,extraPaths)),source===`sessions`&&scans.push(await scanSessionFiles(params.agentId));let issues=scans.flatMap(scan=>scan.issues),totals=scans.map(scan=>scan.totalFiles),numericTotals=totals.filter(total=>total!==null);return{sources:scans,totalFiles:totals.some(total=>total===null)?null:numericTotals.reduce((sum,total)=>sum+total,0),issues}}async function runMemoryStatus(opts){setVerbose(!!opts.verbose);let cfg=loadConfig(),agentIds=resolveAgentIds(cfg,opts.agent),allResults=[];for(let agentId of agentIds){let managerPurpose=opts.index?`default`:`status`;await withManager({getManager:()=>getMemorySearchManager({cfg,agentId,purpose:managerPurpose}),onMissing:error=>defaultRuntime.log(error??`Memory search disabled.`),onCloseError:err=>defaultRuntime.error(`Memory manager close failed: ${formatErrorMessage(err)}`),close:async manager=>{await manager.close?.()},run:async manager=>{let deep=!!(opts.deep||opts.index),embeddingProbe,indexError,syncFn=manager.sync?manager.sync.bind(manager):void 0;deep?(await withProgress({label:`Checking memory…`,total:2},async progress=>{progress.setLabel(`Probing vector…`),await manager.probeVectorAvailability(),progress.tick(),progress.setLabel(`Probing embeddings…`),embeddingProbe=await manager.probeEmbeddingAvailability(),progress.tick()}),opts.index&&syncFn?await withProgressTotals({label:`Indexing memory…`,total:0,fallback:opts.verbose?`line`:void 0},async(update,progress)=>{try{await syncFn({reason:`cli`,force:!!opts.force,progress:syncUpdate=>{update({completed:syncUpdate.completed,total:syncUpdate.total,label:syncUpdate.label}),syncUpdate.label&&progress.setLabel(syncUpdate.label)}})}catch(err){indexError=formatErrorMessage(err),defaultRuntime.error(`Memory index failed: ${indexError}`),process.exitCode=1}}):opts.index&&!syncFn&&defaultRuntime.log(`Memory backend does not support manual reindex.`)):await manager.probeVectorAvailability();let status=manager.status(),sources=status.sources?.length?status.sources:[`memory`],workspaceDir=status.workspaceDir,scan=workspaceDir?await scanMemorySources({workspaceDir,agentId,sources,extraPaths:status.extraPaths}):void 0;allResults.push({agentId,status,embeddingProbe,indexError,scan})}})}if(opts.json){defaultRuntime.log(JSON.stringify(allResults,null,2));return}let rich=isRich(),heading=text=>colorize(rich,theme.heading,text),muted=text=>colorize(rich,theme.muted,text),info=text=>colorize(rich,theme.info,text),success=text=>colorize(rich,theme.success,text),warn=text=>colorize(rich,theme.warn,text),accent=text=>colorize(rich,theme.accent,text),label=text=>muted(`${text}:`);for(let result of allResults){let{agentId,status,embeddingProbe,indexError,scan}=result,filesIndexed=status.files??0,chunksIndexed=status.chunks??0,totalFiles=scan?.totalFiles??null,indexedLabel=totalFiles===null?`${filesIndexed}/? files · ${chunksIndexed} chunks`:`${filesIndexed}/${totalFiles} files · ${chunksIndexed} chunks`;if(opts.index){let line=indexError?`Memory index failed: ${indexError}`:`Memory index complete.`;defaultRuntime.log(line)}let requestedProvider=status.requestedProvider??status.provider,modelLabel=status.model??status.provider,storePath=status.dbPath?shortenHomePath(status.dbPath):`<unknown>`,workspacePath=status.workspaceDir?shortenHomePath(status.workspaceDir):`<unknown>`,sourceList=status.sources?.length?status.sources.join(`, `):null,extraPaths=status.workspaceDir?formatExtraPaths(status.workspaceDir,status.extraPaths??[]):[],lines=[`${heading(`Memory Search`)} ${muted(`(${agentId})`)}`,`${label(`Provider`)} ${info(status.provider)} ${muted(`(requested: ${requestedProvider})`)}`,`${label(`Model`)} ${info(modelLabel)}`,sourceList?`${label(`Sources`)} ${info(sourceList)}`:null,extraPaths.length?`${label(`Extra paths`)} ${info(extraPaths.join(`, `))}`:null,`${label(`Indexed`)} ${success(indexedLabel)}`,`${label(`Dirty`)} ${status.dirty?warn(`yes`):muted(`no`)}`,`${label(`Store`)} ${info(storePath)}`,`${label(`Workspace`)} ${info(workspacePath)}`].filter(Boolean);if(embeddingProbe){let state=embeddingProbe.ok?`ready`:`unavailable`,stateColor=embeddingProbe.ok?theme.success:theme.warn;lines.push(`${label(`Embeddings`)} ${colorize(rich,stateColor,state)}`),embeddingProbe.error&&lines.push(`${label(`Embeddings error`)} ${warn(embeddingProbe.error)}`)}if(status.sourceCounts?.length){lines.push(label(`By source`));for(let entry of status.sourceCounts){let total=scan?.sources?.find(scanEntry=>scanEntry.source===entry.source)?.totalFiles,counts=total===null?`${entry.files}/? files · ${entry.chunks} chunks`:`${entry.files}/${total} files · ${entry.chunks} chunks`;lines.push(` ${accent(entry.source)} ${muted(`·`)} ${muted(counts)}`)}}if(status.fallback&&lines.push(`${label(`Fallback`)} ${warn(status.fallback.from)}`),status.vector){let vectorState=status.vector.enabled?status.vector.available===void 0?`unknown`:status.vector.available?`ready`:`unavailable`:`disabled`,vectorColor=vectorState===`ready`?theme.success:vectorState===`unavailable`?theme.warn:theme.muted;lines.push(`${label(`Vector`)} ${colorize(rich,vectorColor,vectorState)}`),status.vector.dims&&lines.push(`${label(`Vector dims`)} ${info(String(status.vector.dims))}`),status.vector.extensionPath&&lines.push(`${label(`Vector path`)} ${info(shortenHomePath(status.vector.extensionPath))}`),status.vector.loadError&&lines.push(`${label(`Vector error`)} ${warn(status.vector.loadError)}`)}if(status.fts){let ftsState=status.fts.enabled?status.fts.available?`ready`:`unavailable`:`disabled`,ftsColor=ftsState===`ready`?theme.success:ftsState===`unavailable`?theme.warn:theme.muted;lines.push(`${label(`FTS`)} ${colorize(rich,ftsColor,ftsState)}`),status.fts.error&&lines.push(`${label(`FTS error`)} ${warn(status.fts.error)}`)}if(status.cache){let cacheState=status.cache.enabled?`enabled`:`disabled`,cacheColor=status.cache.enabled?theme.success:theme.muted,suffix=status.cache.enabled&&typeof status.cache.entries==`number`?` (${status.cache.entries} entries)`:``;lines.push(`${label(`Embedding cache`)} ${colorize(rich,cacheColor,cacheState)}${suffix}`),status.cache.enabled&&typeof status.cache.maxEntries==`number`&&lines.push(`${label(`Cache cap`)} ${info(String(status.cache.maxEntries))}`)}if(status.batch){let batchState=status.batch.enabled?`enabled`:`disabled`,batchColor=status.batch.enabled?theme.success:theme.warn,batchSuffix=` (failures ${status.batch.failures}/${status.batch.limit})`;lines.push(`${label(`Batch`)} ${colorize(rich,batchColor,batchState)}${muted(batchSuffix)}`),status.batch.lastError&&lines.push(`${label(`Batch error`)} ${warn(status.batch.lastError)}`)}if(status.fallback?.reason&&lines.push(muted(status.fallback.reason)),indexError&&lines.push(`${label(`Index error`)} ${warn(indexError)}`),scan?.issues.length){lines.push(label(`Issues`));for(let issue of scan.issues)lines.push(` ${warn(issue)}`)}defaultRuntime.log(lines.join(`
|
|
2
2
|
`)),defaultRuntime.log(``)}}function registerMemoryCli(program){let memory=program.command(`memory`).description(`Search, inspect, and reindex memory files`).addHelpText(`after`,()=>`\n${theme.heading(`Examples:`)}\n${formatHelpExamples([[`builderforce memory status`,`Show index and provider status.`],[`builderforce memory index --force`,`Force a full reindex.`],[`builderforce memory search --query "deployment notes"`,`Search indexed memory entries.`],[`builderforce memory status --json`,`Output machine-readable JSON.`]])}\n\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/memory`,`docs.builderforce.ai/cli/memory`)}\n`);memory.command(`status`).description(`Show memory search index status`).option(`--agent <id>`,`Agent id (default: default agent)`).option(`--json`,`Print JSON`).option(`--deep`,`Probe embedding provider availability`).option(`--index`,`Reindex if dirty (implies --deep)`).option(`--verbose`,`Verbose logging`,!1).action(async opts=>{await runMemoryStatus(opts)}),memory.command(`index`).description(`Reindex memory files`).option(`--agent <id>`,`Agent id (default: default agent)`).option(`--force`,`Force full reindex`,!1).option(`--verbose`,`Verbose logging`,!1).action(async opts=>{setVerbose(!!opts.verbose);let cfg=loadConfig(),agentIds=resolveAgentIds(cfg,opts.agent);for(let agentId of agentIds)await withManager({getManager:()=>getMemorySearchManager({cfg,agentId}),onMissing:error=>defaultRuntime.log(error??`Memory search disabled.`),onCloseError:err=>defaultRuntime.error(`Memory manager close failed: ${formatErrorMessage(err)}`),close:async manager=>{await manager.close?.()},run:async manager=>{try{let syncFn=manager.sync?manager.sync.bind(manager):void 0;if(opts.verbose){let status=manager.status(),rich=isRich(),heading=text=>colorize(rich,theme.heading,text),muted=text=>colorize(rich,theme.muted,text),info=text=>colorize(rich,theme.info,text),warn=text=>colorize(rich,theme.warn,text),label=text=>muted(`${text}:`),sourceLabels=(status.sources??[]).map(source=>formatSourceLabel(source,status.workspaceDir??``,agentId)),extraPaths=status.workspaceDir?formatExtraPaths(status.workspaceDir,status.extraPaths??[]):[],requestedProvider=status.requestedProvider??status.provider,modelLabel=status.model??status.provider,lines=[`${heading(`Memory Index`)} ${muted(`(${agentId})`)}`,`${label(`Provider`)} ${info(status.provider)} ${muted(`(requested: ${requestedProvider})`)}`,`${label(`Model`)} ${info(modelLabel)}`,sourceLabels.length?`${label(`Sources`)} ${info(sourceLabels.join(`, `))}`:null,extraPaths.length?`${label(`Extra paths`)} ${info(extraPaths.join(`, `))}`:null].filter(Boolean);status.fallback&&lines.push(`${label(`Fallback`)} ${warn(status.fallback.from)}`),defaultRuntime.log(lines.join(`
|
|
3
3
|
`)),defaultRuntime.log(``)}let startedAt=Date.now(),lastLabel=`Indexing memory…`,lastCompleted=0,lastTotal=0,formatElapsed=()=>{let elapsedMs=Math.max(0,Date.now()-startedAt),seconds=Math.floor(elapsedMs/1e3),minutes=Math.floor(seconds/60),remainingSeconds=seconds%60;return`${minutes}:${String(remainingSeconds).padStart(2,`0`)}`},formatEta=()=>{if(lastTotal<=0||lastCompleted<=0)return null;let elapsedMs=Math.max(1,Date.now()-startedAt),rate=lastCompleted/elapsedMs;if(!Number.isFinite(rate)||rate<=0)return null;let remainingMs=Math.max(0,(lastTotal-lastCompleted)/rate),seconds=Math.floor(remainingMs/1e3),minutes=Math.floor(seconds/60),remainingSeconds=seconds%60;return`${minutes}:${String(remainingSeconds).padStart(2,`0`)}`},buildLabel=()=>{let elapsed=formatElapsed(),eta=formatEta();return eta?`${lastLabel} · elapsed ${elapsed} · eta ${eta}`:`${lastLabel} · elapsed ${elapsed}`};if(!syncFn){defaultRuntime.log(`Memory backend does not support manual reindex.`);return}await withProgressTotals({label:`Indexing memory…`,total:0,fallback:opts.verbose?`line`:void 0},async(update,progress)=>{let interval=setInterval(()=>{progress.setLabel(buildLabel())},1e3);try{await syncFn({reason:`cli`,force:!!opts.force,progress:syncUpdate=>{syncUpdate.label&&(lastLabel=syncUpdate.label),lastCompleted=syncUpdate.completed,lastTotal=syncUpdate.total,update({completed:syncUpdate.completed,total:syncUpdate.total,label:buildLabel()}),progress.setLabel(buildLabel())}})}finally{clearInterval(interval)}});let qmdIndexSummary=await summarizeQmdIndexArtifact(manager);qmdIndexSummary&&defaultRuntime.log(qmdIndexSummary),defaultRuntime.log(`Memory index updated (${agentId}).`)}catch(err){let message=formatErrorMessage(err);defaultRuntime.error(`Memory index failed (${agentId}): ${message}`),process.exitCode=1}}})}),memory.command(`search`).description(`Search memory files`).argument(`<query>`,`Search query`).option(`--agent <id>`,`Agent id (default: default agent)`).option(`--max-results <n>`,`Max results`,value=>Number(value)).option(`--min-score <n>`,`Minimum score`,value=>Number(value)).option(`--json`,`Print JSON`).action(async(query,opts)=>{let cfg=loadConfig(),agentId=resolveAgent(cfg,opts.agent);await withManager({getManager:()=>getMemorySearchManager({cfg,agentId}),onMissing:error=>defaultRuntime.log(error??`Memory search disabled.`),onCloseError:err=>defaultRuntime.error(`Memory manager close failed: ${formatErrorMessage(err)}`),close:async manager=>{await manager.close?.()},run:async manager=>{let results;try{results=await manager.search(query,{maxResults:opts.maxResults,minScore:opts.minScore})}catch(err){let message=formatErrorMessage(err);defaultRuntime.error(`Memory search failed: ${message}`),process.exitCode=1;return}if(opts.json){defaultRuntime.log(JSON.stringify({results},null,2));return}if(results.length===0){defaultRuntime.log(`No matches.`);return}let rich=isRich(),lines=[];for(let result of results)lines.push(`${colorize(rich,theme.success,result.score.toFixed(3))} ${colorize(rich,theme.accent,`${shortenHomePath(result.path)}:${result.startLine}-${result.endLine}`)}`),lines.push(colorize(rich,theme.muted,result.snippet)),lines.push(``);defaultRuntime.log(lines.join(`
|
|
4
4
|
`).trim())}})})}export{resolveMemoryBackendConfig as i,runMemoryStatus as n,getMemorySearchManager as r,registerMemoryCli as t};
|
|
@@ -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{n as invalidateModelCatalogCache}from"./model-catalog-DjNiebr7.js";export{invalidateModelCatalogCache};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{T as resolveBuilderForceAgentsAgentDir}from"./auth-profiles-
|
|
1
|
+
import{T as resolveBuilderForceAgentsAgentDir}from"./auth-profiles-pt7Tr4HA.js";import{r as loadConfig}from"./io-D9hC2aG0.js";import{a as ensureBuilderForceAgentsModelsJson,n as ModelRegistry,t as AuthStorage}from"./model-discovery-D0i1JpiL.js";let modelCatalogPromise=null,hasLoggedModelCatalogError=!1,importModelSdk=()=>Promise.resolve({AuthStorage,ModelRegistry});const CODEX_PROVIDER=`openai-codex`,OPENAI_CODEX_GPT53_SPARK_MODEL_ID=`gpt-5.3-codex-spark`;function applyOpenAICodexSparkFallback(models){if(models.some(entry=>entry.provider===CODEX_PROVIDER&&entry.id.toLowerCase()===OPENAI_CODEX_GPT53_SPARK_MODEL_ID))return;let baseModel=models.find(entry=>entry.provider===CODEX_PROVIDER&&entry.id.toLowerCase()===`gpt-5.3-codex`);baseModel&&models.push({...baseModel,id:OPENAI_CODEX_GPT53_SPARK_MODEL_ID,name:OPENAI_CODEX_GPT53_SPARK_MODEL_ID})}function invalidateModelCatalogCache(){modelCatalogPromise=null}function createAuthStorage(AuthStorageLike,path){let withFactory=AuthStorageLike;return typeof withFactory.create==`function`?withFactory.create(path):new AuthStorageLike(path)}async function loadModelCatalog(params){return params?.useCache===!1&&(modelCatalogPromise=null),modelCatalogPromise||(modelCatalogPromise=(async()=>{let models=[],sortModels=entries=>entries.sort((a,b)=>{let p=a.provider.localeCompare(b.provider);return p===0?a.name.localeCompare(b.name):p});try{await ensureBuilderForceAgentsModelsJson(params?.config??loadConfig()),await(await import(`./auth-json-BVyos95N.js`)).ensureAuthJsonFromAuthProfiles(resolveBuilderForceAgentsAgentDir());let modelSdk=await importModelSdk(),agentDir=resolveBuilderForceAgentsAgentDir(),{join}=await import(`node:path`),authStorage=createAuthStorage(modelSdk.AuthStorage,join(agentDir,`auth.json`)),registry=new modelSdk.ModelRegistry(authStorage,join(agentDir,`models.json`)),entries=Array.isArray(registry)?registry:registry.getAll();for(let entry of entries){let id=String(entry?.id??``).trim();if(!id)continue;let provider=String(entry?.provider??``).trim();if(!provider)continue;let name=String(entry?.name??id).trim()||id,contextWindow=typeof entry?.contextWindow==`number`&&entry.contextWindow>0?entry.contextWindow:void 0,reasoning=typeof entry?.reasoning==`boolean`?entry.reasoning:void 0,input=Array.isArray(entry?.input)?entry.input:void 0;models.push({id,name,provider,contextWindow,reasoning,input})}return applyOpenAICodexSparkFallback(models),models.length===0&&(modelCatalogPromise=null),sortModels(models)}catch(error){return hasLoggedModelCatalogError||(hasLoggedModelCatalogError=!0,console.warn(`[model-catalog] Failed to load model catalog: ${String(error)}`)),modelCatalogPromise=null,models.length>0?sortModels(models):[]}})(),modelCatalogPromise)}function modelSupportsVision(entry){return entry?.input?.includes(`image`)??!1}function findModelInCatalog(catalog,provider,modelId){let normalizedProvider=provider.toLowerCase().trim(),normalizedModelId=modelId.toLowerCase().trim();return catalog.find(entry=>entry.provider.toLowerCase()===normalizedProvider&&entry.id.toLowerCase()===normalizedModelId)}export{modelSupportsVision as i,invalidateModelCatalogCache as n,loadModelCatalog as r,findModelInCatalog as t};
|
|
@@ -0,0 +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-pt7Tr4HA.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import"./model-discovery-D0i1JpiL.js";import{n as invalidateModelCatalogCache}from"./model-catalog-BeBXvbFm.js";export{invalidateModelCatalogCache};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{f as isRecord}from"./utils-DbaBVFaK.js";import{A as resolveImplicitBedrockProvider,E as discoverOllamaModels,M as resolveImplicitProviders,O as normalizeProviders,j as resolveImplicitCopilotProvider,ln as resolveBuilderForceAgentsAgentDir}from"./model-selection-
|
|
1
|
+
import{f as isRecord}from"./utils-DbaBVFaK.js";import{A as resolveImplicitBedrockProvider,E as discoverOllamaModels,M as resolveImplicitProviders,O as normalizeProviders,j as resolveImplicitCopilotProvider,ln as resolveBuilderForceAgentsAgentDir}from"./model-selection-DG9J_VTz.js";import{r as loadConfig}from"./io-BLBq4T2o.js";import{existsSync,readFileSync}from"node:fs";import path from"node:path";import fs$1 from"node:fs/promises";function mergeProviderModels(implicit,explicit){let implicitModels=Array.isArray(implicit.models)?implicit.models:[],explicitModels=Array.isArray(explicit.models)?explicit.models:[];if(implicitModels.length===0)return{...implicit,...explicit};let getId=model=>{if(!model||typeof model!=`object`)return``;let id=model.id;return typeof id==`string`?id.trim():``},seen=new Set(explicitModels.map(getId).filter(Boolean)),mergedModels=[...explicitModels,...implicitModels.filter(model=>{let id=getId(model);return!id||seen.has(id)?!1:(seen.add(id),!0)})];return{...implicit,...explicit,models:mergedModels}}function mergeProviders(params){let out=params.implicit?{...params.implicit}:{};for(let[key,explicit]of Object.entries(params.explicit??{})){let providerKey=key.trim();if(!providerKey)continue;let implicit=out[providerKey];out[providerKey]=implicit?mergeProviderModels(implicit,explicit):explicit}return out}async function readJson(pathname){try{let raw=await fs$1.readFile(pathname,`utf8`);return JSON.parse(raw)}catch{return null}}async function ensureBuilderForceAgentsModelsJson(config,agentDirOverride){let cfg=config??loadConfig(),agentDir=agentDirOverride?.trim()?agentDirOverride.trim():resolveBuilderForceAgentsAgentDir(),explicitProviders=cfg.models?.providers??{},providers=mergeProviders({implicit:await resolveImplicitProviders({agentDir,explicitProviders}),explicit:explicitProviders}),implicitBedrock=await resolveImplicitBedrockProvider({agentDir,config:cfg});if(implicitBedrock){let existing=providers[`amazon-bedrock`];providers[`amazon-bedrock`]=existing?mergeProviderModels(implicitBedrock,existing):implicitBedrock}let implicitCopilot=await resolveImplicitCopilotProvider({agentDir});if(implicitCopilot&&!providers[`github-copilot`]&&(providers[`github-copilot`]=implicitCopilot),Object.keys(providers).length===0)return{agentDir,wrote:!1};let mode=cfg.models?.mode??`merge`,targetPath=path.join(agentDir,`models.json`),mergedProviders=providers,existingRaw=``;if(mode===`merge`){let existing=await readJson(targetPath);isRecord(existing)&&isRecord(existing.providers)&&(mergedProviders={...existing.providers,...providers})}let normalizedProviders=await normalizeProviders({providers:mergedProviders,agentDir}),next=`${JSON.stringify({providers:normalizedProviders},null,2)}\n`;try{existingRaw=await fs$1.readFile(targetPath,`utf8`)}catch{existingRaw=``}if(existingRaw===next)return{agentDir,wrote:!1};await fs$1.mkdir(agentDir,{recursive:!0,mode:448}),await fs$1.writeFile(targetPath,next,{mode:384});let ollamaProvider=mergedProviders?.ollama;if(ollamaProvider&&Array.isArray(ollamaProvider.models)&&ollamaProvider.models.length===0){let baseUrl=ollamaProvider.baseUrl;(async()=>{try{let models=await discoverOllamaModels(baseUrl);if(models.length===0)return;let existing=await readJson(targetPath);if(!isRecord(existing)||!isRecord(existing.providers))return;let providers=existing.providers,ollama=providers.ollama;if(!ollama)return;providers.ollama={...ollama,models};let normalized=await normalizeProviders({providers,agentDir});await fs$1.writeFile(targetPath,`${JSON.stringify({providers:normalized},null,2)}\n`,{mode:384});let{invalidateModelCatalogCache}=await import(`./model-catalog-B29yeBYS.js`);invalidateModelCatalogCache()}catch{}})()}return{agentDir,wrote:!0}}var AuthStorage=class AuthStorage{constructor(storePath){this.storePath=storePath,this.runtimeKeys=new Map}static create(storePath){return new AuthStorage(storePath)}setRuntimeApiKey(provider,key){this.runtimeKeys.set(provider,key)}getRuntimeApiKey(provider){return this.runtimeKeys.get(provider)}},ModelRegistry=class{constructor(authStorage,modelsPath){if(this.models=[],modelsPath&&existsSync(modelsPath))try{let data=JSON.parse(readFileSync(modelsPath,`utf-8`));for(let[provider,pc]of Object.entries(data.providers??{})){let api=pc.api??`openai-completions`,baseUrl=pc.baseUrl??``;for(let m of pc.models??[]){let id=String(m.id??``);id&&this.models.push({id,name:typeof m.name==`string`?m.name:id,api,provider,baseUrl,reasoning:m.reasoning===!0,input:Array.isArray(m.input)?m.input:[`text`],cost:m.cost??{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:typeof m.contextWindow==`number`?m.contextWindow:128e3,maxTokens:typeof m.maxTokens==`number`?m.maxTokens:4096})}}}catch{}}find(provider,modelId){return this.models.find(m=>m.provider===provider&&m.id===modelId)??null}getAll(){return this.models}getAvailable(){return this.models}async getApiKey(model){}};function discoverAuthStorage(agentDir){return AuthStorage.create(path.join(agentDir,`auth.json`))}function discoverModels(authStorage,agentDir){return new ModelRegistry(authStorage,path.join(agentDir,`models.json`))}let modelCatalogPromise=null,hasLoggedModelCatalogError=!1,importModelSdk=()=>Promise.resolve({AuthStorage,ModelRegistry});const CODEX_PROVIDER=`openai-codex`,OPENAI_CODEX_GPT53_SPARK_MODEL_ID=`gpt-5.3-codex-spark`;function applyOpenAICodexSparkFallback(models){if(models.some(entry=>entry.provider===CODEX_PROVIDER&&entry.id.toLowerCase()===OPENAI_CODEX_GPT53_SPARK_MODEL_ID))return;let baseModel=models.find(entry=>entry.provider===CODEX_PROVIDER&&entry.id.toLowerCase()===`gpt-5.3-codex`);baseModel&&models.push({...baseModel,id:OPENAI_CODEX_GPT53_SPARK_MODEL_ID,name:OPENAI_CODEX_GPT53_SPARK_MODEL_ID})}function invalidateModelCatalogCache(){modelCatalogPromise=null}function createAuthStorage(AuthStorageLike,path){let withFactory=AuthStorageLike;return typeof withFactory.create==`function`?withFactory.create(path):new AuthStorageLike(path)}async function loadModelCatalog(params){return params?.useCache===!1&&(modelCatalogPromise=null),modelCatalogPromise||(modelCatalogPromise=(async()=>{let models=[],sortModels=entries=>entries.sort((a,b)=>{let p=a.provider.localeCompare(b.provider);return p===0?a.name.localeCompare(b.name):p});try{await ensureBuilderForceAgentsModelsJson(params?.config??loadConfig()),await(await import(`./auth-json-BB-VBn5E.js`)).ensureAuthJsonFromAuthProfiles(resolveBuilderForceAgentsAgentDir());let modelSdk=await importModelSdk(),agentDir=resolveBuilderForceAgentsAgentDir(),{join}=await import(`node:path`),authStorage=createAuthStorage(modelSdk.AuthStorage,join(agentDir,`auth.json`)),registry=new modelSdk.ModelRegistry(authStorage,join(agentDir,`models.json`)),entries=Array.isArray(registry)?registry:registry.getAll();for(let entry of entries){let id=String(entry?.id??``).trim();if(!id)continue;let provider=String(entry?.provider??``).trim();if(!provider)continue;let name=String(entry?.name??id).trim()||id,contextWindow=typeof entry?.contextWindow==`number`&&entry.contextWindow>0?entry.contextWindow:void 0,reasoning=typeof entry?.reasoning==`boolean`?entry.reasoning:void 0,input=Array.isArray(entry?.input)?entry.input:void 0;models.push({id,name,provider,contextWindow,reasoning,input})}return applyOpenAICodexSparkFallback(models),models.length===0&&(modelCatalogPromise=null),sortModels(models)}catch(error){return hasLoggedModelCatalogError||(hasLoggedModelCatalogError=!0,console.warn(`[model-catalog] Failed to load model catalog: ${String(error)}`)),modelCatalogPromise=null,models.length>0?sortModels(models):[]}})(),modelCatalogPromise)}function modelSupportsVision(entry){return entry?.input?.includes(`image`)??!1}function findModelInCatalog(catalog,provider,modelId){let normalizedProvider=provider.toLowerCase().trim(),normalizedModelId=modelId.toLowerCase().trim();return catalog.find(entry=>entry.provider.toLowerCase()===normalizedProvider&&entry.id.toLowerCase()===normalizedModelId)}export{discoverAuthStorage as a,modelSupportsVision as i,invalidateModelCatalogCache as n,discoverModels as o,loadModelCatalog as r,ensureBuilderForceAgentsModelsJson as s,findModelInCatalog as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as isRecord}from"./utils-BP60e80M.js";import{T as resolveBuilderForceAgentsAgentDir,at as resolveImplicitCopilotProvider,et as discoverOllamaModels,it as resolveImplicitBedrockProvider,nt as normalizeProviders,ot as resolveImplicitProviders}from"./auth-profiles-
|
|
1
|
+
import{d as isRecord}from"./utils-BP60e80M.js";import{T as resolveBuilderForceAgentsAgentDir,at as resolveImplicitCopilotProvider,et as discoverOllamaModels,it as resolveImplicitBedrockProvider,nt as normalizeProviders,ot as resolveImplicitProviders}from"./auth-profiles-pt7Tr4HA.js";import{r as loadConfig}from"./io-D9hC2aG0.js";import path from"node:path";import{existsSync,readFileSync}from"node:fs";import fs$1 from"node:fs/promises";function mergeProviderModels(implicit,explicit){let implicitModels=Array.isArray(implicit.models)?implicit.models:[],explicitModels=Array.isArray(explicit.models)?explicit.models:[];if(implicitModels.length===0)return{...implicit,...explicit};let getId=model=>{if(!model||typeof model!=`object`)return``;let id=model.id;return typeof id==`string`?id.trim():``},seen=new Set(explicitModels.map(getId).filter(Boolean)),mergedModels=[...explicitModels,...implicitModels.filter(model=>{let id=getId(model);return!id||seen.has(id)?!1:(seen.add(id),!0)})];return{...implicit,...explicit,models:mergedModels}}function mergeProviders(params){let out=params.implicit?{...params.implicit}:{};for(let[key,explicit]of Object.entries(params.explicit??{})){let providerKey=key.trim();if(!providerKey)continue;let implicit=out[providerKey];out[providerKey]=implicit?mergeProviderModels(implicit,explicit):explicit}return out}async function readJson(pathname){try{let raw=await fs$1.readFile(pathname,`utf8`);return JSON.parse(raw)}catch{return null}}async function ensureBuilderForceAgentsModelsJson(config,agentDirOverride){let cfg=config??loadConfig(),agentDir=agentDirOverride?.trim()?agentDirOverride.trim():resolveBuilderForceAgentsAgentDir(),explicitProviders=cfg.models?.providers??{},providers=mergeProviders({implicit:await resolveImplicitProviders({agentDir,explicitProviders}),explicit:explicitProviders}),implicitBedrock=await resolveImplicitBedrockProvider({agentDir,config:cfg});if(implicitBedrock){let existing=providers[`amazon-bedrock`];providers[`amazon-bedrock`]=existing?mergeProviderModels(implicitBedrock,existing):implicitBedrock}let implicitCopilot=await resolveImplicitCopilotProvider({agentDir});if(implicitCopilot&&!providers[`github-copilot`]&&(providers[`github-copilot`]=implicitCopilot),Object.keys(providers).length===0)return{agentDir,wrote:!1};let mode=cfg.models?.mode??`merge`,targetPath=path.join(agentDir,`models.json`),mergedProviders=providers,existingRaw=``;if(mode===`merge`){let existing=await readJson(targetPath);isRecord(existing)&&isRecord(existing.providers)&&(mergedProviders={...existing.providers,...providers})}let normalizedProviders=await normalizeProviders({providers:mergedProviders,agentDir}),next=`${JSON.stringify({providers:normalizedProviders},null,2)}\n`;try{existingRaw=await fs$1.readFile(targetPath,`utf8`)}catch{existingRaw=``}if(existingRaw===next)return{agentDir,wrote:!1};await fs$1.mkdir(agentDir,{recursive:!0,mode:448}),await fs$1.writeFile(targetPath,next,{mode:384});let ollamaProvider=mergedProviders?.ollama;if(ollamaProvider&&Array.isArray(ollamaProvider.models)&&ollamaProvider.models.length===0){let baseUrl=ollamaProvider.baseUrl;(async()=>{try{let models=await discoverOllamaModels(baseUrl);if(models.length===0)return;let existing=await readJson(targetPath);if(!isRecord(existing)||!isRecord(existing.providers))return;let providers=existing.providers,ollama=providers.ollama;if(!ollama)return;providers.ollama={...ollama,models};let normalized=await normalizeProviders({providers,agentDir});await fs$1.writeFile(targetPath,`${JSON.stringify({providers:normalized},null,2)}\n`,{mode:384});let{invalidateModelCatalogCache}=await import(`./model-catalog-CMKHKuBL.js`);invalidateModelCatalogCache()}catch{}})()}return{agentDir,wrote:!0}}var AuthStorage=class AuthStorage{constructor(storePath){this.storePath=storePath,this.runtimeKeys=new Map}static create(storePath){return new AuthStorage(storePath)}setRuntimeApiKey(provider,key){this.runtimeKeys.set(provider,key)}getRuntimeApiKey(provider){return this.runtimeKeys.get(provider)}},ModelRegistry=class{constructor(authStorage,modelsPath){if(this.models=[],modelsPath&&existsSync(modelsPath))try{let data=JSON.parse(readFileSync(modelsPath,`utf-8`));for(let[provider,pc]of Object.entries(data.providers??{})){let api=pc.api??`openai-completions`,baseUrl=pc.baseUrl??``;for(let m of pc.models??[]){let id=String(m.id??``);id&&this.models.push({id,name:typeof m.name==`string`?m.name:id,api,provider,baseUrl,reasoning:m.reasoning===!0,input:Array.isArray(m.input)?m.input:[`text`],cost:m.cost??{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:typeof m.contextWindow==`number`?m.contextWindow:128e3,maxTokens:typeof m.maxTokens==`number`?m.maxTokens:4096})}}}catch{}}find(provider,modelId){return this.models.find(m=>m.provider===provider&&m.id===modelId)??null}getAll(){return this.models}getAvailable(){return this.models}async getApiKey(model){}};function discoverAuthStorage(agentDir){return AuthStorage.create(path.join(agentDir,`auth.json`))}function discoverModels(authStorage,agentDir){return new ModelRegistry(authStorage,path.join(agentDir,`models.json`))}export{ensureBuilderForceAgentsModelsJson as a,discoverModels as i,ModelRegistry as n,discoverAuthStorage as r,AuthStorage as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{F as modelKey,Gt as getCustomProviderApiKey,H as resolveConfiguredModelRef,R as normalizeProviderId,Yt as resolveEnvApiKey,_n as DEFAULT_PROVIDER,b as ensureAuthProfileStore,gn as DEFAULT_MODEL,h as listProfilesForProvider,j as buildModelAliasIndex,k as buildAllowedModelSet,y as upsertAuthProfileWithLock}from"./auth-profiles-C1VbcUOm.js";import{t as normalizeBaseUrl}from"./normalize-base-url-D_sv6Zgt.js";import{r as loadModelCatalog}from"./model-catalog-CiiFJX77.js";import{i as formatTokenK}from"./shared-xj-xaKFi.js";function resolvePrimaryModel(model){if(typeof model==`string`)return model;if(model&&typeof model==`object`&&typeof model.primary==`string`)return model.primary}function applyAgentDefaultPrimaryModel(params){let current=resolvePrimaryModel(params.cfg.agents?.defaults?.model)?.trim();return(current&¶ms.legacyModels?.has(current)?params.model:current)===params.model?{next:params.cfg,changed:!1}:{next:{...params.cfg,agents:{...params.cfg.agents,defaults:{...params.cfg.agents?.defaults,model:params.cfg.agents?.defaults?.model&&typeof params.cfg.agents.defaults.model==`object`?{...params.cfg.agents.defaults.model,primary:params.model}:{primary:params.model}}}},changed:!0}}const OPENAI_CODEX_DEFAULT_MODEL=`openai-codex/gpt-5.3-codex`;function shouldSetOpenAICodexModel(model){let trimmed=model?.trim();if(!trimmed)return!0;let normalized=trimmed.toLowerCase();return normalized.startsWith(`openai-codex/`)?!1:normalized.startsWith(`openai/`)?!0:normalized===`gpt`||normalized===`gpt-mini`}function applyOpenAICodexModelDefault(cfg){return shouldSetOpenAICodexModel(resolvePrimaryModel(cfg.agents?.defaults?.model))?{next:{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,model:cfg.agents?.defaults?.model&&typeof cfg.agents.defaults.model==`object`?{...cfg.agents.defaults.model,primary:OPENAI_CODEX_DEFAULT_MODEL}:{primary:OPENAI_CODEX_DEFAULT_MODEL}}}},changed:!0}:{next:cfg,changed:!1}}const VLLM_DEFAULT_BASE_URL=`http://127.0.0.1:8000/v1`,VLLM_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0};async function promptAndConfigureVllm(params){let baseUrlRaw=await params.prompter.text({message:`vLLM base URL`,initialValue:VLLM_DEFAULT_BASE_URL,placeholder:VLLM_DEFAULT_BASE_URL,validate:value=>value?.trim()?void 0:`Required`}),apiKeyRaw=await params.prompter.text({message:`vLLM API key`,placeholder:`sk-... (or any non-empty string)`,validate:value=>value?.trim()?void 0:`Required`}),modelIdRaw=await params.prompter.text({message:`vLLM model`,placeholder:`meta-llama/Meta-Llama-3-8B-Instruct`,validate:value=>value?.trim()?void 0:`Required`}),baseUrl=normalizeBaseUrl(String(baseUrlRaw??``).trim()),apiKey=String(apiKeyRaw??``).trim(),modelId=String(modelIdRaw??``).trim(),modelRef=`vllm/${modelId}`;return await upsertAuthProfileWithLock({profileId:`vllm:default`,credential:{type:`api_key`,provider:`vllm`,key:apiKey},agentDir:params.agentDir}),{config:{...params.cfg,models:{...params.cfg.models,mode:params.cfg.models?.mode??`merge`,providers:{...params.cfg.models?.providers,vllm:{baseUrl,api:`openai-completions`,apiKey:`VLLM_API_KEY`,models:[{id:modelId,name:modelId,reasoning:!1,input:[`text`],cost:VLLM_DEFAULT_COST,contextWindow:128e3,maxTokens:8192}]}}}},modelId,modelRef}}const KEEP_VALUE=`__keep__`,MANUAL_VALUE=`__manual__`,VLLM_VALUE=`__vllm__`,HIDDEN_ROUTER_MODELS=new Set([`openrouter/auto`]);function hasAuthForProvider(provider,cfg,store){return!!(listProfilesForProvider(store,provider).length>0||resolveEnvApiKey(provider)||getCustomProviderApiKey(cfg,provider))}async function createProviderAuthChecker(params){let authStore=await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),authCache=new Map;return provider=>{let cached=authCache.get(provider);if(cached!==void 0)return cached;let value=hasAuthForProvider(provider,params.cfg,authStore);return authCache.set(provider,value),value}}function resolveConfiguredModelRaw(cfg){let raw=cfg.agents?.defaults?.model;return typeof raw==`string`?raw.trim():raw?.primary?.trim()??``}function resolveConfiguredModelKeys(cfg){let models=cfg.agents?.defaults?.models??{};return Object.keys(models).map(key=>String(key??``).trim()).filter(key=>key.length>0)}function normalizeModelKeys(values){let seen=new Set,next=[];for(let raw of values){let value=String(raw??``).trim();!value||seen.has(value)||(seen.add(value),next.push(value))}return next}function addModelSelectOption(params){let key=modelKey(params.entry.provider,params.entry.id);if(params.seen.has(key)||HIDDEN_ROUTER_MODELS.has(key))return;let hints=[];params.entry.name&¶ms.entry.name!==params.entry.id&&hints.push(params.entry.name),params.entry.contextWindow&&hints.push(`ctx ${formatTokenK(params.entry.contextWindow)}`),params.entry.reasoning&&hints.push(`reasoning`);let aliases=params.aliasIndex.byKey.get(key);aliases?.length&&hints.push(`alias: ${aliases.join(`, `)}`),params.hasAuth(params.entry.provider)||hints.push(`auth missing`),params.options.push({value:key,label:key,hint:hints.length>0?hints.join(` · `):void 0}),params.seen.add(key)}function isAnthropicLegacyModel(entry){return entry.provider===`anthropic`&&typeof entry.id==`string`&&entry.id.toLowerCase().startsWith(`claude-3`)}async function promptManualModel(params){let modelInput=await params.prompter.text({message:params.allowBlank?`Default model (blank to keep)`:`Default model`,initialValue:params.initialValue,placeholder:`provider/model`,validate:params.allowBlank?void 0:value=>value?.trim()?void 0:`Required`}),model=String(modelInput??``).trim();return model?{model}:{}}async function promptDefaultModel(params){let cfg=params.config,allowKeep=params.allowKeep??!0,includeManual=params.includeManual??!0,includeVllm=params.includeVllm??!1,ignoreAllowlist=params.ignoreAllowlist??!1,preferredProviderRaw=params.preferredProvider?.trim(),preferredProvider=preferredProviderRaw?normalizeProviderId(preferredProviderRaw):void 0,configuredRaw=resolveConfiguredModelRaw(cfg),resolved=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),resolvedKey=modelKey(resolved.provider,resolved.model),configuredKey=configuredRaw?resolvedKey:``,catalog=await loadModelCatalog({config:cfg,useCache:!1});if(catalog.length===0)return promptManualModel({prompter:params.prompter,allowBlank:allowKeep,initialValue:configuredRaw||resolvedKey||void 0});let aliasIndex=buildModelAliasIndex({cfg,defaultProvider:DEFAULT_PROVIDER}),models=catalog;if(!ignoreAllowlist){let{allowedCatalog}=buildAllowedModelSet({cfg,catalog,defaultProvider:DEFAULT_PROVIDER});models=allowedCatalog.length>0?allowedCatalog:catalog}if(models.length===0)return promptManualModel({prompter:params.prompter,allowBlank:allowKeep,initialValue:configuredRaw||resolvedKey||void 0});let providers=Array.from(new Set(models.map(entry=>entry.provider))).toSorted((a,b)=>a.localeCompare(b)),hasPreferredProvider=preferredProvider?providers.includes(preferredProvider):!1;if(!hasPreferredProvider&&providers.length>1&&models.length>30){let selection=await params.prompter.select({message:`Filter models by provider`,options:[{value:`*`,label:`All providers`},...providers.map(provider=>{let count=models.filter(entry=>entry.provider===provider).length;return{value:provider,label:provider,hint:`${count} model${count===1?``:`s`}`}})]});selection!==`*`&&(models=models.filter(entry=>entry.provider===selection))}hasPreferredProvider&&preferredProvider&&(models=models.filter(entry=>entry.provider===preferredProvider),preferredProvider===`anthropic`&&(models=models.filter(entry=>!isAnthropicLegacyModel(entry))));let agentDir=params.agentDir,hasAuth=await createProviderAuthChecker({cfg,agentDir}),options=[];allowKeep&&options.push({value:KEEP_VALUE,label:configuredRaw?`Keep current (${configuredRaw})`:`Keep current (default: ${resolvedKey})`,hint:configuredRaw&&configuredRaw!==resolvedKey?`resolves to ${resolvedKey}`:void 0}),includeManual&&options.push({value:MANUAL_VALUE,label:`Enter model manually`}),includeVllm&&agentDir&&options.push({value:VLLM_VALUE,label:`vLLM (custom)`,hint:`Enter vLLM URL + API key + model`});let seen=new Set;for(let entry of models)addModelSelectOption({entry,options,seen,aliasIndex,hasAuth});configuredKey&&!seen.has(configuredKey)&&options.push({value:configuredKey,label:configuredKey,hint:`current (not in catalog)`});let initialValue=allowKeep?KEEP_VALUE:configuredKey||void 0;if(allowKeep&&hasPreferredProvider&&preferredProvider&&resolved.provider!==preferredProvider){let firstModel=models[0];firstModel&&(initialValue=modelKey(firstModel.provider,firstModel.id))}let selection=await params.prompter.select({message:params.message??`Default model`,options,initialValue});if(selection===KEEP_VALUE)return{};if(selection===MANUAL_VALUE)return promptManualModel({prompter:params.prompter,allowBlank:!1,initialValue:configuredRaw||resolvedKey||void 0});if(selection===VLLM_VALUE){if(!agentDir)return await params.prompter.note(`vLLM setup requires an agent directory context.`,`vLLM not available`),{};let{config:nextConfig,modelRef}=await promptAndConfigureVllm({cfg,prompter:params.prompter,agentDir});return{model:modelRef,config:nextConfig}}return{model:String(selection)}}async function promptModelAllowlist(params){let cfg=params.config,existingKeys=resolveConfiguredModelKeys(cfg),allowedKeys=normalizeModelKeys(params.allowedKeys??[]),allowedKeySet=allowedKeys.length>0?new Set(allowedKeys):null,resolved=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),resolvedKey=modelKey(resolved.provider,resolved.model),initialSeeds=normalizeModelKeys([...existingKeys,resolvedKey,...params.initialSelections??[]]),initialKeys=allowedKeySet?initialSeeds.filter(key=>allowedKeySet.has(key)):initialSeeds,catalog=await loadModelCatalog({config:cfg,useCache:!1});if(catalog.length===0&&allowedKeys.length===0){let raw=await params.prompter.text({message:params.message??`Allowlist models (comma-separated provider/model; blank to keep current)`,initialValue:existingKeys.join(`, `),placeholder:`${OPENAI_CODEX_DEFAULT_MODEL}, anthropic/claude-opus-4-6`}),parsed=String(raw??``).split(`,`).map(value=>value.trim()).filter(value=>value.length>0);return parsed.length===0?{}:{models:normalizeModelKeys(parsed)}}let aliasIndex=buildModelAliasIndex({cfg,defaultProvider:DEFAULT_PROVIDER}),hasAuth=await createProviderAuthChecker({cfg,agentDir:params.agentDir}),options=[],seen=new Set,filteredCatalog=allowedKeySet?catalog.filter(entry=>allowedKeySet.has(modelKey(entry.provider,entry.id))):catalog;for(let entry of filteredCatalog)addModelSelectOption({entry,options,seen,aliasIndex,hasAuth});let supplementalKeys=allowedKeySet?allowedKeys:existingKeys;for(let key of supplementalKeys)seen.has(key)||(options.push({value:key,label:key,hint:allowedKeySet?`allowed (not in catalog)`:`configured (not in catalog)`}),seen.add(key));if(options.length===0)return{};let selected=normalizeModelKeys((await params.prompter.multiselect({message:params.message??`Models in /model picker (multi-select)`,options,initialValues:initialKeys.length>0?initialKeys:void 0,searchable:!0})).map(value=>String(value)));return selected.length>0?{models:selected}:existingKeys.length===0||await params.prompter.confirm({message:`Clear the model allowlist? (shows all models)`,initialValue:!1})?{models:[]}:{}}function applyPrimaryModel(cfg,model){let defaults=cfg.agents?.defaults,existingModel=defaults?.model,existingModels=defaults?.models,fallbacks=typeof existingModel==`object`&&existingModel&&`fallbacks`in existingModel?existingModel.fallbacks:void 0;return{...cfg,agents:{...cfg.agents,defaults:{...defaults,model:{...fallbacks?{fallbacks}:void 0,primary:model},models:{...existingModels,[model]:existingModels?.[model]??{}}}}}}function applyModelAllowlist(cfg,models){let defaults=cfg.agents?.defaults,normalized=normalizeModelKeys(models);if(normalized.length===0){if(!defaults?.models)return cfg;let{models:_ignored,...restDefaults}=defaults;return{...cfg,agents:{...cfg.agents,defaults:restDefaults}}}let existingModels=defaults?.models??{},nextModels={};for(let key of normalized)nextModels[key]=existingModels[key]??{};return{...cfg,agents:{...cfg.agents,defaults:{...defaults,models:nextModels}}}}function applyModelFallbacksFromSelection(cfg,selection){let normalized=normalizeModelKeys(selection);if(normalized.length<=1)return cfg;let resolved=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),resolvedKey=modelKey(resolved.provider,resolved.model);if(!normalized.includes(resolvedKey))return cfg;let defaults=cfg.agents?.defaults,existingModel=defaults?.model,existingPrimary=typeof existingModel==`string`?existingModel:existingModel&&typeof existingModel==`object`?existingModel.primary:void 0,fallbacks=normalized.filter(key=>key!==resolvedKey);return{...cfg,agents:{...cfg.agents,defaults:{...defaults,model:{...typeof existingModel==`object`?existingModel:void 0,primary:existingPrimary??resolvedKey,fallbacks}}}}}export{promptModelAllowlist as a,applyOpenAICodexModelDefault as c,promptDefaultModel as i,applyAgentDefaultPrimaryModel as l,applyModelFallbacksFromSelection as n,promptAndConfigureVllm as o,applyPrimaryModel as r,OPENAI_CODEX_DEFAULT_MODEL as s,applyModelAllowlist as t};
|
|
1
|
+
import{F as modelKey,Gt as getCustomProviderApiKey,H as resolveConfiguredModelRef,R as normalizeProviderId,Yt as resolveEnvApiKey,_n as DEFAULT_PROVIDER,b as ensureAuthProfileStore,gn as DEFAULT_MODEL,h as listProfilesForProvider,j as buildModelAliasIndex,k as buildAllowedModelSet,y as upsertAuthProfileWithLock}from"./auth-profiles-pt7Tr4HA.js";import{t as normalizeBaseUrl}from"./normalize-base-url-D_sv6Zgt.js";import{r as loadModelCatalog}from"./model-catalog-BeBXvbFm.js";import{i as formatTokenK}from"./shared-BBOiNdjf.js";function resolvePrimaryModel(model){if(typeof model==`string`)return model;if(model&&typeof model==`object`&&typeof model.primary==`string`)return model.primary}function applyAgentDefaultPrimaryModel(params){let current=resolvePrimaryModel(params.cfg.agents?.defaults?.model)?.trim();return(current&¶ms.legacyModels?.has(current)?params.model:current)===params.model?{next:params.cfg,changed:!1}:{next:{...params.cfg,agents:{...params.cfg.agents,defaults:{...params.cfg.agents?.defaults,model:params.cfg.agents?.defaults?.model&&typeof params.cfg.agents.defaults.model==`object`?{...params.cfg.agents.defaults.model,primary:params.model}:{primary:params.model}}}},changed:!0}}const OPENAI_CODEX_DEFAULT_MODEL=`openai-codex/gpt-5.3-codex`;function shouldSetOpenAICodexModel(model){let trimmed=model?.trim();if(!trimmed)return!0;let normalized=trimmed.toLowerCase();return normalized.startsWith(`openai-codex/`)?!1:normalized.startsWith(`openai/`)?!0:normalized===`gpt`||normalized===`gpt-mini`}function applyOpenAICodexModelDefault(cfg){return shouldSetOpenAICodexModel(resolvePrimaryModel(cfg.agents?.defaults?.model))?{next:{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,model:cfg.agents?.defaults?.model&&typeof cfg.agents.defaults.model==`object`?{...cfg.agents.defaults.model,primary:OPENAI_CODEX_DEFAULT_MODEL}:{primary:OPENAI_CODEX_DEFAULT_MODEL}}}},changed:!0}:{next:cfg,changed:!1}}const VLLM_DEFAULT_BASE_URL=`http://127.0.0.1:8000/v1`,VLLM_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0};async function promptAndConfigureVllm(params){let baseUrlRaw=await params.prompter.text({message:`vLLM base URL`,initialValue:VLLM_DEFAULT_BASE_URL,placeholder:VLLM_DEFAULT_BASE_URL,validate:value=>value?.trim()?void 0:`Required`}),apiKeyRaw=await params.prompter.text({message:`vLLM API key`,placeholder:`sk-... (or any non-empty string)`,validate:value=>value?.trim()?void 0:`Required`}),modelIdRaw=await params.prompter.text({message:`vLLM model`,placeholder:`meta-llama/Meta-Llama-3-8B-Instruct`,validate:value=>value?.trim()?void 0:`Required`}),baseUrl=normalizeBaseUrl(String(baseUrlRaw??``).trim()),apiKey=String(apiKeyRaw??``).trim(),modelId=String(modelIdRaw??``).trim(),modelRef=`vllm/${modelId}`;return await upsertAuthProfileWithLock({profileId:`vllm:default`,credential:{type:`api_key`,provider:`vllm`,key:apiKey},agentDir:params.agentDir}),{config:{...params.cfg,models:{...params.cfg.models,mode:params.cfg.models?.mode??`merge`,providers:{...params.cfg.models?.providers,vllm:{baseUrl,api:`openai-completions`,apiKey:`VLLM_API_KEY`,models:[{id:modelId,name:modelId,reasoning:!1,input:[`text`],cost:VLLM_DEFAULT_COST,contextWindow:128e3,maxTokens:8192}]}}}},modelId,modelRef}}const KEEP_VALUE=`__keep__`,MANUAL_VALUE=`__manual__`,VLLM_VALUE=`__vllm__`,HIDDEN_ROUTER_MODELS=new Set([`openrouter/auto`]);function hasAuthForProvider(provider,cfg,store){return!!(listProfilesForProvider(store,provider).length>0||resolveEnvApiKey(provider)||getCustomProviderApiKey(cfg,provider))}async function createProviderAuthChecker(params){let authStore=await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),authCache=new Map;return provider=>{let cached=authCache.get(provider);if(cached!==void 0)return cached;let value=hasAuthForProvider(provider,params.cfg,authStore);return authCache.set(provider,value),value}}function resolveConfiguredModelRaw(cfg){let raw=cfg.agents?.defaults?.model;return typeof raw==`string`?raw.trim():raw?.primary?.trim()??``}function resolveConfiguredModelKeys(cfg){let models=cfg.agents?.defaults?.models??{};return Object.keys(models).map(key=>String(key??``).trim()).filter(key=>key.length>0)}function normalizeModelKeys(values){let seen=new Set,next=[];for(let raw of values){let value=String(raw??``).trim();!value||seen.has(value)||(seen.add(value),next.push(value))}return next}function addModelSelectOption(params){let key=modelKey(params.entry.provider,params.entry.id);if(params.seen.has(key)||HIDDEN_ROUTER_MODELS.has(key))return;let hints=[];params.entry.name&¶ms.entry.name!==params.entry.id&&hints.push(params.entry.name),params.entry.contextWindow&&hints.push(`ctx ${formatTokenK(params.entry.contextWindow)}`),params.entry.reasoning&&hints.push(`reasoning`);let aliases=params.aliasIndex.byKey.get(key);aliases?.length&&hints.push(`alias: ${aliases.join(`, `)}`),params.hasAuth(params.entry.provider)||hints.push(`auth missing`),params.options.push({value:key,label:key,hint:hints.length>0?hints.join(` · `):void 0}),params.seen.add(key)}function isAnthropicLegacyModel(entry){return entry.provider===`anthropic`&&typeof entry.id==`string`&&entry.id.toLowerCase().startsWith(`claude-3`)}async function promptManualModel(params){let modelInput=await params.prompter.text({message:params.allowBlank?`Default model (blank to keep)`:`Default model`,initialValue:params.initialValue,placeholder:`provider/model`,validate:params.allowBlank?void 0:value=>value?.trim()?void 0:`Required`}),model=String(modelInput??``).trim();return model?{model}:{}}async function promptDefaultModel(params){let cfg=params.config,allowKeep=params.allowKeep??!0,includeManual=params.includeManual??!0,includeVllm=params.includeVllm??!1,ignoreAllowlist=params.ignoreAllowlist??!1,preferredProviderRaw=params.preferredProvider?.trim(),preferredProvider=preferredProviderRaw?normalizeProviderId(preferredProviderRaw):void 0,configuredRaw=resolveConfiguredModelRaw(cfg),resolved=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),resolvedKey=modelKey(resolved.provider,resolved.model),configuredKey=configuredRaw?resolvedKey:``,catalog=await loadModelCatalog({config:cfg,useCache:!1});if(catalog.length===0)return promptManualModel({prompter:params.prompter,allowBlank:allowKeep,initialValue:configuredRaw||resolvedKey||void 0});let aliasIndex=buildModelAliasIndex({cfg,defaultProvider:DEFAULT_PROVIDER}),models=catalog;if(!ignoreAllowlist){let{allowedCatalog}=buildAllowedModelSet({cfg,catalog,defaultProvider:DEFAULT_PROVIDER});models=allowedCatalog.length>0?allowedCatalog:catalog}if(models.length===0)return promptManualModel({prompter:params.prompter,allowBlank:allowKeep,initialValue:configuredRaw||resolvedKey||void 0});let providers=Array.from(new Set(models.map(entry=>entry.provider))).toSorted((a,b)=>a.localeCompare(b)),hasPreferredProvider=preferredProvider?providers.includes(preferredProvider):!1;if(!hasPreferredProvider&&providers.length>1&&models.length>30){let selection=await params.prompter.select({message:`Filter models by provider`,options:[{value:`*`,label:`All providers`},...providers.map(provider=>{let count=models.filter(entry=>entry.provider===provider).length;return{value:provider,label:provider,hint:`${count} model${count===1?``:`s`}`}})]});selection!==`*`&&(models=models.filter(entry=>entry.provider===selection))}hasPreferredProvider&&preferredProvider&&(models=models.filter(entry=>entry.provider===preferredProvider),preferredProvider===`anthropic`&&(models=models.filter(entry=>!isAnthropicLegacyModel(entry))));let agentDir=params.agentDir,hasAuth=await createProviderAuthChecker({cfg,agentDir}),options=[];allowKeep&&options.push({value:KEEP_VALUE,label:configuredRaw?`Keep current (${configuredRaw})`:`Keep current (default: ${resolvedKey})`,hint:configuredRaw&&configuredRaw!==resolvedKey?`resolves to ${resolvedKey}`:void 0}),includeManual&&options.push({value:MANUAL_VALUE,label:`Enter model manually`}),includeVllm&&agentDir&&options.push({value:VLLM_VALUE,label:`vLLM (custom)`,hint:`Enter vLLM URL + API key + model`});let seen=new Set;for(let entry of models)addModelSelectOption({entry,options,seen,aliasIndex,hasAuth});configuredKey&&!seen.has(configuredKey)&&options.push({value:configuredKey,label:configuredKey,hint:`current (not in catalog)`});let initialValue=allowKeep?KEEP_VALUE:configuredKey||void 0;if(allowKeep&&hasPreferredProvider&&preferredProvider&&resolved.provider!==preferredProvider){let firstModel=models[0];firstModel&&(initialValue=modelKey(firstModel.provider,firstModel.id))}let selection=await params.prompter.select({message:params.message??`Default model`,options,initialValue});if(selection===KEEP_VALUE)return{};if(selection===MANUAL_VALUE)return promptManualModel({prompter:params.prompter,allowBlank:!1,initialValue:configuredRaw||resolvedKey||void 0});if(selection===VLLM_VALUE){if(!agentDir)return await params.prompter.note(`vLLM setup requires an agent directory context.`,`vLLM not available`),{};let{config:nextConfig,modelRef}=await promptAndConfigureVllm({cfg,prompter:params.prompter,agentDir});return{model:modelRef,config:nextConfig}}return{model:String(selection)}}async function promptModelAllowlist(params){let cfg=params.config,existingKeys=resolveConfiguredModelKeys(cfg),allowedKeys=normalizeModelKeys(params.allowedKeys??[]),allowedKeySet=allowedKeys.length>0?new Set(allowedKeys):null,resolved=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),resolvedKey=modelKey(resolved.provider,resolved.model),initialSeeds=normalizeModelKeys([...existingKeys,resolvedKey,...params.initialSelections??[]]),initialKeys=allowedKeySet?initialSeeds.filter(key=>allowedKeySet.has(key)):initialSeeds,catalog=await loadModelCatalog({config:cfg,useCache:!1});if(catalog.length===0&&allowedKeys.length===0){let raw=await params.prompter.text({message:params.message??`Allowlist models (comma-separated provider/model; blank to keep current)`,initialValue:existingKeys.join(`, `),placeholder:`${OPENAI_CODEX_DEFAULT_MODEL}, anthropic/claude-opus-4-6`}),parsed=String(raw??``).split(`,`).map(value=>value.trim()).filter(value=>value.length>0);return parsed.length===0?{}:{models:normalizeModelKeys(parsed)}}let aliasIndex=buildModelAliasIndex({cfg,defaultProvider:DEFAULT_PROVIDER}),hasAuth=await createProviderAuthChecker({cfg,agentDir:params.agentDir}),options=[],seen=new Set,filteredCatalog=allowedKeySet?catalog.filter(entry=>allowedKeySet.has(modelKey(entry.provider,entry.id))):catalog;for(let entry of filteredCatalog)addModelSelectOption({entry,options,seen,aliasIndex,hasAuth});let supplementalKeys=allowedKeySet?allowedKeys:existingKeys;for(let key of supplementalKeys)seen.has(key)||(options.push({value:key,label:key,hint:allowedKeySet?`allowed (not in catalog)`:`configured (not in catalog)`}),seen.add(key));if(options.length===0)return{};let selected=normalizeModelKeys((await params.prompter.multiselect({message:params.message??`Models in /model picker (multi-select)`,options,initialValues:initialKeys.length>0?initialKeys:void 0,searchable:!0})).map(value=>String(value)));return selected.length>0?{models:selected}:existingKeys.length===0||await params.prompter.confirm({message:`Clear the model allowlist? (shows all models)`,initialValue:!1})?{models:[]}:{}}function applyPrimaryModel(cfg,model){let defaults=cfg.agents?.defaults,existingModel=defaults?.model,existingModels=defaults?.models,fallbacks=typeof existingModel==`object`&&existingModel&&`fallbacks`in existingModel?existingModel.fallbacks:void 0;return{...cfg,agents:{...cfg.agents,defaults:{...defaults,model:{...fallbacks?{fallbacks}:void 0,primary:model},models:{...existingModels,[model]:existingModels?.[model]??{}}}}}}function applyModelAllowlist(cfg,models){let defaults=cfg.agents?.defaults,normalized=normalizeModelKeys(models);if(normalized.length===0){if(!defaults?.models)return cfg;let{models:_ignored,...restDefaults}=defaults;return{...cfg,agents:{...cfg.agents,defaults:restDefaults}}}let existingModels=defaults?.models??{},nextModels={};for(let key of normalized)nextModels[key]=existingModels[key]??{};return{...cfg,agents:{...cfg.agents,defaults:{...defaults,models:nextModels}}}}function applyModelFallbacksFromSelection(cfg,selection){let normalized=normalizeModelKeys(selection);if(normalized.length<=1)return cfg;let resolved=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),resolvedKey=modelKey(resolved.provider,resolved.model);if(!normalized.includes(resolvedKey))return cfg;let defaults=cfg.agents?.defaults,existingModel=defaults?.model,existingPrimary=typeof existingModel==`string`?existingModel:existingModel&&typeof existingModel==`object`?existingModel.primary:void 0,fallbacks=normalized.filter(key=>key!==resolvedKey);return{...cfg,agents:{...cfg.agents,defaults:{...defaults,model:{...typeof existingModel==`object`?existingModel:void 0,primary:existingPrimary??resolvedKey,fallbacks}}}}}export{promptModelAllowlist as a,applyOpenAICodexModelDefault as c,promptDefaultModel as i,applyAgentDefaultPrimaryModel as l,applyModelFallbacksFromSelection as n,promptAndConfigureVllm as o,applyPrimaryModel as r,OPENAI_CODEX_DEFAULT_MODEL as s,applyModelAllowlist as t};
|
|
@@ -0,0 +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-pt7Tr4HA.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import"./model-discovery-D0i1JpiL.js";import"./model-catalog-BeBXvbFm.js";import"./shared-BBOiNdjf.js";import{i as promptDefaultModel,r as applyPrimaryModel}from"./model-picker-CGDNPRPc.js";export{applyPrimaryModel,promptDefaultModel};
|
|
@@ -0,0 +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-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"./shared-C2orjbTD.js";import{i as promptDefaultModel,r as applyPrimaryModel}from"./model-picker-EIhpfOZa.js";export{applyPrimaryModel,promptDefaultModel};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$t as listProfilesForProvider,_t as getCustomProviderApiKey,bn as DEFAULT_PROVIDER,in as ensureAuthProfileStore,m as resolveConfiguredModelRef,r as buildModelAliasIndex,rn as upsertAuthProfileWithLock,s as modelKey,t as buildAllowedModelSet,u as normalizeProviderId,xt as resolveEnvApiKey,yn as DEFAULT_MODEL}from"./model-selection-9bRFKBI_.js";import{t as normalizeBaseUrl}from"./normalize-base-url-DmugqkQ6.js";import{r as loadModelCatalog}from"./model-catalog-C6UrZ0uG.js";import{i as formatTokenK}from"./shared-BPN3qd7G.js";function resolvePrimaryModel(model){if(typeof model==`string`)return model;if(model&&typeof model==`object`&&typeof model.primary==`string`)return model.primary}function applyAgentDefaultPrimaryModel(params){let current=resolvePrimaryModel(params.cfg.agents?.defaults?.model)?.trim();return(current&¶ms.legacyModels?.has(current)?params.model:current)===params.model?{next:params.cfg,changed:!1}:{next:{...params.cfg,agents:{...params.cfg.agents,defaults:{...params.cfg.agents?.defaults,model:params.cfg.agents?.defaults?.model&&typeof params.cfg.agents.defaults.model==`object`?{...params.cfg.agents.defaults.model,primary:params.model}:{primary:params.model}}}},changed:!0}}const OPENAI_CODEX_DEFAULT_MODEL=`openai-codex/gpt-5.3-codex`;function shouldSetOpenAICodexModel(model){let trimmed=model?.trim();if(!trimmed)return!0;let normalized=trimmed.toLowerCase();return normalized.startsWith(`openai-codex/`)?!1:normalized.startsWith(`openai/`)?!0:normalized===`gpt`||normalized===`gpt-mini`}function applyOpenAICodexModelDefault(cfg){return shouldSetOpenAICodexModel(resolvePrimaryModel(cfg.agents?.defaults?.model))?{next:{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,model:cfg.agents?.defaults?.model&&typeof cfg.agents.defaults.model==`object`?{...cfg.agents.defaults.model,primary:OPENAI_CODEX_DEFAULT_MODEL}:{primary:OPENAI_CODEX_DEFAULT_MODEL}}}},changed:!0}:{next:cfg,changed:!1}}const VLLM_DEFAULT_BASE_URL=`http://127.0.0.1:8000/v1`,VLLM_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0};async function promptAndConfigureVllm(params){let baseUrlRaw=await params.prompter.text({message:`vLLM base URL`,initialValue:VLLM_DEFAULT_BASE_URL,placeholder:VLLM_DEFAULT_BASE_URL,validate:value=>value?.trim()?void 0:`Required`}),apiKeyRaw=await params.prompter.text({message:`vLLM API key`,placeholder:`sk-... (or any non-empty string)`,validate:value=>value?.trim()?void 0:`Required`}),modelIdRaw=await params.prompter.text({message:`vLLM model`,placeholder:`meta-llama/Meta-Llama-3-8B-Instruct`,validate:value=>value?.trim()?void 0:`Required`}),baseUrl=normalizeBaseUrl(String(baseUrlRaw??``).trim()),apiKey=String(apiKeyRaw??``).trim(),modelId=String(modelIdRaw??``).trim(),modelRef=`vllm/${modelId}`;return await upsertAuthProfileWithLock({profileId:`vllm:default`,credential:{type:`api_key`,provider:`vllm`,key:apiKey},agentDir:params.agentDir}),{config:{...params.cfg,models:{...params.cfg.models,mode:params.cfg.models?.mode??`merge`,providers:{...params.cfg.models?.providers,vllm:{baseUrl,api:`openai-completions`,apiKey:`VLLM_API_KEY`,models:[{id:modelId,name:modelId,reasoning:!1,input:[`text`],cost:VLLM_DEFAULT_COST,contextWindow:128e3,maxTokens:8192}]}}}},modelId,modelRef}}const KEEP_VALUE=`__keep__`,MANUAL_VALUE=`__manual__`,VLLM_VALUE=`__vllm__`,HIDDEN_ROUTER_MODELS=new Set([`openrouter/auto`]);function hasAuthForProvider(provider,cfg,store){return!!(listProfilesForProvider(store,provider).length>0||resolveEnvApiKey(provider)||getCustomProviderApiKey(cfg,provider))}async function createProviderAuthChecker(params){let authStore=await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),authCache=new Map;return provider=>{let cached=authCache.get(provider);if(cached!==void 0)return cached;let value=hasAuthForProvider(provider,params.cfg,authStore);return authCache.set(provider,value),value}}function resolveConfiguredModelRaw(cfg){let raw=cfg.agents?.defaults?.model;return typeof raw==`string`?raw.trim():raw?.primary?.trim()??``}function resolveConfiguredModelKeys(cfg){let models=cfg.agents?.defaults?.models??{};return Object.keys(models).map(key=>String(key??``).trim()).filter(key=>key.length>0)}function normalizeModelKeys(values){let seen=new Set,next=[];for(let raw of values){let value=String(raw??``).trim();!value||seen.has(value)||(seen.add(value),next.push(value))}return next}function addModelSelectOption(params){let key=modelKey(params.entry.provider,params.entry.id);if(params.seen.has(key)||HIDDEN_ROUTER_MODELS.has(key))return;let hints=[];params.entry.name&¶ms.entry.name!==params.entry.id&&hints.push(params.entry.name),params.entry.contextWindow&&hints.push(`ctx ${formatTokenK(params.entry.contextWindow)}`),params.entry.reasoning&&hints.push(`reasoning`);let aliases=params.aliasIndex.byKey.get(key);aliases?.length&&hints.push(`alias: ${aliases.join(`, `)}`),params.hasAuth(params.entry.provider)||hints.push(`auth missing`),params.options.push({value:key,label:key,hint:hints.length>0?hints.join(` · `):void 0}),params.seen.add(key)}function isAnthropicLegacyModel(entry){return entry.provider===`anthropic`&&typeof entry.id==`string`&&entry.id.toLowerCase().startsWith(`claude-3`)}async function promptManualModel(params){let modelInput=await params.prompter.text({message:params.allowBlank?`Default model (blank to keep)`:`Default model`,initialValue:params.initialValue,placeholder:`provider/model`,validate:params.allowBlank?void 0:value=>value?.trim()?void 0:`Required`}),model=String(modelInput??``).trim();return model?{model}:{}}async function promptDefaultModel(params){let cfg=params.config,allowKeep=params.allowKeep??!0,includeManual=params.includeManual??!0,includeVllm=params.includeVllm??!1,ignoreAllowlist=params.ignoreAllowlist??!1,preferredProviderRaw=params.preferredProvider?.trim(),preferredProvider=preferredProviderRaw?normalizeProviderId(preferredProviderRaw):void 0,configuredRaw=resolveConfiguredModelRaw(cfg),resolved=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),resolvedKey=modelKey(resolved.provider,resolved.model),configuredKey=configuredRaw?resolvedKey:``,catalog=await loadModelCatalog({config:cfg,useCache:!1});if(catalog.length===0)return promptManualModel({prompter:params.prompter,allowBlank:allowKeep,initialValue:configuredRaw||resolvedKey||void 0});let aliasIndex=buildModelAliasIndex({cfg,defaultProvider:DEFAULT_PROVIDER}),models=catalog;if(!ignoreAllowlist){let{allowedCatalog}=buildAllowedModelSet({cfg,catalog,defaultProvider:DEFAULT_PROVIDER});models=allowedCatalog.length>0?allowedCatalog:catalog}if(models.length===0)return promptManualModel({prompter:params.prompter,allowBlank:allowKeep,initialValue:configuredRaw||resolvedKey||void 0});let providers=Array.from(new Set(models.map(entry=>entry.provider))).toSorted((a,b)=>a.localeCompare(b)),hasPreferredProvider=preferredProvider?providers.includes(preferredProvider):!1;if(!hasPreferredProvider&&providers.length>1&&models.length>30){let selection=await params.prompter.select({message:`Filter models by provider`,options:[{value:`*`,label:`All providers`},...providers.map(provider=>{let count=models.filter(entry=>entry.provider===provider).length;return{value:provider,label:provider,hint:`${count} model${count===1?``:`s`}`}})]});selection!==`*`&&(models=models.filter(entry=>entry.provider===selection))}hasPreferredProvider&&preferredProvider&&(models=models.filter(entry=>entry.provider===preferredProvider),preferredProvider===`anthropic`&&(models=models.filter(entry=>!isAnthropicLegacyModel(entry))));let agentDir=params.agentDir,hasAuth=await createProviderAuthChecker({cfg,agentDir}),options=[];allowKeep&&options.push({value:KEEP_VALUE,label:configuredRaw?`Keep current (${configuredRaw})`:`Keep current (default: ${resolvedKey})`,hint:configuredRaw&&configuredRaw!==resolvedKey?`resolves to ${resolvedKey}`:void 0}),includeManual&&options.push({value:MANUAL_VALUE,label:`Enter model manually`}),includeVllm&&agentDir&&options.push({value:VLLM_VALUE,label:`vLLM (custom)`,hint:`Enter vLLM URL + API key + model`});let seen=new Set;for(let entry of models)addModelSelectOption({entry,options,seen,aliasIndex,hasAuth});configuredKey&&!seen.has(configuredKey)&&options.push({value:configuredKey,label:configuredKey,hint:`current (not in catalog)`});let initialValue=allowKeep?KEEP_VALUE:configuredKey||void 0;if(allowKeep&&hasPreferredProvider&&preferredProvider&&resolved.provider!==preferredProvider){let firstModel=models[0];firstModel&&(initialValue=modelKey(firstModel.provider,firstModel.id))}let selection=await params.prompter.select({message:params.message??`Default model`,options,initialValue});if(selection===KEEP_VALUE)return{};if(selection===MANUAL_VALUE)return promptManualModel({prompter:params.prompter,allowBlank:!1,initialValue:configuredRaw||resolvedKey||void 0});if(selection===VLLM_VALUE){if(!agentDir)return await params.prompter.note(`vLLM setup requires an agent directory context.`,`vLLM not available`),{};let{config:nextConfig,modelRef}=await promptAndConfigureVllm({cfg,prompter:params.prompter,agentDir});return{model:modelRef,config:nextConfig}}return{model:String(selection)}}async function promptModelAllowlist(params){let cfg=params.config,existingKeys=resolveConfiguredModelKeys(cfg),allowedKeys=normalizeModelKeys(params.allowedKeys??[]),allowedKeySet=allowedKeys.length>0?new Set(allowedKeys):null,resolved=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),resolvedKey=modelKey(resolved.provider,resolved.model),initialSeeds=normalizeModelKeys([...existingKeys,resolvedKey,...params.initialSelections??[]]),initialKeys=allowedKeySet?initialSeeds.filter(key=>allowedKeySet.has(key)):initialSeeds,catalog=await loadModelCatalog({config:cfg,useCache:!1});if(catalog.length===0&&allowedKeys.length===0){let raw=await params.prompter.text({message:params.message??`Allowlist models (comma-separated provider/model; blank to keep current)`,initialValue:existingKeys.join(`, `),placeholder:`${OPENAI_CODEX_DEFAULT_MODEL}, anthropic/claude-opus-4-6`}),parsed=String(raw??``).split(`,`).map(value=>value.trim()).filter(value=>value.length>0);return parsed.length===0?{}:{models:normalizeModelKeys(parsed)}}let aliasIndex=buildModelAliasIndex({cfg,defaultProvider:DEFAULT_PROVIDER}),hasAuth=await createProviderAuthChecker({cfg,agentDir:params.agentDir}),options=[],seen=new Set,filteredCatalog=allowedKeySet?catalog.filter(entry=>allowedKeySet.has(modelKey(entry.provider,entry.id))):catalog;for(let entry of filteredCatalog)addModelSelectOption({entry,options,seen,aliasIndex,hasAuth});let supplementalKeys=allowedKeySet?allowedKeys:existingKeys;for(let key of supplementalKeys)seen.has(key)||(options.push({value:key,label:key,hint:allowedKeySet?`allowed (not in catalog)`:`configured (not in catalog)`}),seen.add(key));if(options.length===0)return{};let selected=normalizeModelKeys((await params.prompter.multiselect({message:params.message??`Models in /model picker (multi-select)`,options,initialValues:initialKeys.length>0?initialKeys:void 0,searchable:!0})).map(value=>String(value)));return selected.length>0?{models:selected}:existingKeys.length===0||await params.prompter.confirm({message:`Clear the model allowlist? (shows all models)`,initialValue:!1})?{models:[]}:{}}function applyPrimaryModel(cfg,model){let defaults=cfg.agents?.defaults,existingModel=defaults?.model,existingModels=defaults?.models,fallbacks=typeof existingModel==`object`&&existingModel&&`fallbacks`in existingModel?existingModel.fallbacks:void 0;return{...cfg,agents:{...cfg.agents,defaults:{...defaults,model:{...fallbacks?{fallbacks}:void 0,primary:model},models:{...existingModels,[model]:existingModels?.[model]??{}}}}}}function applyModelAllowlist(cfg,models){let defaults=cfg.agents?.defaults,normalized=normalizeModelKeys(models);if(normalized.length===0){if(!defaults?.models)return cfg;let{models:_ignored,...restDefaults}=defaults;return{...cfg,agents:{...cfg.agents,defaults:restDefaults}}}let existingModels=defaults?.models??{},nextModels={};for(let key of normalized)nextModels[key]=existingModels[key]??{};return{...cfg,agents:{...cfg.agents,defaults:{...defaults,models:nextModels}}}}function applyModelFallbacksFromSelection(cfg,selection){let normalized=normalizeModelKeys(selection);if(normalized.length<=1)return cfg;let resolved=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),resolvedKey=modelKey(resolved.provider,resolved.model);if(!normalized.includes(resolvedKey))return cfg;let defaults=cfg.agents?.defaults,existingModel=defaults?.model,existingPrimary=typeof existingModel==`string`?existingModel:existingModel&&typeof existingModel==`object`?existingModel.primary:void 0,fallbacks=normalized.filter(key=>key!==resolvedKey);return{...cfg,agents:{...cfg.agents,defaults:{...defaults,model:{...typeof existingModel==`object`?existingModel:void 0,primary:existingPrimary??resolvedKey,fallbacks}}}}}export{promptModelAllowlist as a,applyOpenAICodexModelDefault as c,promptDefaultModel as i,applyAgentDefaultPrimaryModel as l,applyModelFallbacksFromSelection as n,promptAndConfigureVllm as o,applyPrimaryModel as r,OPENAI_CODEX_DEFAULT_MODEL as s,applyModelAllowlist as t};
|
|
1
|
+
import{$t as listProfilesForProvider,_t as getCustomProviderApiKey,bn as DEFAULT_PROVIDER,in as ensureAuthProfileStore,m as resolveConfiguredModelRef,r as buildModelAliasIndex,rn as upsertAuthProfileWithLock,s as modelKey,t as buildAllowedModelSet,u as normalizeProviderId,xt as resolveEnvApiKey,yn as DEFAULT_MODEL}from"./model-selection-DG9J_VTz.js";import{t as normalizeBaseUrl}from"./normalize-base-url-DmugqkQ6.js";import{r as loadModelCatalog}from"./model-catalog-DjNiebr7.js";import{i as formatTokenK}from"./shared-C2orjbTD.js";function resolvePrimaryModel(model){if(typeof model==`string`)return model;if(model&&typeof model==`object`&&typeof model.primary==`string`)return model.primary}function applyAgentDefaultPrimaryModel(params){let current=resolvePrimaryModel(params.cfg.agents?.defaults?.model)?.trim();return(current&¶ms.legacyModels?.has(current)?params.model:current)===params.model?{next:params.cfg,changed:!1}:{next:{...params.cfg,agents:{...params.cfg.agents,defaults:{...params.cfg.agents?.defaults,model:params.cfg.agents?.defaults?.model&&typeof params.cfg.agents.defaults.model==`object`?{...params.cfg.agents.defaults.model,primary:params.model}:{primary:params.model}}}},changed:!0}}const OPENAI_CODEX_DEFAULT_MODEL=`openai-codex/gpt-5.3-codex`;function shouldSetOpenAICodexModel(model){let trimmed=model?.trim();if(!trimmed)return!0;let normalized=trimmed.toLowerCase();return normalized.startsWith(`openai-codex/`)?!1:normalized.startsWith(`openai/`)?!0:normalized===`gpt`||normalized===`gpt-mini`}function applyOpenAICodexModelDefault(cfg){return shouldSetOpenAICodexModel(resolvePrimaryModel(cfg.agents?.defaults?.model))?{next:{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,model:cfg.agents?.defaults?.model&&typeof cfg.agents.defaults.model==`object`?{...cfg.agents.defaults.model,primary:OPENAI_CODEX_DEFAULT_MODEL}:{primary:OPENAI_CODEX_DEFAULT_MODEL}}}},changed:!0}:{next:cfg,changed:!1}}const VLLM_DEFAULT_BASE_URL=`http://127.0.0.1:8000/v1`,VLLM_DEFAULT_COST={input:0,output:0,cacheRead:0,cacheWrite:0};async function promptAndConfigureVllm(params){let baseUrlRaw=await params.prompter.text({message:`vLLM base URL`,initialValue:VLLM_DEFAULT_BASE_URL,placeholder:VLLM_DEFAULT_BASE_URL,validate:value=>value?.trim()?void 0:`Required`}),apiKeyRaw=await params.prompter.text({message:`vLLM API key`,placeholder:`sk-... (or any non-empty string)`,validate:value=>value?.trim()?void 0:`Required`}),modelIdRaw=await params.prompter.text({message:`vLLM model`,placeholder:`meta-llama/Meta-Llama-3-8B-Instruct`,validate:value=>value?.trim()?void 0:`Required`}),baseUrl=normalizeBaseUrl(String(baseUrlRaw??``).trim()),apiKey=String(apiKeyRaw??``).trim(),modelId=String(modelIdRaw??``).trim(),modelRef=`vllm/${modelId}`;return await upsertAuthProfileWithLock({profileId:`vllm:default`,credential:{type:`api_key`,provider:`vllm`,key:apiKey},agentDir:params.agentDir}),{config:{...params.cfg,models:{...params.cfg.models,mode:params.cfg.models?.mode??`merge`,providers:{...params.cfg.models?.providers,vllm:{baseUrl,api:`openai-completions`,apiKey:`VLLM_API_KEY`,models:[{id:modelId,name:modelId,reasoning:!1,input:[`text`],cost:VLLM_DEFAULT_COST,contextWindow:128e3,maxTokens:8192}]}}}},modelId,modelRef}}const KEEP_VALUE=`__keep__`,MANUAL_VALUE=`__manual__`,VLLM_VALUE=`__vllm__`,HIDDEN_ROUTER_MODELS=new Set([`openrouter/auto`]);function hasAuthForProvider(provider,cfg,store){return!!(listProfilesForProvider(store,provider).length>0||resolveEnvApiKey(provider)||getCustomProviderApiKey(cfg,provider))}async function createProviderAuthChecker(params){let authStore=await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),authCache=new Map;return provider=>{let cached=authCache.get(provider);if(cached!==void 0)return cached;let value=hasAuthForProvider(provider,params.cfg,authStore);return authCache.set(provider,value),value}}function resolveConfiguredModelRaw(cfg){let raw=cfg.agents?.defaults?.model;return typeof raw==`string`?raw.trim():raw?.primary?.trim()??``}function resolveConfiguredModelKeys(cfg){let models=cfg.agents?.defaults?.models??{};return Object.keys(models).map(key=>String(key??``).trim()).filter(key=>key.length>0)}function normalizeModelKeys(values){let seen=new Set,next=[];for(let raw of values){let value=String(raw??``).trim();!value||seen.has(value)||(seen.add(value),next.push(value))}return next}function addModelSelectOption(params){let key=modelKey(params.entry.provider,params.entry.id);if(params.seen.has(key)||HIDDEN_ROUTER_MODELS.has(key))return;let hints=[];params.entry.name&¶ms.entry.name!==params.entry.id&&hints.push(params.entry.name),params.entry.contextWindow&&hints.push(`ctx ${formatTokenK(params.entry.contextWindow)}`),params.entry.reasoning&&hints.push(`reasoning`);let aliases=params.aliasIndex.byKey.get(key);aliases?.length&&hints.push(`alias: ${aliases.join(`, `)}`),params.hasAuth(params.entry.provider)||hints.push(`auth missing`),params.options.push({value:key,label:key,hint:hints.length>0?hints.join(` · `):void 0}),params.seen.add(key)}function isAnthropicLegacyModel(entry){return entry.provider===`anthropic`&&typeof entry.id==`string`&&entry.id.toLowerCase().startsWith(`claude-3`)}async function promptManualModel(params){let modelInput=await params.prompter.text({message:params.allowBlank?`Default model (blank to keep)`:`Default model`,initialValue:params.initialValue,placeholder:`provider/model`,validate:params.allowBlank?void 0:value=>value?.trim()?void 0:`Required`}),model=String(modelInput??``).trim();return model?{model}:{}}async function promptDefaultModel(params){let cfg=params.config,allowKeep=params.allowKeep??!0,includeManual=params.includeManual??!0,includeVllm=params.includeVllm??!1,ignoreAllowlist=params.ignoreAllowlist??!1,preferredProviderRaw=params.preferredProvider?.trim(),preferredProvider=preferredProviderRaw?normalizeProviderId(preferredProviderRaw):void 0,configuredRaw=resolveConfiguredModelRaw(cfg),resolved=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),resolvedKey=modelKey(resolved.provider,resolved.model),configuredKey=configuredRaw?resolvedKey:``,catalog=await loadModelCatalog({config:cfg,useCache:!1});if(catalog.length===0)return promptManualModel({prompter:params.prompter,allowBlank:allowKeep,initialValue:configuredRaw||resolvedKey||void 0});let aliasIndex=buildModelAliasIndex({cfg,defaultProvider:DEFAULT_PROVIDER}),models=catalog;if(!ignoreAllowlist){let{allowedCatalog}=buildAllowedModelSet({cfg,catalog,defaultProvider:DEFAULT_PROVIDER});models=allowedCatalog.length>0?allowedCatalog:catalog}if(models.length===0)return promptManualModel({prompter:params.prompter,allowBlank:allowKeep,initialValue:configuredRaw||resolvedKey||void 0});let providers=Array.from(new Set(models.map(entry=>entry.provider))).toSorted((a,b)=>a.localeCompare(b)),hasPreferredProvider=preferredProvider?providers.includes(preferredProvider):!1;if(!hasPreferredProvider&&providers.length>1&&models.length>30){let selection=await params.prompter.select({message:`Filter models by provider`,options:[{value:`*`,label:`All providers`},...providers.map(provider=>{let count=models.filter(entry=>entry.provider===provider).length;return{value:provider,label:provider,hint:`${count} model${count===1?``:`s`}`}})]});selection!==`*`&&(models=models.filter(entry=>entry.provider===selection))}hasPreferredProvider&&preferredProvider&&(models=models.filter(entry=>entry.provider===preferredProvider),preferredProvider===`anthropic`&&(models=models.filter(entry=>!isAnthropicLegacyModel(entry))));let agentDir=params.agentDir,hasAuth=await createProviderAuthChecker({cfg,agentDir}),options=[];allowKeep&&options.push({value:KEEP_VALUE,label:configuredRaw?`Keep current (${configuredRaw})`:`Keep current (default: ${resolvedKey})`,hint:configuredRaw&&configuredRaw!==resolvedKey?`resolves to ${resolvedKey}`:void 0}),includeManual&&options.push({value:MANUAL_VALUE,label:`Enter model manually`}),includeVllm&&agentDir&&options.push({value:VLLM_VALUE,label:`vLLM (custom)`,hint:`Enter vLLM URL + API key + model`});let seen=new Set;for(let entry of models)addModelSelectOption({entry,options,seen,aliasIndex,hasAuth});configuredKey&&!seen.has(configuredKey)&&options.push({value:configuredKey,label:configuredKey,hint:`current (not in catalog)`});let initialValue=allowKeep?KEEP_VALUE:configuredKey||void 0;if(allowKeep&&hasPreferredProvider&&preferredProvider&&resolved.provider!==preferredProvider){let firstModel=models[0];firstModel&&(initialValue=modelKey(firstModel.provider,firstModel.id))}let selection=await params.prompter.select({message:params.message??`Default model`,options,initialValue});if(selection===KEEP_VALUE)return{};if(selection===MANUAL_VALUE)return promptManualModel({prompter:params.prompter,allowBlank:!1,initialValue:configuredRaw||resolvedKey||void 0});if(selection===VLLM_VALUE){if(!agentDir)return await params.prompter.note(`vLLM setup requires an agent directory context.`,`vLLM not available`),{};let{config:nextConfig,modelRef}=await promptAndConfigureVllm({cfg,prompter:params.prompter,agentDir});return{model:modelRef,config:nextConfig}}return{model:String(selection)}}async function promptModelAllowlist(params){let cfg=params.config,existingKeys=resolveConfiguredModelKeys(cfg),allowedKeys=normalizeModelKeys(params.allowedKeys??[]),allowedKeySet=allowedKeys.length>0?new Set(allowedKeys):null,resolved=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),resolvedKey=modelKey(resolved.provider,resolved.model),initialSeeds=normalizeModelKeys([...existingKeys,resolvedKey,...params.initialSelections??[]]),initialKeys=allowedKeySet?initialSeeds.filter(key=>allowedKeySet.has(key)):initialSeeds,catalog=await loadModelCatalog({config:cfg,useCache:!1});if(catalog.length===0&&allowedKeys.length===0){let raw=await params.prompter.text({message:params.message??`Allowlist models (comma-separated provider/model; blank to keep current)`,initialValue:existingKeys.join(`, `),placeholder:`${OPENAI_CODEX_DEFAULT_MODEL}, anthropic/claude-opus-4-6`}),parsed=String(raw??``).split(`,`).map(value=>value.trim()).filter(value=>value.length>0);return parsed.length===0?{}:{models:normalizeModelKeys(parsed)}}let aliasIndex=buildModelAliasIndex({cfg,defaultProvider:DEFAULT_PROVIDER}),hasAuth=await createProviderAuthChecker({cfg,agentDir:params.agentDir}),options=[],seen=new Set,filteredCatalog=allowedKeySet?catalog.filter(entry=>allowedKeySet.has(modelKey(entry.provider,entry.id))):catalog;for(let entry of filteredCatalog)addModelSelectOption({entry,options,seen,aliasIndex,hasAuth});let supplementalKeys=allowedKeySet?allowedKeys:existingKeys;for(let key of supplementalKeys)seen.has(key)||(options.push({value:key,label:key,hint:allowedKeySet?`allowed (not in catalog)`:`configured (not in catalog)`}),seen.add(key));if(options.length===0)return{};let selected=normalizeModelKeys((await params.prompter.multiselect({message:params.message??`Models in /model picker (multi-select)`,options,initialValues:initialKeys.length>0?initialKeys:void 0,searchable:!0})).map(value=>String(value)));return selected.length>0?{models:selected}:existingKeys.length===0||await params.prompter.confirm({message:`Clear the model allowlist? (shows all models)`,initialValue:!1})?{models:[]}:{}}function applyPrimaryModel(cfg,model){let defaults=cfg.agents?.defaults,existingModel=defaults?.model,existingModels=defaults?.models,fallbacks=typeof existingModel==`object`&&existingModel&&`fallbacks`in existingModel?existingModel.fallbacks:void 0;return{...cfg,agents:{...cfg.agents,defaults:{...defaults,model:{...fallbacks?{fallbacks}:void 0,primary:model},models:{...existingModels,[model]:existingModels?.[model]??{}}}}}}function applyModelAllowlist(cfg,models){let defaults=cfg.agents?.defaults,normalized=normalizeModelKeys(models);if(normalized.length===0){if(!defaults?.models)return cfg;let{models:_ignored,...restDefaults}=defaults;return{...cfg,agents:{...cfg.agents,defaults:restDefaults}}}let existingModels=defaults?.models??{},nextModels={};for(let key of normalized)nextModels[key]=existingModels[key]??{};return{...cfg,agents:{...cfg.agents,defaults:{...defaults,models:nextModels}}}}function applyModelFallbacksFromSelection(cfg,selection){let normalized=normalizeModelKeys(selection);if(normalized.length<=1)return cfg;let resolved=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),resolvedKey=modelKey(resolved.provider,resolved.model);if(!normalized.includes(resolvedKey))return cfg;let defaults=cfg.agents?.defaults,existingModel=defaults?.model,existingPrimary=typeof existingModel==`string`?existingModel:existingModel&&typeof existingModel==`object`?existingModel.primary:void 0,fallbacks=normalized.filter(key=>key!==resolvedKey);return{...cfg,agents:{...cfg.agents,defaults:{...defaults,model:{...typeof existingModel==`object`?existingModel:void 0,primary:existingPrimary??resolvedKey,fallbacks}}}}}export{promptModelAllowlist as a,applyOpenAICodexModelDefault as c,promptDefaultModel as i,applyAgentDefaultPrimaryModel as l,applyModelFallbacksFromSelection as n,promptAndConfigureVllm as o,applyPrimaryModel as r,OPENAI_CODEX_DEFAULT_MODEL as s,applyModelAllowlist as t};
|