@seanhogg/builderforce-agents 2026.10.3 → 2026.10.4
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-CxhUn-aN.js → agent-Cu57zjv6.js} +1 -1
- package/dist/{agent-CiEaiH-p.js → agent-LoZ_09Jv.js} +1 -1
- package/dist/{agents-DkKFDcYq.js → agents-Dgrr6E7S.js} +1 -1
- package/dist/{agents-IZrPoZIi.js → agents-DiRof4zA.js} +1 -1
- package/dist/{audio-preflight-COZAlqnx.js → audio-preflight-Cg4vjX8I.js} +1 -1
- package/dist/{auth-choice-CrYQF7zX.js → auth-choice-BJmosINc.js} +1 -1
- package/dist/{auth-choice-DhUBmu6y.js → auth-choice-CDoW8QDy.js} +1 -1
- package/dist/{auth-choice.apply-Botyf6Sg.js → auth-choice.apply-25j_lhua.js} +1 -1
- package/dist/{auth-choice.apply-k9tk1hGj.js → auth-choice.apply-CE1TC_Ts.js} +1 -1
- package/dist/{auth-choice.apply-Cch5UXis.js → auth-choice.apply-DSHzvYNu.js} +1 -1
- package/dist/{auth-choice.apply-CXRcLO-h.js → auth-choice.apply-ND2C2oSe.js} +1 -1
- package/dist/{auth-choice.apply.transformers-BkN8HlZJ.js → auth-choice.apply.transformers-BF-qyu2L.js} +1 -1
- package/dist/{auth-choice.apply.transformers-B9SieNNk.js → auth-choice.apply.transformers-CBQbUAwr.js} +1 -1
- package/dist/{auth-choice.apply.transformers-D02W3zy7.js → auth-choice.apply.transformers-DE9QrzbX.js} +1 -1
- package/dist/{auth-choice.apply.transformers-Dnr7Izx1.js → auth-choice.apply.transformers-vr05ATPq.js} +1 -1
- package/dist/{banner-Bd45EXyp.js → banner-Bx4c92N8.js} +1 -1
- package/dist/build-info.json +3 -3
- package/dist/{builderforce-BxVfTQsc.js → builderforce-DHU87PJG.js} +1 -1
- package/dist/{builderforce-C86noipf.js → builderforce-DgYCZ3Up.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-BHetVK54.js → channel-options-BZoCW2EZ.js} +1 -1
- package/dist/{channel-options-D5PmuxT-.js → channel-options-DAkHvC-x.js} +1 -1
- package/dist/{channel-web-B5QgCj6B.js → channel-web-BWEX1FnI.js} +1 -1
- package/dist/{channels-cli-sHtDH37K.js → channels-cli-DHFIXbTT.js} +1 -1
- package/dist/{channels-cli-CgZqXqUm.js → channels-cli-DvkQEBwz.js} +1 -1
- package/dist/chrome-CbBg1ngA.js +4 -0
- package/dist/{cli-DKoe6Ywl.js → cli-C9bsC2UP.js} +1 -1
- package/dist/{cli-DlaHihmr.js → cli-DnMFuBeA.js} +1 -1
- package/dist/{command-registry-FQIQbQAx.js → command-registry-DUOpdtcT.js} +1 -1
- package/dist/{command-registry-BhyY4aXy.js → command-registry-DrRz6Wgg.js} +1 -1
- package/dist/{completion-cli-D86ydD3X.js → completion-cli-BtLeKqh_.js} +1 -1
- package/dist/{completion-cli-H4iKy2_f.js → completion-cli-Cq33pQdJ.js} +1 -1
- package/dist/{completion-cli-CoFRiwNp.js → completion-cli-EbyCUnCP.js} +1 -1
- package/dist/{completion-cli-DF6vmGRs.js → completion-cli-mzQa8oTd.js} +1 -1
- package/dist/{config-cli-D6KAk3vw.js → config-cli-BIQl_nrn.js} +1 -1
- package/dist/{config-cli-9HoPtGDR.js → config-cli-Dw1pr9MW.js} +1 -1
- package/dist/{configure-B_FvthXy.js → configure-B1HJIRSM.js} +1 -1
- package/dist/{configure-CYwCU0Hw.js → configure-BPX5i4at.js} +1 -1
- package/dist/{configure-BgZGeNXf.js → configure-CKm9_xkS.js} +1 -1
- package/dist/{configure-6QCgecON.js → configure-CQPFd8N9.js} +1 -1
- package/dist/{deps-jUQM2eq1.js → deps-DN7fhGiB.js} +1 -1
- package/dist/{doctor-completion-CZrfkBfj.js → doctor-completion-B7JXY8EJ.js} +1 -1
- package/dist/{doctor-completion-BSbAN5p1.js → doctor-completion-BEVC1EV7.js} +1 -1
- package/dist/{embedded-CA0n2tyG.js → embedded-BBM-usEa.js} +7 -7
- package/dist/{embedded-SSuKQ6Yc.js → embedded-CIuP-6Ex.js} +2 -2
- package/dist/entry.js +1 -1
- package/dist/extensionAPI.js +1 -1
- package/dist/{gateway-cli-8SuDvuCq.js → gateway-cli-CvdguqNO.js} +2 -2
- package/dist/{gateway-cli-D5pW1jLs.js → gateway-cli-DvMzpFIF.js} +2 -2
- package/dist/{health-BLW40WUJ.js → health-Bd0YvHPq.js} +1 -1
- package/dist/{health-DqZB_jd8.js → health-CcUquV5P.js} +1 -1
- package/dist/{health-Cggr6c-2.js → health-CoTbsx1p.js} +1 -1
- package/dist/{hooks-cli-BQZjt-Fk.js → hooks-cli-D1mx0_F_.js} +1 -1
- package/dist/{hooks-cli-D5Zt0sN4.js → hooks-cli-Dr0hMOiz.js} +1 -1
- package/dist/index.js +2 -2
- package/dist/llm-slug-generator.js +1 -1
- package/dist/{models-DH9Vrv7O.js → models-D3MukbTO.js} +1 -1
- package/dist/{models-cli-DLZZwy_m.js → models-cli-CBUEjJ_T.js} +1 -1
- package/dist/{models-cli-CAaWi4TX.js → models-cli-nD2MyRO3.js} +1 -1
- package/dist/{models-bp562zNz.js → models-px2EtCBB.js} +1 -1
- package/dist/{onboard-pzmSj6MG.js → onboard-CelRLEbD.js} +1 -1
- package/dist/{onboard-CpFQ-bpz.js → onboard-D_Ja6cJL.js} +1 -1
- package/dist/{onboard-channels-BsMS0Ehd.js → onboard-channels-C5v3gxTE.js} +1 -1
- package/dist/{onboard-channels-D1FMu5M8.js → onboard-channels-CEMtoVzX.js} +1 -1
- package/dist/{onboard-channels-CKWKLbTn.js → onboard-channels-DIvxrZLb.js} +1 -1
- package/dist/{onboard-channels-CqXCWPaQ.js → onboard-channels-pPjt4AF5.js} +1 -1
- package/dist/{onboard-interactive-BAcb1Yd8.js → onboard-interactive-BIVMtUaZ.js} +1 -1
- package/dist/{onboard-interactive-COTt-hGf.js → onboard-interactive-CeQp6fAt.js} +1 -1
- package/dist/{onboard-interactive-B_YG0JwA.js → onboard-interactive-D3YgFz9n.js} +1 -1
- package/dist/{onboard-interactive-BdwTeKJ2.js → onboard-interactive-tVpsWM3V.js} +1 -1
- package/dist/{onboarding-C8IDtM8O.js → onboarding-B9P9Rocf.js} +2 -2
- package/dist/{onboarding-BhMZqtBx.js → onboarding-DXxufSuN.js} +2 -2
- package/dist/{onboarding.finalize-DpyMh92r.js → onboarding.finalize-BJbv33Sa.js} +1 -1
- package/dist/{onboarding.finalize-DEhEHZPV.js → onboarding.finalize-CiIdxWgH.js} +1 -1
- package/dist/{outbound-send-deps-CKOfRpqk.js → outbound-send-deps-DL5n0r7v.js} +1 -1
- package/dist/{plugin-registry-Bi-9AQMd.js → plugin-registry-B5gTbK3m.js} +1 -1
- package/dist/{plugin-registry-nxUQWv6l.js → plugin-registry-CBXZbshG.js} +1 -1
- package/dist/{plugin-registry-BlKyKAq2.js → plugin-registry-DEWbh_9i.js} +1 -1
- package/dist/{plugin-registry-CqGq9jzk.js → plugin-registry-Glc-xriO.js} +1 -1
- package/dist/plugin-sdk/{channel-web-C3UtHX6b.js → channel-web-CW5s6vEZ.js} +1 -1
- package/dist/plugin-sdk/index.js +1 -1
- package/dist/plugin-sdk/{reply-BTKDKB2t.js → reply-pngAtrhW.js} +2 -2
- package/dist/plugin-sdk/{web-CsPSK9U2.js → web-DfrDkFj_.js} +1 -1
- package/dist/{plugins-CUhWH9-E.js → plugins-BJNBD6Si.js} +1 -1
- package/dist/{plugins-B8Lge-oB.js → plugins-BZnMash4.js} +1 -1
- package/dist/{plugins-cli-c36MSKiX.js → plugins-cli-Cv_bwpr4.js} +1 -1
- package/dist/{plugins-cli-CgjC_YvF.js → plugins-cli-DkFN_JgK.js} +1 -1
- package/dist/{program-QMtnfrM_.js → program-DYU1raxm.js} +2 -2
- package/dist/{program-context-BgCNjcCh.js → program-context-D4S-3zNt.js} +1 -1
- package/dist/{prompt-select-styled-CWG9o2CX.js → prompt-select-styled-BhKY5Oj4.js} +1 -1
- package/dist/{prompt-select-styled-m1_NXutn.js → prompt-select-styled-D1StbM6j.js} +1 -1
- package/dist/{provider-auth-helpers-BFCTgzr_.js → provider-auth-helpers-5ZQb3SEz.js} +1 -1
- package/dist/{provider-auth-helpers-D0eiRpeb.js → provider-auth-helpers-Cibq8oDi.js} +1 -1
- package/dist/{provider-dispatcher-Djomkp5i.js → provider-dispatcher-Bwaplzm8.js} +1 -1
- package/dist/{provider-dispatcher-B6kumPDM.js → provider-dispatcher-kL8Yl9XU.js} +1 -1
- package/dist/{push-apns-DalSFp-6.js → push-apns-BXmSvfvx.js} +1 -1
- package/dist/{push-apns-DwSjHMuA.js → push-apns-C9hsLIBU.js} +1 -1
- package/dist/{pw-ai-1DyAPekE.js → pw-ai-BLyUwyRC.js} +1 -1
- package/dist/{register.agent-BZn434eF.js → register.agent-C4x77WJe.js} +1 -1
- package/dist/{register.agent-DNaHcARI.js → register.agent-CbP_v3k5.js} +1 -1
- package/dist/{register.configure-GTH7BPIx.js → register.configure-B-j2lVkz.js} +1 -1
- package/dist/{register.configure-Bflad790.js → register.configure-BsBerk8U.js} +1 -1
- package/dist/{register.maintenance-Dl7P66Jm.js → register.maintenance-B83yzc-P.js} +1 -1
- package/dist/{register.maintenance-B1XK1zeY.js → register.maintenance-WLPWJ7vr.js} +1 -1
- package/dist/{register.message-CJS3PPCy.js → register.message-BVo8xLbS.js} +1 -1
- package/dist/{register.message-CA5LiG16.js → register.message-DZ9zcORn.js} +1 -1
- package/dist/{register.onboard-Bj6wFSzC.js → register.onboard-CWCqKyU7.js} +1 -1
- package/dist/{register.onboard-4y1mzgCn.js → register.onboard-D9mB9MLj.js} +1 -1
- package/dist/{register.setup-Cvk8SB1q.js → register.setup-BMFb9IC4.js} +1 -1
- package/dist/{register.setup-zLIWO_nF.js → register.setup-C22fWTFR.js} +1 -1
- package/dist/{register.status-health-sessions-CjxA4ATI.js → register.status-health-sessions-BqMqFeMA.js} +1 -1
- package/dist/{register.status-health-sessions-CIYKmgKO.js → register.status-health-sessions-C-jqKRZ5.js} +1 -1
- package/dist/{register.subclis-Ua7PkPpv.js → register.subclis-Ceyv8kgc.js} +1 -1
- package/dist/{register.subclis-Ct4QBaKi.js → register.subclis-DxcQwaQg.js} +1 -1
- package/dist/{reply-gZ_yr2mJ.js → reply-BeKidf2F.js} +4 -4
- package/dist/{run-main-Cyc_C0B-.js → run-main-EhlBxGJB.js} +1 -1
- package/dist/{runner-C1sy_uJN.js → runner-P3IfAnSL.js} +3 -3
- package/dist/{server-node-events-CSsH-eIF.js → server-node-events-BZuSkcbo.js} +1 -1
- package/dist/{server-node-events-Bz_Qo5BV.js → server-node-events-CIsEZSfR.js} +1 -1
- package/dist/{session-dirs-fh5kvbyH.js → session-dirs-DH7k5ehu.js} +1 -1
- package/dist/{session-dirs-DVL9vHmq.js → session-dirs-DgwMogyJ.js} +1 -1
- package/dist/{status-sAc6yoa3.js → status-BY0kS_wo.js} +1 -1
- package/dist/{status-SPonEO1J.js → status-B_SXw9W4.js} +1 -1
- package/dist/{status-DZYF4S6_.js → status-BqEzSHhZ.js} +1 -1
- package/dist/{status-ChEjU5un.js → status-Ca-hgLW_.js} +1 -1
- package/dist/{status-CpxCM8BO.js → status-_KIJcQH-.js} +1 -1
- package/dist/{subagent-registry-BHP3_ka8.js → subagent-registry-98yia-RN.js} +4 -4
- package/dist/{subagent-registry-BYK0Wq_w.js → subagent-registry-Ch9dN-TR.js} +1 -1
- package/dist/{subagent-registry-DR5M5QUP.js → subagent-registry-CiYeuaym.js} +1 -1
- package/dist/{tui-Ujq2bTco.js → tui-BIpdEy5i.js} +2 -2
- package/dist/{tui-BsMw6I4Y.js → tui-DeG1am8h.js} +2 -2
- package/dist/{tui-cli-CLYxMYyC.js → tui-cli-3mxSu-O0.js} +1 -1
- package/dist/{tui-cli-BBKMdwDt.js → tui-cli-CXRFHYWv.js} +1 -1
- package/dist/{update-cli-uQLI7RCN.js → update-cli-BYhJHTZ0.js} +1 -1
- package/dist/{update-cli-BKcCNOzz.js → update-cli-DkgHl95y.js} +1 -1
- package/dist/{web-Bkk568P6.js → web--D7qJmx6.js} +1 -1
- package/dist/{web-wR7gzEVJ.js → web-CgypI7gs.js} +1 -1
- package/dist/{web-CGo9DnE4.js → web-DKmwaw7q.js} +1 -1
- package/dist/{web-DktK5vCb.js → web-Dvcfg5Kd.js} +1 -1
- package/extensions/memory-lancedb/package.json +2 -2
- package/package.json +1 -1
- package/dist/chrome-CAuboFG7.js +0 -4
|
@@ -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-gZ_yr2mJ.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-BT5hARuQ.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-BeKidf2F.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-BT5hARuQ.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,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-D--2AEus.js";import{Dn as readJsonFile,En as createAsyncLock,On as writeJsonAtomic,Yn as estimateBase64DecodedBytes,x as sniffMimeFromBase64}from"./subagent-registry-BHP3_ka8.js";import{n as redactSensitiveText,t as getDefaultRedactPatterns}from"./redact-bWj_-q3j.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-D--2AEus.js";import{Dn as readJsonFile,En as createAsyncLock,On as writeJsonAtomic,Yn as estimateBase64DecodedBytes,x as sniffMimeFromBase64}from"./subagent-registry-98yia-RN.js";import{n as redactSensitiveText,t as getDefaultRedactPatterns}from"./redact-bWj_-q3j.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,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{dt as normalizeBaseUrl}from"./model-selection-C3ZZhhap.js";import{r as formatCliCommand}from"./env-44XUbLhk.js";import"./src-izs0XSXm.js";import"./redact-xFefzy4M.js";import{n as formatErrorMessage}from"./errors-CguQr0Ja.js";import"./config-BP4Wc0fa.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-CAuboFG7.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{dt as normalizeBaseUrl}from"./model-selection-C3ZZhhap.js";import{r as formatCliCommand}from"./env-44XUbLhk.js";import"./src-izs0XSXm.js";import"./redact-xFefzy4M.js";import{n as formatErrorMessage}from"./errors-CguQr0Ja.js";import"./config-BP4Wc0fa.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-CbBg1ngA.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(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import{r as DEFAULT_CHAT_CHANNEL}from"./registry-Cv7CoWAs.js";import{N as setVerbose,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-BcStSGQ1.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import"./logger-AbH8mdkv.js";import{d as normalizeAgentId}from"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import{n as listAgentIds}from"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import"./src-DMo2gLcR.js";import{r as loadConfig}from"./io-wLHeSE2L.js";import"./manifest-registry-DZdPjBqs.js";import"./config-DBrFbWRm.js";import"./model-discovery-CfknTieh.js";import"./model-catalog-CVRB77_N.js";import"./frontmatter-CoaI_oW6.js";import"./skills-CC5ozaMz.js";import"./plugin-skills-DUy_aY2T.js";import"./refresh-B38IMhwx.js";import"./client-BlsvYCEu.js";import{i as randomIdempotencyKey,n as callGateway}from"./call-Gj5Bi_oV.js";import{h as GATEWAY_CLIENT_NAMES,l as normalizeMessageChannel,m as GATEWAY_CLIENT_MODES}from"./message-channel-BjZV4RTT.js";import"./subagent-registry-
|
|
1
|
+
import"./paths-BHg-VHB4.js";import{r as DEFAULT_CHAT_CHANNEL}from"./registry-Cv7CoWAs.js";import{N as setVerbose,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-BcStSGQ1.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import"./logger-AbH8mdkv.js";import{d as normalizeAgentId}from"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import{n as listAgentIds}from"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import"./src-DMo2gLcR.js";import{r as loadConfig}from"./io-wLHeSE2L.js";import"./manifest-registry-DZdPjBqs.js";import"./config-DBrFbWRm.js";import"./model-discovery-CfknTieh.js";import"./model-catalog-CVRB77_N.js";import"./frontmatter-CoaI_oW6.js";import"./skills-CC5ozaMz.js";import"./plugin-skills-DUy_aY2T.js";import"./refresh-B38IMhwx.js";import"./client-BlsvYCEu.js";import{i as randomIdempotencyKey,n as callGateway}from"./call-Gj5Bi_oV.js";import{h as GATEWAY_CLIENT_NAMES,l as normalizeMessageChannel,m as GATEWAY_CLIENT_MODES}from"./message-channel-BjZV4RTT.js";import"./subagent-registry-98yia-RN.js";import"./sessions-C5jAGWOS.js";import"./project-context-store-BFOv5caq.js";import"./tokens-BNwTTeJb.js";import"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import"./send-CgMJqDBP.js";import"./send-DfpZ9T_M.js";import"./with-timeout-ftXvzlo8.js";import"./deliver-DDFTiLT4.js";import"./accounts-DoJYLMfS.js";import"./send-5Vokn3Uv.js";import"./image-ops-Bg9yFwjX.js";import"./redact-bWj_-q3j.js";import"./errors-t5wHPcwh.js";import"./embedded-helpers-CsRjxr3I.js";import"./sandbox-bEma8jFA.js";import"./chrome-Kt4wxGF2.js";import"./tailscale-CgCG7AVQ.js";import"./auth-BNeS9xde.js";import"./server-context-0vSm_r2R.js";import"./routes-BLhXC8oU.js";import"./paths-GamzES41.js";import"./ssrf-BiSQzdcA.js";import"./store-C5LmVaEC.js";import"./ports-LqFTyTSK.js";import"./trash-zs6gNxed.js";import"./accounts-BT-NzzBc.js";import"./paths-BQ9W7Bs0.js";import"./tool-images-DV2HMmx4.js";import"./workspace-BnrYivUM.js";import"./reply-prefix-9hmbzubX.js";import"./sqlite-BEgCClMz.js";import"./memory-cli-BBsTN63-.js";import"./manager-BXMwSRz1.js";import"./gemini-auth-qrDeJkh5.js";import"./retry-Cc6xusE8.js";import"./common-BRdxH-uH.js";import"./runner-qhKGerma.js";import"./tool-display-BIswnHaq.js";import"./chunk-hYck1V5_.js";import"./markdown-tables-CpqWBduK.js";import"./fetch-guard-CoGEds8D.js";import"./fetch-CUsKv8oj.js";import"./ir-CTE1iR41.js";import"./render-1ABBE2Y6.js";import"./builderforcellm-syscheck-BTolQUtx.js";import"./session-utils-DDDkCdFF.js";import"./coding-tools.policy-CtBT-KXm.js";import"./pairing-store-sCqmKjk2.js";import"./fetch-CrbOFvsL.js";import"./exec-approvals-Cn0K-HtJ.js";import"./nodes-screen-OI7tHqlU.js";import"./session-cost-usage-BgZfN_WR.js";import"./provider-usage-nRVDmUHj.js";import"./send-COUZMiIL.js";import"./outbound-attachment-Bed_0M10.js";import"./delivery-queue-DQXq7KUU.js";import"./project-context-De5-TWPH.js";import"./control-service-DYVIKl0J.js";import"./stagger-CUH5rlmS.js";import"./channel-selection-CLFizn8u.js";import"./send-CWzV8Zdx.js";import"./resolve-route-D3X-bXU-.js";import"./channel-activity-By7lsk7N.js";import"./tables-XzBUkZcJ.js";import{t as formatDocsLink}from"./links-B6LU5cXN.js";import{n as runCommandWithRuntime}from"./cli-utils-ByV85M53.js";import{t as formatHelpExamples}from"./help-format-DIDk_7gh.js";import{n as withProgress}from"./progress-BQMO_-7I.js";import"./replies-CiPwT32C.js";import"./onboard-helpers-Xl1gvLzt.js";import"./prompt-style-CZOeG0sw.js";import"./pairing-labels-DVbgCApx.js";import"./active-listener-BC31MA4v.js";import"./mamba-state-engine-CViPpwyy.js";import"./transformers-stream-nSL4Xu31.js";import{t as hasExplicitOptions}from"./command-options-I0sHK97L.js";import"./catalog-myy00TyP.js";import"./note-BvXfFmlu.js";import"./clack-prompter-ZmHdfPGJ.js";import"./helpers-DDS6DSK4.js";import"./plugin-auto-enable-Cxqw7Sa6.js";import"./install-safe-path-BxCb3BJW.js";import"./npm-registry-spec-DXx5hKYJ.js";import"./skill-scanner-B9E9x-dj.js";import"./installs-DwlFaoUO.js";import"./onboard-channels-CEMtoVzX.js";import"./config-validation--7EIcLxH.js";import{t as collectOption}from"./helpers-lceKHGsd.js";import{n as createDefaultDeps}from"./outbound-send-deps-DL5n0r7v.js";import"./agents.config-DanaEBfo.js";import{n as resolveSessionKeyForRequest,t as agentCommand}from"./agent-LoZ_09Jv.js";import"./shared-WIJmFKqL.js";import"./onboard-auth.credentials-f-xn5D4D.js";import"./auth-token-DGYih1b5.js";import"./logging-CRzk-5ye.js";import"./provider-auth-helpers-Cibq8oDi.js";import{i as agentsAddCommand,n as agentsSetIdentityCommand,r as agentsDeleteCommand,t as agentsListCommand}from"./agents-DiRof4zA.js";import"./auth-choice.apply-CE1TC_Ts.js";import"./openai-model-default-C9iQBo_x.js";import"./model-picker-Dz1ecLd0.js";import"./auth-choice.apply.transformers-CBQbUAwr.js";import"./auth-choice-BMeBDEfj.js";function parseTimeoutSeconds(opts){let raw=opts.timeout===void 0?opts.cfg.agents?.defaults?.timeoutSeconds??600:Number.parseInt(String(opts.timeout),10);if(Number.isNaN(raw)||raw<0)throw Error(`--timeout must be a non-negative integer (seconds; 0 means no timeout)`);return raw}function formatPayloadForLog(payload){let lines=[];payload.text&&lines.push(payload.text.trimEnd());let mediaUrl=typeof payload.mediaUrl==`string`&&payload.mediaUrl.trim()?payload.mediaUrl.trim():void 0,media=payload.mediaUrls??(mediaUrl?[mediaUrl]:[]);for(let url of media)lines.push(`MEDIA:${url}`);return lines.join(`
|
|
2
2
|
`).trimEnd()}async function agentViaGatewayCommand(opts,runtime){let body=(opts.message??``).trim();if(!body)throw Error(`Message (--message) is required`);if(!opts.to&&!opts.sessionId&&!opts.agent)throw Error(`Pass --to <E.164>, --session-id, or --agent to choose a session`);let cfg=loadConfig(),agentIdRaw=opts.agent?.trim(),agentId=agentIdRaw?normalizeAgentId(agentIdRaw):void 0;if(agentId&&!listAgentIds(cfg).includes(agentId))throw Error(`Unknown agent id "${agentIdRaw}". Use "${formatCliCommand(`builderforce agents list`)}" to see configured agents.`);let timeoutSeconds=parseTimeoutSeconds({cfg,timeout:opts.timeout}),gatewayTimeoutMs=timeoutSeconds===0?2147e6:Math.max(1e4,(timeoutSeconds+30)*1e3),sessionKey=resolveSessionKeyForRequest({cfg,agentId,to:opts.to,sessionId:opts.sessionId}).sessionKey,channel=normalizeMessageChannel(opts.channel)??DEFAULT_CHAT_CHANNEL,idempotencyKey=opts.runId?.trim()||randomIdempotencyKey(),response=await withProgress({label:`Waiting for agent reply…`,indeterminate:!0,enabled:opts.json!==!0},async()=>await callGateway({method:`agent`,params:{message:body,agentId,to:opts.to,replyTo:opts.replyTo,sessionId:opts.sessionId,sessionKey,thinking:opts.thinking,deliver:!!opts.deliver,channel,replyChannel:opts.replyChannel,replyAccountId:opts.replyAccount,timeout:timeoutSeconds,lane:opts.lane,extraSystemPrompt:opts.extraSystemPrompt,idempotencyKey},expectFinal:!0,timeoutMs:gatewayTimeoutMs,clientName:GATEWAY_CLIENT_NAMES.CLI,mode:GATEWAY_CLIENT_MODES.CLI}));if(opts.json)return runtime.log(JSON.stringify(response,null,2)),response;let payloads=response?.result?.payloads??[];if(payloads.length===0)return runtime.log(response?.summary?String(response.summary):`No reply from agent.`),response;for(let payload of payloads){let out=formatPayloadForLog(payload);out&&runtime.log(out)}return response}async function agentCliCommand(opts,runtime,deps){let localOpts={...opts,agentId:opts.agent,replyAccountId:opts.replyAccount};if(opts.local===!0)return await agentCommand(localOpts,runtime,deps);try{return await agentViaGatewayCommand(opts,runtime)}catch(err){return runtime.error?.(`Gateway agent failed; falling back to embedded: ${String(err)}`),await agentCommand(localOpts,runtime,deps)}}function registerAgentCommands(program,args){program.command(`agent`).description(`Run an agent turn via the Gateway (use --local for embedded)`).requiredOption(`-m, --message <text>`,`Message body for the agent`).option(`-t, --to <number>`,`Recipient number in E.164 used to derive the session key`).option(`--session-id <id>`,`Use an explicit session id`).option(`--agent <id>`,`Agent id (overrides routing bindings)`).option(`--thinking <level>`,`Thinking level: off | minimal | low | medium | high`).option(`--verbose <on|off>`,`Persist agent verbose level for the session`).option(`--channel <channel>`,`Delivery channel: ${args.agentChannelOptions} (default: ${DEFAULT_CHAT_CHANNEL})`).option(`--reply-to <target>`,`Delivery target override (separate from session routing)`).option(`--reply-channel <channel>`,`Delivery channel override (separate from routing)`).option(`--reply-account <id>`,`Delivery account id override`).option(`--local`,`Run the embedded agent locally (requires model provider API keys in your shell)`,!1).option(`--deliver`,`Send the agent's reply back to the selected channel`,!1).option(`--json`,`Output result as JSON`,!1).option(`--timeout <seconds>`,`Override agent command timeout (seconds, default 600 or config value)`).addHelpText(`after`,()=>`
|
|
3
3
|
${theme.heading(`Examples:`)}
|
|
4
4
|
${formatHelpExamples([[`builderforce agent --to +15555550123 --message "status update"`,`Start a new session.`],[`builderforce agent --agent ops --message "Summarize logs"`,`Use a specific agent.`],[`builderforce agent --session-id 1234 --message "Summarize inbox" --thinking medium`,`Target a session with explicit thinking level.`],[`builderforce agent --to +15555550123 --message "Trace logs" --verbose on --json`,`Enable verbose logging and JSON output.`],[`builderforce agent --to +15555550123 --message "Summon reply" --deliver`,`Deliver reply.`],[`builderforce agent --agent ops --message "Generate report" --deliver --reply-channel slack --reply-to "#reports"`,`Send reply to a different channel/target.`]])}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import{B as theme,C as shortenHomePath,P as setVerbose,b as resolveUserPath}from"./utils-DbaBVFaK.js";import"./embedded-helpers-DHfhLu2W.js";import"./reply-
|
|
1
|
+
import"./paths-5FcIFMsj.js";import{B as theme,C as shortenHomePath,P as setVerbose,b as resolveUserPath}from"./utils-DbaBVFaK.js";import"./embedded-helpers-DHfhLu2W.js";import"./reply-BeKidf2F.js";import{d as normalizeAgentId,n as DEFAULT_ACCOUNT_ID,r as DEFAULT_AGENT_ID}from"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import{r as DEFAULT_CHAT_CHANNEL}from"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import{A as resolveWorkspaceFilePath,C as WORKSPACE_RUNTIME_DIRNAME,_ as DEFAULT_IDENTITY_FILENAME,c as resolveAgentWorkspaceDir,i as resolveAgentDir,l as resolveDefaultAgentId,n as listAgentIds,t as listAgentEntries}from"./agent-scope-DPtjOxzp.js";import{Xt as resolveAuthStorePath,qt as ensureAuthProfileStore}from"./model-selection-DlYajIzF.js";import{t as formatCliCommand}from"./command-format-Dd7BgZsg.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./src-CQLQD-1r.js";import{c as writeConfigFile,r as loadConfig}from"./io-DhUMGsxN.js";import"./manifest-registry-CBVaj2md.js";import"./config-lGOyM6Kq.js";import"./runner-CDpBWK3-.js";import"./model-catalog-BQUEoIev.js";import"./sandbox-Cq6rH4hg.js";import"./chrome-BW8dGyxs.js";import"./tailscale-0ey4P_at.js";import"./auth-C4PxZEj8.js";import"./server-context-1YSNvKDs.js";import"./frontmatter-DpzOtLJz.js";import"./skills-vjE49XV9.js";import"./plugin-skills-RFjYtysK.js";import"./routes-DsdK6VOy.js";import"./redact-BT5hARuQ.js";import"./errors-BK3rMW8O.js";import"./paths-CejDLFxE.js";import"./ssrf-DHJTyOuH.js";import"./image-ops-D7Ex-H05.js";import"./store-Nf9BxXC7.js";import"./ports-B-SXoPqJ.js";import"./trash-DlNzpifq.js";import"./sessions-Dv212g1O.js";import{h as GATEWAY_CLIENT_NAMES,l as normalizeMessageChannel,m as GATEWAY_CLIENT_MODES}from"./message-channel-BW_q2nVi.js";import{n as listChannelPlugins,r as normalizeChannelId,t as getChannelPlugin}from"./plugins-C0lu7LGS.js";import"./accounts-2InvZDx2.js";import"./accounts-CrKsbGuP.js";import"./accounts-BnsrG5TA.js";import"./bindings-qYFdqpJ3.js";import"./send-DSwQqUiD.js";import"./send-BGZYkspG.js";import{s as resolveSessionTranscriptsDirForAgent}from"./paths-DCzWXtSj.js";import"./tool-images-CR9Y0R5I.js";import"./tool-display-Dx-rz3CF.js";import"./fetch-guard-DxN_CtRp.js";import"./api-key-rotation-BbNoamfM.js";import"./fetch-CMEvVIy8.js";import"./sqlite-BxinAVYp.js";import"./tokens-Ct4DyfhX.js";import"./project-context-store-BPhHGfFl.js";import"./with-timeout-DTcvZn3s.js";import"./deliver-CrB451sO.js";import"./send-ZCmcplsV.js";import"./workspace-eFrsAV2Q.js";import"./reply-prefix-BwtP84WV.js";import"./memory-cli-Dgqoendm.js";import"./manager-pjodgk3H.js";import"./retry-Jis-ZZfm.js";import"./client-BxPDO8Ed.js";import{i as randomIdempotencyKey,n as callGateway}from"./call-DLeUWFtQ.js";import"./common-W8GhA4hE.js";import"./chunk-B9aj7NGY.js";import"./markdown-tables-iDNbGky8.js";import"./ir-EgWVNCXR.js";import"./render-CSLaFZoy.js";import"./builderforcellm-syscheck-BpNlQ4Rx.js";import"./send-iQicMwPr.js";import"./outbound-attachment-BR2FQu7J.js";import"./fetch-B6_hd7w9.js";import"./delivery-queue-BZWZDdpJ.js";import"./channel-activity-GeHNfvd4.js";import"./tables-D5WcKZWq.js";import"./pairing-store-PKyjZas4.js";import{t as formatDocsLink}from"./links-CYRGsVCu.js";import{n as runCommandWithRuntime}from"./cli-utils-BLNnV_WG.js";import{t as formatHelpExamples}from"./help-format-NhTn4dWd.js";import{n as withProgress}from"./progress-OKwbfa23.js";import"./resolve-route-EE2-ObOq.js";import"./replies-BhjI7rPj.js";import"./refresh-Cyy0oi_E.js";import"./coding-tools.policy-DQxeoYmD.js";import"./send-C9xXqEqr.js";import{a as ensureWorkspaceAndSessions,l as moveToTrash}from"./onboard-helpers-DHGeaHZA.js";import"./prompt-style-BwwmGo3-.js";import"./pairing-labels-BpeDWVFP.js";import"./session-cost-usage-BDkGtjt9.js";import"./provider-usage-BqXFLAwn.js";import"./active-listener-DBdxNyOd.js";import"./exec-approvals-kmxxyvIe.js";import"./nodes-screen-BWDONgPE.js";import"./project-context-Dp8w9r_P.js";import"./control-service-Bkbx5ybP.js";import"./stagger-NaB6u1z1.js";import"./channel-selection-BjcuqdFb.js";import"./mamba-state-engine-DPAATSLG.js";import"./transformers-stream-QS2dnQob.js";import{t as createDefaultDeps}from"./deps-DN7fhGiB.js";import{t as collectOption}from"./helpers-WeAzElGL.js";import"./catalog-BIdILD-k.js";import{t as hasExplicitOptions}from"./command-options-BrcCiCUA.js";import"./note-CvzMolLy.js";import{t as WizardCancelledError}from"./prompts-Yv4eTTSo.js";import{t as createClackPrompter}from"./clack-prompter-6Booc-eg.js";import{t as resolveChannelDefaultAccountId}from"./helpers-_XD3UAOf.js";import"./plugin-auto-enable-CWK7KiRF.js";import"./install-safe-path-BUT0oL1h.js";import"./npm-registry-spec-BKmYHCba.js";import"./skill-scanner-CN9z0hSY.js";import"./installs-D4ygbqdx.js";import{n as setupChannels}from"./onboard-channels-DIvxrZLb.js";import{t as requireValidConfigSnapshot}from"./config-validation-CsNptH5K.js";import{a as pruneAgentConfig,c as parseIdentityMarkdown,i as loadAgentIdentity,n as buildAgentSummaries,o as identityHasValues,r as findAgentEntryIndex,t as applyAgentConfig}from"./agents.config-D4ThL3Cg.js";import{n as resolveSessionKeyForRequest,t as agentCommand}from"./agent-Cu57zjv6.js";import"./shared-BMSboHpU.js";import"./onboard-auth.credentials-Dt_yky3w.js";import"./auth-token-CeCyq7Zg.js";import{n as logConfigUpdated}from"./logging-9jbJihk2.js";import"./provider-auth-helpers-5ZQb3SEz.js";import{t as promptAuthChoiceGrouped}from"./auth-choice-prompt-D_tSFWQL.js";import{t as applyAuthChoice}from"./auth-choice.apply-25j_lhua.js";import"./openai-model-default-DqkGItdN.js";import"./model-picker-DWc0Kexq.js";import"./auth-choice.apply.transformers-DE9QrzbX.js";import{n as warnIfModelConfigLooksOff}from"./auth-choice-DvKzhGrY.js";import path from"node:path";import fs from"node:fs/promises";function parseTimeoutSeconds(opts){let raw=opts.timeout===void 0?opts.cfg.agents?.defaults?.timeoutSeconds??600:Number.parseInt(String(opts.timeout),10);if(Number.isNaN(raw)||raw<0)throw Error(`--timeout must be a non-negative integer (seconds; 0 means no timeout)`);return raw}function formatPayloadForLog(payload){let lines=[];payload.text&&lines.push(payload.text.trimEnd());let mediaUrl=typeof payload.mediaUrl==`string`&&payload.mediaUrl.trim()?payload.mediaUrl.trim():void 0,media=payload.mediaUrls??(mediaUrl?[mediaUrl]:[]);for(let url of media)lines.push(`MEDIA:${url}`);return lines.join(`
|
|
2
2
|
`).trimEnd()}async function agentViaGatewayCommand(opts,runtime){let body=(opts.message??``).trim();if(!body)throw Error(`Message (--message) is required`);if(!opts.to&&!opts.sessionId&&!opts.agent)throw Error(`Pass --to <E.164>, --session-id, or --agent to choose a session`);let cfg=loadConfig(),agentIdRaw=opts.agent?.trim(),agentId=agentIdRaw?normalizeAgentId(agentIdRaw):void 0;if(agentId&&!listAgentIds(cfg).includes(agentId))throw Error(`Unknown agent id "${agentIdRaw}". Use "${formatCliCommand(`builderforce agents list`)}" to see configured agents.`);let timeoutSeconds=parseTimeoutSeconds({cfg,timeout:opts.timeout}),gatewayTimeoutMs=timeoutSeconds===0?2147e6:Math.max(1e4,(timeoutSeconds+30)*1e3),sessionKey=resolveSessionKeyForRequest({cfg,agentId,to:opts.to,sessionId:opts.sessionId}).sessionKey,channel=normalizeMessageChannel(opts.channel)??DEFAULT_CHAT_CHANNEL,idempotencyKey=opts.runId?.trim()||randomIdempotencyKey(),response=await withProgress({label:`Waiting for agent reply…`,indeterminate:!0,enabled:opts.json!==!0},async()=>await callGateway({method:`agent`,params:{message:body,agentId,to:opts.to,replyTo:opts.replyTo,sessionId:opts.sessionId,sessionKey,thinking:opts.thinking,deliver:!!opts.deliver,channel,replyChannel:opts.replyChannel,replyAccountId:opts.replyAccount,timeout:timeoutSeconds,lane:opts.lane,extraSystemPrompt:opts.extraSystemPrompt,idempotencyKey},expectFinal:!0,timeoutMs:gatewayTimeoutMs,clientName:GATEWAY_CLIENT_NAMES.CLI,mode:GATEWAY_CLIENT_MODES.CLI}));if(opts.json)return runtime.log(JSON.stringify(response,null,2)),response;let payloads=response?.result?.payloads??[];if(payloads.length===0)return runtime.log(response?.summary?String(response.summary):`No reply from agent.`),response;for(let payload of payloads){let out=formatPayloadForLog(payload);out&&runtime.log(out)}return response}async function agentCliCommand(opts,runtime,deps){let localOpts={...opts,agentId:opts.agent,replyAccountId:opts.replyAccount};if(opts.local===!0)return await agentCommand(localOpts,runtime,deps);try{return await agentViaGatewayCommand(opts,runtime)}catch(err){return runtime.error?.(`Gateway agent failed; falling back to embedded: ${String(err)}`),await agentCommand(localOpts,runtime,deps)}}function bindingMatchKey(match){let accountId=match.accountId?.trim()||DEFAULT_ACCOUNT_ID;return[match.channel,accountId,match.peer?.kind??``,match.peer?.id??``,match.guildId??``,match.teamId??``].join(`|`)}function describeBinding(binding){let match=binding.match,parts=[match.channel];return match.accountId&&parts.push(`accountId=${match.accountId}`),match.peer&&parts.push(`peer=${match.peer.kind}:${match.peer.id}`),match.guildId&&parts.push(`guild=${match.guildId}`),match.teamId&&parts.push(`team=${match.teamId}`),parts.join(` `)}function applyAgentBindings(cfg,bindings){let existing=cfg.bindings??[],existingMatchMap=new Map;for(let binding of existing){let key=bindingMatchKey(binding.match);existingMatchMap.has(key)||existingMatchMap.set(key,normalizeAgentId(binding.agentId))}let added=[],skipped=[],conflicts=[];for(let binding of bindings){let agentId=normalizeAgentId(binding.agentId),key=bindingMatchKey(binding.match),existingAgentId=existingMatchMap.get(key);if(existingAgentId){existingAgentId===agentId?skipped.push(binding):conflicts.push({binding,existingAgentId});continue}existingMatchMap.set(key,agentId),added.push({...binding,agentId})}return added.length===0?{config:cfg,added,skipped,conflicts}:{config:{...cfg,bindings:[...existing,...added]},added,skipped,conflicts}}function resolveDefaultAccountId$1(cfg,provider){let plugin=getChannelPlugin(provider);return plugin?resolveChannelDefaultAccountId({plugin,cfg}):DEFAULT_ACCOUNT_ID}function buildChannelBindings(params){let bindings=[],agentId=normalizeAgentId(params.agentId);for(let channel of params.selection){let match={channel},accountId=params.accountIds?.[channel]?.trim();accountId?match.accountId=accountId:getChannelPlugin(channel)?.meta.forceAccountBinding&&(match.accountId=resolveDefaultAccountId$1(params.config,channel)),bindings.push({agentId,match})}return bindings}function parseBindingSpecs(params){let bindings=[],errors=[],specs=params.specs??[],agentId=normalizeAgentId(params.agentId);for(let raw of specs){let trimmed=raw?.trim();if(!trimmed)continue;let[channelRaw,accountRaw]=trimmed.split(`:`,2),channel=normalizeChannelId(channelRaw);if(!channel){errors.push(`Unknown channel "${channelRaw}".`);continue}let accountId=accountRaw?.trim();if(accountRaw!==void 0&&!accountId){errors.push(`Invalid binding "${trimmed}" (empty account id).`);continue}accountId||getChannelPlugin(channel)?.meta.forceAccountBinding&&(accountId=resolveDefaultAccountId$1(params.config,channel));let match={channel};accountId&&(match.accountId=accountId),bindings.push({agentId,match})}return{bindings,errors}}function createQuietRuntime(runtime){return{...runtime,log:()=>{}}}async function requireValidConfig(runtime){return await requireValidConfigSnapshot(runtime)}async function fileExists(pathname){try{return await fs.stat(pathname),!0}catch{return!1}}async function agentsAddCommand(opts,runtime=defaultRuntime,params){let cfg=await requireValidConfig(runtime);if(!cfg)return;let workspaceFlag=opts.workspace?.trim(),nameInput=opts.name?.trim(),hasFlags=params?.hasFlags===!0,nonInteractive=!!(opts.nonInteractive||hasFlags);if(nonInteractive&&!workspaceFlag){runtime.error(`Non-interactive mode requires --workspace. Re-run without flags to use the wizard.`),runtime.exit(1);return}if(nonInteractive){if(!nameInput){runtime.error(`Agent name is required in non-interactive mode.`),runtime.exit(1);return}if(!workspaceFlag){runtime.error(`Non-interactive mode requires --workspace. Re-run without flags to use the wizard.`),runtime.exit(1);return}let agentId=normalizeAgentId(nameInput);if(agentId===DEFAULT_AGENT_ID){runtime.error(`"${DEFAULT_AGENT_ID}" is reserved. Choose another name.`),runtime.exit(1);return}if(agentId!==nameInput&&runtime.log(`Normalized agent id to "${agentId}".`),findAgentEntryIndex(listAgentEntries(cfg),agentId)>=0){runtime.error(`Agent "${agentId}" already exists.`),runtime.exit(1);return}let workspaceDir=resolveUserPath(workspaceFlag),agentDir=opts.agentDir?.trim()?resolveUserPath(opts.agentDir.trim()):resolveAgentDir(cfg,agentId),model=opts.model?.trim(),nextConfig=applyAgentConfig(cfg,{agentId,name:nameInput,workspace:workspaceDir,agentDir,...model?{model}:{}}),bindingParse=parseBindingSpecs({agentId,specs:opts.bind,config:nextConfig});if(bindingParse.errors.length>0){runtime.error(bindingParse.errors.join(`
|
|
3
3
|
`)),runtime.exit(1);return}let bindingResult=bindingParse.bindings.length>0?applyAgentBindings(nextConfig,bindingParse.bindings):{config:nextConfig,added:[],skipped:[],conflicts:[]};await writeConfigFile(bindingResult.config),opts.json||logConfigUpdated(runtime),await ensureWorkspaceAndSessions(workspaceDir,opts.json?createQuietRuntime(runtime):runtime,{skipBootstrap:!!bindingResult.config.agents?.defaults?.skipBootstrap,agentId});let payload={agentId,name:nameInput,workspace:workspaceDir,agentDir,model,bindings:{added:bindingResult.added.map(describeBinding),skipped:bindingResult.skipped.map(describeBinding),conflicts:bindingResult.conflicts.map(conflict=>`${describeBinding(conflict.binding)} (agent=${conflict.existingAgentId})`)}};opts.json?runtime.log(JSON.stringify(payload,null,2)):(runtime.log(`Agent: ${agentId}`),runtime.log(`Workspace: ${shortenHomePath(workspaceDir)}`),runtime.log(`Agent dir: ${shortenHomePath(agentDir)}`),model&&runtime.log(`Model: ${model}`),bindingResult.conflicts.length>0&&runtime.error([`Skipped bindings already claimed by another agent:`,...bindingResult.conflicts.map(conflict=>`- ${describeBinding(conflict.binding)} (agent=${conflict.existingAgentId})`)].join(`
|
|
4
4
|
`)));return}let prompter=createClackPrompter();try{await prompter.intro(`Add BuilderForceAgents agent`);let name=nameInput??await prompter.text({message:`Agent name`,validate:value=>{if(!value?.trim())return`Required`;if(normalizeAgentId(value)===DEFAULT_AGENT_ID)return`"${DEFAULT_AGENT_ID}" is reserved. Choose another name.`}}),agentName=String(name??``).trim(),agentId=normalizeAgentId(agentName);if(agentName!==agentId&&await prompter.note(`Normalized id to "${agentId}".`,`Agent id`),listAgentEntries(cfg).find(agent=>normalizeAgentId(agent.id)===agentId)&&!await prompter.confirm({message:`Agent "${agentId}" already exists. Update it?`,initialValue:!1})){await prompter.outro(`No changes made.`);return}let workspaceDefault=resolveAgentWorkspaceDir(cfg,agentId),workspaceInput=await prompter.text({message:`Workspace directory`,initialValue:workspaceDefault,validate:value=>value?.trim()?void 0:`Required`}),workspaceDir=resolveUserPath(String(workspaceInput??``).trim()||workspaceDefault),agentDir=resolveAgentDir(cfg,agentId),nextConfig=applyAgentConfig(cfg,{agentId,name:agentName,workspace:workspaceDir,agentDir}),defaultAgentId=resolveDefaultAgentId(cfg);if(defaultAgentId!==agentId){let sourceAuthPath=resolveAuthStorePath(resolveAgentDir(cfg,defaultAgentId)),destAuthPath=resolveAuthStorePath(agentDir);path.resolve(sourceAuthPath).toLowerCase()!==path.resolve(destAuthPath).toLowerCase()&&await fileExists(sourceAuthPath)&&!await fileExists(destAuthPath)&&await prompter.confirm({message:`Copy auth profiles from "${defaultAgentId}"?`,initialValue:!1})&&(await fs.mkdir(path.dirname(destAuthPath),{recursive:!0}),await fs.copyFile(sourceAuthPath,destAuthPath),await prompter.note(`Copied auth profiles from "${defaultAgentId}".`,`Auth profiles`))}if(await prompter.confirm({message:`Configure model/auth for this agent now?`,initialValue:!1})){let authResult=await applyAuthChoice({authChoice:await promptAuthChoiceGrouped({prompter,store:await ensureAuthProfileStore(agentDir,{allowKeychainPrompt:!1}),includeSkip:!0}),config:nextConfig,prompter,runtime,agentDir,setDefaultModel:!1,agentId});nextConfig=authResult.config,authResult.agentModelOverride&&(nextConfig=applyAgentConfig(nextConfig,{agentId,model:authResult.agentModelOverride}))}await warnIfModelConfigLooksOff(nextConfig,prompter,{agentId,agentDir});let selection=[],channelAccountIds={};if(nextConfig=await setupChannels(nextConfig,runtime,prompter,{allowSignalInstall:!0,onSelection:value=>{selection=value},promptAccountIds:!0,onAccountId:(channel,accountId)=>{channelAccountIds[channel]=accountId}}),selection.length>0)if(await prompter.confirm({message:`Route selected channels to this agent now? (bindings)`,initialValue:!1})){let desiredBindings=buildChannelBindings({agentId,selection,config:nextConfig,accountIds:channelAccountIds}),result=applyAgentBindings(nextConfig,desiredBindings);nextConfig=result.config,result.conflicts.length>0&&await prompter.note([`Skipped bindings already claimed by another agent:`,...result.conflicts.map(conflict=>`- ${describeBinding(conflict.binding)} (agent=${conflict.existingAgentId})`)].join(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-BcStSGQ1.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import"./src-DMo2gLcR.js";import"./io-wLHeSE2L.js";import"./manifest-registry-DZdPjBqs.js";import"./config-DBrFbWRm.js";import"./model-discovery-CfknTieh.js";import"./model-catalog-CVRB77_N.js";import"./frontmatter-CoaI_oW6.js";import"./skills-CC5ozaMz.js";import"./plugin-skills-DUy_aY2T.js";import"./skills-status-DILzO06u.js";import"./refresh-B38IMhwx.js";import"./client-BlsvYCEu.js";import"./call-Gj5Bi_oV.js";import"./message-channel-BjZV4RTT.js";import"./subagent-registry-
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-BcStSGQ1.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import"./src-DMo2gLcR.js";import"./io-wLHeSE2L.js";import"./manifest-registry-DZdPjBqs.js";import"./config-DBrFbWRm.js";import"./model-discovery-CfknTieh.js";import"./model-catalog-CVRB77_N.js";import"./frontmatter-CoaI_oW6.js";import"./skills-CC5ozaMz.js";import"./plugin-skills-DUy_aY2T.js";import"./skills-status-DILzO06u.js";import"./refresh-B38IMhwx.js";import"./client-BlsvYCEu.js";import"./call-Gj5Bi_oV.js";import"./message-channel-BjZV4RTT.js";import"./subagent-registry-98yia-RN.js";import"./sessions-C5jAGWOS.js";import"./project-context-store-BFOv5caq.js";import"./tokens-BNwTTeJb.js";import"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import"./send-CgMJqDBP.js";import"./send-DfpZ9T_M.js";import"./with-timeout-ftXvzlo8.js";import"./deliver-DDFTiLT4.js";import"./accounts-DoJYLMfS.js";import"./send-5Vokn3Uv.js";import"./image-ops-Bg9yFwjX.js";import"./redact-bWj_-q3j.js";import"./errors-t5wHPcwh.js";import"./embedded-helpers-CsRjxr3I.js";import"./sandbox-bEma8jFA.js";import"./chrome-Kt4wxGF2.js";import"./tailscale-CgCG7AVQ.js";import"./auth-BNeS9xde.js";import"./server-context-0vSm_r2R.js";import"./routes-BLhXC8oU.js";import"./paths-GamzES41.js";import"./ssrf-BiSQzdcA.js";import"./store-C5LmVaEC.js";import"./ports-LqFTyTSK.js";import"./trash-zs6gNxed.js";import"./accounts-BT-NzzBc.js";import"./paths-BQ9W7Bs0.js";import"./tool-images-DV2HMmx4.js";import"./workspace-BnrYivUM.js";import"./reply-prefix-9hmbzubX.js";import"./sqlite-BEgCClMz.js";import"./memory-cli-BBsTN63-.js";import"./manager-BXMwSRz1.js";import"./gemini-auth-qrDeJkh5.js";import"./retry-Cc6xusE8.js";import"./common-BRdxH-uH.js";import"./runner-qhKGerma.js";import"./tool-display-BIswnHaq.js";import"./chunk-hYck1V5_.js";import"./markdown-tables-CpqWBduK.js";import"./fetch-guard-CoGEds8D.js";import"./fetch-CUsKv8oj.js";import"./ir-CTE1iR41.js";import"./render-1ABBE2Y6.js";import"./builderforcellm-syscheck-BTolQUtx.js";import"./session-utils-DDDkCdFF.js";import"./coding-tools.policy-CtBT-KXm.js";import"./pairing-store-sCqmKjk2.js";import"./fetch-CrbOFvsL.js";import"./exec-approvals-Cn0K-HtJ.js";import"./nodes-screen-OI7tHqlU.js";import"./session-cost-usage-BgZfN_WR.js";import"./provider-usage-nRVDmUHj.js";import"./send-COUZMiIL.js";import"./outbound-attachment-Bed_0M10.js";import"./delivery-queue-DQXq7KUU.js";import"./project-context-De5-TWPH.js";import"./control-service-DYVIKl0J.js";import"./stagger-CUH5rlmS.js";import"./channel-selection-CLFizn8u.js";import"./send-CWzV8Zdx.js";import"./resolve-route-D3X-bXU-.js";import"./channel-activity-By7lsk7N.js";import"./tables-XzBUkZcJ.js";import{t as formatDocsLink}from"./links-B6LU5cXN.js";import{n as runCommandWithRuntime}from"./cli-utils-ByV85M53.js";import"./help-format-DIDk_7gh.js";import"./progress-BQMO_-7I.js";import"./replies-CiPwT32C.js";import"./onboard-helpers-Xl1gvLzt.js";import"./prompt-style-CZOeG0sw.js";import"./pairing-labels-DVbgCApx.js";import"./active-listener-BC31MA4v.js";import"./mamba-state-engine-CViPpwyy.js";import"./transformers-stream-nSL4Xu31.js";import"./catalog-myy00TyP.js";import"./note-BvXfFmlu.js";import"./clack-prompter-ZmHdfPGJ.js";import"./helpers-DDS6DSK4.js";import"./plugin-auto-enable-Cxqw7Sa6.js";import"./install-safe-path-BxCb3BJW.js";import"./npm-registry-spec-DXx5hKYJ.js";import"./skill-scanner-B9E9x-dj.js";import"./installs-DwlFaoUO.js";import"./onboard-channels-CEMtoVzX.js";import"./daemon-runtime-Cw90ZSZ3.js";import"./runtime-guard-BThrXAmT.js";import"./systemd-DpT8tcbh.js";import"./service-ugwM110q.js";import"./widearea-dns-wtz3t7f_.js";import"./bonjour-discovery-CTTLB5JP.js";import"./health-Bd0YvHPq.js";import"./control-ui-assets-BweA3rDY.js";import"./skills-install-C9AUUMNg.js";import"./shared-WIJmFKqL.js";import"./onboard-auth.credentials-f-xn5D4D.js";import"./auth-token-DGYih1b5.js";import"./logging-CRzk-5ye.js";import"./provider-auth-helpers-Cibq8oDi.js";import"./auth-choice.apply-CE1TC_Ts.js";import"./openai-model-default-C9iQBo_x.js";import"./model-picker-Dz1ecLd0.js";import"./auth-choice.apply.transformers-CBQbUAwr.js";import"./auth-choice-BMeBDEfj.js";import{n as configureCommandFromSectionsArg,o as CONFIGURE_WIZARD_SECTIONS}from"./configure-BPX5i4at.js";import"./systemd-linger-CuzOv-tn.js";import"./onboard-custom-D2zVBKVf.js";import"./health-format-CtcXvo40.js";import"./onboard-remote-CFao-x7W.js";import"./onboard-skills-CZNKHsWB.js";function registerConfigureCommand(program){program.command(`configure`).description(`Interactive setup wizard for credentials, channels, gateway, and agent defaults`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/configure`,`docs.builderforce.ai/cli/configure`)}\n`).option(`--section <section>`,`Configuration sections (repeatable). Options: ${CONFIGURE_WIZARD_SECTIONS.join(`, `)}`,(value,previous)=>[...previous,value],[]).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await configureCommandFromSectionsArg(opts.section,defaultRuntime)})})}export{registerConfigureCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./embedded-helpers-DHfhLu2W.js";import"./reply-
|
|
1
|
+
import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./embedded-helpers-DHfhLu2W.js";import"./reply-BeKidf2F.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./model-selection-DlYajIzF.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./src-CQLQD-1r.js";import"./io-DhUMGsxN.js";import"./manifest-registry-CBVaj2md.js";import"./config-lGOyM6Kq.js";import"./runner-CDpBWK3-.js";import"./model-catalog-BQUEoIev.js";import"./sandbox-Cq6rH4hg.js";import"./chrome-BW8dGyxs.js";import"./tailscale-0ey4P_at.js";import"./auth-C4PxZEj8.js";import"./server-context-1YSNvKDs.js";import"./frontmatter-DpzOtLJz.js";import"./skills-vjE49XV9.js";import"./plugin-skills-RFjYtysK.js";import"./routes-DsdK6VOy.js";import"./redact-BT5hARuQ.js";import"./errors-BK3rMW8O.js";import"./paths-CejDLFxE.js";import"./ssrf-DHJTyOuH.js";import"./image-ops-D7Ex-H05.js";import"./store-Nf9BxXC7.js";import"./ports-B-SXoPqJ.js";import"./trash-DlNzpifq.js";import"./sessions-Dv212g1O.js";import"./message-channel-BW_q2nVi.js";import"./plugins-C0lu7LGS.js";import"./accounts-2InvZDx2.js";import"./accounts-CrKsbGuP.js";import"./accounts-BnsrG5TA.js";import"./bindings-qYFdqpJ3.js";import"./send-DSwQqUiD.js";import"./send-BGZYkspG.js";import"./paths-DCzWXtSj.js";import"./tool-images-CR9Y0R5I.js";import"./tool-display-Dx-rz3CF.js";import"./fetch-guard-DxN_CtRp.js";import"./api-key-rotation-BbNoamfM.js";import"./fetch-CMEvVIy8.js";import"./sqlite-BxinAVYp.js";import"./tokens-Ct4DyfhX.js";import"./project-context-store-BPhHGfFl.js";import"./with-timeout-DTcvZn3s.js";import"./deliver-CrB451sO.js";import"./send-ZCmcplsV.js";import"./workspace-eFrsAV2Q.js";import"./reply-prefix-BwtP84WV.js";import"./memory-cli-Dgqoendm.js";import"./manager-pjodgk3H.js";import"./retry-Jis-ZZfm.js";import"./client-BxPDO8Ed.js";import"./call-DLeUWFtQ.js";import"./common-W8GhA4hE.js";import"./chunk-B9aj7NGY.js";import"./markdown-tables-iDNbGky8.js";import"./ir-EgWVNCXR.js";import"./render-CSLaFZoy.js";import"./builderforcellm-syscheck-BpNlQ4Rx.js";import"./send-iQicMwPr.js";import"./outbound-attachment-BR2FQu7J.js";import"./fetch-B6_hd7w9.js";import"./delivery-queue-BZWZDdpJ.js";import"./channel-activity-GeHNfvd4.js";import"./tables-D5WcKZWq.js";import"./pairing-store-PKyjZas4.js";import{t as formatDocsLink}from"./links-CYRGsVCu.js";import{n as runCommandWithRuntime}from"./cli-utils-BLNnV_WG.js";import"./help-format-NhTn4dWd.js";import"./progress-OKwbfa23.js";import"./resolve-route-EE2-ObOq.js";import"./replies-BhjI7rPj.js";import"./refresh-Cyy0oi_E.js";import"./coding-tools.policy-DQxeoYmD.js";import"./send-C9xXqEqr.js";import"./onboard-helpers-DHGeaHZA.js";import"./prompt-style-BwwmGo3-.js";import"./pairing-labels-BpeDWVFP.js";import"./session-cost-usage-BDkGtjt9.js";import"./provider-usage-BqXFLAwn.js";import"./active-listener-DBdxNyOd.js";import"./exec-approvals-kmxxyvIe.js";import"./nodes-screen-BWDONgPE.js";import"./project-context-Dp8w9r_P.js";import"./control-service-Bkbx5ybP.js";import"./stagger-NaB6u1z1.js";import"./channel-selection-BjcuqdFb.js";import"./mamba-state-engine-DPAATSLG.js";import"./transformers-stream-QS2dnQob.js";import"./runtime-guard-BiPTd1ED.js";import"./catalog-BIdILD-k.js";import"./skills-status-U_k3Ca5B.js";import"./note-CvzMolLy.js";import"./clack-prompter-6Booc-eg.js";import"./helpers-_XD3UAOf.js";import"./plugin-auto-enable-CWK7KiRF.js";import"./install-safe-path-BUT0oL1h.js";import"./npm-registry-spec-BKmYHCba.js";import"./skill-scanner-CN9z0hSY.js";import"./installs-D4ygbqdx.js";import"./onboard-channels-DIvxrZLb.js";import"./daemon-runtime-CWFj-hSG.js";import"./systemd-CTHIdkg9.js";import"./service-BXrSjb3e.js";import"./widearea-dns-Dc2di-mD.js";import"./bonjour-discovery-BpFETe_g.js";import"./health-CoTbsx1p.js";import"./control-ui-assets-CAmSpVpE.js";import"./skills-install-DXm4y2QA.js";import"./shared-BMSboHpU.js";import"./onboard-auth.credentials-Dt_yky3w.js";import"./auth-token-CeCyq7Zg.js";import"./logging-9jbJihk2.js";import"./provider-auth-helpers-5ZQb3SEz.js";import"./auth-choice.apply-25j_lhua.js";import"./openai-model-default-DqkGItdN.js";import"./model-picker-DWc0Kexq.js";import"./auth-choice.apply.transformers-DE9QrzbX.js";import"./auth-choice-DvKzhGrY.js";import{n as configureCommandFromSectionsArg,o as CONFIGURE_WIZARD_SECTIONS}from"./configure-B1HJIRSM.js";import"./systemd-linger-RhNkOjuf.js";import"./onboard-custom-DT2eDgHk.js";import"./health-format-COHxl9I_.js";import"./onboard-remote-CdnyqVyt.js";import"./onboard-skills-CAnj-Bi_.js";function registerConfigureCommand(program){program.command(`configure`).description(`Interactive setup wizard for credentials, channels, gateway, and agent defaults`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/configure`,`docs.builderforce.ai/cli/configure`)}\n`).option(`--section <section>`,`Configuration sections (repeatable). Options: ${CONFIGURE_WIZARD_SECTIONS.join(`, `)}`,(value,previous)=>[...previous,value],[]).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await configureCommandFromSectionsArg(opts.section,defaultRuntime)})})}export{registerConfigureCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as resolveStateDir,i as isNixMode,m as resolveOAuthDir,o as resolveConfigPath,u as resolveGatewayPort}from"./paths-5FcIFMsj.js";import{B as theme,S as shortenHomeInString,b as resolveUserPath,v as resolveHomeDir}from"./utils-DbaBVFaK.js";import"./embedded-helpers-DHfhLu2W.js";import"./reply-gZ_yr2mJ.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import{k as resolveDefaultAgentWorkspaceDir}from"./agent-scope-DPtjOxzp.js";import"./model-selection-DlYajIzF.js";import{t as formatCliCommand}from"./command-format-Dd7BgZsg.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./src-CQLQD-1r.js";import{a as readConfigFileSnapshot,r as loadConfig}from"./io-DhUMGsxN.js";import"./manifest-registry-CBVaj2md.js";import"./config-lGOyM6Kq.js";import"./runner-CDpBWK3-.js";import"./model-catalog-BQUEoIev.js";import"./sandbox-Cq6rH4hg.js";import"./chrome-BW8dGyxs.js";import"./tailscale-0ey4P_at.js";import"./auth-C4PxZEj8.js";import"./server-context-1YSNvKDs.js";import"./frontmatter-DpzOtLJz.js";import"./skills-vjE49XV9.js";import"./plugin-skills-RFjYtysK.js";import"./routes-DsdK6VOy.js";import"./redact-BT5hARuQ.js";import"./errors-BK3rMW8O.js";import"./paths-CejDLFxE.js";import"./ssrf-DHJTyOuH.js";import"./image-ops-D7Ex-H05.js";import"./store-Nf9BxXC7.js";import"./ports-B-SXoPqJ.js";import"./trash-DlNzpifq.js";import"./sessions-Dv212g1O.js";import"./message-channel-BW_q2nVi.js";import"./plugins-C0lu7LGS.js";import"./accounts-2InvZDx2.js";import"./accounts-CrKsbGuP.js";import"./accounts-BnsrG5TA.js";import"./bindings-qYFdqpJ3.js";import"./send-DSwQqUiD.js";import"./send-BGZYkspG.js";import"./paths-DCzWXtSj.js";import"./tool-images-CR9Y0R5I.js";import"./tool-display-Dx-rz3CF.js";import"./fetch-guard-DxN_CtRp.js";import"./api-key-rotation-BbNoamfM.js";import"./fetch-CMEvVIy8.js";import"./sqlite-BxinAVYp.js";import"./tokens-Ct4DyfhX.js";import"./project-context-store-BPhHGfFl.js";import"./with-timeout-DTcvZn3s.js";import"./deliver-CrB451sO.js";import"./send-ZCmcplsV.js";import"./workspace-eFrsAV2Q.js";import"./reply-prefix-BwtP84WV.js";import"./memory-cli-Dgqoendm.js";import"./manager-pjodgk3H.js";import"./retry-Jis-ZZfm.js";import"./client-BxPDO8Ed.js";import"./call-DLeUWFtQ.js";import"./common-W8GhA4hE.js";import"./chunk-B9aj7NGY.js";import"./markdown-tables-iDNbGky8.js";import"./ir-EgWVNCXR.js";import"./render-CSLaFZoy.js";import"./builderforcellm-syscheck-BpNlQ4Rx.js";import"./send-iQicMwPr.js";import"./outbound-attachment-BR2FQu7J.js";import"./fetch-B6_hd7w9.js";import"./delivery-queue-BZWZDdpJ.js";import"./channel-activity-GeHNfvd4.js";import"./tables-D5WcKZWq.js";import"./pairing-store-PKyjZas4.js";import{t as formatDocsLink}from"./links-CYRGsVCu.js";import{n as runCommandWithRuntime}from"./cli-utils-BLNnV_WG.js";import"./help-format-NhTn4dWd.js";import"./progress-OKwbfa23.js";import"./resolve-route-EE2-ObOq.js";import"./replies-BhjI7rPj.js";import"./refresh-Cyy0oi_E.js";import"./coding-tools.policy-DQxeoYmD.js";import"./send-C9xXqEqr.js";import{d as openUrl,g as resolveControlUiLinks,i as detectBrowserOpenSupport,o as formatControlUiSshHint}from"./onboard-helpers-DHGeaHZA.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BwwmGo3-.js";import"./pairing-labels-BpeDWVFP.js";import"./session-cost-usage-BDkGtjt9.js";import"./provider-usage-BqXFLAwn.js";import"./active-listener-DBdxNyOd.js";import"./exec-approvals-kmxxyvIe.js";import"./nodes-screen-BWDONgPE.js";import"./project-context-Dp8w9r_P.js";import"./control-service-Bkbx5ybP.js";import"./stagger-NaB6u1z1.js";import"./channel-selection-BjcuqdFb.js";import"./mamba-state-engine-DPAATSLG.js";import"./transformers-stream-QS2dnQob.js";import"./runtime-guard-BiPTd1ED.js";import"./program-context-BgCNjcCh.js";import"./catalog-BIdILD-k.js";import"./skills-status-U_k3Ca5B.js";import{t as copyToClipboard}from"./clipboard-BLjY9HxR.js";import"./note-CvzMolLy.js";import"./helpers-_XD3UAOf.js";import"./plugin-auto-enable-CWK7KiRF.js";import"./channels-status-issues-B-9_0W90.js";import"./completion-cli-CoFRiwNp.js";import"./daemon-runtime-CWFj-hSG.js";import"./systemd-CTHIdkg9.js";import{t as resolveGatewayService}from"./service-BXrSjb3e.js";import"./lifecycle-core-BUp08YyP.js";import"./diagnostics-Bsqm-Flj.js";import{c as runDaemonStop}from"./daemon-cli-CjCweBX-.js";import"./health-Cggr6c-2.js";import"./control-ui-assets-CAmSpVpE.js";import"./update-check-CwmSkavG.js";import"./dm-policy-shared-B5SWfgvG.js";import"./session-dirs-DVL9vHmq.js";import"./logging-9jbJihk2.js";import"./systemd-linger-RhNkOjuf.js";import"./health-format-COHxl9I_.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-m1_NXutn.js";import"./doctor-completion-BSbAN5p1.js";import fs from"node:fs";import path from"node:path";import fs$1 from"node:fs/promises";import{cancel,confirm,isCancel,multiselect}from"@clack/prompts";async function dashboardCommand(runtime=defaultRuntime,options={}){let snapshot=await readConfigFileSnapshot(),cfg=snapshot.valid?snapshot.config:{},port=resolveGatewayPort(cfg),bind=cfg.gateway?.bind??`loopback`,basePath=cfg.gateway?.controlUi?.basePath,customBindHost=cfg.gateway?.customBindHost,token=cfg.gateway?.auth?.token??process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN??``,links=resolveControlUiLinks({port,bind:bind===`lan`?`loopback`:bind,customBindHost,basePath}),dashboardUrl=token?`${links.httpUrl}#token=${encodeURIComponent(token)}`:links.httpUrl;runtime.log(`Dashboard URL: ${dashboardUrl}`);let copied=await copyToClipboard(dashboardUrl).catch(()=>!1);runtime.log(copied?`Copied to clipboard.`:`Copy to clipboard unavailable.`);let opened=!1,hint;options.noOpen?hint=`Browser launch disabled (--no-open). Use the URL above.`:((await detectBrowserOpenSupport()).ok&&(opened=await openUrl(dashboardUrl)),opened||(hint=formatControlUiSshHint({port,basePath,token:token||void 0}))),opened?runtime.log(`Opened in your browser. Keep that tab to control BuilderForceAgents.`):hint&&runtime.log(hint)}function collectWorkspaceDirs(cfg){let dirs=new Set,defaults=cfg?.agents?.defaults;typeof defaults?.workspace==`string`&&defaults.workspace.trim()&&dirs.add(resolveUserPath(defaults.workspace));let list=Array.isArray(cfg?.agents?.list)?cfg?.agents?.list:[];for(let agent of list){let workspace=agent.workspace;typeof workspace==`string`&&workspace.trim()&&dirs.add(resolveUserPath(workspace))}return dirs.size===0&&dirs.add(resolveDefaultAgentWorkspaceDir()),[...dirs]}function buildCleanupPlan(params){return{configInsideState:isPathWithin(params.configPath,params.stateDir),oauthInsideState:isPathWithin(params.oauthDir,params.stateDir),workspaceDirs:collectWorkspaceDirs(params.cfg)}}function isPathWithin(child,parent){let relative=path.relative(parent,child);return relative===``||!relative.startsWith(`..`)&&!path.isAbsolute(relative)}function isUnsafeRemovalTarget(target){if(!target.trim())return!0;let resolved=path.resolve(target);if(resolved===path.parse(resolved).root)return!0;let home=resolveHomeDir();return!!(home&&resolved===path.resolve(home))}async function removePath(target,runtime,opts){if(!target?.trim())return{ok:!1,skipped:!0};let resolved=path.resolve(target),displayLabel=shortenHomeInString(opts?.label??resolved);if(isUnsafeRemovalTarget(resolved))return runtime.error(`Refusing to remove unsafe path: ${displayLabel}`),{ok:!1};if(opts?.dryRun)return runtime.log(`[dry-run] remove ${displayLabel}`),{ok:!0,skipped:!0};try{return await fs$1.rm(resolved,{recursive:!0,force:!0}),runtime.log(`Removed ${displayLabel}`),{ok:!0}}catch(err){return runtime.error(`Failed to remove ${displayLabel}: ${String(err)}`),{ok:!1}}}async function listAgentSessionDirs(stateDir){let root=path.join(stateDir,`agents`);try{return(await fs$1.readdir(root,{withFileTypes:!0})).filter(entry=>entry.isDirectory()).map(entry=>path.join(root,entry.name,`sessions`))}catch{return[]}}function resolveCleanupPlanFromDisk(){let cfg=loadConfig(),stateDir=resolveStateDir(),configPath=resolveConfigPath(),oauthDir=resolveOAuthDir();return{cfg,stateDir,configPath,oauthDir,...buildCleanupPlan({cfg,stateDir,configPath,oauthDir})}}async function stopGatewayIfRunning(runtime){if(isNixMode)return;let service=resolveGatewayService(),loaded=!1;try{loaded=await service.isLoaded({env:process.env})}catch(err){runtime.error(`Gateway service check failed: ${String(err)}`);return}if(loaded)try{await service.stop({env:process.env,stdout:process.stdout})}catch(err){runtime.error(`Gateway stop failed: ${String(err)}`)}}async function resetCommand(runtime,opts){let interactive=!opts.nonInteractive;if(!interactive&&!opts.yes){runtime.error(`Non-interactive mode requires --yes.`),runtime.exit(1);return}let scope=opts.scope;if(!scope){if(!interactive){runtime.error(`Non-interactive mode requires --scope.`),runtime.exit(1);return}let selection=await selectStyled({message:`Reset scope`,options:[{value:`config`,label:`Config only`,hint:`builderforce.json`},{value:`config+creds+sessions`,label:`Config + credentials + sessions`,hint:`keeps workspace + auth profiles`},{value:`full`,label:`Full reset`,hint:`state dir + workspace`}],initialValue:`config+creds+sessions`});if(isCancel(selection)){cancel(stylePromptTitle(`Reset cancelled.`)??`Reset cancelled.`),runtime.exit(0);return}scope=selection}if(![`config`,`config+creds+sessions`,`full`].includes(scope)){runtime.error(`Invalid --scope. Expected "config", "config+creds+sessions", or "full".`),runtime.exit(1);return}if(interactive&&!opts.yes){let ok=await confirm({message:stylePromptMessage(`Proceed with ${scope} reset?`)});if(isCancel(ok)||!ok){cancel(stylePromptTitle(`Reset cancelled.`)??`Reset cancelled.`),runtime.exit(0);return}}let dryRun=!!opts.dryRun,{stateDir,configPath,oauthDir,configInsideState,oauthInsideState,workspaceDirs}=resolveCleanupPlanFromDisk();if(scope!==`config`&&(dryRun?runtime.log(`[dry-run] stop gateway service`):await stopGatewayIfRunning(runtime)),scope===`config`){await removePath(configPath,runtime,{dryRun,label:configPath});return}if(scope===`config+creds+sessions`){await removePath(configPath,runtime,{dryRun,label:configPath}),await removePath(oauthDir,runtime,{dryRun,label:oauthDir});let sessionDirs=await listAgentSessionDirs(stateDir);for(let dir of sessionDirs)await removePath(dir,runtime,{dryRun,label:dir});runtime.log(`Next: ${formatCliCommand(`builderforce onboard --install-daemon`)}`);return}if(scope===`full`){await removePath(stateDir,runtime,{dryRun,label:stateDir}),configInsideState||await removePath(configPath,runtime,{dryRun,label:configPath}),oauthInsideState||await removePath(oauthDir,runtime,{dryRun,label:oauthDir});for(let workspace of workspaceDirs)await removePath(workspace,runtime,{dryRun,label:workspace});runtime.log(`Next: ${formatCliCommand(`builderforce onboard --install-daemon`)}`);return}}const multiselectStyled=params=>multiselect({...params,message:stylePromptMessage(params.message),options:params.options.map(opt=>opt.hint===void 0?opt:{...opt,hint:stylePromptHint(opt.hint)})});function buildScopeSelection(opts){let hadExplicit=!!(opts.all||opts.service||opts.state||opts.workspace||opts.app),scopes=new Set;return(opts.all||opts.service)&&scopes.add(`service`),(opts.all||opts.state)&&scopes.add(`state`),(opts.all||opts.workspace)&&scopes.add(`workspace`),(opts.all||opts.app)&&scopes.add(`app`),{scopes,hadExplicit}}async function stopAndUninstallService(runtime){if(isNixMode)return runtime.error(`Nix mode detected; service uninstall is disabled.`),!1;let service=resolveGatewayService(),loaded=!1;try{loaded=await service.isLoaded({env:process.env})}catch(err){return runtime.error(`Gateway service check failed: ${String(err)}`),!1}if(!loaded)return runtime.log(`Gateway service ${service.notLoadedText}.`),!0;try{await service.stop({env:process.env,stdout:process.stdout})}catch(err){runtime.error(`Gateway stop failed: ${String(err)}`)}try{return await service.uninstall({env:process.env,stdout:process.stdout}),!0}catch(err){return runtime.error(`Gateway uninstall failed: ${String(err)}`),!1}}const MAC_APP_PATH=`/Applications/Builderforce.app`,LEGACY_MAC_APP_PATH=`/Applications/BuilderForceAgents.app`;async function removeMacApp(runtime,dryRun){process.platform===`darwin`&&(await removePath(MAC_APP_PATH,runtime,{dryRun,label:MAC_APP_PATH}),fs.existsSync(LEGACY_MAC_APP_PATH)&&await removePath(LEGACY_MAC_APP_PATH,runtime,{dryRun,label:LEGACY_MAC_APP_PATH}))}async function uninstallCommand(runtime,opts){let{scopes,hadExplicit}=buildScopeSelection(opts),interactive=!opts.nonInteractive;if(!interactive&&!opts.yes){runtime.error(`Non-interactive mode requires --yes.`),runtime.exit(1);return}if(!hadExplicit){if(!interactive){runtime.error(`Non-interactive mode requires explicit scopes (use --all).`),runtime.exit(1);return}let selection=await multiselectStyled({message:`Uninstall which components?`,options:[{value:`service`,label:`Gateway service`,hint:`launchd / systemd / schtasks`},{value:`state`,label:`State + config`,hint:`~/.builderforce`},{value:`workspace`,label:`Workspace`,hint:`agent files`},{value:`app`,label:`macOS app`,hint:MAC_APP_PATH}],initialValues:[`service`,`state`,`workspace`]});if(isCancel(selection)){cancel(stylePromptTitle(`Uninstall cancelled.`)??`Uninstall cancelled.`),runtime.exit(0);return}for(let value of selection)scopes.add(value)}if(scopes.size===0){runtime.log(`Nothing selected.`);return}if(interactive&&!opts.yes){let ok=await confirm({message:stylePromptMessage(`Proceed with uninstall?`)});if(isCancel(ok)||!ok){cancel(stylePromptTitle(`Uninstall cancelled.`)??`Uninstall cancelled.`),runtime.exit(0);return}}let dryRun=!!opts.dryRun,{stateDir,configPath,oauthDir,configInsideState,oauthInsideState,workspaceDirs}=resolveCleanupPlanFromDisk();if(scopes.has(`service`)&&(dryRun?runtime.log(`[dry-run] remove gateway service`):await stopAndUninstallService(runtime)),scopes.has(`state`)&&(await removePath(stateDir,runtime,{dryRun,label:stateDir}),configInsideState||await removePath(configPath,runtime,{dryRun,label:configPath}),oauthInsideState||await removePath(oauthDir,runtime,{dryRun,label:oauthDir})),scopes.has(`workspace`))for(let workspace of workspaceDirs)await removePath(workspace,runtime,{dryRun,label:workspace});if(scopes.has(`app`)&&await removeMacApp(runtime,dryRun),runtime.log(`CLI still installed. Remove via npm/pnpm if desired.`),scopes.has(`state`)&&!scopes.has(`workspace`)){let home=resolveHomeDir();home&&workspaceDirs.some(dir=>dir.startsWith(path.resolve(home)))&&runtime.log(`Tip: workspaces were preserved. Re-run with --workspace to remove them.`)}}function registerMaintenanceCommands(program){program.command(`doctor`).description(`Health checks + quick fixes for the gateway and channels`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/doctor`,`docs.builderforce.ai/cli/doctor`)}\n`).option(`--no-workspace-suggestions`,`Disable workspace memory system suggestions`,!1).option(`--yes`,`Accept defaults without prompting`,!1).option(`--repair`,`Apply recommended repairs without prompting`,!1).option(`--fix`,`Apply recommended repairs (alias for --repair)`,!1).option(`--force`,`Apply aggressive repairs (overwrites custom service config)`,!1).option(`--non-interactive`,`Run without prompts (safe migrations only)`,!1).option(`--generate-gateway-token`,`Generate and configure a gateway token`,!1).option(`--deep`,`Scan system services for extra gateway installs`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await doctorCommand(defaultRuntime,{workspaceSuggestions:opts.workspaceSuggestions,yes:!!opts.yes,repair:!!opts.repair||!!opts.fix,force:!!opts.force,nonInteractive:!!opts.nonInteractive,generateGatewayToken:!!opts.generateGatewayToken,deep:!!opts.deep}),defaultRuntime.exit(0)})}),program.command(`dashboard`).description(`Open the Control UI with your current token`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/dashboard`,`docs.builderforce.ai/cli/dashboard`)}\n`).option(`--no-open`,`Print URL but do not launch a browser`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await dashboardCommand(defaultRuntime,{noOpen:!!opts.noOpen})})}),program.command(`reset`).description(`Reset local config/state (keeps the CLI installed)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/reset`,`docs.builderforce.ai/cli/reset`)}\n`).option(`--scope <scope>`,`config|config+creds+sessions|full (default: interactive prompt)`).option(`--yes`,`Skip confirmation prompts`,!1).option(`--non-interactive`,`Disable prompts (requires --scope + --yes)`,!1).option(`--dry-run`,`Print actions without removing files`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await resetCommand(defaultRuntime,{scope:opts.scope,yes:!!opts.yes,nonInteractive:!!opts.nonInteractive,dryRun:!!opts.dryRun})})}),program.command(`uninstall`).description(`Uninstall the gateway service + local data (CLI remains)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/uninstall`,`docs.builderforce.ai/cli/uninstall`)}\n`).option(`--service`,`Remove the gateway service`,!1).option(`--state`,`Remove state + config`,!1).option(`--workspace`,`Remove workspace dirs`,!1).option(`--app`,`Remove the macOS app`,!1).option(`--all`,`Remove service + state + workspace + app`,!1).option(`--yes`,`Skip confirmation prompts`,!1).option(`--non-interactive`,`Disable prompts (requires --yes)`,!1).option(`--dry-run`,`Print actions without removing files`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await uninstallCommand(defaultRuntime,{service:!!opts.service,state:!!opts.state,workspace:!!opts.workspace,app:!!opts.app,all:!!opts.all,yes:!!opts.yes,nonInteractive:!!opts.nonInteractive,dryRun:!!opts.dryRun})})}),program.command(`stop`).description(`Stop the running gateway service (launchd/systemd/schtasks)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/gateway`,`docs.builderforce.ai/cli/gateway`)}\n`).option(`--json`,`Output JSON`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await runDaemonStop({json:!!opts.json})})})}export{registerMaintenanceCommands};
|
|
1
|
+
import{g as resolveStateDir,i as isNixMode,m as resolveOAuthDir,o as resolveConfigPath,u as resolveGatewayPort}from"./paths-5FcIFMsj.js";import{B as theme,S as shortenHomeInString,b as resolveUserPath,v as resolveHomeDir}from"./utils-DbaBVFaK.js";import"./embedded-helpers-DHfhLu2W.js";import"./reply-BeKidf2F.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import{k as resolveDefaultAgentWorkspaceDir}from"./agent-scope-DPtjOxzp.js";import"./model-selection-DlYajIzF.js";import{t as formatCliCommand}from"./command-format-Dd7BgZsg.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./src-CQLQD-1r.js";import{a as readConfigFileSnapshot,r as loadConfig}from"./io-DhUMGsxN.js";import"./manifest-registry-CBVaj2md.js";import"./config-lGOyM6Kq.js";import"./runner-CDpBWK3-.js";import"./model-catalog-BQUEoIev.js";import"./sandbox-Cq6rH4hg.js";import"./chrome-BW8dGyxs.js";import"./tailscale-0ey4P_at.js";import"./auth-C4PxZEj8.js";import"./server-context-1YSNvKDs.js";import"./frontmatter-DpzOtLJz.js";import"./skills-vjE49XV9.js";import"./plugin-skills-RFjYtysK.js";import"./routes-DsdK6VOy.js";import"./redact-BT5hARuQ.js";import"./errors-BK3rMW8O.js";import"./paths-CejDLFxE.js";import"./ssrf-DHJTyOuH.js";import"./image-ops-D7Ex-H05.js";import"./store-Nf9BxXC7.js";import"./ports-B-SXoPqJ.js";import"./trash-DlNzpifq.js";import"./sessions-Dv212g1O.js";import"./message-channel-BW_q2nVi.js";import"./plugins-C0lu7LGS.js";import"./accounts-2InvZDx2.js";import"./accounts-CrKsbGuP.js";import"./accounts-BnsrG5TA.js";import"./bindings-qYFdqpJ3.js";import"./send-DSwQqUiD.js";import"./send-BGZYkspG.js";import"./paths-DCzWXtSj.js";import"./tool-images-CR9Y0R5I.js";import"./tool-display-Dx-rz3CF.js";import"./fetch-guard-DxN_CtRp.js";import"./api-key-rotation-BbNoamfM.js";import"./fetch-CMEvVIy8.js";import"./sqlite-BxinAVYp.js";import"./tokens-Ct4DyfhX.js";import"./project-context-store-BPhHGfFl.js";import"./with-timeout-DTcvZn3s.js";import"./deliver-CrB451sO.js";import"./send-ZCmcplsV.js";import"./workspace-eFrsAV2Q.js";import"./reply-prefix-BwtP84WV.js";import"./memory-cli-Dgqoendm.js";import"./manager-pjodgk3H.js";import"./retry-Jis-ZZfm.js";import"./client-BxPDO8Ed.js";import"./call-DLeUWFtQ.js";import"./common-W8GhA4hE.js";import"./chunk-B9aj7NGY.js";import"./markdown-tables-iDNbGky8.js";import"./ir-EgWVNCXR.js";import"./render-CSLaFZoy.js";import"./builderforcellm-syscheck-BpNlQ4Rx.js";import"./send-iQicMwPr.js";import"./outbound-attachment-BR2FQu7J.js";import"./fetch-B6_hd7w9.js";import"./delivery-queue-BZWZDdpJ.js";import"./channel-activity-GeHNfvd4.js";import"./tables-D5WcKZWq.js";import"./pairing-store-PKyjZas4.js";import{t as formatDocsLink}from"./links-CYRGsVCu.js";import{n as runCommandWithRuntime}from"./cli-utils-BLNnV_WG.js";import"./help-format-NhTn4dWd.js";import"./progress-OKwbfa23.js";import"./resolve-route-EE2-ObOq.js";import"./replies-BhjI7rPj.js";import"./refresh-Cyy0oi_E.js";import"./coding-tools.policy-DQxeoYmD.js";import"./send-C9xXqEqr.js";import{d as openUrl,g as resolveControlUiLinks,i as detectBrowserOpenSupport,o as formatControlUiSshHint}from"./onboard-helpers-DHGeaHZA.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BwwmGo3-.js";import"./pairing-labels-BpeDWVFP.js";import"./session-cost-usage-BDkGtjt9.js";import"./provider-usage-BqXFLAwn.js";import"./active-listener-DBdxNyOd.js";import"./exec-approvals-kmxxyvIe.js";import"./nodes-screen-BWDONgPE.js";import"./project-context-Dp8w9r_P.js";import"./control-service-Bkbx5ybP.js";import"./stagger-NaB6u1z1.js";import"./channel-selection-BjcuqdFb.js";import"./mamba-state-engine-DPAATSLG.js";import"./transformers-stream-QS2dnQob.js";import"./runtime-guard-BiPTd1ED.js";import"./program-context-D4S-3zNt.js";import"./catalog-BIdILD-k.js";import"./skills-status-U_k3Ca5B.js";import{t as copyToClipboard}from"./clipboard-BLjY9HxR.js";import"./note-CvzMolLy.js";import"./helpers-_XD3UAOf.js";import"./plugin-auto-enable-CWK7KiRF.js";import"./channels-status-issues-B-9_0W90.js";import"./completion-cli-EbyCUnCP.js";import"./daemon-runtime-CWFj-hSG.js";import"./systemd-CTHIdkg9.js";import{t as resolveGatewayService}from"./service-BXrSjb3e.js";import"./lifecycle-core-BUp08YyP.js";import"./diagnostics-Bsqm-Flj.js";import{c as runDaemonStop}from"./daemon-cli-CjCweBX-.js";import"./health-CoTbsx1p.js";import"./control-ui-assets-CAmSpVpE.js";import"./update-check-CwmSkavG.js";import"./dm-policy-shared-B5SWfgvG.js";import"./session-dirs-DgwMogyJ.js";import"./logging-9jbJihk2.js";import"./systemd-linger-RhNkOjuf.js";import"./health-format-COHxl9I_.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-D1StbM6j.js";import"./doctor-completion-BEVC1EV7.js";import fs from"node:fs";import path from"node:path";import fs$1 from"node:fs/promises";import{cancel,confirm,isCancel,multiselect}from"@clack/prompts";async function dashboardCommand(runtime=defaultRuntime,options={}){let snapshot=await readConfigFileSnapshot(),cfg=snapshot.valid?snapshot.config:{},port=resolveGatewayPort(cfg),bind=cfg.gateway?.bind??`loopback`,basePath=cfg.gateway?.controlUi?.basePath,customBindHost=cfg.gateway?.customBindHost,token=cfg.gateway?.auth?.token??process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN??``,links=resolveControlUiLinks({port,bind:bind===`lan`?`loopback`:bind,customBindHost,basePath}),dashboardUrl=token?`${links.httpUrl}#token=${encodeURIComponent(token)}`:links.httpUrl;runtime.log(`Dashboard URL: ${dashboardUrl}`);let copied=await copyToClipboard(dashboardUrl).catch(()=>!1);runtime.log(copied?`Copied to clipboard.`:`Copy to clipboard unavailable.`);let opened=!1,hint;options.noOpen?hint=`Browser launch disabled (--no-open). Use the URL above.`:((await detectBrowserOpenSupport()).ok&&(opened=await openUrl(dashboardUrl)),opened||(hint=formatControlUiSshHint({port,basePath,token:token||void 0}))),opened?runtime.log(`Opened in your browser. Keep that tab to control BuilderForceAgents.`):hint&&runtime.log(hint)}function collectWorkspaceDirs(cfg){let dirs=new Set,defaults=cfg?.agents?.defaults;typeof defaults?.workspace==`string`&&defaults.workspace.trim()&&dirs.add(resolveUserPath(defaults.workspace));let list=Array.isArray(cfg?.agents?.list)?cfg?.agents?.list:[];for(let agent of list){let workspace=agent.workspace;typeof workspace==`string`&&workspace.trim()&&dirs.add(resolveUserPath(workspace))}return dirs.size===0&&dirs.add(resolveDefaultAgentWorkspaceDir()),[...dirs]}function buildCleanupPlan(params){return{configInsideState:isPathWithin(params.configPath,params.stateDir),oauthInsideState:isPathWithin(params.oauthDir,params.stateDir),workspaceDirs:collectWorkspaceDirs(params.cfg)}}function isPathWithin(child,parent){let relative=path.relative(parent,child);return relative===``||!relative.startsWith(`..`)&&!path.isAbsolute(relative)}function isUnsafeRemovalTarget(target){if(!target.trim())return!0;let resolved=path.resolve(target);if(resolved===path.parse(resolved).root)return!0;let home=resolveHomeDir();return!!(home&&resolved===path.resolve(home))}async function removePath(target,runtime,opts){if(!target?.trim())return{ok:!1,skipped:!0};let resolved=path.resolve(target),displayLabel=shortenHomeInString(opts?.label??resolved);if(isUnsafeRemovalTarget(resolved))return runtime.error(`Refusing to remove unsafe path: ${displayLabel}`),{ok:!1};if(opts?.dryRun)return runtime.log(`[dry-run] remove ${displayLabel}`),{ok:!0,skipped:!0};try{return await fs$1.rm(resolved,{recursive:!0,force:!0}),runtime.log(`Removed ${displayLabel}`),{ok:!0}}catch(err){return runtime.error(`Failed to remove ${displayLabel}: ${String(err)}`),{ok:!1}}}async function listAgentSessionDirs(stateDir){let root=path.join(stateDir,`agents`);try{return(await fs$1.readdir(root,{withFileTypes:!0})).filter(entry=>entry.isDirectory()).map(entry=>path.join(root,entry.name,`sessions`))}catch{return[]}}function resolveCleanupPlanFromDisk(){let cfg=loadConfig(),stateDir=resolveStateDir(),configPath=resolveConfigPath(),oauthDir=resolveOAuthDir();return{cfg,stateDir,configPath,oauthDir,...buildCleanupPlan({cfg,stateDir,configPath,oauthDir})}}async function stopGatewayIfRunning(runtime){if(isNixMode)return;let service=resolveGatewayService(),loaded=!1;try{loaded=await service.isLoaded({env:process.env})}catch(err){runtime.error(`Gateway service check failed: ${String(err)}`);return}if(loaded)try{await service.stop({env:process.env,stdout:process.stdout})}catch(err){runtime.error(`Gateway stop failed: ${String(err)}`)}}async function resetCommand(runtime,opts){let interactive=!opts.nonInteractive;if(!interactive&&!opts.yes){runtime.error(`Non-interactive mode requires --yes.`),runtime.exit(1);return}let scope=opts.scope;if(!scope){if(!interactive){runtime.error(`Non-interactive mode requires --scope.`),runtime.exit(1);return}let selection=await selectStyled({message:`Reset scope`,options:[{value:`config`,label:`Config only`,hint:`builderforce.json`},{value:`config+creds+sessions`,label:`Config + credentials + sessions`,hint:`keeps workspace + auth profiles`},{value:`full`,label:`Full reset`,hint:`state dir + workspace`}],initialValue:`config+creds+sessions`});if(isCancel(selection)){cancel(stylePromptTitle(`Reset cancelled.`)??`Reset cancelled.`),runtime.exit(0);return}scope=selection}if(![`config`,`config+creds+sessions`,`full`].includes(scope)){runtime.error(`Invalid --scope. Expected "config", "config+creds+sessions", or "full".`),runtime.exit(1);return}if(interactive&&!opts.yes){let ok=await confirm({message:stylePromptMessage(`Proceed with ${scope} reset?`)});if(isCancel(ok)||!ok){cancel(stylePromptTitle(`Reset cancelled.`)??`Reset cancelled.`),runtime.exit(0);return}}let dryRun=!!opts.dryRun,{stateDir,configPath,oauthDir,configInsideState,oauthInsideState,workspaceDirs}=resolveCleanupPlanFromDisk();if(scope!==`config`&&(dryRun?runtime.log(`[dry-run] stop gateway service`):await stopGatewayIfRunning(runtime)),scope===`config`){await removePath(configPath,runtime,{dryRun,label:configPath});return}if(scope===`config+creds+sessions`){await removePath(configPath,runtime,{dryRun,label:configPath}),await removePath(oauthDir,runtime,{dryRun,label:oauthDir});let sessionDirs=await listAgentSessionDirs(stateDir);for(let dir of sessionDirs)await removePath(dir,runtime,{dryRun,label:dir});runtime.log(`Next: ${formatCliCommand(`builderforce onboard --install-daemon`)}`);return}if(scope===`full`){await removePath(stateDir,runtime,{dryRun,label:stateDir}),configInsideState||await removePath(configPath,runtime,{dryRun,label:configPath}),oauthInsideState||await removePath(oauthDir,runtime,{dryRun,label:oauthDir});for(let workspace of workspaceDirs)await removePath(workspace,runtime,{dryRun,label:workspace});runtime.log(`Next: ${formatCliCommand(`builderforce onboard --install-daemon`)}`);return}}const multiselectStyled=params=>multiselect({...params,message:stylePromptMessage(params.message),options:params.options.map(opt=>opt.hint===void 0?opt:{...opt,hint:stylePromptHint(opt.hint)})});function buildScopeSelection(opts){let hadExplicit=!!(opts.all||opts.service||opts.state||opts.workspace||opts.app),scopes=new Set;return(opts.all||opts.service)&&scopes.add(`service`),(opts.all||opts.state)&&scopes.add(`state`),(opts.all||opts.workspace)&&scopes.add(`workspace`),(opts.all||opts.app)&&scopes.add(`app`),{scopes,hadExplicit}}async function stopAndUninstallService(runtime){if(isNixMode)return runtime.error(`Nix mode detected; service uninstall is disabled.`),!1;let service=resolveGatewayService(),loaded=!1;try{loaded=await service.isLoaded({env:process.env})}catch(err){return runtime.error(`Gateway service check failed: ${String(err)}`),!1}if(!loaded)return runtime.log(`Gateway service ${service.notLoadedText}.`),!0;try{await service.stop({env:process.env,stdout:process.stdout})}catch(err){runtime.error(`Gateway stop failed: ${String(err)}`)}try{return await service.uninstall({env:process.env,stdout:process.stdout}),!0}catch(err){return runtime.error(`Gateway uninstall failed: ${String(err)}`),!1}}const MAC_APP_PATH=`/Applications/Builderforce.app`,LEGACY_MAC_APP_PATH=`/Applications/BuilderForceAgents.app`;async function removeMacApp(runtime,dryRun){process.platform===`darwin`&&(await removePath(MAC_APP_PATH,runtime,{dryRun,label:MAC_APP_PATH}),fs.existsSync(LEGACY_MAC_APP_PATH)&&await removePath(LEGACY_MAC_APP_PATH,runtime,{dryRun,label:LEGACY_MAC_APP_PATH}))}async function uninstallCommand(runtime,opts){let{scopes,hadExplicit}=buildScopeSelection(opts),interactive=!opts.nonInteractive;if(!interactive&&!opts.yes){runtime.error(`Non-interactive mode requires --yes.`),runtime.exit(1);return}if(!hadExplicit){if(!interactive){runtime.error(`Non-interactive mode requires explicit scopes (use --all).`),runtime.exit(1);return}let selection=await multiselectStyled({message:`Uninstall which components?`,options:[{value:`service`,label:`Gateway service`,hint:`launchd / systemd / schtasks`},{value:`state`,label:`State + config`,hint:`~/.builderforce`},{value:`workspace`,label:`Workspace`,hint:`agent files`},{value:`app`,label:`macOS app`,hint:MAC_APP_PATH}],initialValues:[`service`,`state`,`workspace`]});if(isCancel(selection)){cancel(stylePromptTitle(`Uninstall cancelled.`)??`Uninstall cancelled.`),runtime.exit(0);return}for(let value of selection)scopes.add(value)}if(scopes.size===0){runtime.log(`Nothing selected.`);return}if(interactive&&!opts.yes){let ok=await confirm({message:stylePromptMessage(`Proceed with uninstall?`)});if(isCancel(ok)||!ok){cancel(stylePromptTitle(`Uninstall cancelled.`)??`Uninstall cancelled.`),runtime.exit(0);return}}let dryRun=!!opts.dryRun,{stateDir,configPath,oauthDir,configInsideState,oauthInsideState,workspaceDirs}=resolveCleanupPlanFromDisk();if(scopes.has(`service`)&&(dryRun?runtime.log(`[dry-run] remove gateway service`):await stopAndUninstallService(runtime)),scopes.has(`state`)&&(await removePath(stateDir,runtime,{dryRun,label:stateDir}),configInsideState||await removePath(configPath,runtime,{dryRun,label:configPath}),oauthInsideState||await removePath(oauthDir,runtime,{dryRun,label:oauthDir})),scopes.has(`workspace`))for(let workspace of workspaceDirs)await removePath(workspace,runtime,{dryRun,label:workspace});if(scopes.has(`app`)&&await removeMacApp(runtime,dryRun),runtime.log(`CLI still installed. Remove via npm/pnpm if desired.`),scopes.has(`state`)&&!scopes.has(`workspace`)){let home=resolveHomeDir();home&&workspaceDirs.some(dir=>dir.startsWith(path.resolve(home)))&&runtime.log(`Tip: workspaces were preserved. Re-run with --workspace to remove them.`)}}function registerMaintenanceCommands(program){program.command(`doctor`).description(`Health checks + quick fixes for the gateway and channels`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/doctor`,`docs.builderforce.ai/cli/doctor`)}\n`).option(`--no-workspace-suggestions`,`Disable workspace memory system suggestions`,!1).option(`--yes`,`Accept defaults without prompting`,!1).option(`--repair`,`Apply recommended repairs without prompting`,!1).option(`--fix`,`Apply recommended repairs (alias for --repair)`,!1).option(`--force`,`Apply aggressive repairs (overwrites custom service config)`,!1).option(`--non-interactive`,`Run without prompts (safe migrations only)`,!1).option(`--generate-gateway-token`,`Generate and configure a gateway token`,!1).option(`--deep`,`Scan system services for extra gateway installs`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await doctorCommand(defaultRuntime,{workspaceSuggestions:opts.workspaceSuggestions,yes:!!opts.yes,repair:!!opts.repair||!!opts.fix,force:!!opts.force,nonInteractive:!!opts.nonInteractive,generateGatewayToken:!!opts.generateGatewayToken,deep:!!opts.deep}),defaultRuntime.exit(0)})}),program.command(`dashboard`).description(`Open the Control UI with your current token`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/dashboard`,`docs.builderforce.ai/cli/dashboard`)}\n`).option(`--no-open`,`Print URL but do not launch a browser`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await dashboardCommand(defaultRuntime,{noOpen:!!opts.noOpen})})}),program.command(`reset`).description(`Reset local config/state (keeps the CLI installed)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/reset`,`docs.builderforce.ai/cli/reset`)}\n`).option(`--scope <scope>`,`config|config+creds+sessions|full (default: interactive prompt)`).option(`--yes`,`Skip confirmation prompts`,!1).option(`--non-interactive`,`Disable prompts (requires --scope + --yes)`,!1).option(`--dry-run`,`Print actions without removing files`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await resetCommand(defaultRuntime,{scope:opts.scope,yes:!!opts.yes,nonInteractive:!!opts.nonInteractive,dryRun:!!opts.dryRun})})}),program.command(`uninstall`).description(`Uninstall the gateway service + local data (CLI remains)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/uninstall`,`docs.builderforce.ai/cli/uninstall`)}\n`).option(`--service`,`Remove the gateway service`,!1).option(`--state`,`Remove state + config`,!1).option(`--workspace`,`Remove workspace dirs`,!1).option(`--app`,`Remove the macOS app`,!1).option(`--all`,`Remove service + state + workspace + app`,!1).option(`--yes`,`Skip confirmation prompts`,!1).option(`--non-interactive`,`Disable prompts (requires --yes)`,!1).option(`--dry-run`,`Print actions without removing files`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await uninstallCommand(defaultRuntime,{service:!!opts.service,state:!!opts.state,workspace:!!opts.workspace,app:!!opts.app,all:!!opts.all,yes:!!opts.yes,nonInteractive:!!opts.nonInteractive,dryRun:!!opts.dryRun})})}),program.command(`stop`).description(`Stop the running gateway service (launchd/systemd/schtasks)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/gateway`,`docs.builderforce.ai/cli/gateway`)}\n`).option(`--json`,`Output JSON`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await runDaemonStop({json:!!opts.json})})})}export{registerMaintenanceCommands};
|