@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{d as resolveIsNixMode,f as resolveLegacyStateDirs,g as resolveStateDir,m as resolveOAuthDir,p as resolveNewStateDir,t as CONFIG_PATH,u as resolveGatewayPort,y as resolveRequiredHomeDir}from"./paths-BHg-VHB4.js";import{C as sleep,S as shortenHomePath,W as getResolvedLoggerSettings,_ as resolveHomeDir$1,d as isRecord,y as resolveUserPath}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{H as resolveConfiguredModelRef,N as getModelRefStatus,S as updateAuthProfileStoreWithLock,W as resolveHooksGmailModel,_n as DEFAULT_PROVIDER,b as ensureAuthProfileStore,bn as CODEX_CLI_PROFILE_ID,gn as DEFAULT_MODEL,o as resolveProfileUnusableUntilForDisplay,p as repairOAuthProfileIdMismatch,qt as resolveApiKeyForProvider,s as resolveApiKeyForProfile,yn as CLAUDE_CLI_PROFILE_ID}from"./auth-profiles-CuAFgjuQ.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,n as DEFAULT_ACCOUNT_ID}from"./session-key-CksCYipj.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{n as runExec,t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir,i as resolveAgentDir,l as resolveDefaultAgentId,p as DEFAULT_AGENTS_FILENAME}from"./agent-scope-CufEmNj_.js";import{a as readConfigFileSnapshot,c as writeConfigFile,p as BuilderForceAgentsSchema}from"./io-CsCa3_1Z.js";import{t as migrateLegacyConfig}from"./config-DmxNxDRW.js";import{r as loadModelCatalog}from"./model-catalog-D8OQ7p7I.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-CGlKz1D1.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-O-iC_P5t.js";import{l as resolveGatewayBindHost,n as isLoopbackHost}from"./net-DtnXq2dW.js";import{Mn as buildAuthHealthSummary,Nn as formatRemainingShort,jn as DEFAULT_OAUTH_WARN_MS,w as loadBuilderForceAgentsPlugins}from"./subagent-registry-
|
|
1
|
+
import{d as resolveIsNixMode,f as resolveLegacyStateDirs,g as resolveStateDir,m as resolveOAuthDir,p as resolveNewStateDir,t as CONFIG_PATH,u as resolveGatewayPort,y as resolveRequiredHomeDir}from"./paths-BHg-VHB4.js";import{C as sleep,S as shortenHomePath,W as getResolvedLoggerSettings,_ as resolveHomeDir$1,d as isRecord,y as resolveUserPath}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{H as resolveConfiguredModelRef,N as getModelRefStatus,S as updateAuthProfileStoreWithLock,W as resolveHooksGmailModel,_n as DEFAULT_PROVIDER,b as ensureAuthProfileStore,bn as CODEX_CLI_PROFILE_ID,gn as DEFAULT_MODEL,o as resolveProfileUnusableUntilForDisplay,p as repairOAuthProfileIdMismatch,qt as resolveApiKeyForProvider,s as resolveApiKeyForProfile,yn as CLAUDE_CLI_PROFILE_ID}from"./auth-profiles-CuAFgjuQ.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,n as DEFAULT_ACCOUNT_ID}from"./session-key-CksCYipj.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{n as runExec,t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir,i as resolveAgentDir,l as resolveDefaultAgentId,p as DEFAULT_AGENTS_FILENAME}from"./agent-scope-CufEmNj_.js";import{a as readConfigFileSnapshot,c as writeConfigFile,p as BuilderForceAgentsSchema}from"./io-CsCa3_1Z.js";import{t as migrateLegacyConfig}from"./config-DmxNxDRW.js";import{r as loadModelCatalog}from"./model-catalog-D8OQ7p7I.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-CGlKz1D1.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-O-iC_P5t.js";import{l as resolveGatewayBindHost,n as isLoopbackHost}from"./net-DtnXq2dW.js";import{Mn as buildAuthHealthSummary,Nn as formatRemainingShort,jn as DEFAULT_OAUTH_WARN_MS,w as loadBuilderForceAgentsPlugins}from"./subagent-registry-m_x-JRkR.js";import{A as canonicalizeMainSessionAlias,N as resolveMainSessionKey,X as cleanStaleLockFiles,a as loadSessionStore,c as saveSessionStore}from"./sessions-CmJXMlLP.js";import{c as listTelegramAccountIds,l as resolveTelegramAccount,n as listChannelPlugins}from"./plugins-1Mn6RiNf.js";import{D as DEFAULT_SANDBOX_IMAGE,E as DEFAULT_SANDBOX_COMMON_IMAGE,T as DEFAULT_SANDBOX_BROWSER_IMAGE,f as resolveSandboxScope}from"./sandbox-C-Owvt1-.js";import{i as resolveGatewayAuth}from"./auth-ChecwOXS.js";import{a as formatPortDiagnostics,n as inspectPortUsage}from"./ports-DTku9NSx.js";import{c as resolveStorePath,n as resolveSessionFilePath,s as resolveSessionTranscriptsDirForAgent}from"./paths-ClsbsPQP.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName,m as resolveNodeLaunchAgentLabel}from"./constants-D2th5NXV.js";import{c as getDefaultMemoryDirs,l as getDefaultMemoryFilePaths}from"./sqlite-CIGM1WKg.js";import{r as resolveMemorySearchConfig}from"./manager-Bjb9ptCz.js";import{t as formatDurationCompact}from"./format-duration-HN2dpHE0.js";import{f as printWizardHeader,m as randomToken,n as applyWizardMetadata,s as guardCancel}from"./onboard-helpers-D2vxAtv8.js";import{n as isWSLEnv,t as isWSL}from"./wsl-BO1sLIB6.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BMWmaqSC.js";import{t as note$1}from"./note-DgDXuE0F.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DPPVplyk.js";import{t as applyPluginAutoEnable}from"./plugin-auto-enable-DT7HMdAA.js";import{t as isWithinDir}from"./path-safety-D04ClLIY.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-NLYb8w9i.js";import{a as gatewayInstallErrorHint,f as renderSystemNodeWarning,i as buildGatewayInstallPlan,m as resolveSystemNodeInfo,n as GATEWAY_DAEMON_RUNTIME_OPTIONS,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-CnNjpvfd.js";import{r as isSystemdUserServiceAvailable}from"./systemd-DdVd5Yet.js";import{a as launchAgentPlistExists,i as isLaunchAgentLoaded,o as repairLaunchAgentBootstrap,r as isLaunchAgentListed,s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-EKJG69M3.js";import{a as isSystemdUnavailableDetail,c as auditGatewayServiceConfig,l as needsNodeRuntimeMigration,o as renderSystemdUnavailableHints,s as SERVICE_AUDIT_CODES,y as formatRuntimeStatus}from"./lifecycle-core-BsJbjf7b.js";import{t as readLastGatewayErrorLine}from"./diagnostics-DamNPi4e.js";import{a as renderGatewayServiceCleanupHints,i as findExtraGatewayServices}from"./daemon-cli-BHsiBvv7.js";import{r as healthCommand}from"./health-CEz2-7et.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-BxgWcomx.js";import{n as isNumericTelegramUserId,r as normalizeTelegramAllowFromEntry,t as resolveDmAllowState}from"./dm-policy-shared-DT6DrqEe.js";import{n as runGatewayUpdate,t as resolveAgentSessionDirs}from"./session-dirs-Bkfs-7vN.js";import{n as logConfigUpdated}from"./logging-ayt7F7vy.js";import{t as ensureSystemdUserLingerInteractive}from"./systemd-linger-CPKngdUf.js";import{t as formatHealthCheckFailure}from"./health-format-D4MaIjaG.js";import{n as doctorShellCompletion}from"./doctor-completion-CkjrUmbI.js";import{execFile}from"node:child_process";import os from"node:os";import path from"node:path";import fs from"node:fs";import{promisify}from"node:util";import JSON5 from"json5";import fs$1 from"node:fs/promises";import{confirm,intro,outro,select}from"@clack/prompts";async function maybeRepairAnthropicOAuthProfileId(cfg,prompter){let repair=repairOAuthProfileIdMismatch({cfg,store:await ensureAuthProfileStore(),provider:`anthropic`,legacyProfileId:`anthropic:default`});return!repair.migrated||repair.changes.length===0||(note$1(repair.changes.map(c=>`- ${c}`).join(`
|
|
2
2
|
`),`Auth profiles`),!await prompter.confirm({message:`Update Anthropic OAuth profile id in config now?`,initialValue:!0}))?cfg:repair.config}function pruneAuthOrder(order,profileIds){if(!order)return{next:order,changed:!1};let changed=!1,next={};for(let[provider,list]of Object.entries(order)){let filtered=list.filter(id=>!profileIds.has(id));filtered.length!==list.length&&(changed=!0),filtered.length>0&&(next[provider]=filtered)}return{next:Object.keys(next).length>0?next:void 0,changed}}function pruneAuthProfiles(cfg,profileIds){let profiles=cfg.auth?.profiles,order=cfg.auth?.order,nextProfiles=profiles?{...profiles}:void 0,changed=!1;if(nextProfiles)for(let id of profileIds)id in nextProfiles&&(delete nextProfiles[id],changed=!0);let prunedOrder=pruneAuthOrder(order,profileIds);if(prunedOrder.changed&&(changed=!0),!changed)return{next:cfg,changed:!1};let nextAuth=nextProfiles||prunedOrder.next?{...cfg.auth,profiles:nextProfiles&&Object.keys(nextProfiles).length>0?nextProfiles:void 0,order:prunedOrder.next}:void 0;return{next:{...cfg,auth:nextAuth},changed:!0}}async function maybeRemoveDeprecatedCliAuthProfiles(cfg,prompter){let store=await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1}),deprecated=new Set;if((store.profiles[CLAUDE_CLI_PROFILE_ID]||cfg.auth?.profiles?.[CLAUDE_CLI_PROFILE_ID])&&deprecated.add(CLAUDE_CLI_PROFILE_ID),(store.profiles[CODEX_CLI_PROFILE_ID]||cfg.auth?.profiles?.[CODEX_CLI_PROFILE_ID])&&deprecated.add(CODEX_CLI_PROFILE_ID),deprecated.size===0)return cfg;let lines=[`Deprecated external CLI auth profiles detected (no longer supported):`];if(deprecated.has(CLAUDE_CLI_PROFILE_ID)&&lines.push(`- ${CLAUDE_CLI_PROFILE_ID} (Anthropic): use setup-token → ${formatCliCommand(`builderforce models auth setup-token`)}`),deprecated.has(CODEX_CLI_PROFILE_ID)&&lines.push(`- ${CODEX_CLI_PROFILE_ID} (OpenAI Codex): use OAuth → ${formatCliCommand(`builderforce models auth login --provider openai-codex`)}`),note$1(lines.join(`
|
|
3
3
|
`),`Auth profiles`),!await prompter.confirmRepair({message:`Remove deprecated CLI auth profiles now?`,initialValue:!0}))return cfg;await updateAuthProfileStoreWithLock({updater:nextStore=>{let mutated=!1;for(let id of deprecated)nextStore.profiles[id]&&(delete nextStore.profiles[id],mutated=!0),nextStore.usageStats?.[id]&&(delete nextStore.usageStats[id],mutated=!0);if(nextStore.order)for(let[provider,list]of Object.entries(nextStore.order)){let filtered=list.filter(id=>!deprecated.has(id));filtered.length!==list.length&&(mutated=!0,filtered.length>0?nextStore.order[provider]=filtered:delete nextStore.order[provider])}if(nextStore.lastGood)for(let[provider,profileId]of Object.entries(nextStore.lastGood))deprecated.has(profileId)&&(delete nextStore.lastGood[provider],mutated=!0);return mutated}});let pruned=pruneAuthProfiles(cfg,deprecated);return pruned.changed&¬e$1(Array.from(deprecated.values()).map(id=>`- removed ${id} from config`).join(`
|
|
4
4
|
`),`Doctor changes`),pruned.next}function formatAuthIssueHint(issue){return issue.provider===`anthropic`&&issue.profileId===CLAUDE_CLI_PROFILE_ID?`Deprecated profile. Use ${formatCliCommand(`builderforce models auth setup-token`)} or ${formatCliCommand(`builderforce configure`)}.`:issue.provider===`openai-codex`&&issue.profileId===CODEX_CLI_PROFILE_ID?`Deprecated profile. Use ${formatCliCommand(`builderforce models auth login --provider openai-codex`)} or ${formatCliCommand(`builderforce configure`)}.`:`Re-auth via \`${formatCliCommand(`builderforce configure`)}\` or \`${formatCliCommand(`builderforce onboard`)}\`.`}function formatAuthIssueLine(issue){let remaining=issue.remainingMs===void 0?``:` (${formatRemainingShort(issue.remainingMs)})`,hint=formatAuthIssueHint(issue);return`- ${issue.profileId}: ${issue.status}${remaining}${hint?` — ${hint}`:``}`}async function noteAuthProfileHealth(params){let store=await ensureAuthProfileStore(void 0,{allowKeychainPrompt:params.allowKeychainPrompt}),unusable=(()=>{let now=Date.now(),out=[];for(let profileId of Object.keys(store.usageStats??{})){let until=resolveProfileUnusableUntilForDisplay(store,profileId);if(!until||now>=until)continue;let stats=store.usageStats?.[profileId],remaining=formatRemainingShort(until-now),kind=typeof stats?.disabledUntil==`number`&&now<stats.disabledUntil?`disabled${stats.disabledReason?`:${stats.disabledReason}`:``}`:`cooldown`,hint=kind.startsWith(`disabled:billing`)?`Top up credits (provider billing) or switch provider.`:`Wait for cooldown or switch provider.`;out.push(`- ${profileId}: ${kind} (${remaining})${hint?` — ${hint}`:``}`)}return out})();unusable.length>0&¬e$1(unusable.join(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{d as resolveIsNixMode,f as resolveLegacyStateDirs,g as resolveStateDir,m as resolveOAuthDir,p as resolveNewStateDir,t as CONFIG_PATH,u as resolveGatewayPort,y as resolveRequiredHomeDir}from"./paths-5FcIFMsj.js";import{C as shortenHomePath,G as getResolvedLoggerSettings,b as resolveUserPath,f as isRecord,v as resolveHomeDir$1,w as sleep}from"./utils-DbaBVFaK.js";import{Mt as loadBuilderForceAgentsPlugins,ai as DEFAULT_OAUTH_WARN_MS,oi as buildAuthHealthSummary,si as formatRemainingShort}from"./reply-
|
|
1
|
+
import{d as resolveIsNixMode,f as resolveLegacyStateDirs,g as resolveStateDir,m as resolveOAuthDir,p as resolveNewStateDir,t as CONFIG_PATH,u as resolveGatewayPort,y as resolveRequiredHomeDir}from"./paths-5FcIFMsj.js";import{C as shortenHomePath,G as getResolvedLoggerSettings,b as resolveUserPath,f as isRecord,v as resolveHomeDir$1,w as sleep}from"./utils-DbaBVFaK.js";import{Mt as loadBuilderForceAgentsPlugins,ai as DEFAULT_OAUTH_WARN_MS,oi as buildAuthHealthSummary,si as formatRemainingShort}from"./reply-BuUSdq2L.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,n as DEFAULT_ACCOUNT_ID}from"./session-key-EoB0qaG9.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import{n as runExec,t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir,i as resolveAgentDir,l as resolveDefaultAgentId,p as DEFAULT_AGENTS_FILENAME}from"./agent-scope-DPtjOxzp.js";import{Gt as resolveApiKeyForProfile,Wt as resolveProfileUnusableUntilForDisplay,Zt as repairOAuthProfileIdMismatch,_n as CODEX_CLI_PROFILE_ID,a as getModelRefStatus,bn as DEFAULT_PROVIDER,g as resolveHooksGmailModel,gn as CLAUDE_CLI_PROFILE_ID,in as ensureAuthProfileStore,m as resolveConfiguredModelRef,on as updateAuthProfileStoreWithLock,yn as DEFAULT_MODEL,yt as resolveApiKeyForProvider}from"./model-selection-Doyvd4lU.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{t as isTruthyEnvValue}from"./env-BIdU5BAp.js";import{a as readConfigFileSnapshot,c as writeConfigFile,p as BuilderForceAgentsSchema}from"./io-BNtgT4VB.js";import{t as migrateLegacyConfig}from"./config-BD801bpx.js";import{r as loadModelCatalog}from"./model-catalog-BoiWqBTw.js";import{D as DEFAULT_SANDBOX_IMAGE,E as DEFAULT_SANDBOX_COMMON_IMAGE,T as DEFAULT_SANDBOX_BROWSER_IMAGE,f as resolveSandboxScope}from"./sandbox-1jtP0nhr.js";import{i as resolveGatewayAuth}from"./auth-lebUHrkd.js";import{r as isLoopbackHost,u as resolveGatewayBindHost}from"./ws-Bbu03j3h.js";import{a as inspectPortUsage,c as formatPortDiagnostics}from"./ports-DgmEDNOm.js";import{B as resolveMainSessionKey,L as canonicalizeMainSessionAlias,a as loadSessionStore,c as saveSessionStore,rt as cleanStaleLockFiles}from"./sessions-BPr0-lkT.js";import{c as listTelegramAccountIds,l as resolveTelegramAccount,n as listChannelPlugins}from"./plugins-D5zP6ENo.js";import{c as resolveStorePath,n as resolveSessionFilePath,s as resolveSessionTranscriptsDirForAgent}from"./paths-DJ6rztqJ.js";import{c as getDefaultMemoryDirs,l as getDefaultMemoryFilePaths}from"./sqlite-C39E12XS.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName,m as resolveNodeLaunchAgentLabel}from"./constants-BBbGeL3t.js";import{r as resolveMemorySearchConfig}from"./manager-DNIg84rj.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-CJq3iGqu.js";import{t as formatDurationCompact}from"./format-duration-HN2dpHE0.js";import{f as printWizardHeader,m as randomToken,n as applyWizardMetadata,s as guardCancel}from"./onboard-helpers-BmYUjl4j.js";import{n as isWSLEnv,t as isWSL}from"./wsl-DkYsHmN5.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BpVK43GK.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-vWC0PU8J.js";import{t as note$1}from"./note-B6NtFdXt.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DTDCy17p.js";import{t as applyPluginAutoEnable}from"./plugin-auto-enable-zKMSAekH.js";import{t as isWithinDir}from"./path-safety-CS-EmF4c.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-BlOu0Ul_.js";import{a as gatewayInstallErrorHint,f as renderSystemNodeWarning,i as buildGatewayInstallPlan,m as resolveSystemNodeInfo,n as GATEWAY_DAEMON_RUNTIME_OPTIONS,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-0CbmdgMr.js";import{r as isSystemdUserServiceAvailable}from"./systemd-BG3_QT6W.js";import{a as launchAgentPlistExists,i as isLaunchAgentLoaded,o as repairLaunchAgentBootstrap,r as isLaunchAgentListed,s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-D-NLDyK3.js";import{a as isSystemdUnavailableDetail,c as auditGatewayServiceConfig,l as needsNodeRuntimeMigration,o as renderSystemdUnavailableHints,s as SERVICE_AUDIT_CODES,y as formatRuntimeStatus}from"./lifecycle-core-lZTP9Ary.js";import{t as readLastGatewayErrorLine}from"./diagnostics-DCjg0nBH.js";import{a as renderGatewayServiceCleanupHints,i as findExtraGatewayServices}from"./daemon-cli-Dt1S7APn.js";import{r as healthCommand}from"./health-CFVx21sO.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-CWgH1Tda.js";import{n as isNumericTelegramUserId,r as normalizeTelegramAllowFromEntry,t as resolveDmAllowState}from"./dm-policy-shared-CLiz10xA.js";import{n as runGatewayUpdate,t as resolveAgentSessionDirs}from"./session-dirs-rYDCA_mQ.js";import{n as logConfigUpdated}from"./logging-DHa3jQN3.js";import{t as ensureSystemdUserLingerInteractive}from"./systemd-linger-CT-VHPB3.js";import{t as formatHealthCheckFailure}from"./health-format-iE_KYEwP.js";import{n as doctorShellCompletion}from"./doctor-completion-Dh9ah5lH.js";import fs from"node:fs";import os from"node:os";import path from"node:path";import JSON5 from"json5";import fs$1 from"node:fs/promises";import{execFile}from"node:child_process";import{promisify}from"node:util";import{confirm,intro,outro,select}from"@clack/prompts";async function maybeRepairAnthropicOAuthProfileId(cfg,prompter){let repair=repairOAuthProfileIdMismatch({cfg,store:await ensureAuthProfileStore(),provider:`anthropic`,legacyProfileId:`anthropic:default`});return!repair.migrated||repair.changes.length===0||(note$1(repair.changes.map(c=>`- ${c}`).join(`
|
|
2
2
|
`),`Auth profiles`),!await prompter.confirm({message:`Update Anthropic OAuth profile id in config now?`,initialValue:!0}))?cfg:repair.config}function pruneAuthOrder(order,profileIds){if(!order)return{next:order,changed:!1};let changed=!1,next={};for(let[provider,list]of Object.entries(order)){let filtered=list.filter(id=>!profileIds.has(id));filtered.length!==list.length&&(changed=!0),filtered.length>0&&(next[provider]=filtered)}return{next:Object.keys(next).length>0?next:void 0,changed}}function pruneAuthProfiles(cfg,profileIds){let profiles=cfg.auth?.profiles,order=cfg.auth?.order,nextProfiles=profiles?{...profiles}:void 0,changed=!1;if(nextProfiles)for(let id of profileIds)id in nextProfiles&&(delete nextProfiles[id],changed=!0);let prunedOrder=pruneAuthOrder(order,profileIds);if(prunedOrder.changed&&(changed=!0),!changed)return{next:cfg,changed:!1};let nextAuth=nextProfiles||prunedOrder.next?{...cfg.auth,profiles:nextProfiles&&Object.keys(nextProfiles).length>0?nextProfiles:void 0,order:prunedOrder.next}:void 0;return{next:{...cfg,auth:nextAuth},changed:!0}}async function maybeRemoveDeprecatedCliAuthProfiles(cfg,prompter){let store=await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1}),deprecated=new Set;if((store.profiles[CLAUDE_CLI_PROFILE_ID]||cfg.auth?.profiles?.[CLAUDE_CLI_PROFILE_ID])&&deprecated.add(CLAUDE_CLI_PROFILE_ID),(store.profiles[CODEX_CLI_PROFILE_ID]||cfg.auth?.profiles?.[CODEX_CLI_PROFILE_ID])&&deprecated.add(CODEX_CLI_PROFILE_ID),deprecated.size===0)return cfg;let lines=[`Deprecated external CLI auth profiles detected (no longer supported):`];if(deprecated.has(CLAUDE_CLI_PROFILE_ID)&&lines.push(`- ${CLAUDE_CLI_PROFILE_ID} (Anthropic): use setup-token → ${formatCliCommand(`builderforce models auth setup-token`)}`),deprecated.has(CODEX_CLI_PROFILE_ID)&&lines.push(`- ${CODEX_CLI_PROFILE_ID} (OpenAI Codex): use OAuth → ${formatCliCommand(`builderforce models auth login --provider openai-codex`)}`),note$1(lines.join(`
|
|
3
3
|
`),`Auth profiles`),!await prompter.confirmRepair({message:`Remove deprecated CLI auth profiles now?`,initialValue:!0}))return cfg;await updateAuthProfileStoreWithLock({updater:nextStore=>{let mutated=!1;for(let id of deprecated)nextStore.profiles[id]&&(delete nextStore.profiles[id],mutated=!0),nextStore.usageStats?.[id]&&(delete nextStore.usageStats[id],mutated=!0);if(nextStore.order)for(let[provider,list]of Object.entries(nextStore.order)){let filtered=list.filter(id=>!deprecated.has(id));filtered.length!==list.length&&(mutated=!0,filtered.length>0?nextStore.order[provider]=filtered:delete nextStore.order[provider])}if(nextStore.lastGood)for(let[provider,profileId]of Object.entries(nextStore.lastGood))deprecated.has(profileId)&&(delete nextStore.lastGood[provider],mutated=!0);return mutated}});let pruned=pruneAuthProfiles(cfg,deprecated);return pruned.changed&¬e$1(Array.from(deprecated.values()).map(id=>`- removed ${id} from config`).join(`
|
|
4
4
|
`),`Doctor changes`),pruned.next}function formatAuthIssueHint(issue){return issue.provider===`anthropic`&&issue.profileId===CLAUDE_CLI_PROFILE_ID?`Deprecated profile. Use ${formatCliCommand(`builderforce models auth setup-token`)} or ${formatCliCommand(`builderforce configure`)}.`:issue.provider===`openai-codex`&&issue.profileId===CODEX_CLI_PROFILE_ID?`Deprecated profile. Use ${formatCliCommand(`builderforce models auth login --provider openai-codex`)} or ${formatCliCommand(`builderforce configure`)}.`:`Re-auth via \`${formatCliCommand(`builderforce configure`)}\` or \`${formatCliCommand(`builderforce onboard`)}\`.`}function formatAuthIssueLine(issue){let remaining=issue.remainingMs===void 0?``:` (${formatRemainingShort(issue.remainingMs)})`,hint=formatAuthIssueHint(issue);return`- ${issue.profileId}: ${issue.status}${remaining}${hint?` — ${hint}`:``}`}async function noteAuthProfileHealth(params){let store=await ensureAuthProfileStore(void 0,{allowKeychainPrompt:params.allowKeychainPrompt}),unusable=(()=>{let now=Date.now(),out=[];for(let profileId of Object.keys(store.usageStats??{})){let until=resolveProfileUnusableUntilForDisplay(store,profileId);if(!until||now>=until)continue;let stats=store.usageStats?.[profileId],remaining=formatRemainingShort(until-now),kind=typeof stats?.disabledUntil==`number`&&now<stats.disabledUntil?`disabled${stats.disabledReason?`:${stats.disabledReason}`:``}`:`cooldown`,hint=kind.startsWith(`disabled:billing`)?`Top up credits (provider billing) or switch provider.`:`Wait for cooldown or switch provider.`;out.push(`- ${profileId}: ${kind} (${remaining})${hint?` — ${hint}`:``}`)}return out})();unusable.length>0&¬e$1(unusable.join(`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{R as normalizeProviderId,b as ensureAuthProfileStore,v as upsertAuthProfile}from"./auth-profiles-CuAFgjuQ.js";import{C as createPluginLoaderLogger,w as loadBuilderForceAgentsPlugins}from"./subagent-registry-
|
|
1
|
+
import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{R as normalizeProviderId,b as ensureAuthProfileStore,v as upsertAuthProfile}from"./auth-profiles-CuAFgjuQ.js";import{C as createPluginLoaderLogger,w as loadBuilderForceAgentsPlugins}from"./subagent-registry-m_x-JRkR.js";import{n as isWSLEnv}from"./wsl-BO1sLIB6.js";import{r as stylePromptTitle}from"./prompt-style-BMWmaqSC.js";import{f as updateConfig}from"./shared-DUsuqnhk.js";import{d as applyAuthProfileConfig}from"./auth-token-yWeJoLJ8.js";import{n as logConfigUpdated}from"./logging-ayt7F7vy.js";import{intro,note,outro,spinner}from"@clack/prompts";const CLIENT_ID=`Iv1.b507a08c87ecfe98`;function parseJsonResponse(value){if(!value||typeof value!=`object`)throw Error(`Unexpected response from GitHub`);return value}async function requestDeviceCode(params){let body=new URLSearchParams({client_id:CLIENT_ID,scope:params.scope}),res=await fetch(`https://github.com/login/device/code`,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`},body});if(!res.ok)throw Error(`GitHub device code failed: HTTP ${res.status}`);let json=parseJsonResponse(await res.json());if(!json.device_code||!json.user_code||!json.verification_uri)throw Error(`GitHub device code response missing fields`);return json}async function pollForAccessToken(params){let bodyBase=new URLSearchParams({client_id:CLIENT_ID,device_code:params.deviceCode,grant_type:`urn:ietf:params:oauth:grant-type:device_code`});for(;Date.now()<params.expiresAt;){let res=await fetch(`https://github.com/login/oauth/access_token`,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`},body:bodyBase});if(!res.ok)throw Error(`GitHub device token failed: HTTP ${res.status}`);let json=parseJsonResponse(await res.json());if(`access_token`in json&&typeof json.access_token==`string`)return json.access_token;let err=`error`in json?json.error:`unknown`;if(err===`authorization_pending`){await new Promise(r=>setTimeout(r,params.intervalMs));continue}if(err===`slow_down`){await new Promise(r=>setTimeout(r,params.intervalMs+2e3));continue}throw err===`expired_token`?Error(`GitHub device code expired; run login again`):err===`access_denied`?Error(`GitHub login cancelled`):Error(`GitHub device flow error: ${err}`)}throw Error(`GitHub device code expired; run login again`)}async function githubCopilotLoginCommand(opts,runtime){if(!process.stdin.isTTY)throw Error(`github-copilot login requires an interactive TTY.`);intro(stylePromptTitle(`GitHub Copilot login`));let profileId=opts.profileId?.trim()||`github-copilot:github`;(await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1})).profiles[profileId]&&!opts.yes&¬e(`Auth profile already exists: ${profileId}\nRe-running will overwrite it.`,stylePromptTitle(`Existing credentials`));let spin=spinner();spin.start(`Requesting device code from GitHub...`);let device=await requestDeviceCode({scope:`read:user`});spin.stop(`Device code ready`),note([`Visit: ${device.verification_uri}`,`Code: ${device.user_code}`].join(`
|
|
2
2
|
`),stylePromptTitle(`Authorize`));let expiresAt=Date.now()+device.expires_in*1e3,intervalMs=Math.max(1e3,device.interval*1e3),polling=spinner();polling.start(`Waiting for GitHub authorization...`);let accessToken=await pollForAccessToken({deviceCode:device.device_code,intervalMs,expiresAt});polling.stop(`GitHub access token acquired`),await upsertAuthProfile({profileId,credential:{type:`token`,provider:`github-copilot`,token:accessToken}}),await updateConfig(cfg=>applyAuthProfileConfig(cfg,{provider:`github-copilot`,profileId,mode:`token`})),logConfigUpdated(runtime),runtime.log(`Auth profile: ${profileId} (github-copilot/token)`),outro(`Done`)}const log=createSubsystemLogger(`plugins`);function resolvePluginProviders(params){return loadBuilderForceAgentsPlugins({config:params.config,workspaceDir:params.workspaceDir,logger:createPluginLoaderLogger(log)}).providers.map(entry=>entry.provider)}function isRemoteEnvironment(){return!!(process.env.SSH_CLIENT||process.env.SSH_TTY||process.env.SSH_CONNECTION||process.env.REMOTE_CONTAINERS||process.env.CODESPACES||process.platform===`linux`&&!process.env.DISPLAY&&!process.env.WAYLAND_DISPLAY&&!isWSLEnv())}const validateRequiredInput=value=>value.trim().length>0?void 0:`Required`;function createVpsAwareOAuthHandlers(params){let manualPromptMessage=params.manualPromptMessage??`Paste the redirect URL`,manualCodePromise;return{onAuth:async({url})=>{if(params.isRemote){params.spin.stop(`OAuth URL ready`),params.runtime.log(`\nOpen this URL in your LOCAL browser:\n\n${url}\n`),manualCodePromise=params.prompter.text({message:manualPromptMessage,validate:validateRequiredInput}).then(value=>String(value));return}params.spin.update(params.localBrowserMessage),await params.openUrl(url),params.runtime.log(`Open: ${url}`)},onPrompt:async prompt=>{if(manualCodePromise)return manualCodePromise;let code=await params.prompter.text({message:prompt.message,placeholder:prompt.placeholder,validate:validateRequiredInput});return String(code)}}}function resolveProviderMatch(providers,rawProvider){let raw=rawProvider?.trim();if(!raw)return null;let normalized=normalizeProviderId(raw);return providers.find(provider=>normalizeProviderId(provider.id)===normalized)??providers.find(provider=>provider.aliases?.some(alias=>normalizeProviderId(alias)===normalized)??!1)??null}function pickAuthMethod(provider,rawMethod){let raw=rawMethod?.trim();if(!raw)return null;let normalized=raw.toLowerCase();return provider.auth.find(method=>method.id.toLowerCase()===normalized)??provider.auth.find(method=>method.label.toLowerCase()===normalized)??null}function isPlainRecord(value){return!!(value&&typeof value==`object`&&!Array.isArray(value))}function mergeConfigPatch(base,patch){if(!isPlainRecord(base)||!isPlainRecord(patch))return patch;let next={...base};for(let[key,value]of Object.entries(patch)){let existing=next[key];isPlainRecord(existing)&&isPlainRecord(value)?next[key]=mergeConfigPatch(existing,value):next[key]=value}return next}function applyDefaultModel(cfg,model){let models={...cfg.agents?.defaults?.models};models[model]=models[model]??{};let existingModel=cfg.agents?.defaults?.model;return{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,models,model:{...existingModel&&typeof existingModel==`object`&&`fallbacks`in existingModel?{fallbacks:existingModel.fallbacks}:void 0,primary:model}}}}}export{createVpsAwareOAuthHandlers as a,githubCopilotLoginCommand as c,resolveProviderMatch as i,mergeConfigPatch as n,isRemoteEnvironment as o,pickAuthMethod as r,resolvePluginProviders as s,applyDefaultModel as t};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Mt as loadBuilderForceAgentsPlugins,jt as createPluginLoaderLogger}from"./reply-
|
|
1
|
+
import{Mt as loadBuilderForceAgentsPlugins,jt as createPluginLoaderLogger}from"./reply-BuUSdq2L.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{in as ensureAuthProfileStore,nn as upsertAuthProfile,u as normalizeProviderId}from"./model-selection-Doyvd4lU.js";import{n as isWSLEnv}from"./wsl-DkYsHmN5.js";import{r as stylePromptTitle}from"./prompt-style-BpVK43GK.js";import{f as updateConfig}from"./shared-DXDwFhUI.js";import{d as applyAuthProfileConfig}from"./auth-token-CPSeBkJC.js";import{n as logConfigUpdated}from"./logging-DHa3jQN3.js";import{intro,note,outro,spinner}from"@clack/prompts";const CLIENT_ID=`Iv1.b507a08c87ecfe98`;function parseJsonResponse(value){if(!value||typeof value!=`object`)throw Error(`Unexpected response from GitHub`);return value}async function requestDeviceCode(params){let body=new URLSearchParams({client_id:CLIENT_ID,scope:params.scope}),res=await fetch(`https://github.com/login/device/code`,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`},body});if(!res.ok)throw Error(`GitHub device code failed: HTTP ${res.status}`);let json=parseJsonResponse(await res.json());if(!json.device_code||!json.user_code||!json.verification_uri)throw Error(`GitHub device code response missing fields`);return json}async function pollForAccessToken(params){let bodyBase=new URLSearchParams({client_id:CLIENT_ID,device_code:params.deviceCode,grant_type:`urn:ietf:params:oauth:grant-type:device_code`});for(;Date.now()<params.expiresAt;){let res=await fetch(`https://github.com/login/oauth/access_token`,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`},body:bodyBase});if(!res.ok)throw Error(`GitHub device token failed: HTTP ${res.status}`);let json=parseJsonResponse(await res.json());if(`access_token`in json&&typeof json.access_token==`string`)return json.access_token;let err=`error`in json?json.error:`unknown`;if(err===`authorization_pending`){await new Promise(r=>setTimeout(r,params.intervalMs));continue}if(err===`slow_down`){await new Promise(r=>setTimeout(r,params.intervalMs+2e3));continue}throw err===`expired_token`?Error(`GitHub device code expired; run login again`):err===`access_denied`?Error(`GitHub login cancelled`):Error(`GitHub device flow error: ${err}`)}throw Error(`GitHub device code expired; run login again`)}async function githubCopilotLoginCommand(opts,runtime){if(!process.stdin.isTTY)throw Error(`github-copilot login requires an interactive TTY.`);intro(stylePromptTitle(`GitHub Copilot login`));let profileId=opts.profileId?.trim()||`github-copilot:github`;(await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1})).profiles[profileId]&&!opts.yes&¬e(`Auth profile already exists: ${profileId}\nRe-running will overwrite it.`,stylePromptTitle(`Existing credentials`));let spin=spinner();spin.start(`Requesting device code from GitHub...`);let device=await requestDeviceCode({scope:`read:user`});spin.stop(`Device code ready`),note([`Visit: ${device.verification_uri}`,`Code: ${device.user_code}`].join(`
|
|
2
2
|
`),stylePromptTitle(`Authorize`));let expiresAt=Date.now()+device.expires_in*1e3,intervalMs=Math.max(1e3,device.interval*1e3),polling=spinner();polling.start(`Waiting for GitHub authorization...`);let accessToken=await pollForAccessToken({deviceCode:device.device_code,intervalMs,expiresAt});polling.stop(`GitHub access token acquired`),await upsertAuthProfile({profileId,credential:{type:`token`,provider:`github-copilot`,token:accessToken}}),await updateConfig(cfg=>applyAuthProfileConfig(cfg,{provider:`github-copilot`,profileId,mode:`token`})),logConfigUpdated(runtime),runtime.log(`Auth profile: ${profileId} (github-copilot/token)`),outro(`Done`)}const log=createSubsystemLogger(`plugins`);function resolvePluginProviders(params){return loadBuilderForceAgentsPlugins({config:params.config,workspaceDir:params.workspaceDir,logger:createPluginLoaderLogger(log)}).providers.map(entry=>entry.provider)}function isRemoteEnvironment(){return!!(process.env.SSH_CLIENT||process.env.SSH_TTY||process.env.SSH_CONNECTION||process.env.REMOTE_CONTAINERS||process.env.CODESPACES||process.platform===`linux`&&!process.env.DISPLAY&&!process.env.WAYLAND_DISPLAY&&!isWSLEnv())}const validateRequiredInput=value=>value.trim().length>0?void 0:`Required`;function createVpsAwareOAuthHandlers(params){let manualPromptMessage=params.manualPromptMessage??`Paste the redirect URL`,manualCodePromise;return{onAuth:async({url})=>{if(params.isRemote){params.spin.stop(`OAuth URL ready`),params.runtime.log(`\nOpen this URL in your LOCAL browser:\n\n${url}\n`),manualCodePromise=params.prompter.text({message:manualPromptMessage,validate:validateRequiredInput}).then(value=>String(value));return}params.spin.update(params.localBrowserMessage),await params.openUrl(url),params.runtime.log(`Open: ${url}`)},onPrompt:async prompt=>{if(manualCodePromise)return manualCodePromise;let code=await params.prompter.text({message:prompt.message,placeholder:prompt.placeholder,validate:validateRequiredInput});return String(code)}}}function resolveProviderMatch(providers,rawProvider){let raw=rawProvider?.trim();if(!raw)return null;let normalized=normalizeProviderId(raw);return providers.find(provider=>normalizeProviderId(provider.id)===normalized)??providers.find(provider=>provider.aliases?.some(alias=>normalizeProviderId(alias)===normalized)??!1)??null}function pickAuthMethod(provider,rawMethod){let raw=rawMethod?.trim();if(!raw)return null;let normalized=raw.toLowerCase();return provider.auth.find(method=>method.id.toLowerCase()===normalized)??provider.auth.find(method=>method.label.toLowerCase()===normalized)??null}function isPlainRecord(value){return!!(value&&typeof value==`object`&&!Array.isArray(value))}function mergeConfigPatch(base,patch){if(!isPlainRecord(base)||!isPlainRecord(patch))return patch;let next={...base};for(let[key,value]of Object.entries(patch)){let existing=next[key];isPlainRecord(existing)&&isPlainRecord(value)?next[key]=mergeConfigPatch(existing,value):next[key]=value}return next}function applyDefaultModel(cfg,model){let models={...cfg.agents?.defaults?.models};models[model]=models[model]??{};let existingModel=cfg.agents?.defaults?.model;return{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,models,model:{...existingModel&&typeof existingModel==`object`&&`fallbacks`in existingModel?{fallbacks:existingModel.fallbacks}:void 0,primary:model}}}}}export{createVpsAwareOAuthHandlers as a,githubCopilotLoginCommand as c,resolveProviderMatch as i,mergeConfigPatch as n,isRemoteEnvironment as o,pickAuthMethod as r,resolvePluginProviders as s,applyDefaultModel as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-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"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-O-iC_P5t.js";import"./message-channel-z5YRpR2d.js";import{L as dispatchReplyWithBufferedBlockDispatcher,R as dispatchReplyWithDispatcher}from"./subagent-registry-
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-CuAFgjuQ.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-C8c9naq-.js";import"./io-CsCa3_1Z.js";import"./manifest-registry-009gLJ4l.js";import"./config-DmxNxDRW.js";import"./model-discovery-RTHjxEvZ.js";import"./model-catalog-D8OQ7p7I.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-O-iC_P5t.js";import"./message-channel-z5YRpR2d.js";import{L as dispatchReplyWithBufferedBlockDispatcher,R as dispatchReplyWithDispatcher}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"./sqlite-CIGM1WKg.js";import"./memory-cli-CiwWAhp5.js";import"./manager-Bjb9ptCz.js";import"./gemini-auth-KBXMhaRQ.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import"./runner-DwPaM8kz.js";import"./tool-display-Cs4hDP1f.js";import"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-tquUDu_7.js";import"./session-utils-D2_j4c6U.js";import"./coding-tools.policy-BwdtwuXY.js";import"./pairing-store-BCsvhT6-.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-DsI3qJRy.js";import"./send-BOSlm5fG.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-BdK18hVI.js";import"./control-service-Ca0CBlhO.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-BOBan2eG.js";import"./resolve-route-DEIW5uKy.js";import"./channel-activity-DX36RadH.js";import"./tables-CojSfTth.js";import"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DATdLu15.js";import"./onboard-helpers-D2vxAtv8.js";import"./prompt-style-BMWmaqSC.js";import"./pairing-labels-BUXpRejW.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-DJt_RpLC.js";import"./transformers-stream-Buj40qHl.js";export{dispatchReplyWithBufferedBlockDispatcher,dispatchReplyWithDispatcher};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-2fP2Yq8h.js";import{bn as dispatchReplyWithDispatcher,yn as dispatchReplyWithBufferedBlockDispatcher}from"./reply-
|
|
1
|
+
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-2fP2Yq8h.js";import{bn as dispatchReplyWithDispatcher,yn as dispatchReplyWithBufferedBlockDispatcher}from"./reply-BuUSdq2L.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./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"./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"./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"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import"./resolve-route-D49haUnv.js";import"./replies-DAwcEPGb.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-COe2xa9K.js";import"./send-BIMaIwQV.js";import"./onboard-helpers-BmYUjl4j.js";import"./prompt-style-BpVK43GK.js";import"./pairing-labels-CD0lPAfY.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-QGVVADJa.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-BLpMH93w.js";import"./control-service-DKBAemtq.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-BQuRdgMU.js";import"./transformers-stream-D7nRu4Qu.js";export{dispatchReplyWithBufferedBlockDispatcher,dispatchReplyWithDispatcher};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import{k as isVerbose}from"./utils-BP60e80M.js";import{s as shouldLogSubsystemToConsole,t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{C as parseAgentSessionKey}from"./session-key-CksCYipj.js";import{Dn as readJsonFile,En as createAsyncLock,On as writeJsonAtomic,Yn as estimateBase64DecodedBytes,x as sniffMimeFromBase64}from"./subagent-registry-Cj5yC7B4.js";import{n as redactSensitiveText,t as getDefaultRedactPatterns}from"./redact-CgO7wehS.js";import path from"node:path";import chalk from"chalk";import{createHash,createPrivateKey,sign}from"node:crypto";import fs from"node:fs/promises";import http2 from"node:http2";let gatewayWsLogStyle=`auto`;function setGatewayWsLogStyle(style){gatewayWsLogStyle=style}function getGatewayWsLogStyle(){return gatewayWsLogStyle}const UUID_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,WS_LOG_REDACT_OPTIONS={mode:`tools`,patterns:getDefaultRedactPatterns()},wsInflightCompact=new Map;let wsLastCompactConnId;const wsInflightOptimized=new Map,wsInflightSince=new Map,wsLog=createSubsystemLogger(`gateway/ws`),WS_META_SKIP_KEYS=new Set([`connId`,`id`,`method`,`ok`,`event`]);function collectWsRestMeta(meta){let restMeta=[];if(!meta)return restMeta;for(let[key,value]of Object.entries(meta))value!==void 0&&(WS_META_SKIP_KEYS.has(key)||restMeta.push(`${chalk.dim(key)}=${formatForLog(value)}`));return restMeta}function buildWsHeadline(params){if((params.kind===`req`||params.kind===`res`)&¶ms.method)return chalk.bold(params.method);if(params.kind===`event`&¶ms.event)return chalk.bold(params.event)}function buildWsStatusToken(kind,ok){if(!(kind!==`res`||ok===void 0))return ok?chalk.greenBright(`✓`):chalk.redBright(`✗`)}function logWsInfoLine(params){let tokens=[params.prefix,params.statusToken,params.headline,params.durationToken,...params.restMeta,...params.trailing].filter(t=>!!t);wsLog.info(tokens.join(` `))}function shouldLogWs(){return shouldLogSubsystemToConsole(`gateway/ws`)}function shortId(value){let s=value.trim();return UUID_RE.test(s)?`${s.slice(0,8)}…${s.slice(-4)}`:s.length<=24?s:`${s.slice(0,12)}…${s.slice(-4)}`}function formatForLog(value){try{if(value instanceof Error){let parts=[];value.name&&parts.push(value.name),value.message&&parts.push(value.message);let code=`code`in value&&(typeof value.code==`string`||typeof value.code==`number`)?String(value.code):``;code&&parts.push(`code=${code}`);let combined=parts.filter(Boolean).join(`: `).trim();if(combined)return combined.length>240?`${combined.slice(0,240)}...`:combined}if(value&&typeof value==`object`){let rec=value;if(typeof rec.message==`string`&&rec.message.trim()){let name=typeof rec.name==`string`?rec.name.trim():``,code=typeof rec.code==`string`||typeof rec.code==`number`?String(rec.code):``,parts=[name,rec.message.trim()].filter(Boolean);code&&parts.push(`code=${code}`);let combined=parts.join(`: `).trim();return combined.length>240?`${combined.slice(0,240)}...`:combined}}let str=typeof value==`string`||typeof value==`number`?String(value):JSON.stringify(value);if(!str)return``;let redacted=redactSensitiveText(str,WS_LOG_REDACT_OPTIONS);return redacted.length>240?`${redacted.slice(0,240)}...`:redacted}catch{return String(value)}}function compactPreview(input,maxLen=160){let oneLine=input.replace(/\s+/g,` `).trim();return oneLine.length<=maxLen?oneLine:`${oneLine.slice(0,Math.max(0,maxLen-1))}…`}function summarizeAgentEventForWsLog(payload){if(!payload||typeof payload!=`object`)return{};let rec=payload,runId=typeof rec.runId==`string`?rec.runId:void 0,stream=typeof rec.stream==`string`?rec.stream:void 0,seq=typeof rec.seq==`number`?rec.seq:void 0,sessionKey=typeof rec.sessionKey==`string`?rec.sessionKey:void 0,data=rec.data&&typeof rec.data==`object`?rec.data:void 0,extra={};if(runId&&(extra.run=shortId(runId)),sessionKey){let parsed=parseAgentSessionKey(sessionKey);parsed?(extra.agent=parsed.agentId,extra.session=parsed.rest):extra.session=sessionKey}if(stream&&(extra.stream=stream),seq!==void 0&&(extra.aseq=seq),!data)return extra;if(stream===`assistant`){let text=typeof data.text==`string`?data.text:void 0;text?.trim()&&(extra.text=compactPreview(text));let mediaUrls=Array.isArray(data.mediaUrls)?data.mediaUrls:void 0;return mediaUrls&&mediaUrls.length>0&&(extra.media=mediaUrls.length),extra}if(stream===`tool`){let phase=typeof data.phase==`string`?data.phase:void 0,name=typeof data.name==`string`?data.name:void 0;(phase||name)&&(extra.tool=`${phase??`?`}:${name??`?`}`);let toolCallId=typeof data.toolCallId==`string`?data.toolCallId:void 0;toolCallId&&(extra.call=shortId(toolCallId));let meta=typeof data.meta==`string`?data.meta:void 0;return meta?.trim()&&(extra.meta=meta),typeof data.isError==`boolean`&&(extra.err=data.isError),extra}if(stream===`lifecycle`){let phase=typeof data.phase==`string`?data.phase:void 0;phase&&(extra.phase=phase),typeof data.aborted==`boolean`&&(extra.aborted=data.aborted);let error=typeof data.error==`string`?data.error:void 0;return error?.trim()&&(extra.error=compactPreview(error,120)),extra}let reason=typeof data.reason==`string`?data.reason:void 0;return reason?.trim()&&(extra.reason=reason),extra}function logWs(direction,kind,meta){if(!shouldLogSubsystemToConsole(`gateway/ws`))return;let style=getGatewayWsLogStyle();if(!isVerbose()){logWsOptimized(direction,kind,meta);return}if(style===`compact`||style===`auto`){logWsCompact(direction,kind,meta);return}let now=Date.now(),connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,method=typeof meta?.method==`string`?meta.method:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,event=typeof meta?.event==`string`?meta.event:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;direction===`in`&&kind===`req`&&inflightKey&&wsInflightSince.set(inflightKey,now);let durationMs=direction===`out`&&kind===`res`&&inflightKey?(()=>{let startedAt=wsInflightSince.get(inflightKey);if(startedAt!==void 0)return wsInflightSince.delete(inflightKey),now-startedAt})():void 0,dirArrow=direction===`in`?`←`:`→`,prefix=`${(direction===`in`?chalk.greenBright:chalk.cyanBright)(dirArrow)} ${chalk.bold(kind)}`,headline=buildWsHeadline({kind,method,event}),statusToken=buildWsStatusToken(kind,ok),durationToken=typeof durationMs==`number`?chalk.dim(`${durationMs}ms`):void 0,restMeta=collectWsRestMeta(meta),trailing=[];connId&&trailing.push(`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`),id&&trailing.push(`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`),logWsInfoLine({prefix,statusToken,headline,durationToken,restMeta,trailing})}function logWsOptimized(direction,kind,meta){let connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,method=typeof meta?.method==`string`?meta.method:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;if(direction===`in`&&kind===`req`&&inflightKey){wsInflightOptimized.set(inflightKey,Date.now()),wsInflightOptimized.size>2e3&&wsInflightOptimized.clear();return}if(kind===`parse-error`){let errorMsg=typeof meta?.error==`string`?formatForLog(meta.error):void 0;wsLog.warn([`${chalk.redBright(`✗`)} ${chalk.bold(`parse-error`)}`,errorMsg?`${chalk.dim(`error`)}=${errorMsg}`:void 0,`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId??`?`))}`].filter(t=>!!t).join(` `));return}if(direction!==`out`||kind!==`res`){if(kind===`event`&&direction===`out`&&(typeof meta?.event==`string`?meta.event:void 0)===`agent`){let stream=typeof meta?.stream==`string`?meta.stream:void 0,tool=typeof meta?.tool==`string`?meta.tool:void 0,phase=typeof meta?.phase==`string`?meta.phase:void 0,run=typeof meta?.run==`string`?meta.run:void 0,agent=typeof meta?.agent==`string`?meta.agent:void 0,tokens=[`${chalk.cyanBright(`→`)} ${chalk.bold(`agent`)}`,stream?`${chalk.dim(`stream`)}=${stream}`:void 0,tool?`${chalk.dim(`tool`)}=${tool}`:void 0,phase?`${chalk.dim(`phase`)}=${phase}`:void 0,agent?`${chalk.dim(`agent`)}=${agent}`:void 0,run?`${chalk.dim(`run`)}=${chalk.gray(run)}`:void 0].filter(t=>!!t);wsLog.info(tokens.join(` `))}return}let startedAt=inflightKey?wsInflightOptimized.get(inflightKey):void 0;inflightKey&&wsInflightOptimized.delete(inflightKey);let durationMs=typeof startedAt==`number`?Date.now()-startedAt:void 0;if(!(ok===!1||typeof durationMs==`number`&&durationMs>=50))return;let statusToken=buildWsStatusToken(`res`,ok),durationToken=typeof durationMs==`number`?chalk.dim(`${durationMs}ms`):void 0,restMeta=collectWsRestMeta(meta);logWsInfoLine({prefix:`${chalk.yellowBright(`⇄`)} ${chalk.bold(`res`)}`,statusToken,headline:method?chalk.bold(method):void 0,durationToken,restMeta,trailing:[connId?`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`:``,id?`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`:``].filter(Boolean)})}function logWsCompact(direction,kind,meta){let now=Date.now(),connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,method=typeof meta?.method==`string`?meta.method:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;if(kind===`req`&&direction===`in`&&inflightKey){wsInflightCompact.set(inflightKey,{ts:now,method,meta});return}let compactArrow=kind===`req`||kind===`res`?`⇄`:direction===`in`?`←`:`→`,prefix=`${(kind===`req`||kind===`res`?chalk.yellowBright:direction===`in`?chalk.greenBright:chalk.cyanBright)(compactArrow)} ${chalk.bold(kind)}`,statusToken=buildWsStatusToken(kind,ok),startedAt=kind===`res`&&direction===`out`&&inflightKey?wsInflightCompact.get(inflightKey)?.ts:void 0;kind===`res`&&direction===`out`&&inflightKey&&wsInflightCompact.delete(inflightKey);let durationToken=typeof startedAt==`number`?chalk.dim(`${now-startedAt}ms`):void 0,headline=buildWsHeadline({kind,method,event:typeof meta?.event==`string`?meta.event:void 0}),restMeta=collectWsRestMeta(meta),trailing=[];connId&&connId!==wsLastCompactConnId&&(trailing.push(`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`),wsLastCompactConnId=connId),id&&trailing.push(`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`),logWsInfoLine({prefix,statusToken,headline,durationToken,restMeta,trailing})}function normalizeMime(mime){if(mime)return mime.split(`;`)[0]?.trim().toLowerCase()||void 0}function isImageMime(mime){return typeof mime==`string`&&mime.startsWith(`image/`)}function isValidBase64(value){return value.length>0&&value.length%4==0&&/^[A-Za-z0-9+/]+={0,2}$/.test(value)}function normalizeAttachment(att,idx,opts){let mime=att.mimeType??``,content=att.content,label=att.fileName||att.type||`attachment-${idx+1}`;if(typeof content!=`string`)throw Error(`attachment ${label}: content must be base64 string`);if(opts.requireImageMime&&!mime.startsWith(`image/`))throw Error(`attachment ${label}: only image/* supported`);let base64=content.trim();if(opts.stripDataUrlPrefix){let dataUrlMatch=/^data:[^;]+;base64,(.*)$/.exec(base64);dataUrlMatch&&(base64=dataUrlMatch[1])}return{label,mime,base64}}function validateAttachmentBase64OrThrow(normalized,opts){if(!isValidBase64(normalized.base64))throw Error(`attachment ${normalized.label}: invalid base64 content`);let sizeBytes=estimateBase64DecodedBytes(normalized.base64);if(sizeBytes<=0||sizeBytes>opts.maxBytes)throw Error(`attachment ${normalized.label}: exceeds size limit (${sizeBytes} > ${opts.maxBytes} bytes)`);return sizeBytes}async function parseMessageWithAttachments(message,attachments,opts){let maxBytes=opts?.maxBytes??5e6,log=opts?.log;if(!attachments||attachments.length===0)return{message,images:[]};let images=[];for(let[idx,att]of attachments.entries()){if(!att)continue;let normalized=normalizeAttachment(att,idx,{stripDataUrlPrefix:!0,requireImageMime:!1});validateAttachmentBase64OrThrow(normalized,{maxBytes});let{base64:b64,label,mime}=normalized,providedMime=normalizeMime(mime),sniffedMime=normalizeMime(await sniffMimeFromBase64(b64));if(sniffedMime&&!isImageMime(sniffedMime)){log?.warn(`attachment ${label}: detected non-image (${sniffedMime}), dropping`);continue}if(!sniffedMime&&!isImageMime(providedMime)){log?.warn(`attachment ${label}: unable to detect image mime type, dropping`);continue}sniffedMime&&providedMime&&sniffedMime!==providedMime&&log?.warn(`attachment ${label}: mime mismatch (${providedMime} -> ${sniffedMime}), using sniffed`),images.push({type:`image`,data:b64,mimeType:sniffedMime??providedMime??mime})}return{message,images}}function normalizeRpcAttachmentsToChatAttachments(attachments){return attachments?.map(a=>({type:typeof a?.type==`string`?a.type:void 0,mimeType:typeof a?.mimeType==`string`?a.mimeType:void 0,fileName:typeof a?.fileName==`string`?a.fileName:void 0,content:typeof a?.content==`string`?a.content:ArrayBuffer.isView(a?.content)?Buffer.from(a.content.buffer,a.content.byteOffset,a.content.byteLength).toString(`base64`):a?.content instanceof ArrayBuffer?Buffer.from(a.content).toString(`base64`):void 0})).filter(a=>a.content)??[]}const withLock=createAsyncLock();let cachedJwt=null;function resolveApnsRegistrationPath(baseDir){let root=baseDir??resolveStateDir();return path.join(root,`push/apns-registrations.json`)}function normalizeNodeId(value){return value.trim()}function normalizeApnsToken(value){return value.trim().replace(/[<>\s]/g,``).toLowerCase()}function normalizeTopic(value){return value.trim()}function isLikelyApnsToken(value){return/^[0-9a-f]{32,}$/i.test(value)}function parseReason(body){let trimmed=body.trim();if(trimmed)try{let parsed=JSON.parse(trimmed);return typeof parsed.reason==`string`&&parsed.reason.trim().length>0?parsed.reason.trim():trimmed.slice(0,200)}catch{return trimmed.slice(0,200)}}function toBase64UrlBytes(value){return Buffer.from(value).toString(`base64`).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/g,``)}function toBase64UrlJson(value){return toBase64UrlBytes(Buffer.from(JSON.stringify(value)))}function getJwtCacheKey(auth){let keyHash=createHash(`sha256`).update(auth.privateKey).digest(`hex`);return`${auth.teamId}:${auth.keyId}:${keyHash}`}function getApnsBearerToken(auth,nowMs=Date.now()){let cacheKey=getJwtCacheKey(auth);if(cachedJwt&&cachedJwt.cacheKey===cacheKey&&nowMs<cachedJwt.expiresAtMs)return cachedJwt.token;let iat=Math.floor(nowMs/1e3),signingInput=`${toBase64UrlJson({alg:`ES256`,kid:auth.keyId,typ:`JWT`})}.${toBase64UrlJson({iss:auth.teamId,iat})}`,token=`${signingInput}.${toBase64UrlBytes(sign(`sha256`,Buffer.from(signingInput,`utf8`),{key:createPrivateKey(auth.privateKey),dsaEncoding:`ieee-p1363`}))}`;return cachedJwt={cacheKey,token,expiresAtMs:nowMs+3e6},token}function normalizePrivateKey(value){return value.trim().replace(/\\n/g,`
|
|
1
|
+
import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import{k as isVerbose}from"./utils-BP60e80M.js";import{s as shouldLogSubsystemToConsole,t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{C as parseAgentSessionKey}from"./session-key-CksCYipj.js";import{Dn as readJsonFile,En as createAsyncLock,On as writeJsonAtomic,Yn as estimateBase64DecodedBytes,x as sniffMimeFromBase64}from"./subagent-registry-m_x-JRkR.js";import{n as redactSensitiveText,t as getDefaultRedactPatterns}from"./redact-CgO7wehS.js";import path from"node:path";import chalk from"chalk";import{createHash,createPrivateKey,sign}from"node:crypto";import fs from"node:fs/promises";import http2 from"node:http2";let gatewayWsLogStyle=`auto`;function setGatewayWsLogStyle(style){gatewayWsLogStyle=style}function getGatewayWsLogStyle(){return gatewayWsLogStyle}const UUID_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,WS_LOG_REDACT_OPTIONS={mode:`tools`,patterns:getDefaultRedactPatterns()},wsInflightCompact=new Map;let wsLastCompactConnId;const wsInflightOptimized=new Map,wsInflightSince=new Map,wsLog=createSubsystemLogger(`gateway/ws`),WS_META_SKIP_KEYS=new Set([`connId`,`id`,`method`,`ok`,`event`]);function collectWsRestMeta(meta){let restMeta=[];if(!meta)return restMeta;for(let[key,value]of Object.entries(meta))value!==void 0&&(WS_META_SKIP_KEYS.has(key)||restMeta.push(`${chalk.dim(key)}=${formatForLog(value)}`));return restMeta}function buildWsHeadline(params){if((params.kind===`req`||params.kind===`res`)&¶ms.method)return chalk.bold(params.method);if(params.kind===`event`&¶ms.event)return chalk.bold(params.event)}function buildWsStatusToken(kind,ok){if(!(kind!==`res`||ok===void 0))return ok?chalk.greenBright(`✓`):chalk.redBright(`✗`)}function logWsInfoLine(params){let tokens=[params.prefix,params.statusToken,params.headline,params.durationToken,...params.restMeta,...params.trailing].filter(t=>!!t);wsLog.info(tokens.join(` `))}function shouldLogWs(){return shouldLogSubsystemToConsole(`gateway/ws`)}function shortId(value){let s=value.trim();return UUID_RE.test(s)?`${s.slice(0,8)}…${s.slice(-4)}`:s.length<=24?s:`${s.slice(0,12)}…${s.slice(-4)}`}function formatForLog(value){try{if(value instanceof Error){let parts=[];value.name&&parts.push(value.name),value.message&&parts.push(value.message);let code=`code`in value&&(typeof value.code==`string`||typeof value.code==`number`)?String(value.code):``;code&&parts.push(`code=${code}`);let combined=parts.filter(Boolean).join(`: `).trim();if(combined)return combined.length>240?`${combined.slice(0,240)}...`:combined}if(value&&typeof value==`object`){let rec=value;if(typeof rec.message==`string`&&rec.message.trim()){let name=typeof rec.name==`string`?rec.name.trim():``,code=typeof rec.code==`string`||typeof rec.code==`number`?String(rec.code):``,parts=[name,rec.message.trim()].filter(Boolean);code&&parts.push(`code=${code}`);let combined=parts.join(`: `).trim();return combined.length>240?`${combined.slice(0,240)}...`:combined}}let str=typeof value==`string`||typeof value==`number`?String(value):JSON.stringify(value);if(!str)return``;let redacted=redactSensitiveText(str,WS_LOG_REDACT_OPTIONS);return redacted.length>240?`${redacted.slice(0,240)}...`:redacted}catch{return String(value)}}function compactPreview(input,maxLen=160){let oneLine=input.replace(/\s+/g,` `).trim();return oneLine.length<=maxLen?oneLine:`${oneLine.slice(0,Math.max(0,maxLen-1))}…`}function summarizeAgentEventForWsLog(payload){if(!payload||typeof payload!=`object`)return{};let rec=payload,runId=typeof rec.runId==`string`?rec.runId:void 0,stream=typeof rec.stream==`string`?rec.stream:void 0,seq=typeof rec.seq==`number`?rec.seq:void 0,sessionKey=typeof rec.sessionKey==`string`?rec.sessionKey:void 0,data=rec.data&&typeof rec.data==`object`?rec.data:void 0,extra={};if(runId&&(extra.run=shortId(runId)),sessionKey){let parsed=parseAgentSessionKey(sessionKey);parsed?(extra.agent=parsed.agentId,extra.session=parsed.rest):extra.session=sessionKey}if(stream&&(extra.stream=stream),seq!==void 0&&(extra.aseq=seq),!data)return extra;if(stream===`assistant`){let text=typeof data.text==`string`?data.text:void 0;text?.trim()&&(extra.text=compactPreview(text));let mediaUrls=Array.isArray(data.mediaUrls)?data.mediaUrls:void 0;return mediaUrls&&mediaUrls.length>0&&(extra.media=mediaUrls.length),extra}if(stream===`tool`){let phase=typeof data.phase==`string`?data.phase:void 0,name=typeof data.name==`string`?data.name:void 0;(phase||name)&&(extra.tool=`${phase??`?`}:${name??`?`}`);let toolCallId=typeof data.toolCallId==`string`?data.toolCallId:void 0;toolCallId&&(extra.call=shortId(toolCallId));let meta=typeof data.meta==`string`?data.meta:void 0;return meta?.trim()&&(extra.meta=meta),typeof data.isError==`boolean`&&(extra.err=data.isError),extra}if(stream===`lifecycle`){let phase=typeof data.phase==`string`?data.phase:void 0;phase&&(extra.phase=phase),typeof data.aborted==`boolean`&&(extra.aborted=data.aborted);let error=typeof data.error==`string`?data.error:void 0;return error?.trim()&&(extra.error=compactPreview(error,120)),extra}let reason=typeof data.reason==`string`?data.reason:void 0;return reason?.trim()&&(extra.reason=reason),extra}function logWs(direction,kind,meta){if(!shouldLogSubsystemToConsole(`gateway/ws`))return;let style=getGatewayWsLogStyle();if(!isVerbose()){logWsOptimized(direction,kind,meta);return}if(style===`compact`||style===`auto`){logWsCompact(direction,kind,meta);return}let now=Date.now(),connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,method=typeof meta?.method==`string`?meta.method:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,event=typeof meta?.event==`string`?meta.event:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;direction===`in`&&kind===`req`&&inflightKey&&wsInflightSince.set(inflightKey,now);let durationMs=direction===`out`&&kind===`res`&&inflightKey?(()=>{let startedAt=wsInflightSince.get(inflightKey);if(startedAt!==void 0)return wsInflightSince.delete(inflightKey),now-startedAt})():void 0,dirArrow=direction===`in`?`←`:`→`,prefix=`${(direction===`in`?chalk.greenBright:chalk.cyanBright)(dirArrow)} ${chalk.bold(kind)}`,headline=buildWsHeadline({kind,method,event}),statusToken=buildWsStatusToken(kind,ok),durationToken=typeof durationMs==`number`?chalk.dim(`${durationMs}ms`):void 0,restMeta=collectWsRestMeta(meta),trailing=[];connId&&trailing.push(`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`),id&&trailing.push(`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`),logWsInfoLine({prefix,statusToken,headline,durationToken,restMeta,trailing})}function logWsOptimized(direction,kind,meta){let connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,method=typeof meta?.method==`string`?meta.method:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;if(direction===`in`&&kind===`req`&&inflightKey){wsInflightOptimized.set(inflightKey,Date.now()),wsInflightOptimized.size>2e3&&wsInflightOptimized.clear();return}if(kind===`parse-error`){let errorMsg=typeof meta?.error==`string`?formatForLog(meta.error):void 0;wsLog.warn([`${chalk.redBright(`✗`)} ${chalk.bold(`parse-error`)}`,errorMsg?`${chalk.dim(`error`)}=${errorMsg}`:void 0,`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId??`?`))}`].filter(t=>!!t).join(` `));return}if(direction!==`out`||kind!==`res`){if(kind===`event`&&direction===`out`&&(typeof meta?.event==`string`?meta.event:void 0)===`agent`){let stream=typeof meta?.stream==`string`?meta.stream:void 0,tool=typeof meta?.tool==`string`?meta.tool:void 0,phase=typeof meta?.phase==`string`?meta.phase:void 0,run=typeof meta?.run==`string`?meta.run:void 0,agent=typeof meta?.agent==`string`?meta.agent:void 0,tokens=[`${chalk.cyanBright(`→`)} ${chalk.bold(`agent`)}`,stream?`${chalk.dim(`stream`)}=${stream}`:void 0,tool?`${chalk.dim(`tool`)}=${tool}`:void 0,phase?`${chalk.dim(`phase`)}=${phase}`:void 0,agent?`${chalk.dim(`agent`)}=${agent}`:void 0,run?`${chalk.dim(`run`)}=${chalk.gray(run)}`:void 0].filter(t=>!!t);wsLog.info(tokens.join(` `))}return}let startedAt=inflightKey?wsInflightOptimized.get(inflightKey):void 0;inflightKey&&wsInflightOptimized.delete(inflightKey);let durationMs=typeof startedAt==`number`?Date.now()-startedAt:void 0;if(!(ok===!1||typeof durationMs==`number`&&durationMs>=50))return;let statusToken=buildWsStatusToken(`res`,ok),durationToken=typeof durationMs==`number`?chalk.dim(`${durationMs}ms`):void 0,restMeta=collectWsRestMeta(meta);logWsInfoLine({prefix:`${chalk.yellowBright(`⇄`)} ${chalk.bold(`res`)}`,statusToken,headline:method?chalk.bold(method):void 0,durationToken,restMeta,trailing:[connId?`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`:``,id?`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`:``].filter(Boolean)})}function logWsCompact(direction,kind,meta){let now=Date.now(),connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,method=typeof meta?.method==`string`?meta.method:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;if(kind===`req`&&direction===`in`&&inflightKey){wsInflightCompact.set(inflightKey,{ts:now,method,meta});return}let compactArrow=kind===`req`||kind===`res`?`⇄`:direction===`in`?`←`:`→`,prefix=`${(kind===`req`||kind===`res`?chalk.yellowBright:direction===`in`?chalk.greenBright:chalk.cyanBright)(compactArrow)} ${chalk.bold(kind)}`,statusToken=buildWsStatusToken(kind,ok),startedAt=kind===`res`&&direction===`out`&&inflightKey?wsInflightCompact.get(inflightKey)?.ts:void 0;kind===`res`&&direction===`out`&&inflightKey&&wsInflightCompact.delete(inflightKey);let durationToken=typeof startedAt==`number`?chalk.dim(`${now-startedAt}ms`):void 0,headline=buildWsHeadline({kind,method,event:typeof meta?.event==`string`?meta.event:void 0}),restMeta=collectWsRestMeta(meta),trailing=[];connId&&connId!==wsLastCompactConnId&&(trailing.push(`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`),wsLastCompactConnId=connId),id&&trailing.push(`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`),logWsInfoLine({prefix,statusToken,headline,durationToken,restMeta,trailing})}function normalizeMime(mime){if(mime)return mime.split(`;`)[0]?.trim().toLowerCase()||void 0}function isImageMime(mime){return typeof mime==`string`&&mime.startsWith(`image/`)}function isValidBase64(value){return value.length>0&&value.length%4==0&&/^[A-Za-z0-9+/]+={0,2}$/.test(value)}function normalizeAttachment(att,idx,opts){let mime=att.mimeType??``,content=att.content,label=att.fileName||att.type||`attachment-${idx+1}`;if(typeof content!=`string`)throw Error(`attachment ${label}: content must be base64 string`);if(opts.requireImageMime&&!mime.startsWith(`image/`))throw Error(`attachment ${label}: only image/* supported`);let base64=content.trim();if(opts.stripDataUrlPrefix){let dataUrlMatch=/^data:[^;]+;base64,(.*)$/.exec(base64);dataUrlMatch&&(base64=dataUrlMatch[1])}return{label,mime,base64}}function validateAttachmentBase64OrThrow(normalized,opts){if(!isValidBase64(normalized.base64))throw Error(`attachment ${normalized.label}: invalid base64 content`);let sizeBytes=estimateBase64DecodedBytes(normalized.base64);if(sizeBytes<=0||sizeBytes>opts.maxBytes)throw Error(`attachment ${normalized.label}: exceeds size limit (${sizeBytes} > ${opts.maxBytes} bytes)`);return sizeBytes}async function parseMessageWithAttachments(message,attachments,opts){let maxBytes=opts?.maxBytes??5e6,log=opts?.log;if(!attachments||attachments.length===0)return{message,images:[]};let images=[];for(let[idx,att]of attachments.entries()){if(!att)continue;let normalized=normalizeAttachment(att,idx,{stripDataUrlPrefix:!0,requireImageMime:!1});validateAttachmentBase64OrThrow(normalized,{maxBytes});let{base64:b64,label,mime}=normalized,providedMime=normalizeMime(mime),sniffedMime=normalizeMime(await sniffMimeFromBase64(b64));if(sniffedMime&&!isImageMime(sniffedMime)){log?.warn(`attachment ${label}: detected non-image (${sniffedMime}), dropping`);continue}if(!sniffedMime&&!isImageMime(providedMime)){log?.warn(`attachment ${label}: unable to detect image mime type, dropping`);continue}sniffedMime&&providedMime&&sniffedMime!==providedMime&&log?.warn(`attachment ${label}: mime mismatch (${providedMime} -> ${sniffedMime}), using sniffed`),images.push({type:`image`,data:b64,mimeType:sniffedMime??providedMime??mime})}return{message,images}}function normalizeRpcAttachmentsToChatAttachments(attachments){return attachments?.map(a=>({type:typeof a?.type==`string`?a.type:void 0,mimeType:typeof a?.mimeType==`string`?a.mimeType:void 0,fileName:typeof a?.fileName==`string`?a.fileName:void 0,content:typeof a?.content==`string`?a.content:ArrayBuffer.isView(a?.content)?Buffer.from(a.content.buffer,a.content.byteOffset,a.content.byteLength).toString(`base64`):a?.content instanceof ArrayBuffer?Buffer.from(a.content).toString(`base64`):void 0})).filter(a=>a.content)??[]}const withLock=createAsyncLock();let cachedJwt=null;function resolveApnsRegistrationPath(baseDir){let root=baseDir??resolveStateDir();return path.join(root,`push/apns-registrations.json`)}function normalizeNodeId(value){return value.trim()}function normalizeApnsToken(value){return value.trim().replace(/[<>\s]/g,``).toLowerCase()}function normalizeTopic(value){return value.trim()}function isLikelyApnsToken(value){return/^[0-9a-f]{32,}$/i.test(value)}function parseReason(body){let trimmed=body.trim();if(trimmed)try{let parsed=JSON.parse(trimmed);return typeof parsed.reason==`string`&&parsed.reason.trim().length>0?parsed.reason.trim():trimmed.slice(0,200)}catch{return trimmed.slice(0,200)}}function toBase64UrlBytes(value){return Buffer.from(value).toString(`base64`).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/g,``)}function toBase64UrlJson(value){return toBase64UrlBytes(Buffer.from(JSON.stringify(value)))}function getJwtCacheKey(auth){let keyHash=createHash(`sha256`).update(auth.privateKey).digest(`hex`);return`${auth.teamId}:${auth.keyId}:${keyHash}`}function getApnsBearerToken(auth,nowMs=Date.now()){let cacheKey=getJwtCacheKey(auth);if(cachedJwt&&cachedJwt.cacheKey===cacheKey&&nowMs<cachedJwt.expiresAtMs)return cachedJwt.token;let iat=Math.floor(nowMs/1e3),signingInput=`${toBase64UrlJson({alg:`ES256`,kid:auth.keyId,typ:`JWT`})}.${toBase64UrlJson({iss:auth.teamId,iat})}`,token=`${signingInput}.${toBase64UrlBytes(sign(`sha256`,Buffer.from(signingInput,`utf8`),{key:createPrivateKey(auth.privateKey),dsaEncoding:`ieee-p1363`}))}`;return cachedJwt={cacheKey,token,expiresAtMs:nowMs+3e6},token}function normalizePrivateKey(value){return value.trim().replace(/\\n/g,`
|
|
2
2
|
`)}function normalizeNonEmptyString(value){let trimmed=value?.trim()??``;return trimmed.length>0?trimmed:null}async function loadRegistrationsState(baseDir){let existing=await readJsonFile(resolveApnsRegistrationPath(baseDir));return!existing||typeof existing!=`object`?{registrationsByNodeId:{}}:{registrationsByNodeId:existing.registrationsByNodeId&&typeof existing.registrationsByNodeId==`object`&&!Array.isArray(existing.registrationsByNodeId)?existing.registrationsByNodeId:{}}}async function persistRegistrationsState(state,baseDir){await writeJsonAtomic(resolveApnsRegistrationPath(baseDir),state)}function normalizeApnsEnvironment(value){if(typeof value!=`string`)return null;let normalized=value.trim().toLowerCase();return normalized===`sandbox`||normalized===`production`?normalized:null}async function registerApnsToken(params){let nodeId=normalizeNodeId(params.nodeId),token=normalizeApnsToken(params.token),topic=normalizeTopic(params.topic),environment=normalizeApnsEnvironment(params.environment)??`sandbox`;if(!nodeId)throw Error(`nodeId required`);if(!topic)throw Error(`topic required`);if(!isLikelyApnsToken(token))throw Error(`invalid APNs token`);return await withLock(async()=>{let state=await loadRegistrationsState(params.baseDir),next={nodeId,token,topic,environment,updatedAtMs:Date.now()};return state.registrationsByNodeId[nodeId]=next,await persistRegistrationsState(state,params.baseDir),next})}async function loadApnsRegistration(nodeId,baseDir){let normalizedNodeId=normalizeNodeId(nodeId);return normalizedNodeId?(await loadRegistrationsState(baseDir)).registrationsByNodeId[normalizedNodeId]??null:null}async function resolveApnsAuthConfigFromEnv(env=process.env){let teamId=normalizeNonEmptyString(env.BUILDERFORCE_AGENTS_APNS_TEAM_ID),keyId=normalizeNonEmptyString(env.BUILDERFORCE_AGENTS_APNS_KEY_ID);if(!teamId||!keyId)return{ok:!1,error:`APNs auth missing: set BUILDERFORCE_AGENTS_APNS_TEAM_ID and BUILDERFORCE_AGENTS_APNS_KEY_ID`};let inlineKeyRaw=normalizeNonEmptyString(env.BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY_P8)??normalizeNonEmptyString(env.BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY);if(inlineKeyRaw)return{ok:!0,value:{teamId,keyId,privateKey:normalizePrivateKey(inlineKeyRaw)}};let keyPath=normalizeNonEmptyString(env.BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY_PATH);if(!keyPath)return{ok:!1,error:`APNs private key missing: set BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY_P8 or BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY_PATH`};try{return{ok:!0,value:{teamId,keyId,privateKey:normalizePrivateKey(await fs.readFile(keyPath,`utf8`))}}}catch(err){return{ok:!1,error:`failed reading BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY_PATH (${keyPath}): ${err instanceof Error?err.message:String(err)}`}}}async function sendApnsRequest(params){let authority=params.environment===`production`?`https://api.push.apple.com`:`https://api.sandbox.push.apple.com`,body=JSON.stringify(params.payload),requestPath=`/3/device/${params.token}`;return await new Promise((resolve,reject)=>{let client=http2.connect(authority),settled=!1,fail=err=>{settled||(settled=!0,client.destroy(),reject(err))},finish=result=>{settled||(settled=!0,client.close(),resolve(result))};client.once(`error`,err=>fail(err));let req=client.request({":method":`POST`,":path":requestPath,authorization:`bearer ${params.bearerToken}`,"apns-topic":params.topic,"apns-push-type":params.pushType,"apns-priority":params.priority,"apns-expiration":`0`,"content-type":`application/json`,"content-length":Buffer.byteLength(body).toString()}),statusCode=0,apnsId,responseBody=``;req.setEncoding(`utf8`),req.setTimeout(params.timeoutMs,()=>{req.close(http2.constants.NGHTTP2_CANCEL),fail(Error(`APNs request timed out after ${params.timeoutMs}ms`))}),req.on(`response`,headers=>{let statusHeader=headers[`:status`];statusCode=typeof statusHeader==`number`?statusHeader:Number(statusHeader??0);let idHeader=headers[`apns-id`];typeof idHeader==`string`&&idHeader.trim().length>0&&(apnsId=idHeader.trim())}),req.on(`data`,chunk=>{typeof chunk==`string`&&(responseBody+=chunk)}),req.on(`end`,()=>{finish({status:statusCode,apnsId,body:responseBody})}),req.on(`error`,err=>fail(err)),req.end(body)})}function resolveApnsTimeoutMs(timeoutMs){return typeof timeoutMs==`number`&&Number.isFinite(timeoutMs)?Math.max(1e3,Math.trunc(timeoutMs)):1e4}function resolveApnsSendContext(params){let token=normalizeApnsToken(params.registration.token);if(!isLikelyApnsToken(token))throw Error(`invalid APNs token`);let topic=normalizeTopic(params.registration.topic);if(!topic)throw Error(`topic required`);return{token,topic,environment:params.registration.environment,bearerToken:getApnsBearerToken(params.auth)}}function toApnsPushResult(params){return{ok:params.response.status===200,status:params.response.status,apnsId:params.response.apnsId,reason:parseReason(params.response.body),tokenSuffix:params.token.slice(-8),topic:params.topic,environment:params.environment}}async function sendApnsAlert(params){let{token,topic,environment,bearerToken}=resolveApnsSendContext({auth:params.auth,registration:params.registration}),payload={aps:{alert:{title:params.title,body:params.body},sound:`default`},builderforce:{kind:`push.test`,nodeId:params.nodeId,ts:Date.now()}};return toApnsPushResult({response:await(params.requestSender??sendApnsRequest)({token,topic,environment,bearerToken,payload,timeoutMs:resolveApnsTimeoutMs(params.timeoutMs),pushType:`alert`,priority:`10`}),token,topic,environment})}async function sendApnsBackgroundWake(params){let{token,topic,environment,bearerToken}=resolveApnsSendContext({auth:params.auth,registration:params.registration}),payload={aps:{"content-available":1},builderforce:{kind:`node.wake`,reason:params.wakeReason??`node.invoke`,nodeId:params.nodeId,ts:Date.now()}};return toApnsPushResult({response:await(params.requestSender??sendApnsRequest)({token,topic,environment,bearerToken,payload,timeoutMs:resolveApnsTimeoutMs(params.timeoutMs),pushType:`background`,priority:`5`}),token,topic,environment})}export{sendApnsAlert as a,parseMessageWithAttachments as c,shouldLogWs as d,summarizeAgentEventForWsLog as f,resolveApnsAuthConfigFromEnv as i,formatForLog as l,normalizeApnsEnvironment as n,sendApnsBackgroundWake as o,setGatewayWsLogStyle as p,registerApnsToken as r,normalizeRpcAttachmentsToChatAttachments as s,loadApnsRegistration as t,logWs as u};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{A as isVerbose}from"./utils-DbaBVFaK.js";import{Ci as estimateBase64DecodedBytes,cn as writeJsonAtomic,on as createAsyncLock,sn as readJsonFile,x as sniffMimeFromBase64}from"./reply-D9wUWhMx.js";import{C as parseAgentSessionKey}from"./session-key-EoB0qaG9.js";import{l as shouldLogSubsystemToConsole,t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{n as redactSensitiveText,t as getDefaultRedactPatterns}from"./redact-BHdfp2MZ.js";import path from"node:path";import{createHash,createPrivateKey,sign}from"node:crypto";import chalk from"chalk";import fs from"node:fs/promises";import http2 from"node:http2";let gatewayWsLogStyle=`auto`;function setGatewayWsLogStyle(style){gatewayWsLogStyle=style}function getGatewayWsLogStyle(){return gatewayWsLogStyle}const UUID_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,WS_LOG_REDACT_OPTIONS={mode:`tools`,patterns:getDefaultRedactPatterns()},wsInflightCompact=new Map;let wsLastCompactConnId;const wsInflightOptimized=new Map,wsInflightSince=new Map,wsLog=createSubsystemLogger(`gateway/ws`),WS_META_SKIP_KEYS=new Set([`connId`,`id`,`method`,`ok`,`event`]);function collectWsRestMeta(meta){let restMeta=[];if(!meta)return restMeta;for(let[key,value]of Object.entries(meta))value!==void 0&&(WS_META_SKIP_KEYS.has(key)||restMeta.push(`${chalk.dim(key)}=${formatForLog(value)}`));return restMeta}function buildWsHeadline(params){if((params.kind===`req`||params.kind===`res`)&¶ms.method)return chalk.bold(params.method);if(params.kind===`event`&¶ms.event)return chalk.bold(params.event)}function buildWsStatusToken(kind,ok){if(!(kind!==`res`||ok===void 0))return ok?chalk.greenBright(`✓`):chalk.redBright(`✗`)}function logWsInfoLine(params){let tokens=[params.prefix,params.statusToken,params.headline,params.durationToken,...params.restMeta,...params.trailing].filter(t=>!!t);wsLog.info(tokens.join(` `))}function shouldLogWs(){return shouldLogSubsystemToConsole(`gateway/ws`)}function shortId(value){let s=value.trim();return UUID_RE.test(s)?`${s.slice(0,8)}…${s.slice(-4)}`:s.length<=24?s:`${s.slice(0,12)}…${s.slice(-4)}`}function formatForLog(value){try{if(value instanceof Error){let parts=[];value.name&&parts.push(value.name),value.message&&parts.push(value.message);let code=`code`in value&&(typeof value.code==`string`||typeof value.code==`number`)?String(value.code):``;code&&parts.push(`code=${code}`);let combined=parts.filter(Boolean).join(`: `).trim();if(combined)return combined.length>240?`${combined.slice(0,240)}...`:combined}if(value&&typeof value==`object`){let rec=value;if(typeof rec.message==`string`&&rec.message.trim()){let name=typeof rec.name==`string`?rec.name.trim():``,code=typeof rec.code==`string`||typeof rec.code==`number`?String(rec.code):``,parts=[name,rec.message.trim()].filter(Boolean);code&&parts.push(`code=${code}`);let combined=parts.join(`: `).trim();return combined.length>240?`${combined.slice(0,240)}...`:combined}}let str=typeof value==`string`||typeof value==`number`?String(value):JSON.stringify(value);if(!str)return``;let redacted=redactSensitiveText(str,WS_LOG_REDACT_OPTIONS);return redacted.length>240?`${redacted.slice(0,240)}...`:redacted}catch{return String(value)}}function compactPreview(input,maxLen=160){let oneLine=input.replace(/\s+/g,` `).trim();return oneLine.length<=maxLen?oneLine:`${oneLine.slice(0,Math.max(0,maxLen-1))}…`}function summarizeAgentEventForWsLog(payload){if(!payload||typeof payload!=`object`)return{};let rec=payload,runId=typeof rec.runId==`string`?rec.runId:void 0,stream=typeof rec.stream==`string`?rec.stream:void 0,seq=typeof rec.seq==`number`?rec.seq:void 0,sessionKey=typeof rec.sessionKey==`string`?rec.sessionKey:void 0,data=rec.data&&typeof rec.data==`object`?rec.data:void 0,extra={};if(runId&&(extra.run=shortId(runId)),sessionKey){let parsed=parseAgentSessionKey(sessionKey);parsed?(extra.agent=parsed.agentId,extra.session=parsed.rest):extra.session=sessionKey}if(stream&&(extra.stream=stream),seq!==void 0&&(extra.aseq=seq),!data)return extra;if(stream===`assistant`){let text=typeof data.text==`string`?data.text:void 0;text?.trim()&&(extra.text=compactPreview(text));let mediaUrls=Array.isArray(data.mediaUrls)?data.mediaUrls:void 0;return mediaUrls&&mediaUrls.length>0&&(extra.media=mediaUrls.length),extra}if(stream===`tool`){let phase=typeof data.phase==`string`?data.phase:void 0,name=typeof data.name==`string`?data.name:void 0;(phase||name)&&(extra.tool=`${phase??`?`}:${name??`?`}`);let toolCallId=typeof data.toolCallId==`string`?data.toolCallId:void 0;toolCallId&&(extra.call=shortId(toolCallId));let meta=typeof data.meta==`string`?data.meta:void 0;return meta?.trim()&&(extra.meta=meta),typeof data.isError==`boolean`&&(extra.err=data.isError),extra}if(stream===`lifecycle`){let phase=typeof data.phase==`string`?data.phase:void 0;phase&&(extra.phase=phase),typeof data.aborted==`boolean`&&(extra.aborted=data.aborted);let error=typeof data.error==`string`?data.error:void 0;return error?.trim()&&(extra.error=compactPreview(error,120)),extra}let reason=typeof data.reason==`string`?data.reason:void 0;return reason?.trim()&&(extra.reason=reason),extra}function logWs(direction,kind,meta){if(!shouldLogSubsystemToConsole(`gateway/ws`))return;let style=getGatewayWsLogStyle();if(!isVerbose()){logWsOptimized(direction,kind,meta);return}if(style===`compact`||style===`auto`){logWsCompact(direction,kind,meta);return}let now=Date.now(),connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,method=typeof meta?.method==`string`?meta.method:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,event=typeof meta?.event==`string`?meta.event:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;direction===`in`&&kind===`req`&&inflightKey&&wsInflightSince.set(inflightKey,now);let durationMs=direction===`out`&&kind===`res`&&inflightKey?(()=>{let startedAt=wsInflightSince.get(inflightKey);if(startedAt!==void 0)return wsInflightSince.delete(inflightKey),now-startedAt})():void 0,dirArrow=direction===`in`?`←`:`→`,prefix=`${(direction===`in`?chalk.greenBright:chalk.cyanBright)(dirArrow)} ${chalk.bold(kind)}`,headline=buildWsHeadline({kind,method,event}),statusToken=buildWsStatusToken(kind,ok),durationToken=typeof durationMs==`number`?chalk.dim(`${durationMs}ms`):void 0,restMeta=collectWsRestMeta(meta),trailing=[];connId&&trailing.push(`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`),id&&trailing.push(`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`),logWsInfoLine({prefix,statusToken,headline,durationToken,restMeta,trailing})}function logWsOptimized(direction,kind,meta){let connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,method=typeof meta?.method==`string`?meta.method:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;if(direction===`in`&&kind===`req`&&inflightKey){wsInflightOptimized.set(inflightKey,Date.now()),wsInflightOptimized.size>2e3&&wsInflightOptimized.clear();return}if(kind===`parse-error`){let errorMsg=typeof meta?.error==`string`?formatForLog(meta.error):void 0;wsLog.warn([`${chalk.redBright(`✗`)} ${chalk.bold(`parse-error`)}`,errorMsg?`${chalk.dim(`error`)}=${errorMsg}`:void 0,`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId??`?`))}`].filter(t=>!!t).join(` `));return}if(direction!==`out`||kind!==`res`){if(kind===`event`&&direction===`out`&&(typeof meta?.event==`string`?meta.event:void 0)===`agent`){let stream=typeof meta?.stream==`string`?meta.stream:void 0,tool=typeof meta?.tool==`string`?meta.tool:void 0,phase=typeof meta?.phase==`string`?meta.phase:void 0,run=typeof meta?.run==`string`?meta.run:void 0,agent=typeof meta?.agent==`string`?meta.agent:void 0,tokens=[`${chalk.cyanBright(`→`)} ${chalk.bold(`agent`)}`,stream?`${chalk.dim(`stream`)}=${stream}`:void 0,tool?`${chalk.dim(`tool`)}=${tool}`:void 0,phase?`${chalk.dim(`phase`)}=${phase}`:void 0,agent?`${chalk.dim(`agent`)}=${agent}`:void 0,run?`${chalk.dim(`run`)}=${chalk.gray(run)}`:void 0].filter(t=>!!t);wsLog.info(tokens.join(` `))}return}let startedAt=inflightKey?wsInflightOptimized.get(inflightKey):void 0;inflightKey&&wsInflightOptimized.delete(inflightKey);let durationMs=typeof startedAt==`number`?Date.now()-startedAt:void 0;if(!(ok===!1||typeof durationMs==`number`&&durationMs>=50))return;let statusToken=buildWsStatusToken(`res`,ok),durationToken=typeof durationMs==`number`?chalk.dim(`${durationMs}ms`):void 0,restMeta=collectWsRestMeta(meta);logWsInfoLine({prefix:`${chalk.yellowBright(`⇄`)} ${chalk.bold(`res`)}`,statusToken,headline:method?chalk.bold(method):void 0,durationToken,restMeta,trailing:[connId?`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`:``,id?`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`:``].filter(Boolean)})}function logWsCompact(direction,kind,meta){let now=Date.now(),connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,method=typeof meta?.method==`string`?meta.method:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;if(kind===`req`&&direction===`in`&&inflightKey){wsInflightCompact.set(inflightKey,{ts:now,method,meta});return}let compactArrow=kind===`req`||kind===`res`?`⇄`:direction===`in`?`←`:`→`,prefix=`${(kind===`req`||kind===`res`?chalk.yellowBright:direction===`in`?chalk.greenBright:chalk.cyanBright)(compactArrow)} ${chalk.bold(kind)}`,statusToken=buildWsStatusToken(kind,ok),startedAt=kind===`res`&&direction===`out`&&inflightKey?wsInflightCompact.get(inflightKey)?.ts:void 0;kind===`res`&&direction===`out`&&inflightKey&&wsInflightCompact.delete(inflightKey);let durationToken=typeof startedAt==`number`?chalk.dim(`${now-startedAt}ms`):void 0,headline=buildWsHeadline({kind,method,event:typeof meta?.event==`string`?meta.event:void 0}),restMeta=collectWsRestMeta(meta),trailing=[];connId&&connId!==wsLastCompactConnId&&(trailing.push(`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`),wsLastCompactConnId=connId),id&&trailing.push(`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`),logWsInfoLine({prefix,statusToken,headline,durationToken,restMeta,trailing})}function normalizeMime(mime){if(mime)return mime.split(`;`)[0]?.trim().toLowerCase()||void 0}function isImageMime(mime){return typeof mime==`string`&&mime.startsWith(`image/`)}function isValidBase64(value){return value.length>0&&value.length%4==0&&/^[A-Za-z0-9+/]+={0,2}$/.test(value)}function normalizeAttachment(att,idx,opts){let mime=att.mimeType??``,content=att.content,label=att.fileName||att.type||`attachment-${idx+1}`;if(typeof content!=`string`)throw Error(`attachment ${label}: content must be base64 string`);if(opts.requireImageMime&&!mime.startsWith(`image/`))throw Error(`attachment ${label}: only image/* supported`);let base64=content.trim();if(opts.stripDataUrlPrefix){let dataUrlMatch=/^data:[^;]+;base64,(.*)$/.exec(base64);dataUrlMatch&&(base64=dataUrlMatch[1])}return{label,mime,base64}}function validateAttachmentBase64OrThrow(normalized,opts){if(!isValidBase64(normalized.base64))throw Error(`attachment ${normalized.label}: invalid base64 content`);let sizeBytes=estimateBase64DecodedBytes(normalized.base64);if(sizeBytes<=0||sizeBytes>opts.maxBytes)throw Error(`attachment ${normalized.label}: exceeds size limit (${sizeBytes} > ${opts.maxBytes} bytes)`);return sizeBytes}async function parseMessageWithAttachments(message,attachments,opts){let maxBytes=opts?.maxBytes??5e6,log=opts?.log;if(!attachments||attachments.length===0)return{message,images:[]};let images=[];for(let[idx,att]of attachments.entries()){if(!att)continue;let normalized=normalizeAttachment(att,idx,{stripDataUrlPrefix:!0,requireImageMime:!1});validateAttachmentBase64OrThrow(normalized,{maxBytes});let{base64:b64,label,mime}=normalized,providedMime=normalizeMime(mime),sniffedMime=normalizeMime(await sniffMimeFromBase64(b64));if(sniffedMime&&!isImageMime(sniffedMime)){log?.warn(`attachment ${label}: detected non-image (${sniffedMime}), dropping`);continue}if(!sniffedMime&&!isImageMime(providedMime)){log?.warn(`attachment ${label}: unable to detect image mime type, dropping`);continue}sniffedMime&&providedMime&&sniffedMime!==providedMime&&log?.warn(`attachment ${label}: mime mismatch (${providedMime} -> ${sniffedMime}), using sniffed`),images.push({type:`image`,data:b64,mimeType:sniffedMime??providedMime??mime})}return{message,images}}function normalizeRpcAttachmentsToChatAttachments(attachments){return attachments?.map(a=>({type:typeof a?.type==`string`?a.type:void 0,mimeType:typeof a?.mimeType==`string`?a.mimeType:void 0,fileName:typeof a?.fileName==`string`?a.fileName:void 0,content:typeof a?.content==`string`?a.content:ArrayBuffer.isView(a?.content)?Buffer.from(a.content.buffer,a.content.byteOffset,a.content.byteLength).toString(`base64`):a?.content instanceof ArrayBuffer?Buffer.from(a.content).toString(`base64`):void 0})).filter(a=>a.content)??[]}const withLock=createAsyncLock();let cachedJwt=null;function resolveApnsRegistrationPath(baseDir){let root=baseDir??resolveStateDir();return path.join(root,`push/apns-registrations.json`)}function normalizeNodeId(value){return value.trim()}function normalizeApnsToken(value){return value.trim().replace(/[<>\s]/g,``).toLowerCase()}function normalizeTopic(value){return value.trim()}function isLikelyApnsToken(value){return/^[0-9a-f]{32,}$/i.test(value)}function parseReason(body){let trimmed=body.trim();if(trimmed)try{let parsed=JSON.parse(trimmed);return typeof parsed.reason==`string`&&parsed.reason.trim().length>0?parsed.reason.trim():trimmed.slice(0,200)}catch{return trimmed.slice(0,200)}}function toBase64UrlBytes(value){return Buffer.from(value).toString(`base64`).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/g,``)}function toBase64UrlJson(value){return toBase64UrlBytes(Buffer.from(JSON.stringify(value)))}function getJwtCacheKey(auth){let keyHash=createHash(`sha256`).update(auth.privateKey).digest(`hex`);return`${auth.teamId}:${auth.keyId}:${keyHash}`}function getApnsBearerToken(auth,nowMs=Date.now()){let cacheKey=getJwtCacheKey(auth);if(cachedJwt&&cachedJwt.cacheKey===cacheKey&&nowMs<cachedJwt.expiresAtMs)return cachedJwt.token;let iat=Math.floor(nowMs/1e3),signingInput=`${toBase64UrlJson({alg:`ES256`,kid:auth.keyId,typ:`JWT`})}.${toBase64UrlJson({iss:auth.teamId,iat})}`,token=`${signingInput}.${toBase64UrlBytes(sign(`sha256`,Buffer.from(signingInput,`utf8`),{key:createPrivateKey(auth.privateKey),dsaEncoding:`ieee-p1363`}))}`;return cachedJwt={cacheKey,token,expiresAtMs:nowMs+3e6},token}function normalizePrivateKey(value){return value.trim().replace(/\\n/g,`
|
|
1
|
+
import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{A as isVerbose}from"./utils-DbaBVFaK.js";import{Ci as estimateBase64DecodedBytes,cn as writeJsonAtomic,on as createAsyncLock,sn as readJsonFile,x as sniffMimeFromBase64}from"./reply-BuUSdq2L.js";import{C as parseAgentSessionKey}from"./session-key-EoB0qaG9.js";import{l as shouldLogSubsystemToConsole,t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{n as redactSensitiveText,t as getDefaultRedactPatterns}from"./redact-BHdfp2MZ.js";import path from"node:path";import{createHash,createPrivateKey,sign}from"node:crypto";import chalk from"chalk";import fs from"node:fs/promises";import http2 from"node:http2";let gatewayWsLogStyle=`auto`;function setGatewayWsLogStyle(style){gatewayWsLogStyle=style}function getGatewayWsLogStyle(){return gatewayWsLogStyle}const UUID_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,WS_LOG_REDACT_OPTIONS={mode:`tools`,patterns:getDefaultRedactPatterns()},wsInflightCompact=new Map;let wsLastCompactConnId;const wsInflightOptimized=new Map,wsInflightSince=new Map,wsLog=createSubsystemLogger(`gateway/ws`),WS_META_SKIP_KEYS=new Set([`connId`,`id`,`method`,`ok`,`event`]);function collectWsRestMeta(meta){let restMeta=[];if(!meta)return restMeta;for(let[key,value]of Object.entries(meta))value!==void 0&&(WS_META_SKIP_KEYS.has(key)||restMeta.push(`${chalk.dim(key)}=${formatForLog(value)}`));return restMeta}function buildWsHeadline(params){if((params.kind===`req`||params.kind===`res`)&¶ms.method)return chalk.bold(params.method);if(params.kind===`event`&¶ms.event)return chalk.bold(params.event)}function buildWsStatusToken(kind,ok){if(!(kind!==`res`||ok===void 0))return ok?chalk.greenBright(`✓`):chalk.redBright(`✗`)}function logWsInfoLine(params){let tokens=[params.prefix,params.statusToken,params.headline,params.durationToken,...params.restMeta,...params.trailing].filter(t=>!!t);wsLog.info(tokens.join(` `))}function shouldLogWs(){return shouldLogSubsystemToConsole(`gateway/ws`)}function shortId(value){let s=value.trim();return UUID_RE.test(s)?`${s.slice(0,8)}…${s.slice(-4)}`:s.length<=24?s:`${s.slice(0,12)}…${s.slice(-4)}`}function formatForLog(value){try{if(value instanceof Error){let parts=[];value.name&&parts.push(value.name),value.message&&parts.push(value.message);let code=`code`in value&&(typeof value.code==`string`||typeof value.code==`number`)?String(value.code):``;code&&parts.push(`code=${code}`);let combined=parts.filter(Boolean).join(`: `).trim();if(combined)return combined.length>240?`${combined.slice(0,240)}...`:combined}if(value&&typeof value==`object`){let rec=value;if(typeof rec.message==`string`&&rec.message.trim()){let name=typeof rec.name==`string`?rec.name.trim():``,code=typeof rec.code==`string`||typeof rec.code==`number`?String(rec.code):``,parts=[name,rec.message.trim()].filter(Boolean);code&&parts.push(`code=${code}`);let combined=parts.join(`: `).trim();return combined.length>240?`${combined.slice(0,240)}...`:combined}}let str=typeof value==`string`||typeof value==`number`?String(value):JSON.stringify(value);if(!str)return``;let redacted=redactSensitiveText(str,WS_LOG_REDACT_OPTIONS);return redacted.length>240?`${redacted.slice(0,240)}...`:redacted}catch{return String(value)}}function compactPreview(input,maxLen=160){let oneLine=input.replace(/\s+/g,` `).trim();return oneLine.length<=maxLen?oneLine:`${oneLine.slice(0,Math.max(0,maxLen-1))}…`}function summarizeAgentEventForWsLog(payload){if(!payload||typeof payload!=`object`)return{};let rec=payload,runId=typeof rec.runId==`string`?rec.runId:void 0,stream=typeof rec.stream==`string`?rec.stream:void 0,seq=typeof rec.seq==`number`?rec.seq:void 0,sessionKey=typeof rec.sessionKey==`string`?rec.sessionKey:void 0,data=rec.data&&typeof rec.data==`object`?rec.data:void 0,extra={};if(runId&&(extra.run=shortId(runId)),sessionKey){let parsed=parseAgentSessionKey(sessionKey);parsed?(extra.agent=parsed.agentId,extra.session=parsed.rest):extra.session=sessionKey}if(stream&&(extra.stream=stream),seq!==void 0&&(extra.aseq=seq),!data)return extra;if(stream===`assistant`){let text=typeof data.text==`string`?data.text:void 0;text?.trim()&&(extra.text=compactPreview(text));let mediaUrls=Array.isArray(data.mediaUrls)?data.mediaUrls:void 0;return mediaUrls&&mediaUrls.length>0&&(extra.media=mediaUrls.length),extra}if(stream===`tool`){let phase=typeof data.phase==`string`?data.phase:void 0,name=typeof data.name==`string`?data.name:void 0;(phase||name)&&(extra.tool=`${phase??`?`}:${name??`?`}`);let toolCallId=typeof data.toolCallId==`string`?data.toolCallId:void 0;toolCallId&&(extra.call=shortId(toolCallId));let meta=typeof data.meta==`string`?data.meta:void 0;return meta?.trim()&&(extra.meta=meta),typeof data.isError==`boolean`&&(extra.err=data.isError),extra}if(stream===`lifecycle`){let phase=typeof data.phase==`string`?data.phase:void 0;phase&&(extra.phase=phase),typeof data.aborted==`boolean`&&(extra.aborted=data.aborted);let error=typeof data.error==`string`?data.error:void 0;return error?.trim()&&(extra.error=compactPreview(error,120)),extra}let reason=typeof data.reason==`string`?data.reason:void 0;return reason?.trim()&&(extra.reason=reason),extra}function logWs(direction,kind,meta){if(!shouldLogSubsystemToConsole(`gateway/ws`))return;let style=getGatewayWsLogStyle();if(!isVerbose()){logWsOptimized(direction,kind,meta);return}if(style===`compact`||style===`auto`){logWsCompact(direction,kind,meta);return}let now=Date.now(),connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,method=typeof meta?.method==`string`?meta.method:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,event=typeof meta?.event==`string`?meta.event:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;direction===`in`&&kind===`req`&&inflightKey&&wsInflightSince.set(inflightKey,now);let durationMs=direction===`out`&&kind===`res`&&inflightKey?(()=>{let startedAt=wsInflightSince.get(inflightKey);if(startedAt!==void 0)return wsInflightSince.delete(inflightKey),now-startedAt})():void 0,dirArrow=direction===`in`?`←`:`→`,prefix=`${(direction===`in`?chalk.greenBright:chalk.cyanBright)(dirArrow)} ${chalk.bold(kind)}`,headline=buildWsHeadline({kind,method,event}),statusToken=buildWsStatusToken(kind,ok),durationToken=typeof durationMs==`number`?chalk.dim(`${durationMs}ms`):void 0,restMeta=collectWsRestMeta(meta),trailing=[];connId&&trailing.push(`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`),id&&trailing.push(`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`),logWsInfoLine({prefix,statusToken,headline,durationToken,restMeta,trailing})}function logWsOptimized(direction,kind,meta){let connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,method=typeof meta?.method==`string`?meta.method:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;if(direction===`in`&&kind===`req`&&inflightKey){wsInflightOptimized.set(inflightKey,Date.now()),wsInflightOptimized.size>2e3&&wsInflightOptimized.clear();return}if(kind===`parse-error`){let errorMsg=typeof meta?.error==`string`?formatForLog(meta.error):void 0;wsLog.warn([`${chalk.redBright(`✗`)} ${chalk.bold(`parse-error`)}`,errorMsg?`${chalk.dim(`error`)}=${errorMsg}`:void 0,`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId??`?`))}`].filter(t=>!!t).join(` `));return}if(direction!==`out`||kind!==`res`){if(kind===`event`&&direction===`out`&&(typeof meta?.event==`string`?meta.event:void 0)===`agent`){let stream=typeof meta?.stream==`string`?meta.stream:void 0,tool=typeof meta?.tool==`string`?meta.tool:void 0,phase=typeof meta?.phase==`string`?meta.phase:void 0,run=typeof meta?.run==`string`?meta.run:void 0,agent=typeof meta?.agent==`string`?meta.agent:void 0,tokens=[`${chalk.cyanBright(`→`)} ${chalk.bold(`agent`)}`,stream?`${chalk.dim(`stream`)}=${stream}`:void 0,tool?`${chalk.dim(`tool`)}=${tool}`:void 0,phase?`${chalk.dim(`phase`)}=${phase}`:void 0,agent?`${chalk.dim(`agent`)}=${agent}`:void 0,run?`${chalk.dim(`run`)}=${chalk.gray(run)}`:void 0].filter(t=>!!t);wsLog.info(tokens.join(` `))}return}let startedAt=inflightKey?wsInflightOptimized.get(inflightKey):void 0;inflightKey&&wsInflightOptimized.delete(inflightKey);let durationMs=typeof startedAt==`number`?Date.now()-startedAt:void 0;if(!(ok===!1||typeof durationMs==`number`&&durationMs>=50))return;let statusToken=buildWsStatusToken(`res`,ok),durationToken=typeof durationMs==`number`?chalk.dim(`${durationMs}ms`):void 0,restMeta=collectWsRestMeta(meta);logWsInfoLine({prefix:`${chalk.yellowBright(`⇄`)} ${chalk.bold(`res`)}`,statusToken,headline:method?chalk.bold(method):void 0,durationToken,restMeta,trailing:[connId?`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`:``,id?`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`:``].filter(Boolean)})}function logWsCompact(direction,kind,meta){let now=Date.now(),connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,method=typeof meta?.method==`string`?meta.method:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;if(kind===`req`&&direction===`in`&&inflightKey){wsInflightCompact.set(inflightKey,{ts:now,method,meta});return}let compactArrow=kind===`req`||kind===`res`?`⇄`:direction===`in`?`←`:`→`,prefix=`${(kind===`req`||kind===`res`?chalk.yellowBright:direction===`in`?chalk.greenBright:chalk.cyanBright)(compactArrow)} ${chalk.bold(kind)}`,statusToken=buildWsStatusToken(kind,ok),startedAt=kind===`res`&&direction===`out`&&inflightKey?wsInflightCompact.get(inflightKey)?.ts:void 0;kind===`res`&&direction===`out`&&inflightKey&&wsInflightCompact.delete(inflightKey);let durationToken=typeof startedAt==`number`?chalk.dim(`${now-startedAt}ms`):void 0,headline=buildWsHeadline({kind,method,event:typeof meta?.event==`string`?meta.event:void 0}),restMeta=collectWsRestMeta(meta),trailing=[];connId&&connId!==wsLastCompactConnId&&(trailing.push(`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`),wsLastCompactConnId=connId),id&&trailing.push(`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`),logWsInfoLine({prefix,statusToken,headline,durationToken,restMeta,trailing})}function normalizeMime(mime){if(mime)return mime.split(`;`)[0]?.trim().toLowerCase()||void 0}function isImageMime(mime){return typeof mime==`string`&&mime.startsWith(`image/`)}function isValidBase64(value){return value.length>0&&value.length%4==0&&/^[A-Za-z0-9+/]+={0,2}$/.test(value)}function normalizeAttachment(att,idx,opts){let mime=att.mimeType??``,content=att.content,label=att.fileName||att.type||`attachment-${idx+1}`;if(typeof content!=`string`)throw Error(`attachment ${label}: content must be base64 string`);if(opts.requireImageMime&&!mime.startsWith(`image/`))throw Error(`attachment ${label}: only image/* supported`);let base64=content.trim();if(opts.stripDataUrlPrefix){let dataUrlMatch=/^data:[^;]+;base64,(.*)$/.exec(base64);dataUrlMatch&&(base64=dataUrlMatch[1])}return{label,mime,base64}}function validateAttachmentBase64OrThrow(normalized,opts){if(!isValidBase64(normalized.base64))throw Error(`attachment ${normalized.label}: invalid base64 content`);let sizeBytes=estimateBase64DecodedBytes(normalized.base64);if(sizeBytes<=0||sizeBytes>opts.maxBytes)throw Error(`attachment ${normalized.label}: exceeds size limit (${sizeBytes} > ${opts.maxBytes} bytes)`);return sizeBytes}async function parseMessageWithAttachments(message,attachments,opts){let maxBytes=opts?.maxBytes??5e6,log=opts?.log;if(!attachments||attachments.length===0)return{message,images:[]};let images=[];for(let[idx,att]of attachments.entries()){if(!att)continue;let normalized=normalizeAttachment(att,idx,{stripDataUrlPrefix:!0,requireImageMime:!1});validateAttachmentBase64OrThrow(normalized,{maxBytes});let{base64:b64,label,mime}=normalized,providedMime=normalizeMime(mime),sniffedMime=normalizeMime(await sniffMimeFromBase64(b64));if(sniffedMime&&!isImageMime(sniffedMime)){log?.warn(`attachment ${label}: detected non-image (${sniffedMime}), dropping`);continue}if(!sniffedMime&&!isImageMime(providedMime)){log?.warn(`attachment ${label}: unable to detect image mime type, dropping`);continue}sniffedMime&&providedMime&&sniffedMime!==providedMime&&log?.warn(`attachment ${label}: mime mismatch (${providedMime} -> ${sniffedMime}), using sniffed`),images.push({type:`image`,data:b64,mimeType:sniffedMime??providedMime??mime})}return{message,images}}function normalizeRpcAttachmentsToChatAttachments(attachments){return attachments?.map(a=>({type:typeof a?.type==`string`?a.type:void 0,mimeType:typeof a?.mimeType==`string`?a.mimeType:void 0,fileName:typeof a?.fileName==`string`?a.fileName:void 0,content:typeof a?.content==`string`?a.content:ArrayBuffer.isView(a?.content)?Buffer.from(a.content.buffer,a.content.byteOffset,a.content.byteLength).toString(`base64`):a?.content instanceof ArrayBuffer?Buffer.from(a.content).toString(`base64`):void 0})).filter(a=>a.content)??[]}const withLock=createAsyncLock();let cachedJwt=null;function resolveApnsRegistrationPath(baseDir){let root=baseDir??resolveStateDir();return path.join(root,`push/apns-registrations.json`)}function normalizeNodeId(value){return value.trim()}function normalizeApnsToken(value){return value.trim().replace(/[<>\s]/g,``).toLowerCase()}function normalizeTopic(value){return value.trim()}function isLikelyApnsToken(value){return/^[0-9a-f]{32,}$/i.test(value)}function parseReason(body){let trimmed=body.trim();if(trimmed)try{let parsed=JSON.parse(trimmed);return typeof parsed.reason==`string`&&parsed.reason.trim().length>0?parsed.reason.trim():trimmed.slice(0,200)}catch{return trimmed.slice(0,200)}}function toBase64UrlBytes(value){return Buffer.from(value).toString(`base64`).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/g,``)}function toBase64UrlJson(value){return toBase64UrlBytes(Buffer.from(JSON.stringify(value)))}function getJwtCacheKey(auth){let keyHash=createHash(`sha256`).update(auth.privateKey).digest(`hex`);return`${auth.teamId}:${auth.keyId}:${keyHash}`}function getApnsBearerToken(auth,nowMs=Date.now()){let cacheKey=getJwtCacheKey(auth);if(cachedJwt&&cachedJwt.cacheKey===cacheKey&&nowMs<cachedJwt.expiresAtMs)return cachedJwt.token;let iat=Math.floor(nowMs/1e3),signingInput=`${toBase64UrlJson({alg:`ES256`,kid:auth.keyId,typ:`JWT`})}.${toBase64UrlJson({iss:auth.teamId,iat})}`,token=`${signingInput}.${toBase64UrlBytes(sign(`sha256`,Buffer.from(signingInput,`utf8`),{key:createPrivateKey(auth.privateKey),dsaEncoding:`ieee-p1363`}))}`;return cachedJwt={cacheKey,token,expiresAtMs:nowMs+3e6},token}function normalizePrivateKey(value){return value.trim().replace(/\\n/g,`
|
|
2
2
|
`)}function normalizeNonEmptyString(value){let trimmed=value?.trim()??``;return trimmed.length>0?trimmed:null}async function loadRegistrationsState(baseDir){let existing=await readJsonFile(resolveApnsRegistrationPath(baseDir));return!existing||typeof existing!=`object`?{registrationsByNodeId:{}}:{registrationsByNodeId:existing.registrationsByNodeId&&typeof existing.registrationsByNodeId==`object`&&!Array.isArray(existing.registrationsByNodeId)?existing.registrationsByNodeId:{}}}async function persistRegistrationsState(state,baseDir){await writeJsonAtomic(resolveApnsRegistrationPath(baseDir),state)}function normalizeApnsEnvironment(value){if(typeof value!=`string`)return null;let normalized=value.trim().toLowerCase();return normalized===`sandbox`||normalized===`production`?normalized:null}async function registerApnsToken(params){let nodeId=normalizeNodeId(params.nodeId),token=normalizeApnsToken(params.token),topic=normalizeTopic(params.topic),environment=normalizeApnsEnvironment(params.environment)??`sandbox`;if(!nodeId)throw Error(`nodeId required`);if(!topic)throw Error(`topic required`);if(!isLikelyApnsToken(token))throw Error(`invalid APNs token`);return await withLock(async()=>{let state=await loadRegistrationsState(params.baseDir),next={nodeId,token,topic,environment,updatedAtMs:Date.now()};return state.registrationsByNodeId[nodeId]=next,await persistRegistrationsState(state,params.baseDir),next})}async function loadApnsRegistration(nodeId,baseDir){let normalizedNodeId=normalizeNodeId(nodeId);return normalizedNodeId?(await loadRegistrationsState(baseDir)).registrationsByNodeId[normalizedNodeId]??null:null}async function resolveApnsAuthConfigFromEnv(env=process.env){let teamId=normalizeNonEmptyString(env.BUILDERFORCE_AGENTS_APNS_TEAM_ID),keyId=normalizeNonEmptyString(env.BUILDERFORCE_AGENTS_APNS_KEY_ID);if(!teamId||!keyId)return{ok:!1,error:`APNs auth missing: set BUILDERFORCE_AGENTS_APNS_TEAM_ID and BUILDERFORCE_AGENTS_APNS_KEY_ID`};let inlineKeyRaw=normalizeNonEmptyString(env.BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY_P8)??normalizeNonEmptyString(env.BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY);if(inlineKeyRaw)return{ok:!0,value:{teamId,keyId,privateKey:normalizePrivateKey(inlineKeyRaw)}};let keyPath=normalizeNonEmptyString(env.BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY_PATH);if(!keyPath)return{ok:!1,error:`APNs private key missing: set BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY_P8 or BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY_PATH`};try{return{ok:!0,value:{teamId,keyId,privateKey:normalizePrivateKey(await fs.readFile(keyPath,`utf8`))}}}catch(err){return{ok:!1,error:`failed reading BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY_PATH (${keyPath}): ${err instanceof Error?err.message:String(err)}`}}}async function sendApnsRequest(params){let authority=params.environment===`production`?`https://api.push.apple.com`:`https://api.sandbox.push.apple.com`,body=JSON.stringify(params.payload),requestPath=`/3/device/${params.token}`;return await new Promise((resolve,reject)=>{let client=http2.connect(authority),settled=!1,fail=err=>{settled||(settled=!0,client.destroy(),reject(err))},finish=result=>{settled||(settled=!0,client.close(),resolve(result))};client.once(`error`,err=>fail(err));let req=client.request({":method":`POST`,":path":requestPath,authorization:`bearer ${params.bearerToken}`,"apns-topic":params.topic,"apns-push-type":params.pushType,"apns-priority":params.priority,"apns-expiration":`0`,"content-type":`application/json`,"content-length":Buffer.byteLength(body).toString()}),statusCode=0,apnsId,responseBody=``;req.setEncoding(`utf8`),req.setTimeout(params.timeoutMs,()=>{req.close(http2.constants.NGHTTP2_CANCEL),fail(Error(`APNs request timed out after ${params.timeoutMs}ms`))}),req.on(`response`,headers=>{let statusHeader=headers[`:status`];statusCode=typeof statusHeader==`number`?statusHeader:Number(statusHeader??0);let idHeader=headers[`apns-id`];typeof idHeader==`string`&&idHeader.trim().length>0&&(apnsId=idHeader.trim())}),req.on(`data`,chunk=>{typeof chunk==`string`&&(responseBody+=chunk)}),req.on(`end`,()=>{finish({status:statusCode,apnsId,body:responseBody})}),req.on(`error`,err=>fail(err)),req.end(body)})}function resolveApnsTimeoutMs(timeoutMs){return typeof timeoutMs==`number`&&Number.isFinite(timeoutMs)?Math.max(1e3,Math.trunc(timeoutMs)):1e4}function resolveApnsSendContext(params){let token=normalizeApnsToken(params.registration.token);if(!isLikelyApnsToken(token))throw Error(`invalid APNs token`);let topic=normalizeTopic(params.registration.topic);if(!topic)throw Error(`topic required`);return{token,topic,environment:params.registration.environment,bearerToken:getApnsBearerToken(params.auth)}}function toApnsPushResult(params){return{ok:params.response.status===200,status:params.response.status,apnsId:params.response.apnsId,reason:parseReason(params.response.body),tokenSuffix:params.token.slice(-8),topic:params.topic,environment:params.environment}}async function sendApnsAlert(params){let{token,topic,environment,bearerToken}=resolveApnsSendContext({auth:params.auth,registration:params.registration}),payload={aps:{alert:{title:params.title,body:params.body},sound:`default`},builderforce:{kind:`push.test`,nodeId:params.nodeId,ts:Date.now()}};return toApnsPushResult({response:await(params.requestSender??sendApnsRequest)({token,topic,environment,bearerToken,payload,timeoutMs:resolveApnsTimeoutMs(params.timeoutMs),pushType:`alert`,priority:`10`}),token,topic,environment})}async function sendApnsBackgroundWake(params){let{token,topic,environment,bearerToken}=resolveApnsSendContext({auth:params.auth,registration:params.registration}),payload={aps:{"content-available":1},builderforce:{kind:`node.wake`,reason:params.wakeReason??`node.invoke`,nodeId:params.nodeId,ts:Date.now()}};return toApnsPushResult({response:await(params.requestSender??sendApnsRequest)({token,topic,environment,bearerToken,payload,timeoutMs:resolveApnsTimeoutMs(params.timeoutMs),pushType:`background`,priority:`5`}),token,topic,environment})}export{sendApnsAlert as a,parseMessageWithAttachments as c,shouldLogWs as d,summarizeAgentEventForWsLog as f,resolveApnsAuthConfigFromEnv as i,formatForLog as l,normalizeApnsEnvironment as n,sendApnsBackgroundWake as o,setGatewayWsLogStyle as p,registerApnsToken as r,normalizeRpcAttachmentsToChatAttachments as s,loadApnsRegistration as t,logWs as u};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./paths-BVMSM1lQ.js";import"./session-key-CYpYHc1e.js";import"./registry-D_frpmHZ.js";import"./agent-scope-EkacNLg3.js";import"./subsystem-BakM_oqD.js";import"./workspace-BCjtHT4u.js";import{St as normalizeBaseUrl}from"./model-selection-Cg2DOZgd.js";import{n as formatCliCommand}from"./env-BhRm7_r8.js";import"./boolean-ssGoaBPk.js";import"./src-CFZ3EtDR.js";import"./redact-sNZY-pGx.js";import{n as formatErrorMessage}from"./errors-BmztzL5I.js";import"./config-CzogmWgi.js";import{_ as withCdpSocket,d as normalizeCdpWsUrl,g as getHeadersWithAuth,m as fetchJson,p as appendCdpPath,t as getChromeWebSocketUrl,u as formatAriaSnapshot}from"./chrome-D6qk0wxW.js";import{t as resolvePreferredBuilderForceAgentsTmpDir}from"./tmp-builderforce-dir-CB4MW5x2.js";import fs from"node:fs/promises";import path from"node:path";import crypto from"node:crypto";import{chromium,devices}from"playwright-core";const pageStates=new WeakMap,contextStates=new WeakMap,observedContexts=new WeakSet,observedPages=new WeakSet,roleRefsByTarget=new Map;let cached=null,connecting=null;function normalizeCdpUrl(raw){return raw.replace(/\/$/,``)}function findNetworkRequestById(state,id){for(let i=state.requests.length-1;i>=0;--i){let candidate=state.requests[i];if(candidate&&candidate.id===id)return candidate}}function roleRefsKey(cdpUrl,targetId){return`${normalizeCdpUrl(cdpUrl)}::${targetId}`}function rememberRoleRefsForTarget(opts){let targetId=opts.targetId.trim();if(targetId)for(roleRefsByTarget.set(roleRefsKey(opts.cdpUrl,targetId),{refs:opts.refs,...opts.frameSelector?{frameSelector:opts.frameSelector}:{},...opts.mode?{mode:opts.mode}:{}});roleRefsByTarget.size>50;){let first=roleRefsByTarget.keys().next();if(first.done)break;roleRefsByTarget.delete(first.value)}}function storeRoleRefsForTarget(opts){let state=ensurePageState(opts.page);state.roleRefs=opts.refs,state.roleRefsFrameSelector=opts.frameSelector,state.roleRefsMode=opts.mode,opts.targetId?.trim()&&rememberRoleRefsForTarget({cdpUrl:opts.cdpUrl,targetId:opts.targetId,refs:opts.refs,frameSelector:opts.frameSelector,mode:opts.mode})}function restoreRoleRefsForTarget(opts){let targetId=opts.targetId?.trim()||``;if(!targetId)return;let cached=roleRefsByTarget.get(roleRefsKey(opts.cdpUrl,targetId));if(!cached)return;let state=ensurePageState(opts.page);state.roleRefs||(state.roleRefs=cached.refs,state.roleRefsFrameSelector=cached.frameSelector,state.roleRefsMode=cached.mode)}function ensurePageState(page){let existing=pageStates.get(page);if(existing)return existing;let state={console:[],errors:[],requests:[],requestIds:new WeakMap,nextRequestId:0,armIdUpload:0,armIdDialog:0,armIdDownload:0};return pageStates.set(page,state),observedPages.has(page)||(observedPages.add(page),page.on(`console`,msg=>{let entry={type:msg.type(),text:msg.text(),timestamp:new Date().toISOString(),location:msg.location()};state.console.push(entry),state.console.length>500&&state.console.shift()}),page.on(`pageerror`,err=>{state.errors.push({message:err?.message?String(err.message):String(err),name:err?.name?String(err.name):void 0,stack:err?.stack?String(err.stack):void 0,timestamp:new Date().toISOString()}),state.errors.length>200&&state.errors.shift()}),page.on(`request`,req=>{state.nextRequestId+=1;let id=`r${state.nextRequestId}`;state.requestIds.set(req,id),state.requests.push({id,timestamp:new Date().toISOString(),method:req.method(),url:req.url(),resourceType:req.resourceType()}),state.requests.length>500&&state.requests.shift()}),page.on(`response`,resp=>{let req=resp.request(),id=state.requestIds.get(req);if(!id)return;let rec=findNetworkRequestById(state,id);rec&&(rec.status=resp.status(),rec.ok=resp.ok())}),page.on(`requestfailed`,req=>{let id=state.requestIds.get(req);if(!id)return;let rec=findNetworkRequestById(state,id);rec&&(rec.failureText=req.failure()?.errorText,rec.ok=!1)}),page.on(`close`,()=>{pageStates.delete(page),observedPages.delete(page)})),state}function observeContext(context){if(!observedContexts.has(context)){observedContexts.add(context),ensureContextState(context);for(let page of context.pages())ensurePageState(page);context.on(`page`,page=>ensurePageState(page))}}function ensureContextState(context){let existing=contextStates.get(context);if(existing)return existing;let state={traceActive:!1};return contextStates.set(context,state),state}function observeBrowser(browser){for(let context of browser.contexts())observeContext(context)}async function connectBrowser(cdpUrl){let normalized=normalizeCdpUrl(cdpUrl);return cached?.cdpUrl===normalized?cached:(connecting||=(async()=>{let lastErr;for(let attempt=0;attempt<3;attempt+=1)try{let timeout=5e3+attempt*2e3,endpoint=await getChromeWebSocketUrl(normalized,timeout).catch(()=>null)??normalized,headers=getHeadersWithAuth(endpoint),browser=await chromium.connectOverCDP(endpoint,{timeout,headers}),onDisconnected=()=>{cached?.browser===browser&&(cached=null)},connected={browser,cdpUrl:normalized,onDisconnected};return cached=connected,browser.on(`disconnected`,onDisconnected),observeBrowser(browser),connected}catch(err){lastErr=err;let delay=250+attempt*250;await new Promise(r=>setTimeout(r,delay))}if(lastErr instanceof Error)throw lastErr;let message=lastErr?formatErrorMessage(lastErr):`CDP connect failed`;throw Error(message)})().finally(()=>{connecting=null}),await connecting)}async function getAllPages(browser){return browser.contexts().flatMap(c=>c.pages())}async function pageTargetId(page){let session=await page.context().newCDPSession(page);try{let info=await session.send(`Target.getTargetInfo`);return String(info?.targetInfo?.targetId??``).trim()||null}finally{await session.detach().catch(()=>{})}}async function findPageByTargetId(browser,targetId,cdpUrl){let pages=await getAllPages(browser),resolvedViaCdp=!1;for(let page of pages){let tid=null;try{tid=await pageTargetId(page),resolvedViaCdp=!0}catch{tid=null}if(tid&&tid===targetId)return page}if(!resolvedViaCdp&&pages.length===1)return pages[0];if(cdpUrl)try{let listUrl=`${normalizeBaseUrl(cdpUrl).replace(/^ws:/,`http:`).replace(/\/cdp$/,``)}/json/list`,response=await fetch(listUrl,{headers:getHeadersWithAuth(listUrl)});if(response.ok){let targets=await response.json(),target=targets.find(t=>t.id===targetId);if(target){let urlMatch=pages.filter(p=>p.url()===target.url);if(urlMatch.length===1)return urlMatch[0];if(urlMatch.length>1){let sameUrlTargets=targets.filter(t=>t.url===target.url);if(sameUrlTargets.length===urlMatch.length){let idx=sameUrlTargets.findIndex(t=>t.id===targetId);if(idx>=0&&idx<urlMatch.length)return urlMatch[idx]}}}}}catch{}return null}async function getPageForTargetId(opts){let{browser}=await connectBrowser(opts.cdpUrl),pages=await getAllPages(browser);if(!pages.length)throw Error(`No pages available in the connected browser.`);let first=pages[0];if(!opts.targetId)return first;let found=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!found){if(pages.length===1)return first;throw Error(`tab not found`)}return found}function refLocator(page,ref){let normalized=ref.startsWith(`@`)?ref.slice(1):ref.startsWith(`ref=`)?ref.slice(4):ref;if(/^e\d+$/.test(normalized)){let state=pageStates.get(page);if(state?.roleRefsMode===`aria`)return(state.roleRefsFrameSelector?page.frameLocator(state.roleRefsFrameSelector):page).locator(`aria-ref=${normalized}`);let info=state?.roleRefs?.[normalized];if(!info)throw Error(`Unknown ref "${normalized}". Run a new snapshot and use a ref from that snapshot.`);let locAny=state?.roleRefsFrameSelector?page.frameLocator(state.roleRefsFrameSelector):page,locator=info.name?locAny.getByRole(info.role,{name:info.name,exact:!0}):locAny.getByRole(info.role);return info.nth===void 0?locator:locator.nth(info.nth)}return page.locator(`aria-ref=${normalized}`)}async function closePlaywrightBrowserConnection(){let cur=cached;cached=null,connecting=null,cur&&(cur.onDisconnected&&typeof cur.browser.off==`function`&&cur.browser.off(`disconnected`,cur.onDisconnected),await cur.browser.close().catch(()=>{}))}function normalizeCdpHttpBaseForJsonEndpoints(cdpUrl){try{let url=new URL(cdpUrl);return url.protocol===`ws:`?url.protocol=`http:`:url.protocol===`wss:`&&(url.protocol=`https:`),url.pathname=url.pathname.replace(/\/devtools\/browser\/.*$/,``),url.pathname=url.pathname.replace(/\/cdp$/,``),url.toString().replace(/\/$/,``)}catch{return cdpUrl.replace(/^ws:/,`http:`).replace(/^wss:/,`https:`).replace(/\/devtools\/browser\/.*$/,``).replace(/\/cdp$/,``).replace(/\/$/,``)}}function cdpSocketNeedsAttach(wsUrl){try{let pathname=new URL(wsUrl).pathname;return pathname===`/cdp`||pathname.endsWith(`/cdp`)||pathname.includes(`/devtools/browser/`)}catch{return!1}}async function tryTerminateExecutionViaCdp(opts){let cdpHttpBase=normalizeCdpHttpBaseForJsonEndpoints(opts.cdpUrl),pages=await fetchJson(appendCdpPath(cdpHttpBase,`/json/list`),2e3).catch(()=>null);if(!pages||pages.length===0)return;let target=pages.find(p=>String(p.id??``).trim()===opts.targetId),wsUrlRaw=String(target?.webSocketDebuggerUrl??``).trim();if(!wsUrlRaw)return;let wsUrl=normalizeCdpWsUrl(wsUrlRaw,cdpHttpBase),needsAttach=cdpSocketNeedsAttach(wsUrl),runWithTimeout=async(work,ms)=>{let timer,timeoutPromise=new Promise((_,reject)=>{timer=setTimeout(()=>reject(Error(`CDP command timed out`)),ms)});try{return await Promise.race([work,timeoutPromise])}finally{timer&&clearTimeout(timer)}};await withCdpSocket(wsUrl,async send=>{let sessionId;try{if(needsAttach){let attached=await runWithTimeout(send(`Target.attachToTarget`,{targetId:opts.targetId,flatten:!0}),1500);typeof attached?.sessionId==`string`&&attached.sessionId.trim()&&(sessionId=attached.sessionId)}await runWithTimeout(send(`Runtime.terminateExecution`,void 0,sessionId),1500),sessionId&&send(`Target.detachFromTarget`,{sessionId}).catch(()=>{})}catch{}},{handshakeTimeoutMs:2e3}).catch(()=>{})}async function forceDisconnectPlaywrightForTarget(opts){let normalized=normalizeCdpUrl(opts.cdpUrl);if(cached?.cdpUrl!==normalized)return;let cur=cached;if(cached=null,connecting=null,cur){cur.onDisconnected&&typeof cur.browser.off==`function`&&cur.browser.off(`disconnected`,cur.onDisconnected);let targetId=opts.targetId?.trim()||``;targetId&&await tryTerminateExecutionViaCdp({cdpUrl:normalized,targetId}).catch(()=>{}),cur.browser.close().catch(()=>{})}}async function listPagesViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),pages=await getAllPages(browser),results=[];for(let page of pages){let tid=await pageTargetId(page).catch(()=>null);tid&&results.push({targetId:tid,title:await page.title().catch(()=>``),url:page.url(),type:`page`})}return results}async function createPageViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),context=browser.contexts()[0]??await browser.newContext();ensureContextState(context);let page=await context.newPage();ensurePageState(page);let targetUrl=opts.url.trim()||`about:blank`;targetUrl!==`about:blank`&&await page.goto(targetUrl,{timeout:3e4}).catch(()=>{});let tid=await pageTargetId(page).catch(()=>null);if(!tid)throw Error(`Failed to get targetId for new page`);return{targetId:tid,title:await page.title().catch(()=>``),url:page.url(),type:`page`}}async function closePageByTargetIdViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),page=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!page)throw Error(`tab not found`);await page.close()}async function focusPageByTargetIdViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),page=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!page)throw Error(`tab not found`);try{await page.bringToFront()}catch(err){let session=await page.context().newCDPSession(page);try{await session.send(`Page.bringToFront`);return}catch{throw err}finally{await session.detach().catch(()=>{})}}}async function getPageErrorsViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts)),errors=[...state.errors];return opts.clear&&(state.errors=[]),{errors}}async function getNetworkRequestsViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts)),raw=[...state.requests],filter=typeof opts.filter==`string`?opts.filter.trim():``,requests=filter?raw.filter(r=>r.url.includes(filter)):raw;return opts.clear&&(state.requests=[],state.requestIds=new WeakMap),{requests}}function consolePriority(level){switch(level){case`error`:return 3;case`warning`:return 2;case`info`:case`log`:return 1;case`debug`:return 0;default:return 1}}async function getConsoleMessagesViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts));if(!opts.level)return[...state.console];let min=consolePriority(opts.level);return state.console.filter(msg=>consolePriority(msg.type)>=min)}const INTERACTIVE_ROLES=new Set([`button`,`link`,`textbox`,`checkbox`,`radio`,`combobox`,`listbox`,`menuitem`,`menuitemcheckbox`,`menuitemradio`,`option`,`searchbox`,`slider`,`spinbutton`,`switch`,`tab`,`treeitem`]),CONTENT_ROLES=new Set([`heading`,`cell`,`gridcell`,`columnheader`,`rowheader`,`listitem`,`article`,`region`,`main`,`navigation`]),STRUCTURAL_ROLES=new Set([`generic`,`group`,`list`,`table`,`row`,`rowgroup`,`grid`,`treegrid`,`menu`,`menubar`,`toolbar`,`tablist`,`tree`,`directory`,`document`,`application`,`presentation`,`none`]);function getRoleSnapshotStats(snapshot,refs){let interactive=Object.values(refs).filter(r=>INTERACTIVE_ROLES.has(r.role)).length;return{lines:snapshot.split(`
|
|
1
|
+
import"./paths-BVMSM1lQ.js";import"./session-key-CYpYHc1e.js";import"./registry-D_frpmHZ.js";import"./agent-scope-EkacNLg3.js";import"./subsystem-BakM_oqD.js";import"./workspace-BCjtHT4u.js";import{St as normalizeBaseUrl}from"./model-selection-Cg2DOZgd.js";import{n as formatCliCommand}from"./env-BhRm7_r8.js";import"./boolean-ssGoaBPk.js";import"./src-CFZ3EtDR.js";import"./redact-sNZY-pGx.js";import{n as formatErrorMessage}from"./errors-BmztzL5I.js";import"./config-CzogmWgi.js";import{_ as withCdpSocket,d as normalizeCdpWsUrl,g as getHeadersWithAuth,m as fetchJson,p as appendCdpPath,t as getChromeWebSocketUrl,u as formatAriaSnapshot}from"./chrome-CrqJ4Ijz.js";import{t as resolvePreferredBuilderForceAgentsTmpDir}from"./tmp-builderforce-dir-CB4MW5x2.js";import fs from"node:fs/promises";import path from"node:path";import crypto from"node:crypto";import{chromium,devices}from"playwright-core";const pageStates=new WeakMap,contextStates=new WeakMap,observedContexts=new WeakSet,observedPages=new WeakSet,roleRefsByTarget=new Map;let cached=null,connecting=null;function normalizeCdpUrl(raw){return raw.replace(/\/$/,``)}function findNetworkRequestById(state,id){for(let i=state.requests.length-1;i>=0;--i){let candidate=state.requests[i];if(candidate&&candidate.id===id)return candidate}}function roleRefsKey(cdpUrl,targetId){return`${normalizeCdpUrl(cdpUrl)}::${targetId}`}function rememberRoleRefsForTarget(opts){let targetId=opts.targetId.trim();if(targetId)for(roleRefsByTarget.set(roleRefsKey(opts.cdpUrl,targetId),{refs:opts.refs,...opts.frameSelector?{frameSelector:opts.frameSelector}:{},...opts.mode?{mode:opts.mode}:{}});roleRefsByTarget.size>50;){let first=roleRefsByTarget.keys().next();if(first.done)break;roleRefsByTarget.delete(first.value)}}function storeRoleRefsForTarget(opts){let state=ensurePageState(opts.page);state.roleRefs=opts.refs,state.roleRefsFrameSelector=opts.frameSelector,state.roleRefsMode=opts.mode,opts.targetId?.trim()&&rememberRoleRefsForTarget({cdpUrl:opts.cdpUrl,targetId:opts.targetId,refs:opts.refs,frameSelector:opts.frameSelector,mode:opts.mode})}function restoreRoleRefsForTarget(opts){let targetId=opts.targetId?.trim()||``;if(!targetId)return;let cached=roleRefsByTarget.get(roleRefsKey(opts.cdpUrl,targetId));if(!cached)return;let state=ensurePageState(opts.page);state.roleRefs||(state.roleRefs=cached.refs,state.roleRefsFrameSelector=cached.frameSelector,state.roleRefsMode=cached.mode)}function ensurePageState(page){let existing=pageStates.get(page);if(existing)return existing;let state={console:[],errors:[],requests:[],requestIds:new WeakMap,nextRequestId:0,armIdUpload:0,armIdDialog:0,armIdDownload:0};return pageStates.set(page,state),observedPages.has(page)||(observedPages.add(page),page.on(`console`,msg=>{let entry={type:msg.type(),text:msg.text(),timestamp:new Date().toISOString(),location:msg.location()};state.console.push(entry),state.console.length>500&&state.console.shift()}),page.on(`pageerror`,err=>{state.errors.push({message:err?.message?String(err.message):String(err),name:err?.name?String(err.name):void 0,stack:err?.stack?String(err.stack):void 0,timestamp:new Date().toISOString()}),state.errors.length>200&&state.errors.shift()}),page.on(`request`,req=>{state.nextRequestId+=1;let id=`r${state.nextRequestId}`;state.requestIds.set(req,id),state.requests.push({id,timestamp:new Date().toISOString(),method:req.method(),url:req.url(),resourceType:req.resourceType()}),state.requests.length>500&&state.requests.shift()}),page.on(`response`,resp=>{let req=resp.request(),id=state.requestIds.get(req);if(!id)return;let rec=findNetworkRequestById(state,id);rec&&(rec.status=resp.status(),rec.ok=resp.ok())}),page.on(`requestfailed`,req=>{let id=state.requestIds.get(req);if(!id)return;let rec=findNetworkRequestById(state,id);rec&&(rec.failureText=req.failure()?.errorText,rec.ok=!1)}),page.on(`close`,()=>{pageStates.delete(page),observedPages.delete(page)})),state}function observeContext(context){if(!observedContexts.has(context)){observedContexts.add(context),ensureContextState(context);for(let page of context.pages())ensurePageState(page);context.on(`page`,page=>ensurePageState(page))}}function ensureContextState(context){let existing=contextStates.get(context);if(existing)return existing;let state={traceActive:!1};return contextStates.set(context,state),state}function observeBrowser(browser){for(let context of browser.contexts())observeContext(context)}async function connectBrowser(cdpUrl){let normalized=normalizeCdpUrl(cdpUrl);return cached?.cdpUrl===normalized?cached:(connecting||=(async()=>{let lastErr;for(let attempt=0;attempt<3;attempt+=1)try{let timeout=5e3+attempt*2e3,endpoint=await getChromeWebSocketUrl(normalized,timeout).catch(()=>null)??normalized,headers=getHeadersWithAuth(endpoint),browser=await chromium.connectOverCDP(endpoint,{timeout,headers}),onDisconnected=()=>{cached?.browser===browser&&(cached=null)},connected={browser,cdpUrl:normalized,onDisconnected};return cached=connected,browser.on(`disconnected`,onDisconnected),observeBrowser(browser),connected}catch(err){lastErr=err;let delay=250+attempt*250;await new Promise(r=>setTimeout(r,delay))}if(lastErr instanceof Error)throw lastErr;let message=lastErr?formatErrorMessage(lastErr):`CDP connect failed`;throw Error(message)})().finally(()=>{connecting=null}),await connecting)}async function getAllPages(browser){return browser.contexts().flatMap(c=>c.pages())}async function pageTargetId(page){let session=await page.context().newCDPSession(page);try{let info=await session.send(`Target.getTargetInfo`);return String(info?.targetInfo?.targetId??``).trim()||null}finally{await session.detach().catch(()=>{})}}async function findPageByTargetId(browser,targetId,cdpUrl){let pages=await getAllPages(browser),resolvedViaCdp=!1;for(let page of pages){let tid=null;try{tid=await pageTargetId(page),resolvedViaCdp=!0}catch{tid=null}if(tid&&tid===targetId)return page}if(!resolvedViaCdp&&pages.length===1)return pages[0];if(cdpUrl)try{let listUrl=`${normalizeBaseUrl(cdpUrl).replace(/^ws:/,`http:`).replace(/\/cdp$/,``)}/json/list`,response=await fetch(listUrl,{headers:getHeadersWithAuth(listUrl)});if(response.ok){let targets=await response.json(),target=targets.find(t=>t.id===targetId);if(target){let urlMatch=pages.filter(p=>p.url()===target.url);if(urlMatch.length===1)return urlMatch[0];if(urlMatch.length>1){let sameUrlTargets=targets.filter(t=>t.url===target.url);if(sameUrlTargets.length===urlMatch.length){let idx=sameUrlTargets.findIndex(t=>t.id===targetId);if(idx>=0&&idx<urlMatch.length)return urlMatch[idx]}}}}}catch{}return null}async function getPageForTargetId(opts){let{browser}=await connectBrowser(opts.cdpUrl),pages=await getAllPages(browser);if(!pages.length)throw Error(`No pages available in the connected browser.`);let first=pages[0];if(!opts.targetId)return first;let found=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!found){if(pages.length===1)return first;throw Error(`tab not found`)}return found}function refLocator(page,ref){let normalized=ref.startsWith(`@`)?ref.slice(1):ref.startsWith(`ref=`)?ref.slice(4):ref;if(/^e\d+$/.test(normalized)){let state=pageStates.get(page);if(state?.roleRefsMode===`aria`)return(state.roleRefsFrameSelector?page.frameLocator(state.roleRefsFrameSelector):page).locator(`aria-ref=${normalized}`);let info=state?.roleRefs?.[normalized];if(!info)throw Error(`Unknown ref "${normalized}". Run a new snapshot and use a ref from that snapshot.`);let locAny=state?.roleRefsFrameSelector?page.frameLocator(state.roleRefsFrameSelector):page,locator=info.name?locAny.getByRole(info.role,{name:info.name,exact:!0}):locAny.getByRole(info.role);return info.nth===void 0?locator:locator.nth(info.nth)}return page.locator(`aria-ref=${normalized}`)}async function closePlaywrightBrowserConnection(){let cur=cached;cached=null,connecting=null,cur&&(cur.onDisconnected&&typeof cur.browser.off==`function`&&cur.browser.off(`disconnected`,cur.onDisconnected),await cur.browser.close().catch(()=>{}))}function normalizeCdpHttpBaseForJsonEndpoints(cdpUrl){try{let url=new URL(cdpUrl);return url.protocol===`ws:`?url.protocol=`http:`:url.protocol===`wss:`&&(url.protocol=`https:`),url.pathname=url.pathname.replace(/\/devtools\/browser\/.*$/,``),url.pathname=url.pathname.replace(/\/cdp$/,``),url.toString().replace(/\/$/,``)}catch{return cdpUrl.replace(/^ws:/,`http:`).replace(/^wss:/,`https:`).replace(/\/devtools\/browser\/.*$/,``).replace(/\/cdp$/,``).replace(/\/$/,``)}}function cdpSocketNeedsAttach(wsUrl){try{let pathname=new URL(wsUrl).pathname;return pathname===`/cdp`||pathname.endsWith(`/cdp`)||pathname.includes(`/devtools/browser/`)}catch{return!1}}async function tryTerminateExecutionViaCdp(opts){let cdpHttpBase=normalizeCdpHttpBaseForJsonEndpoints(opts.cdpUrl),pages=await fetchJson(appendCdpPath(cdpHttpBase,`/json/list`),2e3).catch(()=>null);if(!pages||pages.length===0)return;let target=pages.find(p=>String(p.id??``).trim()===opts.targetId),wsUrlRaw=String(target?.webSocketDebuggerUrl??``).trim();if(!wsUrlRaw)return;let wsUrl=normalizeCdpWsUrl(wsUrlRaw,cdpHttpBase),needsAttach=cdpSocketNeedsAttach(wsUrl),runWithTimeout=async(work,ms)=>{let timer,timeoutPromise=new Promise((_,reject)=>{timer=setTimeout(()=>reject(Error(`CDP command timed out`)),ms)});try{return await Promise.race([work,timeoutPromise])}finally{timer&&clearTimeout(timer)}};await withCdpSocket(wsUrl,async send=>{let sessionId;try{if(needsAttach){let attached=await runWithTimeout(send(`Target.attachToTarget`,{targetId:opts.targetId,flatten:!0}),1500);typeof attached?.sessionId==`string`&&attached.sessionId.trim()&&(sessionId=attached.sessionId)}await runWithTimeout(send(`Runtime.terminateExecution`,void 0,sessionId),1500),sessionId&&send(`Target.detachFromTarget`,{sessionId}).catch(()=>{})}catch{}},{handshakeTimeoutMs:2e3}).catch(()=>{})}async function forceDisconnectPlaywrightForTarget(opts){let normalized=normalizeCdpUrl(opts.cdpUrl);if(cached?.cdpUrl!==normalized)return;let cur=cached;if(cached=null,connecting=null,cur){cur.onDisconnected&&typeof cur.browser.off==`function`&&cur.browser.off(`disconnected`,cur.onDisconnected);let targetId=opts.targetId?.trim()||``;targetId&&await tryTerminateExecutionViaCdp({cdpUrl:normalized,targetId}).catch(()=>{}),cur.browser.close().catch(()=>{})}}async function listPagesViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),pages=await getAllPages(browser),results=[];for(let page of pages){let tid=await pageTargetId(page).catch(()=>null);tid&&results.push({targetId:tid,title:await page.title().catch(()=>``),url:page.url(),type:`page`})}return results}async function createPageViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),context=browser.contexts()[0]??await browser.newContext();ensureContextState(context);let page=await context.newPage();ensurePageState(page);let targetUrl=opts.url.trim()||`about:blank`;targetUrl!==`about:blank`&&await page.goto(targetUrl,{timeout:3e4}).catch(()=>{});let tid=await pageTargetId(page).catch(()=>null);if(!tid)throw Error(`Failed to get targetId for new page`);return{targetId:tid,title:await page.title().catch(()=>``),url:page.url(),type:`page`}}async function closePageByTargetIdViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),page=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!page)throw Error(`tab not found`);await page.close()}async function focusPageByTargetIdViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),page=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!page)throw Error(`tab not found`);try{await page.bringToFront()}catch(err){let session=await page.context().newCDPSession(page);try{await session.send(`Page.bringToFront`);return}catch{throw err}finally{await session.detach().catch(()=>{})}}}async function getPageErrorsViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts)),errors=[...state.errors];return opts.clear&&(state.errors=[]),{errors}}async function getNetworkRequestsViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts)),raw=[...state.requests],filter=typeof opts.filter==`string`?opts.filter.trim():``,requests=filter?raw.filter(r=>r.url.includes(filter)):raw;return opts.clear&&(state.requests=[],state.requestIds=new WeakMap),{requests}}function consolePriority(level){switch(level){case`error`:return 3;case`warning`:return 2;case`info`:case`log`:return 1;case`debug`:return 0;default:return 1}}async function getConsoleMessagesViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts));if(!opts.level)return[...state.console];let min=consolePriority(opts.level);return state.console.filter(msg=>consolePriority(msg.type)>=min)}const INTERACTIVE_ROLES=new Set([`button`,`link`,`textbox`,`checkbox`,`radio`,`combobox`,`listbox`,`menuitem`,`menuitemcheckbox`,`menuitemradio`,`option`,`searchbox`,`slider`,`spinbutton`,`switch`,`tab`,`treeitem`]),CONTENT_ROLES=new Set([`heading`,`cell`,`gridcell`,`columnheader`,`rowheader`,`listitem`,`article`,`region`,`main`,`navigation`]),STRUCTURAL_ROLES=new Set([`generic`,`group`,`list`,`table`,`row`,`rowgroup`,`grid`,`treegrid`,`menu`,`menubar`,`toolbar`,`tablist`,`tree`,`directory`,`document`,`application`,`presentation`,`none`]);function getRoleSnapshotStats(snapshot,refs){let interactive=Object.values(refs).filter(r=>INTERACTIVE_ROLES.has(r.role)).length;return{lines:snapshot.split(`
|
|
2
2
|
`).length,chars:snapshot.length,refs:Object.keys(refs).length,interactive}}function getIndentLevel(line){let match=line.match(/^(\s*)/);return match?Math.floor(match[1].length/2):0}function matchInteractiveSnapshotLine(line,options){let depth=getIndentLevel(line);if(options.maxDepth!==void 0&&depth>options.maxDepth)return null;let match=line.match(/^(\s*-\s*)(\w+)(?:\s+"([^"]*)")?(.*)$/);if(!match)return null;let[,,roleRaw,name,suffix]=match;return roleRaw.startsWith(`/`)?null:{roleRaw,role:roleRaw.toLowerCase(),...name?{name}:{},suffix}}function createRoleNameTracker(){let counts=new Map,refsByKey=new Map;return{counts,refsByKey,getKey(role,name){return`${role}:${name??``}`},getNextIndex(role,name){let key=this.getKey(role,name),current=counts.get(key)??0;return counts.set(key,current+1),current},trackRef(role,name,ref){let key=this.getKey(role,name),list=refsByKey.get(key)??[];list.push(ref),refsByKey.set(key,list)},getDuplicateKeys(){let out=new Set;for(let[key,refs]of refsByKey)refs.length>1&&out.add(key);return out}}}function removeNthFromNonDuplicates(refs,tracker){let duplicates=tracker.getDuplicateKeys();for(let[ref,data]of Object.entries(refs)){let key=tracker.getKey(data.role,data.name);duplicates.has(key)||delete refs[ref]?.nth}}function compactTree(tree){let lines=tree.split(`
|
|
3
3
|
`),result=[];for(let i=0;i<lines.length;i+=1){let line=lines[i];if(line.includes(`[ref=`)){result.push(line);continue}if(line.includes(`:`)&&!line.trimEnd().endsWith(`:`)){result.push(line);continue}let currentIndent=getIndentLevel(line),hasRelevantChildren=!1;for(let j=i+1;j<lines.length&&!(getIndentLevel(lines[j])<=currentIndent);j+=1)if(lines[j]?.includes(`[ref=`)){hasRelevantChildren=!0;break}hasRelevantChildren&&result.push(line)}return result.join(`
|
|
4
4
|
`)}function processLine(line,refs,options,tracker,nextRef){let depth=getIndentLevel(line);if(options.maxDepth!==void 0&&depth>options.maxDepth)return null;let match=line.match(/^(\s*-\s*)(\w+)(?:\s+"([^"]*)")?(.*)$/);if(!match)return options.interactive?null:line;let[,prefix,roleRaw,name,suffix]=match;if(roleRaw.startsWith(`/`))return options.interactive?null:line;let role=roleRaw.toLowerCase(),isInteractive=INTERACTIVE_ROLES.has(role),isContent=CONTENT_ROLES.has(role),isStructural=STRUCTURAL_ROLES.has(role);if(options.interactive&&!isInteractive||options.compact&&isStructural&&!name)return null;if(!(isInteractive||isContent&&name))return line;let ref=nextRef(),nth=tracker.getNextIndex(role,name);tracker.trackRef(role,name,ref),refs[ref]={role,name,nth};let enhanced=`${prefix}${roleRaw}`;return name&&(enhanced+=` "${name}"`),enhanced+=` [ref=${ref}]`,nth>0&&(enhanced+=` [nth=${nth}]`),suffix&&(enhanced+=suffix),enhanced}function parseRoleRef(raw){let trimmed=raw.trim();if(!trimmed)return null;let normalized=trimmed.startsWith(`@`)?trimmed.slice(1):trimmed.startsWith(`ref=`)?trimmed.slice(4):trimmed;return/^e\d+$/.test(normalized)?normalized:null}function buildRoleSnapshotFromAriaSnapshot(ariaSnapshot,options={}){let lines=ariaSnapshot.split(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./paths-CAQcjxp2.js";import"./session-key-CYpYHc1e.js";import"./registry-j1UKIotU.js";import"./agent-scope-C7zGN7Pz.js";import"./subsystem-ykSbyaud.js";import{St as normalizeBaseUrl}from"./model-selection-wcUu73D6.js";import{r as formatCliCommand}from"./env-44XUbLhk.js";import"./src-FTj4uYDm.js";import"./redact-xFefzy4M.js";import{n as formatErrorMessage}from"./errors-CguQr0Ja.js";import"./config-utlbrOec.js";import{_ as withCdpSocket,d as normalizeCdpWsUrl,g as getHeadersWithAuth,m as fetchJson,p as appendCdpPath,t as getChromeWebSocketUrl,u as formatAriaSnapshot,x as resolvePreferredBuilderForceAgentsTmpDir}from"./chrome-CmCESKt9.js";import path from"node:path";import crypto from"node:crypto";import fs from"node:fs/promises";import{chromium,devices}from"playwright-core";const pageStates=new WeakMap,contextStates=new WeakMap,observedContexts=new WeakSet,observedPages=new WeakSet,roleRefsByTarget=new Map;let cached=null,connecting=null;function normalizeCdpUrl(raw){return raw.replace(/\/$/,``)}function findNetworkRequestById(state,id){for(let i=state.requests.length-1;i>=0;--i){let candidate=state.requests[i];if(candidate&&candidate.id===id)return candidate}}function roleRefsKey(cdpUrl,targetId){return`${normalizeCdpUrl(cdpUrl)}::${targetId}`}function rememberRoleRefsForTarget(opts){let targetId=opts.targetId.trim();if(targetId)for(roleRefsByTarget.set(roleRefsKey(opts.cdpUrl,targetId),{refs:opts.refs,...opts.frameSelector?{frameSelector:opts.frameSelector}:{},...opts.mode?{mode:opts.mode}:{}});roleRefsByTarget.size>50;){let first=roleRefsByTarget.keys().next();if(first.done)break;roleRefsByTarget.delete(first.value)}}function storeRoleRefsForTarget(opts){let state=ensurePageState(opts.page);state.roleRefs=opts.refs,state.roleRefsFrameSelector=opts.frameSelector,state.roleRefsMode=opts.mode,opts.targetId?.trim()&&rememberRoleRefsForTarget({cdpUrl:opts.cdpUrl,targetId:opts.targetId,refs:opts.refs,frameSelector:opts.frameSelector,mode:opts.mode})}function restoreRoleRefsForTarget(opts){let targetId=opts.targetId?.trim()||``;if(!targetId)return;let cached=roleRefsByTarget.get(roleRefsKey(opts.cdpUrl,targetId));if(!cached)return;let state=ensurePageState(opts.page);state.roleRefs||(state.roleRefs=cached.refs,state.roleRefsFrameSelector=cached.frameSelector,state.roleRefsMode=cached.mode)}function ensurePageState(page){let existing=pageStates.get(page);if(existing)return existing;let state={console:[],errors:[],requests:[],requestIds:new WeakMap,nextRequestId:0,armIdUpload:0,armIdDialog:0,armIdDownload:0};return pageStates.set(page,state),observedPages.has(page)||(observedPages.add(page),page.on(`console`,msg=>{let entry={type:msg.type(),text:msg.text(),timestamp:new Date().toISOString(),location:msg.location()};state.console.push(entry),state.console.length>500&&state.console.shift()}),page.on(`pageerror`,err=>{state.errors.push({message:err?.message?String(err.message):String(err),name:err?.name?String(err.name):void 0,stack:err?.stack?String(err.stack):void 0,timestamp:new Date().toISOString()}),state.errors.length>200&&state.errors.shift()}),page.on(`request`,req=>{state.nextRequestId+=1;let id=`r${state.nextRequestId}`;state.requestIds.set(req,id),state.requests.push({id,timestamp:new Date().toISOString(),method:req.method(),url:req.url(),resourceType:req.resourceType()}),state.requests.length>500&&state.requests.shift()}),page.on(`response`,resp=>{let req=resp.request(),id=state.requestIds.get(req);if(!id)return;let rec=findNetworkRequestById(state,id);rec&&(rec.status=resp.status(),rec.ok=resp.ok())}),page.on(`requestfailed`,req=>{let id=state.requestIds.get(req);if(!id)return;let rec=findNetworkRequestById(state,id);rec&&(rec.failureText=req.failure()?.errorText,rec.ok=!1)}),page.on(`close`,()=>{pageStates.delete(page),observedPages.delete(page)})),state}function observeContext(context){if(!observedContexts.has(context)){observedContexts.add(context),ensureContextState(context);for(let page of context.pages())ensurePageState(page);context.on(`page`,page=>ensurePageState(page))}}function ensureContextState(context){let existing=contextStates.get(context);if(existing)return existing;let state={traceActive:!1};return contextStates.set(context,state),state}function observeBrowser(browser){for(let context of browser.contexts())observeContext(context)}async function connectBrowser(cdpUrl){let normalized=normalizeCdpUrl(cdpUrl);return cached?.cdpUrl===normalized?cached:(connecting||=(async()=>{let lastErr;for(let attempt=0;attempt<3;attempt+=1)try{let timeout=5e3+attempt*2e3,endpoint=await getChromeWebSocketUrl(normalized,timeout).catch(()=>null)??normalized,headers=getHeadersWithAuth(endpoint),browser=await chromium.connectOverCDP(endpoint,{timeout,headers}),onDisconnected=()=>{cached?.browser===browser&&(cached=null)},connected={browser,cdpUrl:normalized,onDisconnected};return cached=connected,browser.on(`disconnected`,onDisconnected),observeBrowser(browser),connected}catch(err){lastErr=err;let delay=250+attempt*250;await new Promise(r=>setTimeout(r,delay))}if(lastErr instanceof Error)throw lastErr;let message=lastErr?formatErrorMessage(lastErr):`CDP connect failed`;throw Error(message)})().finally(()=>{connecting=null}),await connecting)}async function getAllPages(browser){return browser.contexts().flatMap(c=>c.pages())}async function pageTargetId(page){let session=await page.context().newCDPSession(page);try{let info=await session.send(`Target.getTargetInfo`);return String(info?.targetInfo?.targetId??``).trim()||null}finally{await session.detach().catch(()=>{})}}async function findPageByTargetId(browser,targetId,cdpUrl){let pages=await getAllPages(browser),resolvedViaCdp=!1;for(let page of pages){let tid=null;try{tid=await pageTargetId(page),resolvedViaCdp=!0}catch{tid=null}if(tid&&tid===targetId)return page}if(!resolvedViaCdp&&pages.length===1)return pages[0];if(cdpUrl)try{let listUrl=`${normalizeBaseUrl(cdpUrl).replace(/^ws:/,`http:`).replace(/\/cdp$/,``)}/json/list`,response=await fetch(listUrl,{headers:getHeadersWithAuth(listUrl)});if(response.ok){let targets=await response.json(),target=targets.find(t=>t.id===targetId);if(target){let urlMatch=pages.filter(p=>p.url()===target.url);if(urlMatch.length===1)return urlMatch[0];if(urlMatch.length>1){let sameUrlTargets=targets.filter(t=>t.url===target.url);if(sameUrlTargets.length===urlMatch.length){let idx=sameUrlTargets.findIndex(t=>t.id===targetId);if(idx>=0&&idx<urlMatch.length)return urlMatch[idx]}}}}}catch{}return null}async function getPageForTargetId(opts){let{browser}=await connectBrowser(opts.cdpUrl),pages=await getAllPages(browser);if(!pages.length)throw Error(`No pages available in the connected browser.`);let first=pages[0];if(!opts.targetId)return first;let found=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!found){if(pages.length===1)return first;throw Error(`tab not found`)}return found}function refLocator(page,ref){let normalized=ref.startsWith(`@`)?ref.slice(1):ref.startsWith(`ref=`)?ref.slice(4):ref;if(/^e\d+$/.test(normalized)){let state=pageStates.get(page);if(state?.roleRefsMode===`aria`)return(state.roleRefsFrameSelector?page.frameLocator(state.roleRefsFrameSelector):page).locator(`aria-ref=${normalized}`);let info=state?.roleRefs?.[normalized];if(!info)throw Error(`Unknown ref "${normalized}". Run a new snapshot and use a ref from that snapshot.`);let locAny=state?.roleRefsFrameSelector?page.frameLocator(state.roleRefsFrameSelector):page,locator=info.name?locAny.getByRole(info.role,{name:info.name,exact:!0}):locAny.getByRole(info.role);return info.nth===void 0?locator:locator.nth(info.nth)}return page.locator(`aria-ref=${normalized}`)}async function closePlaywrightBrowserConnection(){let cur=cached;cached=null,connecting=null,cur&&(cur.onDisconnected&&typeof cur.browser.off==`function`&&cur.browser.off(`disconnected`,cur.onDisconnected),await cur.browser.close().catch(()=>{}))}function normalizeCdpHttpBaseForJsonEndpoints(cdpUrl){try{let url=new URL(cdpUrl);return url.protocol===`ws:`?url.protocol=`http:`:url.protocol===`wss:`&&(url.protocol=`https:`),url.pathname=url.pathname.replace(/\/devtools\/browser\/.*$/,``),url.pathname=url.pathname.replace(/\/cdp$/,``),url.toString().replace(/\/$/,``)}catch{return cdpUrl.replace(/^ws:/,`http:`).replace(/^wss:/,`https:`).replace(/\/devtools\/browser\/.*$/,``).replace(/\/cdp$/,``).replace(/\/$/,``)}}function cdpSocketNeedsAttach(wsUrl){try{let pathname=new URL(wsUrl).pathname;return pathname===`/cdp`||pathname.endsWith(`/cdp`)||pathname.includes(`/devtools/browser/`)}catch{return!1}}async function tryTerminateExecutionViaCdp(opts){let cdpHttpBase=normalizeCdpHttpBaseForJsonEndpoints(opts.cdpUrl),pages=await fetchJson(appendCdpPath(cdpHttpBase,`/json/list`),2e3).catch(()=>null);if(!pages||pages.length===0)return;let target=pages.find(p=>String(p.id??``).trim()===opts.targetId),wsUrlRaw=String(target?.webSocketDebuggerUrl??``).trim();if(!wsUrlRaw)return;let wsUrl=normalizeCdpWsUrl(wsUrlRaw,cdpHttpBase),needsAttach=cdpSocketNeedsAttach(wsUrl),runWithTimeout=async(work,ms)=>{let timer,timeoutPromise=new Promise((_,reject)=>{timer=setTimeout(()=>reject(Error(`CDP command timed out`)),ms)});try{return await Promise.race([work,timeoutPromise])}finally{timer&&clearTimeout(timer)}};await withCdpSocket(wsUrl,async send=>{let sessionId;try{if(needsAttach){let attached=await runWithTimeout(send(`Target.attachToTarget`,{targetId:opts.targetId,flatten:!0}),1500);typeof attached?.sessionId==`string`&&attached.sessionId.trim()&&(sessionId=attached.sessionId)}await runWithTimeout(send(`Runtime.terminateExecution`,void 0,sessionId),1500),sessionId&&send(`Target.detachFromTarget`,{sessionId}).catch(()=>{})}catch{}},{handshakeTimeoutMs:2e3}).catch(()=>{})}async function forceDisconnectPlaywrightForTarget(opts){let normalized=normalizeCdpUrl(opts.cdpUrl);if(cached?.cdpUrl!==normalized)return;let cur=cached;if(cached=null,connecting=null,cur){cur.onDisconnected&&typeof cur.browser.off==`function`&&cur.browser.off(`disconnected`,cur.onDisconnected);let targetId=opts.targetId?.trim()||``;targetId&&await tryTerminateExecutionViaCdp({cdpUrl:normalized,targetId}).catch(()=>{}),cur.browser.close().catch(()=>{})}}async function listPagesViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),pages=await getAllPages(browser),results=[];for(let page of pages){let tid=await pageTargetId(page).catch(()=>null);tid&&results.push({targetId:tid,title:await page.title().catch(()=>``),url:page.url(),type:`page`})}return results}async function createPageViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),context=browser.contexts()[0]??await browser.newContext();ensureContextState(context);let page=await context.newPage();ensurePageState(page);let targetUrl=opts.url.trim()||`about:blank`;targetUrl!==`about:blank`&&await page.goto(targetUrl,{timeout:3e4}).catch(()=>{});let tid=await pageTargetId(page).catch(()=>null);if(!tid)throw Error(`Failed to get targetId for new page`);return{targetId:tid,title:await page.title().catch(()=>``),url:page.url(),type:`page`}}async function closePageByTargetIdViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),page=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!page)throw Error(`tab not found`);await page.close()}async function focusPageByTargetIdViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),page=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!page)throw Error(`tab not found`);try{await page.bringToFront()}catch(err){let session=await page.context().newCDPSession(page);try{await session.send(`Page.bringToFront`);return}catch{throw err}finally{await session.detach().catch(()=>{})}}}async function getPageErrorsViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts)),errors=[...state.errors];return opts.clear&&(state.errors=[]),{errors}}async function getNetworkRequestsViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts)),raw=[...state.requests],filter=typeof opts.filter==`string`?opts.filter.trim():``,requests=filter?raw.filter(r=>r.url.includes(filter)):raw;return opts.clear&&(state.requests=[],state.requestIds=new WeakMap),{requests}}function consolePriority(level){switch(level){case`error`:return 3;case`warning`:return 2;case`info`:case`log`:return 1;case`debug`:return 0;default:return 1}}async function getConsoleMessagesViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts));if(!opts.level)return[...state.console];let min=consolePriority(opts.level);return state.console.filter(msg=>consolePriority(msg.type)>=min)}const INTERACTIVE_ROLES=new Set([`button`,`link`,`textbox`,`checkbox`,`radio`,`combobox`,`listbox`,`menuitem`,`menuitemcheckbox`,`menuitemradio`,`option`,`searchbox`,`slider`,`spinbutton`,`switch`,`tab`,`treeitem`]),CONTENT_ROLES=new Set([`heading`,`cell`,`gridcell`,`columnheader`,`rowheader`,`listitem`,`article`,`region`,`main`,`navigation`]),STRUCTURAL_ROLES=new Set([`generic`,`group`,`list`,`table`,`row`,`rowgroup`,`grid`,`treegrid`,`menu`,`menubar`,`toolbar`,`tablist`,`tree`,`directory`,`document`,`application`,`presentation`,`none`]);function getRoleSnapshotStats(snapshot,refs){let interactive=Object.values(refs).filter(r=>INTERACTIVE_ROLES.has(r.role)).length;return{lines:snapshot.split(`
|
|
1
|
+
import"./paths-CAQcjxp2.js";import"./session-key-CYpYHc1e.js";import"./registry-j1UKIotU.js";import"./agent-scope-C7zGN7Pz.js";import"./subsystem-ykSbyaud.js";import{St as normalizeBaseUrl}from"./model-selection-wcUu73D6.js";import{r as formatCliCommand}from"./env-44XUbLhk.js";import"./src-FTj4uYDm.js";import"./redact-xFefzy4M.js";import{n as formatErrorMessage}from"./errors-CguQr0Ja.js";import"./config-utlbrOec.js";import{_ as withCdpSocket,d as normalizeCdpWsUrl,g as getHeadersWithAuth,m as fetchJson,p as appendCdpPath,t as getChromeWebSocketUrl,u as formatAriaSnapshot,x as resolvePreferredBuilderForceAgentsTmpDir}from"./chrome-ChzFLAeJ.js";import path from"node:path";import crypto from"node:crypto";import fs from"node:fs/promises";import{chromium,devices}from"playwright-core";const pageStates=new WeakMap,contextStates=new WeakMap,observedContexts=new WeakSet,observedPages=new WeakSet,roleRefsByTarget=new Map;let cached=null,connecting=null;function normalizeCdpUrl(raw){return raw.replace(/\/$/,``)}function findNetworkRequestById(state,id){for(let i=state.requests.length-1;i>=0;--i){let candidate=state.requests[i];if(candidate&&candidate.id===id)return candidate}}function roleRefsKey(cdpUrl,targetId){return`${normalizeCdpUrl(cdpUrl)}::${targetId}`}function rememberRoleRefsForTarget(opts){let targetId=opts.targetId.trim();if(targetId)for(roleRefsByTarget.set(roleRefsKey(opts.cdpUrl,targetId),{refs:opts.refs,...opts.frameSelector?{frameSelector:opts.frameSelector}:{},...opts.mode?{mode:opts.mode}:{}});roleRefsByTarget.size>50;){let first=roleRefsByTarget.keys().next();if(first.done)break;roleRefsByTarget.delete(first.value)}}function storeRoleRefsForTarget(opts){let state=ensurePageState(opts.page);state.roleRefs=opts.refs,state.roleRefsFrameSelector=opts.frameSelector,state.roleRefsMode=opts.mode,opts.targetId?.trim()&&rememberRoleRefsForTarget({cdpUrl:opts.cdpUrl,targetId:opts.targetId,refs:opts.refs,frameSelector:opts.frameSelector,mode:opts.mode})}function restoreRoleRefsForTarget(opts){let targetId=opts.targetId?.trim()||``;if(!targetId)return;let cached=roleRefsByTarget.get(roleRefsKey(opts.cdpUrl,targetId));if(!cached)return;let state=ensurePageState(opts.page);state.roleRefs||(state.roleRefs=cached.refs,state.roleRefsFrameSelector=cached.frameSelector,state.roleRefsMode=cached.mode)}function ensurePageState(page){let existing=pageStates.get(page);if(existing)return existing;let state={console:[],errors:[],requests:[],requestIds:new WeakMap,nextRequestId:0,armIdUpload:0,armIdDialog:0,armIdDownload:0};return pageStates.set(page,state),observedPages.has(page)||(observedPages.add(page),page.on(`console`,msg=>{let entry={type:msg.type(),text:msg.text(),timestamp:new Date().toISOString(),location:msg.location()};state.console.push(entry),state.console.length>500&&state.console.shift()}),page.on(`pageerror`,err=>{state.errors.push({message:err?.message?String(err.message):String(err),name:err?.name?String(err.name):void 0,stack:err?.stack?String(err.stack):void 0,timestamp:new Date().toISOString()}),state.errors.length>200&&state.errors.shift()}),page.on(`request`,req=>{state.nextRequestId+=1;let id=`r${state.nextRequestId}`;state.requestIds.set(req,id),state.requests.push({id,timestamp:new Date().toISOString(),method:req.method(),url:req.url(),resourceType:req.resourceType()}),state.requests.length>500&&state.requests.shift()}),page.on(`response`,resp=>{let req=resp.request(),id=state.requestIds.get(req);if(!id)return;let rec=findNetworkRequestById(state,id);rec&&(rec.status=resp.status(),rec.ok=resp.ok())}),page.on(`requestfailed`,req=>{let id=state.requestIds.get(req);if(!id)return;let rec=findNetworkRequestById(state,id);rec&&(rec.failureText=req.failure()?.errorText,rec.ok=!1)}),page.on(`close`,()=>{pageStates.delete(page),observedPages.delete(page)})),state}function observeContext(context){if(!observedContexts.has(context)){observedContexts.add(context),ensureContextState(context);for(let page of context.pages())ensurePageState(page);context.on(`page`,page=>ensurePageState(page))}}function ensureContextState(context){let existing=contextStates.get(context);if(existing)return existing;let state={traceActive:!1};return contextStates.set(context,state),state}function observeBrowser(browser){for(let context of browser.contexts())observeContext(context)}async function connectBrowser(cdpUrl){let normalized=normalizeCdpUrl(cdpUrl);return cached?.cdpUrl===normalized?cached:(connecting||=(async()=>{let lastErr;for(let attempt=0;attempt<3;attempt+=1)try{let timeout=5e3+attempt*2e3,endpoint=await getChromeWebSocketUrl(normalized,timeout).catch(()=>null)??normalized,headers=getHeadersWithAuth(endpoint),browser=await chromium.connectOverCDP(endpoint,{timeout,headers}),onDisconnected=()=>{cached?.browser===browser&&(cached=null)},connected={browser,cdpUrl:normalized,onDisconnected};return cached=connected,browser.on(`disconnected`,onDisconnected),observeBrowser(browser),connected}catch(err){lastErr=err;let delay=250+attempt*250;await new Promise(r=>setTimeout(r,delay))}if(lastErr instanceof Error)throw lastErr;let message=lastErr?formatErrorMessage(lastErr):`CDP connect failed`;throw Error(message)})().finally(()=>{connecting=null}),await connecting)}async function getAllPages(browser){return browser.contexts().flatMap(c=>c.pages())}async function pageTargetId(page){let session=await page.context().newCDPSession(page);try{let info=await session.send(`Target.getTargetInfo`);return String(info?.targetInfo?.targetId??``).trim()||null}finally{await session.detach().catch(()=>{})}}async function findPageByTargetId(browser,targetId,cdpUrl){let pages=await getAllPages(browser),resolvedViaCdp=!1;for(let page of pages){let tid=null;try{tid=await pageTargetId(page),resolvedViaCdp=!0}catch{tid=null}if(tid&&tid===targetId)return page}if(!resolvedViaCdp&&pages.length===1)return pages[0];if(cdpUrl)try{let listUrl=`${normalizeBaseUrl(cdpUrl).replace(/^ws:/,`http:`).replace(/\/cdp$/,``)}/json/list`,response=await fetch(listUrl,{headers:getHeadersWithAuth(listUrl)});if(response.ok){let targets=await response.json(),target=targets.find(t=>t.id===targetId);if(target){let urlMatch=pages.filter(p=>p.url()===target.url);if(urlMatch.length===1)return urlMatch[0];if(urlMatch.length>1){let sameUrlTargets=targets.filter(t=>t.url===target.url);if(sameUrlTargets.length===urlMatch.length){let idx=sameUrlTargets.findIndex(t=>t.id===targetId);if(idx>=0&&idx<urlMatch.length)return urlMatch[idx]}}}}}catch{}return null}async function getPageForTargetId(opts){let{browser}=await connectBrowser(opts.cdpUrl),pages=await getAllPages(browser);if(!pages.length)throw Error(`No pages available in the connected browser.`);let first=pages[0];if(!opts.targetId)return first;let found=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!found){if(pages.length===1)return first;throw Error(`tab not found`)}return found}function refLocator(page,ref){let normalized=ref.startsWith(`@`)?ref.slice(1):ref.startsWith(`ref=`)?ref.slice(4):ref;if(/^e\d+$/.test(normalized)){let state=pageStates.get(page);if(state?.roleRefsMode===`aria`)return(state.roleRefsFrameSelector?page.frameLocator(state.roleRefsFrameSelector):page).locator(`aria-ref=${normalized}`);let info=state?.roleRefs?.[normalized];if(!info)throw Error(`Unknown ref "${normalized}". Run a new snapshot and use a ref from that snapshot.`);let locAny=state?.roleRefsFrameSelector?page.frameLocator(state.roleRefsFrameSelector):page,locator=info.name?locAny.getByRole(info.role,{name:info.name,exact:!0}):locAny.getByRole(info.role);return info.nth===void 0?locator:locator.nth(info.nth)}return page.locator(`aria-ref=${normalized}`)}async function closePlaywrightBrowserConnection(){let cur=cached;cached=null,connecting=null,cur&&(cur.onDisconnected&&typeof cur.browser.off==`function`&&cur.browser.off(`disconnected`,cur.onDisconnected),await cur.browser.close().catch(()=>{}))}function normalizeCdpHttpBaseForJsonEndpoints(cdpUrl){try{let url=new URL(cdpUrl);return url.protocol===`ws:`?url.protocol=`http:`:url.protocol===`wss:`&&(url.protocol=`https:`),url.pathname=url.pathname.replace(/\/devtools\/browser\/.*$/,``),url.pathname=url.pathname.replace(/\/cdp$/,``),url.toString().replace(/\/$/,``)}catch{return cdpUrl.replace(/^ws:/,`http:`).replace(/^wss:/,`https:`).replace(/\/devtools\/browser\/.*$/,``).replace(/\/cdp$/,``).replace(/\/$/,``)}}function cdpSocketNeedsAttach(wsUrl){try{let pathname=new URL(wsUrl).pathname;return pathname===`/cdp`||pathname.endsWith(`/cdp`)||pathname.includes(`/devtools/browser/`)}catch{return!1}}async function tryTerminateExecutionViaCdp(opts){let cdpHttpBase=normalizeCdpHttpBaseForJsonEndpoints(opts.cdpUrl),pages=await fetchJson(appendCdpPath(cdpHttpBase,`/json/list`),2e3).catch(()=>null);if(!pages||pages.length===0)return;let target=pages.find(p=>String(p.id??``).trim()===opts.targetId),wsUrlRaw=String(target?.webSocketDebuggerUrl??``).trim();if(!wsUrlRaw)return;let wsUrl=normalizeCdpWsUrl(wsUrlRaw,cdpHttpBase),needsAttach=cdpSocketNeedsAttach(wsUrl),runWithTimeout=async(work,ms)=>{let timer,timeoutPromise=new Promise((_,reject)=>{timer=setTimeout(()=>reject(Error(`CDP command timed out`)),ms)});try{return await Promise.race([work,timeoutPromise])}finally{timer&&clearTimeout(timer)}};await withCdpSocket(wsUrl,async send=>{let sessionId;try{if(needsAttach){let attached=await runWithTimeout(send(`Target.attachToTarget`,{targetId:opts.targetId,flatten:!0}),1500);typeof attached?.sessionId==`string`&&attached.sessionId.trim()&&(sessionId=attached.sessionId)}await runWithTimeout(send(`Runtime.terminateExecution`,void 0,sessionId),1500),sessionId&&send(`Target.detachFromTarget`,{sessionId}).catch(()=>{})}catch{}},{handshakeTimeoutMs:2e3}).catch(()=>{})}async function forceDisconnectPlaywrightForTarget(opts){let normalized=normalizeCdpUrl(opts.cdpUrl);if(cached?.cdpUrl!==normalized)return;let cur=cached;if(cached=null,connecting=null,cur){cur.onDisconnected&&typeof cur.browser.off==`function`&&cur.browser.off(`disconnected`,cur.onDisconnected);let targetId=opts.targetId?.trim()||``;targetId&&await tryTerminateExecutionViaCdp({cdpUrl:normalized,targetId}).catch(()=>{}),cur.browser.close().catch(()=>{})}}async function listPagesViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),pages=await getAllPages(browser),results=[];for(let page of pages){let tid=await pageTargetId(page).catch(()=>null);tid&&results.push({targetId:tid,title:await page.title().catch(()=>``),url:page.url(),type:`page`})}return results}async function createPageViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),context=browser.contexts()[0]??await browser.newContext();ensureContextState(context);let page=await context.newPage();ensurePageState(page);let targetUrl=opts.url.trim()||`about:blank`;targetUrl!==`about:blank`&&await page.goto(targetUrl,{timeout:3e4}).catch(()=>{});let tid=await pageTargetId(page).catch(()=>null);if(!tid)throw Error(`Failed to get targetId for new page`);return{targetId:tid,title:await page.title().catch(()=>``),url:page.url(),type:`page`}}async function closePageByTargetIdViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),page=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!page)throw Error(`tab not found`);await page.close()}async function focusPageByTargetIdViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),page=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!page)throw Error(`tab not found`);try{await page.bringToFront()}catch(err){let session=await page.context().newCDPSession(page);try{await session.send(`Page.bringToFront`);return}catch{throw err}finally{await session.detach().catch(()=>{})}}}async function getPageErrorsViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts)),errors=[...state.errors];return opts.clear&&(state.errors=[]),{errors}}async function getNetworkRequestsViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts)),raw=[...state.requests],filter=typeof opts.filter==`string`?opts.filter.trim():``,requests=filter?raw.filter(r=>r.url.includes(filter)):raw;return opts.clear&&(state.requests=[],state.requestIds=new WeakMap),{requests}}function consolePriority(level){switch(level){case`error`:return 3;case`warning`:return 2;case`info`:case`log`:return 1;case`debug`:return 0;default:return 1}}async function getConsoleMessagesViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts));if(!opts.level)return[...state.console];let min=consolePriority(opts.level);return state.console.filter(msg=>consolePriority(msg.type)>=min)}const INTERACTIVE_ROLES=new Set([`button`,`link`,`textbox`,`checkbox`,`radio`,`combobox`,`listbox`,`menuitem`,`menuitemcheckbox`,`menuitemradio`,`option`,`searchbox`,`slider`,`spinbutton`,`switch`,`tab`,`treeitem`]),CONTENT_ROLES=new Set([`heading`,`cell`,`gridcell`,`columnheader`,`rowheader`,`listitem`,`article`,`region`,`main`,`navigation`]),STRUCTURAL_ROLES=new Set([`generic`,`group`,`list`,`table`,`row`,`rowgroup`,`grid`,`treegrid`,`menu`,`menubar`,`toolbar`,`tablist`,`tree`,`directory`,`document`,`application`,`presentation`,`none`]);function getRoleSnapshotStats(snapshot,refs){let interactive=Object.values(refs).filter(r=>INTERACTIVE_ROLES.has(r.role)).length;return{lines:snapshot.split(`
|
|
2
2
|
`).length,chars:snapshot.length,refs:Object.keys(refs).length,interactive}}function getIndentLevel(line){let match=line.match(/^(\s*)/);return match?Math.floor(match[1].length/2):0}function matchInteractiveSnapshotLine(line,options){let depth=getIndentLevel(line);if(options.maxDepth!==void 0&&depth>options.maxDepth)return null;let match=line.match(/^(\s*-\s*)(\w+)(?:\s+"([^"]*)")?(.*)$/);if(!match)return null;let[,,roleRaw,name,suffix]=match;return roleRaw.startsWith(`/`)?null:{roleRaw,role:roleRaw.toLowerCase(),...name?{name}:{},suffix}}function createRoleNameTracker(){let counts=new Map,refsByKey=new Map;return{counts,refsByKey,getKey(role,name){return`${role}:${name??``}`},getNextIndex(role,name){let key=this.getKey(role,name),current=counts.get(key)??0;return counts.set(key,current+1),current},trackRef(role,name,ref){let key=this.getKey(role,name),list=refsByKey.get(key)??[];list.push(ref),refsByKey.set(key,list)},getDuplicateKeys(){let out=new Set;for(let[key,refs]of refsByKey)refs.length>1&&out.add(key);return out}}}function removeNthFromNonDuplicates(refs,tracker){let duplicates=tracker.getDuplicateKeys();for(let[ref,data]of Object.entries(refs)){let key=tracker.getKey(data.role,data.name);duplicates.has(key)||delete refs[ref]?.nth}}function compactTree(tree){let lines=tree.split(`
|
|
3
3
|
`),result=[];for(let i=0;i<lines.length;i+=1){let line=lines[i];if(line.includes(`[ref=`)){result.push(line);continue}if(line.includes(`:`)&&!line.trimEnd().endsWith(`:`)){result.push(line);continue}let currentIndent=getIndentLevel(line),hasRelevantChildren=!1;for(let j=i+1;j<lines.length&&!(getIndentLevel(lines[j])<=currentIndent);j+=1)if(lines[j]?.includes(`[ref=`)){hasRelevantChildren=!0;break}hasRelevantChildren&&result.push(line)}return result.join(`
|
|
4
4
|
`)}function processLine(line,refs,options,tracker,nextRef){let depth=getIndentLevel(line);if(options.maxDepth!==void 0&&depth>options.maxDepth)return null;let match=line.match(/^(\s*-\s*)(\w+)(?:\s+"([^"]*)")?(.*)$/);if(!match)return options.interactive?null:line;let[,prefix,roleRaw,name,suffix]=match;if(roleRaw.startsWith(`/`))return options.interactive?null:line;let role=roleRaw.toLowerCase(),isInteractive=INTERACTIVE_ROLES.has(role),isContent=CONTENT_ROLES.has(role),isStructural=STRUCTURAL_ROLES.has(role);if(options.interactive&&!isInteractive||options.compact&&isStructural&&!name)return null;if(!(isInteractive||isContent&&name))return line;let ref=nextRef(),nth=tracker.getNextIndex(role,name);tracker.trackRef(role,name,ref),refs[ref]={role,name,nth};let enhanced=`${prefix}${roleRaw}`;return name&&(enhanced+=` "${name}"`),enhanced+=` [ref=${ref}]`,nth>0&&(enhanced+=` [nth=${nth}]`),suffix&&(enhanced+=suffix),enhanced}function parseRoleRef(raw){let trimmed=raw.trim();if(!trimmed)return null;let normalized=trimmed.startsWith(`@`)?trimmed.slice(1):trimmed.startsWith(`ref=`)?trimmed.slice(4):trimmed;return/^e\d+$/.test(normalized)?normalized:null}function buildRoleSnapshotFromAriaSnapshot(ariaSnapshot,options={}){let lines=ariaSnapshot.split(`
|