@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,4 +1,4 @@
|
|
|
1
|
-
import{J as resolveResponseUsageMode,K as normalizeUsageDisplay,V as listThinkingLevelLabels,z as formatThinkingLevels}from"./embedded-helpers-2fP2Yq8h.js";import{C as parseAgentSessionKey,a as buildAgentMainSessionKey,d as normalizeAgentId,f as normalizeMainKey}from"./session-key-EoB0qaG9.js";import{d as stripAnsi,f as truncateToWidth,p as visibleWidth}from"./subsystem-B3TqcCrZ.js";import{i as logWarn,t as logDebug}from"./logger-Bch0bx9c.js";import{l as resolveDefaultAgentId}from"./agent-scope-DPtjOxzp.js";import{t as normalizeBaseUrl}from"./normalize-base-url-DmugqkQ6.js";import{i as readSharedEnvVar}from"./env-file-D1MDi-AM.js";import{c as writeConfigFile,r as loadConfig}from"./io-BNtgT4VB.js";import{n as resolveToolDisplay,t as formatToolDetail}from"./tool-display-ByOZtWvA.js";import{n as loadProjectContext}from"./project-context-store-Dbbjk8CQ.js";import{a as buildStagedSummary,d as isStagingActive,f as rejectAllEdits,i as activateStaging,l as getStagedEdits,m as resolveStagedTarget,n as acceptAllEdits,o as buildUnifiedDiff,p as rejectEdit,r as acceptEdit,s as deactivateStaging,t as isModelCached,u as hasStagedEdits,v as listChatCommands,y as listChatCommandsForConfig}from"./builderforcellm-syscheck-Cp4LMft_.js";import{n as formatTimeAgo,t as formatRelativeTimestamp}from"./format-relative-niF9gXss.js";import{n as formatTokenCount}from"./usage-format-DGf8ZWPH.js";import{c as saveSessionHandoff,f as initializeBuilderForceAgentsProject,n as loadWorkspaceState,s as loadLatestSessionHandoff}from"./project-context-BLpMH93w.js";import{s as downloadBuilderForceAgentsLlmModel}from"./transformers-stream-D7nRu4Qu.js";import{r as syncBuilderForceAgentsDirectoryWithMetaUpdate}from"./builderforce-directory-sync-DRmWhsXb.js";import{a as HIPPOCAMPUS_MODEL_ID,c as applyTransformersProviderConfig,i as HIPPOCAMPUS_DTYPE,l as defaultCacheDir,n as AMYGDALA_MODEL_ID,r as BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID,t as AMYGDALA_DTYPE}from"./auth-choice.apply.transformers-
|
|
1
|
+
import{J as resolveResponseUsageMode,K as normalizeUsageDisplay,V as listThinkingLevelLabels,z as formatThinkingLevels}from"./embedded-helpers-2fP2Yq8h.js";import{C as parseAgentSessionKey,a as buildAgentMainSessionKey,d as normalizeAgentId,f as normalizeMainKey}from"./session-key-EoB0qaG9.js";import{d as stripAnsi,f as truncateToWidth,p as visibleWidth}from"./subsystem-B3TqcCrZ.js";import{i as logWarn,t as logDebug}from"./logger-Bch0bx9c.js";import{l as resolveDefaultAgentId}from"./agent-scope-DPtjOxzp.js";import{t as normalizeBaseUrl}from"./normalize-base-url-DmugqkQ6.js";import{i as readSharedEnvVar}from"./env-file-D1MDi-AM.js";import{c as writeConfigFile,r as loadConfig}from"./io-BNtgT4VB.js";import{n as resolveToolDisplay,t as formatToolDetail}from"./tool-display-ByOZtWvA.js";import{n as loadProjectContext}from"./project-context-store-Dbbjk8CQ.js";import{a as buildStagedSummary,d as isStagingActive,f as rejectAllEdits,i as activateStaging,l as getStagedEdits,m as resolveStagedTarget,n as acceptAllEdits,o as buildUnifiedDiff,p as rejectEdit,r as acceptEdit,s as deactivateStaging,t as isModelCached,u as hasStagedEdits,v as listChatCommands,y as listChatCommandsForConfig}from"./builderforcellm-syscheck-Cp4LMft_.js";import{n as formatTimeAgo,t as formatRelativeTimestamp}from"./format-relative-niF9gXss.js";import{n as formatTokenCount}from"./usage-format-DGf8ZWPH.js";import{c as saveSessionHandoff,f as initializeBuilderForceAgentsProject,n as loadWorkspaceState,s as loadLatestSessionHandoff}from"./project-context-BLpMH93w.js";import{s as downloadBuilderForceAgentsLlmModel}from"./transformers-stream-D7nRu4Qu.js";import{r as syncBuilderForceAgentsDirectoryWithMetaUpdate}from"./builderforce-directory-sync-DRmWhsXb.js";import{a as HIPPOCAMPUS_MODEL_ID,c as applyTransformersProviderConfig,i as HIPPOCAMPUS_DTYPE,l as defaultCacheDir,n as AMYGDALA_MODEL_ID,r as BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID,t as AMYGDALA_DTYPE}from"./auth-choice.apply.transformers-CgfGlqy1.js";import{a as formatContextUsageLine,c as sanitizeRenderableText,i as extractTextFromMessage,n as GatewayChatClient,o as formatTokens,r as asString,s as isCommandMessage,t as TuiStreamAssembler}from"./tui-stream-assembler-4UmPxCWJ.js";import{randomUUID}from"node:crypto";import chalk from"chalk";import{spawn}from"node:child_process";import{Box,CombinedAutocompleteProvider,Container,Editor,Input,Key,Loader,Markdown,ProcessTerminal,SelectList,SettingsList,Spacer,TUI,Text,getEditorKeybindings,isKeyRelease,matchesKey}from"@mariozechner/pi-tui";import{highlight,supportsLanguage}from"cli-highlight";const VERBOSE_LEVELS=[`on`,`off`],REASONING_LEVELS=[`on`,`off`],ELEVATED_LEVELS=[`on`,`off`,`ask`,`full`],ACTIVATION_LEVELS=[`mention`,`always`],USAGE_FOOTER_LEVELS=[`off`,`tokens`,`full`],COMMAND_ALIASES={elev:`elevated`,onboard:`setup`,service:`gateway`};function parseCommand(input){let trimmed=input.replace(/^\//,``).trim();if(!trimmed)return{name:``,args:``};let[name,...rest]=trimmed.split(/\s+/),normalized=name.toLowerCase();return{name:COMMAND_ALIASES[normalized]??normalized,args:rest.join(` `).trim()}}function getSlashCommands(options={}){let thinkLevels=listThinkingLevelLabels(options.provider,options.model),commands=[{name:`help`,description:`Show slash command help`},{name:`status`,description:`Show gateway status summary`},{name:`agent`,description:`Switch agent (or open picker)`},{name:`agents`,description:`Open agent picker`},{name:`session`,description:`Switch session (or open picker)`},{name:`sessions`,description:`Open session picker`},{name:`fork`,description:`Clone the current session into a new transcript`},{name:`undo`,description:`Rewind the last conversation turn`},{name:`model`,description:`Set model (or open picker)`},{name:`models`,description:`Open model picker`},{name:`think`,description:`Set thinking level`,getArgumentCompletions:prefix=>thinkLevels.filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`verbose`,description:`Set verbose on/off`,getArgumentCompletions:prefix=>VERBOSE_LEVELS.filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`reasoning`,description:`Set reasoning on/off`,getArgumentCompletions:prefix=>REASONING_LEVELS.filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`usage`,description:`Toggle per-response usage line`,getArgumentCompletions:prefix=>USAGE_FOOTER_LEVELS.filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`elevated`,description:`Set elevated on/off/ask/full`,getArgumentCompletions:prefix=>ELEVATED_LEVELS.filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`elev`,description:`Alias for /elevated`,getArgumentCompletions:prefix=>ELEVATED_LEVELS.filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`activation`,description:`Set group activation`,getArgumentCompletions:prefix=>ACTIVATION_LEVELS.filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`abort`,description:`Abort active run`},{name:`new`,description:`Reset the session`},{name:`reset`,description:`Reset the session`},{name:`settings`,description:`Open settings`},{name:`restart`,description:`Restart gateway locally`},{name:`gateway`,description:`Gateway control (status/start/stop/restart/token <value>)`},{name:`daemon`,description:`Alias for /gateway`},{name:`logs`,description:`Show recent gateway log lines`},{name:`init`,description:`Initialize builderForceAgents project in workspace`},{name:`handoff`,description:`Ask the agent to save a session handoff for the next session`},{name:`exit`,description:`Exit the TUI`},{name:`quit`,description:`Exit the TUI`},{name:`setup`,description:`Run the setup/onboarding wizard`},{name:`onboard`,description:`Alias for /setup`},{name:`localbrain`,description:`Toggle local brain on/off/refresh`,getArgumentCompletions:prefix=>[`on`,`off`,`refresh`].filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`project`,description:`Show project context from .builderForceAgents directory`},{name:`sync`,description:`Force sync .builderForceAgents directory to Builderforce`},{name:`spec`,description:`Run a spec-driven planning workflow (PRD → architecture → tasks)`},{name:`workflow`,description:`Show status of the latest (or a specific) workflow`},{name:`stage`,description:`Toggle staged-edit mode (buffer write/edit for /diff /accept /reject)`,getArgumentCompletions:prefix=>[`on`,`off`,`status`].filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`diff`,description:`Show staged file changes (or a specific file). Use after agent edits.`},{name:`accept`,description:`Apply staged changes to disk. /accept [file] or /accept all`},{name:`reject`,description:`Discard staged changes. /reject [file] or /reject all`}],seen=new Set(commands.map(command=>command.name)),gatewayCommands=options.cfg?listChatCommandsForConfig(options.cfg):listChatCommands();for(let command of gatewayCommands){let aliases=command.textAliases.length>0?command.textAliases:[`/${command.key}`];for(let alias of aliases){let name=alias.replace(/^\//,``).trim();!name||seen.has(name)||(seen.add(name),commands.push({name,description:command.description}))}}return commands}function helpText(options={}){return[`Slash commands:`,`/help`,`/commands`,`/status`,`/agent <id> (or /agents)`,`/session <key> (or /sessions)`,`/fork`,`/undo`,`/model <provider/model> (or /models)`,`/think <${formatThinkingLevels(options.provider,options.model,`|`)}>`,`/verbose <on|off>`,`/reasoning <on|off>`,`/usage <off|tokens|full>`,`/elevated <on|off|ask|full>`,`/elev <on|off|ask|full>`,`/activation <mention|always>`,`/new or /reset`,`/abort`,`/compact [instructions]`,`/settings`,`/restart (restart gateway; works when disconnected)`,`/gateway <status|start|stop|restart|token <value>>`,`/daemon <status|start|stop|restart|token <value>>`,`/logs [count]`,`/init`,`/handoff`,`/project`,`/sync`,`/spec <goal>`,`/workflow [id]`,`/stage [on|off|status]`,`/diff [file]`,`/accept [file|all]`,`/reject [file|all]`,`/exit`,`/localbrain <on|off|refresh>`,`/setup or /onboard`].join(`
|
|
2
2
|
`)}function createSyntaxTheme(fallback){return{keyword:chalk.hex(`#C586C0`),built_in:chalk.hex(`#4EC9B0`),type:chalk.hex(`#4EC9B0`),literal:chalk.hex(`#569CD6`),number:chalk.hex(`#B5CEA8`),string:chalk.hex(`#CE9178`),regexp:chalk.hex(`#D16969`),symbol:chalk.hex(`#B5CEA8`),class:chalk.hex(`#4EC9B0`),function:chalk.hex(`#DCDCAA`),title:chalk.hex(`#DCDCAA`),params:chalk.hex(`#9CDCFE`),comment:chalk.hex(`#6A9955`),doctag:chalk.hex(`#608B4E`),meta:chalk.hex(`#9CDCFE`),"meta-keyword":chalk.hex(`#C586C0`),"meta-string":chalk.hex(`#CE9178`),section:chalk.hex(`#DCDCAA`),tag:chalk.hex(`#569CD6`),name:chalk.hex(`#9CDCFE`),attr:chalk.hex(`#9CDCFE`),attribute:chalk.hex(`#9CDCFE`),variable:chalk.hex(`#9CDCFE`),bullet:chalk.hex(`#D7BA7D`),code:chalk.hex(`#CE9178`),emphasis:chalk.italic,strong:chalk.bold,formula:chalk.hex(`#C586C0`),link:chalk.hex(`#4EC9B0`),quote:chalk.hex(`#6A9955`),addition:chalk.hex(`#B5CEA8`),deletion:chalk.hex(`#F44747`),"selector-tag":chalk.hex(`#D7BA7D`),"selector-id":chalk.hex(`#D7BA7D`),"selector-class":chalk.hex(`#D7BA7D`),"selector-attr":chalk.hex(`#D7BA7D`),"selector-pseudo":chalk.hex(`#D7BA7D`),"template-tag":chalk.hex(`#C586C0`),"template-variable":chalk.hex(`#9CDCFE`),default:fallback}}const palette={text:`#E8E3D5`,dim:`#7B7F87`,accent:`#F6C453`,accentSoft:`#F2A65A`,border:`#3C414B`,userBg:`#2B2F36`,userText:`#F3EEE0`,systemText:`#9BA3B2`,toolPendingBg:`#1F2A2F`,toolSuccessBg:`#1E2D23`,toolErrorBg:`#2F1F1F`,toolTitle:`#F6C453`,toolOutput:`#E1DACB`,quote:`#8CC8FF`,quoteBorder:`#3B4D6B`,code:`#F0C987`,codeBlock:`#1E232A`,codeBorder:`#343A45`,modalBorder:`#4D8DFF`,modalBg:`#171A20`,link:`#7DD3A5`,error:`#F97066`,success:`#7DD3A5`},fg=hex=>text=>chalk.hex(hex)(text),bg=hex=>text=>chalk.bgHex(hex)(text),syntaxTheme=createSyntaxTheme(fg(palette.code));function highlightCode(code,lang){try{return highlight(code,{language:lang&&supportsLanguage(lang)?lang:void 0,theme:syntaxTheme,ignoreIllegals:!0}).split(`
|
|
3
3
|
`)}catch{return code.split(`
|
|
4
4
|
`).map(line=>fg(palette.code)(line))}}const theme={fg:fg(palette.text),assistantText:text=>text,dim:fg(palette.dim),accent:fg(palette.accent),accentSoft:fg(palette.accentSoft),success:fg(palette.success),error:fg(palette.error),header:text=>chalk.bold(fg(palette.accent)(text)),system:fg(palette.systemText),userBg:bg(palette.userBg),userText:fg(palette.userText),toolTitle:fg(palette.toolTitle),toolOutput:fg(palette.toolOutput),toolPendingBg:bg(palette.toolPendingBg),toolSuccessBg:bg(palette.toolSuccessBg),toolErrorBg:bg(palette.toolErrorBg),modalBg:bg(palette.modalBg),border:fg(palette.border),modalBorder:fg(palette.modalBorder),bold:text=>chalk.bold(text),italic:text=>chalk.italic(text)},markdownTheme={heading:text=>chalk.bold(fg(palette.accent)(text)),link:text=>fg(palette.link)(text),linkUrl:text=>chalk.dim(text),code:text=>fg(palette.code)(text),codeBlock:text=>fg(palette.code)(text),codeBlockBorder:text=>fg(palette.codeBorder)(text),quote:text=>fg(palette.quote)(text),quoteBorder:text=>fg(palette.quoteBorder)(text),hr:text=>fg(palette.border)(text),listBullet:text=>fg(palette.accentSoft)(text),bold:text=>chalk.bold(text),italic:text=>chalk.italic(text),strikethrough:text=>chalk.strikethrough(text),underline:text=>chalk.underline(text),highlightCode},baseSelectListTheme={selectedPrefix:text=>fg(palette.accent)(text),selectedText:text=>chalk.bold(fg(palette.accent)(text)),description:text=>fg(palette.dim)(text),scrollInfo:text=>fg(palette.dim)(text),noMatch:text=>fg(palette.dim)(text)},selectListTheme=baseSelectListTheme,filterableSelectListTheme={...baseSelectListTheme,filterLabel:text=>fg(palette.dim)(text)},settingsListTheme={label:(text,selected)=>selected?chalk.bold(fg(palette.accent)(text)):fg(palette.text)(text),value:(text,selected)=>selected?fg(palette.accentSoft)(text):fg(palette.dim)(text),description:text=>fg(palette.systemText)(text),cursor:fg(palette.accent)(`→ `),hint:text=>fg(palette.dim)(text)},editorTheme={borderColor:text=>fg(palette.border)(text),selectList:selectListTheme},searchableSelectListTheme={...baseSelectListTheme,searchPrompt:text=>fg(palette.accentSoft)(text),searchInput:text=>fg(palette.text)(text),matchHighlight:text=>chalk.bold(fg(palette.accent)(text))};var AssistantMessageComponent=class extends Container{constructor(text){super(),this.body=new Markdown(text,1,0,markdownTheme,{color:line=>theme.assistantText(line)}),this.addChild(new Spacer(1)),this.addChild(this.body)}setText(text){this.body.setText(text)}};function formatArgs(toolName,args){let detail=formatToolDetail(resolveToolDisplay({name:toolName,args}));if(detail)return sanitizeRenderableText(detail);if(!args||typeof args!=`object`)return``;try{return sanitizeRenderableText(JSON.stringify(args))}catch{return``}}function extractText(result){if(!result?.content)return``;let lines=[];for(let entry of result.content)if(entry.type===`text`&&entry.text)lines.push(sanitizeRenderableText(entry.text));else if(entry.type===`image`){let mime=entry.mimeType??`image`,size=entry.bytes?` ${Math.round(entry.bytes/1024)}kb`:``,omitted=entry.omitted?` (omitted)`:``;lines.push(`[${mime}${size}${omitted}]`)}return lines.join(`
|
|
@@ -24,4 +24,4 @@ This will re-download the latest local brain models.`);break}if(action===`reset`
|
|
|
24
24
|
`))deps.chatLog.addSystem(`[local] ${line}`);deps.chatLog.addSystem(`[local] exit ${code??`?`}${signal?` (signal ${String(signal)})`:``}`),deps.tui.requestRender(),resolve()}),child.on(`error`,err=>{deps.chatLog.addSystem(`[local] error: ${String(err)}`),deps.tui.requestRender(),resolve()})})}}}var ModalOverlayFrame=class{constructor(inner){this.inner=inner,this._focused=!1}render(width){let innerWidth=Math.max(1,width-2),innerLines=this.inner.render(innerWidth),contentLines=innerLines.length>0?innerLines:[``],top=theme.modalBorder(`┌${`─`.repeat(innerWidth)}┐`),bottom=theme.modalBorder(`└${`─`.repeat(innerWidth)}┘`);return[top,...contentLines.map(line=>{let trimmed=truncateToWidth(line,innerWidth,``),pad=` `.repeat(Math.max(0,innerWidth-visibleWidth(trimmed)));return`${theme.modalBorder(`│`)}${theme.modalBg(`${trimmed}${pad}`)}${theme.modalBorder(`│`)}`}),bottom]}handleInput(data){this.inner.handleInput?.(data)}invalidate(){this.inner.invalidate()}get focused(){return this._focused}set focused(value){this._focused=value;let maybeFocusable=this.inner;typeof maybeFocusable.focused==`boolean`&&(maybeFocusable.focused=value)}};function createOverlayHandlers(host,fallbackFocus){return{openOverlay:component=>{host.showOverlay(new ModalOverlayFrame(component))},closeOverlay:()=>{if(host.hasOverlay()){host.hideOverlay();return}host.setFocus(fallbackFocus)}}}function createSessionActions(context){let{client,chatLog,tui,opts,state,agentNames,initialSessionInput,initialSessionAgentId,resolveSessionKey,updateHeader,updateFooter,updateAutocompleteProvider,setActivityStatus,clearLocalRunIds}=context,refreshSessionInfoPromise=Promise.resolve(),lastSessionDefaults=null,applyAgentsResult=result=>{state.agentDefaultId=normalizeAgentId(result.defaultId),state.sessionMainKey=normalizeMainKey(result.mainKey),state.sessionScope=result.scope??state.sessionScope,state.agents=result.agents.map(agent=>({id:normalizeAgentId(agent.id),name:agent.name?.trim()||void 0})),agentNames.clear();for(let agent of state.agents)agent.name&&agentNames.set(agent.id,agent.name);if(state.initialSessionApplied)state.agents.some(agent=>agent.id===state.currentAgentId)||(state.currentAgentId=state.agents[0]?.id??normalizeAgentId(result.defaultId??state.currentAgentId));else{initialSessionAgentId?state.agents.some(agent=>agent.id===initialSessionAgentId)&&(state.currentAgentId=initialSessionAgentId):state.agents.some(agent=>agent.id===state.currentAgentId)||(state.currentAgentId=state.agents[0]?.id??normalizeAgentId(result.defaultId??state.currentAgentId));let nextSessionKey=resolveSessionKey(initialSessionInput);nextSessionKey!==state.currentSessionKey&&(state.currentSessionKey=nextSessionKey),state.initialSessionApplied=!0}updateHeader(),updateFooter()},refreshAgents=async()=>{try{applyAgentsResult(await client.listAgents())}catch(err){chatLog.addSystem(`agents list failed: ${String(err)}`)}},updateAgentFromSessionKey=key=>{let parsed=parseAgentSessionKey(key);if(!parsed)return;let next=normalizeAgentId(parsed.agentId);next!==state.currentAgentId&&(state.currentAgentId=next)},resolveModelSelection=entry=>{if(entry?.modelProvider||entry?.model)return{modelProvider:entry.modelProvider??state.sessionInfo.modelProvider,model:entry.model??state.sessionInfo.model};let overrideModel=entry?.modelOverride?.trim();return overrideModel?{modelProvider:entry?.providerOverride?.trim()||state.sessionInfo.modelProvider,model:overrideModel}:{modelProvider:state.sessionInfo.modelProvider,model:state.sessionInfo.model}},applySessionInfo=params=>{let entry=params.entry??void 0,defaults=params.defaults??lastSessionDefaults??void 0,previousDefaults=lastSessionDefaults,defaultsChanged=params.defaults?previousDefaults?.model!==params.defaults.model||previousDefaults?.modelProvider!==params.defaults.modelProvider||previousDefaults?.contextTokens!==params.defaults.contextTokens:!1;params.defaults&&(lastSessionDefaults=params.defaults);let entryUpdatedAt=entry?.updatedAt??null,currentUpdatedAt=state.sessionInfo.updatedAt??null,modelChanged=entry?.modelProvider!==void 0&&entry.modelProvider!==state.sessionInfo.modelProvider||entry?.model!==void 0&&entry.model!==state.sessionInfo.model;if(!params.force&&entryUpdatedAt!==null&¤tUpdatedAt!==null&&entryUpdatedAt<currentUpdatedAt&&!defaultsChanged&&!modelChanged)return;let next={...state.sessionInfo};entry?.thinkingLevel!==void 0&&(next.thinkingLevel=entry.thinkingLevel),entry?.verboseLevel!==void 0&&(next.verboseLevel=entry.verboseLevel),entry?.reasoningLevel!==void 0&&(next.reasoningLevel=entry.reasoningLevel),entry?.responseUsage!==void 0&&(next.responseUsage=entry.responseUsage),entry?.inputTokens!==void 0&&(next.inputTokens=entry.inputTokens),entry?.outputTokens!==void 0&&(next.outputTokens=entry.outputTokens),entry?.totalTokens!==void 0&&(next.totalTokens=entry.totalTokens),(entry?.contextTokens!==void 0||defaults?.contextTokens!==void 0)&&(next.contextTokens=entry?.contextTokens??defaults?.contextTokens??state.sessionInfo.contextTokens),entry?.displayName!==void 0&&(next.displayName=entry.displayName),entry?.updatedAt!==void 0&&(next.updatedAt=entry.updatedAt);let selection=resolveModelSelection(entry);selection.modelProvider!==void 0&&(next.modelProvider=selection.modelProvider),selection.model!==void 0&&(next.model=selection.model),state.sessionInfo=next,updateAutocompleteProvider(),updateFooter(),tui.requestRender()},runRefreshSessionInfo=async()=>{try{let listAgentId=(()=>{if(state.currentSessionKey===`global`||state.currentSessionKey===`unknown`)return;let parsed=parseAgentSessionKey(state.currentSessionKey);return parsed?.agentId?normalizeAgentId(parsed.agentId):state.currentAgentId})(),result=await client.listSessions({includeGlobal:!1,includeUnknown:!1,agentId:listAgentId}),normalizeMatchKey=key=>parseAgentSessionKey(key)?.rest??key,currentMatchKey=normalizeMatchKey(state.currentSessionKey),entry=result.sessions.find(row=>row.key===state.currentSessionKey?!0:normalizeMatchKey(row.key)===currentMatchKey);entry?.key&&entry.key!==state.currentSessionKey&&(updateAgentFromSessionKey(entry.key),state.currentSessionKey=entry.key,updateHeader()),applySessionInfo({entry,defaults:result.defaults})}catch(err){chatLog.addSystem(`sessions list failed: ${String(err)}`)}},refreshSessionInfo=async()=>{refreshSessionInfoPromise=refreshSessionInfoPromise.then(runRefreshSessionInfo,runRefreshSessionInfo),await refreshSessionInfoPromise},applySessionInfoFromPatch=result=>{if(!result?.entry)return;result.key&&result.key!==state.currentSessionKey&&(updateAgentFromSessionKey(result.key),state.currentSessionKey=result.key,updateHeader());let resolved=result.resolved;applySessionInfo({entry:resolved&&(resolved.modelProvider||resolved.model)?{...result.entry,modelProvider:resolved.modelProvider??result.entry.modelProvider,model:resolved.model??result.entry.model}:result.entry,force:!0})},loadHistory=async()=>{try{let record=await client.loadHistory({sessionKey:state.currentSessionKey,limit:opts.historyLimit??200});state.currentSessionId=typeof record.sessionId==`string`?record.sessionId:null,state.sessionInfo.thinkingLevel=record.thinkingLevel??state.sessionInfo.thinkingLevel,state.sessionInfo.verboseLevel=record.verboseLevel??state.sessionInfo.verboseLevel;let showTools=(state.sessionInfo.verboseLevel??`off`)!==`off`;chatLog.clearAll(),chatLog.addSystem(`session ${state.currentSessionKey}`);for(let entry of record.messages??[]){if(!entry||typeof entry!=`object`)continue;let message=entry;if(isCommandMessage(message)){let text=extractTextFromMessage(message);text&&chatLog.addSystem(text);continue}if(message.role===`user`){let text=extractTextFromMessage(message);text&&chatLog.addUser(text);continue}if(message.role===`assistant`){let text=extractTextFromMessage(message,{includeThinking:state.showThinking});text&&chatLog.finalizeAssistant(text);continue}if(message.role===`toolResult`){if(!showTools)continue;let toolCallId=asString(message.toolCallId,``),toolName=asString(message.toolName,`tool`);chatLog.startTool(toolCallId,toolName,{}).setResult({content:Array.isArray(message.content)?message.content:[],details:typeof message.details==`object`&&message.details?message.details:void 0},{isError:!!message.isError})}}state.historyLoaded=!0}catch(err){chatLog.addSystem(`history failed: ${String(err)}`)}await refreshSessionInfo(),tui.requestRender()};return{applyAgentsResult,refreshAgents,refreshSessionInfo,applySessionInfoFromPatch,loadHistory,setSession:async rawKey=>{let nextKey=resolveSessionKey(rawKey);updateAgentFromSessionKey(nextKey),state.currentSessionKey=nextKey,state.activeChatRunId=null,state.currentSessionId=null,state.historyLoaded=!1,clearLocalRunIds?.(),updateHeader(),updateFooter(),await loadHistory();try{let handoff=await loadLatestSessionHandoff(process.cwd());if(handoff){let lines=[`Resuming from session ${handoff.sessionId.slice(0,8)} (${handoff.timestamp.slice(0,10)})`,`Summary: ${handoff.summary}`];handoff.decisions.length>0&&lines.push(`Decisions: ${handoff.decisions.map(d=>`• ${d}`).join(` `)}`),handoff.nextSteps.length>0&&lines.push(`Next steps: ${handoff.nextSteps.map(s=>`• ${s}`).join(` `)}`),handoff.openQuestions.length>0&&lines.push(`Open questions: ${handoff.openQuestions.map(q=>`• ${q}`).join(` `)}`),chatLog.addSystem(lines.join(`
|
|
25
25
|
`))}}catch{}},abortActive:async()=>{if(!state.activeChatRunId){chatLog.addSystem(`no active run`),tui.requestRender();return}try{await client.abortChat({sessionKey:state.currentSessionKey,runId:state.activeChatRunId}),setActivityStatus(`aborted`)}catch(err){chatLog.addSystem(`abort failed: ${String(err)}`),setActivityStatus(`abort failed`)}tui.requestRender()}}}const defaultWaitingPhrases=[`flibbertigibbeting`,`kerfuffling`,`dillydallying`,`twiddling thumbs`,`noodling`,`bamboozling`,`moseying`,`hobnobbing`,`pondering`,`conjuring`];function pickWaitingPhrase(tick,phrases=defaultWaitingPhrases){return phrases[Math.floor(tick/10)%phrases.length]??phrases[0]??`waiting`}function shimmerText(theme,text,tick){let hi=ch=>theme.bold(theme.accentSoft(ch)),pos=tick%(text.length+6),start=Math.max(0,pos-6),end=Math.min(text.length-1,pos),out=``;for(let i=0;i<text.length;i++){let ch=text[i];out+=i>=start&&i<=end?hi(ch):theme.dim(ch)}return out}function buildWaitingStatusMessage(params){let phrase=pickWaitingPhrase(params.tick,params.phrases);return`${shimmerText(params.theme,`${phrase}…`,params.tick)} • ${params.elapsed} | ${params.connectionStatus}`}function createEditorSubmitHandler(params){return text=>{let raw=text,value=raw.trim();if(params.editor.setText(``),value){if(raw.startsWith(`!`)&&raw!==`!`){params.editor.addToHistory(raw),params.handleBangLine(raw);return}if(params.editor.addToHistory(value),value.startsWith(`/`)){params.handleCommand(value);return}params.sendMessage(value)}}}function shouldEnableWindowsGitBashPasteFallback(params){if((params?.platform??process.platform)!==`win32`)return!1;let env=params?.env??process.env,msystem=(env.MSYSTEM??``).toUpperCase(),shell=env.SHELL??``,termProgram=(env.TERM_PROGRAM??``).toLowerCase();return msystem.startsWith(`MINGW`)||msystem.startsWith(`MSYS`)||shell.toLowerCase().includes(`bash`)?!0:termProgram.includes(`mintty`)}function createSubmitBurstCoalescer(params){let windowMs=Math.max(1,params.burstWindowMs??50),now=params.now??(()=>Date.now()),setTimer=params.setTimer??setTimeout,clearTimer=params.clearTimer??clearTimeout,pending=null,pendingAt=0,flushTimer=null,clearFlushTimer=()=>{flushTimer&&=(clearTimer(flushTimer),null)},flushPending=()=>{if(pending===null)return;let value=pending;pending=null,pendingAt=0,clearFlushTimer(),params.submit(value)},scheduleFlush=()=>{clearFlushTimer(),flushTimer=setTimer(()=>{flushPending()},windowMs)};return value=>{if(!params.enabled){params.submit(value);return}if(value.includes(`
|
|
26
26
|
`)){flushPending(),params.submit(value);return}let ts=now();if(pending===null){pending=value,pendingAt=ts,scheduleFlush();return}if(ts-pendingAt<=windowMs){pending=`${pending}\n${value}`,pendingAt=ts,scheduleFlush();return}flushPending(),pending=value,pendingAt=ts,scheduleFlush()}}function resolveTuiSessionKey(params){let trimmed=(params.raw??``).trim();return trimmed?trimmed===`global`||trimmed===`unknown`||trimmed.startsWith(`agent:`)?trimmed:`agent:${params.currentAgentId}:${trimmed}`:params.sessionScope===`global`?`global`:buildAgentMainSessionKey({agentId:params.currentAgentId,mainKey:params.sessionMainKey})}async function runTui(opts){let config=loadConfig(),initialSessionInput=(opts.session??``).trim(),sessionScope=config.session?.scope??`per-sender`,sessionMainKey=normalizeMainKey(config.session?.mainKey),agentDefaultId=resolveDefaultAgentId(config),currentAgentId=agentDefaultId,agents=[],agentNames=new Map,currentSessionKey=``,initialSessionApplied=!1,currentSessionId=null,activeChatRunId=null,historyLoaded=!1,isConnected=!1,wasDisconnected=!1,toolsExpanded=!1,loggingEnabled=config.logging?.enabled!==!1,showThinking=!1,localRunIds=new Set,deliverDefault=opts.deliver??!1,autoMessage=opts.message?.trim(),autoMessageSent=!1,sessionInfo={},lastCtrlCAt=0,activityStatus=`idle`,connectionStatus=`connecting`,statusTimeout=null,statusTimer=null,statusStartedAt=null,lastActivityStatus=activityStatus,setupInProgress=!1,projectName=null,workspaceState=null;Promise.all([loadProjectContext(process.cwd()).catch(()=>null),loadWorkspaceState(process.cwd()).catch(()=>null)]).then(([ctx,ws])=>{projectName=ctx?.projectName??null,workspaceState=ws});let state={get agentDefaultId(){return agentDefaultId},set agentDefaultId(value){agentDefaultId=value},get sessionMainKey(){return sessionMainKey},set sessionMainKey(value){sessionMainKey=value},get sessionScope(){return sessionScope},set sessionScope(value){sessionScope=value},get agents(){return agents},set agents(value){agents=value},get currentAgentId(){return currentAgentId},set currentAgentId(value){currentAgentId=value},get currentSessionKey(){return currentSessionKey},set currentSessionKey(value){currentSessionKey=value},get currentSessionId(){return currentSessionId},set currentSessionId(value){currentSessionId=value},get activeChatRunId(){return activeChatRunId},set activeChatRunId(value){activeChatRunId=value},get historyLoaded(){return historyLoaded},set historyLoaded(value){historyLoaded=value},get sessionInfo(){return sessionInfo},set sessionInfo(value){sessionInfo=value},get initialSessionApplied(){return initialSessionApplied},set initialSessionApplied(value){initialSessionApplied=value},get isConnected(){return isConnected},set isConnected(value){isConnected=value},get autoMessageSent(){return autoMessageSent},set autoMessageSent(value){autoMessageSent=value},get toolsExpanded(){return toolsExpanded},set toolsExpanded(value){toolsExpanded=value},get showThinking(){return showThinking},set showThinking(value){showThinking=value},get connectionStatus(){return connectionStatus},set connectionStatus(value){connectionStatus=value},get activityStatus(){return activityStatus},set activityStatus(value){activityStatus=value},get statusTimeout(){return statusTimeout},set statusTimeout(value){statusTimeout=value},get lastCtrlCAt(){return lastCtrlCAt},set lastCtrlCAt(value){lastCtrlCAt=value},get loggingEnabled(){return loggingEnabled},set loggingEnabled(value){loggingEnabled=value}},noteLocalRunId=runId=>{if(runId&&(localRunIds.add(runId),localRunIds.size>200)){let[first]=localRunIds;first&&localRunIds.delete(first)}},forgetLocalRunId=runId=>{localRunIds.delete(runId)},isLocalRunId=runId=>localRunIds.has(runId),clearLocalRunIds=()=>{localRunIds.clear()},client=new GatewayChatClient({url:opts.url,token:opts.token,password:opts.password}),tui=new TUI(new ProcessTerminal),header=new Text(``,1,0),statusContainer=new Container,statusBodyContainer=new Container,statusTraceText=new Text(``,1,0),footer=new Text(``,1,0),chatLog=new ChatLog,editor=new CustomEditor(tui,editorTheme),root=new Container;root.addChild(header),root.addChild(chatLog),statusContainer.addChild(statusBodyContainer),statusContainer.addChild(statusTraceText),root.addChild(statusContainer),root.addChild(footer),root.addChild(editor);let updateAutocompleteProvider=()=>{editor.setAutocompleteProvider(new CombinedAutocompleteProvider(getSlashCommands({cfg:config,provider:sessionInfo.modelProvider,model:sessionInfo.model}),process.cwd()))};tui.addChild(root),tui.setFocus(editor);let formatSessionKey=key=>key===`global`||key===`unknown`?key:parseAgentSessionKey(key)?.rest??key,formatAgentLabel=id=>{let name=agentNames.get(id);return name?`${id} (${name})`:id},resolveSessionKey=raw=>resolveTuiSessionKey({raw,sessionScope,currentAgentId,sessionMainKey});currentSessionKey=resolveSessionKey(initialSessionInput);let updateHeader=()=>{let sessionLabel=formatSessionKey(currentSessionKey),agentLabel=formatAgentLabel(currentAgentId),projectPart=projectName?` · ${projectName}`:``,syncPart=workspaceState?.lastSyncedAt?` [synced ${formatTimeAgo(Date.now()-new Date(workspaceState.lastSyncedAt).getTime())}]`:``;header.setText(theme.header(`builderforce tui${projectPart}${syncPart} - ${client.connection.url} - agent ${agentLabel} - session ${sessionLabel}`))},busyStates=new Set([`sending`,`waiting`,`streaming`,`running`]),statusText=null,statusLoader=null,statusTraceLines=[],renderStatusTrace=()=>{statusTraceText.setText(theme.dim(statusTraceLines.join(`
|
|
27
|
-
`)))},reportAction=text=>{let message=text.trim();message&&(statusTraceLines.push(`• ${message}`),statusTraceLines.length>14&&statusTraceLines.splice(0,statusTraceLines.length-14),renderStatusTrace())},formatElapsed=startMs=>{let totalSeconds=Math.max(0,Math.floor((Date.now()-startMs)/1e3));return totalSeconds<60?`${totalSeconds}s`:`${Math.floor(totalSeconds/60)}m ${totalSeconds%60}s`},ensureStatusText=()=>{statusText||(statusBodyContainer.clear(),statusLoader?.stop(),statusLoader=null,statusText=new Text(``,1,0),statusBodyContainer.addChild(statusText))},ensureStatusLoader=()=>{statusLoader||(statusBodyContainer.clear(),statusText=null,statusLoader=new Loader(tui,spinner=>theme.accent(spinner),text=>theme.bold(theme.accentSoft(text)),``),statusBodyContainer.addChild(statusLoader))},waitingTick=0,waitingTimer=null,waitingPhrase=null,updateBusyStatusMessage=()=>{if(!statusLoader||!statusStartedAt)return;let elapsed=formatElapsed(statusStartedAt);if(activityStatus===`waiting`){waitingTick++,statusLoader.setMessage(buildWaitingStatusMessage({theme,tick:waitingTick,elapsed,connectionStatus,phrases:waitingPhrase?[waitingPhrase]:void 0}));return}statusLoader.setMessage(`${activityStatus} • ${elapsed} | ${connectionStatus}`)},startStatusTimer=()=>{statusTimer||=setInterval(()=>{busyStates.has(activityStatus)&&updateBusyStatusMessage()},1e3)},stopStatusTimer=()=>{statusTimer&&=(clearInterval(statusTimer),null)},startWaitingTimer=()=>{waitingTimer||=(waitingPhrase||=defaultWaitingPhrases[Math.floor(Math.random()*defaultWaitingPhrases.length)]??defaultWaitingPhrases[0]??`waiting`,waitingTick=0,setInterval(()=>{activityStatus===`waiting`&&updateBusyStatusMessage()},120))},stopWaitingTimer=()=>{waitingTimer&&(clearInterval(waitingTimer),waitingTimer=null,waitingPhrase=null)},renderStatus=()=>{if(busyStates.has(activityStatus))(!statusStartedAt||lastActivityStatus!==activityStatus)&&(statusStartedAt=Date.now()),ensureStatusLoader(),activityStatus===`waiting`?(stopStatusTimer(),startWaitingTimer()):(stopWaitingTimer(),startStatusTimer()),updateBusyStatusMessage();else{statusStartedAt=null,stopStatusTimer(),stopWaitingTimer(),statusLoader?.stop(),statusLoader=null,ensureStatusText();let text=activityStatus?`${connectionStatus} | ${activityStatus}`:connectionStatus;statusText?.setText(theme.dim(text))}lastActivityStatus=activityStatus},setConnectionStatus=(text,ttlMs)=>{let previous=connectionStatus;connectionStatus=text,text!==previous&&reportAction(`connection: ${text}`),renderStatus(),statusTimeout&&clearTimeout(statusTimeout),ttlMs&&ttlMs>0&&(statusTimeout=setTimeout(()=>{connectionStatus=isConnected?`connected`:`disconnected`,renderStatus()},ttlMs))},setActivityStatus=text=>{activityStatus=text,renderStatus()},updateFooter=()=>{let sessionKeyLabel=formatSessionKey(currentSessionKey),sessionLabel=sessionInfo.displayName?`${sessionKeyLabel} (${sessionInfo.displayName})`:sessionKeyLabel,agentLabel=formatAgentLabel(currentAgentId),modelLabel=sessionInfo.model?sessionInfo.modelProvider?`${sessionInfo.modelProvider}/${sessionInfo.model}`:sessionInfo.model:`unknown`,tokens=formatTokens(sessionInfo.totalTokens??null,sessionInfo.contextTokens??null),think=sessionInfo.thinkingLevel??`off`,verbose=sessionInfo.verboseLevel??`off`,reasoning=sessionInfo.reasoningLevel??`off`,reasoningLabel=reasoning===`on`?`reasoning`:reasoning===`stream`?`reasoning:stream`:null,localBrainLabel=config.localBrain?.enabled?`local brain`:null,footerParts=[`agent ${agentLabel}`,`session ${sessionLabel}`,modelLabel,localBrainLabel,think===`off`?null:`think ${think}`,verbose===`off`?null:`verbose ${verbose}`,reasoningLabel,tokens].filter(Boolean);footer.setText(theme.dim(footerParts.join(` | `)))},{openOverlay,closeOverlay}=createOverlayHandlers(tui,editor),{refreshAgents,refreshSessionInfo,applySessionInfoFromPatch,loadHistory,setSession,abortActive}=createSessionActions({client,chatLog,tui,opts,state,agentNames,initialSessionInput,initialSessionAgentId:(()=>{if(!initialSessionInput)return null;let parsed=parseAgentSessionKey(initialSessionInput);return parsed?normalizeAgentId(parsed.agentId):null})(),resolveSessionKey,updateHeader,updateFooter,updateAutocompleteProvider,setActivityStatus,clearLocalRunIds}),{handleChatEvent,handleAgentEvent}=createEventHandlers({chatLog,tui,state,setActivityStatus,reportAction,refreshSessionInfo,loadHistory,isLocalRunId,forgetLocalRunId,clearLocalRunIds}),{handleCommand,sendMessage,openModelSelector,openAgentSelector,openSessionSelector}=createCommandHandlers({client,chatLog,tui,opts,state,deliverDefault,openOverlay,closeOverlay,refreshSessionInfo,applySessionInfoFromPatch,updateFooter,loadHistory,setSession,refreshAgents,abortActive,setActivityStatus,reportAction,formatSessionKey,noteLocalRunId,forgetLocalRunId,onSetup:async()=>{if(setupInProgress){chatLog.addSystem(`Setup is already running.`),tui.requestRender();return}setupInProgress=!0;try{chatLog.addSystem(`Stopping TUI — setup wizard starting…`),tui.requestRender(),await new Promise(r=>setTimeout(r,80)),client.stop(),tui.stop(),await new Promise(r=>setTimeout(r,50));let{restoreTerminalState}=await import(`./restore-BNDNfE3q.js`),{runInteractiveOnboarding}=await import(`./onboard-interactive-
|
|
27
|
+
`)))},reportAction=text=>{let message=text.trim();message&&(statusTraceLines.push(`• ${message}`),statusTraceLines.length>14&&statusTraceLines.splice(0,statusTraceLines.length-14),renderStatusTrace())},formatElapsed=startMs=>{let totalSeconds=Math.max(0,Math.floor((Date.now()-startMs)/1e3));return totalSeconds<60?`${totalSeconds}s`:`${Math.floor(totalSeconds/60)}m ${totalSeconds%60}s`},ensureStatusText=()=>{statusText||(statusBodyContainer.clear(),statusLoader?.stop(),statusLoader=null,statusText=new Text(``,1,0),statusBodyContainer.addChild(statusText))},ensureStatusLoader=()=>{statusLoader||(statusBodyContainer.clear(),statusText=null,statusLoader=new Loader(tui,spinner=>theme.accent(spinner),text=>theme.bold(theme.accentSoft(text)),``),statusBodyContainer.addChild(statusLoader))},waitingTick=0,waitingTimer=null,waitingPhrase=null,updateBusyStatusMessage=()=>{if(!statusLoader||!statusStartedAt)return;let elapsed=formatElapsed(statusStartedAt);if(activityStatus===`waiting`){waitingTick++,statusLoader.setMessage(buildWaitingStatusMessage({theme,tick:waitingTick,elapsed,connectionStatus,phrases:waitingPhrase?[waitingPhrase]:void 0}));return}statusLoader.setMessage(`${activityStatus} • ${elapsed} | ${connectionStatus}`)},startStatusTimer=()=>{statusTimer||=setInterval(()=>{busyStates.has(activityStatus)&&updateBusyStatusMessage()},1e3)},stopStatusTimer=()=>{statusTimer&&=(clearInterval(statusTimer),null)},startWaitingTimer=()=>{waitingTimer||=(waitingPhrase||=defaultWaitingPhrases[Math.floor(Math.random()*defaultWaitingPhrases.length)]??defaultWaitingPhrases[0]??`waiting`,waitingTick=0,setInterval(()=>{activityStatus===`waiting`&&updateBusyStatusMessage()},120))},stopWaitingTimer=()=>{waitingTimer&&(clearInterval(waitingTimer),waitingTimer=null,waitingPhrase=null)},renderStatus=()=>{if(busyStates.has(activityStatus))(!statusStartedAt||lastActivityStatus!==activityStatus)&&(statusStartedAt=Date.now()),ensureStatusLoader(),activityStatus===`waiting`?(stopStatusTimer(),startWaitingTimer()):(stopWaitingTimer(),startStatusTimer()),updateBusyStatusMessage();else{statusStartedAt=null,stopStatusTimer(),stopWaitingTimer(),statusLoader?.stop(),statusLoader=null,ensureStatusText();let text=activityStatus?`${connectionStatus} | ${activityStatus}`:connectionStatus;statusText?.setText(theme.dim(text))}lastActivityStatus=activityStatus},setConnectionStatus=(text,ttlMs)=>{let previous=connectionStatus;connectionStatus=text,text!==previous&&reportAction(`connection: ${text}`),renderStatus(),statusTimeout&&clearTimeout(statusTimeout),ttlMs&&ttlMs>0&&(statusTimeout=setTimeout(()=>{connectionStatus=isConnected?`connected`:`disconnected`,renderStatus()},ttlMs))},setActivityStatus=text=>{activityStatus=text,renderStatus()},updateFooter=()=>{let sessionKeyLabel=formatSessionKey(currentSessionKey),sessionLabel=sessionInfo.displayName?`${sessionKeyLabel} (${sessionInfo.displayName})`:sessionKeyLabel,agentLabel=formatAgentLabel(currentAgentId),modelLabel=sessionInfo.model?sessionInfo.modelProvider?`${sessionInfo.modelProvider}/${sessionInfo.model}`:sessionInfo.model:`unknown`,tokens=formatTokens(sessionInfo.totalTokens??null,sessionInfo.contextTokens??null),think=sessionInfo.thinkingLevel??`off`,verbose=sessionInfo.verboseLevel??`off`,reasoning=sessionInfo.reasoningLevel??`off`,reasoningLabel=reasoning===`on`?`reasoning`:reasoning===`stream`?`reasoning:stream`:null,localBrainLabel=config.localBrain?.enabled?`local brain`:null,footerParts=[`agent ${agentLabel}`,`session ${sessionLabel}`,modelLabel,localBrainLabel,think===`off`?null:`think ${think}`,verbose===`off`?null:`verbose ${verbose}`,reasoningLabel,tokens].filter(Boolean);footer.setText(theme.dim(footerParts.join(` | `)))},{openOverlay,closeOverlay}=createOverlayHandlers(tui,editor),{refreshAgents,refreshSessionInfo,applySessionInfoFromPatch,loadHistory,setSession,abortActive}=createSessionActions({client,chatLog,tui,opts,state,agentNames,initialSessionInput,initialSessionAgentId:(()=>{if(!initialSessionInput)return null;let parsed=parseAgentSessionKey(initialSessionInput);return parsed?normalizeAgentId(parsed.agentId):null})(),resolveSessionKey,updateHeader,updateFooter,updateAutocompleteProvider,setActivityStatus,clearLocalRunIds}),{handleChatEvent,handleAgentEvent}=createEventHandlers({chatLog,tui,state,setActivityStatus,reportAction,refreshSessionInfo,loadHistory,isLocalRunId,forgetLocalRunId,clearLocalRunIds}),{handleCommand,sendMessage,openModelSelector,openAgentSelector,openSessionSelector}=createCommandHandlers({client,chatLog,tui,opts,state,deliverDefault,openOverlay,closeOverlay,refreshSessionInfo,applySessionInfoFromPatch,updateFooter,loadHistory,setSession,refreshAgents,abortActive,setActivityStatus,reportAction,formatSessionKey,noteLocalRunId,forgetLocalRunId,onSetup:async()=>{if(setupInProgress){chatLog.addSystem(`Setup is already running.`),tui.requestRender();return}setupInProgress=!0;try{chatLog.addSystem(`Stopping TUI — setup wizard starting…`),tui.requestRender(),await new Promise(r=>setTimeout(r,80)),client.stop(),tui.stop(),await new Promise(r=>setTimeout(r,50));let{restoreTerminalState}=await import(`./restore-BNDNfE3q.js`),{runInteractiveOnboarding}=await import(`./onboard-interactive-COnCCTTW.js`),{startGatewayBackground}=await import(`./tui-setup-check-CqKfESDo.js`);restoreTerminalState(`pre-setup-wizard`,{resumeStdinIfPaused:!0}),await new Promise(r=>setTimeout(r,150));try{await runInteractiveOnboarding({flow:`quickstart`})}catch(err){process.stderr.write(`Setup wizard failed: ${String(err)}\n`)}finally{restoreTerminalState(`post-setup-wizard`,{resumeStdinIfPaused:!0})}await startGatewayBackground(),setConnectionStatus(`restarting tui`),setActivityStatus(`idle`),updateHeader(),updateFooter(),tui.start(),tui.setFocus(editor),tui.requestRender(),client.start()}finally{setupInProgress=!1}},config}),{runLocalShellLine}=createLocalShellRunner({chatLog,tui,openOverlay,closeOverlay});updateAutocompleteProvider(),editor.onSubmit=createSubmitBurstCoalescer({submit:createEditorSubmitHandler({editor,handleCommand,sendMessage,handleBangLine:runLocalShellLine}),enabled:shouldEnableWindowsGitBashPasteFallback()}),editor.onEscape=()=>{abortActive()},editor.onCtrlC=()=>{let now=Date.now();if(editor.getText().trim().length>0){editor.setText(``),setActivityStatus(`cleared input`),tui.requestRender();return}now-lastCtrlCAt<1e3&&(client.stop(),tui.stop(),process.exit(0)),lastCtrlCAt=now,setActivityStatus(`press ctrl+c again to exit`),tui.requestRender()},editor.onCtrlD=()=>{client.stop(),tui.stop(),process.exit(0)},editor.onCtrlO=()=>{toolsExpanded=!toolsExpanded,chatLog.setToolsExpanded(toolsExpanded),setActivityStatus(toolsExpanded?`tools expanded`:`tools collapsed`),tui.requestRender()},editor.onCtrlL=()=>{openModelSelector()},editor.onCtrlG=()=>{openAgentSelector()},editor.onCtrlP=()=>{openSessionSelector()},editor.onCtrlT=()=>{showThinking=!showThinking,loadHistory()},client.onEvent=evt=>{evt.event===`chat`&&handleChatEvent(evt.payload),evt.event===`agent`&&handleAgentEvent(evt.payload)},client.onConnected=()=>{isConnected=!0;let reconnected=wasDisconnected;wasDisconnected=!1,setConnectionStatus(`connected`),(async()=>{await refreshAgents(),updateHeader(),await refreshSessionInfo(),await loadHistory(),setConnectionStatus(reconnected?`gateway reconnected`:`gateway connected`,4e3),tui.requestRender(),!autoMessageSent&&autoMessage&&(autoMessageSent=!0,await sendMessage(autoMessage)),updateFooter(),tui.requestRender()})()},client.onDisconnected=reason=>{let isFirstFailure=!wasDisconnected&&!isConnected;isConnected=!1,wasDisconnected=!0,historyLoaded=!1,setConnectionStatus(`gateway disconnected: ${reason?.trim()?reason.trim():`closed`}`,5e3),setActivityStatus(`idle`),isFirstFailure&&chatLog.addSystem(`Gateway not reachable. Type /setup or /onboard to run the setup wizard, or /gateway restart to restart the gateway.`),updateFooter(),tui.requestRender()},client.onGap=info=>{setConnectionStatus(`event gap: expected ${info.expected}, got ${info.received}`,5e3),tui.requestRender()},updateHeader(),setConnectionStatus(`connecting`),updateFooter(),tui.start(),client.start(),await new Promise(resolve=>{let finish=()=>resolve();process.once(`exit`,finish),process.once(`SIGINT`,finish),process.once(`SIGTERM`,finish)})}export{runTui as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{d as visibleWidth,l as stripAnsi,u as truncateToWidth}from"./subsystem-C4b1Von0.js";import{i as logWarn,t as logDebug}from"./logger-wuOr7HKl.js";import{C as parseAgentSessionKey,a as buildAgentMainSessionKey,d as normalizeAgentId,f as normalizeMainKey}from"./session-key-CksCYipj.js";import{l as resolveDefaultAgentId}from"./agent-scope-CufEmNj_.js";import{t as normalizeBaseUrl}from"./normalize-base-url-D_sv6Zgt.js";import{i as readSharedEnvVar}from"./env-file-DeS6x2OL.js";import{c as writeConfigFile,r as loadConfig}from"./io-CsCa3_1Z.js";import{n as loadProjectContext}from"./project-context-store-BNXYrLJz.js";import{d as normalizeUsageDisplay,i as formatThinkingLevels,o as listThinkingLevelLabels,p as resolveResponseUsageMode}from"./embedded-helpers-BZGiFZlP.js";import{n as resolveToolDisplay,t as formatToolDetail}from"./tool-display-Cs4hDP1f.js";import{a as buildStagedSummary,d as isStagingActive,f as rejectAllEdits,i as activateStaging,l as getStagedEdits,m as resolveStagedTarget,n as acceptAllEdits,o as buildUnifiedDiff,p as rejectEdit,r as acceptEdit,s as deactivateStaging,t as isModelCached,u as hasStagedEdits,v as listChatCommands,y as listChatCommandsForConfig}from"./builderforcellm-syscheck-tquUDu_7.js";import{n as formatTimeAgo,t as formatRelativeTimestamp}from"./format-relative-CruqE52s.js";import{n as formatTokenCount}from"./usage-format-5sp5AMSu.js";import{c as saveSessionHandoff,f as initializeBuilderForceAgentsProject,n as loadWorkspaceState,s as loadLatestSessionHandoff}from"./project-context-BdK18hVI.js";import{s as downloadBuilderForceAgentsLlmModel}from"./transformers-stream-Buj40qHl.js";import{r as syncBuilderForceAgentsDirectoryWithMetaUpdate}from"./builderforce-directory-sync-gx_ESkap.js";import{a as HIPPOCAMPUS_MODEL_ID,c as applyTransformersProviderConfig,i as HIPPOCAMPUS_DTYPE,l as defaultCacheDir,n as AMYGDALA_MODEL_ID,r as BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID,t as AMYGDALA_DTYPE}from"./auth-choice.apply.transformers-
|
|
1
|
+
import{d as visibleWidth,l as stripAnsi,u as truncateToWidth}from"./subsystem-C4b1Von0.js";import{i as logWarn,t as logDebug}from"./logger-wuOr7HKl.js";import{C as parseAgentSessionKey,a as buildAgentMainSessionKey,d as normalizeAgentId,f as normalizeMainKey}from"./session-key-CksCYipj.js";import{l as resolveDefaultAgentId}from"./agent-scope-CufEmNj_.js";import{t as normalizeBaseUrl}from"./normalize-base-url-D_sv6Zgt.js";import{i as readSharedEnvVar}from"./env-file-DeS6x2OL.js";import{c as writeConfigFile,r as loadConfig}from"./io-CsCa3_1Z.js";import{n as loadProjectContext}from"./project-context-store-BNXYrLJz.js";import{d as normalizeUsageDisplay,i as formatThinkingLevels,o as listThinkingLevelLabels,p as resolveResponseUsageMode}from"./embedded-helpers-BZGiFZlP.js";import{n as resolveToolDisplay,t as formatToolDetail}from"./tool-display-Cs4hDP1f.js";import{a as buildStagedSummary,d as isStagingActive,f as rejectAllEdits,i as activateStaging,l as getStagedEdits,m as resolveStagedTarget,n as acceptAllEdits,o as buildUnifiedDiff,p as rejectEdit,r as acceptEdit,s as deactivateStaging,t as isModelCached,u as hasStagedEdits,v as listChatCommands,y as listChatCommandsForConfig}from"./builderforcellm-syscheck-tquUDu_7.js";import{n as formatTimeAgo,t as formatRelativeTimestamp}from"./format-relative-CruqE52s.js";import{n as formatTokenCount}from"./usage-format-5sp5AMSu.js";import{c as saveSessionHandoff,f as initializeBuilderForceAgentsProject,n as loadWorkspaceState,s as loadLatestSessionHandoff}from"./project-context-BdK18hVI.js";import{s as downloadBuilderForceAgentsLlmModel}from"./transformers-stream-Buj40qHl.js";import{r as syncBuilderForceAgentsDirectoryWithMetaUpdate}from"./builderforce-directory-sync-gx_ESkap.js";import{a as HIPPOCAMPUS_MODEL_ID,c as applyTransformersProviderConfig,i as HIPPOCAMPUS_DTYPE,l as defaultCacheDir,n as AMYGDALA_MODEL_ID,r as BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID,t as AMYGDALA_DTYPE}from"./auth-choice.apply.transformers-Be8599JD.js";import{a as formatContextUsageLine,c as sanitizeRenderableText,i as extractTextFromMessage,n as GatewayChatClient,o as formatTokens,r as asString,s as isCommandMessage,t as TuiStreamAssembler}from"./tui-stream-assembler-DW908fGx.js";import{spawn}from"node:child_process";import chalk from"chalk";import{randomUUID}from"node:crypto";import{Box,CombinedAutocompleteProvider,Container,Editor,Input,Key,Loader,Markdown,ProcessTerminal,SelectList,SettingsList,Spacer,TUI,Text,getEditorKeybindings,isKeyRelease,matchesKey}from"@mariozechner/pi-tui";import{highlight,supportsLanguage}from"cli-highlight";const VERBOSE_LEVELS=[`on`,`off`],REASONING_LEVELS=[`on`,`off`],ELEVATED_LEVELS=[`on`,`off`,`ask`,`full`],ACTIVATION_LEVELS=[`mention`,`always`],USAGE_FOOTER_LEVELS=[`off`,`tokens`,`full`],COMMAND_ALIASES={elev:`elevated`,onboard:`setup`,service:`gateway`};function parseCommand(input){let trimmed=input.replace(/^\//,``).trim();if(!trimmed)return{name:``,args:``};let[name,...rest]=trimmed.split(/\s+/),normalized=name.toLowerCase();return{name:COMMAND_ALIASES[normalized]??normalized,args:rest.join(` `).trim()}}function getSlashCommands(options={}){let thinkLevels=listThinkingLevelLabels(options.provider,options.model),commands=[{name:`help`,description:`Show slash command help`},{name:`status`,description:`Show gateway status summary`},{name:`agent`,description:`Switch agent (or open picker)`},{name:`agents`,description:`Open agent picker`},{name:`session`,description:`Switch session (or open picker)`},{name:`sessions`,description:`Open session picker`},{name:`fork`,description:`Clone the current session into a new transcript`},{name:`undo`,description:`Rewind the last conversation turn`},{name:`model`,description:`Set model (or open picker)`},{name:`models`,description:`Open model picker`},{name:`think`,description:`Set thinking level`,getArgumentCompletions:prefix=>thinkLevels.filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`verbose`,description:`Set verbose on/off`,getArgumentCompletions:prefix=>VERBOSE_LEVELS.filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`reasoning`,description:`Set reasoning on/off`,getArgumentCompletions:prefix=>REASONING_LEVELS.filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`usage`,description:`Toggle per-response usage line`,getArgumentCompletions:prefix=>USAGE_FOOTER_LEVELS.filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`elevated`,description:`Set elevated on/off/ask/full`,getArgumentCompletions:prefix=>ELEVATED_LEVELS.filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`elev`,description:`Alias for /elevated`,getArgumentCompletions:prefix=>ELEVATED_LEVELS.filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`activation`,description:`Set group activation`,getArgumentCompletions:prefix=>ACTIVATION_LEVELS.filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`abort`,description:`Abort active run`},{name:`new`,description:`Reset the session`},{name:`reset`,description:`Reset the session`},{name:`settings`,description:`Open settings`},{name:`restart`,description:`Restart gateway locally`},{name:`gateway`,description:`Gateway control (status/start/stop/restart/token <value>)`},{name:`daemon`,description:`Alias for /gateway`},{name:`logs`,description:`Show recent gateway log lines`},{name:`init`,description:`Initialize builderForceAgents project in workspace`},{name:`handoff`,description:`Ask the agent to save a session handoff for the next session`},{name:`exit`,description:`Exit the TUI`},{name:`quit`,description:`Exit the TUI`},{name:`setup`,description:`Run the setup/onboarding wizard`},{name:`onboard`,description:`Alias for /setup`},{name:`localbrain`,description:`Toggle local brain on/off/refresh`,getArgumentCompletions:prefix=>[`on`,`off`,`refresh`].filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`project`,description:`Show project context from .builderForceAgents directory`},{name:`sync`,description:`Force sync .builderForceAgents directory to Builderforce`},{name:`spec`,description:`Run a spec-driven planning workflow (PRD → architecture → tasks)`},{name:`workflow`,description:`Show status of the latest (or a specific) workflow`},{name:`stage`,description:`Toggle staged-edit mode (buffer write/edit for /diff /accept /reject)`,getArgumentCompletions:prefix=>[`on`,`off`,`status`].filter(v=>v.startsWith(prefix.toLowerCase())).map(value=>({value,label:value}))},{name:`diff`,description:`Show staged file changes (or a specific file). Use after agent edits.`},{name:`accept`,description:`Apply staged changes to disk. /accept [file] or /accept all`},{name:`reject`,description:`Discard staged changes. /reject [file] or /reject all`}],seen=new Set(commands.map(command=>command.name)),gatewayCommands=options.cfg?listChatCommandsForConfig(options.cfg):listChatCommands();for(let command of gatewayCommands){let aliases=command.textAliases.length>0?command.textAliases:[`/${command.key}`];for(let alias of aliases){let name=alias.replace(/^\//,``).trim();!name||seen.has(name)||(seen.add(name),commands.push({name,description:command.description}))}}return commands}function helpText(options={}){return[`Slash commands:`,`/help`,`/commands`,`/status`,`/agent <id> (or /agents)`,`/session <key> (or /sessions)`,`/fork`,`/undo`,`/model <provider/model> (or /models)`,`/think <${formatThinkingLevels(options.provider,options.model,`|`)}>`,`/verbose <on|off>`,`/reasoning <on|off>`,`/usage <off|tokens|full>`,`/elevated <on|off|ask|full>`,`/elev <on|off|ask|full>`,`/activation <mention|always>`,`/new or /reset`,`/abort`,`/compact [instructions]`,`/settings`,`/restart (restart gateway; works when disconnected)`,`/gateway <status|start|stop|restart|token <value>>`,`/daemon <status|start|stop|restart|token <value>>`,`/logs [count]`,`/init`,`/handoff`,`/project`,`/sync`,`/spec <goal>`,`/workflow [id]`,`/stage [on|off|status]`,`/diff [file]`,`/accept [file|all]`,`/reject [file|all]`,`/exit`,`/localbrain <on|off|refresh>`,`/setup or /onboard`].join(`
|
|
2
2
|
`)}function createSyntaxTheme(fallback){return{keyword:chalk.hex(`#C586C0`),built_in:chalk.hex(`#4EC9B0`),type:chalk.hex(`#4EC9B0`),literal:chalk.hex(`#569CD6`),number:chalk.hex(`#B5CEA8`),string:chalk.hex(`#CE9178`),regexp:chalk.hex(`#D16969`),symbol:chalk.hex(`#B5CEA8`),class:chalk.hex(`#4EC9B0`),function:chalk.hex(`#DCDCAA`),title:chalk.hex(`#DCDCAA`),params:chalk.hex(`#9CDCFE`),comment:chalk.hex(`#6A9955`),doctag:chalk.hex(`#608B4E`),meta:chalk.hex(`#9CDCFE`),"meta-keyword":chalk.hex(`#C586C0`),"meta-string":chalk.hex(`#CE9178`),section:chalk.hex(`#DCDCAA`),tag:chalk.hex(`#569CD6`),name:chalk.hex(`#9CDCFE`),attr:chalk.hex(`#9CDCFE`),attribute:chalk.hex(`#9CDCFE`),variable:chalk.hex(`#9CDCFE`),bullet:chalk.hex(`#D7BA7D`),code:chalk.hex(`#CE9178`),emphasis:chalk.italic,strong:chalk.bold,formula:chalk.hex(`#C586C0`),link:chalk.hex(`#4EC9B0`),quote:chalk.hex(`#6A9955`),addition:chalk.hex(`#B5CEA8`),deletion:chalk.hex(`#F44747`),"selector-tag":chalk.hex(`#D7BA7D`),"selector-id":chalk.hex(`#D7BA7D`),"selector-class":chalk.hex(`#D7BA7D`),"selector-attr":chalk.hex(`#D7BA7D`),"selector-pseudo":chalk.hex(`#D7BA7D`),"template-tag":chalk.hex(`#C586C0`),"template-variable":chalk.hex(`#9CDCFE`),default:fallback}}const palette={text:`#E8E3D5`,dim:`#7B7F87`,accent:`#F6C453`,accentSoft:`#F2A65A`,border:`#3C414B`,userBg:`#2B2F36`,userText:`#F3EEE0`,systemText:`#9BA3B2`,toolPendingBg:`#1F2A2F`,toolSuccessBg:`#1E2D23`,toolErrorBg:`#2F1F1F`,toolTitle:`#F6C453`,toolOutput:`#E1DACB`,quote:`#8CC8FF`,quoteBorder:`#3B4D6B`,code:`#F0C987`,codeBlock:`#1E232A`,codeBorder:`#343A45`,modalBorder:`#4D8DFF`,modalBg:`#171A20`,link:`#7DD3A5`,error:`#F97066`,success:`#7DD3A5`},fg=hex=>text=>chalk.hex(hex)(text),bg=hex=>text=>chalk.bgHex(hex)(text),syntaxTheme=createSyntaxTheme(fg(palette.code));function highlightCode(code,lang){try{return highlight(code,{language:lang&&supportsLanguage(lang)?lang:void 0,theme:syntaxTheme,ignoreIllegals:!0}).split(`
|
|
3
3
|
`)}catch{return code.split(`
|
|
4
4
|
`).map(line=>fg(palette.code)(line))}}const theme={fg:fg(palette.text),assistantText:text=>text,dim:fg(palette.dim),accent:fg(palette.accent),accentSoft:fg(palette.accentSoft),success:fg(palette.success),error:fg(palette.error),header:text=>chalk.bold(fg(palette.accent)(text)),system:fg(palette.systemText),userBg:bg(palette.userBg),userText:fg(palette.userText),toolTitle:fg(palette.toolTitle),toolOutput:fg(palette.toolOutput),toolPendingBg:bg(palette.toolPendingBg),toolSuccessBg:bg(palette.toolSuccessBg),toolErrorBg:bg(palette.toolErrorBg),modalBg:bg(palette.modalBg),border:fg(palette.border),modalBorder:fg(palette.modalBorder),bold:text=>chalk.bold(text),italic:text=>chalk.italic(text)},markdownTheme={heading:text=>chalk.bold(fg(palette.accent)(text)),link:text=>fg(palette.link)(text),linkUrl:text=>chalk.dim(text),code:text=>fg(palette.code)(text),codeBlock:text=>fg(palette.code)(text),codeBlockBorder:text=>fg(palette.codeBorder)(text),quote:text=>fg(palette.quote)(text),quoteBorder:text=>fg(palette.quoteBorder)(text),hr:text=>fg(palette.border)(text),listBullet:text=>fg(palette.accentSoft)(text),bold:text=>chalk.bold(text),italic:text=>chalk.italic(text),strikethrough:text=>chalk.strikethrough(text),underline:text=>chalk.underline(text),highlightCode},baseSelectListTheme={selectedPrefix:text=>fg(palette.accent)(text),selectedText:text=>chalk.bold(fg(palette.accent)(text)),description:text=>fg(palette.dim)(text),scrollInfo:text=>fg(palette.dim)(text),noMatch:text=>fg(palette.dim)(text)},selectListTheme=baseSelectListTheme,filterableSelectListTheme={...baseSelectListTheme,filterLabel:text=>fg(palette.dim)(text)},settingsListTheme={label:(text,selected)=>selected?chalk.bold(fg(palette.accent)(text)):fg(palette.text)(text),value:(text,selected)=>selected?fg(palette.accentSoft)(text):fg(palette.dim)(text),description:text=>fg(palette.systemText)(text),cursor:fg(palette.accent)(`→ `),hint:text=>fg(palette.dim)(text)},editorTheme={borderColor:text=>fg(palette.border)(text),selectList:selectListTheme},searchableSelectListTheme={...baseSelectListTheme,searchPrompt:text=>fg(palette.accentSoft)(text),searchInput:text=>fg(palette.text)(text),matchHighlight:text=>chalk.bold(fg(palette.accent)(text))};var AssistantMessageComponent=class extends Container{constructor(text){super(),this.body=new Markdown(text,1,0,markdownTheme,{color:line=>theme.assistantText(line)}),this.addChild(new Spacer(1)),this.addChild(this.body)}setText(text){this.body.setText(text)}};function formatArgs(toolName,args){let detail=formatToolDetail(resolveToolDisplay({name:toolName,args}));if(detail)return sanitizeRenderableText(detail);if(!args||typeof args!=`object`)return``;try{return sanitizeRenderableText(JSON.stringify(args))}catch{return``}}function extractText(result){if(!result?.content)return``;let lines=[];for(let entry of result.content)if(entry.type===`text`&&entry.text)lines.push(sanitizeRenderableText(entry.text));else if(entry.type===`image`){let mime=entry.mimeType??`image`,size=entry.bytes?` ${Math.round(entry.bytes/1024)}kb`:``,omitted=entry.omitted?` (omitted)`:``;lines.push(`[${mime}${size}${omitted}]`)}return lines.join(`
|
|
@@ -24,4 +24,4 @@ This will re-download the latest local brain models.`);break}if(action===`reset`
|
|
|
24
24
|
`))deps.chatLog.addSystem(`[local] ${line}`);deps.chatLog.addSystem(`[local] exit ${code??`?`}${signal?` (signal ${String(signal)})`:``}`),deps.tui.requestRender(),resolve()}),child.on(`error`,err=>{deps.chatLog.addSystem(`[local] error: ${String(err)}`),deps.tui.requestRender(),resolve()})})}}}var ModalOverlayFrame=class{constructor(inner){this.inner=inner,this._focused=!1}render(width){let innerWidth=Math.max(1,width-2),innerLines=this.inner.render(innerWidth),contentLines=innerLines.length>0?innerLines:[``],top=theme.modalBorder(`┌${`─`.repeat(innerWidth)}┐`),bottom=theme.modalBorder(`└${`─`.repeat(innerWidth)}┘`);return[top,...contentLines.map(line=>{let trimmed=truncateToWidth(line,innerWidth,``),pad=` `.repeat(Math.max(0,innerWidth-visibleWidth(trimmed)));return`${theme.modalBorder(`│`)}${theme.modalBg(`${trimmed}${pad}`)}${theme.modalBorder(`│`)}`}),bottom]}handleInput(data){this.inner.handleInput?.(data)}invalidate(){this.inner.invalidate()}get focused(){return this._focused}set focused(value){this._focused=value;let maybeFocusable=this.inner;typeof maybeFocusable.focused==`boolean`&&(maybeFocusable.focused=value)}};function createOverlayHandlers(host,fallbackFocus){return{openOverlay:component=>{host.showOverlay(new ModalOverlayFrame(component))},closeOverlay:()=>{if(host.hasOverlay()){host.hideOverlay();return}host.setFocus(fallbackFocus)}}}function createSessionActions(context){let{client,chatLog,tui,opts,state,agentNames,initialSessionInput,initialSessionAgentId,resolveSessionKey,updateHeader,updateFooter,updateAutocompleteProvider,setActivityStatus,clearLocalRunIds}=context,refreshSessionInfoPromise=Promise.resolve(),lastSessionDefaults=null,applyAgentsResult=result=>{state.agentDefaultId=normalizeAgentId(result.defaultId),state.sessionMainKey=normalizeMainKey(result.mainKey),state.sessionScope=result.scope??state.sessionScope,state.agents=result.agents.map(agent=>({id:normalizeAgentId(agent.id),name:agent.name?.trim()||void 0})),agentNames.clear();for(let agent of state.agents)agent.name&&agentNames.set(agent.id,agent.name);if(state.initialSessionApplied)state.agents.some(agent=>agent.id===state.currentAgentId)||(state.currentAgentId=state.agents[0]?.id??normalizeAgentId(result.defaultId??state.currentAgentId));else{initialSessionAgentId?state.agents.some(agent=>agent.id===initialSessionAgentId)&&(state.currentAgentId=initialSessionAgentId):state.agents.some(agent=>agent.id===state.currentAgentId)||(state.currentAgentId=state.agents[0]?.id??normalizeAgentId(result.defaultId??state.currentAgentId));let nextSessionKey=resolveSessionKey(initialSessionInput);nextSessionKey!==state.currentSessionKey&&(state.currentSessionKey=nextSessionKey),state.initialSessionApplied=!0}updateHeader(),updateFooter()},refreshAgents=async()=>{try{applyAgentsResult(await client.listAgents())}catch(err){chatLog.addSystem(`agents list failed: ${String(err)}`)}},updateAgentFromSessionKey=key=>{let parsed=parseAgentSessionKey(key);if(!parsed)return;let next=normalizeAgentId(parsed.agentId);next!==state.currentAgentId&&(state.currentAgentId=next)},resolveModelSelection=entry=>{if(entry?.modelProvider||entry?.model)return{modelProvider:entry.modelProvider??state.sessionInfo.modelProvider,model:entry.model??state.sessionInfo.model};let overrideModel=entry?.modelOverride?.trim();return overrideModel?{modelProvider:entry?.providerOverride?.trim()||state.sessionInfo.modelProvider,model:overrideModel}:{modelProvider:state.sessionInfo.modelProvider,model:state.sessionInfo.model}},applySessionInfo=params=>{let entry=params.entry??void 0,defaults=params.defaults??lastSessionDefaults??void 0,previousDefaults=lastSessionDefaults,defaultsChanged=params.defaults?previousDefaults?.model!==params.defaults.model||previousDefaults?.modelProvider!==params.defaults.modelProvider||previousDefaults?.contextTokens!==params.defaults.contextTokens:!1;params.defaults&&(lastSessionDefaults=params.defaults);let entryUpdatedAt=entry?.updatedAt??null,currentUpdatedAt=state.sessionInfo.updatedAt??null,modelChanged=entry?.modelProvider!==void 0&&entry.modelProvider!==state.sessionInfo.modelProvider||entry?.model!==void 0&&entry.model!==state.sessionInfo.model;if(!params.force&&entryUpdatedAt!==null&¤tUpdatedAt!==null&&entryUpdatedAt<currentUpdatedAt&&!defaultsChanged&&!modelChanged)return;let next={...state.sessionInfo};entry?.thinkingLevel!==void 0&&(next.thinkingLevel=entry.thinkingLevel),entry?.verboseLevel!==void 0&&(next.verboseLevel=entry.verboseLevel),entry?.reasoningLevel!==void 0&&(next.reasoningLevel=entry.reasoningLevel),entry?.responseUsage!==void 0&&(next.responseUsage=entry.responseUsage),entry?.inputTokens!==void 0&&(next.inputTokens=entry.inputTokens),entry?.outputTokens!==void 0&&(next.outputTokens=entry.outputTokens),entry?.totalTokens!==void 0&&(next.totalTokens=entry.totalTokens),(entry?.contextTokens!==void 0||defaults?.contextTokens!==void 0)&&(next.contextTokens=entry?.contextTokens??defaults?.contextTokens??state.sessionInfo.contextTokens),entry?.displayName!==void 0&&(next.displayName=entry.displayName),entry?.updatedAt!==void 0&&(next.updatedAt=entry.updatedAt);let selection=resolveModelSelection(entry);selection.modelProvider!==void 0&&(next.modelProvider=selection.modelProvider),selection.model!==void 0&&(next.model=selection.model),state.sessionInfo=next,updateAutocompleteProvider(),updateFooter(),tui.requestRender()},runRefreshSessionInfo=async()=>{try{let listAgentId=(()=>{if(state.currentSessionKey===`global`||state.currentSessionKey===`unknown`)return;let parsed=parseAgentSessionKey(state.currentSessionKey);return parsed?.agentId?normalizeAgentId(parsed.agentId):state.currentAgentId})(),result=await client.listSessions({includeGlobal:!1,includeUnknown:!1,agentId:listAgentId}),normalizeMatchKey=key=>parseAgentSessionKey(key)?.rest??key,currentMatchKey=normalizeMatchKey(state.currentSessionKey),entry=result.sessions.find(row=>row.key===state.currentSessionKey?!0:normalizeMatchKey(row.key)===currentMatchKey);entry?.key&&entry.key!==state.currentSessionKey&&(updateAgentFromSessionKey(entry.key),state.currentSessionKey=entry.key,updateHeader()),applySessionInfo({entry,defaults:result.defaults})}catch(err){chatLog.addSystem(`sessions list failed: ${String(err)}`)}},refreshSessionInfo=async()=>{refreshSessionInfoPromise=refreshSessionInfoPromise.then(runRefreshSessionInfo,runRefreshSessionInfo),await refreshSessionInfoPromise},applySessionInfoFromPatch=result=>{if(!result?.entry)return;result.key&&result.key!==state.currentSessionKey&&(updateAgentFromSessionKey(result.key),state.currentSessionKey=result.key,updateHeader());let resolved=result.resolved;applySessionInfo({entry:resolved&&(resolved.modelProvider||resolved.model)?{...result.entry,modelProvider:resolved.modelProvider??result.entry.modelProvider,model:resolved.model??result.entry.model}:result.entry,force:!0})},loadHistory=async()=>{try{let record=await client.loadHistory({sessionKey:state.currentSessionKey,limit:opts.historyLimit??200});state.currentSessionId=typeof record.sessionId==`string`?record.sessionId:null,state.sessionInfo.thinkingLevel=record.thinkingLevel??state.sessionInfo.thinkingLevel,state.sessionInfo.verboseLevel=record.verboseLevel??state.sessionInfo.verboseLevel;let showTools=(state.sessionInfo.verboseLevel??`off`)!==`off`;chatLog.clearAll(),chatLog.addSystem(`session ${state.currentSessionKey}`);for(let entry of record.messages??[]){if(!entry||typeof entry!=`object`)continue;let message=entry;if(isCommandMessage(message)){let text=extractTextFromMessage(message);text&&chatLog.addSystem(text);continue}if(message.role===`user`){let text=extractTextFromMessage(message);text&&chatLog.addUser(text);continue}if(message.role===`assistant`){let text=extractTextFromMessage(message,{includeThinking:state.showThinking});text&&chatLog.finalizeAssistant(text);continue}if(message.role===`toolResult`){if(!showTools)continue;let toolCallId=asString(message.toolCallId,``),toolName=asString(message.toolName,`tool`);chatLog.startTool(toolCallId,toolName,{}).setResult({content:Array.isArray(message.content)?message.content:[],details:typeof message.details==`object`&&message.details?message.details:void 0},{isError:!!message.isError})}}state.historyLoaded=!0}catch(err){chatLog.addSystem(`history failed: ${String(err)}`)}await refreshSessionInfo(),tui.requestRender()};return{applyAgentsResult,refreshAgents,refreshSessionInfo,applySessionInfoFromPatch,loadHistory,setSession:async rawKey=>{let nextKey=resolveSessionKey(rawKey);updateAgentFromSessionKey(nextKey),state.currentSessionKey=nextKey,state.activeChatRunId=null,state.currentSessionId=null,state.historyLoaded=!1,clearLocalRunIds?.(),updateHeader(),updateFooter(),await loadHistory();try{let handoff=await loadLatestSessionHandoff(process.cwd());if(handoff){let lines=[`Resuming from session ${handoff.sessionId.slice(0,8)} (${handoff.timestamp.slice(0,10)})`,`Summary: ${handoff.summary}`];handoff.decisions.length>0&&lines.push(`Decisions: ${handoff.decisions.map(d=>`• ${d}`).join(` `)}`),handoff.nextSteps.length>0&&lines.push(`Next steps: ${handoff.nextSteps.map(s=>`• ${s}`).join(` `)}`),handoff.openQuestions.length>0&&lines.push(`Open questions: ${handoff.openQuestions.map(q=>`• ${q}`).join(` `)}`),chatLog.addSystem(lines.join(`
|
|
25
25
|
`))}}catch{}},abortActive:async()=>{if(!state.activeChatRunId){chatLog.addSystem(`no active run`),tui.requestRender();return}try{await client.abortChat({sessionKey:state.currentSessionKey,runId:state.activeChatRunId}),setActivityStatus(`aborted`)}catch(err){chatLog.addSystem(`abort failed: ${String(err)}`),setActivityStatus(`abort failed`)}tui.requestRender()}}}const defaultWaitingPhrases=[`flibbertigibbeting`,`kerfuffling`,`dillydallying`,`twiddling thumbs`,`noodling`,`bamboozling`,`moseying`,`hobnobbing`,`pondering`,`conjuring`];function pickWaitingPhrase(tick,phrases=defaultWaitingPhrases){return phrases[Math.floor(tick/10)%phrases.length]??phrases[0]??`waiting`}function shimmerText(theme,text,tick){let hi=ch=>theme.bold(theme.accentSoft(ch)),pos=tick%(text.length+6),start=Math.max(0,pos-6),end=Math.min(text.length-1,pos),out=``;for(let i=0;i<text.length;i++){let ch=text[i];out+=i>=start&&i<=end?hi(ch):theme.dim(ch)}return out}function buildWaitingStatusMessage(params){let phrase=pickWaitingPhrase(params.tick,params.phrases);return`${shimmerText(params.theme,`${phrase}…`,params.tick)} • ${params.elapsed} | ${params.connectionStatus}`}function createEditorSubmitHandler(params){return text=>{let raw=text,value=raw.trim();if(params.editor.setText(``),value){if(raw.startsWith(`!`)&&raw!==`!`){params.editor.addToHistory(raw),params.handleBangLine(raw);return}if(params.editor.addToHistory(value),value.startsWith(`/`)){params.handleCommand(value);return}params.sendMessage(value)}}}function shouldEnableWindowsGitBashPasteFallback(params){if((params?.platform??process.platform)!==`win32`)return!1;let env=params?.env??process.env,msystem=(env.MSYSTEM??``).toUpperCase(),shell=env.SHELL??``,termProgram=(env.TERM_PROGRAM??``).toLowerCase();return msystem.startsWith(`MINGW`)||msystem.startsWith(`MSYS`)||shell.toLowerCase().includes(`bash`)?!0:termProgram.includes(`mintty`)}function createSubmitBurstCoalescer(params){let windowMs=Math.max(1,params.burstWindowMs??50),now=params.now??(()=>Date.now()),setTimer=params.setTimer??setTimeout,clearTimer=params.clearTimer??clearTimeout,pending=null,pendingAt=0,flushTimer=null,clearFlushTimer=()=>{flushTimer&&=(clearTimer(flushTimer),null)},flushPending=()=>{if(pending===null)return;let value=pending;pending=null,pendingAt=0,clearFlushTimer(),params.submit(value)},scheduleFlush=()=>{clearFlushTimer(),flushTimer=setTimer(()=>{flushPending()},windowMs)};return value=>{if(!params.enabled){params.submit(value);return}if(value.includes(`
|
|
26
26
|
`)){flushPending(),params.submit(value);return}let ts=now();if(pending===null){pending=value,pendingAt=ts,scheduleFlush();return}if(ts-pendingAt<=windowMs){pending=`${pending}\n${value}`,pendingAt=ts,scheduleFlush();return}flushPending(),pending=value,pendingAt=ts,scheduleFlush()}}function resolveTuiSessionKey(params){let trimmed=(params.raw??``).trim();return trimmed?trimmed===`global`||trimmed===`unknown`||trimmed.startsWith(`agent:`)?trimmed:`agent:${params.currentAgentId}:${trimmed}`:params.sessionScope===`global`?`global`:buildAgentMainSessionKey({agentId:params.currentAgentId,mainKey:params.sessionMainKey})}async function runTui(opts){let config=loadConfig(),initialSessionInput=(opts.session??``).trim(),sessionScope=config.session?.scope??`per-sender`,sessionMainKey=normalizeMainKey(config.session?.mainKey),agentDefaultId=resolveDefaultAgentId(config),currentAgentId=agentDefaultId,agents=[],agentNames=new Map,currentSessionKey=``,initialSessionApplied=!1,currentSessionId=null,activeChatRunId=null,historyLoaded=!1,isConnected=!1,wasDisconnected=!1,toolsExpanded=!1,loggingEnabled=config.logging?.enabled!==!1,showThinking=!1,localRunIds=new Set,deliverDefault=opts.deliver??!1,autoMessage=opts.message?.trim(),autoMessageSent=!1,sessionInfo={},lastCtrlCAt=0,activityStatus=`idle`,connectionStatus=`connecting`,statusTimeout=null,statusTimer=null,statusStartedAt=null,lastActivityStatus=activityStatus,setupInProgress=!1,projectName=null,workspaceState=null;Promise.all([loadProjectContext(process.cwd()).catch(()=>null),loadWorkspaceState(process.cwd()).catch(()=>null)]).then(([ctx,ws])=>{projectName=ctx?.projectName??null,workspaceState=ws});let state={get agentDefaultId(){return agentDefaultId},set agentDefaultId(value){agentDefaultId=value},get sessionMainKey(){return sessionMainKey},set sessionMainKey(value){sessionMainKey=value},get sessionScope(){return sessionScope},set sessionScope(value){sessionScope=value},get agents(){return agents},set agents(value){agents=value},get currentAgentId(){return currentAgentId},set currentAgentId(value){currentAgentId=value},get currentSessionKey(){return currentSessionKey},set currentSessionKey(value){currentSessionKey=value},get currentSessionId(){return currentSessionId},set currentSessionId(value){currentSessionId=value},get activeChatRunId(){return activeChatRunId},set activeChatRunId(value){activeChatRunId=value},get historyLoaded(){return historyLoaded},set historyLoaded(value){historyLoaded=value},get sessionInfo(){return sessionInfo},set sessionInfo(value){sessionInfo=value},get initialSessionApplied(){return initialSessionApplied},set initialSessionApplied(value){initialSessionApplied=value},get isConnected(){return isConnected},set isConnected(value){isConnected=value},get autoMessageSent(){return autoMessageSent},set autoMessageSent(value){autoMessageSent=value},get toolsExpanded(){return toolsExpanded},set toolsExpanded(value){toolsExpanded=value},get showThinking(){return showThinking},set showThinking(value){showThinking=value},get connectionStatus(){return connectionStatus},set connectionStatus(value){connectionStatus=value},get activityStatus(){return activityStatus},set activityStatus(value){activityStatus=value},get statusTimeout(){return statusTimeout},set statusTimeout(value){statusTimeout=value},get lastCtrlCAt(){return lastCtrlCAt},set lastCtrlCAt(value){lastCtrlCAt=value},get loggingEnabled(){return loggingEnabled},set loggingEnabled(value){loggingEnabled=value}},noteLocalRunId=runId=>{if(runId&&(localRunIds.add(runId),localRunIds.size>200)){let[first]=localRunIds;first&&localRunIds.delete(first)}},forgetLocalRunId=runId=>{localRunIds.delete(runId)},isLocalRunId=runId=>localRunIds.has(runId),clearLocalRunIds=()=>{localRunIds.clear()},client=new GatewayChatClient({url:opts.url,token:opts.token,password:opts.password}),tui=new TUI(new ProcessTerminal),header=new Text(``,1,0),statusContainer=new Container,statusBodyContainer=new Container,statusTraceText=new Text(``,1,0),footer=new Text(``,1,0),chatLog=new ChatLog,editor=new CustomEditor(tui,editorTheme),root=new Container;root.addChild(header),root.addChild(chatLog),statusContainer.addChild(statusBodyContainer),statusContainer.addChild(statusTraceText),root.addChild(statusContainer),root.addChild(footer),root.addChild(editor);let updateAutocompleteProvider=()=>{editor.setAutocompleteProvider(new CombinedAutocompleteProvider(getSlashCommands({cfg:config,provider:sessionInfo.modelProvider,model:sessionInfo.model}),process.cwd()))};tui.addChild(root),tui.setFocus(editor);let formatSessionKey=key=>key===`global`||key===`unknown`?key:parseAgentSessionKey(key)?.rest??key,formatAgentLabel=id=>{let name=agentNames.get(id);return name?`${id} (${name})`:id},resolveSessionKey=raw=>resolveTuiSessionKey({raw,sessionScope,currentAgentId,sessionMainKey});currentSessionKey=resolveSessionKey(initialSessionInput);let updateHeader=()=>{let sessionLabel=formatSessionKey(currentSessionKey),agentLabel=formatAgentLabel(currentAgentId),projectPart=projectName?` · ${projectName}`:``,syncPart=workspaceState?.lastSyncedAt?` [synced ${formatTimeAgo(Date.now()-new Date(workspaceState.lastSyncedAt).getTime())}]`:``;header.setText(theme.header(`builderforce tui${projectPart}${syncPart} - ${client.connection.url} - agent ${agentLabel} - session ${sessionLabel}`))},busyStates=new Set([`sending`,`waiting`,`streaming`,`running`]),statusText=null,statusLoader=null,statusTraceLines=[],renderStatusTrace=()=>{statusTraceText.setText(theme.dim(statusTraceLines.join(`
|
|
27
|
-
`)))},reportAction=text=>{let message=text.trim();message&&(statusTraceLines.push(`• ${message}`),statusTraceLines.length>14&&statusTraceLines.splice(0,statusTraceLines.length-14),renderStatusTrace())},formatElapsed=startMs=>{let totalSeconds=Math.max(0,Math.floor((Date.now()-startMs)/1e3));return totalSeconds<60?`${totalSeconds}s`:`${Math.floor(totalSeconds/60)}m ${totalSeconds%60}s`},ensureStatusText=()=>{statusText||(statusBodyContainer.clear(),statusLoader?.stop(),statusLoader=null,statusText=new Text(``,1,0),statusBodyContainer.addChild(statusText))},ensureStatusLoader=()=>{statusLoader||(statusBodyContainer.clear(),statusText=null,statusLoader=new Loader(tui,spinner=>theme.accent(spinner),text=>theme.bold(theme.accentSoft(text)),``),statusBodyContainer.addChild(statusLoader))},waitingTick=0,waitingTimer=null,waitingPhrase=null,updateBusyStatusMessage=()=>{if(!statusLoader||!statusStartedAt)return;let elapsed=formatElapsed(statusStartedAt);if(activityStatus===`waiting`){waitingTick++,statusLoader.setMessage(buildWaitingStatusMessage({theme,tick:waitingTick,elapsed,connectionStatus,phrases:waitingPhrase?[waitingPhrase]:void 0}));return}statusLoader.setMessage(`${activityStatus} • ${elapsed} | ${connectionStatus}`)},startStatusTimer=()=>{statusTimer||=setInterval(()=>{busyStates.has(activityStatus)&&updateBusyStatusMessage()},1e3)},stopStatusTimer=()=>{statusTimer&&=(clearInterval(statusTimer),null)},startWaitingTimer=()=>{waitingTimer||=(waitingPhrase||=defaultWaitingPhrases[Math.floor(Math.random()*defaultWaitingPhrases.length)]??defaultWaitingPhrases[0]??`waiting`,waitingTick=0,setInterval(()=>{activityStatus===`waiting`&&updateBusyStatusMessage()},120))},stopWaitingTimer=()=>{waitingTimer&&(clearInterval(waitingTimer),waitingTimer=null,waitingPhrase=null)},renderStatus=()=>{if(busyStates.has(activityStatus))(!statusStartedAt||lastActivityStatus!==activityStatus)&&(statusStartedAt=Date.now()),ensureStatusLoader(),activityStatus===`waiting`?(stopStatusTimer(),startWaitingTimer()):(stopWaitingTimer(),startStatusTimer()),updateBusyStatusMessage();else{statusStartedAt=null,stopStatusTimer(),stopWaitingTimer(),statusLoader?.stop(),statusLoader=null,ensureStatusText();let text=activityStatus?`${connectionStatus} | ${activityStatus}`:connectionStatus;statusText?.setText(theme.dim(text))}lastActivityStatus=activityStatus},setConnectionStatus=(text,ttlMs)=>{let previous=connectionStatus;connectionStatus=text,text!==previous&&reportAction(`connection: ${text}`),renderStatus(),statusTimeout&&clearTimeout(statusTimeout),ttlMs&&ttlMs>0&&(statusTimeout=setTimeout(()=>{connectionStatus=isConnected?`connected`:`disconnected`,renderStatus()},ttlMs))},setActivityStatus=text=>{activityStatus=text,renderStatus()},updateFooter=()=>{let sessionKeyLabel=formatSessionKey(currentSessionKey),sessionLabel=sessionInfo.displayName?`${sessionKeyLabel} (${sessionInfo.displayName})`:sessionKeyLabel,agentLabel=formatAgentLabel(currentAgentId),modelLabel=sessionInfo.model?sessionInfo.modelProvider?`${sessionInfo.modelProvider}/${sessionInfo.model}`:sessionInfo.model:`unknown`,tokens=formatTokens(sessionInfo.totalTokens??null,sessionInfo.contextTokens??null),think=sessionInfo.thinkingLevel??`off`,verbose=sessionInfo.verboseLevel??`off`,reasoning=sessionInfo.reasoningLevel??`off`,reasoningLabel=reasoning===`on`?`reasoning`:reasoning===`stream`?`reasoning:stream`:null,localBrainLabel=config.localBrain?.enabled?`local brain`:null,footerParts=[`agent ${agentLabel}`,`session ${sessionLabel}`,modelLabel,localBrainLabel,think===`off`?null:`think ${think}`,verbose===`off`?null:`verbose ${verbose}`,reasoningLabel,tokens].filter(Boolean);footer.setText(theme.dim(footerParts.join(` | `)))},{openOverlay,closeOverlay}=createOverlayHandlers(tui,editor),{refreshAgents,refreshSessionInfo,applySessionInfoFromPatch,loadHistory,setSession,abortActive}=createSessionActions({client,chatLog,tui,opts,state,agentNames,initialSessionInput,initialSessionAgentId:(()=>{if(!initialSessionInput)return null;let parsed=parseAgentSessionKey(initialSessionInput);return parsed?normalizeAgentId(parsed.agentId):null})(),resolveSessionKey,updateHeader,updateFooter,updateAutocompleteProvider,setActivityStatus,clearLocalRunIds}),{handleChatEvent,handleAgentEvent}=createEventHandlers({chatLog,tui,state,setActivityStatus,reportAction,refreshSessionInfo,loadHistory,isLocalRunId,forgetLocalRunId,clearLocalRunIds}),{handleCommand,sendMessage,openModelSelector,openAgentSelector,openSessionSelector}=createCommandHandlers({client,chatLog,tui,opts,state,deliverDefault,openOverlay,closeOverlay,refreshSessionInfo,applySessionInfoFromPatch,updateFooter,loadHistory,setSession,refreshAgents,abortActive,setActivityStatus,reportAction,formatSessionKey,noteLocalRunId,forgetLocalRunId,onSetup:async()=>{if(setupInProgress){chatLog.addSystem(`Setup is already running.`),tui.requestRender();return}setupInProgress=!0;try{chatLog.addSystem(`Stopping TUI — setup wizard starting…`),tui.requestRender(),await new Promise(r=>setTimeout(r,80)),client.stop(),tui.stop(),await new Promise(r=>setTimeout(r,50));let{restoreTerminalState}=await import(`./restore-DsNJCsuC.js`),{runInteractiveOnboarding}=await import(`./onboard-interactive-
|
|
27
|
+
`)))},reportAction=text=>{let message=text.trim();message&&(statusTraceLines.push(`• ${message}`),statusTraceLines.length>14&&statusTraceLines.splice(0,statusTraceLines.length-14),renderStatusTrace())},formatElapsed=startMs=>{let totalSeconds=Math.max(0,Math.floor((Date.now()-startMs)/1e3));return totalSeconds<60?`${totalSeconds}s`:`${Math.floor(totalSeconds/60)}m ${totalSeconds%60}s`},ensureStatusText=()=>{statusText||(statusBodyContainer.clear(),statusLoader?.stop(),statusLoader=null,statusText=new Text(``,1,0),statusBodyContainer.addChild(statusText))},ensureStatusLoader=()=>{statusLoader||(statusBodyContainer.clear(),statusText=null,statusLoader=new Loader(tui,spinner=>theme.accent(spinner),text=>theme.bold(theme.accentSoft(text)),``),statusBodyContainer.addChild(statusLoader))},waitingTick=0,waitingTimer=null,waitingPhrase=null,updateBusyStatusMessage=()=>{if(!statusLoader||!statusStartedAt)return;let elapsed=formatElapsed(statusStartedAt);if(activityStatus===`waiting`){waitingTick++,statusLoader.setMessage(buildWaitingStatusMessage({theme,tick:waitingTick,elapsed,connectionStatus,phrases:waitingPhrase?[waitingPhrase]:void 0}));return}statusLoader.setMessage(`${activityStatus} • ${elapsed} | ${connectionStatus}`)},startStatusTimer=()=>{statusTimer||=setInterval(()=>{busyStates.has(activityStatus)&&updateBusyStatusMessage()},1e3)},stopStatusTimer=()=>{statusTimer&&=(clearInterval(statusTimer),null)},startWaitingTimer=()=>{waitingTimer||=(waitingPhrase||=defaultWaitingPhrases[Math.floor(Math.random()*defaultWaitingPhrases.length)]??defaultWaitingPhrases[0]??`waiting`,waitingTick=0,setInterval(()=>{activityStatus===`waiting`&&updateBusyStatusMessage()},120))},stopWaitingTimer=()=>{waitingTimer&&(clearInterval(waitingTimer),waitingTimer=null,waitingPhrase=null)},renderStatus=()=>{if(busyStates.has(activityStatus))(!statusStartedAt||lastActivityStatus!==activityStatus)&&(statusStartedAt=Date.now()),ensureStatusLoader(),activityStatus===`waiting`?(stopStatusTimer(),startWaitingTimer()):(stopWaitingTimer(),startStatusTimer()),updateBusyStatusMessage();else{statusStartedAt=null,stopStatusTimer(),stopWaitingTimer(),statusLoader?.stop(),statusLoader=null,ensureStatusText();let text=activityStatus?`${connectionStatus} | ${activityStatus}`:connectionStatus;statusText?.setText(theme.dim(text))}lastActivityStatus=activityStatus},setConnectionStatus=(text,ttlMs)=>{let previous=connectionStatus;connectionStatus=text,text!==previous&&reportAction(`connection: ${text}`),renderStatus(),statusTimeout&&clearTimeout(statusTimeout),ttlMs&&ttlMs>0&&(statusTimeout=setTimeout(()=>{connectionStatus=isConnected?`connected`:`disconnected`,renderStatus()},ttlMs))},setActivityStatus=text=>{activityStatus=text,renderStatus()},updateFooter=()=>{let sessionKeyLabel=formatSessionKey(currentSessionKey),sessionLabel=sessionInfo.displayName?`${sessionKeyLabel} (${sessionInfo.displayName})`:sessionKeyLabel,agentLabel=formatAgentLabel(currentAgentId),modelLabel=sessionInfo.model?sessionInfo.modelProvider?`${sessionInfo.modelProvider}/${sessionInfo.model}`:sessionInfo.model:`unknown`,tokens=formatTokens(sessionInfo.totalTokens??null,sessionInfo.contextTokens??null),think=sessionInfo.thinkingLevel??`off`,verbose=sessionInfo.verboseLevel??`off`,reasoning=sessionInfo.reasoningLevel??`off`,reasoningLabel=reasoning===`on`?`reasoning`:reasoning===`stream`?`reasoning:stream`:null,localBrainLabel=config.localBrain?.enabled?`local brain`:null,footerParts=[`agent ${agentLabel}`,`session ${sessionLabel}`,modelLabel,localBrainLabel,think===`off`?null:`think ${think}`,verbose===`off`?null:`verbose ${verbose}`,reasoningLabel,tokens].filter(Boolean);footer.setText(theme.dim(footerParts.join(` | `)))},{openOverlay,closeOverlay}=createOverlayHandlers(tui,editor),{refreshAgents,refreshSessionInfo,applySessionInfoFromPatch,loadHistory,setSession,abortActive}=createSessionActions({client,chatLog,tui,opts,state,agentNames,initialSessionInput,initialSessionAgentId:(()=>{if(!initialSessionInput)return null;let parsed=parseAgentSessionKey(initialSessionInput);return parsed?normalizeAgentId(parsed.agentId):null})(),resolveSessionKey,updateHeader,updateFooter,updateAutocompleteProvider,setActivityStatus,clearLocalRunIds}),{handleChatEvent,handleAgentEvent}=createEventHandlers({chatLog,tui,state,setActivityStatus,reportAction,refreshSessionInfo,loadHistory,isLocalRunId,forgetLocalRunId,clearLocalRunIds}),{handleCommand,sendMessage,openModelSelector,openAgentSelector,openSessionSelector}=createCommandHandlers({client,chatLog,tui,opts,state,deliverDefault,openOverlay,closeOverlay,refreshSessionInfo,applySessionInfoFromPatch,updateFooter,loadHistory,setSession,refreshAgents,abortActive,setActivityStatus,reportAction,formatSessionKey,noteLocalRunId,forgetLocalRunId,onSetup:async()=>{if(setupInProgress){chatLog.addSystem(`Setup is already running.`),tui.requestRender();return}setupInProgress=!0;try{chatLog.addSystem(`Stopping TUI — setup wizard starting…`),tui.requestRender(),await new Promise(r=>setTimeout(r,80)),client.stop(),tui.stop(),await new Promise(r=>setTimeout(r,50));let{restoreTerminalState}=await import(`./restore-DsNJCsuC.js`),{runInteractiveOnboarding}=await import(`./onboard-interactive-B3Z0XLT6.js`),{startGatewayBackground}=await import(`./tui-setup-check-DV9crMsa.js`);restoreTerminalState(`pre-setup-wizard`,{resumeStdinIfPaused:!0}),await new Promise(r=>setTimeout(r,150));try{await runInteractiveOnboarding({flow:`quickstart`})}catch(err){process.stderr.write(`Setup wizard failed: ${String(err)}\n`)}finally{restoreTerminalState(`post-setup-wizard`,{resumeStdinIfPaused:!0})}await startGatewayBackground(),setConnectionStatus(`restarting tui`),setActivityStatus(`idle`),updateHeader(),updateFooter(),tui.start(),tui.setFocus(editor),tui.requestRender(),client.start()}finally{setupInProgress=!1}},config}),{runLocalShellLine}=createLocalShellRunner({chatLog,tui,openOverlay,closeOverlay});updateAutocompleteProvider(),editor.onSubmit=createSubmitBurstCoalescer({submit:createEditorSubmitHandler({editor,handleCommand,sendMessage,handleBangLine:runLocalShellLine}),enabled:shouldEnableWindowsGitBashPasteFallback()}),editor.onEscape=()=>{abortActive()},editor.onCtrlC=()=>{let now=Date.now();if(editor.getText().trim().length>0){editor.setText(``),setActivityStatus(`cleared input`),tui.requestRender();return}now-lastCtrlCAt<1e3&&(client.stop(),tui.stop(),process.exit(0)),lastCtrlCAt=now,setActivityStatus(`press ctrl+c again to exit`),tui.requestRender()},editor.onCtrlD=()=>{client.stop(),tui.stop(),process.exit(0)},editor.onCtrlO=()=>{toolsExpanded=!toolsExpanded,chatLog.setToolsExpanded(toolsExpanded),setActivityStatus(toolsExpanded?`tools expanded`:`tools collapsed`),tui.requestRender()},editor.onCtrlL=()=>{openModelSelector()},editor.onCtrlG=()=>{openAgentSelector()},editor.onCtrlP=()=>{openSessionSelector()},editor.onCtrlT=()=>{showThinking=!showThinking,loadHistory()},client.onEvent=evt=>{evt.event===`chat`&&handleChatEvent(evt.payload),evt.event===`agent`&&handleAgentEvent(evt.payload)},client.onConnected=()=>{isConnected=!0;let reconnected=wasDisconnected;wasDisconnected=!1,setConnectionStatus(`connected`),(async()=>{await refreshAgents(),updateHeader(),await refreshSessionInfo(),await loadHistory(),setConnectionStatus(reconnected?`gateway reconnected`:`gateway connected`,4e3),tui.requestRender(),!autoMessageSent&&autoMessage&&(autoMessageSent=!0,await sendMessage(autoMessage)),updateFooter(),tui.requestRender()})()},client.onDisconnected=reason=>{let isFirstFailure=!wasDisconnected&&!isConnected;isConnected=!1,wasDisconnected=!0,historyLoaded=!1,setConnectionStatus(`gateway disconnected: ${reason?.trim()?reason.trim():`closed`}`,5e3),setActivityStatus(`idle`),isFirstFailure&&chatLog.addSystem(`Gateway not reachable. Type /setup or /onboard to run the setup wizard, or /gateway restart to restart the gateway.`),updateFooter(),tui.requestRender()},client.onGap=info=>{setConnectionStatus(`event gap: expected ${info.expected}, got ${info.received}`,5e3),tui.requestRender()},updateHeader(),setConnectionStatus(`connecting`),updateFooter(),tui.start(),client.start(),await new Promise(resolve=>{let finish=()=>resolve();process.once(`exit`,finish),process.once(`SIGINT`,finish),process.once(`SIGTERM`,finish)})}export{runTui as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./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"./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"./client-CGgp3zkQ.js";import"./call-O-iC_P5t.js";import"./message-channel-z5YRpR2d.js";import"./sessions-CmJXMlLP.js";import"./project-context-store-BNXYrLJz.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./accounts-Cx82nj4E.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"./tool-display-Cs4hDP1f.js";import"./builderforcellm-syscheck-tquUDu_7.js";import"./usage-format-5sp5AMSu.js";import"./project-context-BdK18hVI.js";import{t as parseTimeoutMs}from"./parse-timeout-BvepsazJ.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import"./transformers-stream-Buj40qHl.js";import"./builderforce-directory-sync-gx_ESkap.js";import"./shared-DUsuqnhk.js";import"./model-picker-Do5aHFkC.js";import"./auth-choice.apply.transformers-
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./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"./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"./client-CGgp3zkQ.js";import"./call-O-iC_P5t.js";import"./message-channel-z5YRpR2d.js";import"./sessions-CmJXMlLP.js";import"./project-context-store-BNXYrLJz.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./accounts-Cx82nj4E.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"./tool-display-Cs4hDP1f.js";import"./builderforcellm-syscheck-tquUDu_7.js";import"./usage-format-5sp5AMSu.js";import"./project-context-BdK18hVI.js";import{t as parseTimeoutMs}from"./parse-timeout-BvepsazJ.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import"./transformers-stream-Buj40qHl.js";import"./builderforce-directory-sync-gx_ESkap.js";import"./shared-DUsuqnhk.js";import"./model-picker-Do5aHFkC.js";import"./auth-choice.apply.transformers-Be8599JD.js";import{t as runTui}from"./tui-LemSel3H.js";import"./tui-stream-assembler-DW908fGx.js";function registerTuiCli(program){program.command(`tui`).description(`Open a terminal UI connected to the Gateway`).option(`--url <url>`,`Gateway WebSocket URL (defaults to gateway.remote.url when configured)`).option(`--token <token>`,`Gateway token (if required)`).option(`--password <password>`,`Gateway password (if required)`).option(`--session <key>`,`Session key (default: "main", or "global" when scope is global)`).option(`--deliver`,`Deliver assistant replies`,!1).option(`--thinking <level>`,`Thinking level override`).option(`--message <text>`,`Send an initial message after connecting`).option(`--timeout-ms <ms>`,`Agent timeout in ms (defaults to agents.defaults.timeoutSeconds)`).option(`--history-limit <n>`,`History entries to load`,`200`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/tui`,`docs.builderforce.ai/cli/tui`)}\n`).action(async opts=>{try{let{checkIfSetupNeeded}=await import(`./tui-setup-check-DV9crMsa.js`),setupCheck=process.env.BUILDERFORCE_AGENTS_SKIP_SETUP_CHECK===`1`?{needed:!1}:await checkIfSetupNeeded();if(setupCheck.needed){defaultRuntime.log(theme.muted(setupCheck.hint));let{runInteractiveOnboarding}=await import(`./onboard-interactive-B3Z0XLT6.js`);await runInteractiveOnboarding({flow:`quickstart`});let{startGatewayBackground}=await import(`./tui-setup-check-DV9crMsa.js`);await startGatewayBackground()||defaultRuntime.log(theme.muted(`Gateway not reachable yet — TUI will retry when it connects.`))}let timeoutMs=parseTimeoutMs(opts.timeoutMs);opts.timeoutMs!==void 0&&timeoutMs===void 0&&defaultRuntime.error(`warning: invalid --timeout-ms "${String(opts.timeoutMs)}"; ignoring`);let historyLimit=Number.parseInt(String(opts.historyLimit??`200`),10);if(process.env.BUILDERFORCE_AGENTS_INK_TUI===`1`){let{runInkSession}=await import(`./ink-session-Bean43fH.js`);await runInkSession({sessionKey:opts.session?.trim()||`main`,connection:{url:opts.url,token:opts.token,password:opts.password},showThinking:typeof opts.thinking==`string`&&opts.thinking!==`off`});return}await runTui({url:opts.url,token:opts.token,password:opts.password,session:opts.session,deliver:!!opts.deliver,thinking:opts.thinking,message:opts.message,timeoutMs,historyLimit:Number.isNaN(historyLimit)?void 0:historyLimit})}catch(err){defaultRuntime.error(String(err)),defaultRuntime.exit(1)}})}export{registerTuiCli};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./embedded-helpers-2fP2Yq8h.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"./io-BNtgT4VB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BD801bpx.js";import"./model-catalog-BoiWqBTw.js";import"./sandbox-1jtP0nhr.js";import"./chrome-Bfprrnm1.js";import"./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"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./project-context-store-Dbbjk8CQ.js";import"./client-xfoidwPI.js";import"./call-CJq3iGqu.js";import"./builderforcellm-syscheck-Cp4LMft_.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import"./usage-format-DGf8ZWPH.js";import"./project-context-BLpMH93w.js";import{t as parseTimeoutMs}from"./parse-timeout-DgbvuHbz.js";import"./transformers-stream-D7nRu4Qu.js";import"./builderforce-directory-sync-DRmWhsXb.js";import"./shared-DXDwFhUI.js";import"./model-picker-CCvGdvzM.js";import"./auth-choice.apply.transformers-
|
|
1
|
+
import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./embedded-helpers-2fP2Yq8h.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"./io-BNtgT4VB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BD801bpx.js";import"./model-catalog-BoiWqBTw.js";import"./sandbox-1jtP0nhr.js";import"./chrome-Bfprrnm1.js";import"./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"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./project-context-store-Dbbjk8CQ.js";import"./client-xfoidwPI.js";import"./call-CJq3iGqu.js";import"./builderforcellm-syscheck-Cp4LMft_.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import"./usage-format-DGf8ZWPH.js";import"./project-context-BLpMH93w.js";import{t as parseTimeoutMs}from"./parse-timeout-DgbvuHbz.js";import"./transformers-stream-D7nRu4Qu.js";import"./builderforce-directory-sync-DRmWhsXb.js";import"./shared-DXDwFhUI.js";import"./model-picker-CCvGdvzM.js";import"./auth-choice.apply.transformers-CgfGlqy1.js";import{t as runTui}from"./tui-HTtOgZ_X.js";import"./tui-stream-assembler-4UmPxCWJ.js";function registerTuiCli(program){program.command(`tui`).description(`Open a terminal UI connected to the Gateway`).option(`--url <url>`,`Gateway WebSocket URL (defaults to gateway.remote.url when configured)`).option(`--token <token>`,`Gateway token (if required)`).option(`--password <password>`,`Gateway password (if required)`).option(`--session <key>`,`Session key (default: "main", or "global" when scope is global)`).option(`--deliver`,`Deliver assistant replies`,!1).option(`--thinking <level>`,`Thinking level override`).option(`--message <text>`,`Send an initial message after connecting`).option(`--timeout-ms <ms>`,`Agent timeout in ms (defaults to agents.defaults.timeoutSeconds)`).option(`--history-limit <n>`,`History entries to load`,`200`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/tui`,`docs.builderforce.ai/cli/tui`)}\n`).action(async opts=>{try{let{checkIfSetupNeeded}=await import(`./tui-setup-check-CqKfESDo.js`),setupCheck=process.env.BUILDERFORCE_AGENTS_SKIP_SETUP_CHECK===`1`?{needed:!1}:await checkIfSetupNeeded();if(setupCheck.needed){defaultRuntime.log(theme.muted(setupCheck.hint));let{runInteractiveOnboarding}=await import(`./onboard-interactive-COnCCTTW.js`);await runInteractiveOnboarding({flow:`quickstart`});let{startGatewayBackground}=await import(`./tui-setup-check-CqKfESDo.js`);await startGatewayBackground()||defaultRuntime.log(theme.muted(`Gateway not reachable yet — TUI will retry when it connects.`))}let timeoutMs=parseTimeoutMs(opts.timeoutMs);opts.timeoutMs!==void 0&&timeoutMs===void 0&&defaultRuntime.error(`warning: invalid --timeout-ms "${String(opts.timeoutMs)}"; ignoring`);let historyLimit=Number.parseInt(String(opts.historyLimit??`200`),10);if(process.env.BUILDERFORCE_AGENTS_INK_TUI===`1`){let{runInkSession}=await import(`./ink-session-BBQjAqcN.js`);await runInkSession({sessionKey:opts.session?.trim()||`main`,connection:{url:opts.url,token:opts.token,password:opts.password},showThinking:typeof opts.thinking==`string`&&opts.thinking!==`off`});return}await runTui({url:opts.url,token:opts.token,password:opts.password,session:opts.session,deliver:!!opts.deliver,thinking:opts.thinking,message:opts.message,timeoutMs,historyLimit:Number.isNaN(historyLimit)?void 0:historyLimit})}catch(err){defaultRuntime.error(String(err)),defaultRuntime.exit(1)}})}export{registerTuiCli};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{B as theme,g as pathExists}from"./utils-DbaBVFaK.js";import"./embedded-helpers-2fP2Yq8h.js";import{cr as trimLogTail}from"./reply-D9wUWhMx.js";import"./session-key-EoB0qaG9.js";import{a as isCorePackageName,o as stripPackagePrefix,r as CORE_PACKAGE_NAME,t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import{t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-Doyvd4lU.js";import{n as replaceCliName,r as resolveCliName,t as formatCliCommand}from"./command-format-D806O2pt.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-BifagO7i.js";import{a as readConfigFileSnapshot,c as writeConfigFile}from"./io-BNtgT4VB.js";import"./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"./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{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName}from"./constants-BBbGeL3t.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{t as formatHelpExamples}from"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.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{n as stylePromptMessage}from"./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{r as parseSemver}from"./runtime-guard-DhksRHci.js";import"./program-context-DP4Xq9zC.js";import"./catalog-rgiY__UQ.js";import"./skills-status-vWC0PU8J.js";import{n as inheritOptionFromParent}from"./command-options-DzGFCQYs.js";import"./note-B6NtFdXt.js";import"./helpers-DTDCy17p.js";import"./plugin-auto-enable-zKMSAekH.js";import"./install-safe-path-DsLq2BUJ.js";import"./npm-registry-spec-DIW6RsGN.js";import"./skill-scanner-BUNvEK3Z.js";import"./installs-ZToTbCYE.js";import"./channels-status-issues-BlOu0Ul_.js";import{n as installCompletion}from"./completion-cli-BsXDz7T2.js";import"./daemon-runtime-0CbmdgMr.js";import"./systemd-BG3_QT6W.js";import{t as resolveGatewayService}from"./service-D-NLDyK3.js";import"./lifecycle-core-lZTP9Ary.js";import"./diagnostics-DCjg0nBH.js";import{o as runDaemonRestart}from"./daemon-cli-Dt1S7APn.js";import{t as renderTable}from"./table-BoCHYKoQ.js";import"./health-AlkF1nUa.js";import"./control-ui-assets-CWgH1Tda.js";import{_ as resolveUpdateChannelDisplay,c as DEFAULT_GIT_CHANNEL,d as channelToNpmTag,f as formatUpdateChannelLabel,g as resolveEffectiveUpdateChannel,h as normalizeUpdateChannel,l as DEFAULT_PACKAGE_CHANNEL,n as compareSemverStrings,o as resolveNpmChannelTag,r as fetchNpmTagVersion,t as checkUpdateStatus}from"./update-check-D6MvqVFE.js";import"./dm-policy-shared-CLiz10xA.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,t as formatUpdateAvailableHint}from"./status.update-BAXc_gGe.js";import{a as detectGlobalInstallManagerForRoot,c as readPackageName,i as detectGlobalInstallManagerByPresence,l as readPackageVersion,n as runGatewayUpdate,o as globalInstallArgs,r as cleanupGlobalRenameDirs,s as resolveGlobalPackageRoot}from"./session-dirs-C-pVBwSV.js";import"./logging-DHa3jQN3.js";import{n as updateNpmInstalledPlugins,t as syncPluginsForUpdateChannel}from"./update-DYT58zGp.js";import"./systemd-linger-CT-VHPB3.js";import"./health-format-iE_KYEwP.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-Csz9HlSx.js";import{r as ensureCompletionCacheExists,t as checkShellCompletionStatus}from"./doctor-completion-BUZwWoWB.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";import{spawn,spawnSync}from"node:child_process";import{confirm,isCancel,spinner}from"@clack/prompts";function parseTimeoutMsOrExit(timeout){let timeoutMs=timeout?Number.parseInt(timeout,10)*1e3:void 0;return timeoutMs!==void 0&&(Number.isNaN(timeoutMs)||timeoutMs<=0)?(defaultRuntime.error(`--timeout must be a positive integer (seconds)`),defaultRuntime.exit(1),null):timeoutMs}const BUILDERFORCE_AGENTS_REPO_URL=`https://github.com/SeanHogg/Builderforce.ai.git`,MAX_LOG_CHARS=8e3,DEFAULT_PACKAGE_NAME=CORE_PACKAGE_NAME;function normalizeTag(value){if(!value)return null;let trimmed=value.trim();return trimmed?stripPackagePrefix(trimmed):null}function normalizeVersionTag(tag){let trimmed=tag.trim();if(!trimmed)return null;let cleaned=trimmed.startsWith(`v`)?trimmed.slice(1):trimmed;return parseSemver(cleaned)?cleaned:null}async function resolveTargetVersion(tag,timeoutMs){return normalizeVersionTag(tag)||((await fetchNpmTagVersion({tag,timeoutMs})).version??null)}async function isGitCheckout(root){try{return await fs.stat(path.join(root,`.git`)),!0}catch{return!1}}async function isCorePackage(root){return isCorePackageName(await readPackageName(root))}async function isEmptyDir(targetPath){try{return(await fs.readdir(targetPath)).length===0}catch{return!1}}function resolveGitInstallDir(){let override=process.env.BUILDERFORCE_AGENTS_GIT_DIR?.trim();return override?path.resolve(override):resolveDefaultGitDir()}function resolveDefaultGitDir(){return resolveStateDir(process.env,os.homedir)}function resolveNodeRunner(){let base=path.basename(process.execPath).toLowerCase();return base===`node`||base===`node.exe`?process.execPath:`node`}async function resolveUpdateRoot(){return await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()})??process.cwd()}async function runUpdateStep(params){let command=params.argv.join(` `);params.progress?.onStepStart?.({name:params.name,command,index:0,total:0});let started=Date.now(),res=await runCommandWithTimeout(params.argv,{cwd:params.cwd,timeoutMs:params.timeoutMs}),durationMs=Date.now()-started,stderrTail=trimLogTail(res.stderr,MAX_LOG_CHARS);return params.progress?.onStepComplete?.({name:params.name,command,index:0,total:0,durationMs,exitCode:res.code,stderrTail}),{name:params.name,command,cwd:params.cwd??process.cwd(),durationMs,exitCode:res.code,stdoutTail:trimLogTail(res.stdout,MAX_LOG_CHARS),stderrTail}}async function ensureGitCheckout(params){if(!await pathExists(params.dir))return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],timeoutMs:params.timeoutMs,progress:params.progress});if(!await isGitCheckout(params.dir)){if(!await isEmptyDir(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR points at a non-git directory: ${params.dir}. Set BUILDERFORCE_AGENTS_GIT_DIR to an empty folder or a builderforce checkout.`);return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],cwd:params.dir,timeoutMs:params.timeoutMs,progress:params.progress})}if(!await isCorePackage(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR does not look like a core checkout: ${params.dir}.`);return null}async function resolveGlobalManager(params){let runCommand=async(argv,options)=>{let res=await runCommandWithTimeout(argv,options);return{stdout:res.stdout,stderr:res.stderr,code:res.code}};if(params.installKind===`package`){let detected=await detectGlobalInstallManagerForRoot(runCommand,params.root,params.timeoutMs);if(detected)return detected}return await detectGlobalInstallManagerByPresence(runCommand,params.timeoutMs)??`npm`}async function tryWriteCompletionCache(root,jsonMode){let binPath=path.join(root,`builderforce.mjs`);if(!await pathExists(binPath))return;let result=spawnSync(resolveNodeRunner(),[binPath,`completion`,`--write-state`],{cwd:root,env:process.env,encoding:`utf-8`});if(result.error){jsonMode||defaultRuntime.log(theme.warn(`Completion cache update failed: ${String(result.error)}`));return}if(result.status!==0&&!jsonMode){let stderr=(result.stderr??``).toString().trim(),detail=stderr?` (${stderr})`:``;defaultRuntime.log(theme.warn(`Completion cache update failed${detail}.`))}}function formatGitStatusLine(params){let shortSha=params.sha?params.sha.slice(0,8):null,branch=params.branch&¶ms.branch!==`HEAD`?params.branch:null,tag=params.tag;return[branch??(tag?`detached`:`git`),tag?`tag ${tag}`:null,shortSha?`@ ${shortSha}`:null].filter(Boolean).join(` · `)}async function updateStatusCommand(opts){let timeoutMs=parseTimeoutMsOrExit(opts.timeout);if(timeoutMs===null)return;let root=await resolveUpdateRoot(),configSnapshot=await readConfigFileSnapshot(),configChannel=configSnapshot.valid?normalizeUpdateChannel(configSnapshot.config.update?.channel):null,update=await checkUpdateStatus({root,timeoutMs:timeoutMs??3500,fetchGit:!0,includeRegistry:!0}),channelInfo=resolveUpdateChannelDisplay({configChannel,installKind:update.installKind,gitTag:update.git?.tag??null,gitBranch:update.git?.branch??null}),channelLabel=channelInfo.label,gitLabel=update.installKind===`git`?formatGitStatusLine({branch:update.git?.branch??null,tag:update.git?.tag??null,sha:update.git?.sha??null}):null,updateAvailability=resolveUpdateAvailability(update),updateLine=formatUpdateOneLiner(update).replace(/^Update:\s*/i,``);if(opts.json){defaultRuntime.log(JSON.stringify({update,channel:{value:channelInfo.channel,source:channelInfo.source,label:channelLabel,config:configChannel},availability:updateAvailability},null,2));return}let tableWidth=Math.max(60,(process.stdout.columns??120)-1),rows=[{Item:`Install`,Value:update.installKind===`git`?`git (${update.root??`unknown`})`:update.installKind===`package`?update.packageManager:`unknown`},{Item:`Channel`,Value:channelLabel},...gitLabel?[{Item:`Git`,Value:gitLabel}]:[],{Item:`Update`,Value:updateAvailability.available?theme.warn(`available · ${updateLine}`):updateLine}];defaultRuntime.log(theme.heading(`BuilderForceAgents update status`)),defaultRuntime.log(``),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Item`,header:`Item`,minWidth:10},{key:`Value`,header:`Value`,flex:!0,minWidth:24}],rows}).trimEnd()),defaultRuntime.log(``);let updateHint=formatUpdateAvailableHint(update);updateHint&&defaultRuntime.log(theme.warn(updateHint))}const STEP_LABELS={"clean check":`Working directory is clean`,"upstream check":`Upstream branch exists`,"git fetch":`Fetching latest changes`,"git rebase":`Rebasing onto target commit`,"git rev-parse @{upstream}":`Resolving upstream commit`,"git rev-list":`Enumerating candidate commits`,"git clone":`Cloning git checkout`,"preflight worktree":`Preparing preflight worktree`,"preflight cleanup":`Cleaning preflight worktree`,"deps install":`Installing dependencies`,build:`Building`,"ui:build":`Building UI assets`,"ui:build (post-doctor repair)":`Restoring missing UI assets`,"ui assets verify":`Validating UI assets`,"builderforce doctor entry":`Checking doctor entrypoint`,"builderforce doctor":`Running doctor checks`,"git rev-parse HEAD (after)":`Verifying update`,"global update":`Updating via package manager`,"global install":`Installing global package`};function getStepLabel(step){return STEP_LABELS[step.name]??step.name}function createUpdateProgress(enabled){if(!enabled)return{progress:{},stop:()=>{}};let currentSpinner=null;return{progress:{onStepStart:step=>{currentSpinner=spinner(),currentSpinner.start(theme.accent(getStepLabel(step)))},onStepComplete:step=>{if(!currentSpinner)return;let label=getStepLabel(step),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`),icon=step.exitCode===0?theme.success(`✓`):theme.error(`✗`);if(currentSpinner.stop(`${icon} ${label} ${duration}`),currentSpinner=null,step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
1
|
+
import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{B as theme,g as pathExists}from"./utils-DbaBVFaK.js";import"./embedded-helpers-2fP2Yq8h.js";import{cr as trimLogTail}from"./reply-BuUSdq2L.js";import"./session-key-EoB0qaG9.js";import{a as isCorePackageName,o as stripPackagePrefix,r as CORE_PACKAGE_NAME,t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import{t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-Doyvd4lU.js";import{n as replaceCliName,r as resolveCliName,t as formatCliCommand}from"./command-format-D806O2pt.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-BifagO7i.js";import{a as readConfigFileSnapshot,c as writeConfigFile}from"./io-BNtgT4VB.js";import"./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"./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{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName}from"./constants-BBbGeL3t.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{t as formatHelpExamples}from"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.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{n as stylePromptMessage}from"./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{r as parseSemver}from"./runtime-guard-DhksRHci.js";import"./program-context-BCTE8zEF.js";import"./catalog-rgiY__UQ.js";import"./skills-status-vWC0PU8J.js";import{n as inheritOptionFromParent}from"./command-options-DzGFCQYs.js";import"./note-B6NtFdXt.js";import"./helpers-DTDCy17p.js";import"./plugin-auto-enable-zKMSAekH.js";import"./install-safe-path-DsLq2BUJ.js";import"./npm-registry-spec-DIW6RsGN.js";import"./skill-scanner-BUNvEK3Z.js";import"./installs-ZToTbCYE.js";import"./channels-status-issues-BlOu0Ul_.js";import{n as installCompletion}from"./completion-cli-Da3-oE7r.js";import"./daemon-runtime-0CbmdgMr.js";import"./systemd-BG3_QT6W.js";import{t as resolveGatewayService}from"./service-D-NLDyK3.js";import"./lifecycle-core-lZTP9Ary.js";import"./diagnostics-DCjg0nBH.js";import{o as runDaemonRestart}from"./daemon-cli-Dt1S7APn.js";import{t as renderTable}from"./table-BoCHYKoQ.js";import"./health-CFVx21sO.js";import"./control-ui-assets-CWgH1Tda.js";import{_ as resolveUpdateChannelDisplay,c as DEFAULT_GIT_CHANNEL,d as channelToNpmTag,f as formatUpdateChannelLabel,g as resolveEffectiveUpdateChannel,h as normalizeUpdateChannel,l as DEFAULT_PACKAGE_CHANNEL,n as compareSemverStrings,o as resolveNpmChannelTag,r as fetchNpmTagVersion,t as checkUpdateStatus}from"./update-check-D6MvqVFE.js";import"./dm-policy-shared-CLiz10xA.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,t as formatUpdateAvailableHint}from"./status.update-BAXc_gGe.js";import{a as detectGlobalInstallManagerForRoot,c as readPackageName,i as detectGlobalInstallManagerByPresence,l as readPackageVersion,n as runGatewayUpdate,o as globalInstallArgs,r as cleanupGlobalRenameDirs,s as resolveGlobalPackageRoot}from"./session-dirs-rYDCA_mQ.js";import"./logging-DHa3jQN3.js";import{n as updateNpmInstalledPlugins,t as syncPluginsForUpdateChannel}from"./update-DYT58zGp.js";import"./systemd-linger-CT-VHPB3.js";import"./health-format-iE_KYEwP.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-CaNl41mG.js";import{r as ensureCompletionCacheExists,t as checkShellCompletionStatus}from"./doctor-completion-Dh9ah5lH.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";import{spawn,spawnSync}from"node:child_process";import{confirm,isCancel,spinner}from"@clack/prompts";function parseTimeoutMsOrExit(timeout){let timeoutMs=timeout?Number.parseInt(timeout,10)*1e3:void 0;return timeoutMs!==void 0&&(Number.isNaN(timeoutMs)||timeoutMs<=0)?(defaultRuntime.error(`--timeout must be a positive integer (seconds)`),defaultRuntime.exit(1),null):timeoutMs}const BUILDERFORCE_AGENTS_REPO_URL=`https://github.com/SeanHogg/Builderforce.ai.git`,MAX_LOG_CHARS=8e3,DEFAULT_PACKAGE_NAME=CORE_PACKAGE_NAME;function normalizeTag(value){if(!value)return null;let trimmed=value.trim();return trimmed?stripPackagePrefix(trimmed):null}function normalizeVersionTag(tag){let trimmed=tag.trim();if(!trimmed)return null;let cleaned=trimmed.startsWith(`v`)?trimmed.slice(1):trimmed;return parseSemver(cleaned)?cleaned:null}async function resolveTargetVersion(tag,timeoutMs){return normalizeVersionTag(tag)||((await fetchNpmTagVersion({tag,timeoutMs})).version??null)}async function isGitCheckout(root){try{return await fs.stat(path.join(root,`.git`)),!0}catch{return!1}}async function isCorePackage(root){return isCorePackageName(await readPackageName(root))}async function isEmptyDir(targetPath){try{return(await fs.readdir(targetPath)).length===0}catch{return!1}}function resolveGitInstallDir(){let override=process.env.BUILDERFORCE_AGENTS_GIT_DIR?.trim();return override?path.resolve(override):resolveDefaultGitDir()}function resolveDefaultGitDir(){return resolveStateDir(process.env,os.homedir)}function resolveNodeRunner(){let base=path.basename(process.execPath).toLowerCase();return base===`node`||base===`node.exe`?process.execPath:`node`}async function resolveUpdateRoot(){return await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()})??process.cwd()}async function runUpdateStep(params){let command=params.argv.join(` `);params.progress?.onStepStart?.({name:params.name,command,index:0,total:0});let started=Date.now(),res=await runCommandWithTimeout(params.argv,{cwd:params.cwd,timeoutMs:params.timeoutMs}),durationMs=Date.now()-started,stderrTail=trimLogTail(res.stderr,MAX_LOG_CHARS);return params.progress?.onStepComplete?.({name:params.name,command,index:0,total:0,durationMs,exitCode:res.code,stderrTail}),{name:params.name,command,cwd:params.cwd??process.cwd(),durationMs,exitCode:res.code,stdoutTail:trimLogTail(res.stdout,MAX_LOG_CHARS),stderrTail}}async function ensureGitCheckout(params){if(!await pathExists(params.dir))return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],timeoutMs:params.timeoutMs,progress:params.progress});if(!await isGitCheckout(params.dir)){if(!await isEmptyDir(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR points at a non-git directory: ${params.dir}. Set BUILDERFORCE_AGENTS_GIT_DIR to an empty folder or a builderforce checkout.`);return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],cwd:params.dir,timeoutMs:params.timeoutMs,progress:params.progress})}if(!await isCorePackage(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR does not look like a core checkout: ${params.dir}.`);return null}async function resolveGlobalManager(params){let runCommand=async(argv,options)=>{let res=await runCommandWithTimeout(argv,options);return{stdout:res.stdout,stderr:res.stderr,code:res.code}};if(params.installKind===`package`){let detected=await detectGlobalInstallManagerForRoot(runCommand,params.root,params.timeoutMs);if(detected)return detected}return await detectGlobalInstallManagerByPresence(runCommand,params.timeoutMs)??`npm`}async function tryWriteCompletionCache(root,jsonMode){let binPath=path.join(root,`builderforce.mjs`);if(!await pathExists(binPath))return;let result=spawnSync(resolveNodeRunner(),[binPath,`completion`,`--write-state`],{cwd:root,env:process.env,encoding:`utf-8`});if(result.error){jsonMode||defaultRuntime.log(theme.warn(`Completion cache update failed: ${String(result.error)}`));return}if(result.status!==0&&!jsonMode){let stderr=(result.stderr??``).toString().trim(),detail=stderr?` (${stderr})`:``;defaultRuntime.log(theme.warn(`Completion cache update failed${detail}.`))}}function formatGitStatusLine(params){let shortSha=params.sha?params.sha.slice(0,8):null,branch=params.branch&¶ms.branch!==`HEAD`?params.branch:null,tag=params.tag;return[branch??(tag?`detached`:`git`),tag?`tag ${tag}`:null,shortSha?`@ ${shortSha}`:null].filter(Boolean).join(` · `)}async function updateStatusCommand(opts){let timeoutMs=parseTimeoutMsOrExit(opts.timeout);if(timeoutMs===null)return;let root=await resolveUpdateRoot(),configSnapshot=await readConfigFileSnapshot(),configChannel=configSnapshot.valid?normalizeUpdateChannel(configSnapshot.config.update?.channel):null,update=await checkUpdateStatus({root,timeoutMs:timeoutMs??3500,fetchGit:!0,includeRegistry:!0}),channelInfo=resolveUpdateChannelDisplay({configChannel,installKind:update.installKind,gitTag:update.git?.tag??null,gitBranch:update.git?.branch??null}),channelLabel=channelInfo.label,gitLabel=update.installKind===`git`?formatGitStatusLine({branch:update.git?.branch??null,tag:update.git?.tag??null,sha:update.git?.sha??null}):null,updateAvailability=resolveUpdateAvailability(update),updateLine=formatUpdateOneLiner(update).replace(/^Update:\s*/i,``);if(opts.json){defaultRuntime.log(JSON.stringify({update,channel:{value:channelInfo.channel,source:channelInfo.source,label:channelLabel,config:configChannel},availability:updateAvailability},null,2));return}let tableWidth=Math.max(60,(process.stdout.columns??120)-1),rows=[{Item:`Install`,Value:update.installKind===`git`?`git (${update.root??`unknown`})`:update.installKind===`package`?update.packageManager:`unknown`},{Item:`Channel`,Value:channelLabel},...gitLabel?[{Item:`Git`,Value:gitLabel}]:[],{Item:`Update`,Value:updateAvailability.available?theme.warn(`available · ${updateLine}`):updateLine}];defaultRuntime.log(theme.heading(`BuilderForceAgents update status`)),defaultRuntime.log(``),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Item`,header:`Item`,minWidth:10},{key:`Value`,header:`Value`,flex:!0,minWidth:24}],rows}).trimEnd()),defaultRuntime.log(``);let updateHint=formatUpdateAvailableHint(update);updateHint&&defaultRuntime.log(theme.warn(updateHint))}const STEP_LABELS={"clean check":`Working directory is clean`,"upstream check":`Upstream branch exists`,"git fetch":`Fetching latest changes`,"git rebase":`Rebasing onto target commit`,"git rev-parse @{upstream}":`Resolving upstream commit`,"git rev-list":`Enumerating candidate commits`,"git clone":`Cloning git checkout`,"preflight worktree":`Preparing preflight worktree`,"preflight cleanup":`Cleaning preflight worktree`,"deps install":`Installing dependencies`,build:`Building`,"ui:build":`Building UI assets`,"ui:build (post-doctor repair)":`Restoring missing UI assets`,"ui assets verify":`Validating UI assets`,"builderforce doctor entry":`Checking doctor entrypoint`,"builderforce doctor":`Running doctor checks`,"git rev-parse HEAD (after)":`Verifying update`,"global update":`Updating via package manager`,"global install":`Installing global package`};function getStepLabel(step){return STEP_LABELS[step.name]??step.name}function createUpdateProgress(enabled){if(!enabled)return{progress:{},stop:()=>{}};let currentSpinner=null;return{progress:{onStepStart:step=>{currentSpinner=spinner(),currentSpinner.start(theme.accent(getStepLabel(step)))},onStepComplete:step=>{if(!currentSpinner)return;let label=getStepLabel(step),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`),icon=step.exitCode===0?theme.success(`✓`):theme.error(`✗`);if(currentSpinner.stop(`${icon} ${label} ${duration}`),currentSpinner=null,step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
2
2
|
`).slice(-10);for(let line of lines)line.trim()&&defaultRuntime.log(` ${theme.error(line)}`)}}},stop:()=>{currentSpinner&&=(currentSpinner.stop(),null)}}}function formatStepStatus(exitCode){return exitCode===0?theme.success(`✓`):exitCode===null?theme.warn(`?`):theme.error(`✗`)}function printResult(result,opts){if(opts.json){defaultRuntime.log(JSON.stringify(result,null,2));return}let statusColor=result.status===`ok`?theme.success:result.status===`skipped`?theme.warn:theme.error;if(defaultRuntime.log(``),defaultRuntime.log(`${theme.heading(`Update Result:`)} ${statusColor(result.status.toUpperCase())}`),result.root&&defaultRuntime.log(` Root: ${theme.muted(result.root)}`),result.reason&&defaultRuntime.log(` Reason: ${theme.muted(result.reason)}`),result.before?.version||result.before?.sha){let before=result.before.version??result.before.sha?.slice(0,8)??``;defaultRuntime.log(` Before: ${theme.muted(before)}`)}if(result.after?.version||result.after?.sha){let after=result.after.version??result.after.sha?.slice(0,8)??``;defaultRuntime.log(` After: ${theme.muted(after)}`)}if(!opts.hideSteps&&result.steps.length>0){defaultRuntime.log(``),defaultRuntime.log(theme.heading(`Steps:`));for(let step of result.steps){let status=formatStepStatus(step.exitCode),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`);if(defaultRuntime.log(` ${status} ${step.name} ${duration}`),step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
3
3
|
`).slice(0,5);for(let line of lines)line.trim()&&defaultRuntime.log(` ${theme.error(line)}`)}}}defaultRuntime.log(``),defaultRuntime.log(`Total time: ${theme.muted(formatDurationPrecise(result.durationMs))}`)}function shellEscape(value){return value.replace(/'/g,`'\\''`)}function isBatchSafe(value){return/^[A-Za-z0-9 _\-().]+$/.test(value)}function resolveSystemdUnit(env){let override=env.BUILDERFORCE_AGENTS_SYSTEMD_UNIT?.trim();return override?override.endsWith(`.service`)?override:`${override}.service`:`${resolveGatewaySystemdServiceName(env.BUILDERFORCE_AGENTS_PROFILE)}.service`}function resolveLaunchdLabel(env){return env.BUILDERFORCE_AGENTS_LAUNCHD_LABEL?.trim()||resolveGatewayLaunchAgentLabel(env.BUILDERFORCE_AGENTS_PROFILE)}function resolveWindowsTaskName(env){return env.BUILDERFORCE_AGENTS_WINDOWS_TASK_NAME?.trim()||resolveGatewayWindowsTaskName(env.BUILDERFORCE_AGENTS_PROFILE)}async function prepareRestartScript(env=process.env){let tmpDir=os.tmpdir(),timestamp=Date.now(),platform=process.platform,scriptContent=``,filename=``;try{if(platform===`linux`){let escaped=shellEscape(resolveSystemdUnit(env));filename=`builderforce-restart-${timestamp}.sh`,scriptContent=`#!/bin/sh
|
|
4
4
|
# Standalone restart script — survives parent process termination.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{h as pathExists,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{n as replaceCliName,r as resolveCliName,t as formatCliCommand}from"./command-format-DTMaGKs7.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import{a as isCorePackageName,o as stripPackagePrefix,r as CORE_PACKAGE_NAME,t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-C8c9naq-.js";import{a as readConfigFileSnapshot,c as writeConfigFile}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"./skills-status-CGlKz1D1.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-O-iC_P5t.js";import"./message-channel-z5YRpR2d.js";import{xr as trimLogTail}from"./subagent-registry-Cj5yC7B4.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{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName}from"./constants-D2th5NXV.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{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.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{t as formatHelpExamples}from"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DATdLu15.js";import"./onboard-helpers-D2vxAtv8.js";import{n as stylePromptMessage}from"./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{n as inheritOptionFromParent}from"./command-options-DbMbMxM2.js";import"./catalog-li4bSIE2.js";import"./note-DgDXuE0F.js";import"./helpers-DPPVplyk.js";import"./plugin-auto-enable-DT7HMdAA.js";import"./install-safe-path-ObPl6zIf.js";import"./npm-registry-spec-BV1VDmuN.js";import"./skill-scanner-C2gXLVti.js";import"./installs-C7X7CT9a.js";import"./channels-status-issues-NLYb8w9i.js";import"./register.subclis-D_fHb-Aj.js";import"./command-registry-Cjom5ab0.js";import"./program-context-Wpc-6CdI.js";import{n as installCompletion}from"./completion-cli-PTFpWp8Q.js";import"./daemon-runtime-CnNjpvfd.js";import{r as parseSemver}from"./runtime-guard-Bi8k55v9.js";import"./systemd-DdVd5Yet.js";import{t as resolveGatewayService}from"./service-EKJG69M3.js";import"./lifecycle-core-BsJbjf7b.js";import"./diagnostics-DamNPi4e.js";import{o as runDaemonRestart}from"./daemon-cli-BHsiBvv7.js";import{t as renderTable}from"./table-BFCCZDsp.js";import"./health-Cf1YoTRN.js";import"./control-ui-assets-BxgWcomx.js";import{_ as resolveUpdateChannelDisplay,c as DEFAULT_GIT_CHANNEL,d as channelToNpmTag,f as formatUpdateChannelLabel,g as resolveEffectiveUpdateChannel,h as normalizeUpdateChannel,l as DEFAULT_PACKAGE_CHANNEL,n as compareSemverStrings,o as resolveNpmChannelTag,r as fetchNpmTagVersion,t as checkUpdateStatus}from"./update-check-B0YqSZJr.js";import"./dm-policy-shared-DT6DrqEe.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,t as formatUpdateAvailableHint}from"./status.update-DpTbmpkA.js";import{a as detectGlobalInstallManagerForRoot,c as readPackageName,i as detectGlobalInstallManagerByPresence,l as readPackageVersion,n as runGatewayUpdate,o as globalInstallArgs,r as cleanupGlobalRenameDirs,s as resolveGlobalPackageRoot}from"./session-dirs-eNN7E3kA.js";import"./logging-ayt7F7vy.js";import{n as updateNpmInstalledPlugins,t as syncPluginsForUpdateChannel}from"./update-CWxR2_Pa.js";import"./systemd-linger-CPKngdUf.js";import"./health-format-D4MaIjaG.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-NxrGT7OR.js";import{r as ensureCompletionCacheExists,t as checkShellCompletionStatus}from"./doctor-completion-ChhIrLd3.js";import{spawn,spawnSync}from"node:child_process";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";import{confirm,isCancel,spinner}from"@clack/prompts";function parseTimeoutMsOrExit(timeout){let timeoutMs=timeout?Number.parseInt(timeout,10)*1e3:void 0;return timeoutMs!==void 0&&(Number.isNaN(timeoutMs)||timeoutMs<=0)?(defaultRuntime.error(`--timeout must be a positive integer (seconds)`),defaultRuntime.exit(1),null):timeoutMs}const BUILDERFORCE_AGENTS_REPO_URL=`https://github.com/SeanHogg/Builderforce.ai.git`,MAX_LOG_CHARS=8e3,DEFAULT_PACKAGE_NAME=CORE_PACKAGE_NAME;function normalizeTag(value){if(!value)return null;let trimmed=value.trim();return trimmed?stripPackagePrefix(trimmed):null}function normalizeVersionTag(tag){let trimmed=tag.trim();if(!trimmed)return null;let cleaned=trimmed.startsWith(`v`)?trimmed.slice(1):trimmed;return parseSemver(cleaned)?cleaned:null}async function resolveTargetVersion(tag,timeoutMs){return normalizeVersionTag(tag)||((await fetchNpmTagVersion({tag,timeoutMs})).version??null)}async function isGitCheckout(root){try{return await fs.stat(path.join(root,`.git`)),!0}catch{return!1}}async function isCorePackage(root){return isCorePackageName(await readPackageName(root))}async function isEmptyDir(targetPath){try{return(await fs.readdir(targetPath)).length===0}catch{return!1}}function resolveGitInstallDir(){let override=process.env.BUILDERFORCE_AGENTS_GIT_DIR?.trim();return override?path.resolve(override):resolveDefaultGitDir()}function resolveDefaultGitDir(){return resolveStateDir(process.env,os.homedir)}function resolveNodeRunner(){let base=path.basename(process.execPath).toLowerCase();return base===`node`||base===`node.exe`?process.execPath:`node`}async function resolveUpdateRoot(){return await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()})??process.cwd()}async function runUpdateStep(params){let command=params.argv.join(` `);params.progress?.onStepStart?.({name:params.name,command,index:0,total:0});let started=Date.now(),res=await runCommandWithTimeout(params.argv,{cwd:params.cwd,timeoutMs:params.timeoutMs}),durationMs=Date.now()-started,stderrTail=trimLogTail(res.stderr,MAX_LOG_CHARS);return params.progress?.onStepComplete?.({name:params.name,command,index:0,total:0,durationMs,exitCode:res.code,stderrTail}),{name:params.name,command,cwd:params.cwd??process.cwd(),durationMs,exitCode:res.code,stdoutTail:trimLogTail(res.stdout,MAX_LOG_CHARS),stderrTail}}async function ensureGitCheckout(params){if(!await pathExists(params.dir))return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],timeoutMs:params.timeoutMs,progress:params.progress});if(!await isGitCheckout(params.dir)){if(!await isEmptyDir(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR points at a non-git directory: ${params.dir}. Set BUILDERFORCE_AGENTS_GIT_DIR to an empty folder or a builderforce checkout.`);return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],cwd:params.dir,timeoutMs:params.timeoutMs,progress:params.progress})}if(!await isCorePackage(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR does not look like a core checkout: ${params.dir}.`);return null}async function resolveGlobalManager(params){let runCommand=async(argv,options)=>{let res=await runCommandWithTimeout(argv,options);return{stdout:res.stdout,stderr:res.stderr,code:res.code}};if(params.installKind===`package`){let detected=await detectGlobalInstallManagerForRoot(runCommand,params.root,params.timeoutMs);if(detected)return detected}return await detectGlobalInstallManagerByPresence(runCommand,params.timeoutMs)??`npm`}async function tryWriteCompletionCache(root,jsonMode){let binPath=path.join(root,`builderforce.mjs`);if(!await pathExists(binPath))return;let result=spawnSync(resolveNodeRunner(),[binPath,`completion`,`--write-state`],{cwd:root,env:process.env,encoding:`utf-8`});if(result.error){jsonMode||defaultRuntime.log(theme.warn(`Completion cache update failed: ${String(result.error)}`));return}if(result.status!==0&&!jsonMode){let stderr=(result.stderr??``).toString().trim(),detail=stderr?` (${stderr})`:``;defaultRuntime.log(theme.warn(`Completion cache update failed${detail}.`))}}function formatGitStatusLine(params){let shortSha=params.sha?params.sha.slice(0,8):null,branch=params.branch&¶ms.branch!==`HEAD`?params.branch:null,tag=params.tag;return[branch??(tag?`detached`:`git`),tag?`tag ${tag}`:null,shortSha?`@ ${shortSha}`:null].filter(Boolean).join(` · `)}async function updateStatusCommand(opts){let timeoutMs=parseTimeoutMsOrExit(opts.timeout);if(timeoutMs===null)return;let root=await resolveUpdateRoot(),configSnapshot=await readConfigFileSnapshot(),configChannel=configSnapshot.valid?normalizeUpdateChannel(configSnapshot.config.update?.channel):null,update=await checkUpdateStatus({root,timeoutMs:timeoutMs??3500,fetchGit:!0,includeRegistry:!0}),channelInfo=resolveUpdateChannelDisplay({configChannel,installKind:update.installKind,gitTag:update.git?.tag??null,gitBranch:update.git?.branch??null}),channelLabel=channelInfo.label,gitLabel=update.installKind===`git`?formatGitStatusLine({branch:update.git?.branch??null,tag:update.git?.tag??null,sha:update.git?.sha??null}):null,updateAvailability=resolveUpdateAvailability(update),updateLine=formatUpdateOneLiner(update).replace(/^Update:\s*/i,``);if(opts.json){defaultRuntime.log(JSON.stringify({update,channel:{value:channelInfo.channel,source:channelInfo.source,label:channelLabel,config:configChannel},availability:updateAvailability},null,2));return}let tableWidth=Math.max(60,(process.stdout.columns??120)-1),rows=[{Item:`Install`,Value:update.installKind===`git`?`git (${update.root??`unknown`})`:update.installKind===`package`?update.packageManager:`unknown`},{Item:`Channel`,Value:channelLabel},...gitLabel?[{Item:`Git`,Value:gitLabel}]:[],{Item:`Update`,Value:updateAvailability.available?theme.warn(`available · ${updateLine}`):updateLine}];defaultRuntime.log(theme.heading(`BuilderForceAgents update status`)),defaultRuntime.log(``),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Item`,header:`Item`,minWidth:10},{key:`Value`,header:`Value`,flex:!0,minWidth:24}],rows}).trimEnd()),defaultRuntime.log(``);let updateHint=formatUpdateAvailableHint(update);updateHint&&defaultRuntime.log(theme.warn(updateHint))}const STEP_LABELS={"clean check":`Working directory is clean`,"upstream check":`Upstream branch exists`,"git fetch":`Fetching latest changes`,"git rebase":`Rebasing onto target commit`,"git rev-parse @{upstream}":`Resolving upstream commit`,"git rev-list":`Enumerating candidate commits`,"git clone":`Cloning git checkout`,"preflight worktree":`Preparing preflight worktree`,"preflight cleanup":`Cleaning preflight worktree`,"deps install":`Installing dependencies`,build:`Building`,"ui:build":`Building UI assets`,"ui:build (post-doctor repair)":`Restoring missing UI assets`,"ui assets verify":`Validating UI assets`,"builderforce doctor entry":`Checking doctor entrypoint`,"builderforce doctor":`Running doctor checks`,"git rev-parse HEAD (after)":`Verifying update`,"global update":`Updating via package manager`,"global install":`Installing global package`};function getStepLabel(step){return STEP_LABELS[step.name]??step.name}function createUpdateProgress(enabled){if(!enabled)return{progress:{},stop:()=>{}};let currentSpinner=null;return{progress:{onStepStart:step=>{currentSpinner=spinner(),currentSpinner.start(theme.accent(getStepLabel(step)))},onStepComplete:step=>{if(!currentSpinner)return;let label=getStepLabel(step),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`),icon=step.exitCode===0?theme.success(`✓`):theme.error(`✗`);if(currentSpinner.stop(`${icon} ${label} ${duration}`),currentSpinner=null,step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
1
|
+
import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{h as pathExists,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{n as replaceCliName,r as resolveCliName,t as formatCliCommand}from"./command-format-DTMaGKs7.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import{a as isCorePackageName,o as stripPackagePrefix,r as CORE_PACKAGE_NAME,t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-C8c9naq-.js";import{a as readConfigFileSnapshot,c as writeConfigFile}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"./skills-status-CGlKz1D1.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-O-iC_P5t.js";import"./message-channel-z5YRpR2d.js";import{xr as trimLogTail}from"./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{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName}from"./constants-D2th5NXV.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{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.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{t as formatHelpExamples}from"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DATdLu15.js";import"./onboard-helpers-D2vxAtv8.js";import{n as stylePromptMessage}from"./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{n as inheritOptionFromParent}from"./command-options-DbMbMxM2.js";import"./catalog-li4bSIE2.js";import"./note-DgDXuE0F.js";import"./helpers-DPPVplyk.js";import"./plugin-auto-enable-DT7HMdAA.js";import"./install-safe-path-ObPl6zIf.js";import"./npm-registry-spec-BV1VDmuN.js";import"./skill-scanner-C2gXLVti.js";import"./installs-C7X7CT9a.js";import"./channels-status-issues-NLYb8w9i.js";import"./register.subclis-AFsfDByV.js";import"./command-registry-BqhtXJa7.js";import"./program-context-Wpc-6CdI.js";import{n as installCompletion}from"./completion-cli-BFR0u1Uh.js";import"./daemon-runtime-CnNjpvfd.js";import{r as parseSemver}from"./runtime-guard-Bi8k55v9.js";import"./systemd-DdVd5Yet.js";import{t as resolveGatewayService}from"./service-EKJG69M3.js";import"./lifecycle-core-BsJbjf7b.js";import"./diagnostics-DamNPi4e.js";import{o as runDaemonRestart}from"./daemon-cli-BHsiBvv7.js";import{t as renderTable}from"./table-BFCCZDsp.js";import"./health-CEz2-7et.js";import"./control-ui-assets-BxgWcomx.js";import{_ as resolveUpdateChannelDisplay,c as DEFAULT_GIT_CHANNEL,d as channelToNpmTag,f as formatUpdateChannelLabel,g as resolveEffectiveUpdateChannel,h as normalizeUpdateChannel,l as DEFAULT_PACKAGE_CHANNEL,n as compareSemverStrings,o as resolveNpmChannelTag,r as fetchNpmTagVersion,t as checkUpdateStatus}from"./update-check-B0YqSZJr.js";import"./dm-policy-shared-DT6DrqEe.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,t as formatUpdateAvailableHint}from"./status.update-DpTbmpkA.js";import{a as detectGlobalInstallManagerForRoot,c as readPackageName,i as detectGlobalInstallManagerByPresence,l as readPackageVersion,n as runGatewayUpdate,o as globalInstallArgs,r as cleanupGlobalRenameDirs,s as resolveGlobalPackageRoot}from"./session-dirs-Bkfs-7vN.js";import"./logging-ayt7F7vy.js";import{n as updateNpmInstalledPlugins,t as syncPluginsForUpdateChannel}from"./update-CWxR2_Pa.js";import"./systemd-linger-CPKngdUf.js";import"./health-format-D4MaIjaG.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-BtjhlTEH.js";import{r as ensureCompletionCacheExists,t as checkShellCompletionStatus}from"./doctor-completion-CkjrUmbI.js";import{spawn,spawnSync}from"node:child_process";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";import{confirm,isCancel,spinner}from"@clack/prompts";function parseTimeoutMsOrExit(timeout){let timeoutMs=timeout?Number.parseInt(timeout,10)*1e3:void 0;return timeoutMs!==void 0&&(Number.isNaN(timeoutMs)||timeoutMs<=0)?(defaultRuntime.error(`--timeout must be a positive integer (seconds)`),defaultRuntime.exit(1),null):timeoutMs}const BUILDERFORCE_AGENTS_REPO_URL=`https://github.com/SeanHogg/Builderforce.ai.git`,MAX_LOG_CHARS=8e3,DEFAULT_PACKAGE_NAME=CORE_PACKAGE_NAME;function normalizeTag(value){if(!value)return null;let trimmed=value.trim();return trimmed?stripPackagePrefix(trimmed):null}function normalizeVersionTag(tag){let trimmed=tag.trim();if(!trimmed)return null;let cleaned=trimmed.startsWith(`v`)?trimmed.slice(1):trimmed;return parseSemver(cleaned)?cleaned:null}async function resolveTargetVersion(tag,timeoutMs){return normalizeVersionTag(tag)||((await fetchNpmTagVersion({tag,timeoutMs})).version??null)}async function isGitCheckout(root){try{return await fs.stat(path.join(root,`.git`)),!0}catch{return!1}}async function isCorePackage(root){return isCorePackageName(await readPackageName(root))}async function isEmptyDir(targetPath){try{return(await fs.readdir(targetPath)).length===0}catch{return!1}}function resolveGitInstallDir(){let override=process.env.BUILDERFORCE_AGENTS_GIT_DIR?.trim();return override?path.resolve(override):resolveDefaultGitDir()}function resolveDefaultGitDir(){return resolveStateDir(process.env,os.homedir)}function resolveNodeRunner(){let base=path.basename(process.execPath).toLowerCase();return base===`node`||base===`node.exe`?process.execPath:`node`}async function resolveUpdateRoot(){return await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()})??process.cwd()}async function runUpdateStep(params){let command=params.argv.join(` `);params.progress?.onStepStart?.({name:params.name,command,index:0,total:0});let started=Date.now(),res=await runCommandWithTimeout(params.argv,{cwd:params.cwd,timeoutMs:params.timeoutMs}),durationMs=Date.now()-started,stderrTail=trimLogTail(res.stderr,MAX_LOG_CHARS);return params.progress?.onStepComplete?.({name:params.name,command,index:0,total:0,durationMs,exitCode:res.code,stderrTail}),{name:params.name,command,cwd:params.cwd??process.cwd(),durationMs,exitCode:res.code,stdoutTail:trimLogTail(res.stdout,MAX_LOG_CHARS),stderrTail}}async function ensureGitCheckout(params){if(!await pathExists(params.dir))return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],timeoutMs:params.timeoutMs,progress:params.progress});if(!await isGitCheckout(params.dir)){if(!await isEmptyDir(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR points at a non-git directory: ${params.dir}. Set BUILDERFORCE_AGENTS_GIT_DIR to an empty folder or a builderforce checkout.`);return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],cwd:params.dir,timeoutMs:params.timeoutMs,progress:params.progress})}if(!await isCorePackage(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR does not look like a core checkout: ${params.dir}.`);return null}async function resolveGlobalManager(params){let runCommand=async(argv,options)=>{let res=await runCommandWithTimeout(argv,options);return{stdout:res.stdout,stderr:res.stderr,code:res.code}};if(params.installKind===`package`){let detected=await detectGlobalInstallManagerForRoot(runCommand,params.root,params.timeoutMs);if(detected)return detected}return await detectGlobalInstallManagerByPresence(runCommand,params.timeoutMs)??`npm`}async function tryWriteCompletionCache(root,jsonMode){let binPath=path.join(root,`builderforce.mjs`);if(!await pathExists(binPath))return;let result=spawnSync(resolveNodeRunner(),[binPath,`completion`,`--write-state`],{cwd:root,env:process.env,encoding:`utf-8`});if(result.error){jsonMode||defaultRuntime.log(theme.warn(`Completion cache update failed: ${String(result.error)}`));return}if(result.status!==0&&!jsonMode){let stderr=(result.stderr??``).toString().trim(),detail=stderr?` (${stderr})`:``;defaultRuntime.log(theme.warn(`Completion cache update failed${detail}.`))}}function formatGitStatusLine(params){let shortSha=params.sha?params.sha.slice(0,8):null,branch=params.branch&¶ms.branch!==`HEAD`?params.branch:null,tag=params.tag;return[branch??(tag?`detached`:`git`),tag?`tag ${tag}`:null,shortSha?`@ ${shortSha}`:null].filter(Boolean).join(` · `)}async function updateStatusCommand(opts){let timeoutMs=parseTimeoutMsOrExit(opts.timeout);if(timeoutMs===null)return;let root=await resolveUpdateRoot(),configSnapshot=await readConfigFileSnapshot(),configChannel=configSnapshot.valid?normalizeUpdateChannel(configSnapshot.config.update?.channel):null,update=await checkUpdateStatus({root,timeoutMs:timeoutMs??3500,fetchGit:!0,includeRegistry:!0}),channelInfo=resolveUpdateChannelDisplay({configChannel,installKind:update.installKind,gitTag:update.git?.tag??null,gitBranch:update.git?.branch??null}),channelLabel=channelInfo.label,gitLabel=update.installKind===`git`?formatGitStatusLine({branch:update.git?.branch??null,tag:update.git?.tag??null,sha:update.git?.sha??null}):null,updateAvailability=resolveUpdateAvailability(update),updateLine=formatUpdateOneLiner(update).replace(/^Update:\s*/i,``);if(opts.json){defaultRuntime.log(JSON.stringify({update,channel:{value:channelInfo.channel,source:channelInfo.source,label:channelLabel,config:configChannel},availability:updateAvailability},null,2));return}let tableWidth=Math.max(60,(process.stdout.columns??120)-1),rows=[{Item:`Install`,Value:update.installKind===`git`?`git (${update.root??`unknown`})`:update.installKind===`package`?update.packageManager:`unknown`},{Item:`Channel`,Value:channelLabel},...gitLabel?[{Item:`Git`,Value:gitLabel}]:[],{Item:`Update`,Value:updateAvailability.available?theme.warn(`available · ${updateLine}`):updateLine}];defaultRuntime.log(theme.heading(`BuilderForceAgents update status`)),defaultRuntime.log(``),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Item`,header:`Item`,minWidth:10},{key:`Value`,header:`Value`,flex:!0,minWidth:24}],rows}).trimEnd()),defaultRuntime.log(``);let updateHint=formatUpdateAvailableHint(update);updateHint&&defaultRuntime.log(theme.warn(updateHint))}const STEP_LABELS={"clean check":`Working directory is clean`,"upstream check":`Upstream branch exists`,"git fetch":`Fetching latest changes`,"git rebase":`Rebasing onto target commit`,"git rev-parse @{upstream}":`Resolving upstream commit`,"git rev-list":`Enumerating candidate commits`,"git clone":`Cloning git checkout`,"preflight worktree":`Preparing preflight worktree`,"preflight cleanup":`Cleaning preflight worktree`,"deps install":`Installing dependencies`,build:`Building`,"ui:build":`Building UI assets`,"ui:build (post-doctor repair)":`Restoring missing UI assets`,"ui assets verify":`Validating UI assets`,"builderforce doctor entry":`Checking doctor entrypoint`,"builderforce doctor":`Running doctor checks`,"git rev-parse HEAD (after)":`Verifying update`,"global update":`Updating via package manager`,"global install":`Installing global package`};function getStepLabel(step){return STEP_LABELS[step.name]??step.name}function createUpdateProgress(enabled){if(!enabled)return{progress:{},stop:()=>{}};let currentSpinner=null;return{progress:{onStepStart:step=>{currentSpinner=spinner(),currentSpinner.start(theme.accent(getStepLabel(step)))},onStepComplete:step=>{if(!currentSpinner)return;let label=getStepLabel(step),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`),icon=step.exitCode===0?theme.success(`✓`):theme.error(`✗`);if(currentSpinner.stop(`${icon} ${label} ${duration}`),currentSpinner=null,step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
2
2
|
`).slice(-10);for(let line of lines)line.trim()&&defaultRuntime.log(` ${theme.error(line)}`)}}},stop:()=>{currentSpinner&&=(currentSpinner.stop(),null)}}}function formatStepStatus(exitCode){return exitCode===0?theme.success(`✓`):exitCode===null?theme.warn(`?`):theme.error(`✗`)}function printResult(result,opts){if(opts.json){defaultRuntime.log(JSON.stringify(result,null,2));return}let statusColor=result.status===`ok`?theme.success:result.status===`skipped`?theme.warn:theme.error;if(defaultRuntime.log(``),defaultRuntime.log(`${theme.heading(`Update Result:`)} ${statusColor(result.status.toUpperCase())}`),result.root&&defaultRuntime.log(` Root: ${theme.muted(result.root)}`),result.reason&&defaultRuntime.log(` Reason: ${theme.muted(result.reason)}`),result.before?.version||result.before?.sha){let before=result.before.version??result.before.sha?.slice(0,8)??``;defaultRuntime.log(` Before: ${theme.muted(before)}`)}if(result.after?.version||result.after?.sha){let after=result.after.version??result.after.sha?.slice(0,8)??``;defaultRuntime.log(` After: ${theme.muted(after)}`)}if(!opts.hideSteps&&result.steps.length>0){defaultRuntime.log(``),defaultRuntime.log(theme.heading(`Steps:`));for(let step of result.steps){let status=formatStepStatus(step.exitCode),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`);if(defaultRuntime.log(` ${status} ${step.name} ${duration}`),step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
3
3
|
`).slice(0,5);for(let line of lines)line.trim()&&defaultRuntime.log(` ${theme.error(line)}`)}}}defaultRuntime.log(``),defaultRuntime.log(`Total time: ${theme.muted(formatDurationPrecise(result.durationMs))}`)}function shellEscape(value){return value.replace(/'/g,`'\\''`)}function isBatchSafe(value){return/^[A-Za-z0-9 _\-().]+$/.test(value)}function resolveSystemdUnit(env){let override=env.BUILDERFORCE_AGENTS_SYSTEMD_UNIT?.trim();return override?override.endsWith(`.service`)?override:`${override}.service`:`${resolveGatewaySystemdServiceName(env.BUILDERFORCE_AGENTS_PROFILE)}.service`}function resolveLaunchdLabel(env){return env.BUILDERFORCE_AGENTS_LAUNCHD_LABEL?.trim()||resolveGatewayLaunchAgentLabel(env.BUILDERFORCE_AGENTS_PROFILE)}function resolveWindowsTaskName(env){return env.BUILDERFORCE_AGENTS_WINDOWS_TASK_NAME?.trim()||resolveGatewayWindowsTaskName(env.BUILDERFORCE_AGENTS_PROFILE)}async function prepareRestartScript(env=process.env){let tmpDir=os.tmpdir(),timestamp=Date.now(),platform=process.platform,scriptContent=``,filename=``;try{if(platform===`linux`){let escaped=shellEscape(resolveSystemdUnit(env));filename=`builderforce-restart-${timestamp}.sh`,scriptContent=`#!/bin/sh
|
|
4
4
|
# Standalone restart script — survives parent process termination.
|