@seanhogg/builderforce-agents 2026.10.12 → 2026.10.13
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/{agent-DvDtjczG.js → agent-CeWx2EpQ.js} +1 -1
- package/dist/{agent-DiLX8OzY.js → agent-DrcnpqOF.js} +1 -1
- package/dist/{agents-BawpdEjP.js → agents-CRJM6qhK.js} +1 -1
- package/dist/{agents-COWLUJqm.js → agents-hATFRfwk.js} +1 -1
- package/dist/{audio-preflight-CYQiI74L.js → audio-preflight-B9CfGDD2.js} +1 -1
- package/dist/{audio-preflight-BN1u9Tpc.js → audio-preflight-DHHeocUj.js} +1 -1
- package/dist/{auth-choice-D9VN-WjA.js → auth-choice-CWbPLRN0.js} +1 -1
- package/dist/{auth-choice-3cdcHeim.js → auth-choice-CzhKgWJy.js} +1 -1
- package/dist/{auth-choice.apply-Cd0RR0Z-.js → auth-choice.apply-C0RTYtRN.js} +1 -1
- package/dist/{auth-choice.apply-CMDgoDNN.js → auth-choice.apply-ChrTTHkK.js} +1 -1
- package/dist/{auth-choice.apply-BAeGyEKW.js → auth-choice.apply-D4LYzI8l.js} +1 -1
- package/dist/{auth-choice.apply-CSXvPCea.js → auth-choice.apply-Dy4rVG6K.js} +1 -1
- package/dist/{auth-choice.apply.transformers-DkX2-OZa.js → auth-choice.apply.transformers-9v6HFzNs.js} +1 -1
- package/dist/{auth-choice.apply.transformers-CEVxl3ul.js → auth-choice.apply.transformers-Be8599JD.js} +1 -1
- package/dist/{auth-choice.apply.transformers-B2Nr9M7m.js → auth-choice.apply.transformers-CgfGlqy1.js} +1 -1
- package/dist/{auth-choice.apply.transformers-Dpy9gODo.js → auth-choice.apply.transformers-D9a8-sLS.js} +1 -1
- package/dist/{banner-C93QSUTe.js → banner-8F7-gU1V.js} +1 -1
- package/dist/build-info.json +3 -3
- package/dist/{builderforce-Dl4bZ63C.js → builderforce-CCfM1c79.js} +1 -1
- package/dist/{builderforce-C_tuO46t.js → builderforce-CImLd8Zo.js} +1 -1
- package/dist/bundled/boot-md/handler.js +1 -1
- package/dist/bundled/session-memory/handler.js +1 -1
- package/dist/{channel-options-CiYpNR-1.js → channel-options-CRng-5hZ.js} +1 -1
- package/dist/{channel-options-Cziy0WDc.js → channel-options-D5kOIN7b.js} +1 -1
- package/dist/{channel-web-Ae15MleJ.js → channel-web-B5HSpL4k.js} +1 -1
- package/dist/{channels-cli-CZM033Me.js → channels-cli-COl9TDHT.js} +1 -1
- package/dist/{channels-cli-yi1vxpvO.js → channels-cli-bR8QwOv3.js} +1 -1
- package/dist/chrome-ChzFLAeJ.js +4 -0
- package/dist/chrome-CrqJ4Ijz.js +4 -0
- package/dist/{cli-Bwv_-VuS.js → cli-BqJMHFNK.js} +1 -1
- package/dist/{cli-D8fndSEi.js → cli-DBn0qbHS.js} +1 -1
- package/dist/{command-registry-Cjom5ab0.js → command-registry-BqhtXJa7.js} +1 -1
- package/dist/{command-registry-8uEx2JjY.js → command-registry-DVH79C3B.js} +1 -1
- package/dist/{completion-cli-PTFpWp8Q.js → completion-cli-BFR0u1Uh.js} +1 -1
- package/dist/{completion-cli-LUuqgvVQ.js → completion-cli-BuUAEqQw.js} +1 -1
- package/dist/{completion-cli-DRsz70D2.js → completion-cli-CwaIh4zw.js} +1 -1
- package/dist/{completion-cli-BsXDz7T2.js → completion-cli-Da3-oE7r.js} +1 -1
- package/dist/{config-cli-BIx0enD5.js → config-cli-Bhrj7H1i.js} +1 -1
- package/dist/{config-cli-BFhOXrua.js → config-cli-DOHKZ1lO.js} +1 -1
- package/dist/{configure-D96xLIb6.js → configure-B-Yta1X3.js} +1 -1
- package/dist/{configure-S7YE6hn1.js → configure-BHVk4Ax9.js} +1 -1
- package/dist/{configure-dDKfCq_g.js → configure-D9YZEK_D.js} +1 -1
- package/dist/{configure-C7xdw9Kq.js → configure-DPE2hDzY.js} +1 -1
- package/dist/{deps-CGiO_NDu.js → deps-CrAVOWsA.js} +1 -1
- package/dist/{doctor-completion-ChhIrLd3.js → doctor-completion-CkjrUmbI.js} +1 -1
- package/dist/{doctor-completion-BUZwWoWB.js → doctor-completion-Dh9ah5lH.js} +1 -1
- package/dist/{embedded-DJYMy81Q.js → embedded-BrqzM5oT.js} +12 -12
- package/dist/{embedded-DjDnQMNx.js → embedded-wYxo-ADm.js} +12 -12
- package/dist/entry.js +1 -1
- package/dist/extensionAPI.js +1 -1
- package/dist/{gateway-cli-CN114d5j.js → gateway-cli-C2nh9UyY.js} +2 -2
- package/dist/{gateway-cli-Dzl70YBF.js → gateway-cli-CGkTLhet.js} +2 -2
- package/dist/{health-Cf1YoTRN.js → health-CEz2-7et.js} +1 -1
- package/dist/{health-AlkF1nUa.js → health-CFVx21sO.js} +1 -1
- package/dist/{health-ySVOGGNu.js → health-aKuq4xwa.js} +1 -1
- package/dist/{hooks-cli-6jeFEGg3.js → hooks-cli-DPSrycwI.js} +1 -1
- package/dist/{hooks-cli-DVPMCXUq.js → hooks-cli-uPHs7qnC.js} +1 -1
- package/dist/index.js +2 -2
- package/dist/llm-slug-generator.js +1 -1
- package/dist/{models-CGUxphfN.js → models--TwKHn8b.js} +1 -1
- package/dist/{models-CIMM_Z3u.js → models-BXJebxTU.js} +1 -1
- package/dist/{models-cli-Cijh2uON.js → models-cli-O1zCgeoA.js} +1 -1
- package/dist/{models-cli-Oys3e_I3.js → models-cli-iKu1IVeH.js} +1 -1
- package/dist/{onboard-DAEXNhNd.js → onboard--0I8pdee.js} +1 -1
- package/dist/{onboard-b2fWbf0Q.js → onboard-C40OvMZO.js} +1 -1
- package/dist/{onboard-channels-elaccQRE.js → onboard-channels-BbpyejX4.js} +1 -1
- package/dist/{onboard-channels-Bsd11scA.js → onboard-channels-CoJnsCfd.js} +1 -1
- package/dist/{onboard-channels-C_Q7OUow.js → onboard-channels-ZI4QC9WU.js} +1 -1
- package/dist/{onboard-channels-Tl1X4Pl_.js → onboard-channels-uvIeLPXK.js} +1 -1
- package/dist/{onboard-interactive-DyGNiYRI.js → onboard-interactive-B3Z0XLT6.js} +1 -1
- package/dist/{onboard-interactive-C0qmgHsH.js → onboard-interactive-CJdxqQ1b.js} +1 -1
- package/dist/{onboard-interactive-86s992_v.js → onboard-interactive-COnCCTTW.js} +1 -1
- package/dist/{onboard-interactive-CvMSTjPK.js → onboard-interactive-jss8R9r9.js} +1 -1
- package/dist/{onboarding-DzvbhsaR.js → onboarding-B1BmYWrs.js} +2 -2
- package/dist/{onboarding-B0tbaqZ7.js → onboarding-CdRbvLgp.js} +2 -2
- package/dist/{onboarding.finalize-D-Pi9Blv.js → onboarding.finalize-B0AjF6qZ.js} +1 -1
- package/dist/{onboarding.finalize-CERLBlRF.js → onboarding.finalize-WsL-ijTc.js} +1 -1
- package/dist/{outbound-send-deps-CzhBrVa7.js → outbound-send-deps-DuML6h7r.js} +1 -1
- package/dist/{plugin-registry-DtrHn5NR.js → plugin-registry-BjWNyeVY.js} +1 -1
- package/dist/{plugin-registry-Avx51RIY.js → plugin-registry-Cf_sv-ny.js} +1 -1
- package/dist/{plugin-registry-CFkQDTOt.js → plugin-registry-DdFb5usc.js} +1 -1
- package/dist/{plugin-registry-BEmyRfmb.js → plugin-registry-DrEpL5ac.js} +1 -1
- package/dist/plugin-sdk/{accounts-BwreSNAR.js → accounts-Cy3WCbWg.js} +1 -1
- package/dist/plugin-sdk/{active-listener-DpQ7aGYd.js → active-listener-DVWVNlT9.js} +1 -1
- package/dist/plugin-sdk/agent-runtime/src/agents/tool-retry.d.ts +40 -32
- package/dist/plugin-sdk/agent-runtime/src/builderforce/model/agent-types.d.ts +6 -0
- package/dist/plugin-sdk/{agent-scope-BQByW0cD.js → agent-scope-DgKN27hJ.js} +1 -1
- package/dist/plugin-sdk/{api-key-rotation-yqTCeKjV.js → api-key-rotation-D37jV9ZW.js} +1 -1
- package/dist/plugin-sdk/{audio-preflight-B6uTvVfA.js → audio-preflight-D4xyO8Zq.js} +1 -1
- package/dist/plugin-sdk/{auth-json-Dw6ij9Pa.js → auth-json-nASe57Uw.js} +1 -1
- package/dist/plugin-sdk/{bindings-CDEzl4kl.js → bindings-CH-YLOLC.js} +1 -1
- package/dist/plugin-sdk/{channel-web-DKbpA9xC.js → channel-web-huZSNTX3.js} +1 -1
- package/dist/plugin-sdk/{chrome-DriEqJRH.js → chrome-CRUzg3kA.js} +1 -1
- package/dist/plugin-sdk/{chunk-cW0POl22.js → chunk-C94IAOuf.js} +1 -1
- package/dist/plugin-sdk/{command-format-CAX9XFjI.js → command-format-B3XMq_73.js} +1 -1
- package/dist/plugin-sdk/{common-BxEWhN2X.js → common-n0l_XN-S.js} +1 -1
- package/dist/plugin-sdk/{config-3vPn_hmp.js → config--Ci8Y91R.js} +2 -2
- package/dist/plugin-sdk/{fetch-DH0Y8iyO.js → fetch-B-GxSYRO.js} +1 -1
- package/dist/plugin-sdk/index.js +1 -1
- package/dist/plugin-sdk/{login-Dhdx0bVL.js → login-DZliYZg8.js} +1 -1
- package/dist/plugin-sdk/{login-qr-DAjOuijP.js → login-qr-DKcGvAjv.js} +1 -1
- package/dist/plugin-sdk/{manager-i8psl2Er.js → manager-DioOqJm_.js} +1 -1
- package/dist/plugin-sdk/{markdown-tables-Epim9b-0.js → markdown-tables-BUfhHgfs.js} +1 -1
- package/dist/plugin-sdk/{message-channel-sBPQc_-T.js → message-channel-CuZ2xOAM.js} +1 -1
- package/dist/plugin-sdk/{model-catalog-COVRezOQ.js → model-catalog-DIQ5a-o4.js} +1 -1
- package/dist/plugin-sdk/{model-selection-Crz-xYNU.js → model-selection-_H_U9jWH.js} +1 -1
- package/dist/plugin-sdk/{outbound-CPutSvae.js → outbound-Djibdmi7.js} +1 -1
- package/dist/plugin-sdk/{plugins-CaUOZBVb.js → plugins-BdkC9v5E.js} +1 -1
- package/dist/plugin-sdk/{pw-ai-jI9AWvKe.js → pw-ai-Bbi8Us-p.js} +1 -1
- package/dist/plugin-sdk/{qmd-manager-BRe5fGZw.js → qmd-manager-Dxn0jCpE.js} +1 -1
- package/dist/plugin-sdk/{registry-DJq2Cvo9.js → registry-CZHRcH-q.js} +1 -1
- package/dist/plugin-sdk/{render-BUCRXPIk.js → render-CuA_WRX5.js} +1 -1
- package/dist/plugin-sdk/{replies-CYjI7bye.js → replies-Cf69aZLA.js} +1 -1
- package/dist/plugin-sdk/{reply-B5o-SSYy.js → reply-BOVC-7UD.js} +13 -13
- package/dist/plugin-sdk/{reply-prefix-CCymsmsP.js → reply-prefix-w7kAvH11.js} +1 -1
- package/dist/plugin-sdk/{resolve-route-DN1J7Wyc.js → resolve-route-0sbvl4ZN.js} +1 -1
- package/dist/plugin-sdk/{runner-C2pDJlRw.js → runner-DKoKK09-.js} +4 -4
- package/dist/plugin-sdk/{session-BnleckVX.js → session-DGLuyt10.js} +1 -1
- package/dist/plugin-sdk/{sqlite-BlMLqMl8.js → sqlite-JjFgDV-H.js} +1 -1
- package/dist/plugin-sdk/{subsystem-COTa5Ly_.js → subsystem-D0Ril4rt.js} +1 -1
- package/dist/plugin-sdk/{tool-images-DSpchb4x.js → tool-images-WRTP95FT.js} +1 -1
- package/dist/plugin-sdk/{tool-loop-detection-16p7mJ8N.js → tool-loop-detection-g8gPTCgJ.js} +1 -1
- package/dist/plugin-sdk/web-Cdu8TkUy.js +1 -0
- package/dist/plugin-sdk/{whatsapp-actions-C2B3iw8n.js → whatsapp-actions-CsSzy7G0.js} +1 -1
- package/dist/{plugins-DAlgx58e.js → plugins-Dr1wmnAf.js} +1 -1
- package/dist/{plugins-De7aK3yK.js → plugins-JhEblShx.js} +1 -1
- package/dist/{plugins-cli-CwdUVWjG.js → plugins-cli-DW4hoeeV.js} +1 -1
- package/dist/{plugins-cli-CfVCrrhx.js → plugins-cli-GewV3E8e.js} +1 -1
- package/dist/{program-CFL6mW3l.js → program-bggmBKuL.js} +2 -2
- package/dist/{program-context-DP4Xq9zC.js → program-context-BCTE8zEF.js} +1 -1
- package/dist/{prompt-select-styled-NxrGT7OR.js → prompt-select-styled-BtjhlTEH.js} +1 -1
- package/dist/{prompt-select-styled-Csz9HlSx.js → prompt-select-styled-CaNl41mG.js} +1 -1
- package/dist/{provider-auth-helpers-BMBw21Tn.js → provider-auth-helpers-CWUfg9zf.js} +1 -1
- package/dist/{provider-auth-helpers-VWPvSXPH.js → provider-auth-helpers-y1X8xKVE.js} +1 -1
- package/dist/{provider-dispatcher-CSOHd9zJ.js → provider-dispatcher-CRsPmKhJ.js} +1 -1
- package/dist/{provider-dispatcher-Bg9orQPy.js → provider-dispatcher-D9GbE_Ce.js} +1 -1
- package/dist/{push-apns-rMu8MKXi.js → push-apns-Cb1sQEEa.js} +1 -1
- package/dist/{push-apns-ep5WkyGz.js → push-apns-Cr-6aD3y.js} +1 -1
- package/dist/{pw-ai-UXo3gDGy.js → pw-ai-CG-kY5NP.js} +1 -1
- package/dist/{pw-ai-CIN6tj0G.js → pw-ai-DcZPg2vm.js} +1 -1
- package/dist/{register.agent-BynXVz7v.js → register.agent-B33EZBoL.js} +1 -1
- package/dist/{register.agent-RNVNKBP3.js → register.agent-DfYqZls1.js} +1 -1
- package/dist/{register.configure-BdqREs1-.js → register.configure-CREcJhKA.js} +1 -1
- package/dist/{register.configure-DDrvpBnA.js → register.configure-D8an7wc5.js} +1 -1
- package/dist/{register.maintenance-DT6t7mD_.js → register.maintenance-D84M5XLR.js} +1 -1
- package/dist/{register.maintenance-BSKHOCTV.js → register.maintenance-Dnp_Ii2x.js} +1 -1
- package/dist/{register.message-7KIfSUxS.js → register.message-B6E0uAEu.js} +1 -1
- package/dist/{register.message-DDhEvcaX.js → register.message-WOWC4tyf.js} +1 -1
- package/dist/{register.onboard-CKhooa7L.js → register.onboard-AgVEhehS.js} +1 -1
- package/dist/{register.onboard-CswvuzLx.js → register.onboard-Cwozk0Tx.js} +1 -1
- package/dist/{register.setup-1BmR-qlh.js → register.setup-BKyCvo9_.js} +1 -1
- package/dist/{register.setup-CivwfXf_.js → register.setup-C9IeGiAd.js} +1 -1
- package/dist/{register.status-health-sessions-CLdHZiJm.js → register.status-health-sessions-CYZctjpx.js} +1 -1
- package/dist/{register.status-health-sessions-BXpljfv3.js → register.status-health-sessions-CcL6srRC.js} +1 -1
- package/dist/{register.subclis-D_fHb-Aj.js → register.subclis-AFsfDByV.js} +1 -1
- package/dist/{register.subclis-CTTxdHaJ.js → register.subclis-C0DxtuRO.js} +1 -1
- package/dist/{reply-D9wUWhMx.js → reply-BuUSdq2L.js} +9 -9
- package/dist/{run-main-DNyQhVQT.js → run-main-CgJMiKPV.js} +1 -1
- package/dist/{runner-BNnckkaT.js → runner-C8oNv-9y.js} +3 -3
- package/dist/{runner-EHybuAt7.js → runner-nDoIXX7n.js} +3 -3
- package/dist/{server-node-events-BGrnw4ZT.js → server-node-events-BMsKmU5S.js} +1 -1
- package/dist/{server-node-events-D4WVcVHy.js → server-node-events-fS8TluXq.js} +1 -1
- package/dist/{session-dirs-eNN7E3kA.js → session-dirs-Bkfs-7vN.js} +1 -1
- package/dist/{session-dirs-C-pVBwSV.js → session-dirs-rYDCA_mQ.js} +1 -1
- package/dist/{status-Demw1HZ7.js → status-Ad1eFPKR.js} +1 -1
- package/dist/{status-CBieo24v.js → status-BMzVz5KY.js} +1 -1
- package/dist/{status-rkFgCaBM.js → status-CXRyaGws.js} +1 -1
- package/dist/{status-wTMmjZ7M.js → status-DpEUFAMk.js} +1 -1
- package/dist/{status-BhJw9Htq.js → status-oaiZkYBt.js} +1 -1
- package/dist/{subagent-registry-Bje3RAgk.js → subagent-registry-gVTWLPpL.js} +1 -1
- package/dist/{subagent-registry-B0kpBIxD.js → subagent-registry-hM0OCDzv.js} +1 -1
- package/dist/{subagent-registry-Cj5yC7B4.js → subagent-registry-m_x-JRkR.js} +9 -9
- package/dist/{tui-BCtecmPL.js → tui-HTtOgZ_X.js} +2 -2
- package/dist/{tui-BqHLI73U.js → tui-LemSel3H.js} +2 -2
- package/dist/{tui-cli-2R0xjpqW.js → tui-cli-BpzicV5H.js} +1 -1
- package/dist/{tui-cli-Dvd8BwzD.js → tui-cli-CruoIP1K.js} +1 -1
- package/dist/{update-cli-DUObGvw1.js → update-cli-Wa-nZ_Lq.js} +1 -1
- package/dist/{update-cli-Bt7Vfi7c.js → update-cli-zv67YxK1.js} +1 -1
- package/dist/{web--KblE8ax.js → web-BrsbhB1i.js} +1 -1
- package/dist/{web-C-yTnRvS.js → web-BzkO4Pbe.js} +1 -1
- package/dist/{web-0VRcRcFj.js → web-D_QYY7Gt.js} +1 -1
- package/dist/{web-BcUIWAAJ.js → web-jPbmSTQm.js} +1 -1
- package/package.json +1 -1
- package/dist/chrome-CmCESKt9.js +0 -4
- package/dist/chrome-D6qk0wxW.js +0 -4
- package/dist/plugin-sdk/web-CzJYJZZs.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as readCredsJsonRaw,h as resolveWebCredsPath,l as maybeRestoreCredsFromBackup,m as resolveWebCredsBackupPath,p as resolveDefaultWebAuthDir}from"./accounts-
|
|
1
|
+
import{d as readCredsJsonRaw,h as resolveWebCredsPath,l as maybeRestoreCredsFromBackup,m as resolveWebCredsBackupPath,p as resolveDefaultWebAuthDir}from"./accounts-Cy3WCbWg.js";import{K as success,Z as getChildLogger,b as ensureDir,j as resolveUserPath,nt as toPinoLikeLogger,z as danger}from"./registry-CZHRcH-q.js";import{E as VERSION}from"./config--Ci8Y91R.js";import{t as formatCliCommand}from"./command-format-B3XMq_73.js";import fs from"node:fs";import"node:crypto";import{DisconnectReason,fetchLatestBaileysVersion,makeCacheableSignalKeyStore,makeWASocket,useMultiFileAuthState}from"@whiskeysockets/baileys";import qrcode from"qrcode-terminal";let credsSaveQueue=Promise.resolve();function enqueueSaveCreds(authDir,saveCreds,logger){credsSaveQueue=credsSaveQueue.then(()=>safeSaveCreds(authDir,saveCreds,logger)).catch(err=>{logger.warn({error:String(err)},`WhatsApp creds save queue error`)})}async function safeSaveCreds(authDir,saveCreds,logger){try{let credsPath=resolveWebCredsPath(authDir),backupPath=resolveWebCredsBackupPath(authDir),raw=readCredsJsonRaw(credsPath);if(raw)try{JSON.parse(raw),fs.copyFileSync(credsPath,backupPath);try{fs.chmodSync(backupPath,384)}catch{}}catch{}}catch{}try{await Promise.resolve(saveCreds());try{fs.chmodSync(resolveWebCredsPath(authDir),384)}catch{}}catch(err){logger.warn({error:String(err)},`failed saving WhatsApp creds`)}}async function createWaSocket(printQr,verbose,opts={}){let logger=toPinoLikeLogger(getChildLogger({module:`baileys`},{level:verbose?`info`:`silent`}),verbose?`info`:`silent`),authDir=resolveUserPath(opts.authDir??resolveDefaultWebAuthDir());await ensureDir(authDir);let sessionLogger=getChildLogger({module:`web-session`});maybeRestoreCredsFromBackup(authDir);let{state,saveCreds}=await useMultiFileAuthState(authDir),{version}=await fetchLatestBaileysVersion(),sock=makeWASocket({auth:{creds:state.creds,keys:makeCacheableSignalKeyStore(state.keys,logger)},version,logger,printQRInTerminal:!1,browser:[`builderforce`,`cli`,VERSION],syncFullHistory:!1,markOnlineOnConnect:!1});return sock.ev.on(`creds.update`,()=>enqueueSaveCreds(authDir,saveCreds,sessionLogger)),sock.ev.on(`connection.update`,update=>{try{let{connection,lastDisconnect,qr}=update;qr&&(opts.onQr?.(qr),printQr&&(console.log(`Scan this QR in WhatsApp (Linked Devices):`),qrcode.generate(qr,{small:!0}))),connection===`close`&&getStatusCode(lastDisconnect?.error)===DisconnectReason.loggedOut&&console.error(danger(`WhatsApp session logged out. Run: ${formatCliCommand(`builderforce channels login`)}`)),connection===`open`&&verbose&&console.log(success(`WhatsApp Web connected.`))}catch(err){sessionLogger.error({error:String(err)},`connection.update handler error`)}}),sock.ws&&typeof sock.ws.on==`function`&&sock.ws.on(`error`,err=>{sessionLogger.error({error:String(err)},`WebSocket error`)}),sock}async function waitForWaConnection(sock){return new Promise((resolve,reject)=>{let evWithOff=sock.ev,handler=(...args)=>{let update=args[0]??{};update.connection===`open`&&(evWithOff.off?.(`connection.update`,handler),resolve()),update.connection===`close`&&(evWithOff.off?.(`connection.update`,handler),reject(update.lastDisconnect??Error(`Connection closed`)))};sock.ev.on(`connection.update`,handler)})}function getStatusCode(err){return err?.output?.statusCode??err?.status}function safeStringify(value,limit=800){try{let seen=new WeakSet,raw=JSON.stringify(value,(_key,v)=>{if(typeof v==`bigint`)return v.toString();if(typeof v==`function`){let maybeName=v.name;return`[Function ${typeof maybeName==`string`&&maybeName.length>0?maybeName:`anonymous`}]`}if(typeof v==`object`&&v){if(seen.has(v))return`[Circular]`;seen.add(v)}return v},2);return raw?raw.length>limit?`${raw.slice(0,limit)}…`:raw:String(value)}catch{return String(value)}}function extractBoomDetails(err){if(!err||typeof err!=`object`)return null;let output=err?.output;if(!output||typeof output!=`object`)return null;let payload=output.payload,statusCode=typeof output.statusCode==`number`?output.statusCode:typeof payload?.statusCode==`number`?payload.statusCode:void 0,error=typeof payload?.error==`string`?payload.error:void 0,message=typeof payload?.message==`string`?payload.message:void 0;return!statusCode&&!error&&!message?null:{statusCode,error,message}}function formatError(err){if(err instanceof Error)return err.message;if(typeof err==`string`)return err;if(!err||typeof err!=`object`)return String(err);let boom=extractBoomDetails(err)??extractBoomDetails(err?.error)??extractBoomDetails(err?.lastDisconnect?.error),status=boom?.statusCode??getStatusCode(err),code=err?.code,codeText=typeof code==`string`||typeof code==`number`?String(code):void 0,message=[boom?.message,typeof err?.message==`string`?err.message:void 0,typeof err?.error?.message==`string`?err.error?.message:void 0].filter(v=>!!(v&&v.trim().length>0))[0],pieces=[];return typeof status==`number`&&pieces.push(`status=${status}`),boom?.error&&pieces.push(boom.error),message&&pieces.push(message),codeText&&pieces.push(`code=${codeText}`),pieces.length>0?pieces.join(` `):safeStringify(err)}export{waitForWaConnection as i,formatError as n,getStatusCode as r,createWaSocket as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{t as createSubsystemLogger}from"./subsystem-
|
|
1
|
+
import{t as createSubsystemLogger}from"./subsystem-D0Ril4rt.js";import{C as resolveWorkspaceFilePath,S as resolveAgentRuntimeDir}from"./agent-scope-DgKN27hJ.js";import{t as redactSensitiveText}from"./redact-Bv8wnIZm.js";import{o as resolveSessionTranscriptsDirForAgent}from"./paths-DtbnCdO7.js";import{createRequire}from"node:module";import path from"node:path";import fs from"node:fs";import crypto from"node:crypto";import fs$1 from"node:fs/promises";async function runTasksWithConcurrency(params){let{tasks,limit,onTaskError}=params,errorMode=params.errorMode??`continue`;if(tasks.length===0)return{results:[],firstError:void 0,hasError:!1};let resolvedLimit=Math.max(1,Math.min(limit,tasks.length)),results=Array.from({length:tasks.length}),next=0,firstError,hasError=!1,workers=Array.from({length:resolvedLimit},async()=>{for(;;){if(errorMode===`stop`&&hasError)return;let index=next;if(next+=1,index>=tasks.length)return;try{results[index]=await tasks[index]()}catch(error){if(hasError||=(firstError=error,!0),onTaskError?.(error,index),errorMode===`stop`)return}}});return await Promise.allSettled(workers),{results,firstError,hasError}}function ensureDir(dir){try{fs.mkdirSync(dir,{recursive:!0})}catch{}return dir}function normalizeRelPath(value){return value.trim().replace(/^[./]+/,``).replace(/\\/g,`/`)}function normalizeExtraMemoryPaths(workspaceDir,extraPaths){if(!extraPaths?.length)return[];let resolved=extraPaths.map(value=>value.trim()).filter(Boolean).map(value=>path.isAbsolute(value)?path.resolve(value):path.resolve(workspaceDir,value));return Array.from(new Set(resolved))}function getLegacyMemoryDir(workspaceDir){return path.join(workspaceDir,`memory`)}function getCanonicalMemoryDir(workspaceDir){return path.join(resolveAgentRuntimeDir(workspaceDir),`memory`)}function getDefaultMemoryDirs(workspaceDir){return[getLegacyMemoryDir(workspaceDir),getCanonicalMemoryDir(workspaceDir)]}function getDefaultMemoryFilePaths(workspaceDir){return[resolveWorkspaceFilePath(workspaceDir,`MEMORY.md`),resolveWorkspaceFilePath(workspaceDir,`memory.md`)]}function getDefaultMemoryWatchPatterns(workspaceDir){let files=getDefaultMemoryFilePaths(workspaceDir),dirs=getDefaultMemoryDirs(workspaceDir),patterns=[];patterns.push(...files);for(let d of dirs)patterns.push(path.join(d,`**`,`*.md`));return patterns}function isMemoryPath(relPath){let normalized=normalizeRelPath(relPath);return normalized?normalized===`MEMORY.md`||normalized===`memory.md`?!0:normalized===`memory`||normalized.startsWith(`memory/`)||normalized.startsWith(`.builderforce/memory/`):!1}async function walkDir(dir,files){let entries=await fs$1.readdir(dir,{withFileTypes:!0});for(let entry of entries){let full=path.join(dir,entry.name);if(!entry.isSymbolicLink()){if(entry.isDirectory()){await walkDir(full,files);continue}entry.isFile()&&entry.name.endsWith(`.md`)&&files.push(full)}}}async function listMemoryFiles(workspaceDir,extraPaths){let result=[],[memoryFile,altMemoryFile]=getDefaultMemoryFilePaths(workspaceDir),[legacyDir,canonicalDir]=getDefaultMemoryDirs(workspaceDir),addMarkdownFile=async absPath=>{try{let stat=await fs$1.lstat(absPath);if(stat.isSymbolicLink()||!stat.isFile()||!absPath.endsWith(`.md`))return;result.push(absPath)}catch{}};await addMarkdownFile(memoryFile),await addMarkdownFile(altMemoryFile);let dirsToScan=[legacyDir,canonicalDir];for(let dir of dirsToScan)try{let dirStat=await fs$1.lstat(dir);!dirStat.isSymbolicLink()&&dirStat.isDirectory()&&await walkDir(dir,result)}catch{}let normalizedExtraPaths=normalizeExtraMemoryPaths(workspaceDir,extraPaths);if(normalizedExtraPaths.length>0)for(let inputPath of normalizedExtraPaths)try{let stat=await fs$1.lstat(inputPath);if(stat.isSymbolicLink())continue;if(stat.isDirectory()){await walkDir(inputPath,result);continue}stat.isFile()&&inputPath.endsWith(`.md`)&&result.push(inputPath)}catch{}if(result.length<=1)return result;let seen=new Set,deduped=[];for(let entry of result){let key=entry;try{key=await fs$1.realpath(entry)}catch{}seen.has(key)||(seen.add(key),deduped.push(entry))}return deduped}function hashText(value){return crypto.createHash(`sha256`).update(value).digest(`hex`)}async function buildFileEntry(absPath,workspaceDir){let stat=await fs$1.stat(absPath),hash=hashText(await fs$1.readFile(absPath,`utf-8`));return{path:path.relative(workspaceDir,absPath).replace(/\\/g,`/`),absPath,mtimeMs:stat.mtimeMs,size:stat.size,hash}}function chunkMarkdown(content,chunking){let lines=content.split(`
|
|
2
2
|
`);if(lines.length===0)return[];let maxChars=Math.max(32,chunking.tokens*4),overlapChars=Math.max(0,chunking.overlap*4),chunks=[],current=[],currentChars=0,flush=()=>{if(current.length===0)return;let firstEntry=current[0],lastEntry=current[current.length-1];if(!firstEntry||!lastEntry)return;let text=current.map(entry=>entry.line).join(`
|
|
3
3
|
`),startLine=firstEntry.lineNo,endLine=lastEntry.lineNo;chunks.push({startLine,endLine,text,hash:hashText(text)})},carryOverlap=()=>{if(overlapChars<=0||current.length===0){current=[],currentChars=0;return}let acc=0,kept=[];for(let i=current.length-1;i>=0;--i){let entry=current[i];if(entry&&(acc+=entry.line.length+1,kept.unshift(entry),acc>=overlapChars))break}current=kept,currentChars=kept.reduce((sum,entry)=>sum+entry.line.length+1,0)};for(let i=0;i<lines.length;i+=1){let line=lines[i]??``,lineNo=i+1,segments=[];if(line.length===0)segments.push(``);else for(let start=0;start<line.length;start+=maxChars)segments.push(line.slice(start,start+maxChars));for(let segment of segments){let lineSize=segment.length+1;currentChars+lineSize>maxChars&¤t.length>0&&(flush(),carryOverlap()),current.push({line:segment,lineNo}),currentChars+=lineSize}}return flush(),chunks}function remapChunkLines(chunks,lineMap){if(!(!lineMap||lineMap.length===0))for(let chunk of chunks)chunk.startLine=lineMap[chunk.startLine-1]??chunk.startLine,chunk.endLine=lineMap[chunk.endLine-1]??chunk.endLine}function parseEmbedding(raw){try{let parsed=JSON.parse(raw);return Array.isArray(parsed)?parsed:[]}catch{return[]}}async function runWithConcurrency(tasks,limit){let{results,firstError,hasError}=await runTasksWithConcurrency({tasks,limit,errorMode:`stop`});if(hasError)throw firstError;return results}const log=createSubsystemLogger(`memory`);async function listSessionFilesForAgent(agentId){let dir=resolveSessionTranscriptsDirForAgent(agentId);try{return(await fs$1.readdir(dir,{withFileTypes:!0})).filter(entry=>entry.isFile()).map(entry=>entry.name).filter(name=>name.endsWith(`.jsonl`)).map(name=>path.join(dir,name))}catch{return[]}}function sessionPathForFile(absPath){return path.join(`sessions`,path.basename(absPath)).replace(/\\/g,`/`)}function normalizeSessionText(value){return value.replace(/\s*\n+\s*/g,` `).replace(/\s+/g,` `).trim()}function extractSessionText(content){if(typeof content==`string`)return normalizeSessionText(content)||null;if(!Array.isArray(content))return null;let parts=[];for(let block of content){if(!block||typeof block!=`object`)continue;let record=block;if(record.type!==`text`||typeof record.text!=`string`)continue;let normalized=normalizeSessionText(record.text);normalized&&parts.push(normalized)}return parts.length===0?null:parts.join(` `)}async function buildSessionEntry(absPath){try{let stat=await fs$1.stat(absPath),lines=(await fs$1.readFile(absPath,`utf-8`)).split(`
|
|
4
4
|
`),collected=[],lineMap=[];for(let jsonlIdx=0;jsonlIdx<lines.length;jsonlIdx++){let line=lines[jsonlIdx];if(!line.trim())continue;let record;try{record=JSON.parse(line)}catch{continue}if(!record||typeof record!=`object`||record.type!==`message`)continue;let message=record.message;if(!message||typeof message.role!=`string`||message.role!==`user`&&message.role!==`assistant`)continue;let text=extractSessionText(message.content);if(!text)continue;let safe=redactSensitiveText(text,{mode:`tools`}),label=message.role===`user`?`User`:`Assistant`;collected.push(`${label}: ${safe}`),lineMap.push(jsonlIdx+1)}let content=collected.join(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as isFileLogLevelEnabled,V as isVerbose,Z as getChildLogger,at as normalizeLogLevel,it as levelToMinLevel,n as CHAT_CHANNEL_ORDER,ot as readLoggingConfig,rt as loggingState}from"./registry-
|
|
1
|
+
import{$ as isFileLogLevelEnabled,V as isVerbose,Z as getChildLogger,at as normalizeLogLevel,it as levelToMinLevel,n as CHAT_CHANNEL_ORDER,ot as readLoggingConfig,rt as loggingState}from"./registry-CZHRcH-q.js";import{createRequire}from"node:module";import{Chalk}from"chalk";import"node:util";let activeStream=null;function registerActiveProgressLine(stream){stream.isTTY&&(activeStream=stream)}function clearActiveProgressLine(){activeStream?.isTTY&&activeStream.write(`\r\x1B[2K`)}function unregisterActiveProgressLine(stream){activeStream&&(stream&&activeStream!==stream||(activeStream=null))}function reportRestoreFailure(scope,err,reason){let suffix=reason?` (${reason})`:``,message=`[terminal] restore ${scope} failed${suffix}: ${String(err)}`;try{process.stderr.write(`${message}\n`)}catch(writeErr){console.error(`[terminal] restore reporting failed${suffix}: ${String(writeErr)}`)}}function restoreTerminalState(reason,options={}){let resumeStdin=options.resumeStdinIfPaused??options.resumeStdin??!1;try{clearActiveProgressLine()}catch(err){reportRestoreFailure(`progress line`,err,reason)}let stdin=process.stdin;if(stdin.isTTY&&typeof stdin.setRawMode==`function`){try{stdin.setRawMode(!1)}catch(err){reportRestoreFailure(`raw mode`,err,reason)}if(resumeStdin&&typeof stdin.isPaused==`function`&&stdin.isPaused())try{stdin.resume()}catch(err){reportRestoreFailure(`stdin resume`,err,reason)}}if(process.stdout.isTTY)try{process.stdout.write(`\x1B[0m\x1B[?25h\x1B[?1000l\x1B[?1002l\x1B[?1003l\x1B[?1006l\x1B[?2004l`)}catch(err){reportRestoreFailure(`stdout reset`,err,reason)}}function shouldEmitRuntimeLog(env=process.env){return env.VITEST!==`true`||env.BUILDERFORCE_AGENTS_TEST_RUNTIME_LOG===`1`?!0:typeof console.log.mock==`object`}function createRuntimeIo(){return{log:(...args)=>{shouldEmitRuntimeLog()&&(clearActiveProgressLine(),console.log(...args))},error:(...args)=>{clearActiveProgressLine(),console.error(...args)}}}const defaultRuntime={...createRuntimeIo(),exit:code=>{throw restoreTerminalState(`runtime exit`,{resumeStdinIfPaused:!1}),process.exit(code),Error(`unreachable`)}};function createNonExitingRuntime(){return{...createRuntimeIo(),exit:code=>{throw Error(`exit ${code}`)}}}const ANSI_SGR_PATTERN=`\\x1b\\[[0-9;]*m`,OSC8_PATTERN=`\\x1b\\]8;;.*?\\x1b\\\\|\\x1b\\]8;;\\x1b\\\\`,ANSI_REGEX=new RegExp(ANSI_SGR_PATTERN,`g`),OSC8_REGEX=new RegExp(OSC8_PATTERN,`g`);function stripAnsi(input){return input.replace(OSC8_REGEX,``).replace(ANSI_REGEX,``)}RegExp(`${OSC8_PATTERN}|${ANSI_SGR_PATTERN}`,`g`);const requireConfig=createRequire(import.meta.url);let loadConfigFallback=()=>{try{return requireConfig(`../config/config.js`).loadConfig?.().logging}catch{return}};function normalizeConsoleLevel(level){return isVerbose()?`debug`:!level&&process.env.VITEST===`true`&&process.env.BUILDERFORCE_AGENTS_TEST_CONSOLE!==`1`?`silent`:normalizeLogLevel(level,`info`)}function normalizeConsoleStyle(style){return style===`compact`||style===`json`||style===`pretty`?style:process.stdout.isTTY?`pretty`:`compact`}function resolveConsoleSettings(){let cfg=loggingState.overrideSettings??readLoggingConfig();if(!cfg)if(loggingState.resolvingConsoleSettings)cfg=void 0;else{loggingState.resolvingConsoleSettings=!0;try{cfg=loadConfigFallback()}finally{loggingState.resolvingConsoleSettings=!1}}return{level:normalizeConsoleLevel(cfg?.consoleLevel),style:normalizeConsoleStyle(cfg?.consoleStyle)}}function consoleSettingsChanged(a,b){return a?a.level!==b.level||a.style!==b.style:!0}function getConsoleSettings(){let settings=resolveConsoleSettings(),cached=loggingState.cachedConsoleSettings;return(!cached||consoleSettingsChanged(cached,settings))&&(loggingState.cachedConsoleSettings=settings),loggingState.cachedConsoleSettings}function shouldLogSubsystemToConsole(subsystem){let filter=loggingState.consoleSubsystemFilter;return!filter||filter.length===0?!0:filter.some(prefix=>subsystem===prefix||subsystem.startsWith(`${prefix}/`))}function shouldLogToConsole(level,settings){return settings.level===`silent`?!1:levelToMinLevel(level)<=levelToMinLevel(settings.level)}function isRichConsoleEnv(){let term=(process.env.TERM??``).toLowerCase();return process.env.COLORTERM||process.env.TERM_PROGRAM?!0:term.length>0&&term!==`dumb`}function getColorForConsole(){let hasForceColor=typeof process.env.FORCE_COLOR==`string`&&process.env.FORCE_COLOR.trim().length>0&&process.env.FORCE_COLOR.trim()!==`0`;return process.env.NO_COLOR&&!hasForceColor?new Chalk({level:0}):process.stdout.isTTY||process.stderr.isTTY||isRichConsoleEnv()?new Chalk({level:1}):new Chalk({level:0})}const SUBSYSTEM_COLORS=[`cyan`,`green`,`yellow`,`blue`,`magenta`,`red`],SUBSYSTEM_COLOR_OVERRIDES={"gmail-watcher":`blue`},SUBSYSTEM_PREFIXES_TO_DROP=[`gateway`,`channels`,`providers`],CHANNEL_SUBSYSTEM_PREFIXES=new Set(CHAT_CHANNEL_ORDER);function pickSubsystemColor(color,subsystem){let override=SUBSYSTEM_COLOR_OVERRIDES[subsystem];if(override)return color[override];let hash=0;for(let i=0;i<subsystem.length;i+=1)hash=hash*31+subsystem.charCodeAt(i)|0;return color[SUBSYSTEM_COLORS[Math.abs(hash)%SUBSYSTEM_COLORS.length]]}function formatSubsystemForConsole(subsystem){let parts=subsystem.split(`/`).filter(Boolean),original=parts.join(`/`)||subsystem;for(;parts.length>0&&SUBSYSTEM_PREFIXES_TO_DROP.includes(parts[0]);)parts.shift();return parts.length===0?original:CHANNEL_SUBSYSTEM_PREFIXES.has(parts[0])?parts[0]:parts.length>2?parts.slice(-2).join(`/`):parts.join(`/`)}function stripRedundantSubsystemPrefixForConsole(message,displaySubsystem){if(!displaySubsystem)return message;if(message.startsWith(`[`)){let closeIdx=message.indexOf(`]`);if(closeIdx>1&&message.slice(1,closeIdx).toLowerCase()===displaySubsystem.toLowerCase()){let i=closeIdx+1;for(;message[i]===` `;)i+=1;return message.slice(i)}}if(message.slice(0,displaySubsystem.length).toLowerCase()!==displaySubsystem.toLowerCase())return message;let next=message.slice(displaySubsystem.length,displaySubsystem.length+1);if(next!==`:`&&next!==` `)return message;let i=displaySubsystem.length;for(;message[i]===` `;)i+=1;for(message[i]===`:`&&(i+=1);message[i]===` `;)i+=1;return message.slice(i)}function formatConsoleLine(opts){let displaySubsystem=opts.style===`json`?opts.subsystem:formatSubsystemForConsole(opts.subsystem);if(opts.style===`json`)return JSON.stringify({time:new Date().toISOString(),level:opts.level,subsystem:displaySubsystem,message:opts.message,...opts.meta});let color=getColorForConsole(),prefix=`[${displaySubsystem}]`,prefixColor=pickSubsystemColor(color,displaySubsystem),levelColor=opts.level===`error`||opts.level===`fatal`?color.red:opts.level===`warn`?color.yellow:opts.level===`debug`||opts.level===`trace`?color.gray:color.cyan,displayMessage=stripRedundantSubsystemPrefixForConsole(opts.message,displaySubsystem);return`${[opts.style===`pretty`?color.gray(new Date().toISOString().slice(11,19)):loggingState.consoleTimestampPrefix?color.gray(new Date().toISOString()):``,prefixColor(prefix)].filter(Boolean).join(` `)} ${levelColor(displayMessage)}`}function writeConsoleLine(level,line){clearActiveProgressLine();let sanitized=process.platform===`win32`&&process.env.GITHUB_ACTIONS===`true`?line.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,`?`).replace(/[\uD800-\uDFFF]/g,`?`):line,sink=loggingState.rawConsole??console;loggingState.forceConsoleToStderr||level===`error`||level===`fatal`?(sink.error??console.error)(sanitized):level===`warn`?(sink.warn??console.warn)(sanitized):(sink.log??console.log)(sanitized)}function logToFile(fileLogger,level,message,meta){if(level===`silent`)return;let method=fileLogger[level];typeof method==`function`&&(meta&&Object.keys(meta).length>0?method.call(fileLogger,meta,message):method.call(fileLogger,message))}function createSubsystemLogger(subsystem){let fileLogger=null,getFileLogger=()=>(fileLogger||=getChildLogger({subsystem}),fileLogger),emit=(level,message,meta)=>{let consoleSettings=getConsoleSettings(),consoleMessageOverride,fileMeta=meta;if(meta&&Object.keys(meta).length>0){let{consoleMessage,...rest}=meta;typeof consoleMessage==`string`&&(consoleMessageOverride=consoleMessage),fileMeta=Object.keys(rest).length>0?rest:void 0}if(logToFile(getFileLogger(),level,message,fileMeta),!shouldLogToConsole(level,{level:consoleSettings.level})||!shouldLogSubsystemToConsole(subsystem))return;let consoleMessage=consoleMessageOverride??message;!isVerbose()&&subsystem===`agent/embedded`&&/(sessionId|runId)=probe-/.test(consoleMessage)||writeConsoleLine(level,formatConsoleLine({level,subsystem,message:consoleSettings.style===`json`?message:consoleMessage,style:consoleSettings.style,meta:fileMeta}))},isConsoleEnabled=level=>shouldLogToConsole(level,{level:getConsoleSettings().level})&&shouldLogSubsystemToConsole(subsystem),isFileEnabled=level=>isFileLogLevelEnabled(level);return{subsystem,isEnabled:(level,target=`any`)=>target===`console`?isConsoleEnabled(level):target===`file`?isFileEnabled(level):isConsoleEnabled(level)||isFileEnabled(level),trace:(message,meta)=>emit(`trace`,message,meta),debug:(message,meta)=>emit(`debug`,message,meta),info:(message,meta)=>emit(`info`,message,meta),warn:(message,meta)=>emit(`warn`,message,meta),error:(message,meta)=>emit(`error`,message,meta),fatal:(message,meta)=>emit(`fatal`,message,meta),raw:message=>{if(logToFile(getFileLogger(),`info`,message,{raw:!0}),shouldLogSubsystemToConsole(subsystem)){if(!isVerbose()&&subsystem===`agent/embedded`&&/(sessionId|runId)=probe-/.test(message))return;writeConsoleLine(`info`,message)}},child:name=>createSubsystemLogger(`${subsystem}/${name}`)}}export{clearActiveProgressLine as a,defaultRuntime as i,stripAnsi as n,registerActiveProgressLine as o,createNonExitingRuntime as r,unregisterActiveProgressLine as s,createSubsystemLogger as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as resizeToJpeg,d as IMAGE_REDUCE_QUALITY_STEPS,f as buildImageResizeSideGrid,m as getImageMetadata}from"./fetch-
|
|
1
|
+
import{_ as resizeToJpeg,d as IMAGE_REDUCE_QUALITY_STEPS,f as buildImageResizeSideGrid,m as getImageMetadata}from"./fetch-B-GxSYRO.js";import{t as createSubsystemLogger}from"./subsystem-D0Ril4rt.js";function resolveImageSanitizationLimits(cfg){let configured=cfg?.agents?.defaults?.imageMaxDimensionPx;return typeof configured!=`number`||!Number.isFinite(configured)?{}:{maxDimensionPx:Math.max(1,Math.floor(configured))}}const log=createSubsystemLogger(`agents/tool-images`);function isImageBlock(block){if(!block||typeof block!=`object`)return!1;let rec=block;return rec.type===`image`&&typeof rec.data==`string`&&typeof rec.mimeType==`string`}function isTextBlock(block){if(!block||typeof block!=`object`)return!1;let rec=block;return rec.type===`text`&&typeof rec.text==`string`}function inferMimeTypeFromBase64(base64){let trimmed=base64.trim();if(trimmed){if(trimmed.startsWith(`/9j/`))return`image/jpeg`;if(trimmed.startsWith(`iVBOR`))return`image/png`;if(trimmed.startsWith(`R0lGOD`))return`image/gif`}}function formatBytesShort(bytes){return!Number.isFinite(bytes)||bytes<1024?`${Math.max(0,Math.round(bytes))}B`:bytes<1024*1024?`${(bytes/1024).toFixed(1)}KB`:`${(bytes/(1024*1024)).toFixed(2)}MB`}async function resizeImageBase64IfNeeded(params){let buf=Buffer.from(params.base64,`base64`),meta=await getImageMetadata(buf),width=meta?.width,height=meta?.height,overBytes=buf.byteLength>params.maxBytes,hasDimensions=typeof width==`number`&&typeof height==`number`,overDimensions=hasDimensions&&(width>params.maxDimensionPx||height>params.maxDimensionPx);if(hasDimensions&&!overBytes&&width<=params.maxDimensionPx&&height<=params.maxDimensionPx)return{base64:params.base64,mimeType:params.mimeType,resized:!1,width,height};let maxDim=hasDimensions?Math.max(width??0,height??0):params.maxDimensionPx,sideStart=maxDim>0?Math.min(params.maxDimensionPx,maxDim):params.maxDimensionPx,sideGrid=buildImageResizeSideGrid(params.maxDimensionPx,sideStart),smallest=null;for(let side of sideGrid)for(let quality of IMAGE_REDUCE_QUALITY_STEPS){let out=await resizeToJpeg({buffer:buf,maxSide:side,quality,withoutEnlargement:!0});if((!smallest||out.byteLength<smallest.size)&&(smallest={buffer:out,size:out.byteLength}),out.byteLength<=params.maxBytes){let sourcePixels=typeof width==`number`&&typeof height==`number`?`${width}x${height}px`:`unknown`,byteReductionPct=buf.byteLength>0?Number(((buf.byteLength-out.byteLength)/buf.byteLength*100).toFixed(1)):0;return log.info(`Image resized to fit limits: ${sourcePixels} ${formatBytesShort(buf.byteLength)} -> ${formatBytesShort(out.byteLength)} (-${byteReductionPct}%)`,{label:params.label,sourceMimeType:params.mimeType,sourceWidth:width,sourceHeight:height,sourceBytes:buf.byteLength,maxBytes:params.maxBytes,maxDimensionPx:params.maxDimensionPx,triggerOverBytes:overBytes,triggerOverDimensions:overDimensions,outputMimeType:`image/jpeg`,outputBytes:out.byteLength,outputQuality:quality,outputMaxSide:side,byteReductionPct}),{base64:out.toString(`base64`),mimeType:`image/jpeg`,resized:!0,width,height}}}let best=smallest?.buffer??buf,maxMb=(params.maxBytes/(1024*1024)).toFixed(0),gotMb=(best.byteLength/(1024*1024)).toFixed(2),sourcePixels=typeof width==`number`&&typeof height==`number`?`${width}x${height}px`:`unknown`;throw log.warn(`Image resize failed to fit limits: ${sourcePixels} best=${formatBytesShort(best.byteLength)} limit=${formatBytesShort(params.maxBytes)}`,{label:params.label,sourceMimeType:params.mimeType,sourceWidth:width,sourceHeight:height,sourceBytes:buf.byteLength,maxDimensionPx:params.maxDimensionPx,maxBytes:params.maxBytes,smallestCandidateBytes:best.byteLength,triggerOverBytes:overBytes,triggerOverDimensions:overDimensions}),Error(`Image could not be reduced below ${maxMb}MB (got ${gotMb}MB)`)}async function sanitizeContentBlocksImages(blocks,label,opts={}){let maxDimensionPx=Math.max(opts.maxDimensionPx??1200,1),maxBytes=Math.max(opts.maxBytes??5242880,1),out=[];for(let block of blocks){if(!isImageBlock(block)){out.push(block);continue}let data=block.data.trim();if(!data){out.push({type:`text`,text:`[${label}] omitted empty image payload`});continue}try{let mimeType=inferMimeTypeFromBase64(data)??block.mimeType,resized=await resizeImageBase64IfNeeded({base64:data,mimeType,maxDimensionPx,maxBytes,label});out.push({...block,data:resized.base64,mimeType:resized.resized?resized.mimeType:mimeType})}catch(err){out.push({type:`text`,text:`[${label}] omitted image payload: ${String(err)}`})}}return out}async function sanitizeImageBlocks(images,label,opts={}){if(images.length===0)return{images,dropped:0};let next=(await sanitizeContentBlocksImages(images,label,opts)).filter(isImageBlock);return{images:next,dropped:Math.max(0,images.length-next.length)}}async function sanitizeToolResultImages(result,label,opts={}){let content=Array.isArray(result.content)?result.content:[];if(!content.some(b=>isImageBlock(b)||isTextBlock(b)))return result;let next=await sanitizeContentBlocksImages(content,label,opts);return{...result,content:next}}export{resolveImageSanitizationLimits as i,sanitizeImageBlocks as n,sanitizeToolResultImages as r,sanitizeContentBlocksImages as t};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{C as isPlainObject}from"./registry-
|
|
1
|
+
import{C as isPlainObject}from"./registry-CZHRcH-q.js";import"./paths-Cb8zTlyG.js";import{t as createSubsystemLogger}from"./subsystem-D0Ril4rt.js";import{t as stableStringify}from"./src-5XE2oMwl.js";import{createHash}from"node:crypto";const log=createSubsystemLogger(`agents/loop-detection`),DEFAULT_LOOP_DETECTION_CONFIG={enabled:!1,historySize:30,warningThreshold:10,criticalThreshold:20,globalCircuitBreakerThreshold:30,detectors:{genericRepeat:!0,knownPollNoProgress:!0,pingPong:!0}};function asPositiveInt(value,fallback){return typeof value!=`number`||!Number.isInteger(value)||value<=0?fallback:value}function resolveLoopDetectionConfig(config){let warningThreshold=asPositiveInt(config?.warningThreshold,DEFAULT_LOOP_DETECTION_CONFIG.warningThreshold),criticalThreshold=asPositiveInt(config?.criticalThreshold,DEFAULT_LOOP_DETECTION_CONFIG.criticalThreshold),globalCircuitBreakerThreshold=asPositiveInt(config?.globalCircuitBreakerThreshold,DEFAULT_LOOP_DETECTION_CONFIG.globalCircuitBreakerThreshold);return criticalThreshold<=warningThreshold&&(criticalThreshold=warningThreshold+1),globalCircuitBreakerThreshold<=criticalThreshold&&(globalCircuitBreakerThreshold=criticalThreshold+1),{enabled:config?.enabled??DEFAULT_LOOP_DETECTION_CONFIG.enabled,historySize:asPositiveInt(config?.historySize,DEFAULT_LOOP_DETECTION_CONFIG.historySize),warningThreshold,criticalThreshold,globalCircuitBreakerThreshold,detectors:{genericRepeat:config?.detectors?.genericRepeat??DEFAULT_LOOP_DETECTION_CONFIG.detectors.genericRepeat,knownPollNoProgress:config?.detectors?.knownPollNoProgress??DEFAULT_LOOP_DETECTION_CONFIG.detectors.knownPollNoProgress,pingPong:config?.detectors?.pingPong??DEFAULT_LOOP_DETECTION_CONFIG.detectors.pingPong}}}function hashToolCall(toolName,params){return`${toolName}:${digestStable(params)}`}function digestStable(value){let serialized=stableStringifyFallback(value);return createHash(`sha256`).update(serialized).digest(`hex`)}function stableStringifyFallback(value){try{return stableStringify(value)}catch{return value==null?`${value}`:typeof value==`string`?value:typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?`${value}`:value instanceof Error?`${value.name}:${value.message}`:Object.prototype.toString.call(value)}}function isKnownPollToolCall(toolName,params){if(toolName===`command_status`)return!0;if(toolName!==`process`||!isPlainObject(params))return!1;let action=params.action;return action===`poll`||action===`log`}function extractTextContent(result){return!isPlainObject(result)||!Array.isArray(result.content)?``:result.content.filter(entry=>isPlainObject(entry)&&typeof entry.type==`string`&&typeof entry.text==`string`).map(entry=>entry.text).join(`
|
|
2
2
|
`).trim()}function formatErrorForHash(error){return error instanceof Error?error.message||error.name:typeof error==`string`?error:typeof error==`number`||typeof error==`boolean`||typeof error==`bigint`?`${error}`:stableStringify(error)}function hashToolOutcome(toolName,params,result,error){if(error!==void 0)return`error:${digestStable(formatErrorForHash(error))}`;if(!isPlainObject(result))return result===void 0?void 0:digestStable(result);let details=isPlainObject(result.details)?result.details:{},text=extractTextContent(result);if(isKnownPollToolCall(toolName,params)&&toolName===`process`&&isPlainObject(params)){let action=params.action;if(action===`poll`)return digestStable({action,status:details.status,exitCode:details.exitCode??null,exitSignal:details.exitSignal??null,aggregated:details.aggregated??null,text});if(action===`log`)return digestStable({action,status:details.status,totalLines:details.totalLines??null,totalChars:details.totalChars??null,truncated:details.truncated??null,exitCode:details.exitCode??null,exitSignal:details.exitSignal??null,text})}return digestStable({details,text})}function getNoProgressStreak(history,toolName,argsHash){let streak=0,latestResultHash;for(let i=history.length-1;i>=0;--i){let record=history[i];if(!(!record||record.toolName!==toolName||record.argsHash!==argsHash)&&!(typeof record.resultHash!=`string`||!record.resultHash)){if(!latestResultHash){latestResultHash=record.resultHash,streak=1;continue}if(record.resultHash!==latestResultHash)break;streak+=1}}return{count:streak,latestResultHash}}function getPingPongStreak(history,currentSignature){let last=history.at(-1);if(!last)return{count:0,noProgressEvidence:!1};let otherSignature,otherToolName;for(let i=history.length-2;i>=0;--i){let call=history[i];if(call&&call.argsHash!==last.argsHash){otherSignature=call.argsHash,otherToolName=call.toolName;break}}if(!otherSignature||!otherToolName)return{count:0,noProgressEvidence:!1};let alternatingTailCount=0;for(let i=history.length-1;i>=0;--i){let call=history[i];if(!call)continue;let expected=alternatingTailCount%2==0?last.argsHash:otherSignature;if(call.argsHash!==expected)break;alternatingTailCount+=1}if(alternatingTailCount<2||currentSignature!==otherSignature)return{count:0,noProgressEvidence:!1};let tailStart=Math.max(0,history.length-alternatingTailCount),firstHashA,firstHashB,noProgressEvidence=!0;for(let i=tailStart;i<history.length;i+=1){let call=history[i];if(call){if(!call.resultHash){noProgressEvidence=!1;break}if(call.argsHash===last.argsHash){if(!firstHashA)firstHashA=call.resultHash;else if(firstHashA!==call.resultHash){noProgressEvidence=!1;break}continue}if(call.argsHash===otherSignature){if(!firstHashB)firstHashB=call.resultHash;else if(firstHashB!==call.resultHash){noProgressEvidence=!1;break}continue}noProgressEvidence=!1;break}}return(!firstHashA||!firstHashB)&&(noProgressEvidence=!1),{count:alternatingTailCount+1,pairedToolName:last.toolName,pairedSignature:last.argsHash,noProgressEvidence}}function canonicalPairKey(signatureA,signatureB){return[signatureA,signatureB].toSorted().join(`|`)}function detectToolCallLoop(state,toolName,params,config){let resolvedConfig=resolveLoopDetectionConfig(config);if(!resolvedConfig.enabled)return{stuck:!1};let history=state.toolCallHistory??[],currentHash=hashToolCall(toolName,params),noProgress=getNoProgressStreak(history,toolName,currentHash),noProgressStreak=noProgress.count,knownPollTool=isKnownPollToolCall(toolName,params),pingPong=getPingPongStreak(history,currentHash);if(noProgressStreak>=resolvedConfig.globalCircuitBreakerThreshold)return log.error(`Global circuit breaker triggered: ${toolName} repeated ${noProgressStreak} times with no progress`),{stuck:!0,level:`critical`,detector:`global_circuit_breaker`,count:noProgressStreak,message:`CRITICAL: ${toolName} has repeated identical no-progress outcomes ${noProgressStreak} times. Session execution blocked by global circuit breaker to prevent runaway loops.`,warningKey:`global:${toolName}:${currentHash}:${noProgress.latestResultHash??`none`}`};if(knownPollTool&&resolvedConfig.detectors.knownPollNoProgress&&noProgressStreak>=resolvedConfig.criticalThreshold)return log.error(`Critical polling loop detected: ${toolName} repeated ${noProgressStreak} times`),{stuck:!0,level:`critical`,detector:`known_poll_no_progress`,count:noProgressStreak,message:`CRITICAL: Called ${toolName} with identical arguments and no progress ${noProgressStreak} times. This appears to be a stuck polling loop. Session execution blocked to prevent resource waste.`,warningKey:`poll:${toolName}:${currentHash}:${noProgress.latestResultHash??`none`}`};if(knownPollTool&&resolvedConfig.detectors.knownPollNoProgress&&noProgressStreak>=resolvedConfig.warningThreshold)return log.warn(`Polling loop warning: ${toolName} repeated ${noProgressStreak} times`),{stuck:!0,level:`warning`,detector:`known_poll_no_progress`,count:noProgressStreak,message:`WARNING: You have called ${toolName} ${noProgressStreak} times with identical arguments and no progress. Stop polling and either (1) increase wait time between checks, or (2) report the task as failed if the process is stuck.`,warningKey:`poll:${toolName}:${currentHash}:${noProgress.latestResultHash??`none`}`};let pingPongWarningKey=pingPong.pairedSignature?`pingpong:${canonicalPairKey(currentHash,pingPong.pairedSignature)}`:`pingpong:${toolName}:${currentHash}`;if(resolvedConfig.detectors.pingPong&&pingPong.count>=resolvedConfig.criticalThreshold&&pingPong.noProgressEvidence)return log.error(`Critical ping-pong loop detected: alternating calls count=${pingPong.count} currentTool=${toolName}`),{stuck:!0,level:`critical`,detector:`ping_pong`,count:pingPong.count,message:`CRITICAL: You are alternating between repeated tool-call patterns (${pingPong.count} consecutive calls) with no progress. This appears to be a stuck ping-pong loop. Session execution blocked to prevent resource waste.`,pairedToolName:pingPong.pairedToolName,warningKey:pingPongWarningKey};if(resolvedConfig.detectors.pingPong&&pingPong.count>=resolvedConfig.warningThreshold)return log.warn(`Ping-pong loop warning: alternating calls count=${pingPong.count} currentTool=${toolName}`),{stuck:!0,level:`warning`,detector:`ping_pong`,count:pingPong.count,message:`WARNING: You are alternating between repeated tool-call patterns (${pingPong.count} consecutive calls). This looks like a ping-pong loop; stop retrying and report the task as failed.`,pairedToolName:pingPong.pairedToolName,warningKey:pingPongWarningKey};let recentCount=history.filter(h=>h.toolName===toolName&&h.argsHash===currentHash).length;return!knownPollTool&&resolvedConfig.detectors.genericRepeat&&recentCount>=resolvedConfig.warningThreshold?(log.warn(`Loop warning: ${toolName} called ${recentCount} times with identical arguments`),{stuck:!0,level:`warning`,detector:`generic_repeat`,count:recentCount,message:`WARNING: You have called ${toolName} ${recentCount} times with identical arguments. If this is not making progress, stop retrying and report the task as failed.`,warningKey:`generic:${toolName}:${currentHash}`}):{stuck:!1}}function recordToolCall(state,toolName,params,toolCallId,config){let resolvedConfig=resolveLoopDetectionConfig(config);state.toolCallHistory||=[],state.toolCallHistory.push({toolName,argsHash:hashToolCall(toolName,params),toolCallId,timestamp:Date.now()}),state.toolCallHistory.length>resolvedConfig.historySize&&state.toolCallHistory.shift()}function recordToolCallOutcome(state,params){let resolvedConfig=resolveLoopDetectionConfig(params.config),resultHash=hashToolOutcome(params.toolName,params.toolParams,params.result,params.error);if(!resultHash)return;state.toolCallHistory||=[];let argsHash=hashToolCall(params.toolName,params.toolParams),matched=!1;for(let i=state.toolCallHistory.length-1;i>=0;--i){let call=state.toolCallHistory[i];if(call&&!(params.toolCallId&&call.toolCallId!==params.toolCallId)&&!(call.toolName!==params.toolName||call.argsHash!==argsHash)&&call.resultHash===void 0){call.resultHash=resultHash,matched=!0;break}}matched||state.toolCallHistory.push({toolName:params.toolName,argsHash,toolCallId:params.toolCallId,resultHash,timestamp:Date.now()}),state.toolCallHistory.length>resolvedConfig.historySize&&state.toolCallHistory.splice(0,state.toolCallHistory.length-resolvedConfig.historySize)}export{detectToolCallLoop,recordToolCall,recordToolCallOutcome};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./session-key-5J69DULS.js";import{a as WA_WEB_AUTH_DIR,g as webAuthExists,s as logWebSelfId,u as pickWebChannel}from"./accounts-Cy3WCbWg.js";import"./reply-BOVC-7UD.js";import"./registry-CZHRcH-q.js";import"./paths-Cb8zTlyG.js";import"./model-selection-_H_U9jWH.js";import"./config--Ci8Y91R.js";import"./fetch-B-GxSYRO.js";import"./subsystem-D0Ril4rt.js";import"./agent-scope-DgKN27hJ.js";import"./tool-images-WRTP95FT.js";import"./common-n0l_XN-S.js";import"./replies-Cf69aZLA.js";import"./reply-prefix-w7kAvH11.js";import"./runner-DKoKK09-.js";import"./redact-Bv8wnIZm.js";import"./errors-L3rugjUL.js";import"./chrome-CRUzg3kA.js";import"./command-format-B3XMq_73.js";import"./plugins-BdkC9v5E.js";import"./bindings-CH-YLOLC.js";import"./message-channel-CuZ2xOAM.js";import"./src-5XE2oMwl.js";import"./paths-DtbnCdO7.js";import"./api-key-rotation-D37jV9ZW.js";import"./active-listener-DVWVNlT9.js";import"./render-CuA_WRX5.js";import"./chunk-C94IAOuf.js";import"./manager-DioOqJm_.js";import"./markdown-tables-BUfhHgfs.js";import{n as monitorWebInbox,t as monitorWebChannel}from"./channel-web-huZSNTX3.js";import"./model-catalog-DIQ5a-o4.js";import"./sqlite-JjFgDV-H.js";import"./resolve-route-0sbvl4ZN.js";import{n as sendMessageWhatsApp}from"./outbound-Djibdmi7.js";import{i as waitForWaConnection,t as createWaSocket}from"./session-DGLuyt10.js";import{t as loginWeb}from"./login-DZliYZg8.js";export{WA_WEB_AUTH_DIR,createWaSocket,logWebSelfId,loginWeb,monitorWebChannel,monitorWebInbox,pickWebChannel,sendMessageWhatsApp,waitForWaConnection,webAuthExists};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./session-key-5J69DULS.js";import"./accounts-
|
|
1
|
+
import"./session-key-5J69DULS.js";import"./accounts-Cy3WCbWg.js";import"./registry-CZHRcH-q.js";import"./paths-Cb8zTlyG.js";import"./model-selection-_H_U9jWH.js";import"./config--Ci8Y91R.js";import"./fetch-B-GxSYRO.js";import"./subsystem-D0Ril4rt.js";import"./agent-scope-DgKN27hJ.js";import"./tool-images-WRTP95FT.js";import{a as jsonResult,n as createActionGate,s as readReactionParams,u as readStringParam}from"./common-n0l_XN-S.js";import"./command-format-B3XMq_73.js";import"./plugins-BdkC9v5E.js";import"./bindings-CH-YLOLC.js";import"./message-channel-CuZ2xOAM.js";import"./src-5XE2oMwl.js";import"./active-listener-DVWVNlT9.js";import"./render-CuA_WRX5.js";import"./chunk-C94IAOuf.js";import"./markdown-tables-BUfhHgfs.js";import{r as sendReactionWhatsApp}from"./outbound-Djibdmi7.js";async function handleWhatsAppAction(params,cfg){let action=readStringParam(params,`action`,{required:!0}),isActionEnabled=createActionGate(cfg.channels?.whatsapp?.actions);if(action===`react`){if(!isActionEnabled(`reactions`))throw Error(`WhatsApp reactions are disabled.`);let chatJid=readStringParam(params,`chatJid`,{required:!0}),messageId=readStringParam(params,`messageId`,{required:!0}),{emoji,remove,isEmpty}=readReactionParams(params,{removeErrorMessage:`Emoji is required to remove a WhatsApp reaction.`}),participant=readStringParam(params,`participant`),accountId=readStringParam(params,`accountId`),fromMeRaw=params.fromMe;return await sendReactionWhatsApp(chatJid,messageId,remove?``:emoji,{verbose:!1,fromMe:typeof fromMeRaw==`boolean`?fromMeRaw:void 0,participant:participant??void 0,accountId:accountId??void 0}),jsonResult(!remove&&!isEmpty?{ok:!0,added:emoji}:{ok:!0,removed:!0})}throw Error(`Unsupported WhatsApp action: ${action}`)}export{handleWhatsAppAction};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./reply-
|
|
1
|
+
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./reply-BuUSdq2L.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"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import{n as listChannelPlugins}from"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./bindings-DR59065T.js";import"./send-CVgJk5kN.js";export{listChannelPlugins};
|
|
@@ -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"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./subagent-registry-
|
|
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"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./subagent-registry-m_x-JRkR.js";import{n as listChannelPlugins}from"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-DPRTlcZh.js";export{listChannelPlugins};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{B as theme,C as shortenHomePath,S as shortenHomeInString,_ as resolveConfigDir,b as resolveUserPath}from"./utils-DbaBVFaK.js";import"./embedded-helpers-2fP2Yq8h.js";import"./reply-
|
|
1
|
+
import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{B as theme,C as shortenHomePath,S as shortenHomeInString,_ as resolveConfigDir,b as resolveUserPath}from"./utils-DbaBVFaK.js";import"./embedded-helpers-2fP2Yq8h.js";import"./reply-BuUSdq2L.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-Doyvd4lU.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-BifagO7i.js";import{c as writeConfigFile,r as loadConfig}from"./io-BNtgT4VB.js";import{a as resolveBundledPluginsDir,d as applyExclusiveSlotSelection,f as defaultSlotIdForKey,t as clearPluginManifestRegistryCache}from"./manifest-registry-BJCfNV1a.js";import"./config-BD801bpx.js";import"./runner-C3k1sKdu.js";import"./model-catalog-BoiWqBTw.js";import"./sandbox-1jtP0nhr.js";import"./chrome-Bfprrnm1.js";import{u as promptYesNo}from"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DKdrUePN.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-CRrqIFJR.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-BPr0-lkT.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-l9WWK31e.js";import"./send-CVgJk5kN.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-Yn3MpU4F.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-Dbbjk8CQ.js";import"./with-timeout-CPd4-suw.js";import"./deliver-BiGCWHvZ.js";import"./send-CRSlal5z.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import"./memory-cli-D-Khe5Ij.js";import"./manager-DNIg84rj.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-CJq3iGqu.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-Cp4LMft_.js";import"./send-D_6wd5Y3.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-C8gtsUDG.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import"./resolve-route-D49haUnv.js";import"./replies-DAwcEPGb.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-COe2xa9K.js";import"./send-BIMaIwQV.js";import"./onboard-helpers-BmYUjl4j.js";import"./prompt-style-BpVK43GK.js";import"./pairing-labels-CD0lPAfY.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-QGVVADJa.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-BLpMH93w.js";import"./control-service-DKBAemtq.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-BQuRdgMU.js";import"./transformers-stream-D7nRu4Qu.js";import{c as resolveArchiveKind}from"./install-safe-path-DsLq2BUJ.js";import"./npm-registry-spec-DIW6RsGN.js";import"./skill-scanner-BUNvEK3Z.js";import{i as resolvePluginInstallDir,n as installPluginFromNpmSpec,r as installPluginFromPath,t as recordPluginInstall}from"./installs-ZToTbCYE.js";import{t as renderTable}from"./table-BoCHYKoQ.js";import{t as buildPluginStatusReport}from"./status-Ad1eFPKR.js";import{n as updateNpmInstalledPlugins}from"./update-DYT58zGp.js";import fs from"node:fs";import os from"node:os";import path from"node:path";import fs$1 from"node:fs/promises";function tryRelative(root,filePath){let rel=path.relative(root,filePath);return!rel||rel===`.`||rel===`..`||rel.startsWith(`..${path.sep}`)||rel.startsWith(`../`)||rel.startsWith(`..\\`)||path.isAbsolute(rel)?null:rel.replaceAll(`\\`,`/`)}function resolvePluginSourceRoots(params){return{stock:resolveBundledPluginsDir(),global:path.join(resolveConfigDir(),`extensions`),workspace:params.workspaceDir?path.join(params.workspaceDir,`.builderforce`,`extensions`):void 0}}function formatPluginSourceForTable(plugin,roots){let raw=plugin.source;if(plugin.origin===`bundled`&&roots.stock){let rel=tryRelative(roots.stock,raw);if(rel)return{value:`stock:${rel}`,rootKey:`stock`}}if(plugin.origin===`workspace`&&roots.workspace){let rel=tryRelative(roots.workspace,raw);if(rel)return{value:`workspace:${rel}`,rootKey:`workspace`}}if(plugin.origin===`global`&&roots.global){let rel=tryRelative(roots.global,raw);if(rel)return{value:`global:${rel}`,rootKey:`global`}}return{value:shortenHomeInString(raw)}}function resolveUninstallDirectoryTarget(params){if(!params.hasInstall||params.installRecord?.source===`path`)return null;let defaultPath;try{defaultPath=resolvePluginInstallDir(params.pluginId,params.extensionsDir)}catch{return null}let configuredPath=params.installRecord?.installPath;return configuredPath&&path.resolve(configuredPath)===path.resolve(defaultPath)?configuredPath:defaultPath}function removePluginFromConfig(cfg,pluginId){let actions={entry:!1,install:!1,allowlist:!1,loadPath:!1,memorySlot:!1},pluginsConfig=cfg.plugins??{},entries=pluginsConfig.entries;if(entries&&pluginId in entries){let{[pluginId]:_,...rest}=entries;entries=Object.keys(rest).length>0?rest:void 0,actions.entry=!0}let installs=pluginsConfig.installs,installRecord=installs?.[pluginId];if(installs&&pluginId in installs){let{[pluginId]:_,...rest}=installs;installs=Object.keys(rest).length>0?rest:void 0,actions.install=!0}let allow=pluginsConfig.allow;Array.isArray(allow)&&allow.includes(pluginId)&&(allow=allow.filter(id=>id!==pluginId),allow.length===0&&(allow=void 0),actions.allowlist=!0);let load=pluginsConfig.load;if(installRecord?.source===`path`&&installRecord.sourcePath){let sourcePath=installRecord.sourcePath,loadPaths=load?.paths;if(Array.isArray(loadPaths)&&loadPaths.includes(sourcePath)){let nextLoadPaths=loadPaths.filter(p=>p!==sourcePath);load=nextLoadPaths.length>0?{...load,paths:nextLoadPaths}:void 0,actions.loadPath=!0}}let slots=pluginsConfig.slots;slots?.memory===pluginId&&(slots={...slots,memory:defaultSlotIdForKey(`memory`)},actions.memorySlot=!0),slots&&Object.keys(slots).length===0&&(slots=void 0);let cleanedPlugins={...pluginsConfig,entries,installs,allow,load,slots};return cleanedPlugins.entries===void 0&&delete cleanedPlugins.entries,cleanedPlugins.installs===void 0&&delete cleanedPlugins.installs,cleanedPlugins.allow===void 0&&delete cleanedPlugins.allow,cleanedPlugins.load===void 0&&delete cleanedPlugins.load,cleanedPlugins.slots===void 0&&delete cleanedPlugins.slots,{config:{...cfg,plugins:Object.keys(cleanedPlugins).length>0?cleanedPlugins:void 0},actions}}async function uninstallPlugin(params){let{config,pluginId,deleteFiles=!0,extensionsDir}=params,hasEntry=pluginId in(config.plugins?.entries??{}),hasInstall=pluginId in(config.plugins?.installs??{});if(!hasEntry&&!hasInstall)return{ok:!1,error:`Plugin not found: ${pluginId}`};let installRecord=config.plugins?.installs?.[pluginId],isLinked=installRecord?.source===`path`,{config:newConfig,actions:configActions}=removePluginFromConfig(config,pluginId),actions={...configActions,directory:!1},warnings=[],deleteTarget=deleteFiles&&!isLinked?resolveUninstallDirectoryTarget({pluginId,hasInstall,installRecord,extensionsDir}):null;if(deleteTarget){let existed=await fs$1.access(deleteTarget).then(()=>!0).catch(()=>!1)??!1;try{await fs$1.rm(deleteTarget,{recursive:!0,force:!0}),actions.directory=existed}catch(error){warnings.push(`Failed to remove plugin directory ${deleteTarget}: ${error instanceof Error?error.message:String(error)}`)}}return{ok:!0,config:newConfig,pluginId,actions,warnings}}function resolveFileNpmSpecToLocalPath(raw){let trimmed=raw.trim();if(!trimmed.toLowerCase().startsWith(`file:`))return null;let rest=trimmed.slice(5);return rest?rest.startsWith(`///`)?{ok:!0,path:rest.slice(2)}:rest.startsWith(`//localhost/`)?{ok:!0,path:rest.slice(11)}:rest.startsWith(`//`)?{ok:!1,error:`unsupported file: URL host (expected "file:<path>" or "file:///abs/path")`}:{ok:!0,path:rest}:{ok:!1,error:`unsupported file: spec: missing path`}}function formatPluginLine(plugin,verbose=!1){let status=plugin.status===`loaded`?theme.success(`loaded`):plugin.status===`disabled`?theme.warn(`disabled`):theme.error(`error`),name=theme.command(plugin.name||plugin.id),idSuffix=plugin.name&&plugin.name!==plugin.id?theme.muted(` (${plugin.id})`):``,desc=plugin.description?theme.muted(plugin.description.length>60?`${plugin.description.slice(0,57)}...`:plugin.description):theme.muted(`(no description)`);if(!verbose)return`${name}${idSuffix} ${status} - ${desc}`;let parts=[`${name}${idSuffix} ${status}`,` source: ${theme.muted(shortenHomeInString(plugin.source))}`,` origin: ${plugin.origin}`];return plugin.version&&parts.push(` version: ${plugin.version}`),plugin.providerIds.length>0&&parts.push(` providers: ${plugin.providerIds.join(`, `)}`),plugin.error&&parts.push(theme.error(` error: ${plugin.error}`)),parts.join(`
|
|
2
2
|
`)}function applySlotSelectionForPlugin(config,pluginId){let report=buildPluginStatusReport({config}),plugin=report.plugins.find(entry=>entry.id===pluginId);if(!plugin)return{config,warnings:[]};let result=applyExclusiveSlotSelection({config,selectedId:plugin.id,selectedKind:plugin.kind,registry:report});return{config:result.config,warnings:result.warnings}}function createPluginInstallLogger(){return{info:msg=>defaultRuntime.log(msg),warn:msg=>defaultRuntime.log(theme.warn(msg))}}function enablePluginInConfig(config,pluginId){return{...config,plugins:{...config.plugins,entries:{...config.plugins?.entries,[pluginId]:{...config.plugins?.entries?.[pluginId],enabled:!0}}}}}function logSlotWarnings(warnings){if(warnings.length!==0)for(let warning of warnings)defaultRuntime.log(theme.warn(warning))}function registerPluginsCli(program){let plugins=program.command(`plugins`).description(`Manage BuilderForceAgents plugins and extensions`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/plugins`,`docs.builderforce.ai/cli/plugins`)}\n`);plugins.command(`list`).description(`List discovered plugins`).option(`--json`,`Print JSON`).option(`--enabled`,`Only show enabled plugins`,!1).option(`--verbose`,`Show detailed entries`,!1).action(opts=>{let report=buildPluginStatusReport(),list=opts.enabled?report.plugins.filter(p=>p.status===`loaded`):report.plugins;if(opts.json){let payload={workspaceDir:report.workspaceDir,plugins:list,diagnostics:report.diagnostics};defaultRuntime.log(JSON.stringify(payload,null,2));return}if(list.length===0){defaultRuntime.log(theme.muted(`No plugins found.`));return}let loaded=list.filter(p=>p.status===`loaded`).length;if(defaultRuntime.log(`${theme.heading(`Plugins`)} ${theme.muted(`(${loaded}/${list.length} loaded)`)}`),!opts.verbose){let tableWidth=Math.max(60,(process.stdout.columns??120)-1),sourceRoots=resolvePluginSourceRoots({workspaceDir:report.workspaceDir}),usedRoots=new Set,rows=list.map(plugin=>{let desc=plugin.description?theme.muted(plugin.description):``,formattedSource=formatPluginSourceForTable(plugin,sourceRoots);formattedSource.rootKey&&usedRoots.add(formattedSource.rootKey);let sourceLine=desc?`${formattedSource.value}\n${desc}`:formattedSource.value;return{Name:plugin.name||plugin.id,ID:plugin.name&&plugin.name!==plugin.id?plugin.id:``,Status:plugin.status===`loaded`?theme.success(`loaded`):plugin.status===`disabled`?theme.warn(`disabled`):theme.error(`error`),Source:sourceLine,Version:plugin.version??``}});if(usedRoots.size>0){defaultRuntime.log(theme.muted(`Source roots:`));for(let key of[`stock`,`workspace`,`global`]){if(!usedRoots.has(key))continue;let dir=sourceRoots[key];dir&&defaultRuntime.log(` ${theme.command(`${key}:`)} ${theme.muted(dir)}`)}defaultRuntime.log(``)}defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Name`,header:`Name`,minWidth:14,flex:!0},{key:`ID`,header:`ID`,minWidth:10,flex:!0},{key:`Status`,header:`Status`,minWidth:10},{key:`Source`,header:`Source`,minWidth:26,flex:!0},{key:`Version`,header:`Version`,minWidth:8}],rows}).trimEnd());return}let lines=[];for(let plugin of list)lines.push(formatPluginLine(plugin,!0)),lines.push(``);defaultRuntime.log(lines.join(`
|
|
3
3
|
`).trim())}),plugins.command(`info`).description(`Show plugin details`).argument(`<id>`,`Plugin id`).option(`--json`,`Print JSON`).action((id,opts)=>{let plugin=buildPluginStatusReport().plugins.find(p=>p.id===id||p.name===id);plugin||(defaultRuntime.error(`Plugin not found: ${id}`),process.exit(1));let install=loadConfig().plugins?.installs?.[plugin.id];if(opts.json){defaultRuntime.log(JSON.stringify(plugin,null,2));return}let lines=[];lines.push(theme.heading(plugin.name||plugin.id)),plugin.name&&plugin.name!==plugin.id&&lines.push(theme.muted(`id: ${plugin.id}`)),plugin.description&&lines.push(plugin.description),lines.push(``),lines.push(`${theme.muted(`Status:`)} ${plugin.status}`),lines.push(`${theme.muted(`Source:`)} ${shortenHomeInString(plugin.source)}`),lines.push(`${theme.muted(`Origin:`)} ${plugin.origin}`),plugin.version&&lines.push(`${theme.muted(`Version:`)} ${plugin.version}`),plugin.toolNames.length>0&&lines.push(`${theme.muted(`Tools:`)} ${plugin.toolNames.join(`, `)}`),plugin.hookNames.length>0&&lines.push(`${theme.muted(`Hooks:`)} ${plugin.hookNames.join(`, `)}`),plugin.gatewayMethods.length>0&&lines.push(`${theme.muted(`Gateway methods:`)} ${plugin.gatewayMethods.join(`, `)}`),plugin.providerIds.length>0&&lines.push(`${theme.muted(`Providers:`)} ${plugin.providerIds.join(`, `)}`),plugin.cliCommands.length>0&&lines.push(`${theme.muted(`CLI commands:`)} ${plugin.cliCommands.join(`, `)}`),plugin.services.length>0&&lines.push(`${theme.muted(`Services:`)} ${plugin.services.join(`, `)}`),plugin.error&&lines.push(`${theme.error(`Error:`)} ${plugin.error}`),install&&(lines.push(``),lines.push(`${theme.muted(`Install:`)} ${install.source}`),install.spec&&lines.push(`${theme.muted(`Spec:`)} ${install.spec}`),install.sourcePath&&lines.push(`${theme.muted(`Source path:`)} ${shortenHomePath(install.sourcePath)}`),install.installPath&&lines.push(`${theme.muted(`Install path:`)} ${shortenHomePath(install.installPath)}`),install.version&&lines.push(`${theme.muted(`Recorded version:`)} ${install.version}`),install.installedAt&&lines.push(`${theme.muted(`Installed at:`)} ${install.installedAt}`)),defaultRuntime.log(lines.join(`
|
|
4
4
|
`))}),plugins.command(`enable`).description(`Enable a plugin in config`).argument(`<id>`,`Plugin id`).action(async id=>{let cfg=loadConfig(),next={...cfg,plugins:{...cfg.plugins,entries:{...cfg.plugins?.entries,[id]:{...cfg.plugins?.entries?.[id],enabled:!0}}}},slotResult=applySlotSelectionForPlugin(next,id);next=slotResult.config,await writeConfigFile(next),logSlotWarnings(slotResult.warnings),defaultRuntime.log(`Enabled plugin "${id}". Restart the gateway to apply.`)}),plugins.command(`disable`).description(`Disable a plugin in config`).argument(`<id>`,`Plugin id`).action(async id=>{let cfg=loadConfig();await writeConfigFile({...cfg,plugins:{...cfg.plugins,entries:{...cfg.plugins?.entries,[id]:{...cfg.plugins?.entries?.[id],enabled:!1}}}}),defaultRuntime.log(`Disabled plugin "${id}". Restart the gateway to apply.`)}),plugins.command(`uninstall`).description(`Uninstall a plugin`).argument(`<id>`,`Plugin id`).option(`--keep-files`,`Keep installed files on disk`,!1).option(`--keep-config`,`Deprecated alias for --keep-files`,!1).option(`--force`,`Skip confirmation prompt`,!1).option(`--dry-run`,`Show what would be removed without making changes`,!1).action(async(id,opts)=>{let cfg=loadConfig(),report=buildPluginStatusReport({config:cfg}),extensionsDir=path.join(resolveStateDir(process.env,os.homedir),`extensions`),keepFiles=!!(opts.keepFiles||opts.keepConfig);opts.keepConfig&&defaultRuntime.log(theme.warn("`--keep-config` is deprecated, use `--keep-files`."));let plugin=report.plugins.find(p=>p.id===id||p.name===id),pluginId=plugin?.id??id,hasEntry=pluginId in(cfg.plugins?.entries??{}),hasInstall=pluginId in(cfg.plugins?.installs??{});!hasEntry&&!hasInstall&&(plugin?defaultRuntime.error(`Plugin "${pluginId}" is not managed by plugins config/install records and cannot be uninstalled.`):defaultRuntime.error(`Plugin not found: ${id}`),process.exit(1));let install=cfg.plugins?.installs?.[pluginId],isLinked=install?.source===`path`,preview=[];hasEntry&&preview.push(`config entry`),hasInstall&&preview.push(`install record`),cfg.plugins?.allow?.includes(pluginId)&&preview.push(`allowlist entry`),isLinked&&install?.sourcePath&&cfg.plugins?.load?.paths?.includes(install.sourcePath)&&preview.push(`load path`),cfg.plugins?.slots?.memory===pluginId&&preview.push(`memory slot (will reset to "memory-core")`);let deleteTarget=keepFiles?null:resolveUninstallDirectoryTarget({pluginId,hasInstall,installRecord:install,extensionsDir});deleteTarget&&preview.push(`directory: ${shortenHomePath(deleteTarget)}`);let pluginName=plugin?.name||pluginId;if(defaultRuntime.log(`Plugin: ${theme.command(pluginName)}${pluginName===pluginId?``:theme.muted(` (${pluginId})`)}`),defaultRuntime.log(`Will remove: ${preview.length>0?preview.join(`, `):`(nothing)`}`),opts.dryRun){defaultRuntime.log(theme.muted(`Dry run, no changes made.`));return}if(!opts.force&&!await promptYesNo(`Uninstall plugin "${pluginId}"?`)){defaultRuntime.log(`Cancelled.`);return}let result=await uninstallPlugin({config:cfg,pluginId,deleteFiles:!keepFiles,extensionsDir});result.ok||(defaultRuntime.error(result.error),process.exit(1));for(let warning of result.warnings)defaultRuntime.log(theme.warn(warning));await writeConfigFile(result.config);let removed=[];result.actions.entry&&removed.push(`config entry`),result.actions.install&&removed.push(`install record`),result.actions.allowlist&&removed.push(`allowlist`),result.actions.loadPath&&removed.push(`load path`),result.actions.memorySlot&&removed.push(`memory slot`),result.actions.directory&&removed.push(`directory`),defaultRuntime.log(`Uninstalled plugin "${pluginId}". Removed: ${removed.length>0?removed.join(`, `):`nothing`}.`),defaultRuntime.log(`Restart the gateway to apply changes.`)}),plugins.command(`install`).description(`Install a plugin (path, archive, or npm spec)`).argument(`<path-or-spec>`,`Path (.ts/.js/.zip/.tgz/.tar.gz) or an npm package spec`).option(`-l, --link`,`Link a local path instead of copying`,!1).action(async(raw,opts)=>{let fileSpec=resolveFileNpmSpecToLocalPath(raw);fileSpec&&!fileSpec.ok&&(defaultRuntime.error(fileSpec.error),process.exit(1));let resolved=resolveUserPath(fileSpec&&fileSpec.ok?fileSpec.path:raw),cfg=loadConfig();if(fs.existsSync(resolved)){if(opts.link){let existing=cfg.plugins?.load?.paths??[],merged=Array.from(new Set([...existing,resolved])),probe=await installPluginFromPath({path:resolved,dryRun:!0});probe.ok||(defaultRuntime.error(probe.error),process.exit(1));let next=enablePluginInConfig({...cfg,plugins:{...cfg.plugins,load:{...cfg.plugins?.load,paths:merged}}},probe.pluginId);next=recordPluginInstall(next,{pluginId:probe.pluginId,source:`path`,sourcePath:resolved,installPath:resolved,version:probe.version});let slotResult=applySlotSelectionForPlugin(next,probe.pluginId);next=slotResult.config,await writeConfigFile(next),logSlotWarnings(slotResult.warnings),defaultRuntime.log(`Linked plugin path: ${shortenHomePath(resolved)}`),defaultRuntime.log(`Restart the gateway to load plugins.`);return}let result=await installPluginFromPath({path:resolved,logger:createPluginInstallLogger()});result.ok||(defaultRuntime.error(result.error),process.exit(1)),clearPluginManifestRegistryCache();let next=enablePluginInConfig(cfg,result.pluginId),source=resolveArchiveKind(resolved)?`archive`:`path`;next=recordPluginInstall(next,{pluginId:result.pluginId,source,sourcePath:resolved,installPath:result.targetDir,version:result.version});let slotResult=applySlotSelectionForPlugin(next,result.pluginId);next=slotResult.config,await writeConfigFile(next),logSlotWarnings(slotResult.warnings),defaultRuntime.log(`Installed plugin: ${result.pluginId}`),defaultRuntime.log(`Restart the gateway to load plugins.`);return}opts.link&&(defaultRuntime.error("`--link` requires a local path."),process.exit(1)),(raw.startsWith(`.`)||raw.startsWith(`~`)||path.isAbsolute(raw)||raw.endsWith(`.ts`)||raw.endsWith(`.js`)||raw.endsWith(`.mjs`)||raw.endsWith(`.cjs`)||raw.endsWith(`.tgz`)||raw.endsWith(`.tar.gz`)||raw.endsWith(`.tar`)||raw.endsWith(`.zip`))&&(defaultRuntime.error(`Path not found: ${resolved}`),process.exit(1));let result=await installPluginFromNpmSpec({spec:raw,logger:createPluginInstallLogger()});result.ok||(defaultRuntime.error(result.error),process.exit(1)),clearPluginManifestRegistryCache();let next=enablePluginInConfig(cfg,result.pluginId);next=recordPluginInstall(next,{pluginId:result.pluginId,source:`npm`,spec:raw,installPath:result.targetDir,version:result.version});let slotResult=applySlotSelectionForPlugin(next,result.pluginId);next=slotResult.config,await writeConfigFile(next),logSlotWarnings(slotResult.warnings),defaultRuntime.log(`Installed plugin: ${result.pluginId}`),defaultRuntime.log(`Restart the gateway to load plugins.`)}),plugins.command(`update`).description(`Update installed plugins (npm installs only)`).argument(`[id]`,`Plugin id (omit with --all)`).option(`--all`,`Update all tracked plugins`,!1).option(`--dry-run`,`Show what would change without writing`,!1).action(async(id,opts)=>{let cfg=loadConfig(),installs=cfg.plugins?.installs??{},targets=opts.all?Object.keys(installs):id?[id]:[];if(targets.length===0){if(opts.all){defaultRuntime.log(`No npm-installed plugins to update.`);return}defaultRuntime.error(`Provide a plugin id or use --all.`),process.exit(1)}let result=await updateNpmInstalledPlugins({config:cfg,pluginIds:targets,dryRun:opts.dryRun,logger:{info:msg=>defaultRuntime.log(msg),warn:msg=>defaultRuntime.log(theme.warn(msg))}});for(let outcome of result.outcomes){if(outcome.status===`error`){defaultRuntime.log(theme.error(outcome.message));continue}if(outcome.status===`skipped`){defaultRuntime.log(theme.warn(outcome.message));continue}defaultRuntime.log(outcome.message)}!opts.dryRun&&result.changed&&(await writeConfigFile(result.config),defaultRuntime.log(`Restart the gateway to load plugins.`))}),plugins.command(`doctor`).description(`Report plugin load issues`).action(()=>{let report=buildPluginStatusReport(),errors=report.plugins.filter(p=>p.status===`error`),diags=report.diagnostics.filter(d=>d.level===`error`);if(errors.length===0&&diags.length===0){defaultRuntime.log(`No plugin issues detected.`);return}let lines=[];if(errors.length>0){lines.push(theme.error(`Plugin errors:`));for(let entry of errors)lines.push(`- ${entry.id}: ${entry.error??`failed to load`} (${entry.source})`)}if(diags.length>0){lines.length>0&&lines.push(``),lines.push(theme.warn(`Diagnostics:`));for(let diag of diags){let target=diag.pluginId?`${diag.pluginId}: `:``;lines.push(`- ${target}${diag.message}`)}}let docs=formatDocsLink(`/plugin`,`docs.builderforce.ai/plugin`);lines.push(``),lines.push(`${theme.muted(`Docs:`)} ${docs}`),defaultRuntime.log(lines.join(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{S as shortenHomePath,g as resolveConfigDir,x as shortenHomeInString,y as resolveUserPath,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-CuAFgjuQ.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-C8c9naq-.js";import{c as writeConfigFile,r as loadConfig}from"./io-CsCa3_1Z.js";import{a as resolveBundledPluginsDir,d as applyExclusiveSlotSelection,f as defaultSlotIdForKey,t as clearPluginManifestRegistryCache}from"./manifest-registry-009gLJ4l.js";import"./config-DmxNxDRW.js";import"./model-discovery-RTHjxEvZ.js";import"./model-catalog-D8OQ7p7I.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-O-iC_P5t.js";import"./message-channel-z5YRpR2d.js";import"./subagent-registry-
|
|
1
|
+
import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{S as shortenHomePath,g as resolveConfigDir,x as shortenHomeInString,y as resolveUserPath,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-CuAFgjuQ.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-C8c9naq-.js";import{c as writeConfigFile,r as loadConfig}from"./io-CsCa3_1Z.js";import{a as resolveBundledPluginsDir,d as applyExclusiveSlotSelection,f as defaultSlotIdForKey,t as clearPluginManifestRegistryCache}from"./manifest-registry-009gLJ4l.js";import"./config-DmxNxDRW.js";import"./model-discovery-RTHjxEvZ.js";import"./model-catalog-D8OQ7p7I.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-O-iC_P5t.js";import"./message-channel-z5YRpR2d.js";import"./subagent-registry-m_x-JRkR.js";import"./sessions-CmJXMlLP.js";import"./project-context-store-BNXYrLJz.js";import"./tokens-CFKkpUIu.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-CGcNbbV7.js";import"./send-DPRTlcZh.js";import"./with-timeout-CBXVw0An.js";import"./deliver--eLCRJc2.js";import"./accounts-Cx82nj4E.js";import"./send-DfHAMPcD.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-BZGiFZlP.js";import"./sandbox-C-Owvt1-.js";import"./chrome-BfwLDcFc.js";import{l as promptYesNo}from"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-BjYYSEVE.js";import"./routes-Dnfsevhw.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./workspace-waBqRxiy.js";import"./reply-prefix-Cg7AqaK0.js";import"./sqlite-CIGM1WKg.js";import"./memory-cli-CiwWAhp5.js";import"./manager-Bjb9ptCz.js";import"./gemini-auth-KBXMhaRQ.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import"./runner-DwPaM8kz.js";import"./tool-display-Cs4hDP1f.js";import"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-tquUDu_7.js";import"./session-utils-D2_j4c6U.js";import"./coding-tools.policy-BwdtwuXY.js";import"./pairing-store-BCsvhT6-.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-DsI3qJRy.js";import"./send-BOSlm5fG.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-BdK18hVI.js";import"./control-service-Ca0CBlhO.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-BOBan2eG.js";import"./resolve-route-DEIW5uKy.js";import"./channel-activity-DX36RadH.js";import"./tables-CojSfTth.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DATdLu15.js";import"./onboard-helpers-D2vxAtv8.js";import"./prompt-style-BMWmaqSC.js";import"./pairing-labels-BUXpRejW.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-DJt_RpLC.js";import"./transformers-stream-Buj40qHl.js";import{c as resolveArchiveKind}from"./install-safe-path-ObPl6zIf.js";import"./npm-registry-spec-BV1VDmuN.js";import"./skill-scanner-C2gXLVti.js";import{i as resolvePluginInstallDir,n as installPluginFromNpmSpec,r as installPluginFromPath,t as recordPluginInstall}from"./installs-C7X7CT9a.js";import{t as renderTable}from"./table-BFCCZDsp.js";import{t as buildPluginStatusReport}from"./status-DpEUFAMk.js";import{n as updateNpmInstalledPlugins}from"./update-CWxR2_Pa.js";import os from"node:os";import path from"node:path";import fs from"node:fs";import fs$1 from"node:fs/promises";function tryRelative(root,filePath){let rel=path.relative(root,filePath);return!rel||rel===`.`||rel===`..`||rel.startsWith(`..${path.sep}`)||rel.startsWith(`../`)||rel.startsWith(`..\\`)||path.isAbsolute(rel)?null:rel.replaceAll(`\\`,`/`)}function resolvePluginSourceRoots(params){return{stock:resolveBundledPluginsDir(),global:path.join(resolveConfigDir(),`extensions`),workspace:params.workspaceDir?path.join(params.workspaceDir,`.builderforce`,`extensions`):void 0}}function formatPluginSourceForTable(plugin,roots){let raw=plugin.source;if(plugin.origin===`bundled`&&roots.stock){let rel=tryRelative(roots.stock,raw);if(rel)return{value:`stock:${rel}`,rootKey:`stock`}}if(plugin.origin===`workspace`&&roots.workspace){let rel=tryRelative(roots.workspace,raw);if(rel)return{value:`workspace:${rel}`,rootKey:`workspace`}}if(plugin.origin===`global`&&roots.global){let rel=tryRelative(roots.global,raw);if(rel)return{value:`global:${rel}`,rootKey:`global`}}return{value:shortenHomeInString(raw)}}function resolveUninstallDirectoryTarget(params){if(!params.hasInstall||params.installRecord?.source===`path`)return null;let defaultPath;try{defaultPath=resolvePluginInstallDir(params.pluginId,params.extensionsDir)}catch{return null}let configuredPath=params.installRecord?.installPath;return configuredPath&&path.resolve(configuredPath)===path.resolve(defaultPath)?configuredPath:defaultPath}function removePluginFromConfig(cfg,pluginId){let actions={entry:!1,install:!1,allowlist:!1,loadPath:!1,memorySlot:!1},pluginsConfig=cfg.plugins??{},entries=pluginsConfig.entries;if(entries&&pluginId in entries){let{[pluginId]:_,...rest}=entries;entries=Object.keys(rest).length>0?rest:void 0,actions.entry=!0}let installs=pluginsConfig.installs,installRecord=installs?.[pluginId];if(installs&&pluginId in installs){let{[pluginId]:_,...rest}=installs;installs=Object.keys(rest).length>0?rest:void 0,actions.install=!0}let allow=pluginsConfig.allow;Array.isArray(allow)&&allow.includes(pluginId)&&(allow=allow.filter(id=>id!==pluginId),allow.length===0&&(allow=void 0),actions.allowlist=!0);let load=pluginsConfig.load;if(installRecord?.source===`path`&&installRecord.sourcePath){let sourcePath=installRecord.sourcePath,loadPaths=load?.paths;if(Array.isArray(loadPaths)&&loadPaths.includes(sourcePath)){let nextLoadPaths=loadPaths.filter(p=>p!==sourcePath);load=nextLoadPaths.length>0?{...load,paths:nextLoadPaths}:void 0,actions.loadPath=!0}}let slots=pluginsConfig.slots;slots?.memory===pluginId&&(slots={...slots,memory:defaultSlotIdForKey(`memory`)},actions.memorySlot=!0),slots&&Object.keys(slots).length===0&&(slots=void 0);let cleanedPlugins={...pluginsConfig,entries,installs,allow,load,slots};return cleanedPlugins.entries===void 0&&delete cleanedPlugins.entries,cleanedPlugins.installs===void 0&&delete cleanedPlugins.installs,cleanedPlugins.allow===void 0&&delete cleanedPlugins.allow,cleanedPlugins.load===void 0&&delete cleanedPlugins.load,cleanedPlugins.slots===void 0&&delete cleanedPlugins.slots,{config:{...cfg,plugins:Object.keys(cleanedPlugins).length>0?cleanedPlugins:void 0},actions}}async function uninstallPlugin(params){let{config,pluginId,deleteFiles=!0,extensionsDir}=params,hasEntry=pluginId in(config.plugins?.entries??{}),hasInstall=pluginId in(config.plugins?.installs??{});if(!hasEntry&&!hasInstall)return{ok:!1,error:`Plugin not found: ${pluginId}`};let installRecord=config.plugins?.installs?.[pluginId],isLinked=installRecord?.source===`path`,{config:newConfig,actions:configActions}=removePluginFromConfig(config,pluginId),actions={...configActions,directory:!1},warnings=[],deleteTarget=deleteFiles&&!isLinked?resolveUninstallDirectoryTarget({pluginId,hasInstall,installRecord,extensionsDir}):null;if(deleteTarget){let existed=await fs$1.access(deleteTarget).then(()=>!0).catch(()=>!1)??!1;try{await fs$1.rm(deleteTarget,{recursive:!0,force:!0}),actions.directory=existed}catch(error){warnings.push(`Failed to remove plugin directory ${deleteTarget}: ${error instanceof Error?error.message:String(error)}`)}}return{ok:!0,config:newConfig,pluginId,actions,warnings}}function resolveFileNpmSpecToLocalPath(raw){let trimmed=raw.trim();if(!trimmed.toLowerCase().startsWith(`file:`))return null;let rest=trimmed.slice(5);return rest?rest.startsWith(`///`)?{ok:!0,path:rest.slice(2)}:rest.startsWith(`//localhost/`)?{ok:!0,path:rest.slice(11)}:rest.startsWith(`//`)?{ok:!1,error:`unsupported file: URL host (expected "file:<path>" or "file:///abs/path")`}:{ok:!0,path:rest}:{ok:!1,error:`unsupported file: spec: missing path`}}function formatPluginLine(plugin,verbose=!1){let status=plugin.status===`loaded`?theme.success(`loaded`):plugin.status===`disabled`?theme.warn(`disabled`):theme.error(`error`),name=theme.command(plugin.name||plugin.id),idSuffix=plugin.name&&plugin.name!==plugin.id?theme.muted(` (${plugin.id})`):``,desc=plugin.description?theme.muted(plugin.description.length>60?`${plugin.description.slice(0,57)}...`:plugin.description):theme.muted(`(no description)`);if(!verbose)return`${name}${idSuffix} ${status} - ${desc}`;let parts=[`${name}${idSuffix} ${status}`,` source: ${theme.muted(shortenHomeInString(plugin.source))}`,` origin: ${plugin.origin}`];return plugin.version&&parts.push(` version: ${plugin.version}`),plugin.providerIds.length>0&&parts.push(` providers: ${plugin.providerIds.join(`, `)}`),plugin.error&&parts.push(theme.error(` error: ${plugin.error}`)),parts.join(`
|
|
2
2
|
`)}function applySlotSelectionForPlugin(config,pluginId){let report=buildPluginStatusReport({config}),plugin=report.plugins.find(entry=>entry.id===pluginId);if(!plugin)return{config,warnings:[]};let result=applyExclusiveSlotSelection({config,selectedId:plugin.id,selectedKind:plugin.kind,registry:report});return{config:result.config,warnings:result.warnings}}function createPluginInstallLogger(){return{info:msg=>defaultRuntime.log(msg),warn:msg=>defaultRuntime.log(theme.warn(msg))}}function enablePluginInConfig(config,pluginId){return{...config,plugins:{...config.plugins,entries:{...config.plugins?.entries,[pluginId]:{...config.plugins?.entries?.[pluginId],enabled:!0}}}}}function logSlotWarnings(warnings){if(warnings.length!==0)for(let warning of warnings)defaultRuntime.log(theme.warn(warning))}function registerPluginsCli(program){let plugins=program.command(`plugins`).description(`Manage BuilderForceAgents plugins and extensions`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/plugins`,`docs.builderforce.ai/cli/plugins`)}\n`);plugins.command(`list`).description(`List discovered plugins`).option(`--json`,`Print JSON`).option(`--enabled`,`Only show enabled plugins`,!1).option(`--verbose`,`Show detailed entries`,!1).action(opts=>{let report=buildPluginStatusReport(),list=opts.enabled?report.plugins.filter(p=>p.status===`loaded`):report.plugins;if(opts.json){let payload={workspaceDir:report.workspaceDir,plugins:list,diagnostics:report.diagnostics};defaultRuntime.log(JSON.stringify(payload,null,2));return}if(list.length===0){defaultRuntime.log(theme.muted(`No plugins found.`));return}let loaded=list.filter(p=>p.status===`loaded`).length;if(defaultRuntime.log(`${theme.heading(`Plugins`)} ${theme.muted(`(${loaded}/${list.length} loaded)`)}`),!opts.verbose){let tableWidth=Math.max(60,(process.stdout.columns??120)-1),sourceRoots=resolvePluginSourceRoots({workspaceDir:report.workspaceDir}),usedRoots=new Set,rows=list.map(plugin=>{let desc=plugin.description?theme.muted(plugin.description):``,formattedSource=formatPluginSourceForTable(plugin,sourceRoots);formattedSource.rootKey&&usedRoots.add(formattedSource.rootKey);let sourceLine=desc?`${formattedSource.value}\n${desc}`:formattedSource.value;return{Name:plugin.name||plugin.id,ID:plugin.name&&plugin.name!==plugin.id?plugin.id:``,Status:plugin.status===`loaded`?theme.success(`loaded`):plugin.status===`disabled`?theme.warn(`disabled`):theme.error(`error`),Source:sourceLine,Version:plugin.version??``}});if(usedRoots.size>0){defaultRuntime.log(theme.muted(`Source roots:`));for(let key of[`stock`,`workspace`,`global`]){if(!usedRoots.has(key))continue;let dir=sourceRoots[key];dir&&defaultRuntime.log(` ${theme.command(`${key}:`)} ${theme.muted(dir)}`)}defaultRuntime.log(``)}defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Name`,header:`Name`,minWidth:14,flex:!0},{key:`ID`,header:`ID`,minWidth:10,flex:!0},{key:`Status`,header:`Status`,minWidth:10},{key:`Source`,header:`Source`,minWidth:26,flex:!0},{key:`Version`,header:`Version`,minWidth:8}],rows}).trimEnd());return}let lines=[];for(let plugin of list)lines.push(formatPluginLine(plugin,!0)),lines.push(``);defaultRuntime.log(lines.join(`
|
|
3
3
|
`).trim())}),plugins.command(`info`).description(`Show plugin details`).argument(`<id>`,`Plugin id`).option(`--json`,`Print JSON`).action((id,opts)=>{let plugin=buildPluginStatusReport().plugins.find(p=>p.id===id||p.name===id);plugin||(defaultRuntime.error(`Plugin not found: ${id}`),process.exit(1));let install=loadConfig().plugins?.installs?.[plugin.id];if(opts.json){defaultRuntime.log(JSON.stringify(plugin,null,2));return}let lines=[];lines.push(theme.heading(plugin.name||plugin.id)),plugin.name&&plugin.name!==plugin.id&&lines.push(theme.muted(`id: ${plugin.id}`)),plugin.description&&lines.push(plugin.description),lines.push(``),lines.push(`${theme.muted(`Status:`)} ${plugin.status}`),lines.push(`${theme.muted(`Source:`)} ${shortenHomeInString(plugin.source)}`),lines.push(`${theme.muted(`Origin:`)} ${plugin.origin}`),plugin.version&&lines.push(`${theme.muted(`Version:`)} ${plugin.version}`),plugin.toolNames.length>0&&lines.push(`${theme.muted(`Tools:`)} ${plugin.toolNames.join(`, `)}`),plugin.hookNames.length>0&&lines.push(`${theme.muted(`Hooks:`)} ${plugin.hookNames.join(`, `)}`),plugin.gatewayMethods.length>0&&lines.push(`${theme.muted(`Gateway methods:`)} ${plugin.gatewayMethods.join(`, `)}`),plugin.providerIds.length>0&&lines.push(`${theme.muted(`Providers:`)} ${plugin.providerIds.join(`, `)}`),plugin.cliCommands.length>0&&lines.push(`${theme.muted(`CLI commands:`)} ${plugin.cliCommands.join(`, `)}`),plugin.services.length>0&&lines.push(`${theme.muted(`Services:`)} ${plugin.services.join(`, `)}`),plugin.error&&lines.push(`${theme.error(`Error:`)} ${plugin.error}`),install&&(lines.push(``),lines.push(`${theme.muted(`Install:`)} ${install.source}`),install.spec&&lines.push(`${theme.muted(`Spec:`)} ${install.spec}`),install.sourcePath&&lines.push(`${theme.muted(`Source path:`)} ${shortenHomePath(install.sourcePath)}`),install.installPath&&lines.push(`${theme.muted(`Install path:`)} ${shortenHomePath(install.installPath)}`),install.version&&lines.push(`${theme.muted(`Recorded version:`)} ${install.version}`),install.installedAt&&lines.push(`${theme.muted(`Installed at:`)} ${install.installedAt}`)),defaultRuntime.log(lines.join(`
|
|
4
4
|
`))}),plugins.command(`enable`).description(`Enable a plugin in config`).argument(`<id>`,`Plugin id`).action(async id=>{let cfg=loadConfig(),next={...cfg,plugins:{...cfg.plugins,entries:{...cfg.plugins?.entries,[id]:{...cfg.plugins?.entries?.[id],enabled:!0}}}},slotResult=applySlotSelectionForPlugin(next,id);next=slotResult.config,await writeConfigFile(next),logSlotWarnings(slotResult.warnings),defaultRuntime.log(`Enabled plugin "${id}". Restart the gateway to apply.`)}),plugins.command(`disable`).description(`Disable a plugin in config`).argument(`<id>`,`Plugin id`).action(async id=>{let cfg=loadConfig();await writeConfigFile({...cfg,plugins:{...cfg.plugins,entries:{...cfg.plugins?.entries,[id]:{...cfg.plugins?.entries?.[id],enabled:!1}}}}),defaultRuntime.log(`Disabled plugin "${id}". Restart the gateway to apply.`)}),plugins.command(`uninstall`).description(`Uninstall a plugin`).argument(`<id>`,`Plugin id`).option(`--keep-files`,`Keep installed files on disk`,!1).option(`--keep-config`,`Deprecated alias for --keep-files`,!1).option(`--force`,`Skip confirmation prompt`,!1).option(`--dry-run`,`Show what would be removed without making changes`,!1).action(async(id,opts)=>{let cfg=loadConfig(),report=buildPluginStatusReport({config:cfg}),extensionsDir=path.join(resolveStateDir(process.env,os.homedir),`extensions`),keepFiles=!!(opts.keepFiles||opts.keepConfig);opts.keepConfig&&defaultRuntime.log(theme.warn("`--keep-config` is deprecated, use `--keep-files`."));let plugin=report.plugins.find(p=>p.id===id||p.name===id),pluginId=plugin?.id??id,hasEntry=pluginId in(cfg.plugins?.entries??{}),hasInstall=pluginId in(cfg.plugins?.installs??{});!hasEntry&&!hasInstall&&(plugin?defaultRuntime.error(`Plugin "${pluginId}" is not managed by plugins config/install records and cannot be uninstalled.`):defaultRuntime.error(`Plugin not found: ${id}`),process.exit(1));let install=cfg.plugins?.installs?.[pluginId],isLinked=install?.source===`path`,preview=[];hasEntry&&preview.push(`config entry`),hasInstall&&preview.push(`install record`),cfg.plugins?.allow?.includes(pluginId)&&preview.push(`allowlist entry`),isLinked&&install?.sourcePath&&cfg.plugins?.load?.paths?.includes(install.sourcePath)&&preview.push(`load path`),cfg.plugins?.slots?.memory===pluginId&&preview.push(`memory slot (will reset to "memory-core")`);let deleteTarget=keepFiles?null:resolveUninstallDirectoryTarget({pluginId,hasInstall,installRecord:install,extensionsDir});deleteTarget&&preview.push(`directory: ${shortenHomePath(deleteTarget)}`);let pluginName=plugin?.name||pluginId;if(defaultRuntime.log(`Plugin: ${theme.command(pluginName)}${pluginName===pluginId?``:theme.muted(` (${pluginId})`)}`),defaultRuntime.log(`Will remove: ${preview.length>0?preview.join(`, `):`(nothing)`}`),opts.dryRun){defaultRuntime.log(theme.muted(`Dry run, no changes made.`));return}if(!opts.force&&!await promptYesNo(`Uninstall plugin "${pluginId}"?`)){defaultRuntime.log(`Cancelled.`);return}let result=await uninstallPlugin({config:cfg,pluginId,deleteFiles:!keepFiles,extensionsDir});result.ok||(defaultRuntime.error(result.error),process.exit(1));for(let warning of result.warnings)defaultRuntime.log(theme.warn(warning));await writeConfigFile(result.config);let removed=[];result.actions.entry&&removed.push(`config entry`),result.actions.install&&removed.push(`install record`),result.actions.allowlist&&removed.push(`allowlist`),result.actions.loadPath&&removed.push(`load path`),result.actions.memorySlot&&removed.push(`memory slot`),result.actions.directory&&removed.push(`directory`),defaultRuntime.log(`Uninstalled plugin "${pluginId}". Removed: ${removed.length>0?removed.join(`, `):`nothing`}.`),defaultRuntime.log(`Restart the gateway to apply changes.`)}),plugins.command(`install`).description(`Install a plugin (path, archive, or npm spec)`).argument(`<path-or-spec>`,`Path (.ts/.js/.zip/.tgz/.tar.gz) or an npm package spec`).option(`-l, --link`,`Link a local path instead of copying`,!1).action(async(raw,opts)=>{let fileSpec=resolveFileNpmSpecToLocalPath(raw);fileSpec&&!fileSpec.ok&&(defaultRuntime.error(fileSpec.error),process.exit(1));let resolved=resolveUserPath(fileSpec&&fileSpec.ok?fileSpec.path:raw),cfg=loadConfig();if(fs.existsSync(resolved)){if(opts.link){let existing=cfg.plugins?.load?.paths??[],merged=Array.from(new Set([...existing,resolved])),probe=await installPluginFromPath({path:resolved,dryRun:!0});probe.ok||(defaultRuntime.error(probe.error),process.exit(1));let next=enablePluginInConfig({...cfg,plugins:{...cfg.plugins,load:{...cfg.plugins?.load,paths:merged}}},probe.pluginId);next=recordPluginInstall(next,{pluginId:probe.pluginId,source:`path`,sourcePath:resolved,installPath:resolved,version:probe.version});let slotResult=applySlotSelectionForPlugin(next,probe.pluginId);next=slotResult.config,await writeConfigFile(next),logSlotWarnings(slotResult.warnings),defaultRuntime.log(`Linked plugin path: ${shortenHomePath(resolved)}`),defaultRuntime.log(`Restart the gateway to load plugins.`);return}let result=await installPluginFromPath({path:resolved,logger:createPluginInstallLogger()});result.ok||(defaultRuntime.error(result.error),process.exit(1)),clearPluginManifestRegistryCache();let next=enablePluginInConfig(cfg,result.pluginId),source=resolveArchiveKind(resolved)?`archive`:`path`;next=recordPluginInstall(next,{pluginId:result.pluginId,source,sourcePath:resolved,installPath:result.targetDir,version:result.version});let slotResult=applySlotSelectionForPlugin(next,result.pluginId);next=slotResult.config,await writeConfigFile(next),logSlotWarnings(slotResult.warnings),defaultRuntime.log(`Installed plugin: ${result.pluginId}`),defaultRuntime.log(`Restart the gateway to load plugins.`);return}opts.link&&(defaultRuntime.error("`--link` requires a local path."),process.exit(1)),(raw.startsWith(`.`)||raw.startsWith(`~`)||path.isAbsolute(raw)||raw.endsWith(`.ts`)||raw.endsWith(`.js`)||raw.endsWith(`.mjs`)||raw.endsWith(`.cjs`)||raw.endsWith(`.tgz`)||raw.endsWith(`.tar.gz`)||raw.endsWith(`.tar`)||raw.endsWith(`.zip`))&&(defaultRuntime.error(`Path not found: ${resolved}`),process.exit(1));let result=await installPluginFromNpmSpec({spec:raw,logger:createPluginInstallLogger()});result.ok||(defaultRuntime.error(result.error),process.exit(1)),clearPluginManifestRegistryCache();let next=enablePluginInConfig(cfg,result.pluginId);next=recordPluginInstall(next,{pluginId:result.pluginId,source:`npm`,spec:raw,installPath:result.targetDir,version:result.version});let slotResult=applySlotSelectionForPlugin(next,result.pluginId);next=slotResult.config,await writeConfigFile(next),logSlotWarnings(slotResult.warnings),defaultRuntime.log(`Installed plugin: ${result.pluginId}`),defaultRuntime.log(`Restart the gateway to load plugins.`)}),plugins.command(`update`).description(`Update installed plugins (npm installs only)`).argument(`[id]`,`Plugin id (omit with --all)`).option(`--all`,`Update all tracked plugins`,!1).option(`--dry-run`,`Show what would change without writing`,!1).action(async(id,opts)=>{let cfg=loadConfig(),installs=cfg.plugins?.installs??{},targets=opts.all?Object.keys(installs):id?[id]:[];if(targets.length===0){if(opts.all){defaultRuntime.log(`No npm-installed plugins to update.`);return}defaultRuntime.error(`Provide a plugin id or use --all.`),process.exit(1)}let result=await updateNpmInstalledPlugins({config:cfg,pluginIds:targets,dryRun:opts.dryRun,logger:{info:msg=>defaultRuntime.log(msg),warn:msg=>defaultRuntime.log(theme.warn(msg))}});for(let outcome of result.outcomes){if(outcome.status===`error`){defaultRuntime.log(theme.error(outcome.message));continue}if(outcome.status===`skipped`){defaultRuntime.log(theme.warn(outcome.message));continue}defaultRuntime.log(outcome.message)}!opts.dryRun&&result.changed&&(await writeConfigFile(result.config),defaultRuntime.log(`Restart the gateway to load plugins.`))}),plugins.command(`doctor`).description(`Report plugin load issues`).action(()=>{let report=buildPluginStatusReport(),errors=report.plugins.filter(p=>p.status===`error`),diags=report.diagnostics.filter(d=>d.level===`error`);if(errors.length===0&&diags.length===0){defaultRuntime.log(`No plugin issues detected.`);return}let lines=[];if(errors.length>0){lines.push(theme.error(`Plugin errors:`));for(let entry of errors)lines.push(`- ${entry.id}: ${entry.error??`failed to load`} (${entry.source})`)}if(diags.length>0){lines.length>0&&lines.push(``),lines.push(theme.warn(`Diagnostics:`));for(let diag of diags){let target=diag.pluginId?`${diag.pluginId}: `:``;lines.push(`- ${target}${diag.message}`)}}let docs=formatDocsLink(`/plugin`,`docs.builderforce.ai/plugin`);lines.push(``),lines.push(`${theme.muted(`Docs:`)} ${docs}`),defaultRuntime.log(lines.join(`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import{c as hasHelpOrVersion,n as getCommandPath,o as getVerboseFlag}from"./argv-BgQk38nl.js";import"./registry-Cv7CoWAs.js";import{N as setVerbose,R as isRich,c as escapeRegExp,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-CuAFgjuQ.js";import{n as replaceCliName,r as resolveCliName}from"./command-format-DTMaGKs7.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-C8c9naq-.js";import{U as VERSION}from"./io-CsCa3_1Z.js";import"./manifest-registry-009gLJ4l.js";import"./config-DmxNxDRW.js";import"./model-discovery-RTHjxEvZ.js";import"./model-catalog-D8OQ7p7I.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-O-iC_P5t.js";import"./message-channel-z5YRpR2d.js";import"./subagent-registry-
|
|
2
|
-
`);program.addHelpText(`afterAll`,({command})=>{if(command!==program)return``;let docs=formatDocsLink(`/cli`,`docs.builderforce.ai/cli`);return`\n${theme.heading(`Examples:`)}\n${fmtExamples}\n\n${theme.muted(`Docs:`)} ${docs}\n`})}function setProcessTitleForCommand(actionCommand){let current=actionCommand;for(;current.parent&¤t.parent.parent;)current=current.parent;let name=current.name(),cliName=resolveCliName();!name||name===cliName||(process.title=`${cliName}-${name}`)}const PLUGIN_REQUIRED_COMMANDS=new Set([`message`,`channels`,`directory`]);function registerPreActionHooks(program,programVersion){program.hook(`preAction`,async(_thisCommand,actionCommand)=>{setProcessTitleForCommand(actionCommand);let argv=process.argv;if(hasHelpOrVersion(argv))return;let commandPath=getCommandPath(argv,2);isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_HIDE_BANNER)||commandPath[0]===`update`||commandPath[0]===`completion`||commandPath[0]===`plugins`&&commandPath[1]===`update`||emitCliBanner(programVersion);let verbose=getVerboseFlag(argv,{includeDebug:!0});if(setVerbose(verbose),verbose||(process.env.NODE_NO_WARNINGS??=`1`),commandPath[0]===`doctor`||commandPath[0]===`completion`)return;let{ensureConfigReady}=await import(`./config-guard-CYB1R7ck.js`);if(await ensureConfigReady({runtime:defaultRuntime,commandPath}),PLUGIN_REQUIRED_COMMANDS.has(commandPath[0])){let{ensurePluginRegistryLoaded}=await import(`./plugin-registry-
|
|
1
|
+
import"./paths-BHg-VHB4.js";import{c as hasHelpOrVersion,n as getCommandPath,o as getVerboseFlag}from"./argv-BgQk38nl.js";import"./registry-Cv7CoWAs.js";import{N as setVerbose,R as isRich,c as escapeRegExp,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-CuAFgjuQ.js";import{n as replaceCliName,r as resolveCliName}from"./command-format-DTMaGKs7.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-C8c9naq-.js";import{U as VERSION}from"./io-CsCa3_1Z.js";import"./manifest-registry-009gLJ4l.js";import"./config-DmxNxDRW.js";import"./model-discovery-RTHjxEvZ.js";import"./model-catalog-D8OQ7p7I.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-O-iC_P5t.js";import"./message-channel-z5YRpR2d.js";import"./subagent-registry-m_x-JRkR.js";import"./sessions-CmJXMlLP.js";import"./project-context-store-BNXYrLJz.js";import"./tokens-CFKkpUIu.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-CGcNbbV7.js";import"./send-DPRTlcZh.js";import"./with-timeout-CBXVw0An.js";import"./deliver--eLCRJc2.js";import"./accounts-Cx82nj4E.js";import"./send-DfHAMPcD.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-BZGiFZlP.js";import"./sandbox-C-Owvt1-.js";import"./chrome-BfwLDcFc.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-BjYYSEVE.js";import"./routes-Dnfsevhw.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./workspace-waBqRxiy.js";import"./reply-prefix-Cg7AqaK0.js";import"./sqlite-CIGM1WKg.js";import"./memory-cli-CiwWAhp5.js";import"./manager-Bjb9ptCz.js";import"./gemini-auth-KBXMhaRQ.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import"./runner-DwPaM8kz.js";import"./tool-display-Cs4hDP1f.js";import"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-tquUDu_7.js";import"./session-utils-D2_j4c6U.js";import"./coding-tools.policy-BwdtwuXY.js";import"./pairing-store-BCsvhT6-.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-DsI3qJRy.js";import"./send-BOSlm5fG.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-BdK18hVI.js";import"./control-service-Ca0CBlhO.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-BOBan2eG.js";import"./resolve-route-DEIW5uKy.js";import"./channel-activity-DX36RadH.js";import"./tables-CojSfTth.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DATdLu15.js";import"./onboard-helpers-D2vxAtv8.js";import"./prompt-style-BMWmaqSC.js";import"./pairing-labels-BUXpRejW.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-DJt_RpLC.js";import"./transformers-stream-Buj40qHl.js";import"./catalog-li4bSIE2.js";import"./plugin-registry-DdFb5usc.js";import{n as resolveCliChannelOptions}from"./channel-options-D5kOIN7b.js";import{t as getSubCliCommandsWithSubcommands}from"./register.subclis-AFsfDByV.js";import{a as registerProgramCommands,n as getCoreCliCommandsWithSubcommands}from"./command-registry-BqhtXJa7.js";import{n as setProgramContext}from"./program-context-Wpc-6CdI.js";import"./ports-6RmfZEmk.js";import{n as formatCliBannerLine,r as hasEmittedCliBanner,t as emitCliBanner}from"./banner-8F7-gU1V.js";import{Command}from"commander";function createProgramContext(){let channelOptions=resolveCliChannelOptions();return{programVersion:VERSION,channelOptions,messageChannelOptions:channelOptions.join(`|`),agentChannelOptions:[`last`,...channelOptions].join(`|`)}}const CLI_NAME=resolveCliName(),CLI_NAME_PATTERN=escapeRegExp(CLI_NAME),ROOT_COMMANDS_WITH_SUBCOMMANDS=new Set([...getCoreCliCommandsWithSubcommands(),...getSubCliCommandsWithSubcommands()]),EXAMPLES=[[`builderforce models --help`,`Show detailed help for the models command.`],[`builderforce channels login --verbose`,`Link personal WhatsApp Web and show QR + connection logs.`],[`builderforce message send --target +15555550123 --message "Hi" --json`,`Send via your web session and print JSON result.`],[`builderforce gateway --port 18789`,`Run the WebSocket Gateway locally.`],[`builderforce --dev gateway`,`Run a dev Gateway (isolated state/config) on ws://127.0.0.1:19001.`],[`builderforce gateway --force`,`Kill anything bound to the default gateway port, then start it.`],[`builderforce gateway ...`,`Gateway control via WebSocket.`],[`builderforce agent --to +15555550123 --message "Run summary" --deliver`,`Talk directly to the agent using the Gateway; optionally send the WhatsApp reply.`],[`builderforce message send --channel telegram --target @mychat --message "Hi"`,`Send via your Telegram bot.`]];function configureProgramHelp(program,ctx){program.name(CLI_NAME).description(``).version(ctx.programVersion).option(`--dev`,`Dev profile: isolate state under ~/.builderforce-dev, default gateway port 19001, and shift derived ports (browser/canvas)`).option(`--profile <name>`,`Use a named profile (isolates BUILDERFORCE_AGENTS_STATE_DIR/BUILDERFORCE_AGENTS_CONFIG_PATH under ~/.builderforce-<name>)`),program.option(`--no-color`,`Disable ANSI colors`,!1),program.helpOption(`-h, --help`,`Display help for command`),program.helpCommand(`help [command]`,`Display help for command`),program.configureHelp({sortSubcommands:!0,sortOptions:!0,optionTerm:option=>theme.option(option.flags),subcommandTerm:cmd=>{let hasSubcommands=cmd.parent===program&&ROOT_COMMANDS_WITH_SUBCOMMANDS.has(cmd.name());return theme.command(hasSubcommands?`${cmd.name()} *`:cmd.name())}});let formatHelpOutput=str=>{let output=str;return RegExp(`^Usage:\\s+${CLI_NAME_PATTERN}\\s+\\[options\\]\\s+\\[command\\]\\s*$`,`m`).test(output)&&/^Commands:/m.test(output)&&(output=output.replace(/^Commands:/m,`Commands:\n ${theme.muted(`Hint: commands suffixed with * have subcommands. Run <command> --help for details.`)}`)),output.replace(/^Usage:/gm,theme.heading(`Usage:`)).replace(/^Options:/gm,theme.heading(`Options:`)).replace(/^Commands:/gm,theme.heading(`Commands:`))};program.configureOutput({writeOut:str=>{process.stdout.write(formatHelpOutput(str))},writeErr:str=>{process.stderr.write(formatHelpOutput(str))},outputError:(str,write)=>write(theme.error(str))}),(process.argv.includes(`-V`)||process.argv.includes(`--version`)||process.argv.includes(`-v`))&&(console.log(ctx.programVersion),process.exit(0)),program.addHelpText(`beforeAll`,()=>{if(hasEmittedCliBanner())return``;let rich=isRich();return`\n${formatCliBannerLine(ctx.programVersion,{richTty:rich})}\n`});let fmtExamples=EXAMPLES.map(([cmd,desc])=>` ${theme.command(replaceCliName(cmd,CLI_NAME))}\n ${theme.muted(desc)}`).join(`
|
|
2
|
+
`);program.addHelpText(`afterAll`,({command})=>{if(command!==program)return``;let docs=formatDocsLink(`/cli`,`docs.builderforce.ai/cli`);return`\n${theme.heading(`Examples:`)}\n${fmtExamples}\n\n${theme.muted(`Docs:`)} ${docs}\n`})}function setProcessTitleForCommand(actionCommand){let current=actionCommand;for(;current.parent&¤t.parent.parent;)current=current.parent;let name=current.name(),cliName=resolveCliName();!name||name===cliName||(process.title=`${cliName}-${name}`)}const PLUGIN_REQUIRED_COMMANDS=new Set([`message`,`channels`,`directory`]);function registerPreActionHooks(program,programVersion){program.hook(`preAction`,async(_thisCommand,actionCommand)=>{setProcessTitleForCommand(actionCommand);let argv=process.argv;if(hasHelpOrVersion(argv))return;let commandPath=getCommandPath(argv,2);isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_HIDE_BANNER)||commandPath[0]===`update`||commandPath[0]===`completion`||commandPath[0]===`plugins`&&commandPath[1]===`update`||emitCliBanner(programVersion);let verbose=getVerboseFlag(argv,{includeDebug:!0});if(setVerbose(verbose),verbose||(process.env.NODE_NO_WARNINGS??=`1`),commandPath[0]===`doctor`||commandPath[0]===`completion`)return;let{ensureConfigReady}=await import(`./config-guard-CYB1R7ck.js`);if(await ensureConfigReady({runtime:defaultRuntime,commandPath}),PLUGIN_REQUIRED_COMMANDS.has(commandPath[0])){let{ensurePluginRegistryLoaded}=await import(`./plugin-registry-Cf_sv-ny.js`);ensurePluginRegistryLoaded()}})}function buildProgram(){let program=new Command,ctx=createProgramContext(),argv=process.argv;return setProgramContext(program,ctx),configureProgramHelp(program,ctx),registerPreActionHooks(program,ctx.programVersion),registerProgramCommands(program,ctx,argv),program.option(`-m, --message <text>`,`Start a session and send this as the first message`).action(async opts=>{let{runBuilderForceAgentsSession}=await import(`./builderforce-CImLd8Zo.js`);await runBuilderForceAgentsSession(process.cwd(),{message:opts.message})}),program}export{buildProgram};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as isTruthyEnvValue}from"./env-BIdU5BAp.js";import{r as resolveActionArgs}from"./helpers-CESJCicC.js";const HELP_FLAGS=new Set([`-h`,`--help`]),VERSION_FLAGS=new Set([`-v`,`-V`,`--version`]);function hasHelpOrVersion(argv){return argv.some(arg=>HELP_FLAGS.has(arg)||VERSION_FLAGS.has(arg))?!0:getPrimaryCommand(argv)===`help`}function hasFlag(argv,name){let args=argv.slice(2);for(let arg of args){if(arg===`--`)break;if(arg===name)return!0}return!1}function getVerboseFlag(argv,options){return!!(hasFlag(argv,`--verbose`)||options?.includeDebug&&hasFlag(argv,`--debug`))}function getCommandPath(argv,depth=2){let args=argv.slice(2),path=[];for(let i=0;i<args.length;i+=1){let arg=args[i];if(arg&&(arg===`--`||!arg.startsWith(`-`)&&(path.push(arg),path.length>=depth)))break}return path}function getPrimaryCommand(argv){let[primary]=getCommandPath(argv,1);return primary??null}function buildParseArgv(params){let baseArgv=params.rawArgs&¶ms.rawArgs.length>0?params.rawArgs:params.fallbackArgv&¶ms.fallbackArgv.length>0?params.fallbackArgv:process.argv,programName=params.programName??``,normalizedArgv=programName&&baseArgv[0]===programName||baseArgv[0]?.endsWith(`builderforce`)||baseArgv[0]?.endsWith(`builderforce`)?baseArgv.slice(1):baseArgv,executable=(normalizedArgv[0]?.split(/[/\\]/).pop()??``).toLowerCase();return normalizedArgv.length>=2&&(isNodeExecutable(executable)||isBunExecutable(executable))?normalizedArgv:[`node`,programName||`builderforce`,...normalizedArgv]}const nodeExecutablePattern=/^node-\d+(?:\.\d+)*(?:\.exe)?$/;function isNodeExecutable(executable){return executable===`node`||executable===`node.exe`||executable===`nodejs`||executable===`nodejs.exe`||nodeExecutablePattern.test(executable)}function isBunExecutable(executable){return executable===`bun`||executable===`bun.exe`}async function reparseProgramFromActionArgs(program,actionArgs){let actionCommand=actionArgs.at(-1),rawArgs=(actionCommand?.parent??program).rawArgs,actionArgsList=resolveActionArgs(actionCommand),fallbackArgv=actionCommand?.name()?[actionCommand.name(),...actionArgsList]:actionArgsList,parseArgv=buildParseArgv({programName:program.name(),rawArgs,fallbackArgv});await program.parseAsync(parseArgv)}const shouldRegisterPrimaryOnly=argv=>!(isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_DISABLE_LAZY_SUBCOMMANDS)||hasHelpOrVersion(argv)),shouldEagerRegisterSubcommands=_argv=>isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_DISABLE_LAZY_SUBCOMMANDS),loadConfig=async()=>{let{loadConfig:_load}=await import(`./io-DRcmqJiM.js`);return _load()},entries=[{name:`acp`,description:`Agent Control Protocol tools`,hasSubcommands:!0,register:async program=>{(await import(`./acp-cli-uVQuBJUT.js`)).registerAcpCli(program)}},{name:`gateway`,description:`Run, inspect, and query the WebSocket Gateway`,hasSubcommands:!0,register:async program=>{(await import(`./gateway-cli-Dzl70YBF.js`)).registerGatewayCli(program)}},{name:`daemon`,description:`Gateway service (legacy alias)`,hasSubcommands:!0,register:async program=>{(await import(`./daemon-cli-BvN1TAaX.js`)).registerDaemonCli(program)}},{name:`logs`,description:`Tail gateway file logs via RPC`,hasSubcommands:!1,register:async program=>{(await import(`./logs-cli-DCjOzcRI.js`)).registerLogsCli(program)}},{name:`usage`,description:`Show provider usage / quota (and workspace spend via gateway)`,hasSubcommands:!1,register:async program=>{(await import(`./usage-cli-DIpffvJG.js`)).registerUsageCli(program)}},{name:`system`,description:`System events, heartbeat, and presence`,hasSubcommands:!0,register:async program=>{(await import(`./system-cli-BE5UL_NU.js`)).registerSystemCli(program)}},{name:`models`,description:`Discover, scan, and configure models`,hasSubcommands:!0,register:async program=>{(await import(`./models-cli-Cijh2uON.js`)).registerModelsCli(program)}},{name:`approvals`,description:`Manage exec approvals (gateway or node host)`,hasSubcommands:!0,register:async program=>{(await import(`./exec-approvals-cli-fgoSCQcQ.js`)).registerExecApprovalsCli(program)}},{name:`nodes`,description:`Manage gateway-owned node pairing and node commands`,hasSubcommands:!0,register:async program=>{(await import(`./nodes-cli-BmLCH723.js`)).registerNodesCli(program)}},{name:`devices`,description:`Device pairing + token management`,hasSubcommands:!0,register:async program=>{(await import(`./devices-cli-X-am7Ver.js`)).registerDevicesCli(program)}},{name:`node`,description:`Run and manage the headless node host service`,hasSubcommands:!0,register:async program=>{(await import(`./node-cli-CszykZHa.js`)).registerNodeCli(program)}},{name:`sandbox`,description:`Manage sandbox containers for agent isolation`,hasSubcommands:!0,register:async program=>{(await import(`./sandbox-cli-BigPCbqX.js`)).registerSandboxCli(program)}},{name:`tui`,description:`Open a terminal UI connected to the Gateway`,hasSubcommands:!1,register:async program=>{(await import(`./tui-cli-Dvd8BwzD.js`)).registerTuiCli(program)}},{name:`cron`,description:`Manage cron jobs via the Gateway scheduler`,hasSubcommands:!0,register:async program=>{(await import(`./cron-cli-Bujh0eNs.js`)).registerCronCli(program)}},{name:`workflow`,description:`Trigger Builderforce workflows from the CLI / CI`,hasSubcommands:!0,register:async program=>{(await import(`./workflow-cli-CgZkL6J3.js`)).registerWorkflowCli(program)}},{name:`dns`,description:`DNS helpers for wide-area discovery (Tailscale + CoreDNS)`,hasSubcommands:!0,register:async program=>{(await import(`./dns-cli-CrxhjouO.js`)).registerDnsCli(program)}},{name:`docs`,description:`Search the live BuilderForceAgents docs`,hasSubcommands:!1,register:async program=>{(await import(`./docs-cli-CNrjm2Tf.js`)).registerDocsCli(program)}},{name:`hooks`,description:`Manage internal agent hooks`,hasSubcommands:!0,register:async program=>{(await import(`./hooks-cli-6jeFEGg3.js`)).registerHooksCli(program)}},{name:`webhooks`,description:`Webhook helpers and integrations`,hasSubcommands:!0,register:async program=>{(await import(`./webhooks-cli-aFqAS9w_.js`)).registerWebhooksCli(program)}},{name:`qr`,description:`Generate iOS pairing QR/setup code`,hasSubcommands:!1,register:async program=>{(await import(`./qr-cli-B1Mwo7Hh.js`)).registerQrCli(program)}},{name:`agentbot`,description:`Legacy agentbot command aliases`,hasSubcommands:!0,register:async program=>{(await import(`./agentbot-cli-DU56bv_H.js`)).registerAgentbotCli(program)}},{name:`pairing`,description:`Secure DM pairing (approve inbound requests)`,hasSubcommands:!0,register:async program=>{let{registerPluginCliCommands}=await import(`./cli-D8fndSEi.js`);registerPluginCliCommands(program,await loadConfig()),(await import(`./pairing-cli-BUnLbLc6.js`)).registerPairingCli(program)}},{name:`plugins`,description:`Manage BuilderForceAgents plugins and extensions`,hasSubcommands:!0,register:async program=>{(await import(`./plugins-cli-CwdUVWjG.js`)).registerPluginsCli(program);let{registerPluginCliCommands}=await import(`./cli-D8fndSEi.js`);registerPluginCliCommands(program,await loadConfig())}},{name:`channels`,description:`Manage connected chat channels (Telegram, Discord, etc.)`,hasSubcommands:!0,register:async program=>{(await import(`./channels-cli-CZM033Me.js`)).registerChannelsCli(program)}},{name:`directory`,description:`Lookup contact and group IDs (self, peers, groups) for supported chat channels`,hasSubcommands:!0,register:async program=>{(await import(`./directory-cli-CYfVPP1z.js`)).registerDirectoryCli(program)}},{name:`security`,description:`Security tools and local config audits`,hasSubcommands:!0,register:async program=>{(await import(`./security-cli-BvwUCVRC.js`)).registerSecurityCli(program)}},{name:`skills`,description:`List and inspect available skills`,hasSubcommands:!0,register:async program=>{(await import(`./skills-cli-BTlrb0-b.js`)).registerSkillsCli(program)}},{name:`update`,description:`Update BuilderForceAgents and inspect update channel status`,hasSubcommands:!0,register:async program=>{(await import(`./update-cli-DUObGvw1.js`)).registerUpdateCli(program)}},{name:`completion`,description:`Generate shell completion script`,hasSubcommands:!1,register:async program=>{(await import(`./completion-cli-LUuqgvVQ.js`)).registerCompletionCli(program)}}];function getSubCliEntries(){return entries}function getSubCliCommandsWithSubcommands(){return entries.filter(entry=>entry.hasSubcommands).map(entry=>entry.name)}function removeCommand$1(program,command){let commands=program.commands,index=commands.indexOf(command);index>=0&&commands.splice(index,1)}async function registerSubCliByName(program,name){let entry=entries.find(candidate=>candidate.name===name);if(!entry)return!1;let existing=program.commands.find(cmd=>cmd.name()===entry.name);return existing&&removeCommand$1(program,existing),await entry.register(program),!0}function registerLazyCommand(program,entry){let placeholder=program.command(entry.name).description(entry.description);placeholder.allowUnknownOption(!0),placeholder.allowExcessArguments(!0),placeholder.action(async(...actionArgs)=>{removeCommand$1(program,placeholder),await entry.register(program),await reparseProgramFromActionArgs(program,actionArgs)})}function registerSubCliCommands(program,argv=process.argv){if(shouldEagerRegisterSubcommands(argv)){for(let entry of entries)entry.register(program);return}let primary=getPrimaryCommand(argv);if(primary&&shouldRegisterPrimaryOnly(argv)){let entry=entries.find(candidate=>candidate.name===primary);if(entry){registerLazyCommand(program,entry);return}}for(let candidate of entries)registerLazyCommand(program,candidate)}const shouldRegisterCorePrimaryOnly=argv=>!hasHelpOrVersion(argv),coreEntries=[{commands:[{name:`setup`,description:`Initialize local config and agent workspace`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.setup-1BmR-qlh.js`)).registerSetupCommand(program)}},{commands:[{name:`onboard`,description:`Interactive onboarding wizard for gateway, workspace, and skills`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.onboard-CswvuzLx.js`)).registerOnboardCommand(program)}},{commands:[{name:`connect`,description:`Register this machine as an agent host in a Builderforce workspace`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.connect-Bv89G_Qz.js`)).registerConnectCommand(program)}},{commands:[{name:`configure`,description:`Interactive setup wizard for credentials, channels, gateway, and agent defaults`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.configure-BdqREs1-.js`)).registerConfigureCommand(program)}},{commands:[{name:`config`,description:`Non-interactive config helpers (get/set/unset). Default: starts setup wizard.`,hasSubcommands:!0}],register:async({program})=>{(await import(`./config-cli-BIx0enD5.js`)).registerConfigCli(program)}},{commands:[{name:`doctor`,description:`Health checks + quick fixes for the gateway and channels`,hasSubcommands:!1},{name:`dashboard`,description:`Open the Control UI with your current token`,hasSubcommands:!1},{name:`reset`,description:`Reset local config/state (keeps the CLI installed)`,hasSubcommands:!1},{name:`stop`,description:`Stop the running gateway service`,hasSubcommands:!1},{name:`uninstall`,description:`Uninstall the gateway service + local data (CLI remains)`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.maintenance-BSKHOCTV.js`)).registerMaintenanceCommands(program)}},{commands:[{name:`message`,description:`Send, read, and manage messages`,hasSubcommands:!0}],register:async({program,ctx})=>{(await import(`./register.message-7KIfSUxS.js`)).registerMessageCommands(program,ctx)}},{commands:[{name:`memory`,description:`Search and reindex memory files`,hasSubcommands:!0}],register:async({program})=>{(await import(`./memory-cli-B0IxKYMU.js`)).registerMemoryCli(program)}},{commands:[{name:`agent`,description:`Run one agent turn via the Gateway`,hasSubcommands:!1},{name:`agents`,description:`Manage isolated agents (workspaces, auth, routing)`,hasSubcommands:!0}],register:async({program,ctx})=>{(await import(`./register.agent-RNVNKBP3.js`)).registerAgentCommands(program,{agentChannelOptions:ctx.agentChannelOptions})}},{commands:[{name:`status`,description:`Show channel health and recent session recipients`,hasSubcommands:!1},{name:`health`,description:`Fetch health from the running gateway`,hasSubcommands:!1},{name:`sessions`,description:`List stored conversation sessions`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.status-health-sessions-BXpljfv3.js`)).registerStatusHealthSessionsCommands(program)}},{commands:[{name:`browser`,description:`Manage BuilderForceAgents's dedicated browser (Chrome/Chromium)`,hasSubcommands:!0}],register:async({program})=>{(await import(`./browser-cli-DohEf-8_.js`)).registerBrowserCli(program)}},{commands:[{name:`init`,description:`Initialize a project with builderForceAgents`,hasSubcommands:!1},{name:`project`,description:`Manage builderForceAgents project context`,hasSubcommands:!0},{name:`workforce`,description:`Manage Builderforce Workforce agents (custom trained LLMs)`,hasSubcommands:!0}],register:async({program})=>{let mod=await import(`./builderforce-Dl4bZ63C.js`);program.addCommand(mod.createInitCommand()),program.addCommand(mod.createBuilderForceAgentsCommand()),program.addCommand(mod.createAgentCommand())}}];function collectCoreCliCommandNames(predicate){let seen=new Set,names=[];for(let entry of coreEntries)for(let command of entry.commands)predicate&&!predicate(command)||seen.has(command.name)||(seen.add(command.name),names.push(command.name));return names}function getCoreCliCommandNames(){return collectCoreCliCommandNames()}function getCoreCliCommandsWithSubcommands(){return collectCoreCliCommandNames(command=>command.hasSubcommands)}function removeCommand(program,command){let commands=program.commands,index=commands.indexOf(command);index>=0&&commands.splice(index,1)}function removeEntryCommands(program,entry){for(let cmd of entry.commands){let existing=program.commands.find(c=>c.name()===cmd.name);existing&&removeCommand(program,existing)}}function registerLazyCoreCommand(program,ctx,entry,command){let placeholder=program.command(command.name).description(command.description);placeholder.allowUnknownOption(!0),placeholder.allowExcessArguments(!0),placeholder.action(async(...actionArgs)=>{removeEntryCommands(program,entry),await entry.register({program,ctx,argv:process.argv}),await reparseProgramFromActionArgs(program,actionArgs)})}async function registerCoreCliByName(program,ctx,name,argv=process.argv){let entry=coreEntries.find(candidate=>candidate.commands.some(cmd=>cmd.name===name));return entry?(removeEntryCommands(program,entry),await entry.register({program,ctx,argv}),!0):!1}function registerCoreCliCommands(program,ctx,argv){let primary=getPrimaryCommand(argv);if(primary&&shouldRegisterCorePrimaryOnly(argv)){let entry=coreEntries.find(candidate=>candidate.commands.some(cmd=>cmd.name===primary));if(entry){let cmd=entry.commands.find(c=>c.name===primary);cmd&®isterLazyCoreCommand(program,ctx,entry,cmd);return}}for(let entry of coreEntries)for(let cmd of entry.commands)registerLazyCoreCommand(program,ctx,entry,cmd)}function registerProgramCommands(program,ctx,argv=process.argv){registerCoreCliCommands(program,ctx,argv),registerSubCliCommands(program,argv)}const PROGRAM_CONTEXT_SYMBOL=Symbol.for(`builderforce.cli.programContext`);function setProgramContext(program,ctx){program[PROGRAM_CONTEXT_SYMBOL]=ctx}function getProgramContext(program){return program[PROGRAM_CONTEXT_SYMBOL]}export{registerCoreCliByName as a,getSubCliEntries as c,getVerboseFlag as d,hasHelpOrVersion as f,getCoreCliCommandsWithSubcommands as i,registerSubCliByName as l,setProgramContext as n,registerProgramCommands as o,getCoreCliCommandNames as r,getSubCliCommandsWithSubcommands as s,getProgramContext as t,getCommandPath as u};
|
|
1
|
+
import{t as isTruthyEnvValue}from"./env-BIdU5BAp.js";import{r as resolveActionArgs}from"./helpers-CESJCicC.js";const HELP_FLAGS=new Set([`-h`,`--help`]),VERSION_FLAGS=new Set([`-v`,`-V`,`--version`]);function hasHelpOrVersion(argv){return argv.some(arg=>HELP_FLAGS.has(arg)||VERSION_FLAGS.has(arg))?!0:getPrimaryCommand(argv)===`help`}function hasFlag(argv,name){let args=argv.slice(2);for(let arg of args){if(arg===`--`)break;if(arg===name)return!0}return!1}function getVerboseFlag(argv,options){return!!(hasFlag(argv,`--verbose`)||options?.includeDebug&&hasFlag(argv,`--debug`))}function getCommandPath(argv,depth=2){let args=argv.slice(2),path=[];for(let i=0;i<args.length;i+=1){let arg=args[i];if(arg&&(arg===`--`||!arg.startsWith(`-`)&&(path.push(arg),path.length>=depth)))break}return path}function getPrimaryCommand(argv){let[primary]=getCommandPath(argv,1);return primary??null}function buildParseArgv(params){let baseArgv=params.rawArgs&¶ms.rawArgs.length>0?params.rawArgs:params.fallbackArgv&¶ms.fallbackArgv.length>0?params.fallbackArgv:process.argv,programName=params.programName??``,normalizedArgv=programName&&baseArgv[0]===programName||baseArgv[0]?.endsWith(`builderforce`)||baseArgv[0]?.endsWith(`builderforce`)?baseArgv.slice(1):baseArgv,executable=(normalizedArgv[0]?.split(/[/\\]/).pop()??``).toLowerCase();return normalizedArgv.length>=2&&(isNodeExecutable(executable)||isBunExecutable(executable))?normalizedArgv:[`node`,programName||`builderforce`,...normalizedArgv]}const nodeExecutablePattern=/^node-\d+(?:\.\d+)*(?:\.exe)?$/;function isNodeExecutable(executable){return executable===`node`||executable===`node.exe`||executable===`nodejs`||executable===`nodejs.exe`||nodeExecutablePattern.test(executable)}function isBunExecutable(executable){return executable===`bun`||executable===`bun.exe`}async function reparseProgramFromActionArgs(program,actionArgs){let actionCommand=actionArgs.at(-1),rawArgs=(actionCommand?.parent??program).rawArgs,actionArgsList=resolveActionArgs(actionCommand),fallbackArgv=actionCommand?.name()?[actionCommand.name(),...actionArgsList]:actionArgsList,parseArgv=buildParseArgv({programName:program.name(),rawArgs,fallbackArgv});await program.parseAsync(parseArgv)}const shouldRegisterPrimaryOnly=argv=>!(isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_DISABLE_LAZY_SUBCOMMANDS)||hasHelpOrVersion(argv)),shouldEagerRegisterSubcommands=_argv=>isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_DISABLE_LAZY_SUBCOMMANDS),loadConfig=async()=>{let{loadConfig:_load}=await import(`./io-DRcmqJiM.js`);return _load()},entries=[{name:`acp`,description:`Agent Control Protocol tools`,hasSubcommands:!0,register:async program=>{(await import(`./acp-cli-uVQuBJUT.js`)).registerAcpCli(program)}},{name:`gateway`,description:`Run, inspect, and query the WebSocket Gateway`,hasSubcommands:!0,register:async program=>{(await import(`./gateway-cli-CGkTLhet.js`)).registerGatewayCli(program)}},{name:`daemon`,description:`Gateway service (legacy alias)`,hasSubcommands:!0,register:async program=>{(await import(`./daemon-cli-BvN1TAaX.js`)).registerDaemonCli(program)}},{name:`logs`,description:`Tail gateway file logs via RPC`,hasSubcommands:!1,register:async program=>{(await import(`./logs-cli-DCjOzcRI.js`)).registerLogsCli(program)}},{name:`usage`,description:`Show provider usage / quota (and workspace spend via gateway)`,hasSubcommands:!1,register:async program=>{(await import(`./usage-cli-DIpffvJG.js`)).registerUsageCli(program)}},{name:`system`,description:`System events, heartbeat, and presence`,hasSubcommands:!0,register:async program=>{(await import(`./system-cli-BE5UL_NU.js`)).registerSystemCli(program)}},{name:`models`,description:`Discover, scan, and configure models`,hasSubcommands:!0,register:async program=>{(await import(`./models-cli-O1zCgeoA.js`)).registerModelsCli(program)}},{name:`approvals`,description:`Manage exec approvals (gateway or node host)`,hasSubcommands:!0,register:async program=>{(await import(`./exec-approvals-cli-fgoSCQcQ.js`)).registerExecApprovalsCli(program)}},{name:`nodes`,description:`Manage gateway-owned node pairing and node commands`,hasSubcommands:!0,register:async program=>{(await import(`./nodes-cli-BmLCH723.js`)).registerNodesCli(program)}},{name:`devices`,description:`Device pairing + token management`,hasSubcommands:!0,register:async program=>{(await import(`./devices-cli-X-am7Ver.js`)).registerDevicesCli(program)}},{name:`node`,description:`Run and manage the headless node host service`,hasSubcommands:!0,register:async program=>{(await import(`./node-cli-CszykZHa.js`)).registerNodeCli(program)}},{name:`sandbox`,description:`Manage sandbox containers for agent isolation`,hasSubcommands:!0,register:async program=>{(await import(`./sandbox-cli-BigPCbqX.js`)).registerSandboxCli(program)}},{name:`tui`,description:`Open a terminal UI connected to the Gateway`,hasSubcommands:!1,register:async program=>{(await import(`./tui-cli-CruoIP1K.js`)).registerTuiCli(program)}},{name:`cron`,description:`Manage cron jobs via the Gateway scheduler`,hasSubcommands:!0,register:async program=>{(await import(`./cron-cli-Bujh0eNs.js`)).registerCronCli(program)}},{name:`workflow`,description:`Trigger Builderforce workflows from the CLI / CI`,hasSubcommands:!0,register:async program=>{(await import(`./workflow-cli-CgZkL6J3.js`)).registerWorkflowCli(program)}},{name:`dns`,description:`DNS helpers for wide-area discovery (Tailscale + CoreDNS)`,hasSubcommands:!0,register:async program=>{(await import(`./dns-cli-CrxhjouO.js`)).registerDnsCli(program)}},{name:`docs`,description:`Search the live BuilderForceAgents docs`,hasSubcommands:!1,register:async program=>{(await import(`./docs-cli-CNrjm2Tf.js`)).registerDocsCli(program)}},{name:`hooks`,description:`Manage internal agent hooks`,hasSubcommands:!0,register:async program=>{(await import(`./hooks-cli-DPSrycwI.js`)).registerHooksCli(program)}},{name:`webhooks`,description:`Webhook helpers and integrations`,hasSubcommands:!0,register:async program=>{(await import(`./webhooks-cli-aFqAS9w_.js`)).registerWebhooksCli(program)}},{name:`qr`,description:`Generate iOS pairing QR/setup code`,hasSubcommands:!1,register:async program=>{(await import(`./qr-cli-B1Mwo7Hh.js`)).registerQrCli(program)}},{name:`agentbot`,description:`Legacy agentbot command aliases`,hasSubcommands:!0,register:async program=>{(await import(`./agentbot-cli-DU56bv_H.js`)).registerAgentbotCli(program)}},{name:`pairing`,description:`Secure DM pairing (approve inbound requests)`,hasSubcommands:!0,register:async program=>{let{registerPluginCliCommands}=await import(`./cli-DBn0qbHS.js`);registerPluginCliCommands(program,await loadConfig()),(await import(`./pairing-cli-BUnLbLc6.js`)).registerPairingCli(program)}},{name:`plugins`,description:`Manage BuilderForceAgents plugins and extensions`,hasSubcommands:!0,register:async program=>{(await import(`./plugins-cli-DW4hoeeV.js`)).registerPluginsCli(program);let{registerPluginCliCommands}=await import(`./cli-DBn0qbHS.js`);registerPluginCliCommands(program,await loadConfig())}},{name:`channels`,description:`Manage connected chat channels (Telegram, Discord, etc.)`,hasSubcommands:!0,register:async program=>{(await import(`./channels-cli-COl9TDHT.js`)).registerChannelsCli(program)}},{name:`directory`,description:`Lookup contact and group IDs (self, peers, groups) for supported chat channels`,hasSubcommands:!0,register:async program=>{(await import(`./directory-cli-CYfVPP1z.js`)).registerDirectoryCli(program)}},{name:`security`,description:`Security tools and local config audits`,hasSubcommands:!0,register:async program=>{(await import(`./security-cli-BvwUCVRC.js`)).registerSecurityCli(program)}},{name:`skills`,description:`List and inspect available skills`,hasSubcommands:!0,register:async program=>{(await import(`./skills-cli-BTlrb0-b.js`)).registerSkillsCli(program)}},{name:`update`,description:`Update BuilderForceAgents and inspect update channel status`,hasSubcommands:!0,register:async program=>{(await import(`./update-cli-Wa-nZ_Lq.js`)).registerUpdateCli(program)}},{name:`completion`,description:`Generate shell completion script`,hasSubcommands:!1,register:async program=>{(await import(`./completion-cli-BuUAEqQw.js`)).registerCompletionCli(program)}}];function getSubCliEntries(){return entries}function getSubCliCommandsWithSubcommands(){return entries.filter(entry=>entry.hasSubcommands).map(entry=>entry.name)}function removeCommand$1(program,command){let commands=program.commands,index=commands.indexOf(command);index>=0&&commands.splice(index,1)}async function registerSubCliByName(program,name){let entry=entries.find(candidate=>candidate.name===name);if(!entry)return!1;let existing=program.commands.find(cmd=>cmd.name()===entry.name);return existing&&removeCommand$1(program,existing),await entry.register(program),!0}function registerLazyCommand(program,entry){let placeholder=program.command(entry.name).description(entry.description);placeholder.allowUnknownOption(!0),placeholder.allowExcessArguments(!0),placeholder.action(async(...actionArgs)=>{removeCommand$1(program,placeholder),await entry.register(program),await reparseProgramFromActionArgs(program,actionArgs)})}function registerSubCliCommands(program,argv=process.argv){if(shouldEagerRegisterSubcommands(argv)){for(let entry of entries)entry.register(program);return}let primary=getPrimaryCommand(argv);if(primary&&shouldRegisterPrimaryOnly(argv)){let entry=entries.find(candidate=>candidate.name===primary);if(entry){registerLazyCommand(program,entry);return}}for(let candidate of entries)registerLazyCommand(program,candidate)}const shouldRegisterCorePrimaryOnly=argv=>!hasHelpOrVersion(argv),coreEntries=[{commands:[{name:`setup`,description:`Initialize local config and agent workspace`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.setup-BKyCvo9_.js`)).registerSetupCommand(program)}},{commands:[{name:`onboard`,description:`Interactive onboarding wizard for gateway, workspace, and skills`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.onboard-Cwozk0Tx.js`)).registerOnboardCommand(program)}},{commands:[{name:`connect`,description:`Register this machine as an agent host in a Builderforce workspace`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.connect-Bv89G_Qz.js`)).registerConnectCommand(program)}},{commands:[{name:`configure`,description:`Interactive setup wizard for credentials, channels, gateway, and agent defaults`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.configure-CREcJhKA.js`)).registerConfigureCommand(program)}},{commands:[{name:`config`,description:`Non-interactive config helpers (get/set/unset). Default: starts setup wizard.`,hasSubcommands:!0}],register:async({program})=>{(await import(`./config-cli-Bhrj7H1i.js`)).registerConfigCli(program)}},{commands:[{name:`doctor`,description:`Health checks + quick fixes for the gateway and channels`,hasSubcommands:!1},{name:`dashboard`,description:`Open the Control UI with your current token`,hasSubcommands:!1},{name:`reset`,description:`Reset local config/state (keeps the CLI installed)`,hasSubcommands:!1},{name:`stop`,description:`Stop the running gateway service`,hasSubcommands:!1},{name:`uninstall`,description:`Uninstall the gateway service + local data (CLI remains)`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.maintenance-Dnp_Ii2x.js`)).registerMaintenanceCommands(program)}},{commands:[{name:`message`,description:`Send, read, and manage messages`,hasSubcommands:!0}],register:async({program,ctx})=>{(await import(`./register.message-B6E0uAEu.js`)).registerMessageCommands(program,ctx)}},{commands:[{name:`memory`,description:`Search and reindex memory files`,hasSubcommands:!0}],register:async({program})=>{(await import(`./memory-cli-B0IxKYMU.js`)).registerMemoryCli(program)}},{commands:[{name:`agent`,description:`Run one agent turn via the Gateway`,hasSubcommands:!1},{name:`agents`,description:`Manage isolated agents (workspaces, auth, routing)`,hasSubcommands:!0}],register:async({program,ctx})=>{(await import(`./register.agent-DfYqZls1.js`)).registerAgentCommands(program,{agentChannelOptions:ctx.agentChannelOptions})}},{commands:[{name:`status`,description:`Show channel health and recent session recipients`,hasSubcommands:!1},{name:`health`,description:`Fetch health from the running gateway`,hasSubcommands:!1},{name:`sessions`,description:`List stored conversation sessions`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.status-health-sessions-CcL6srRC.js`)).registerStatusHealthSessionsCommands(program)}},{commands:[{name:`browser`,description:`Manage BuilderForceAgents's dedicated browser (Chrome/Chromium)`,hasSubcommands:!0}],register:async({program})=>{(await import(`./browser-cli-DohEf-8_.js`)).registerBrowserCli(program)}},{commands:[{name:`init`,description:`Initialize a project with builderForceAgents`,hasSubcommands:!1},{name:`project`,description:`Manage builderForceAgents project context`,hasSubcommands:!0},{name:`workforce`,description:`Manage Builderforce Workforce agents (custom trained LLMs)`,hasSubcommands:!0}],register:async({program})=>{let mod=await import(`./builderforce-CCfM1c79.js`);program.addCommand(mod.createInitCommand()),program.addCommand(mod.createBuilderForceAgentsCommand()),program.addCommand(mod.createAgentCommand())}}];function collectCoreCliCommandNames(predicate){let seen=new Set,names=[];for(let entry of coreEntries)for(let command of entry.commands)predicate&&!predicate(command)||seen.has(command.name)||(seen.add(command.name),names.push(command.name));return names}function getCoreCliCommandNames(){return collectCoreCliCommandNames()}function getCoreCliCommandsWithSubcommands(){return collectCoreCliCommandNames(command=>command.hasSubcommands)}function removeCommand(program,command){let commands=program.commands,index=commands.indexOf(command);index>=0&&commands.splice(index,1)}function removeEntryCommands(program,entry){for(let cmd of entry.commands){let existing=program.commands.find(c=>c.name()===cmd.name);existing&&removeCommand(program,existing)}}function registerLazyCoreCommand(program,ctx,entry,command){let placeholder=program.command(command.name).description(command.description);placeholder.allowUnknownOption(!0),placeholder.allowExcessArguments(!0),placeholder.action(async(...actionArgs)=>{removeEntryCommands(program,entry),await entry.register({program,ctx,argv:process.argv}),await reparseProgramFromActionArgs(program,actionArgs)})}async function registerCoreCliByName(program,ctx,name,argv=process.argv){let entry=coreEntries.find(candidate=>candidate.commands.some(cmd=>cmd.name===name));return entry?(removeEntryCommands(program,entry),await entry.register({program,ctx,argv}),!0):!1}function registerCoreCliCommands(program,ctx,argv){let primary=getPrimaryCommand(argv);if(primary&&shouldRegisterCorePrimaryOnly(argv)){let entry=coreEntries.find(candidate=>candidate.commands.some(cmd=>cmd.name===primary));if(entry){let cmd=entry.commands.find(c=>c.name===primary);cmd&®isterLazyCoreCommand(program,ctx,entry,cmd);return}}for(let entry of coreEntries)for(let cmd of entry.commands)registerLazyCoreCommand(program,ctx,entry,cmd)}function registerProgramCommands(program,ctx,argv=process.argv){registerCoreCliCommands(program,ctx,argv),registerSubCliCommands(program,argv)}const PROGRAM_CONTEXT_SYMBOL=Symbol.for(`builderforce.cli.programContext`);function setProgramContext(program,ctx){program[PROGRAM_CONTEXT_SYMBOL]=ctx}function getProgramContext(program){return program[PROGRAM_CONTEXT_SYMBOL]}export{registerCoreCliByName as a,getSubCliEntries as c,getVerboseFlag as d,hasHelpOrVersion as f,getCoreCliCommandsWithSubcommands as i,registerSubCliByName as l,setProgramContext as n,registerProgramCommands as o,getCoreCliCommandNames as r,getSubCliCommandsWithSubcommands as s,getProgramContext as t,getCommandPath as u};
|