@seanhogg/builderforce-agents 2026.10.9 → 2026.10.10
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/{audio-preflight-CvvHdoWy.js → audio-preflight-Dm9zyfJq.js} +1 -1
- package/dist/build-info.json +3 -3
- package/dist/{builderforce-BmrsVdFw.js → builderforce-2EpP2M8q.js} +3 -3
- package/dist/{builderforce-Bwyw0GJ6.js → builderforce-Cyg20uU8.js} +3 -3
- package/dist/{builderforce-onboarding-DuUfZ6oL.js → builderforce-onboarding-C89jVb-9.js} +1 -1
- package/dist/{builderforce-onboarding-Dq6VUSKZ.js → builderforce-onboarding-D5A-wEs-.js} +1 -1
- package/dist/chrome-DUBgoZpO.js +4 -0
- package/dist/{command-registry-COUcUWby.js → command-registry-CDcuHGpx.js} +1 -1
- package/dist/{command-registry-4_K-lfW5.js → command-registry-hHegQvBn.js} +1 -1
- package/dist/{completion-cli-DlvHqL86.js → completion-cli-Bqr0W4L6.js} +1 -1
- package/dist/{completion-cli-B2qcVd6q.js → completion-cli-Ch9ozmkg.js} +1 -1
- package/dist/{completion-cli-SdcQ-kQj.js → completion-cli-Ck0FTqPT.js} +1 -1
- package/dist/{completion-cli-DpFvU4Qn.js → completion-cli-Do4vXo1k.js} +1 -1
- package/dist/{doctor-completion-BSotFS6p.js → doctor-completion-BjBTLcoC.js} +1 -1
- package/dist/{doctor-completion-DVxbs-74.js → doctor-completion-Ccs-JEvV.js} +1 -1
- package/dist/{embedded-D-citLF2.js → embedded-cvG_LpfQ.js} +6 -6
- package/dist/entry.js +1 -1
- package/dist/extensionAPI.js +1 -1
- package/dist/{gateway-cli-D2Bg1Um6.js → gateway-cli-CiHNwzdS.js} +1 -1
- package/dist/{gateway-cli-DFEo8C0z.js → gateway-cli-z47dfosr.js} +1 -1
- package/dist/index.js +2 -2
- package/dist/{onboard-DfMVh1bM.js → onboard-D4uXN5Ec.js} +1 -1
- package/dist/{onboard-BVmZ4jMw.js → onboard-cB37uVxy.js} +1 -1
- package/dist/{onboard-interactive-B3-KBZbZ.js → onboard-interactive-CnXgQrpI.js} +1 -1
- package/dist/{onboard-interactive-Dc_7URYb.js → onboard-interactive-CoFFuSJT.js} +1 -1
- package/dist/{onboard-interactive-zgjmwJz-.js → onboard-interactive-gvfRcLOt.js} +1 -1
- package/dist/{onboard-interactive-DYJttZ2w.js → onboard-interactive-vwqLS6pe.js} +1 -1
- package/dist/{onboarding-CP9rrz8y.js → onboarding-B9GqKO5L.js} +2 -2
- package/dist/{onboarding-D4-HDbmU.js → onboarding-DdKW5K8Y.js} +2 -2
- package/dist/{onboarding.finalize-C2kZi7F0.js → onboarding.finalize-CcuO4Yxw.js} +1 -1
- package/dist/{onboarding.finalize-BfWXPgX7.js → onboarding.finalize-D3mTpOdc.js} +1 -1
- package/dist/plugin-sdk/{accounts-Cy3WCbWg.js → accounts-BwreSNAR.js} +1 -1
- package/dist/plugin-sdk/{active-listener-DVWVNlT9.js → active-listener-DpQ7aGYd.js} +1 -1
- package/dist/plugin-sdk/{agent-scope-DgKN27hJ.js → agent-scope-BQByW0cD.js} +1 -1
- package/dist/plugin-sdk/{api-key-rotation-ftXf7mBZ.js → api-key-rotation-7YdImWrh.js} +1 -1
- package/dist/plugin-sdk/{audio-preflight-CfTmmeS-.js → audio-preflight-EbkaATDO.js} +1 -1
- package/dist/plugin-sdk/{auth-json-BrNBg87n.js → auth-json-DK6qod1_.js} +1 -1
- package/dist/plugin-sdk/{bindings-CH-YLOLC.js → bindings-CDEzl4kl.js} +1 -1
- package/dist/plugin-sdk/{channel-web-B6rg0Rbf.js → channel-web-D2KuONp0.js} +1 -1
- package/dist/plugin-sdk/{chrome-CuXP-hes.js → chrome-SOXFIkUM.js} +1 -1
- package/dist/plugin-sdk/{chunk-C94IAOuf.js → chunk-cW0POl22.js} +1 -1
- package/dist/plugin-sdk/{command-format-B3XMq_73.js → command-format-CAX9XFjI.js} +1 -1
- package/dist/plugin-sdk/{common-n0l_XN-S.js → common-BxEWhN2X.js} +1 -1
- package/dist/plugin-sdk/{config-DsXZsCkJ.js → config-v1EU9Ll8.js} +2 -2
- package/dist/plugin-sdk/{fetch-B-GxSYRO.js → fetch-DH0Y8iyO.js} +1 -1
- package/dist/plugin-sdk/index.js +1 -1
- package/dist/plugin-sdk/{login-_my8QwPP.js → login-d1zBgykF.js} +1 -1
- package/dist/plugin-sdk/{login-qr-BaePtXuG.js → login-qr-B6exvQnN.js} +1 -1
- package/dist/plugin-sdk/{manager-BsC-4ymy.js → manager-BH_bmGds.js} +1 -1
- package/dist/plugin-sdk/{markdown-tables-BUfhHgfs.js → markdown-tables-Epim9b-0.js} +1 -1
- package/dist/plugin-sdk/{message-channel-CuZ2xOAM.js → message-channel-sBPQc_-T.js} +1 -1
- package/dist/plugin-sdk/{model-catalog-yuiXVcmw.js → model-catalog-cXsza5GU.js} +1 -1
- package/dist/plugin-sdk/{model-selection-BtgvnqB5.js → model-selection-K82MAGlL.js} +1 -1
- package/dist/plugin-sdk/{outbound-D_attiyO.js → outbound-Chn_H1O7.js} +1 -1
- package/dist/plugin-sdk/{plugins-BdkC9v5E.js → plugins-CaUOZBVb.js} +1 -1
- package/dist/plugin-sdk/{pw-ai-A7Rathx6.js → pw-ai-BIiJF7ZD.js} +1 -1
- package/dist/plugin-sdk/{qmd-manager-Dxn0jCpE.js → qmd-manager-BRe5fGZw.js} +1 -1
- package/dist/plugin-sdk/{registry-CZHRcH-q.js → registry-DJq2Cvo9.js} +1 -1
- package/dist/plugin-sdk/{render-CuA_WRX5.js → render-BUCRXPIk.js} +1 -1
- package/dist/plugin-sdk/{replies-DmLfO-pg.js → replies-Cz5OD3qN.js} +1 -1
- package/dist/plugin-sdk/{reply-3-ne-N_7.js → reply-D5Uk7pUv.js} +9 -9
- package/dist/plugin-sdk/{reply-prefix-w7kAvH11.js → reply-prefix-CCymsmsP.js} +1 -1
- package/dist/plugin-sdk/{resolve-route-0sbvl4ZN.js → resolve-route-DN1J7Wyc.js} +1 -1
- package/dist/plugin-sdk/{runner-4UfrAQnx.js → runner-CYkuO7Fh.js} +4 -4
- package/dist/plugin-sdk/{session-BB-yfDWx.js → session-D5jHDo78.js} +1 -1
- package/dist/plugin-sdk/{sqlite-JjFgDV-H.js → sqlite-BlMLqMl8.js} +1 -1
- package/dist/plugin-sdk/{subsystem-D0Ril4rt.js → subsystem-COTa5Ly_.js} +1 -1
- package/dist/plugin-sdk/{tool-images-WRTP95FT.js → tool-images-DSpchb4x.js} +1 -1
- package/dist/plugin-sdk/{tool-loop-detection-sC_rhJfb.js → tool-loop-detection-BP6u-mbh.js} +1 -1
- package/dist/plugin-sdk/web-BbganhKi.js +1 -0
- package/dist/plugin-sdk/{whatsapp-actions-ThxQ5niy.js → whatsapp-actions-CZUqxmP1.js} +1 -1
- package/dist/{program-2w7Ue902.js → program-BgDciyOQ.js} +2 -2
- package/dist/{program-context-BCwL3wlM.js → program-context-CpxTJP1m.js} +1 -1
- package/dist/{prompt-select-styled-Dd5swW2b.js → prompt-select-styled-Bu7WPMzB.js} +1 -1
- package/dist/{prompt-select-styled-hB_nLOn1.js → prompt-select-styled-Qb0DubNy.js} +1 -1
- package/dist/{pw-ai-DaxMmaVL.js → pw-ai-D8HJAvv-.js} +1 -1
- package/dist/{register.maintenance-BELfCO_C.js → register.maintenance-CPnm6L-m.js} +1 -1
- package/dist/{register.maintenance-DukWFS_D.js → register.maintenance-D8WmeEaD.js} +1 -1
- package/dist/{register.onboard-Dt7rzAq-.js → register.onboard-BoUicPRh.js} +1 -1
- package/dist/{register.onboard-B9DMNfHE.js → register.onboard-DMfqe2nX.js} +1 -1
- package/dist/{register.setup-CSF-2ImP.js → register.setup-BK6OEvY3.js} +1 -1
- package/dist/{register.setup-BRRVPrx7.js → register.setup-CtcAR3JR.js} +1 -1
- package/dist/{register.subclis-4eDV9jKH.js → register.subclis-Dl6jPPsc.js} +1 -1
- package/dist/{register.subclis-Cr9DoYcv.js → register.subclis-EScCVgbV.js} +1 -1
- package/dist/{run-main-DLcDEJgv.js → run-main-C3lmcvyV.js} +1 -1
- package/dist/{runner-COldX-El.js → runner-CviGu3Nk.js} +3 -3
- package/dist/{tui-DylWbrDx.js → tui-D2sTsa4p.js} +1 -1
- package/dist/{tui-BwWMByVp.js → tui-DY2oYbxk.js} +1 -1
- package/dist/{tui-cli-C_TTgabr.js → tui-cli-GW-qybY6.js} +1 -1
- package/dist/{tui-cli-Bh1V8-w9.js → tui-cli-wn3DmvUG.js} +1 -1
- package/dist/{update-cli-CA3LuuJ7.js → update-cli-CN0oxZ_A.js} +1 -1
- package/dist/{update-cli-DUrUIrYQ.js → update-cli-K5dGZmg8.js} +1 -1
- package/dist/{web-BQPd6gQJ.js → web-DONGrYXq.js} +1 -1
- package/package.json +1 -1
- package/dist/chrome-Brg9KsB9.js +0 -4
- package/dist/plugin-sdk/web-CThgoHQp.js +0 -1
|
@@ -24,4 +24,4 @@ This will re-download the latest local brain models.`);break}if(action===`reset`
|
|
|
24
24
|
`))deps.chatLog.addSystem(`[local] ${line}`);deps.chatLog.addSystem(`[local] exit ${code??`?`}${signal?` (signal ${String(signal)})`:``}`),deps.tui.requestRender(),resolve()}),child.on(`error`,err=>{deps.chatLog.addSystem(`[local] error: ${String(err)}`),deps.tui.requestRender(),resolve()})})}}}var ModalOverlayFrame=class{constructor(inner){this.inner=inner,this._focused=!1}render(width){let innerWidth=Math.max(1,width-2),innerLines=this.inner.render(innerWidth),contentLines=innerLines.length>0?innerLines:[``],top=theme.modalBorder(`┌${`─`.repeat(innerWidth)}┐`),bottom=theme.modalBorder(`└${`─`.repeat(innerWidth)}┘`);return[top,...contentLines.map(line=>{let trimmed=truncateToWidth(line,innerWidth,``),pad=` `.repeat(Math.max(0,innerWidth-visibleWidth(trimmed)));return`${theme.modalBorder(`│`)}${theme.modalBg(`${trimmed}${pad}`)}${theme.modalBorder(`│`)}`}),bottom]}handleInput(data){this.inner.handleInput?.(data)}invalidate(){this.inner.invalidate()}get focused(){return this._focused}set focused(value){this._focused=value;let maybeFocusable=this.inner;typeof maybeFocusable.focused==`boolean`&&(maybeFocusable.focused=value)}};function createOverlayHandlers(host,fallbackFocus){return{openOverlay:component=>{host.showOverlay(new ModalOverlayFrame(component))},closeOverlay:()=>{if(host.hasOverlay()){host.hideOverlay();return}host.setFocus(fallbackFocus)}}}function createSessionActions(context){let{client,chatLog,tui,opts,state,agentNames,initialSessionInput,initialSessionAgentId,resolveSessionKey,updateHeader,updateFooter,updateAutocompleteProvider,setActivityStatus,clearLocalRunIds}=context,refreshSessionInfoPromise=Promise.resolve(),lastSessionDefaults=null,applyAgentsResult=result=>{state.agentDefaultId=normalizeAgentId(result.defaultId),state.sessionMainKey=normalizeMainKey(result.mainKey),state.sessionScope=result.scope??state.sessionScope,state.agents=result.agents.map(agent=>({id:normalizeAgentId(agent.id),name:agent.name?.trim()||void 0})),agentNames.clear();for(let agent of state.agents)agent.name&&agentNames.set(agent.id,agent.name);if(state.initialSessionApplied)state.agents.some(agent=>agent.id===state.currentAgentId)||(state.currentAgentId=state.agents[0]?.id??normalizeAgentId(result.defaultId??state.currentAgentId));else{initialSessionAgentId?state.agents.some(agent=>agent.id===initialSessionAgentId)&&(state.currentAgentId=initialSessionAgentId):state.agents.some(agent=>agent.id===state.currentAgentId)||(state.currentAgentId=state.agents[0]?.id??normalizeAgentId(result.defaultId??state.currentAgentId));let nextSessionKey=resolveSessionKey(initialSessionInput);nextSessionKey!==state.currentSessionKey&&(state.currentSessionKey=nextSessionKey),state.initialSessionApplied=!0}updateHeader(),updateFooter()},refreshAgents=async()=>{try{applyAgentsResult(await client.listAgents())}catch(err){chatLog.addSystem(`agents list failed: ${String(err)}`)}},updateAgentFromSessionKey=key=>{let parsed=parseAgentSessionKey(key);if(!parsed)return;let next=normalizeAgentId(parsed.agentId);next!==state.currentAgentId&&(state.currentAgentId=next)},resolveModelSelection=entry=>{if(entry?.modelProvider||entry?.model)return{modelProvider:entry.modelProvider??state.sessionInfo.modelProvider,model:entry.model??state.sessionInfo.model};let overrideModel=entry?.modelOverride?.trim();return overrideModel?{modelProvider:entry?.providerOverride?.trim()||state.sessionInfo.modelProvider,model:overrideModel}:{modelProvider:state.sessionInfo.modelProvider,model:state.sessionInfo.model}},applySessionInfo=params=>{let entry=params.entry??void 0,defaults=params.defaults??lastSessionDefaults??void 0,previousDefaults=lastSessionDefaults,defaultsChanged=params.defaults?previousDefaults?.model!==params.defaults.model||previousDefaults?.modelProvider!==params.defaults.modelProvider||previousDefaults?.contextTokens!==params.defaults.contextTokens:!1;params.defaults&&(lastSessionDefaults=params.defaults);let entryUpdatedAt=entry?.updatedAt??null,currentUpdatedAt=state.sessionInfo.updatedAt??null,modelChanged=entry?.modelProvider!==void 0&&entry.modelProvider!==state.sessionInfo.modelProvider||entry?.model!==void 0&&entry.model!==state.sessionInfo.model;if(!params.force&&entryUpdatedAt!==null&¤tUpdatedAt!==null&&entryUpdatedAt<currentUpdatedAt&&!defaultsChanged&&!modelChanged)return;let next={...state.sessionInfo};entry?.thinkingLevel!==void 0&&(next.thinkingLevel=entry.thinkingLevel),entry?.verboseLevel!==void 0&&(next.verboseLevel=entry.verboseLevel),entry?.reasoningLevel!==void 0&&(next.reasoningLevel=entry.reasoningLevel),entry?.responseUsage!==void 0&&(next.responseUsage=entry.responseUsage),entry?.inputTokens!==void 0&&(next.inputTokens=entry.inputTokens),entry?.outputTokens!==void 0&&(next.outputTokens=entry.outputTokens),entry?.totalTokens!==void 0&&(next.totalTokens=entry.totalTokens),(entry?.contextTokens!==void 0||defaults?.contextTokens!==void 0)&&(next.contextTokens=entry?.contextTokens??defaults?.contextTokens??state.sessionInfo.contextTokens),entry?.displayName!==void 0&&(next.displayName=entry.displayName),entry?.updatedAt!==void 0&&(next.updatedAt=entry.updatedAt);let selection=resolveModelSelection(entry);selection.modelProvider!==void 0&&(next.modelProvider=selection.modelProvider),selection.model!==void 0&&(next.model=selection.model),state.sessionInfo=next,updateAutocompleteProvider(),updateFooter(),tui.requestRender()},runRefreshSessionInfo=async()=>{try{let listAgentId=(()=>{if(state.currentSessionKey===`global`||state.currentSessionKey===`unknown`)return;let parsed=parseAgentSessionKey(state.currentSessionKey);return parsed?.agentId?normalizeAgentId(parsed.agentId):state.currentAgentId})(),result=await client.listSessions({includeGlobal:!1,includeUnknown:!1,agentId:listAgentId}),normalizeMatchKey=key=>parseAgentSessionKey(key)?.rest??key,currentMatchKey=normalizeMatchKey(state.currentSessionKey),entry=result.sessions.find(row=>row.key===state.currentSessionKey?!0:normalizeMatchKey(row.key)===currentMatchKey);entry?.key&&entry.key!==state.currentSessionKey&&(updateAgentFromSessionKey(entry.key),state.currentSessionKey=entry.key,updateHeader()),applySessionInfo({entry,defaults:result.defaults})}catch(err){chatLog.addSystem(`sessions list failed: ${String(err)}`)}},refreshSessionInfo=async()=>{refreshSessionInfoPromise=refreshSessionInfoPromise.then(runRefreshSessionInfo,runRefreshSessionInfo),await refreshSessionInfoPromise},applySessionInfoFromPatch=result=>{if(!result?.entry)return;result.key&&result.key!==state.currentSessionKey&&(updateAgentFromSessionKey(result.key),state.currentSessionKey=result.key,updateHeader());let resolved=result.resolved;applySessionInfo({entry:resolved&&(resolved.modelProvider||resolved.model)?{...result.entry,modelProvider:resolved.modelProvider??result.entry.modelProvider,model:resolved.model??result.entry.model}:result.entry,force:!0})},loadHistory=async()=>{try{let record=await client.loadHistory({sessionKey:state.currentSessionKey,limit:opts.historyLimit??200});state.currentSessionId=typeof record.sessionId==`string`?record.sessionId:null,state.sessionInfo.thinkingLevel=record.thinkingLevel??state.sessionInfo.thinkingLevel,state.sessionInfo.verboseLevel=record.verboseLevel??state.sessionInfo.verboseLevel;let showTools=(state.sessionInfo.verboseLevel??`off`)!==`off`;chatLog.clearAll(),chatLog.addSystem(`session ${state.currentSessionKey}`);for(let entry of record.messages??[]){if(!entry||typeof entry!=`object`)continue;let message=entry;if(isCommandMessage(message)){let text=extractTextFromMessage(message);text&&chatLog.addSystem(text);continue}if(message.role===`user`){let text=extractTextFromMessage(message);text&&chatLog.addUser(text);continue}if(message.role===`assistant`){let text=extractTextFromMessage(message,{includeThinking:state.showThinking});text&&chatLog.finalizeAssistant(text);continue}if(message.role===`toolResult`){if(!showTools)continue;let toolCallId=asString(message.toolCallId,``),toolName=asString(message.toolName,`tool`);chatLog.startTool(toolCallId,toolName,{}).setResult({content:Array.isArray(message.content)?message.content:[],details:typeof message.details==`object`&&message.details?message.details:void 0},{isError:!!message.isError})}}state.historyLoaded=!0}catch(err){chatLog.addSystem(`history failed: ${String(err)}`)}await refreshSessionInfo(),tui.requestRender()};return{applyAgentsResult,refreshAgents,refreshSessionInfo,applySessionInfoFromPatch,loadHistory,setSession:async rawKey=>{let nextKey=resolveSessionKey(rawKey);updateAgentFromSessionKey(nextKey),state.currentSessionKey=nextKey,state.activeChatRunId=null,state.currentSessionId=null,state.historyLoaded=!1,clearLocalRunIds?.(),updateHeader(),updateFooter(),await loadHistory();try{let handoff=await loadLatestSessionHandoff(process.cwd());if(handoff){let lines=[`Resuming from session ${handoff.sessionId.slice(0,8)} (${handoff.timestamp.slice(0,10)})`,`Summary: ${handoff.summary}`];handoff.decisions.length>0&&lines.push(`Decisions: ${handoff.decisions.map(d=>`• ${d}`).join(` `)}`),handoff.nextSteps.length>0&&lines.push(`Next steps: ${handoff.nextSteps.map(s=>`• ${s}`).join(` `)}`),handoff.openQuestions.length>0&&lines.push(`Open questions: ${handoff.openQuestions.map(q=>`• ${q}`).join(` `)}`),chatLog.addSystem(lines.join(`
|
|
25
25
|
`))}}catch{}},abortActive:async()=>{if(!state.activeChatRunId){chatLog.addSystem(`no active run`),tui.requestRender();return}try{await client.abortChat({sessionKey:state.currentSessionKey,runId:state.activeChatRunId}),setActivityStatus(`aborted`)}catch(err){chatLog.addSystem(`abort failed: ${String(err)}`),setActivityStatus(`abort failed`)}tui.requestRender()}}}const defaultWaitingPhrases=[`flibbertigibbeting`,`kerfuffling`,`dillydallying`,`twiddling thumbs`,`noodling`,`bamboozling`,`moseying`,`hobnobbing`,`pondering`,`conjuring`];function pickWaitingPhrase(tick,phrases=defaultWaitingPhrases){return phrases[Math.floor(tick/10)%phrases.length]??phrases[0]??`waiting`}function shimmerText(theme,text,tick){let hi=ch=>theme.bold(theme.accentSoft(ch)),pos=tick%(text.length+6),start=Math.max(0,pos-6),end=Math.min(text.length-1,pos),out=``;for(let i=0;i<text.length;i++){let ch=text[i];out+=i>=start&&i<=end?hi(ch):theme.dim(ch)}return out}function buildWaitingStatusMessage(params){let phrase=pickWaitingPhrase(params.tick,params.phrases);return`${shimmerText(params.theme,`${phrase}…`,params.tick)} • ${params.elapsed} | ${params.connectionStatus}`}function createEditorSubmitHandler(params){return text=>{let raw=text,value=raw.trim();if(params.editor.setText(``),value){if(raw.startsWith(`!`)&&raw!==`!`){params.editor.addToHistory(raw),params.handleBangLine(raw);return}if(params.editor.addToHistory(value),value.startsWith(`/`)){params.handleCommand(value);return}params.sendMessage(value)}}}function shouldEnableWindowsGitBashPasteFallback(params){if((params?.platform??process.platform)!==`win32`)return!1;let env=params?.env??process.env,msystem=(env.MSYSTEM??``).toUpperCase(),shell=env.SHELL??``,termProgram=(env.TERM_PROGRAM??``).toLowerCase();return msystem.startsWith(`MINGW`)||msystem.startsWith(`MSYS`)||shell.toLowerCase().includes(`bash`)?!0:termProgram.includes(`mintty`)}function createSubmitBurstCoalescer(params){let windowMs=Math.max(1,params.burstWindowMs??50),now=params.now??(()=>Date.now()),setTimer=params.setTimer??setTimeout,clearTimer=params.clearTimer??clearTimeout,pending=null,pendingAt=0,flushTimer=null,clearFlushTimer=()=>{flushTimer&&=(clearTimer(flushTimer),null)},flushPending=()=>{if(pending===null)return;let value=pending;pending=null,pendingAt=0,clearFlushTimer(),params.submit(value)},scheduleFlush=()=>{clearFlushTimer(),flushTimer=setTimer(()=>{flushPending()},windowMs)};return value=>{if(!params.enabled){params.submit(value);return}if(value.includes(`
|
|
26
26
|
`)){flushPending(),params.submit(value);return}let ts=now();if(pending===null){pending=value,pendingAt=ts,scheduleFlush();return}if(ts-pendingAt<=windowMs){pending=`${pending}\n${value}`,pendingAt=ts,scheduleFlush();return}flushPending(),pending=value,pendingAt=ts,scheduleFlush()}}function resolveTuiSessionKey(params){let trimmed=(params.raw??``).trim();return trimmed?trimmed===`global`||trimmed===`unknown`||trimmed.startsWith(`agent:`)?trimmed:`agent:${params.currentAgentId}:${trimmed}`:params.sessionScope===`global`?`global`:buildAgentMainSessionKey({agentId:params.currentAgentId,mainKey:params.sessionMainKey})}async function runTui(opts){let config=loadConfig(),initialSessionInput=(opts.session??``).trim(),sessionScope=config.session?.scope??`per-sender`,sessionMainKey=normalizeMainKey(config.session?.mainKey),agentDefaultId=resolveDefaultAgentId(config),currentAgentId=agentDefaultId,agents=[],agentNames=new Map,currentSessionKey=``,initialSessionApplied=!1,currentSessionId=null,activeChatRunId=null,historyLoaded=!1,isConnected=!1,wasDisconnected=!1,toolsExpanded=!1,loggingEnabled=config.logging?.enabled!==!1,showThinking=!1,localRunIds=new Set,deliverDefault=opts.deliver??!1,autoMessage=opts.message?.trim(),autoMessageSent=!1,sessionInfo={},lastCtrlCAt=0,activityStatus=`idle`,connectionStatus=`connecting`,statusTimeout=null,statusTimer=null,statusStartedAt=null,lastActivityStatus=activityStatus,setupInProgress=!1,projectName=null,workspaceState=null;Promise.all([loadProjectContext(process.cwd()).catch(()=>null),loadWorkspaceState(process.cwd()).catch(()=>null)]).then(([ctx,ws])=>{projectName=ctx?.projectName??null,workspaceState=ws});let state={get agentDefaultId(){return agentDefaultId},set agentDefaultId(value){agentDefaultId=value},get sessionMainKey(){return sessionMainKey},set sessionMainKey(value){sessionMainKey=value},get sessionScope(){return sessionScope},set sessionScope(value){sessionScope=value},get agents(){return agents},set agents(value){agents=value},get currentAgentId(){return currentAgentId},set currentAgentId(value){currentAgentId=value},get currentSessionKey(){return currentSessionKey},set currentSessionKey(value){currentSessionKey=value},get currentSessionId(){return currentSessionId},set currentSessionId(value){currentSessionId=value},get activeChatRunId(){return activeChatRunId},set activeChatRunId(value){activeChatRunId=value},get historyLoaded(){return historyLoaded},set historyLoaded(value){historyLoaded=value},get sessionInfo(){return sessionInfo},set sessionInfo(value){sessionInfo=value},get initialSessionApplied(){return initialSessionApplied},set initialSessionApplied(value){initialSessionApplied=value},get isConnected(){return isConnected},set isConnected(value){isConnected=value},get autoMessageSent(){return autoMessageSent},set autoMessageSent(value){autoMessageSent=value},get toolsExpanded(){return toolsExpanded},set toolsExpanded(value){toolsExpanded=value},get showThinking(){return showThinking},set showThinking(value){showThinking=value},get connectionStatus(){return connectionStatus},set connectionStatus(value){connectionStatus=value},get activityStatus(){return activityStatus},set activityStatus(value){activityStatus=value},get statusTimeout(){return statusTimeout},set statusTimeout(value){statusTimeout=value},get lastCtrlCAt(){return lastCtrlCAt},set lastCtrlCAt(value){lastCtrlCAt=value},get loggingEnabled(){return loggingEnabled},set loggingEnabled(value){loggingEnabled=value}},noteLocalRunId=runId=>{if(runId&&(localRunIds.add(runId),localRunIds.size>200)){let[first]=localRunIds;first&&localRunIds.delete(first)}},forgetLocalRunId=runId=>{localRunIds.delete(runId)},isLocalRunId=runId=>localRunIds.has(runId),clearLocalRunIds=()=>{localRunIds.clear()},client=new GatewayChatClient({url:opts.url,token:opts.token,password:opts.password}),tui=new TUI(new ProcessTerminal),header=new Text(``,1,0),statusContainer=new Container,statusBodyContainer=new Container,statusTraceText=new Text(``,1,0),footer=new Text(``,1,0),chatLog=new ChatLog,editor=new CustomEditor(tui,editorTheme),root=new Container;root.addChild(header),root.addChild(chatLog),statusContainer.addChild(statusBodyContainer),statusContainer.addChild(statusTraceText),root.addChild(statusContainer),root.addChild(footer),root.addChild(editor);let updateAutocompleteProvider=()=>{editor.setAutocompleteProvider(new CombinedAutocompleteProvider(getSlashCommands({cfg:config,provider:sessionInfo.modelProvider,model:sessionInfo.model}),process.cwd()))};tui.addChild(root),tui.setFocus(editor);let formatSessionKey=key=>key===`global`||key===`unknown`?key:parseAgentSessionKey(key)?.rest??key,formatAgentLabel=id=>{let name=agentNames.get(id);return name?`${id} (${name})`:id},resolveSessionKey=raw=>resolveTuiSessionKey({raw,sessionScope,currentAgentId,sessionMainKey});currentSessionKey=resolveSessionKey(initialSessionInput);let updateHeader=()=>{let sessionLabel=formatSessionKey(currentSessionKey),agentLabel=formatAgentLabel(currentAgentId),projectPart=projectName?` · ${projectName}`:``,syncPart=workspaceState?.lastSyncedAt?` [synced ${formatTimeAgo(Date.now()-new Date(workspaceState.lastSyncedAt).getTime())}]`:``;header.setText(theme.header(`builderforce tui${projectPart}${syncPart} - ${client.connection.url} - agent ${agentLabel} - session ${sessionLabel}`))},busyStates=new Set([`sending`,`waiting`,`streaming`,`running`]),statusText=null,statusLoader=null,statusTraceLines=[],renderStatusTrace=()=>{statusTraceText.setText(theme.dim(statusTraceLines.join(`
|
|
27
|
-
`)))},reportAction=text=>{let message=text.trim();message&&(statusTraceLines.push(`• ${message}`),statusTraceLines.length>14&&statusTraceLines.splice(0,statusTraceLines.length-14),renderStatusTrace())},formatElapsed=startMs=>{let totalSeconds=Math.max(0,Math.floor((Date.now()-startMs)/1e3));return totalSeconds<60?`${totalSeconds}s`:`${Math.floor(totalSeconds/60)}m ${totalSeconds%60}s`},ensureStatusText=()=>{statusText||(statusBodyContainer.clear(),statusLoader?.stop(),statusLoader=null,statusText=new Text(``,1,0),statusBodyContainer.addChild(statusText))},ensureStatusLoader=()=>{statusLoader||(statusBodyContainer.clear(),statusText=null,statusLoader=new Loader(tui,spinner=>theme.accent(spinner),text=>theme.bold(theme.accentSoft(text)),``),statusBodyContainer.addChild(statusLoader))},waitingTick=0,waitingTimer=null,waitingPhrase=null,updateBusyStatusMessage=()=>{if(!statusLoader||!statusStartedAt)return;let elapsed=formatElapsed(statusStartedAt);if(activityStatus===`waiting`){waitingTick++,statusLoader.setMessage(buildWaitingStatusMessage({theme,tick:waitingTick,elapsed,connectionStatus,phrases:waitingPhrase?[waitingPhrase]:void 0}));return}statusLoader.setMessage(`${activityStatus} • ${elapsed} | ${connectionStatus}`)},startStatusTimer=()=>{statusTimer||=setInterval(()=>{busyStates.has(activityStatus)&&updateBusyStatusMessage()},1e3)},stopStatusTimer=()=>{statusTimer&&=(clearInterval(statusTimer),null)},startWaitingTimer=()=>{waitingTimer||=(waitingPhrase||=defaultWaitingPhrases[Math.floor(Math.random()*defaultWaitingPhrases.length)]??defaultWaitingPhrases[0]??`waiting`,waitingTick=0,setInterval(()=>{activityStatus===`waiting`&&updateBusyStatusMessage()},120))},stopWaitingTimer=()=>{waitingTimer&&(clearInterval(waitingTimer),waitingTimer=null,waitingPhrase=null)},renderStatus=()=>{if(busyStates.has(activityStatus))(!statusStartedAt||lastActivityStatus!==activityStatus)&&(statusStartedAt=Date.now()),ensureStatusLoader(),activityStatus===`waiting`?(stopStatusTimer(),startWaitingTimer()):(stopWaitingTimer(),startStatusTimer()),updateBusyStatusMessage();else{statusStartedAt=null,stopStatusTimer(),stopWaitingTimer(),statusLoader?.stop(),statusLoader=null,ensureStatusText();let text=activityStatus?`${connectionStatus} | ${activityStatus}`:connectionStatus;statusText?.setText(theme.dim(text))}lastActivityStatus=activityStatus},setConnectionStatus=(text,ttlMs)=>{let previous=connectionStatus;connectionStatus=text,text!==previous&&reportAction(`connection: ${text}`),renderStatus(),statusTimeout&&clearTimeout(statusTimeout),ttlMs&&ttlMs>0&&(statusTimeout=setTimeout(()=>{connectionStatus=isConnected?`connected`:`disconnected`,renderStatus()},ttlMs))},setActivityStatus=text=>{activityStatus=text,renderStatus()},updateFooter=()=>{let sessionKeyLabel=formatSessionKey(currentSessionKey),sessionLabel=sessionInfo.displayName?`${sessionKeyLabel} (${sessionInfo.displayName})`:sessionKeyLabel,agentLabel=formatAgentLabel(currentAgentId),modelLabel=sessionInfo.model?sessionInfo.modelProvider?`${sessionInfo.modelProvider}/${sessionInfo.model}`:sessionInfo.model:`unknown`,tokens=formatTokens(sessionInfo.totalTokens??null,sessionInfo.contextTokens??null),think=sessionInfo.thinkingLevel??`off`,verbose=sessionInfo.verboseLevel??`off`,reasoning=sessionInfo.reasoningLevel??`off`,reasoningLabel=reasoning===`on`?`reasoning`:reasoning===`stream`?`reasoning:stream`:null,localBrainLabel=config.localBrain?.enabled?`local brain`:null,footerParts=[`agent ${agentLabel}`,`session ${sessionLabel}`,modelLabel,localBrainLabel,think===`off`?null:`think ${think}`,verbose===`off`?null:`verbose ${verbose}`,reasoningLabel,tokens].filter(Boolean);footer.setText(theme.dim(footerParts.join(` | `)))},{openOverlay,closeOverlay}=createOverlayHandlers(tui,editor),{refreshAgents,refreshSessionInfo,applySessionInfoFromPatch,loadHistory,setSession,abortActive}=createSessionActions({client,chatLog,tui,opts,state,agentNames,initialSessionInput,initialSessionAgentId:(()=>{if(!initialSessionInput)return null;let parsed=parseAgentSessionKey(initialSessionInput);return parsed?normalizeAgentId(parsed.agentId):null})(),resolveSessionKey,updateHeader,updateFooter,updateAutocompleteProvider,setActivityStatus,clearLocalRunIds}),{handleChatEvent,handleAgentEvent}=createEventHandlers({chatLog,tui,state,setActivityStatus,reportAction,refreshSessionInfo,loadHistory,isLocalRunId,forgetLocalRunId,clearLocalRunIds}),{handleCommand,sendMessage,openModelSelector,openAgentSelector,openSessionSelector}=createCommandHandlers({client,chatLog,tui,opts,state,deliverDefault,openOverlay,closeOverlay,refreshSessionInfo,applySessionInfoFromPatch,updateFooter,loadHistory,setSession,refreshAgents,abortActive,setActivityStatus,reportAction,formatSessionKey,noteLocalRunId,forgetLocalRunId,onSetup:async()=>{if(setupInProgress){chatLog.addSystem(`Setup is already running.`),tui.requestRender();return}setupInProgress=!0;try{chatLog.addSystem(`Stopping TUI — setup wizard starting…`),tui.requestRender(),await new Promise(r=>setTimeout(r,80)),client.stop(),tui.stop(),await new Promise(r=>setTimeout(r,50));let{restoreTerminalState}=await import(`./restore-BNDNfE3q.js`),{runInteractiveOnboarding}=await import(`./onboard-interactive-
|
|
27
|
+
`)))},reportAction=text=>{let message=text.trim();message&&(statusTraceLines.push(`• ${message}`),statusTraceLines.length>14&&statusTraceLines.splice(0,statusTraceLines.length-14),renderStatusTrace())},formatElapsed=startMs=>{let totalSeconds=Math.max(0,Math.floor((Date.now()-startMs)/1e3));return totalSeconds<60?`${totalSeconds}s`:`${Math.floor(totalSeconds/60)}m ${totalSeconds%60}s`},ensureStatusText=()=>{statusText||(statusBodyContainer.clear(),statusLoader?.stop(),statusLoader=null,statusText=new Text(``,1,0),statusBodyContainer.addChild(statusText))},ensureStatusLoader=()=>{statusLoader||(statusBodyContainer.clear(),statusText=null,statusLoader=new Loader(tui,spinner=>theme.accent(spinner),text=>theme.bold(theme.accentSoft(text)),``),statusBodyContainer.addChild(statusLoader))},waitingTick=0,waitingTimer=null,waitingPhrase=null,updateBusyStatusMessage=()=>{if(!statusLoader||!statusStartedAt)return;let elapsed=formatElapsed(statusStartedAt);if(activityStatus===`waiting`){waitingTick++,statusLoader.setMessage(buildWaitingStatusMessage({theme,tick:waitingTick,elapsed,connectionStatus,phrases:waitingPhrase?[waitingPhrase]:void 0}));return}statusLoader.setMessage(`${activityStatus} • ${elapsed} | ${connectionStatus}`)},startStatusTimer=()=>{statusTimer||=setInterval(()=>{busyStates.has(activityStatus)&&updateBusyStatusMessage()},1e3)},stopStatusTimer=()=>{statusTimer&&=(clearInterval(statusTimer),null)},startWaitingTimer=()=>{waitingTimer||=(waitingPhrase||=defaultWaitingPhrases[Math.floor(Math.random()*defaultWaitingPhrases.length)]??defaultWaitingPhrases[0]??`waiting`,waitingTick=0,setInterval(()=>{activityStatus===`waiting`&&updateBusyStatusMessage()},120))},stopWaitingTimer=()=>{waitingTimer&&(clearInterval(waitingTimer),waitingTimer=null,waitingPhrase=null)},renderStatus=()=>{if(busyStates.has(activityStatus))(!statusStartedAt||lastActivityStatus!==activityStatus)&&(statusStartedAt=Date.now()),ensureStatusLoader(),activityStatus===`waiting`?(stopStatusTimer(),startWaitingTimer()):(stopWaitingTimer(),startStatusTimer()),updateBusyStatusMessage();else{statusStartedAt=null,stopStatusTimer(),stopWaitingTimer(),statusLoader?.stop(),statusLoader=null,ensureStatusText();let text=activityStatus?`${connectionStatus} | ${activityStatus}`:connectionStatus;statusText?.setText(theme.dim(text))}lastActivityStatus=activityStatus},setConnectionStatus=(text,ttlMs)=>{let previous=connectionStatus;connectionStatus=text,text!==previous&&reportAction(`connection: ${text}`),renderStatus(),statusTimeout&&clearTimeout(statusTimeout),ttlMs&&ttlMs>0&&(statusTimeout=setTimeout(()=>{connectionStatus=isConnected?`connected`:`disconnected`,renderStatus()},ttlMs))},setActivityStatus=text=>{activityStatus=text,renderStatus()},updateFooter=()=>{let sessionKeyLabel=formatSessionKey(currentSessionKey),sessionLabel=sessionInfo.displayName?`${sessionKeyLabel} (${sessionInfo.displayName})`:sessionKeyLabel,agentLabel=formatAgentLabel(currentAgentId),modelLabel=sessionInfo.model?sessionInfo.modelProvider?`${sessionInfo.modelProvider}/${sessionInfo.model}`:sessionInfo.model:`unknown`,tokens=formatTokens(sessionInfo.totalTokens??null,sessionInfo.contextTokens??null),think=sessionInfo.thinkingLevel??`off`,verbose=sessionInfo.verboseLevel??`off`,reasoning=sessionInfo.reasoningLevel??`off`,reasoningLabel=reasoning===`on`?`reasoning`:reasoning===`stream`?`reasoning:stream`:null,localBrainLabel=config.localBrain?.enabled?`local brain`:null,footerParts=[`agent ${agentLabel}`,`session ${sessionLabel}`,modelLabel,localBrainLabel,think===`off`?null:`think ${think}`,verbose===`off`?null:`verbose ${verbose}`,reasoningLabel,tokens].filter(Boolean);footer.setText(theme.dim(footerParts.join(` | `)))},{openOverlay,closeOverlay}=createOverlayHandlers(tui,editor),{refreshAgents,refreshSessionInfo,applySessionInfoFromPatch,loadHistory,setSession,abortActive}=createSessionActions({client,chatLog,tui,opts,state,agentNames,initialSessionInput,initialSessionAgentId:(()=>{if(!initialSessionInput)return null;let parsed=parseAgentSessionKey(initialSessionInput);return parsed?normalizeAgentId(parsed.agentId):null})(),resolveSessionKey,updateHeader,updateFooter,updateAutocompleteProvider,setActivityStatus,clearLocalRunIds}),{handleChatEvent,handleAgentEvent}=createEventHandlers({chatLog,tui,state,setActivityStatus,reportAction,refreshSessionInfo,loadHistory,isLocalRunId,forgetLocalRunId,clearLocalRunIds}),{handleCommand,sendMessage,openModelSelector,openAgentSelector,openSessionSelector}=createCommandHandlers({client,chatLog,tui,opts,state,deliverDefault,openOverlay,closeOverlay,refreshSessionInfo,applySessionInfoFromPatch,updateFooter,loadHistory,setSession,refreshAgents,abortActive,setActivityStatus,reportAction,formatSessionKey,noteLocalRunId,forgetLocalRunId,onSetup:async()=>{if(setupInProgress){chatLog.addSystem(`Setup is already running.`),tui.requestRender();return}setupInProgress=!0;try{chatLog.addSystem(`Stopping TUI — setup wizard starting…`),tui.requestRender(),await new Promise(r=>setTimeout(r,80)),client.stop(),tui.stop(),await new Promise(r=>setTimeout(r,50));let{restoreTerminalState}=await import(`./restore-BNDNfE3q.js`),{runInteractiveOnboarding}=await import(`./onboard-interactive-CnXgQrpI.js`),{startGatewayBackground}=await import(`./tui-setup-check-BABAyl-e.js`);restoreTerminalState(`pre-setup-wizard`,{resumeStdinIfPaused:!0}),await new Promise(r=>setTimeout(r,150));try{await runInteractiveOnboarding({flow:`quickstart`})}catch(err){process.stderr.write(`Setup wizard failed: ${String(err)}\n`)}finally{restoreTerminalState(`post-setup-wizard`,{resumeStdinIfPaused:!0})}await startGatewayBackground(),setConnectionStatus(`restarting tui`),setActivityStatus(`idle`),updateHeader(),updateFooter(),tui.start(),tui.setFocus(editor),tui.requestRender(),client.start()}finally{setupInProgress=!1}},config}),{runLocalShellLine}=createLocalShellRunner({chatLog,tui,openOverlay,closeOverlay});updateAutocompleteProvider(),editor.onSubmit=createSubmitBurstCoalescer({submit:createEditorSubmitHandler({editor,handleCommand,sendMessage,handleBangLine:runLocalShellLine}),enabled:shouldEnableWindowsGitBashPasteFallback()}),editor.onEscape=()=>{abortActive()},editor.onCtrlC=()=>{let now=Date.now();if(editor.getText().trim().length>0){editor.setText(``),setActivityStatus(`cleared input`),tui.requestRender();return}now-lastCtrlCAt<1e3&&(client.stop(),tui.stop(),process.exit(0)),lastCtrlCAt=now,setActivityStatus(`press ctrl+c again to exit`),tui.requestRender()},editor.onCtrlD=()=>{client.stop(),tui.stop(),process.exit(0)},editor.onCtrlO=()=>{toolsExpanded=!toolsExpanded,chatLog.setToolsExpanded(toolsExpanded),setActivityStatus(toolsExpanded?`tools expanded`:`tools collapsed`),tui.requestRender()},editor.onCtrlL=()=>{openModelSelector()},editor.onCtrlG=()=>{openAgentSelector()},editor.onCtrlP=()=>{openSessionSelector()},editor.onCtrlT=()=>{showThinking=!showThinking,loadHistory()},client.onEvent=evt=>{evt.event===`chat`&&handleChatEvent(evt.payload),evt.event===`agent`&&handleAgentEvent(evt.payload)},client.onConnected=()=>{isConnected=!0;let reconnected=wasDisconnected;wasDisconnected=!1,setConnectionStatus(`connected`),(async()=>{await refreshAgents(),updateHeader(),await refreshSessionInfo(),await loadHistory(),setConnectionStatus(reconnected?`gateway reconnected`:`gateway connected`,4e3),tui.requestRender(),!autoMessageSent&&autoMessage&&(autoMessageSent=!0,await sendMessage(autoMessage)),updateFooter(),tui.requestRender()})()},client.onDisconnected=reason=>{let isFirstFailure=!wasDisconnected&&!isConnected;isConnected=!1,wasDisconnected=!0,historyLoaded=!1,setConnectionStatus(`gateway disconnected: ${reason?.trim()?reason.trim():`closed`}`,5e3),setActivityStatus(`idle`),isFirstFailure&&chatLog.addSystem(`Gateway not reachable. Type /setup or /onboard to run the setup wizard, or /gateway restart to restart the gateway.`),updateFooter(),tui.requestRender()},client.onGap=info=>{setConnectionStatus(`event gap: expected ${info.expected}, got ${info.received}`,5e3),tui.requestRender()},updateHeader(),setConnectionStatus(`connecting`),updateFooter(),tui.start(),client.start(),await new Promise(resolve=>{let finish=()=>resolve();process.once(`exit`,finish),process.once(`SIGINT`,finish),process.once(`SIGTERM`,finish)})}export{runTui as t};
|
|
@@ -24,4 +24,4 @@ This will re-download the latest local brain models.`);break}if(action===`reset`
|
|
|
24
24
|
`))deps.chatLog.addSystem(`[local] ${line}`);deps.chatLog.addSystem(`[local] exit ${code??`?`}${signal?` (signal ${String(signal)})`:``}`),deps.tui.requestRender(),resolve()}),child.on(`error`,err=>{deps.chatLog.addSystem(`[local] error: ${String(err)}`),deps.tui.requestRender(),resolve()})})}}}var ModalOverlayFrame=class{constructor(inner){this.inner=inner,this._focused=!1}render(width){let innerWidth=Math.max(1,width-2),innerLines=this.inner.render(innerWidth),contentLines=innerLines.length>0?innerLines:[``],top=theme.modalBorder(`┌${`─`.repeat(innerWidth)}┐`),bottom=theme.modalBorder(`└${`─`.repeat(innerWidth)}┘`);return[top,...contentLines.map(line=>{let trimmed=truncateToWidth(line,innerWidth,``),pad=` `.repeat(Math.max(0,innerWidth-visibleWidth(trimmed)));return`${theme.modalBorder(`│`)}${theme.modalBg(`${trimmed}${pad}`)}${theme.modalBorder(`│`)}`}),bottom]}handleInput(data){this.inner.handleInput?.(data)}invalidate(){this.inner.invalidate()}get focused(){return this._focused}set focused(value){this._focused=value;let maybeFocusable=this.inner;typeof maybeFocusable.focused==`boolean`&&(maybeFocusable.focused=value)}};function createOverlayHandlers(host,fallbackFocus){return{openOverlay:component=>{host.showOverlay(new ModalOverlayFrame(component))},closeOverlay:()=>{if(host.hasOverlay()){host.hideOverlay();return}host.setFocus(fallbackFocus)}}}function createSessionActions(context){let{client,chatLog,tui,opts,state,agentNames,initialSessionInput,initialSessionAgentId,resolveSessionKey,updateHeader,updateFooter,updateAutocompleteProvider,setActivityStatus,clearLocalRunIds}=context,refreshSessionInfoPromise=Promise.resolve(),lastSessionDefaults=null,applyAgentsResult=result=>{state.agentDefaultId=normalizeAgentId(result.defaultId),state.sessionMainKey=normalizeMainKey(result.mainKey),state.sessionScope=result.scope??state.sessionScope,state.agents=result.agents.map(agent=>({id:normalizeAgentId(agent.id),name:agent.name?.trim()||void 0})),agentNames.clear();for(let agent of state.agents)agent.name&&agentNames.set(agent.id,agent.name);if(state.initialSessionApplied)state.agents.some(agent=>agent.id===state.currentAgentId)||(state.currentAgentId=state.agents[0]?.id??normalizeAgentId(result.defaultId??state.currentAgentId));else{initialSessionAgentId?state.agents.some(agent=>agent.id===initialSessionAgentId)&&(state.currentAgentId=initialSessionAgentId):state.agents.some(agent=>agent.id===state.currentAgentId)||(state.currentAgentId=state.agents[0]?.id??normalizeAgentId(result.defaultId??state.currentAgentId));let nextSessionKey=resolveSessionKey(initialSessionInput);nextSessionKey!==state.currentSessionKey&&(state.currentSessionKey=nextSessionKey),state.initialSessionApplied=!0}updateHeader(),updateFooter()},refreshAgents=async()=>{try{applyAgentsResult(await client.listAgents())}catch(err){chatLog.addSystem(`agents list failed: ${String(err)}`)}},updateAgentFromSessionKey=key=>{let parsed=parseAgentSessionKey(key);if(!parsed)return;let next=normalizeAgentId(parsed.agentId);next!==state.currentAgentId&&(state.currentAgentId=next)},resolveModelSelection=entry=>{if(entry?.modelProvider||entry?.model)return{modelProvider:entry.modelProvider??state.sessionInfo.modelProvider,model:entry.model??state.sessionInfo.model};let overrideModel=entry?.modelOverride?.trim();return overrideModel?{modelProvider:entry?.providerOverride?.trim()||state.sessionInfo.modelProvider,model:overrideModel}:{modelProvider:state.sessionInfo.modelProvider,model:state.sessionInfo.model}},applySessionInfo=params=>{let entry=params.entry??void 0,defaults=params.defaults??lastSessionDefaults??void 0,previousDefaults=lastSessionDefaults,defaultsChanged=params.defaults?previousDefaults?.model!==params.defaults.model||previousDefaults?.modelProvider!==params.defaults.modelProvider||previousDefaults?.contextTokens!==params.defaults.contextTokens:!1;params.defaults&&(lastSessionDefaults=params.defaults);let entryUpdatedAt=entry?.updatedAt??null,currentUpdatedAt=state.sessionInfo.updatedAt??null,modelChanged=entry?.modelProvider!==void 0&&entry.modelProvider!==state.sessionInfo.modelProvider||entry?.model!==void 0&&entry.model!==state.sessionInfo.model;if(!params.force&&entryUpdatedAt!==null&¤tUpdatedAt!==null&&entryUpdatedAt<currentUpdatedAt&&!defaultsChanged&&!modelChanged)return;let next={...state.sessionInfo};entry?.thinkingLevel!==void 0&&(next.thinkingLevel=entry.thinkingLevel),entry?.verboseLevel!==void 0&&(next.verboseLevel=entry.verboseLevel),entry?.reasoningLevel!==void 0&&(next.reasoningLevel=entry.reasoningLevel),entry?.responseUsage!==void 0&&(next.responseUsage=entry.responseUsage),entry?.inputTokens!==void 0&&(next.inputTokens=entry.inputTokens),entry?.outputTokens!==void 0&&(next.outputTokens=entry.outputTokens),entry?.totalTokens!==void 0&&(next.totalTokens=entry.totalTokens),(entry?.contextTokens!==void 0||defaults?.contextTokens!==void 0)&&(next.contextTokens=entry?.contextTokens??defaults?.contextTokens??state.sessionInfo.contextTokens),entry?.displayName!==void 0&&(next.displayName=entry.displayName),entry?.updatedAt!==void 0&&(next.updatedAt=entry.updatedAt);let selection=resolveModelSelection(entry);selection.modelProvider!==void 0&&(next.modelProvider=selection.modelProvider),selection.model!==void 0&&(next.model=selection.model),state.sessionInfo=next,updateAutocompleteProvider(),updateFooter(),tui.requestRender()},runRefreshSessionInfo=async()=>{try{let listAgentId=(()=>{if(state.currentSessionKey===`global`||state.currentSessionKey===`unknown`)return;let parsed=parseAgentSessionKey(state.currentSessionKey);return parsed?.agentId?normalizeAgentId(parsed.agentId):state.currentAgentId})(),result=await client.listSessions({includeGlobal:!1,includeUnknown:!1,agentId:listAgentId}),normalizeMatchKey=key=>parseAgentSessionKey(key)?.rest??key,currentMatchKey=normalizeMatchKey(state.currentSessionKey),entry=result.sessions.find(row=>row.key===state.currentSessionKey?!0:normalizeMatchKey(row.key)===currentMatchKey);entry?.key&&entry.key!==state.currentSessionKey&&(updateAgentFromSessionKey(entry.key),state.currentSessionKey=entry.key,updateHeader()),applySessionInfo({entry,defaults:result.defaults})}catch(err){chatLog.addSystem(`sessions list failed: ${String(err)}`)}},refreshSessionInfo=async()=>{refreshSessionInfoPromise=refreshSessionInfoPromise.then(runRefreshSessionInfo,runRefreshSessionInfo),await refreshSessionInfoPromise},applySessionInfoFromPatch=result=>{if(!result?.entry)return;result.key&&result.key!==state.currentSessionKey&&(updateAgentFromSessionKey(result.key),state.currentSessionKey=result.key,updateHeader());let resolved=result.resolved;applySessionInfo({entry:resolved&&(resolved.modelProvider||resolved.model)?{...result.entry,modelProvider:resolved.modelProvider??result.entry.modelProvider,model:resolved.model??result.entry.model}:result.entry,force:!0})},loadHistory=async()=>{try{let record=await client.loadHistory({sessionKey:state.currentSessionKey,limit:opts.historyLimit??200});state.currentSessionId=typeof record.sessionId==`string`?record.sessionId:null,state.sessionInfo.thinkingLevel=record.thinkingLevel??state.sessionInfo.thinkingLevel,state.sessionInfo.verboseLevel=record.verboseLevel??state.sessionInfo.verboseLevel;let showTools=(state.sessionInfo.verboseLevel??`off`)!==`off`;chatLog.clearAll(),chatLog.addSystem(`session ${state.currentSessionKey}`);for(let entry of record.messages??[]){if(!entry||typeof entry!=`object`)continue;let message=entry;if(isCommandMessage(message)){let text=extractTextFromMessage(message);text&&chatLog.addSystem(text);continue}if(message.role===`user`){let text=extractTextFromMessage(message);text&&chatLog.addUser(text);continue}if(message.role===`assistant`){let text=extractTextFromMessage(message,{includeThinking:state.showThinking});text&&chatLog.finalizeAssistant(text);continue}if(message.role===`toolResult`){if(!showTools)continue;let toolCallId=asString(message.toolCallId,``),toolName=asString(message.toolName,`tool`);chatLog.startTool(toolCallId,toolName,{}).setResult({content:Array.isArray(message.content)?message.content:[],details:typeof message.details==`object`&&message.details?message.details:void 0},{isError:!!message.isError})}}state.historyLoaded=!0}catch(err){chatLog.addSystem(`history failed: ${String(err)}`)}await refreshSessionInfo(),tui.requestRender()};return{applyAgentsResult,refreshAgents,refreshSessionInfo,applySessionInfoFromPatch,loadHistory,setSession:async rawKey=>{let nextKey=resolveSessionKey(rawKey);updateAgentFromSessionKey(nextKey),state.currentSessionKey=nextKey,state.activeChatRunId=null,state.currentSessionId=null,state.historyLoaded=!1,clearLocalRunIds?.(),updateHeader(),updateFooter(),await loadHistory();try{let handoff=await loadLatestSessionHandoff(process.cwd());if(handoff){let lines=[`Resuming from session ${handoff.sessionId.slice(0,8)} (${handoff.timestamp.slice(0,10)})`,`Summary: ${handoff.summary}`];handoff.decisions.length>0&&lines.push(`Decisions: ${handoff.decisions.map(d=>`• ${d}`).join(` `)}`),handoff.nextSteps.length>0&&lines.push(`Next steps: ${handoff.nextSteps.map(s=>`• ${s}`).join(` `)}`),handoff.openQuestions.length>0&&lines.push(`Open questions: ${handoff.openQuestions.map(q=>`• ${q}`).join(` `)}`),chatLog.addSystem(lines.join(`
|
|
25
25
|
`))}}catch{}},abortActive:async()=>{if(!state.activeChatRunId){chatLog.addSystem(`no active run`),tui.requestRender();return}try{await client.abortChat({sessionKey:state.currentSessionKey,runId:state.activeChatRunId}),setActivityStatus(`aborted`)}catch(err){chatLog.addSystem(`abort failed: ${String(err)}`),setActivityStatus(`abort failed`)}tui.requestRender()}}}const defaultWaitingPhrases=[`flibbertigibbeting`,`kerfuffling`,`dillydallying`,`twiddling thumbs`,`noodling`,`bamboozling`,`moseying`,`hobnobbing`,`pondering`,`conjuring`];function pickWaitingPhrase(tick,phrases=defaultWaitingPhrases){return phrases[Math.floor(tick/10)%phrases.length]??phrases[0]??`waiting`}function shimmerText(theme,text,tick){let hi=ch=>theme.bold(theme.accentSoft(ch)),pos=tick%(text.length+6),start=Math.max(0,pos-6),end=Math.min(text.length-1,pos),out=``;for(let i=0;i<text.length;i++){let ch=text[i];out+=i>=start&&i<=end?hi(ch):theme.dim(ch)}return out}function buildWaitingStatusMessage(params){let phrase=pickWaitingPhrase(params.tick,params.phrases);return`${shimmerText(params.theme,`${phrase}…`,params.tick)} • ${params.elapsed} | ${params.connectionStatus}`}function createEditorSubmitHandler(params){return text=>{let raw=text,value=raw.trim();if(params.editor.setText(``),value){if(raw.startsWith(`!`)&&raw!==`!`){params.editor.addToHistory(raw),params.handleBangLine(raw);return}if(params.editor.addToHistory(value),value.startsWith(`/`)){params.handleCommand(value);return}params.sendMessage(value)}}}function shouldEnableWindowsGitBashPasteFallback(params){if((params?.platform??process.platform)!==`win32`)return!1;let env=params?.env??process.env,msystem=(env.MSYSTEM??``).toUpperCase(),shell=env.SHELL??``,termProgram=(env.TERM_PROGRAM??``).toLowerCase();return msystem.startsWith(`MINGW`)||msystem.startsWith(`MSYS`)||shell.toLowerCase().includes(`bash`)?!0:termProgram.includes(`mintty`)}function createSubmitBurstCoalescer(params){let windowMs=Math.max(1,params.burstWindowMs??50),now=params.now??(()=>Date.now()),setTimer=params.setTimer??setTimeout,clearTimer=params.clearTimer??clearTimeout,pending=null,pendingAt=0,flushTimer=null,clearFlushTimer=()=>{flushTimer&&=(clearTimer(flushTimer),null)},flushPending=()=>{if(pending===null)return;let value=pending;pending=null,pendingAt=0,clearFlushTimer(),params.submit(value)},scheduleFlush=()=>{clearFlushTimer(),flushTimer=setTimer(()=>{flushPending()},windowMs)};return value=>{if(!params.enabled){params.submit(value);return}if(value.includes(`
|
|
26
26
|
`)){flushPending(),params.submit(value);return}let ts=now();if(pending===null){pending=value,pendingAt=ts,scheduleFlush();return}if(ts-pendingAt<=windowMs){pending=`${pending}\n${value}`,pendingAt=ts,scheduleFlush();return}flushPending(),pending=value,pendingAt=ts,scheduleFlush()}}function resolveTuiSessionKey(params){let trimmed=(params.raw??``).trim();return trimmed?trimmed===`global`||trimmed===`unknown`||trimmed.startsWith(`agent:`)?trimmed:`agent:${params.currentAgentId}:${trimmed}`:params.sessionScope===`global`?`global`:buildAgentMainSessionKey({agentId:params.currentAgentId,mainKey:params.sessionMainKey})}async function runTui(opts){let config=loadConfig(),initialSessionInput=(opts.session??``).trim(),sessionScope=config.session?.scope??`per-sender`,sessionMainKey=normalizeMainKey(config.session?.mainKey),agentDefaultId=resolveDefaultAgentId(config),currentAgentId=agentDefaultId,agents=[],agentNames=new Map,currentSessionKey=``,initialSessionApplied=!1,currentSessionId=null,activeChatRunId=null,historyLoaded=!1,isConnected=!1,wasDisconnected=!1,toolsExpanded=!1,loggingEnabled=config.logging?.enabled!==!1,showThinking=!1,localRunIds=new Set,deliverDefault=opts.deliver??!1,autoMessage=opts.message?.trim(),autoMessageSent=!1,sessionInfo={},lastCtrlCAt=0,activityStatus=`idle`,connectionStatus=`connecting`,statusTimeout=null,statusTimer=null,statusStartedAt=null,lastActivityStatus=activityStatus,setupInProgress=!1,projectName=null,workspaceState=null;Promise.all([loadProjectContext(process.cwd()).catch(()=>null),loadWorkspaceState(process.cwd()).catch(()=>null)]).then(([ctx,ws])=>{projectName=ctx?.projectName??null,workspaceState=ws});let state={get agentDefaultId(){return agentDefaultId},set agentDefaultId(value){agentDefaultId=value},get sessionMainKey(){return sessionMainKey},set sessionMainKey(value){sessionMainKey=value},get sessionScope(){return sessionScope},set sessionScope(value){sessionScope=value},get agents(){return agents},set agents(value){agents=value},get currentAgentId(){return currentAgentId},set currentAgentId(value){currentAgentId=value},get currentSessionKey(){return currentSessionKey},set currentSessionKey(value){currentSessionKey=value},get currentSessionId(){return currentSessionId},set currentSessionId(value){currentSessionId=value},get activeChatRunId(){return activeChatRunId},set activeChatRunId(value){activeChatRunId=value},get historyLoaded(){return historyLoaded},set historyLoaded(value){historyLoaded=value},get sessionInfo(){return sessionInfo},set sessionInfo(value){sessionInfo=value},get initialSessionApplied(){return initialSessionApplied},set initialSessionApplied(value){initialSessionApplied=value},get isConnected(){return isConnected},set isConnected(value){isConnected=value},get autoMessageSent(){return autoMessageSent},set autoMessageSent(value){autoMessageSent=value},get toolsExpanded(){return toolsExpanded},set toolsExpanded(value){toolsExpanded=value},get showThinking(){return showThinking},set showThinking(value){showThinking=value},get connectionStatus(){return connectionStatus},set connectionStatus(value){connectionStatus=value},get activityStatus(){return activityStatus},set activityStatus(value){activityStatus=value},get statusTimeout(){return statusTimeout},set statusTimeout(value){statusTimeout=value},get lastCtrlCAt(){return lastCtrlCAt},set lastCtrlCAt(value){lastCtrlCAt=value},get loggingEnabled(){return loggingEnabled},set loggingEnabled(value){loggingEnabled=value}},noteLocalRunId=runId=>{if(runId&&(localRunIds.add(runId),localRunIds.size>200)){let[first]=localRunIds;first&&localRunIds.delete(first)}},forgetLocalRunId=runId=>{localRunIds.delete(runId)},isLocalRunId=runId=>localRunIds.has(runId),clearLocalRunIds=()=>{localRunIds.clear()},client=new GatewayChatClient({url:opts.url,token:opts.token,password:opts.password}),tui=new TUI(new ProcessTerminal),header=new Text(``,1,0),statusContainer=new Container,statusBodyContainer=new Container,statusTraceText=new Text(``,1,0),footer=new Text(``,1,0),chatLog=new ChatLog,editor=new CustomEditor(tui,editorTheme),root=new Container;root.addChild(header),root.addChild(chatLog),statusContainer.addChild(statusBodyContainer),statusContainer.addChild(statusTraceText),root.addChild(statusContainer),root.addChild(footer),root.addChild(editor);let updateAutocompleteProvider=()=>{editor.setAutocompleteProvider(new CombinedAutocompleteProvider(getSlashCommands({cfg:config,provider:sessionInfo.modelProvider,model:sessionInfo.model}),process.cwd()))};tui.addChild(root),tui.setFocus(editor);let formatSessionKey=key=>key===`global`||key===`unknown`?key:parseAgentSessionKey(key)?.rest??key,formatAgentLabel=id=>{let name=agentNames.get(id);return name?`${id} (${name})`:id},resolveSessionKey=raw=>resolveTuiSessionKey({raw,sessionScope,currentAgentId,sessionMainKey});currentSessionKey=resolveSessionKey(initialSessionInput);let updateHeader=()=>{let sessionLabel=formatSessionKey(currentSessionKey),agentLabel=formatAgentLabel(currentAgentId),projectPart=projectName?` · ${projectName}`:``,syncPart=workspaceState?.lastSyncedAt?` [synced ${formatTimeAgo(Date.now()-new Date(workspaceState.lastSyncedAt).getTime())}]`:``;header.setText(theme.header(`builderforce tui${projectPart}${syncPart} - ${client.connection.url} - agent ${agentLabel} - session ${sessionLabel}`))},busyStates=new Set([`sending`,`waiting`,`streaming`,`running`]),statusText=null,statusLoader=null,statusTraceLines=[],renderStatusTrace=()=>{statusTraceText.setText(theme.dim(statusTraceLines.join(`
|
|
27
|
-
`)))},reportAction=text=>{let message=text.trim();message&&(statusTraceLines.push(`• ${message}`),statusTraceLines.length>14&&statusTraceLines.splice(0,statusTraceLines.length-14),renderStatusTrace())},formatElapsed=startMs=>{let totalSeconds=Math.max(0,Math.floor((Date.now()-startMs)/1e3));return totalSeconds<60?`${totalSeconds}s`:`${Math.floor(totalSeconds/60)}m ${totalSeconds%60}s`},ensureStatusText=()=>{statusText||(statusBodyContainer.clear(),statusLoader?.stop(),statusLoader=null,statusText=new Text(``,1,0),statusBodyContainer.addChild(statusText))},ensureStatusLoader=()=>{statusLoader||(statusBodyContainer.clear(),statusText=null,statusLoader=new Loader(tui,spinner=>theme.accent(spinner),text=>theme.bold(theme.accentSoft(text)),``),statusBodyContainer.addChild(statusLoader))},waitingTick=0,waitingTimer=null,waitingPhrase=null,updateBusyStatusMessage=()=>{if(!statusLoader||!statusStartedAt)return;let elapsed=formatElapsed(statusStartedAt);if(activityStatus===`waiting`){waitingTick++,statusLoader.setMessage(buildWaitingStatusMessage({theme,tick:waitingTick,elapsed,connectionStatus,phrases:waitingPhrase?[waitingPhrase]:void 0}));return}statusLoader.setMessage(`${activityStatus} • ${elapsed} | ${connectionStatus}`)},startStatusTimer=()=>{statusTimer||=setInterval(()=>{busyStates.has(activityStatus)&&updateBusyStatusMessage()},1e3)},stopStatusTimer=()=>{statusTimer&&=(clearInterval(statusTimer),null)},startWaitingTimer=()=>{waitingTimer||=(waitingPhrase||=defaultWaitingPhrases[Math.floor(Math.random()*defaultWaitingPhrases.length)]??defaultWaitingPhrases[0]??`waiting`,waitingTick=0,setInterval(()=>{activityStatus===`waiting`&&updateBusyStatusMessage()},120))},stopWaitingTimer=()=>{waitingTimer&&(clearInterval(waitingTimer),waitingTimer=null,waitingPhrase=null)},renderStatus=()=>{if(busyStates.has(activityStatus))(!statusStartedAt||lastActivityStatus!==activityStatus)&&(statusStartedAt=Date.now()),ensureStatusLoader(),activityStatus===`waiting`?(stopStatusTimer(),startWaitingTimer()):(stopWaitingTimer(),startStatusTimer()),updateBusyStatusMessage();else{statusStartedAt=null,stopStatusTimer(),stopWaitingTimer(),statusLoader?.stop(),statusLoader=null,ensureStatusText();let text=activityStatus?`${connectionStatus} | ${activityStatus}`:connectionStatus;statusText?.setText(theme.dim(text))}lastActivityStatus=activityStatus},setConnectionStatus=(text,ttlMs)=>{let previous=connectionStatus;connectionStatus=text,text!==previous&&reportAction(`connection: ${text}`),renderStatus(),statusTimeout&&clearTimeout(statusTimeout),ttlMs&&ttlMs>0&&(statusTimeout=setTimeout(()=>{connectionStatus=isConnected?`connected`:`disconnected`,renderStatus()},ttlMs))},setActivityStatus=text=>{activityStatus=text,renderStatus()},updateFooter=()=>{let sessionKeyLabel=formatSessionKey(currentSessionKey),sessionLabel=sessionInfo.displayName?`${sessionKeyLabel} (${sessionInfo.displayName})`:sessionKeyLabel,agentLabel=formatAgentLabel(currentAgentId),modelLabel=sessionInfo.model?sessionInfo.modelProvider?`${sessionInfo.modelProvider}/${sessionInfo.model}`:sessionInfo.model:`unknown`,tokens=formatTokens(sessionInfo.totalTokens??null,sessionInfo.contextTokens??null),think=sessionInfo.thinkingLevel??`off`,verbose=sessionInfo.verboseLevel??`off`,reasoning=sessionInfo.reasoningLevel??`off`,reasoningLabel=reasoning===`on`?`reasoning`:reasoning===`stream`?`reasoning:stream`:null,localBrainLabel=config.localBrain?.enabled?`local brain`:null,footerParts=[`agent ${agentLabel}`,`session ${sessionLabel}`,modelLabel,localBrainLabel,think===`off`?null:`think ${think}`,verbose===`off`?null:`verbose ${verbose}`,reasoningLabel,tokens].filter(Boolean);footer.setText(theme.dim(footerParts.join(` | `)))},{openOverlay,closeOverlay}=createOverlayHandlers(tui,editor),{refreshAgents,refreshSessionInfo,applySessionInfoFromPatch,loadHistory,setSession,abortActive}=createSessionActions({client,chatLog,tui,opts,state,agentNames,initialSessionInput,initialSessionAgentId:(()=>{if(!initialSessionInput)return null;let parsed=parseAgentSessionKey(initialSessionInput);return parsed?normalizeAgentId(parsed.agentId):null})(),resolveSessionKey,updateHeader,updateFooter,updateAutocompleteProvider,setActivityStatus,clearLocalRunIds}),{handleChatEvent,handleAgentEvent}=createEventHandlers({chatLog,tui,state,setActivityStatus,reportAction,refreshSessionInfo,loadHistory,isLocalRunId,forgetLocalRunId,clearLocalRunIds}),{handleCommand,sendMessage,openModelSelector,openAgentSelector,openSessionSelector}=createCommandHandlers({client,chatLog,tui,opts,state,deliverDefault,openOverlay,closeOverlay,refreshSessionInfo,applySessionInfoFromPatch,updateFooter,loadHistory,setSession,refreshAgents,abortActive,setActivityStatus,reportAction,formatSessionKey,noteLocalRunId,forgetLocalRunId,onSetup:async()=>{if(setupInProgress){chatLog.addSystem(`Setup is already running.`),tui.requestRender();return}setupInProgress=!0;try{chatLog.addSystem(`Stopping TUI — setup wizard starting…`),tui.requestRender(),await new Promise(r=>setTimeout(r,80)),client.stop(),tui.stop(),await new Promise(r=>setTimeout(r,50));let{restoreTerminalState}=await import(`./restore-DsNJCsuC.js`),{runInteractiveOnboarding}=await import(`./onboard-interactive-
|
|
27
|
+
`)))},reportAction=text=>{let message=text.trim();message&&(statusTraceLines.push(`• ${message}`),statusTraceLines.length>14&&statusTraceLines.splice(0,statusTraceLines.length-14),renderStatusTrace())},formatElapsed=startMs=>{let totalSeconds=Math.max(0,Math.floor((Date.now()-startMs)/1e3));return totalSeconds<60?`${totalSeconds}s`:`${Math.floor(totalSeconds/60)}m ${totalSeconds%60}s`},ensureStatusText=()=>{statusText||(statusBodyContainer.clear(),statusLoader?.stop(),statusLoader=null,statusText=new Text(``,1,0),statusBodyContainer.addChild(statusText))},ensureStatusLoader=()=>{statusLoader||(statusBodyContainer.clear(),statusText=null,statusLoader=new Loader(tui,spinner=>theme.accent(spinner),text=>theme.bold(theme.accentSoft(text)),``),statusBodyContainer.addChild(statusLoader))},waitingTick=0,waitingTimer=null,waitingPhrase=null,updateBusyStatusMessage=()=>{if(!statusLoader||!statusStartedAt)return;let elapsed=formatElapsed(statusStartedAt);if(activityStatus===`waiting`){waitingTick++,statusLoader.setMessage(buildWaitingStatusMessage({theme,tick:waitingTick,elapsed,connectionStatus,phrases:waitingPhrase?[waitingPhrase]:void 0}));return}statusLoader.setMessage(`${activityStatus} • ${elapsed} | ${connectionStatus}`)},startStatusTimer=()=>{statusTimer||=setInterval(()=>{busyStates.has(activityStatus)&&updateBusyStatusMessage()},1e3)},stopStatusTimer=()=>{statusTimer&&=(clearInterval(statusTimer),null)},startWaitingTimer=()=>{waitingTimer||=(waitingPhrase||=defaultWaitingPhrases[Math.floor(Math.random()*defaultWaitingPhrases.length)]??defaultWaitingPhrases[0]??`waiting`,waitingTick=0,setInterval(()=>{activityStatus===`waiting`&&updateBusyStatusMessage()},120))},stopWaitingTimer=()=>{waitingTimer&&(clearInterval(waitingTimer),waitingTimer=null,waitingPhrase=null)},renderStatus=()=>{if(busyStates.has(activityStatus))(!statusStartedAt||lastActivityStatus!==activityStatus)&&(statusStartedAt=Date.now()),ensureStatusLoader(),activityStatus===`waiting`?(stopStatusTimer(),startWaitingTimer()):(stopWaitingTimer(),startStatusTimer()),updateBusyStatusMessage();else{statusStartedAt=null,stopStatusTimer(),stopWaitingTimer(),statusLoader?.stop(),statusLoader=null,ensureStatusText();let text=activityStatus?`${connectionStatus} | ${activityStatus}`:connectionStatus;statusText?.setText(theme.dim(text))}lastActivityStatus=activityStatus},setConnectionStatus=(text,ttlMs)=>{let previous=connectionStatus;connectionStatus=text,text!==previous&&reportAction(`connection: ${text}`),renderStatus(),statusTimeout&&clearTimeout(statusTimeout),ttlMs&&ttlMs>0&&(statusTimeout=setTimeout(()=>{connectionStatus=isConnected?`connected`:`disconnected`,renderStatus()},ttlMs))},setActivityStatus=text=>{activityStatus=text,renderStatus()},updateFooter=()=>{let sessionKeyLabel=formatSessionKey(currentSessionKey),sessionLabel=sessionInfo.displayName?`${sessionKeyLabel} (${sessionInfo.displayName})`:sessionKeyLabel,agentLabel=formatAgentLabel(currentAgentId),modelLabel=sessionInfo.model?sessionInfo.modelProvider?`${sessionInfo.modelProvider}/${sessionInfo.model}`:sessionInfo.model:`unknown`,tokens=formatTokens(sessionInfo.totalTokens??null,sessionInfo.contextTokens??null),think=sessionInfo.thinkingLevel??`off`,verbose=sessionInfo.verboseLevel??`off`,reasoning=sessionInfo.reasoningLevel??`off`,reasoningLabel=reasoning===`on`?`reasoning`:reasoning===`stream`?`reasoning:stream`:null,localBrainLabel=config.localBrain?.enabled?`local brain`:null,footerParts=[`agent ${agentLabel}`,`session ${sessionLabel}`,modelLabel,localBrainLabel,think===`off`?null:`think ${think}`,verbose===`off`?null:`verbose ${verbose}`,reasoningLabel,tokens].filter(Boolean);footer.setText(theme.dim(footerParts.join(` | `)))},{openOverlay,closeOverlay}=createOverlayHandlers(tui,editor),{refreshAgents,refreshSessionInfo,applySessionInfoFromPatch,loadHistory,setSession,abortActive}=createSessionActions({client,chatLog,tui,opts,state,agentNames,initialSessionInput,initialSessionAgentId:(()=>{if(!initialSessionInput)return null;let parsed=parseAgentSessionKey(initialSessionInput);return parsed?normalizeAgentId(parsed.agentId):null})(),resolveSessionKey,updateHeader,updateFooter,updateAutocompleteProvider,setActivityStatus,clearLocalRunIds}),{handleChatEvent,handleAgentEvent}=createEventHandlers({chatLog,tui,state,setActivityStatus,reportAction,refreshSessionInfo,loadHistory,isLocalRunId,forgetLocalRunId,clearLocalRunIds}),{handleCommand,sendMessage,openModelSelector,openAgentSelector,openSessionSelector}=createCommandHandlers({client,chatLog,tui,opts,state,deliverDefault,openOverlay,closeOverlay,refreshSessionInfo,applySessionInfoFromPatch,updateFooter,loadHistory,setSession,refreshAgents,abortActive,setActivityStatus,reportAction,formatSessionKey,noteLocalRunId,forgetLocalRunId,onSetup:async()=>{if(setupInProgress){chatLog.addSystem(`Setup is already running.`),tui.requestRender();return}setupInProgress=!0;try{chatLog.addSystem(`Stopping TUI — setup wizard starting…`),tui.requestRender(),await new Promise(r=>setTimeout(r,80)),client.stop(),tui.stop(),await new Promise(r=>setTimeout(r,50));let{restoreTerminalState}=await import(`./restore-DsNJCsuC.js`),{runInteractiveOnboarding}=await import(`./onboard-interactive-CoFFuSJT.js`),{startGatewayBackground}=await import(`./tui-setup-check-DJZCJokQ.js`);restoreTerminalState(`pre-setup-wizard`,{resumeStdinIfPaused:!0}),await new Promise(r=>setTimeout(r,150));try{await runInteractiveOnboarding({flow:`quickstart`})}catch(err){process.stderr.write(`Setup wizard failed: ${String(err)}\n`)}finally{restoreTerminalState(`post-setup-wizard`,{resumeStdinIfPaused:!0})}await startGatewayBackground(),setConnectionStatus(`restarting tui`),setActivityStatus(`idle`),updateHeader(),updateFooter(),tui.start(),tui.setFocus(editor),tui.requestRender(),client.start()}finally{setupInProgress=!1}},config}),{runLocalShellLine}=createLocalShellRunner({chatLog,tui,openOverlay,closeOverlay});updateAutocompleteProvider(),editor.onSubmit=createSubmitBurstCoalescer({submit:createEditorSubmitHandler({editor,handleCommand,sendMessage,handleBangLine:runLocalShellLine}),enabled:shouldEnableWindowsGitBashPasteFallback()}),editor.onEscape=()=>{abortActive()},editor.onCtrlC=()=>{let now=Date.now();if(editor.getText().trim().length>0){editor.setText(``),setActivityStatus(`cleared input`),tui.requestRender();return}now-lastCtrlCAt<1e3&&(client.stop(),tui.stop(),process.exit(0)),lastCtrlCAt=now,setActivityStatus(`press ctrl+c again to exit`),tui.requestRender()},editor.onCtrlD=()=>{client.stop(),tui.stop(),process.exit(0)},editor.onCtrlO=()=>{toolsExpanded=!toolsExpanded,chatLog.setToolsExpanded(toolsExpanded),setActivityStatus(toolsExpanded?`tools expanded`:`tools collapsed`),tui.requestRender()},editor.onCtrlL=()=>{openModelSelector()},editor.onCtrlG=()=>{openAgentSelector()},editor.onCtrlP=()=>{openSessionSelector()},editor.onCtrlT=()=>{showThinking=!showThinking,loadHistory()},client.onEvent=evt=>{evt.event===`chat`&&handleChatEvent(evt.payload),evt.event===`agent`&&handleAgentEvent(evt.payload)},client.onConnected=()=>{isConnected=!0;let reconnected=wasDisconnected;wasDisconnected=!1,setConnectionStatus(`connected`),(async()=>{await refreshAgents(),updateHeader(),await refreshSessionInfo(),await loadHistory(),setConnectionStatus(reconnected?`gateway reconnected`:`gateway connected`,4e3),tui.requestRender(),!autoMessageSent&&autoMessage&&(autoMessageSent=!0,await sendMessage(autoMessage)),updateFooter(),tui.requestRender()})()},client.onDisconnected=reason=>{let isFirstFailure=!wasDisconnected&&!isConnected;isConnected=!1,wasDisconnected=!0,historyLoaded=!1,setConnectionStatus(`gateway disconnected: ${reason?.trim()?reason.trim():`closed`}`,5e3),setActivityStatus(`idle`),isFirstFailure&&chatLog.addSystem(`Gateway not reachable. Type /setup or /onboard to run the setup wizard, or /gateway restart to restart the gateway.`),updateFooter(),tui.requestRender()},client.onGap=info=>{setConnectionStatus(`event gap: expected ${info.expected}, got ${info.received}`,5e3),tui.requestRender()},updateHeader(),setConnectionStatus(`connecting`),updateFooter(),tui.start(),client.start(),await new Promise(resolve=>{let finish=()=>resolve();process.once(`exit`,finish),process.once(`SIGINT`,finish),process.once(`SIGTERM`,finish)})}export{runTui as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./embedded-helpers-CEsr3aQ0.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./model-catalog-C6UrZ0uG.js";import"./sandbox-BZibn6PX.js";import"./chrome-a3X9_-nf.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DJZT7Upf.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-BzfLvF8W.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-CdanN_ZI.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./project-context-store-wcq7lXuI.js";import"./client-xfoidwPI.js";import"./call-BbRf8gFM.js";import"./builderforcellm-syscheck-DrFJ638L.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import"./usage-format-DGf8ZWPH.js";import"./project-context-CJj0Inz-.js";import{t as parseTimeoutMs}from"./parse-timeout-DgbvuHbz.js";import"./transformers-stream-D7nRu4Qu.js";import"./builderforce-directory-sync-DAH62b3b.js";import"./shared-BPN3qd7G.js";import"./model-picker-BUePD7Zg.js";import"./auth-choice.apply.transformers-CIn3fs7K.js";import{t as runTui}from"./tui-
|
|
1
|
+
import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./embedded-helpers-CEsr3aQ0.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./model-catalog-C6UrZ0uG.js";import"./sandbox-BZibn6PX.js";import"./chrome-a3X9_-nf.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DJZT7Upf.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-BzfLvF8W.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-CdanN_ZI.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./project-context-store-wcq7lXuI.js";import"./client-xfoidwPI.js";import"./call-BbRf8gFM.js";import"./builderforcellm-syscheck-DrFJ638L.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import"./usage-format-DGf8ZWPH.js";import"./project-context-CJj0Inz-.js";import{t as parseTimeoutMs}from"./parse-timeout-DgbvuHbz.js";import"./transformers-stream-D7nRu4Qu.js";import"./builderforce-directory-sync-DAH62b3b.js";import"./shared-BPN3qd7G.js";import"./model-picker-BUePD7Zg.js";import"./auth-choice.apply.transformers-CIn3fs7K.js";import{t as runTui}from"./tui-D2sTsa4p.js";import"./tui-stream-assembler-ign_cPkv.js";function registerTuiCli(program){program.command(`tui`).description(`Open a terminal UI connected to the Gateway`).option(`--url <url>`,`Gateway WebSocket URL (defaults to gateway.remote.url when configured)`).option(`--token <token>`,`Gateway token (if required)`).option(`--password <password>`,`Gateway password (if required)`).option(`--session <key>`,`Session key (default: "main", or "global" when scope is global)`).option(`--deliver`,`Deliver assistant replies`,!1).option(`--thinking <level>`,`Thinking level override`).option(`--message <text>`,`Send an initial message after connecting`).option(`--timeout-ms <ms>`,`Agent timeout in ms (defaults to agents.defaults.timeoutSeconds)`).option(`--history-limit <n>`,`History entries to load`,`200`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/tui`,`docs.builderforce.ai/cli/tui`)}\n`).action(async opts=>{try{let{checkIfSetupNeeded}=await import(`./tui-setup-check-BABAyl-e.js`),setupCheck=process.env.BUILDERFORCE_AGENTS_SKIP_SETUP_CHECK===`1`?{needed:!1}:await checkIfSetupNeeded();if(setupCheck.needed){defaultRuntime.log(theme.muted(setupCheck.hint));let{runInteractiveOnboarding}=await import(`./onboard-interactive-CnXgQrpI.js`);await runInteractiveOnboarding({flow:`quickstart`});let{startGatewayBackground}=await import(`./tui-setup-check-BABAyl-e.js`);await startGatewayBackground()||defaultRuntime.log(theme.muted(`Gateway not reachable yet — TUI will retry when it connects.`))}let timeoutMs=parseTimeoutMs(opts.timeoutMs);opts.timeoutMs!==void 0&&timeoutMs===void 0&&defaultRuntime.error(`warning: invalid --timeout-ms "${String(opts.timeoutMs)}"; ignoring`);let historyLimit=Number.parseInt(String(opts.historyLimit??`200`),10);if(process.env.BUILDERFORCE_AGENTS_INK_TUI===`1`){let{runInkSession}=await import(`./ink-session-CyAqXDla.js`);await runInkSession({sessionKey:opts.session?.trim()||`main`,connection:{url:opts.url,token:opts.token,password:opts.password},showThinking:typeof opts.thinking==`string`&&opts.thinking!==`off`});return}await runTui({url:opts.url,token:opts.token,password:opts.password,session:opts.session,deliver:!!opts.deliver,thinking:opts.thinking,message:opts.message,timeoutMs,historyLimit:Number.isNaN(historyLimit)?void 0:historyLimit})}catch(err){defaultRuntime.error(String(err)),defaultRuntime.exit(1)}})}export{registerTuiCli};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-C1VbcUOm.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./model-discovery-C9Xm95uL.js";import"./model-catalog-CiiFJX77.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./client-CGgp3zkQ.js";import"./call-DmAU4cRX.js";import"./message-channel-z5YRpR2d.js";import"./sessions-Bl1wwotX.js";import"./project-context-store-CIUcwUP_.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./accounts-Cx82nj4E.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-DK8_apW0.js";import"./sandbox-z9t_PRf9.js";import"./chrome-BnEbJV3D.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-owOmmyUM.js";import"./routes-lclJHOYY.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./tool-display-Cs4hDP1f.js";import"./builderforcellm-syscheck-CprBhARf.js";import"./usage-format-5sp5AMSu.js";import"./project-context-D3Mx4maV.js";import{t as parseTimeoutMs}from"./parse-timeout-BvepsazJ.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import"./transformers-stream-Buj40qHl.js";import"./builderforce-directory-sync-DQ6u60yX.js";import"./shared-xj-xaKFi.js";import"./model-picker-swoSwauV.js";import"./auth-choice.apply.transformers-1plI0MUg.js";import{t as runTui}from"./tui-
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-C1VbcUOm.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./model-discovery-C9Xm95uL.js";import"./model-catalog-CiiFJX77.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./client-CGgp3zkQ.js";import"./call-DmAU4cRX.js";import"./message-channel-z5YRpR2d.js";import"./sessions-Bl1wwotX.js";import"./project-context-store-CIUcwUP_.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./accounts-Cx82nj4E.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-DK8_apW0.js";import"./sandbox-z9t_PRf9.js";import"./chrome-BnEbJV3D.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-owOmmyUM.js";import"./routes-lclJHOYY.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./tool-display-Cs4hDP1f.js";import"./builderforcellm-syscheck-CprBhARf.js";import"./usage-format-5sp5AMSu.js";import"./project-context-D3Mx4maV.js";import{t as parseTimeoutMs}from"./parse-timeout-BvepsazJ.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import"./transformers-stream-Buj40qHl.js";import"./builderforce-directory-sync-DQ6u60yX.js";import"./shared-xj-xaKFi.js";import"./model-picker-swoSwauV.js";import"./auth-choice.apply.transformers-1plI0MUg.js";import{t as runTui}from"./tui-DY2oYbxk.js";import"./tui-stream-assembler-q9GANTDr.js";function registerTuiCli(program){program.command(`tui`).description(`Open a terminal UI connected to the Gateway`).option(`--url <url>`,`Gateway WebSocket URL (defaults to gateway.remote.url when configured)`).option(`--token <token>`,`Gateway token (if required)`).option(`--password <password>`,`Gateway password (if required)`).option(`--session <key>`,`Session key (default: "main", or "global" when scope is global)`).option(`--deliver`,`Deliver assistant replies`,!1).option(`--thinking <level>`,`Thinking level override`).option(`--message <text>`,`Send an initial message after connecting`).option(`--timeout-ms <ms>`,`Agent timeout in ms (defaults to agents.defaults.timeoutSeconds)`).option(`--history-limit <n>`,`History entries to load`,`200`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/tui`,`docs.builderforce.ai/cli/tui`)}\n`).action(async opts=>{try{let{checkIfSetupNeeded}=await import(`./tui-setup-check-DJZCJokQ.js`),setupCheck=process.env.BUILDERFORCE_AGENTS_SKIP_SETUP_CHECK===`1`?{needed:!1}:await checkIfSetupNeeded();if(setupCheck.needed){defaultRuntime.log(theme.muted(setupCheck.hint));let{runInteractiveOnboarding}=await import(`./onboard-interactive-CoFFuSJT.js`);await runInteractiveOnboarding({flow:`quickstart`});let{startGatewayBackground}=await import(`./tui-setup-check-DJZCJokQ.js`);await startGatewayBackground()||defaultRuntime.log(theme.muted(`Gateway not reachable yet — TUI will retry when it connects.`))}let timeoutMs=parseTimeoutMs(opts.timeoutMs);opts.timeoutMs!==void 0&&timeoutMs===void 0&&defaultRuntime.error(`warning: invalid --timeout-ms "${String(opts.timeoutMs)}"; ignoring`);let historyLimit=Number.parseInt(String(opts.historyLimit??`200`),10);if(process.env.BUILDERFORCE_AGENTS_INK_TUI===`1`){let{runInkSession}=await import(`./ink-session-BitZ1wcY.js`);await runInkSession({sessionKey:opts.session?.trim()||`main`,connection:{url:opts.url,token:opts.token,password:opts.password},showThinking:typeof opts.thinking==`string`&&opts.thinking!==`off`});return}await runTui({url:opts.url,token:opts.token,password:opts.password,session:opts.session,deliver:!!opts.deliver,thinking:opts.thinking,message:opts.message,timeoutMs,historyLimit:Number.isNaN(historyLimit)?void 0:historyLimit})}catch(err){defaultRuntime.error(String(err)),defaultRuntime.exit(1)}})}export{registerTuiCli};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{h as pathExists,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-C1VbcUOm.js";import{n as replaceCliName,r as resolveCliName,t as formatCliCommand}from"./command-format-DTMaGKs7.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import{a as isCorePackageName,o as stripPackagePrefix,r as CORE_PACKAGE_NAME,t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{a as readConfigFileSnapshot,c as writeConfigFile}from"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./model-discovery-C9Xm95uL.js";import"./model-catalog-CiiFJX77.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./skills-status-CGlKz1D1.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-DmAU4cRX.js";import"./message-channel-z5YRpR2d.js";import{xr as trimLogTail}from"./subagent-registry-CyGxu3kP.js";import"./sessions-Bl1wwotX.js";import"./project-context-store-CIUcwUP_.js";import"./tokens-CFKkpUIu.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-BvroeIQ6.js";import"./send-CceNWtYE.js";import"./with-timeout-T07SJo4N.js";import"./deliver-BuZu68tp.js";import"./accounts-Cx82nj4E.js";import"./send-ByCVQQVz.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-DK8_apW0.js";import"./sandbox-z9t_PRf9.js";import"./chrome-BnEbJV3D.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-owOmmyUM.js";import"./routes-lclJHOYY.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./workspace-waBqRxiy.js";import"./reply-prefix-Cg7AqaK0.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName}from"./constants-D2th5NXV.js";import"./sqlite-CIGM1WKg.js";import"./memory-cli-ivAs7q7v.js";import"./manager-CRba8roB.js";import"./gemini-auth-CkD5jCPh.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import"./runner-DwWmciCt.js";import"./tool-display-Cs4hDP1f.js";import"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-CprBhARf.js";import"./session-utils-GMvum00v.js";import"./coding-tools.policy-NEPm7Mz1.js";import"./pairing-store-QDb6lhIU.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-Bn4ZrnU7.js";import"./send-B_1BtyfA.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-D3Mx4maV.js";import"./control-service-CJuuqNOE.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-UFtylOiq.js";import"./resolve-route-DEIW5uKy.js";import"./channel-activity-DX36RadH.js";import"./tables-CojSfTth.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import{t as formatHelpExamples}from"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DbkT_5BV.js";import"./onboard-helpers-CckrS8_K.js";import{n as stylePromptMessage}from"./prompt-style-BMWmaqSC.js";import"./pairing-labels-3j_iRYOO.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-CV4nDcCk.js";import"./transformers-stream-Buj40qHl.js";import{n as inheritOptionFromParent}from"./command-options-DbMbMxM2.js";import"./catalog-li4bSIE2.js";import"./note-DgDXuE0F.js";import"./helpers-DPPVplyk.js";import"./plugin-auto-enable-BV9K9Vhr.js";import"./install-safe-path-ObPl6zIf.js";import"./npm-registry-spec-BV1VDmuN.js";import"./skill-scanner-DEmbPsRh.js";import"./installs-CWd54ARy.js";import"./channels-status-issues-NLYb8w9i.js";import"./register.subclis-Cr9DoYcv.js";import"./command-registry-COUcUWby.js";import"./program-context-Wpc-6CdI.js";import{n as installCompletion}from"./completion-cli-DpFvU4Qn.js";import"./daemon-runtime-B4UjqdyJ.js";import{r as parseSemver}from"./runtime-guard-Bi8k55v9.js";import"./systemd-DdVd5Yet.js";import{t as resolveGatewayService}from"./service-EKJG69M3.js";import"./lifecycle-core-BpMvDXy1.js";import"./diagnostics-DamNPi4e.js";import{o as runDaemonRestart}from"./daemon-cli-DyVsMf8p.js";import{t as renderTable}from"./table-BFCCZDsp.js";import"./health-DVo8a9yg.js";import"./control-ui-assets-BxgWcomx.js";import{_ as resolveUpdateChannelDisplay,c as DEFAULT_GIT_CHANNEL,d as channelToNpmTag,f as formatUpdateChannelLabel,g as resolveEffectiveUpdateChannel,h as normalizeUpdateChannel,l as DEFAULT_PACKAGE_CHANNEL,n as compareSemverStrings,o as resolveNpmChannelTag,r as fetchNpmTagVersion,t as checkUpdateStatus}from"./update-check-B0YqSZJr.js";import"./dm-policy-shared-CRZpjRv0.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,t as formatUpdateAvailableHint}from"./status.update-KYyRSDZY.js";import{a as detectGlobalInstallManagerForRoot,c as readPackageName,i as detectGlobalInstallManagerByPresence,l as readPackageVersion,n as runGatewayUpdate,o as globalInstallArgs,r as cleanupGlobalRenameDirs,s as resolveGlobalPackageRoot}from"./session-dirs-OxQuIvJW.js";import"./logging-ayt7F7vy.js";import{n as updateNpmInstalledPlugins,t as syncPluginsForUpdateChannel}from"./update-D6U-V8Au.js";import"./systemd-linger-CPKngdUf.js";import"./health-format-D4MaIjaG.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-Dd5swW2b.js";import{r as ensureCompletionCacheExists,t as checkShellCompletionStatus}from"./doctor-completion-BSotFS6p.js";import{spawn,spawnSync}from"node:child_process";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";import{confirm,isCancel,spinner}from"@clack/prompts";function parseTimeoutMsOrExit(timeout){let timeoutMs=timeout?Number.parseInt(timeout,10)*1e3:void 0;return timeoutMs!==void 0&&(Number.isNaN(timeoutMs)||timeoutMs<=0)?(defaultRuntime.error(`--timeout must be a positive integer (seconds)`),defaultRuntime.exit(1),null):timeoutMs}const BUILDERFORCE_AGENTS_REPO_URL=`https://github.com/SeanHogg/Builderforce.ai.git`,MAX_LOG_CHARS=8e3,DEFAULT_PACKAGE_NAME=CORE_PACKAGE_NAME;function normalizeTag(value){if(!value)return null;let trimmed=value.trim();return trimmed?stripPackagePrefix(trimmed):null}function normalizeVersionTag(tag){let trimmed=tag.trim();if(!trimmed)return null;let cleaned=trimmed.startsWith(`v`)?trimmed.slice(1):trimmed;return parseSemver(cleaned)?cleaned:null}async function resolveTargetVersion(tag,timeoutMs){return normalizeVersionTag(tag)||((await fetchNpmTagVersion({tag,timeoutMs})).version??null)}async function isGitCheckout(root){try{return await fs.stat(path.join(root,`.git`)),!0}catch{return!1}}async function isCorePackage(root){return isCorePackageName(await readPackageName(root))}async function isEmptyDir(targetPath){try{return(await fs.readdir(targetPath)).length===0}catch{return!1}}function resolveGitInstallDir(){let override=process.env.BUILDERFORCE_AGENTS_GIT_DIR?.trim();return override?path.resolve(override):resolveDefaultGitDir()}function resolveDefaultGitDir(){return resolveStateDir(process.env,os.homedir)}function resolveNodeRunner(){let base=path.basename(process.execPath).toLowerCase();return base===`node`||base===`node.exe`?process.execPath:`node`}async function resolveUpdateRoot(){return await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()})??process.cwd()}async function runUpdateStep(params){let command=params.argv.join(` `);params.progress?.onStepStart?.({name:params.name,command,index:0,total:0});let started=Date.now(),res=await runCommandWithTimeout(params.argv,{cwd:params.cwd,timeoutMs:params.timeoutMs}),durationMs=Date.now()-started,stderrTail=trimLogTail(res.stderr,MAX_LOG_CHARS);return params.progress?.onStepComplete?.({name:params.name,command,index:0,total:0,durationMs,exitCode:res.code,stderrTail}),{name:params.name,command,cwd:params.cwd??process.cwd(),durationMs,exitCode:res.code,stdoutTail:trimLogTail(res.stdout,MAX_LOG_CHARS),stderrTail}}async function ensureGitCheckout(params){if(!await pathExists(params.dir))return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],timeoutMs:params.timeoutMs,progress:params.progress});if(!await isGitCheckout(params.dir)){if(!await isEmptyDir(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR points at a non-git directory: ${params.dir}. Set BUILDERFORCE_AGENTS_GIT_DIR to an empty folder or a builderforce checkout.`);return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],cwd:params.dir,timeoutMs:params.timeoutMs,progress:params.progress})}if(!await isCorePackage(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR does not look like a core checkout: ${params.dir}.`);return null}async function resolveGlobalManager(params){let runCommand=async(argv,options)=>{let res=await runCommandWithTimeout(argv,options);return{stdout:res.stdout,stderr:res.stderr,code:res.code}};if(params.installKind===`package`){let detected=await detectGlobalInstallManagerForRoot(runCommand,params.root,params.timeoutMs);if(detected)return detected}return await detectGlobalInstallManagerByPresence(runCommand,params.timeoutMs)??`npm`}async function tryWriteCompletionCache(root,jsonMode){let binPath=path.join(root,`builderforce.mjs`);if(!await pathExists(binPath))return;let result=spawnSync(resolveNodeRunner(),[binPath,`completion`,`--write-state`],{cwd:root,env:process.env,encoding:`utf-8`});if(result.error){jsonMode||defaultRuntime.log(theme.warn(`Completion cache update failed: ${String(result.error)}`));return}if(result.status!==0&&!jsonMode){let stderr=(result.stderr??``).toString().trim(),detail=stderr?` (${stderr})`:``;defaultRuntime.log(theme.warn(`Completion cache update failed${detail}.`))}}function formatGitStatusLine(params){let shortSha=params.sha?params.sha.slice(0,8):null,branch=params.branch&¶ms.branch!==`HEAD`?params.branch:null,tag=params.tag;return[branch??(tag?`detached`:`git`),tag?`tag ${tag}`:null,shortSha?`@ ${shortSha}`:null].filter(Boolean).join(` · `)}async function updateStatusCommand(opts){let timeoutMs=parseTimeoutMsOrExit(opts.timeout);if(timeoutMs===null)return;let root=await resolveUpdateRoot(),configSnapshot=await readConfigFileSnapshot(),configChannel=configSnapshot.valid?normalizeUpdateChannel(configSnapshot.config.update?.channel):null,update=await checkUpdateStatus({root,timeoutMs:timeoutMs??3500,fetchGit:!0,includeRegistry:!0}),channelInfo=resolveUpdateChannelDisplay({configChannel,installKind:update.installKind,gitTag:update.git?.tag??null,gitBranch:update.git?.branch??null}),channelLabel=channelInfo.label,gitLabel=update.installKind===`git`?formatGitStatusLine({branch:update.git?.branch??null,tag:update.git?.tag??null,sha:update.git?.sha??null}):null,updateAvailability=resolveUpdateAvailability(update),updateLine=formatUpdateOneLiner(update).replace(/^Update:\s*/i,``);if(opts.json){defaultRuntime.log(JSON.stringify({update,channel:{value:channelInfo.channel,source:channelInfo.source,label:channelLabel,config:configChannel},availability:updateAvailability},null,2));return}let tableWidth=Math.max(60,(process.stdout.columns??120)-1),rows=[{Item:`Install`,Value:update.installKind===`git`?`git (${update.root??`unknown`})`:update.installKind===`package`?update.packageManager:`unknown`},{Item:`Channel`,Value:channelLabel},...gitLabel?[{Item:`Git`,Value:gitLabel}]:[],{Item:`Update`,Value:updateAvailability.available?theme.warn(`available · ${updateLine}`):updateLine}];defaultRuntime.log(theme.heading(`BuilderForceAgents update status`)),defaultRuntime.log(``),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Item`,header:`Item`,minWidth:10},{key:`Value`,header:`Value`,flex:!0,minWidth:24}],rows}).trimEnd()),defaultRuntime.log(``);let updateHint=formatUpdateAvailableHint(update);updateHint&&defaultRuntime.log(theme.warn(updateHint))}const STEP_LABELS={"clean check":`Working directory is clean`,"upstream check":`Upstream branch exists`,"git fetch":`Fetching latest changes`,"git rebase":`Rebasing onto target commit`,"git rev-parse @{upstream}":`Resolving upstream commit`,"git rev-list":`Enumerating candidate commits`,"git clone":`Cloning git checkout`,"preflight worktree":`Preparing preflight worktree`,"preflight cleanup":`Cleaning preflight worktree`,"deps install":`Installing dependencies`,build:`Building`,"ui:build":`Building UI assets`,"ui:build (post-doctor repair)":`Restoring missing UI assets`,"ui assets verify":`Validating UI assets`,"builderforce doctor entry":`Checking doctor entrypoint`,"builderforce doctor":`Running doctor checks`,"git rev-parse HEAD (after)":`Verifying update`,"global update":`Updating via package manager`,"global install":`Installing global package`};function getStepLabel(step){return STEP_LABELS[step.name]??step.name}function createUpdateProgress(enabled){if(!enabled)return{progress:{},stop:()=>{}};let currentSpinner=null;return{progress:{onStepStart:step=>{currentSpinner=spinner(),currentSpinner.start(theme.accent(getStepLabel(step)))},onStepComplete:step=>{if(!currentSpinner)return;let label=getStepLabel(step),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`),icon=step.exitCode===0?theme.success(`✓`):theme.error(`✗`);if(currentSpinner.stop(`${icon} ${label} ${duration}`),currentSpinner=null,step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
1
|
+
import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{h as pathExists,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-C1VbcUOm.js";import{n as replaceCliName,r as resolveCliName,t as formatCliCommand}from"./command-format-DTMaGKs7.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import{a as isCorePackageName,o as stripPackagePrefix,r as CORE_PACKAGE_NAME,t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{a as readConfigFileSnapshot,c as writeConfigFile}from"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./model-discovery-C9Xm95uL.js";import"./model-catalog-CiiFJX77.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./skills-status-CGlKz1D1.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-DmAU4cRX.js";import"./message-channel-z5YRpR2d.js";import{xr as trimLogTail}from"./subagent-registry-CyGxu3kP.js";import"./sessions-Bl1wwotX.js";import"./project-context-store-CIUcwUP_.js";import"./tokens-CFKkpUIu.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-BvroeIQ6.js";import"./send-CceNWtYE.js";import"./with-timeout-T07SJo4N.js";import"./deliver-BuZu68tp.js";import"./accounts-Cx82nj4E.js";import"./send-ByCVQQVz.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-DK8_apW0.js";import"./sandbox-z9t_PRf9.js";import"./chrome-BnEbJV3D.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-owOmmyUM.js";import"./routes-lclJHOYY.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./workspace-waBqRxiy.js";import"./reply-prefix-Cg7AqaK0.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName}from"./constants-D2th5NXV.js";import"./sqlite-CIGM1WKg.js";import"./memory-cli-ivAs7q7v.js";import"./manager-CRba8roB.js";import"./gemini-auth-CkD5jCPh.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import"./runner-DwWmciCt.js";import"./tool-display-Cs4hDP1f.js";import"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-CprBhARf.js";import"./session-utils-GMvum00v.js";import"./coding-tools.policy-NEPm7Mz1.js";import"./pairing-store-QDb6lhIU.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-Bn4ZrnU7.js";import"./send-B_1BtyfA.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-D3Mx4maV.js";import"./control-service-CJuuqNOE.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-UFtylOiq.js";import"./resolve-route-DEIW5uKy.js";import"./channel-activity-DX36RadH.js";import"./tables-CojSfTth.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import{t as formatHelpExamples}from"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DbkT_5BV.js";import"./onboard-helpers-CckrS8_K.js";import{n as stylePromptMessage}from"./prompt-style-BMWmaqSC.js";import"./pairing-labels-3j_iRYOO.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-CV4nDcCk.js";import"./transformers-stream-Buj40qHl.js";import{n as inheritOptionFromParent}from"./command-options-DbMbMxM2.js";import"./catalog-li4bSIE2.js";import"./note-DgDXuE0F.js";import"./helpers-DPPVplyk.js";import"./plugin-auto-enable-BV9K9Vhr.js";import"./install-safe-path-ObPl6zIf.js";import"./npm-registry-spec-BV1VDmuN.js";import"./skill-scanner-DEmbPsRh.js";import"./installs-CWd54ARy.js";import"./channels-status-issues-NLYb8w9i.js";import"./register.subclis-EScCVgbV.js";import"./command-registry-CDcuHGpx.js";import"./program-context-Wpc-6CdI.js";import{n as installCompletion}from"./completion-cli-Do4vXo1k.js";import"./daemon-runtime-B4UjqdyJ.js";import{r as parseSemver}from"./runtime-guard-Bi8k55v9.js";import"./systemd-DdVd5Yet.js";import{t as resolveGatewayService}from"./service-EKJG69M3.js";import"./lifecycle-core-BpMvDXy1.js";import"./diagnostics-DamNPi4e.js";import{o as runDaemonRestart}from"./daemon-cli-DyVsMf8p.js";import{t as renderTable}from"./table-BFCCZDsp.js";import"./health-DVo8a9yg.js";import"./control-ui-assets-BxgWcomx.js";import{_ as resolveUpdateChannelDisplay,c as DEFAULT_GIT_CHANNEL,d as channelToNpmTag,f as formatUpdateChannelLabel,g as resolveEffectiveUpdateChannel,h as normalizeUpdateChannel,l as DEFAULT_PACKAGE_CHANNEL,n as compareSemverStrings,o as resolveNpmChannelTag,r as fetchNpmTagVersion,t as checkUpdateStatus}from"./update-check-B0YqSZJr.js";import"./dm-policy-shared-CRZpjRv0.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,t as formatUpdateAvailableHint}from"./status.update-KYyRSDZY.js";import{a as detectGlobalInstallManagerForRoot,c as readPackageName,i as detectGlobalInstallManagerByPresence,l as readPackageVersion,n as runGatewayUpdate,o as globalInstallArgs,r as cleanupGlobalRenameDirs,s as resolveGlobalPackageRoot}from"./session-dirs-OxQuIvJW.js";import"./logging-ayt7F7vy.js";import{n as updateNpmInstalledPlugins,t as syncPluginsForUpdateChannel}from"./update-D6U-V8Au.js";import"./systemd-linger-CPKngdUf.js";import"./health-format-D4MaIjaG.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-Bu7WPMzB.js";import{r as ensureCompletionCacheExists,t as checkShellCompletionStatus}from"./doctor-completion-BjBTLcoC.js";import{spawn,spawnSync}from"node:child_process";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";import{confirm,isCancel,spinner}from"@clack/prompts";function parseTimeoutMsOrExit(timeout){let timeoutMs=timeout?Number.parseInt(timeout,10)*1e3:void 0;return timeoutMs!==void 0&&(Number.isNaN(timeoutMs)||timeoutMs<=0)?(defaultRuntime.error(`--timeout must be a positive integer (seconds)`),defaultRuntime.exit(1),null):timeoutMs}const BUILDERFORCE_AGENTS_REPO_URL=`https://github.com/SeanHogg/Builderforce.ai.git`,MAX_LOG_CHARS=8e3,DEFAULT_PACKAGE_NAME=CORE_PACKAGE_NAME;function normalizeTag(value){if(!value)return null;let trimmed=value.trim();return trimmed?stripPackagePrefix(trimmed):null}function normalizeVersionTag(tag){let trimmed=tag.trim();if(!trimmed)return null;let cleaned=trimmed.startsWith(`v`)?trimmed.slice(1):trimmed;return parseSemver(cleaned)?cleaned:null}async function resolveTargetVersion(tag,timeoutMs){return normalizeVersionTag(tag)||((await fetchNpmTagVersion({tag,timeoutMs})).version??null)}async function isGitCheckout(root){try{return await fs.stat(path.join(root,`.git`)),!0}catch{return!1}}async function isCorePackage(root){return isCorePackageName(await readPackageName(root))}async function isEmptyDir(targetPath){try{return(await fs.readdir(targetPath)).length===0}catch{return!1}}function resolveGitInstallDir(){let override=process.env.BUILDERFORCE_AGENTS_GIT_DIR?.trim();return override?path.resolve(override):resolveDefaultGitDir()}function resolveDefaultGitDir(){return resolveStateDir(process.env,os.homedir)}function resolveNodeRunner(){let base=path.basename(process.execPath).toLowerCase();return base===`node`||base===`node.exe`?process.execPath:`node`}async function resolveUpdateRoot(){return await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()})??process.cwd()}async function runUpdateStep(params){let command=params.argv.join(` `);params.progress?.onStepStart?.({name:params.name,command,index:0,total:0});let started=Date.now(),res=await runCommandWithTimeout(params.argv,{cwd:params.cwd,timeoutMs:params.timeoutMs}),durationMs=Date.now()-started,stderrTail=trimLogTail(res.stderr,MAX_LOG_CHARS);return params.progress?.onStepComplete?.({name:params.name,command,index:0,total:0,durationMs,exitCode:res.code,stderrTail}),{name:params.name,command,cwd:params.cwd??process.cwd(),durationMs,exitCode:res.code,stdoutTail:trimLogTail(res.stdout,MAX_LOG_CHARS),stderrTail}}async function ensureGitCheckout(params){if(!await pathExists(params.dir))return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],timeoutMs:params.timeoutMs,progress:params.progress});if(!await isGitCheckout(params.dir)){if(!await isEmptyDir(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR points at a non-git directory: ${params.dir}. Set BUILDERFORCE_AGENTS_GIT_DIR to an empty folder or a builderforce checkout.`);return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],cwd:params.dir,timeoutMs:params.timeoutMs,progress:params.progress})}if(!await isCorePackage(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR does not look like a core checkout: ${params.dir}.`);return null}async function resolveGlobalManager(params){let runCommand=async(argv,options)=>{let res=await runCommandWithTimeout(argv,options);return{stdout:res.stdout,stderr:res.stderr,code:res.code}};if(params.installKind===`package`){let detected=await detectGlobalInstallManagerForRoot(runCommand,params.root,params.timeoutMs);if(detected)return detected}return await detectGlobalInstallManagerByPresence(runCommand,params.timeoutMs)??`npm`}async function tryWriteCompletionCache(root,jsonMode){let binPath=path.join(root,`builderforce.mjs`);if(!await pathExists(binPath))return;let result=spawnSync(resolveNodeRunner(),[binPath,`completion`,`--write-state`],{cwd:root,env:process.env,encoding:`utf-8`});if(result.error){jsonMode||defaultRuntime.log(theme.warn(`Completion cache update failed: ${String(result.error)}`));return}if(result.status!==0&&!jsonMode){let stderr=(result.stderr??``).toString().trim(),detail=stderr?` (${stderr})`:``;defaultRuntime.log(theme.warn(`Completion cache update failed${detail}.`))}}function formatGitStatusLine(params){let shortSha=params.sha?params.sha.slice(0,8):null,branch=params.branch&¶ms.branch!==`HEAD`?params.branch:null,tag=params.tag;return[branch??(tag?`detached`:`git`),tag?`tag ${tag}`:null,shortSha?`@ ${shortSha}`:null].filter(Boolean).join(` · `)}async function updateStatusCommand(opts){let timeoutMs=parseTimeoutMsOrExit(opts.timeout);if(timeoutMs===null)return;let root=await resolveUpdateRoot(),configSnapshot=await readConfigFileSnapshot(),configChannel=configSnapshot.valid?normalizeUpdateChannel(configSnapshot.config.update?.channel):null,update=await checkUpdateStatus({root,timeoutMs:timeoutMs??3500,fetchGit:!0,includeRegistry:!0}),channelInfo=resolveUpdateChannelDisplay({configChannel,installKind:update.installKind,gitTag:update.git?.tag??null,gitBranch:update.git?.branch??null}),channelLabel=channelInfo.label,gitLabel=update.installKind===`git`?formatGitStatusLine({branch:update.git?.branch??null,tag:update.git?.tag??null,sha:update.git?.sha??null}):null,updateAvailability=resolveUpdateAvailability(update),updateLine=formatUpdateOneLiner(update).replace(/^Update:\s*/i,``);if(opts.json){defaultRuntime.log(JSON.stringify({update,channel:{value:channelInfo.channel,source:channelInfo.source,label:channelLabel,config:configChannel},availability:updateAvailability},null,2));return}let tableWidth=Math.max(60,(process.stdout.columns??120)-1),rows=[{Item:`Install`,Value:update.installKind===`git`?`git (${update.root??`unknown`})`:update.installKind===`package`?update.packageManager:`unknown`},{Item:`Channel`,Value:channelLabel},...gitLabel?[{Item:`Git`,Value:gitLabel}]:[],{Item:`Update`,Value:updateAvailability.available?theme.warn(`available · ${updateLine}`):updateLine}];defaultRuntime.log(theme.heading(`BuilderForceAgents update status`)),defaultRuntime.log(``),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Item`,header:`Item`,minWidth:10},{key:`Value`,header:`Value`,flex:!0,minWidth:24}],rows}).trimEnd()),defaultRuntime.log(``);let updateHint=formatUpdateAvailableHint(update);updateHint&&defaultRuntime.log(theme.warn(updateHint))}const STEP_LABELS={"clean check":`Working directory is clean`,"upstream check":`Upstream branch exists`,"git fetch":`Fetching latest changes`,"git rebase":`Rebasing onto target commit`,"git rev-parse @{upstream}":`Resolving upstream commit`,"git rev-list":`Enumerating candidate commits`,"git clone":`Cloning git checkout`,"preflight worktree":`Preparing preflight worktree`,"preflight cleanup":`Cleaning preflight worktree`,"deps install":`Installing dependencies`,build:`Building`,"ui:build":`Building UI assets`,"ui:build (post-doctor repair)":`Restoring missing UI assets`,"ui assets verify":`Validating UI assets`,"builderforce doctor entry":`Checking doctor entrypoint`,"builderforce doctor":`Running doctor checks`,"git rev-parse HEAD (after)":`Verifying update`,"global update":`Updating via package manager`,"global install":`Installing global package`};function getStepLabel(step){return STEP_LABELS[step.name]??step.name}function createUpdateProgress(enabled){if(!enabled)return{progress:{},stop:()=>{}};let currentSpinner=null;return{progress:{onStepStart:step=>{currentSpinner=spinner(),currentSpinner.start(theme.accent(getStepLabel(step)))},onStepComplete:step=>{if(!currentSpinner)return;let label=getStepLabel(step),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`),icon=step.exitCode===0?theme.success(`✓`):theme.error(`✗`);if(currentSpinner.stop(`${icon} ${label} ${duration}`),currentSpinner=null,step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
2
2
|
`).slice(-10);for(let line of lines)line.trim()&&defaultRuntime.log(` ${theme.error(line)}`)}}},stop:()=>{currentSpinner&&=(currentSpinner.stop(),null)}}}function formatStepStatus(exitCode){return exitCode===0?theme.success(`✓`):exitCode===null?theme.warn(`?`):theme.error(`✗`)}function printResult(result,opts){if(opts.json){defaultRuntime.log(JSON.stringify(result,null,2));return}let statusColor=result.status===`ok`?theme.success:result.status===`skipped`?theme.warn:theme.error;if(defaultRuntime.log(``),defaultRuntime.log(`${theme.heading(`Update Result:`)} ${statusColor(result.status.toUpperCase())}`),result.root&&defaultRuntime.log(` Root: ${theme.muted(result.root)}`),result.reason&&defaultRuntime.log(` Reason: ${theme.muted(result.reason)}`),result.before?.version||result.before?.sha){let before=result.before.version??result.before.sha?.slice(0,8)??``;defaultRuntime.log(` Before: ${theme.muted(before)}`)}if(result.after?.version||result.after?.sha){let after=result.after.version??result.after.sha?.slice(0,8)??``;defaultRuntime.log(` After: ${theme.muted(after)}`)}if(!opts.hideSteps&&result.steps.length>0){defaultRuntime.log(``),defaultRuntime.log(theme.heading(`Steps:`));for(let step of result.steps){let status=formatStepStatus(step.exitCode),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`);if(defaultRuntime.log(` ${status} ${step.name} ${duration}`),step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
3
3
|
`).slice(0,5);for(let line of lines)line.trim()&&defaultRuntime.log(` ${theme.error(line)}`)}}}defaultRuntime.log(``),defaultRuntime.log(`Total time: ${theme.muted(formatDurationPrecise(result.durationMs))}`)}function shellEscape(value){return value.replace(/'/g,`'\\''`)}function isBatchSafe(value){return/^[A-Za-z0-9 _\-().]+$/.test(value)}function resolveSystemdUnit(env){let override=env.BUILDERFORCE_AGENTS_SYSTEMD_UNIT?.trim();return override?override.endsWith(`.service`)?override:`${override}.service`:`${resolveGatewaySystemdServiceName(env.BUILDERFORCE_AGENTS_PROFILE)}.service`}function resolveLaunchdLabel(env){return env.BUILDERFORCE_AGENTS_LAUNCHD_LABEL?.trim()||resolveGatewayLaunchAgentLabel(env.BUILDERFORCE_AGENTS_PROFILE)}function resolveWindowsTaskName(env){return env.BUILDERFORCE_AGENTS_WINDOWS_TASK_NAME?.trim()||resolveGatewayWindowsTaskName(env.BUILDERFORCE_AGENTS_PROFILE)}async function prepareRestartScript(env=process.env){let tmpDir=os.tmpdir(),timestamp=Date.now(),platform=process.platform,scriptContent=``,filename=``;try{if(platform===`linux`){let escaped=shellEscape(resolveSystemdUnit(env));filename=`builderforce-restart-${timestamp}.sh`,scriptContent=`#!/bin/sh
|
|
4
4
|
# Standalone restart script — survives parent process termination.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{B as theme,g as pathExists}from"./utils-DbaBVFaK.js";import"./embedded-helpers-CEsr3aQ0.js";import{cr as trimLogTail}from"./reply-Cd3vVnD7.js";import"./session-key-EoB0qaG9.js";import{a as isCorePackageName,o as stripPackagePrefix,r as CORE_PACKAGE_NAME,t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import{t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import{n as replaceCliName,r as resolveCliName,t as formatCliCommand}from"./command-format-D806O2pt.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import{a as readConfigFileSnapshot,c as writeConfigFile}from"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./runner-SxCr9kXD.js";import"./model-catalog-C6UrZ0uG.js";import"./sandbox-BZibn6PX.js";import"./chrome-a3X9_-nf.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DJZT7Upf.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-BzfLvF8W.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-CdanN_ZI.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-DerUBvXW.js";import"./send-DyF1Xy9K.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-CHBjUwUJ.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-wcq7lXuI.js";import"./with-timeout-Bwq-GyUQ.js";import"./deliver-BpLm3ktn.js";import"./send-CBBziNqM.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName}from"./constants-BBbGeL3t.js";import"./memory-cli-DRz4wtHk.js";import"./manager-DwywI_5-.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-BbRf8gFM.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-DrFJ638L.js";import"./send-4d9NswaD.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-CbvMJhD3.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import{t as formatHelpExamples}from"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import"./resolve-route-D49haUnv.js";import"./replies-Bd2RPZwQ.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-6qh9acJy.js";import"./send-BJDzwYJN.js";import"./onboard-helpers-Cf5dNq7-.js";import{n as stylePromptMessage}from"./prompt-style-BpVK43GK.js";import"./pairing-labels-BW5jQZlr.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-BdrU4cIE.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-CJj0Inz-.js";import"./control-service-BbsswoMy.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-CoGqoBTH.js";import"./transformers-stream-D7nRu4Qu.js";import{r as parseSemver}from"./runtime-guard-DhksRHci.js";import"./program-context-BCwL3wlM.js";import"./catalog-rgiY__UQ.js";import"./skills-status-vWC0PU8J.js";import{n as inheritOptionFromParent}from"./command-options-DzGFCQYs.js";import"./note-B6NtFdXt.js";import"./helpers-DTDCy17p.js";import"./plugin-auto-enable-DDry2fA6.js";import"./install-safe-path-DsLq2BUJ.js";import"./npm-registry-spec-DIW6RsGN.js";import"./skill-scanner-U3AJgjqc.js";import"./installs-C9A8QFiF.js";import"./channels-status-issues-BlOu0Ul_.js";import{n as installCompletion}from"./completion-cli-B2qcVd6q.js";import"./daemon-runtime-CtOr1ncS.js";import"./systemd-BG3_QT6W.js";import{t as resolveGatewayService}from"./service-D-NLDyK3.js";import"./lifecycle-core-Dwb4gHjZ.js";import"./diagnostics-DCjg0nBH.js";import{o as runDaemonRestart}from"./daemon-cli-DlwOVDbt.js";import{t as renderTable}from"./table-BoCHYKoQ.js";import"./health-yS3NRKvY.js";import"./control-ui-assets-CWgH1Tda.js";import{_ as resolveUpdateChannelDisplay,c as DEFAULT_GIT_CHANNEL,d as channelToNpmTag,f as formatUpdateChannelLabel,g as resolveEffectiveUpdateChannel,h as normalizeUpdateChannel,l as DEFAULT_PACKAGE_CHANNEL,n as compareSemverStrings,o as resolveNpmChannelTag,r as fetchNpmTagVersion,t as checkUpdateStatus}from"./update-check-D6MvqVFE.js";import"./dm-policy-shared-Dhw9_6mi.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,t as formatUpdateAvailableHint}from"./status.update-C9iy31xr.js";import{a as detectGlobalInstallManagerForRoot,c as readPackageName,i as detectGlobalInstallManagerByPresence,l as readPackageVersion,n as runGatewayUpdate,o as globalInstallArgs,r as cleanupGlobalRenameDirs,s as resolveGlobalPackageRoot}from"./session-dirs-D_ARkyw0.js";import"./logging-DHa3jQN3.js";import{n as updateNpmInstalledPlugins,t as syncPluginsForUpdateChannel}from"./update-BUzcmoDf.js";import"./systemd-linger-CT-VHPB3.js";import"./health-format-iE_KYEwP.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-hB_nLOn1.js";import{r as ensureCompletionCacheExists,t as checkShellCompletionStatus}from"./doctor-completion-DVxbs-74.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";import{spawn,spawnSync}from"node:child_process";import{confirm,isCancel,spinner}from"@clack/prompts";function parseTimeoutMsOrExit(timeout){let timeoutMs=timeout?Number.parseInt(timeout,10)*1e3:void 0;return timeoutMs!==void 0&&(Number.isNaN(timeoutMs)||timeoutMs<=0)?(defaultRuntime.error(`--timeout must be a positive integer (seconds)`),defaultRuntime.exit(1),null):timeoutMs}const BUILDERFORCE_AGENTS_REPO_URL=`https://github.com/SeanHogg/Builderforce.ai.git`,MAX_LOG_CHARS=8e3,DEFAULT_PACKAGE_NAME=CORE_PACKAGE_NAME;function normalizeTag(value){if(!value)return null;let trimmed=value.trim();return trimmed?stripPackagePrefix(trimmed):null}function normalizeVersionTag(tag){let trimmed=tag.trim();if(!trimmed)return null;let cleaned=trimmed.startsWith(`v`)?trimmed.slice(1):trimmed;return parseSemver(cleaned)?cleaned:null}async function resolveTargetVersion(tag,timeoutMs){return normalizeVersionTag(tag)||((await fetchNpmTagVersion({tag,timeoutMs})).version??null)}async function isGitCheckout(root){try{return await fs.stat(path.join(root,`.git`)),!0}catch{return!1}}async function isCorePackage(root){return isCorePackageName(await readPackageName(root))}async function isEmptyDir(targetPath){try{return(await fs.readdir(targetPath)).length===0}catch{return!1}}function resolveGitInstallDir(){let override=process.env.BUILDERFORCE_AGENTS_GIT_DIR?.trim();return override?path.resolve(override):resolveDefaultGitDir()}function resolveDefaultGitDir(){return resolveStateDir(process.env,os.homedir)}function resolveNodeRunner(){let base=path.basename(process.execPath).toLowerCase();return base===`node`||base===`node.exe`?process.execPath:`node`}async function resolveUpdateRoot(){return await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()})??process.cwd()}async function runUpdateStep(params){let command=params.argv.join(` `);params.progress?.onStepStart?.({name:params.name,command,index:0,total:0});let started=Date.now(),res=await runCommandWithTimeout(params.argv,{cwd:params.cwd,timeoutMs:params.timeoutMs}),durationMs=Date.now()-started,stderrTail=trimLogTail(res.stderr,MAX_LOG_CHARS);return params.progress?.onStepComplete?.({name:params.name,command,index:0,total:0,durationMs,exitCode:res.code,stderrTail}),{name:params.name,command,cwd:params.cwd??process.cwd(),durationMs,exitCode:res.code,stdoutTail:trimLogTail(res.stdout,MAX_LOG_CHARS),stderrTail}}async function ensureGitCheckout(params){if(!await pathExists(params.dir))return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],timeoutMs:params.timeoutMs,progress:params.progress});if(!await isGitCheckout(params.dir)){if(!await isEmptyDir(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR points at a non-git directory: ${params.dir}. Set BUILDERFORCE_AGENTS_GIT_DIR to an empty folder or a builderforce checkout.`);return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],cwd:params.dir,timeoutMs:params.timeoutMs,progress:params.progress})}if(!await isCorePackage(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR does not look like a core checkout: ${params.dir}.`);return null}async function resolveGlobalManager(params){let runCommand=async(argv,options)=>{let res=await runCommandWithTimeout(argv,options);return{stdout:res.stdout,stderr:res.stderr,code:res.code}};if(params.installKind===`package`){let detected=await detectGlobalInstallManagerForRoot(runCommand,params.root,params.timeoutMs);if(detected)return detected}return await detectGlobalInstallManagerByPresence(runCommand,params.timeoutMs)??`npm`}async function tryWriteCompletionCache(root,jsonMode){let binPath=path.join(root,`builderforce.mjs`);if(!await pathExists(binPath))return;let result=spawnSync(resolveNodeRunner(),[binPath,`completion`,`--write-state`],{cwd:root,env:process.env,encoding:`utf-8`});if(result.error){jsonMode||defaultRuntime.log(theme.warn(`Completion cache update failed: ${String(result.error)}`));return}if(result.status!==0&&!jsonMode){let stderr=(result.stderr??``).toString().trim(),detail=stderr?` (${stderr})`:``;defaultRuntime.log(theme.warn(`Completion cache update failed${detail}.`))}}function formatGitStatusLine(params){let shortSha=params.sha?params.sha.slice(0,8):null,branch=params.branch&¶ms.branch!==`HEAD`?params.branch:null,tag=params.tag;return[branch??(tag?`detached`:`git`),tag?`tag ${tag}`:null,shortSha?`@ ${shortSha}`:null].filter(Boolean).join(` · `)}async function updateStatusCommand(opts){let timeoutMs=parseTimeoutMsOrExit(opts.timeout);if(timeoutMs===null)return;let root=await resolveUpdateRoot(),configSnapshot=await readConfigFileSnapshot(),configChannel=configSnapshot.valid?normalizeUpdateChannel(configSnapshot.config.update?.channel):null,update=await checkUpdateStatus({root,timeoutMs:timeoutMs??3500,fetchGit:!0,includeRegistry:!0}),channelInfo=resolveUpdateChannelDisplay({configChannel,installKind:update.installKind,gitTag:update.git?.tag??null,gitBranch:update.git?.branch??null}),channelLabel=channelInfo.label,gitLabel=update.installKind===`git`?formatGitStatusLine({branch:update.git?.branch??null,tag:update.git?.tag??null,sha:update.git?.sha??null}):null,updateAvailability=resolveUpdateAvailability(update),updateLine=formatUpdateOneLiner(update).replace(/^Update:\s*/i,``);if(opts.json){defaultRuntime.log(JSON.stringify({update,channel:{value:channelInfo.channel,source:channelInfo.source,label:channelLabel,config:configChannel},availability:updateAvailability},null,2));return}let tableWidth=Math.max(60,(process.stdout.columns??120)-1),rows=[{Item:`Install`,Value:update.installKind===`git`?`git (${update.root??`unknown`})`:update.installKind===`package`?update.packageManager:`unknown`},{Item:`Channel`,Value:channelLabel},...gitLabel?[{Item:`Git`,Value:gitLabel}]:[],{Item:`Update`,Value:updateAvailability.available?theme.warn(`available · ${updateLine}`):updateLine}];defaultRuntime.log(theme.heading(`BuilderForceAgents update status`)),defaultRuntime.log(``),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Item`,header:`Item`,minWidth:10},{key:`Value`,header:`Value`,flex:!0,minWidth:24}],rows}).trimEnd()),defaultRuntime.log(``);let updateHint=formatUpdateAvailableHint(update);updateHint&&defaultRuntime.log(theme.warn(updateHint))}const STEP_LABELS={"clean check":`Working directory is clean`,"upstream check":`Upstream branch exists`,"git fetch":`Fetching latest changes`,"git rebase":`Rebasing onto target commit`,"git rev-parse @{upstream}":`Resolving upstream commit`,"git rev-list":`Enumerating candidate commits`,"git clone":`Cloning git checkout`,"preflight worktree":`Preparing preflight worktree`,"preflight cleanup":`Cleaning preflight worktree`,"deps install":`Installing dependencies`,build:`Building`,"ui:build":`Building UI assets`,"ui:build (post-doctor repair)":`Restoring missing UI assets`,"ui assets verify":`Validating UI assets`,"builderforce doctor entry":`Checking doctor entrypoint`,"builderforce doctor":`Running doctor checks`,"git rev-parse HEAD (after)":`Verifying update`,"global update":`Updating via package manager`,"global install":`Installing global package`};function getStepLabel(step){return STEP_LABELS[step.name]??step.name}function createUpdateProgress(enabled){if(!enabled)return{progress:{},stop:()=>{}};let currentSpinner=null;return{progress:{onStepStart:step=>{currentSpinner=spinner(),currentSpinner.start(theme.accent(getStepLabel(step)))},onStepComplete:step=>{if(!currentSpinner)return;let label=getStepLabel(step),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`),icon=step.exitCode===0?theme.success(`✓`):theme.error(`✗`);if(currentSpinner.stop(`${icon} ${label} ${duration}`),currentSpinner=null,step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
1
|
+
import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{B as theme,g as pathExists}from"./utils-DbaBVFaK.js";import"./embedded-helpers-CEsr3aQ0.js";import{cr as trimLogTail}from"./reply-Cd3vVnD7.js";import"./session-key-EoB0qaG9.js";import{a as isCorePackageName,o as stripPackagePrefix,r as CORE_PACKAGE_NAME,t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import{t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import{n as replaceCliName,r as resolveCliName,t as formatCliCommand}from"./command-format-D806O2pt.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import{a as readConfigFileSnapshot,c as writeConfigFile}from"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./runner-SxCr9kXD.js";import"./model-catalog-C6UrZ0uG.js";import"./sandbox-BZibn6PX.js";import"./chrome-a3X9_-nf.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DJZT7Upf.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-BzfLvF8W.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-CdanN_ZI.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-DerUBvXW.js";import"./send-DyF1Xy9K.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-CHBjUwUJ.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-wcq7lXuI.js";import"./with-timeout-Bwq-GyUQ.js";import"./deliver-BpLm3ktn.js";import"./send-CBBziNqM.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName}from"./constants-BBbGeL3t.js";import"./memory-cli-DRz4wtHk.js";import"./manager-DwywI_5-.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-BbRf8gFM.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-DrFJ638L.js";import"./send-4d9NswaD.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-CbvMJhD3.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import{t as formatHelpExamples}from"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import"./resolve-route-D49haUnv.js";import"./replies-Bd2RPZwQ.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-6qh9acJy.js";import"./send-BJDzwYJN.js";import"./onboard-helpers-Cf5dNq7-.js";import{n as stylePromptMessage}from"./prompt-style-BpVK43GK.js";import"./pairing-labels-BW5jQZlr.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-BdrU4cIE.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-CJj0Inz-.js";import"./control-service-BbsswoMy.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-CoGqoBTH.js";import"./transformers-stream-D7nRu4Qu.js";import{r as parseSemver}from"./runtime-guard-DhksRHci.js";import"./program-context-CpxTJP1m.js";import"./catalog-rgiY__UQ.js";import"./skills-status-vWC0PU8J.js";import{n as inheritOptionFromParent}from"./command-options-DzGFCQYs.js";import"./note-B6NtFdXt.js";import"./helpers-DTDCy17p.js";import"./plugin-auto-enable-DDry2fA6.js";import"./install-safe-path-DsLq2BUJ.js";import"./npm-registry-spec-DIW6RsGN.js";import"./skill-scanner-U3AJgjqc.js";import"./installs-C9A8QFiF.js";import"./channels-status-issues-BlOu0Ul_.js";import{n as installCompletion}from"./completion-cli-Ch9ozmkg.js";import"./daemon-runtime-CtOr1ncS.js";import"./systemd-BG3_QT6W.js";import{t as resolveGatewayService}from"./service-D-NLDyK3.js";import"./lifecycle-core-Dwb4gHjZ.js";import"./diagnostics-DCjg0nBH.js";import{o as runDaemonRestart}from"./daemon-cli-DlwOVDbt.js";import{t as renderTable}from"./table-BoCHYKoQ.js";import"./health-yS3NRKvY.js";import"./control-ui-assets-CWgH1Tda.js";import{_ as resolveUpdateChannelDisplay,c as DEFAULT_GIT_CHANNEL,d as channelToNpmTag,f as formatUpdateChannelLabel,g as resolveEffectiveUpdateChannel,h as normalizeUpdateChannel,l as DEFAULT_PACKAGE_CHANNEL,n as compareSemverStrings,o as resolveNpmChannelTag,r as fetchNpmTagVersion,t as checkUpdateStatus}from"./update-check-D6MvqVFE.js";import"./dm-policy-shared-Dhw9_6mi.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,t as formatUpdateAvailableHint}from"./status.update-C9iy31xr.js";import{a as detectGlobalInstallManagerForRoot,c as readPackageName,i as detectGlobalInstallManagerByPresence,l as readPackageVersion,n as runGatewayUpdate,o as globalInstallArgs,r as cleanupGlobalRenameDirs,s as resolveGlobalPackageRoot}from"./session-dirs-D_ARkyw0.js";import"./logging-DHa3jQN3.js";import{n as updateNpmInstalledPlugins,t as syncPluginsForUpdateChannel}from"./update-BUzcmoDf.js";import"./systemd-linger-CT-VHPB3.js";import"./health-format-iE_KYEwP.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-Qb0DubNy.js";import{r as ensureCompletionCacheExists,t as checkShellCompletionStatus}from"./doctor-completion-Ccs-JEvV.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";import{spawn,spawnSync}from"node:child_process";import{confirm,isCancel,spinner}from"@clack/prompts";function parseTimeoutMsOrExit(timeout){let timeoutMs=timeout?Number.parseInt(timeout,10)*1e3:void 0;return timeoutMs!==void 0&&(Number.isNaN(timeoutMs)||timeoutMs<=0)?(defaultRuntime.error(`--timeout must be a positive integer (seconds)`),defaultRuntime.exit(1),null):timeoutMs}const BUILDERFORCE_AGENTS_REPO_URL=`https://github.com/SeanHogg/Builderforce.ai.git`,MAX_LOG_CHARS=8e3,DEFAULT_PACKAGE_NAME=CORE_PACKAGE_NAME;function normalizeTag(value){if(!value)return null;let trimmed=value.trim();return trimmed?stripPackagePrefix(trimmed):null}function normalizeVersionTag(tag){let trimmed=tag.trim();if(!trimmed)return null;let cleaned=trimmed.startsWith(`v`)?trimmed.slice(1):trimmed;return parseSemver(cleaned)?cleaned:null}async function resolveTargetVersion(tag,timeoutMs){return normalizeVersionTag(tag)||((await fetchNpmTagVersion({tag,timeoutMs})).version??null)}async function isGitCheckout(root){try{return await fs.stat(path.join(root,`.git`)),!0}catch{return!1}}async function isCorePackage(root){return isCorePackageName(await readPackageName(root))}async function isEmptyDir(targetPath){try{return(await fs.readdir(targetPath)).length===0}catch{return!1}}function resolveGitInstallDir(){let override=process.env.BUILDERFORCE_AGENTS_GIT_DIR?.trim();return override?path.resolve(override):resolveDefaultGitDir()}function resolveDefaultGitDir(){return resolveStateDir(process.env,os.homedir)}function resolveNodeRunner(){let base=path.basename(process.execPath).toLowerCase();return base===`node`||base===`node.exe`?process.execPath:`node`}async function resolveUpdateRoot(){return await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()})??process.cwd()}async function runUpdateStep(params){let command=params.argv.join(` `);params.progress?.onStepStart?.({name:params.name,command,index:0,total:0});let started=Date.now(),res=await runCommandWithTimeout(params.argv,{cwd:params.cwd,timeoutMs:params.timeoutMs}),durationMs=Date.now()-started,stderrTail=trimLogTail(res.stderr,MAX_LOG_CHARS);return params.progress?.onStepComplete?.({name:params.name,command,index:0,total:0,durationMs,exitCode:res.code,stderrTail}),{name:params.name,command,cwd:params.cwd??process.cwd(),durationMs,exitCode:res.code,stdoutTail:trimLogTail(res.stdout,MAX_LOG_CHARS),stderrTail}}async function ensureGitCheckout(params){if(!await pathExists(params.dir))return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],timeoutMs:params.timeoutMs,progress:params.progress});if(!await isGitCheckout(params.dir)){if(!await isEmptyDir(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR points at a non-git directory: ${params.dir}. Set BUILDERFORCE_AGENTS_GIT_DIR to an empty folder or a builderforce checkout.`);return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],cwd:params.dir,timeoutMs:params.timeoutMs,progress:params.progress})}if(!await isCorePackage(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR does not look like a core checkout: ${params.dir}.`);return null}async function resolveGlobalManager(params){let runCommand=async(argv,options)=>{let res=await runCommandWithTimeout(argv,options);return{stdout:res.stdout,stderr:res.stderr,code:res.code}};if(params.installKind===`package`){let detected=await detectGlobalInstallManagerForRoot(runCommand,params.root,params.timeoutMs);if(detected)return detected}return await detectGlobalInstallManagerByPresence(runCommand,params.timeoutMs)??`npm`}async function tryWriteCompletionCache(root,jsonMode){let binPath=path.join(root,`builderforce.mjs`);if(!await pathExists(binPath))return;let result=spawnSync(resolveNodeRunner(),[binPath,`completion`,`--write-state`],{cwd:root,env:process.env,encoding:`utf-8`});if(result.error){jsonMode||defaultRuntime.log(theme.warn(`Completion cache update failed: ${String(result.error)}`));return}if(result.status!==0&&!jsonMode){let stderr=(result.stderr??``).toString().trim(),detail=stderr?` (${stderr})`:``;defaultRuntime.log(theme.warn(`Completion cache update failed${detail}.`))}}function formatGitStatusLine(params){let shortSha=params.sha?params.sha.slice(0,8):null,branch=params.branch&¶ms.branch!==`HEAD`?params.branch:null,tag=params.tag;return[branch??(tag?`detached`:`git`),tag?`tag ${tag}`:null,shortSha?`@ ${shortSha}`:null].filter(Boolean).join(` · `)}async function updateStatusCommand(opts){let timeoutMs=parseTimeoutMsOrExit(opts.timeout);if(timeoutMs===null)return;let root=await resolveUpdateRoot(),configSnapshot=await readConfigFileSnapshot(),configChannel=configSnapshot.valid?normalizeUpdateChannel(configSnapshot.config.update?.channel):null,update=await checkUpdateStatus({root,timeoutMs:timeoutMs??3500,fetchGit:!0,includeRegistry:!0}),channelInfo=resolveUpdateChannelDisplay({configChannel,installKind:update.installKind,gitTag:update.git?.tag??null,gitBranch:update.git?.branch??null}),channelLabel=channelInfo.label,gitLabel=update.installKind===`git`?formatGitStatusLine({branch:update.git?.branch??null,tag:update.git?.tag??null,sha:update.git?.sha??null}):null,updateAvailability=resolveUpdateAvailability(update),updateLine=formatUpdateOneLiner(update).replace(/^Update:\s*/i,``);if(opts.json){defaultRuntime.log(JSON.stringify({update,channel:{value:channelInfo.channel,source:channelInfo.source,label:channelLabel,config:configChannel},availability:updateAvailability},null,2));return}let tableWidth=Math.max(60,(process.stdout.columns??120)-1),rows=[{Item:`Install`,Value:update.installKind===`git`?`git (${update.root??`unknown`})`:update.installKind===`package`?update.packageManager:`unknown`},{Item:`Channel`,Value:channelLabel},...gitLabel?[{Item:`Git`,Value:gitLabel}]:[],{Item:`Update`,Value:updateAvailability.available?theme.warn(`available · ${updateLine}`):updateLine}];defaultRuntime.log(theme.heading(`BuilderForceAgents update status`)),defaultRuntime.log(``),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Item`,header:`Item`,minWidth:10},{key:`Value`,header:`Value`,flex:!0,minWidth:24}],rows}).trimEnd()),defaultRuntime.log(``);let updateHint=formatUpdateAvailableHint(update);updateHint&&defaultRuntime.log(theme.warn(updateHint))}const STEP_LABELS={"clean check":`Working directory is clean`,"upstream check":`Upstream branch exists`,"git fetch":`Fetching latest changes`,"git rebase":`Rebasing onto target commit`,"git rev-parse @{upstream}":`Resolving upstream commit`,"git rev-list":`Enumerating candidate commits`,"git clone":`Cloning git checkout`,"preflight worktree":`Preparing preflight worktree`,"preflight cleanup":`Cleaning preflight worktree`,"deps install":`Installing dependencies`,build:`Building`,"ui:build":`Building UI assets`,"ui:build (post-doctor repair)":`Restoring missing UI assets`,"ui assets verify":`Validating UI assets`,"builderforce doctor entry":`Checking doctor entrypoint`,"builderforce doctor":`Running doctor checks`,"git rev-parse HEAD (after)":`Verifying update`,"global update":`Updating via package manager`,"global install":`Installing global package`};function getStepLabel(step){return STEP_LABELS[step.name]??step.name}function createUpdateProgress(enabled){if(!enabled)return{progress:{},stop:()=>{}};let currentSpinner=null;return{progress:{onStepStart:step=>{currentSpinner=spinner(),currentSpinner.start(theme.accent(getStepLabel(step)))},onStepComplete:step=>{if(!currentSpinner)return;let label=getStepLabel(step),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`),icon=step.exitCode===0?theme.success(`✓`):theme.error(`✗`);if(currentSpinner.stop(`${icon} ${label} ${duration}`),currentSpinner=null,step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
2
2
|
`).slice(-10);for(let line of lines)line.trim()&&defaultRuntime.log(` ${theme.error(line)}`)}}},stop:()=>{currentSpinner&&=(currentSpinner.stop(),null)}}}function formatStepStatus(exitCode){return exitCode===0?theme.success(`✓`):exitCode===null?theme.warn(`?`):theme.error(`✗`)}function printResult(result,opts){if(opts.json){defaultRuntime.log(JSON.stringify(result,null,2));return}let statusColor=result.status===`ok`?theme.success:result.status===`skipped`?theme.warn:theme.error;if(defaultRuntime.log(``),defaultRuntime.log(`${theme.heading(`Update Result:`)} ${statusColor(result.status.toUpperCase())}`),result.root&&defaultRuntime.log(` Root: ${theme.muted(result.root)}`),result.reason&&defaultRuntime.log(` Reason: ${theme.muted(result.reason)}`),result.before?.version||result.before?.sha){let before=result.before.version??result.before.sha?.slice(0,8)??``;defaultRuntime.log(` Before: ${theme.muted(before)}`)}if(result.after?.version||result.after?.sha){let after=result.after.version??result.after.sha?.slice(0,8)??``;defaultRuntime.log(` After: ${theme.muted(after)}`)}if(!opts.hideSteps&&result.steps.length>0){defaultRuntime.log(``),defaultRuntime.log(theme.heading(`Steps:`));for(let step of result.steps){let status=formatStepStatus(step.exitCode),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`);if(defaultRuntime.log(` ${status} ${step.name} ${duration}`),step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
3
3
|
`).slice(0,5);for(let line of lines)line.trim()&&defaultRuntime.log(` ${theme.error(line)}`)}}}defaultRuntime.log(``),defaultRuntime.log(`Total time: ${theme.muted(formatDurationPrecise(result.durationMs))}`)}function shellEscape(value){return value.replace(/'/g,`'\\''`)}function isBatchSafe(value){return/^[A-Za-z0-9 _\-().]+$/.test(value)}function resolveSystemdUnit(env){let override=env.BUILDERFORCE_AGENTS_SYSTEMD_UNIT?.trim();return override?override.endsWith(`.service`)?override:`${override}.service`:`${resolveGatewaySystemdServiceName(env.BUILDERFORCE_AGENTS_PROFILE)}.service`}function resolveLaunchdLabel(env){return env.BUILDERFORCE_AGENTS_LAUNCHD_LABEL?.trim()||resolveGatewayLaunchAgentLabel(env.BUILDERFORCE_AGENTS_PROFILE)}function resolveWindowsTaskName(env){return env.BUILDERFORCE_AGENTS_WINDOWS_TASK_NAME?.trim()||resolveGatewayWindowsTaskName(env.BUILDERFORCE_AGENTS_PROFILE)}async function prepareRestartScript(env=process.env){let tmpDir=os.tmpdir(),timestamp=Date.now(),platform=process.platform,scriptContent=``,filename=``;try{if(platform===`linux`){let escaped=shellEscape(resolveSystemdUnit(env));filename=`builderforce-restart-${timestamp}.sh`,scriptContent=`#!/bin/sh
|
|
4
4
|
# Standalone restart script — survives parent process termination.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./paths-CAQcjxp2.js";import{i as buildAgentMainSessionKey,l as normalizeAgentId,o as buildGroupHistoryKey,r as DEFAULT_MAIN_KEY}from"./session-key-CYpYHc1e.js";import{A as normalizeE164,B as toWhatsappJid,G as logVerbose,J as shouldLogVerbose,N as resolveJidToE164,O as isSelfChatMode,R as sleep,b as clamp,et as getChildLogger,k as jidToE164}from"./registry-j1UKIotU.js";import"./agent-scope-C7zGN7Pz.js";import{r as defaultRuntime,t as createSubsystemLogger}from"./subsystem-ykSbyaud.js";import"./model-selection-BGEkWWV7.js";import{c as resolveIdentityNamePrefix,l as resolveMessagePrefix,t as createReplyPrefixOptions}from"./reply-prefix-CWwv5MP-.js";import{r as formatCliCommand}from"./env-44XUbLhk.js";import"./src-izs0XSXm.js";import{A as normalizeMentionText,C as createInboundDebouncer,D as hasControlCommand,E as resolveEnvelopeFormatOptions,O as shouldComputeCommandAuthorized,S as enqueueSystemEvent,T as formatInboundEnvelope,_ as normalizeGroupActivation,a as resolveMentionGating,b as readChannelAllowFromStore,c as recordPendingHistoryEntryIfEnabled,d as dispatchReplyWithBufferedBlockDispatcher,g as toLocationContext,h as formatLocationText,i as buildPairingReply,k as buildMentionRegexes,l as recordChannelActivity,m as getReplyFromConfig,n as computeBackoff,o as DEFAULT_GROUP_HISTORY_LIMIT,p as createDedupeCache,r as sleepWithAbort,s as buildHistoryContextFromEntries,u as shouldAckReactionForWhatsApp,v as parseActivationCommand,w as resolveInboundDebounceMs,x as upsertChannelPairingRequest,y as formatDurationPrecise}from"./embedded-D-citLF2.js";import"./replies-CllKyBdY.js";import"./plugins-CjU7Ut5E.js";import{i as logWebSelfId,l as readWebSelfId,n as WA_WEB_AUTH_DIR,p as webAuthExists,r as getWebAuthAgeMs,s as pickWebChannel,t as resolveWhatsAppAccount}from"./accounts-xbnfJmsd.js";import"./bindings-6UAwilZE.js";import{At as readSessionUpdatedAt,Dn as saveMediaBuffer,Nt as updateLastRoute,c as registerUnhandledRejectionHandler,fn as resolveChannelGroupPolicy,hn as resolveGroupSessionKey,jt as recordSessionMetaFromInbound,kt as loadSessionStore,pn as resolveChannelGroupRequireMention}from"./runner-COldX-El.js";import"./fetch-D2i2BBd3.js";import"./model-catalog-BTMhKeCz.js";import"./redact-xFefzy4M.js";import"./errors-CguQr0Ja.js";import{n as loadConfig}from"./config-C7baFOp1.js";import"./chrome-Brg9KsB9.js";import"./message-channel-BKGbjp9g.js";import{s as resolveStorePath}from"./paths-ZHayVsQS.js";import"./gemini-auth-eXEUozQC.js";import"./tool-images-B8YdlzZb.js";import"./sqlite-DDTPj41Y.js";import"./manager-C7WmOAX4.js";import"./common-CgaBYMHL.js";import{c as resolveChunkMode,i as chunkMarkdownTextWithMode,l as resolveTextChunkLimit}from"./chunk-BCl8axDo.js";import{n as resolveMarkdownTableMode}from"./markdown-tables-C-Z5_lwN.js";import{c as getAgentScopedMediaLocalRoots,o as loadWebMedia}from"./render-NRLMXKq3.js";import{t as finalizeInboundContext}from"./inbound-context-C3QX6t8E.js";import{i as convertMarkdownTables,r as setActiveWebListener}from"./active-listener-FQKmkr1L.js";import{n as resolveAgentRoute,t as buildAgentSessionKey}from"./resolve-route-D5Ptdm3e.js";import{i as markdownToWhatsApp,n as sendMessageWhatsApp,r as sendReactionWhatsApp}from"./outbound-JmV6INRK.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-DdbDbdLz.js";import{t as loginWeb}from"./login-Ieb7RHYd.js";import{randomUUID}from"node:crypto";import{getMaxListeners,setMaxListeners}from"node:events";import{DisconnectReason,downloadMediaMessage,extractMessageContent,getContentType,isJidGroup,normalizeMessageContent}from"@whiskeysockets/baileys";const DEFAULT_RECONNECT_POLICY={initialMs:2e3,maxMs:3e4,factor:1.8,jitter:.25,maxAttempts:12};function resolveHeartbeatSeconds(cfg,overrideSeconds){let candidate=overrideSeconds??cfg.web?.heartbeatSeconds;return typeof candidate==`number`&&candidate>0?candidate:60}function resolveReconnectPolicy(cfg,overrides){let reconnectOverrides=cfg.web?.reconnect??{},overrideConfig=overrides??{},merged={...DEFAULT_RECONNECT_POLICY,...reconnectOverrides,...overrideConfig};return merged.initialMs=Math.max(250,merged.initialMs),merged.maxMs=Math.max(merged.initialMs,merged.maxMs),merged.factor=clamp(merged.factor,1.1,10),merged.jitter=clamp(merged.jitter,0,1),merged.maxAttempts=Math.max(0,Math.floor(merged.maxAttempts)),merged}function newConnectionId(){return randomUUID()}const whatsappLog=createSubsystemLogger(`gateway/channels/whatsapp`),whatsappInboundLog=whatsappLog.child(`inbound`),whatsappOutboundLog=whatsappLog.child(`outbound`),whatsappHeartbeatLog=whatsappLog.child(`heartbeat`);function elide(text,limit=400){return!text||text.length<=limit?text:`${text.slice(0,limit)}… (truncated ${text.length-limit} chars)`}function isLikelyWhatsAppCryptoError(reason){let haystack=(reason instanceof Error?`${reason.message}\n${reason.stack??``}`:(value=>{if(value==null)return``;if(typeof value==`string`)return value;if(value instanceof Error)return`${value.message}\n${value.stack??``}`;if(typeof value==`object`)try{return JSON.stringify(value)}catch{return Object.prototype.toString.call(value)}return typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value):typeof value==`symbol`?value.description??value.toString():typeof value==`function`?value.name?`[function ${value.name}]`:`[function]`:Object.prototype.toString.call(value)})(reason)).toLowerCase();return haystack.includes(`unsupported state or unable to authenticate data`)||haystack.includes(`bad mac`)?haystack.includes(`@whiskeysockets/baileys`)||haystack.includes(`baileys`)||haystack.includes(`noise-handler`)||haystack.includes(`aesdecryptgcm`):!1}function waitForever(){return setInterval(()=>{},1e6).unref(),new Promise(()=>{})}const recentInboundMessages=createDedupeCache({ttlMs:20*6e4,maxSize:5e3});function isRecentInboundMessage(key){return recentInboundMessages.check(key)}const ALLOWED_VCARD_KEYS=new Set([`FN`,`N`,`TEL`]);function parseVcard(vcard){if(!vcard)return{phones:[]};let lines=vcard.split(/\r?\n/),nameFromN,nameFromFn,phones=[];for(let rawLine of lines){let line=rawLine.trim();if(!line)continue;let colonIndex=line.indexOf(`:`);if(colonIndex===-1)continue;let key=line.slice(0,colonIndex).toUpperCase(),rawValue=line.slice(colonIndex+1).trim();if(!rawValue)continue;let baseKey=normalizeVcardKey(key);if(!baseKey||!ALLOWED_VCARD_KEYS.has(baseKey))continue;let value=cleanVcardValue(rawValue);if(value){if(baseKey===`FN`&&!nameFromFn){nameFromFn=normalizeVcardName(value);continue}if(baseKey===`N`&&!nameFromN){nameFromN=normalizeVcardName(value);continue}if(baseKey===`TEL`){let phone=normalizeVcardPhone(value);phone&&phones.push(phone)}}}return{name:nameFromFn??nameFromN,phones}}function normalizeVcardKey(key){let[primary]=key.split(`;`);if(!primary)return;let segments=primary.split(`.`);return segments[segments.length-1]||void 0}function cleanVcardValue(value){return value.replace(/\\n/gi,` `).replace(/\\,/g,`,`).replace(/\\;/g,`;`).trim()}function normalizeVcardName(value){return value.replace(/;/g,` `).replace(/\s+/g,` `).trim()}function normalizeVcardPhone(value){let trimmed=value.trim();return trimmed?trimmed.toLowerCase().startsWith(`tel:`)?trimmed.slice(4).trim():trimmed:``}function unwrapMessage$1(message){return normalizeMessageContent(message)}function extractContextInfo(message){if(!message)return;let contentType=getContentType(message),candidate=contentType?message[contentType]:void 0,contextInfo=candidate&&typeof candidate==`object`&&`contextInfo`in candidate?candidate.contextInfo:void 0;if(contextInfo)return contextInfo;let fallback=message.extendedTextMessage?.contextInfo??message.imageMessage?.contextInfo??message.videoMessage?.contextInfo??message.documentMessage?.contextInfo??message.audioMessage?.contextInfo??message.stickerMessage?.contextInfo??message.buttonsResponseMessage?.contextInfo??message.listResponseMessage?.contextInfo??message.templateButtonReplyMessage?.contextInfo??message.interactiveResponseMessage?.contextInfo??message.buttonsMessage?.contextInfo??message.listMessage?.contextInfo;if(fallback)return fallback;for(let value of Object.values(message)){if(!value||typeof value!=`object`||!(`contextInfo`in value))continue;let candidateContext=value.contextInfo;if(candidateContext)return candidateContext}}function extractMentionedJids(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let flattened=[message.extendedTextMessage?.contextInfo?.mentionedJid,message.extendedTextMessage?.contextInfo?.quotedMessage?.extendedTextMessage?.contextInfo?.mentionedJid,message.imageMessage?.contextInfo?.mentionedJid,message.videoMessage?.contextInfo?.mentionedJid,message.documentMessage?.contextInfo?.mentionedJid,message.audioMessage?.contextInfo?.mentionedJid,message.stickerMessage?.contextInfo?.mentionedJid,message.buttonsResponseMessage?.contextInfo?.mentionedJid,message.listResponseMessage?.contextInfo?.mentionedJid].flatMap(arr=>arr??[]).filter(Boolean);if(flattened.length!==0)return Array.from(new Set(flattened))}function extractText(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let extracted=extractMessageContent(message),candidates=[message,extracted&&extracted!==message?extracted:void 0];for(let candidate of candidates){if(!candidate)continue;if(typeof candidate.conversation==`string`&&candidate.conversation.trim())return candidate.conversation.trim();let extended=candidate.extendedTextMessage?.text;if(extended?.trim())return extended.trim();let caption=candidate.imageMessage?.caption??candidate.videoMessage?.caption??candidate.documentMessage?.caption;if(caption?.trim())return caption.trim()}let contactPlaceholder=extractContactPlaceholder(message)??(extracted&&extracted!==message?extractContactPlaceholder(extracted):void 0);if(contactPlaceholder)return contactPlaceholder}function extractMediaPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(message){if(message.imageMessage)return`<media:image>`;if(message.videoMessage)return`<media:video>`;if(message.audioMessage)return`<media:audio>`;if(message.documentMessage)return`<media:document>`;if(message.stickerMessage)return`<media:sticker>`}}function extractContactPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let contact=message.contactMessage??void 0;if(contact){let{name,phones}=describeContact({displayName:contact.displayName,vcard:contact.vcard});return formatContactPlaceholder(name,phones)}let contactsArray=message.contactsArrayMessage?.contacts??void 0;if(!(!contactsArray||contactsArray.length===0))return formatContactsPlaceholder(contactsArray.map(entry=>describeContact({displayName:entry.displayName,vcard:entry.vcard})).map(entry=>formatContactLabel(entry.name,entry.phones)).filter(value=>!!value),contactsArray.length)}function describeContact(input){let displayName=(input.displayName??``).trim(),parsed=parseVcard(input.vcard??void 0);return{name:displayName||parsed.name,phones:parsed.phones}}function formatContactPlaceholder(name,phones){let label=formatContactLabel(name,phones);return label?`<contact: ${label}>`:`<contact>`}function formatContactsPlaceholder(labels,total){let cleaned=labels.map(label=>label.trim()).filter(Boolean);if(cleaned.length===0)return`<contacts: ${total} ${total===1?`contact`:`contacts`}>`;let remaining=Math.max(total-cleaned.length,0),suffix=remaining>0?` +${remaining} more`:``;return`<contacts: ${cleaned.join(`, `)}${suffix}>`}function formatContactLabel(name,phones){let parts=[name,formatPhoneList(phones)].filter(value=>!!value);if(parts.length!==0)return parts.join(`, `)}function formatPhoneList(phones){let cleaned=phones?.map(phone=>phone.trim()).filter(Boolean)??[];if(cleaned.length===0)return;let{shown,remaining}=summarizeList(cleaned,cleaned.length,1),[primary]=shown;if(primary)return remaining===0?primary:`${primary} (+${remaining} more)`}function summarizeList(values,total,maxShown){let shown=values.slice(0,maxShown);return{shown,remaining:Math.max(total-shown.length,0)}}function extractLocationData(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let live=message.liveLocationMessage??void 0;if(live){let latitudeRaw=live.degreesLatitude,longitudeRaw=live.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude))return{latitude,longitude,accuracy:live.accuracyInMeters??void 0,caption:live.caption??void 0,source:`live`,isLive:!0}}}let location=message.locationMessage??void 0;if(location){let latitudeRaw=location.degreesLatitude,longitudeRaw=location.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude)){let isLive=!!location.isLive;return{latitude,longitude,accuracy:location.accuracyInMeters??void 0,name:location.name??void 0,address:location.address??void 0,caption:location.comment??void 0,source:isLive?`live`:location.name||location.address?`place`:`pin`,isLive}}}}return null}function describeReplyContext(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let contextInfo=extractContextInfo(message),quoted=normalizeMessageContent(contextInfo?.quotedMessage);if(!quoted)return null;let location=extractLocationData(quoted),locationText=location?formatLocationText(location):void 0,body=[extractText(quoted),locationText].filter(Boolean).join(`
|
|
1
|
+
import"./paths-CAQcjxp2.js";import{i as buildAgentMainSessionKey,l as normalizeAgentId,o as buildGroupHistoryKey,r as DEFAULT_MAIN_KEY}from"./session-key-CYpYHc1e.js";import{A as normalizeE164,B as toWhatsappJid,G as logVerbose,J as shouldLogVerbose,N as resolveJidToE164,O as isSelfChatMode,R as sleep,b as clamp,et as getChildLogger,k as jidToE164}from"./registry-j1UKIotU.js";import"./agent-scope-C7zGN7Pz.js";import{r as defaultRuntime,t as createSubsystemLogger}from"./subsystem-ykSbyaud.js";import"./model-selection-BGEkWWV7.js";import{c as resolveIdentityNamePrefix,l as resolveMessagePrefix,t as createReplyPrefixOptions}from"./reply-prefix-CWwv5MP-.js";import{r as formatCliCommand}from"./env-44XUbLhk.js";import"./src-izs0XSXm.js";import{A as normalizeMentionText,C as createInboundDebouncer,D as hasControlCommand,E as resolveEnvelopeFormatOptions,O as shouldComputeCommandAuthorized,S as enqueueSystemEvent,T as formatInboundEnvelope,_ as normalizeGroupActivation,a as resolveMentionGating,b as readChannelAllowFromStore,c as recordPendingHistoryEntryIfEnabled,d as dispatchReplyWithBufferedBlockDispatcher,g as toLocationContext,h as formatLocationText,i as buildPairingReply,k as buildMentionRegexes,l as recordChannelActivity,m as getReplyFromConfig,n as computeBackoff,o as DEFAULT_GROUP_HISTORY_LIMIT,p as createDedupeCache,r as sleepWithAbort,s as buildHistoryContextFromEntries,u as shouldAckReactionForWhatsApp,v as parseActivationCommand,w as resolveInboundDebounceMs,x as upsertChannelPairingRequest,y as formatDurationPrecise}from"./embedded-cvG_LpfQ.js";import"./replies-CllKyBdY.js";import"./plugins-CjU7Ut5E.js";import{i as logWebSelfId,l as readWebSelfId,n as WA_WEB_AUTH_DIR,p as webAuthExists,r as getWebAuthAgeMs,s as pickWebChannel,t as resolveWhatsAppAccount}from"./accounts-xbnfJmsd.js";import"./bindings-6UAwilZE.js";import{At as readSessionUpdatedAt,Dn as saveMediaBuffer,Nt as updateLastRoute,c as registerUnhandledRejectionHandler,fn as resolveChannelGroupPolicy,hn as resolveGroupSessionKey,jt as recordSessionMetaFromInbound,kt as loadSessionStore,pn as resolveChannelGroupRequireMention}from"./runner-CviGu3Nk.js";import"./fetch-D2i2BBd3.js";import"./model-catalog-BTMhKeCz.js";import"./redact-xFefzy4M.js";import"./errors-CguQr0Ja.js";import{n as loadConfig}from"./config-C7baFOp1.js";import"./chrome-DUBgoZpO.js";import"./message-channel-BKGbjp9g.js";import{s as resolveStorePath}from"./paths-ZHayVsQS.js";import"./gemini-auth-eXEUozQC.js";import"./tool-images-B8YdlzZb.js";import"./sqlite-DDTPj41Y.js";import"./manager-C7WmOAX4.js";import"./common-CgaBYMHL.js";import{c as resolveChunkMode,i as chunkMarkdownTextWithMode,l as resolveTextChunkLimit}from"./chunk-BCl8axDo.js";import{n as resolveMarkdownTableMode}from"./markdown-tables-C-Z5_lwN.js";import{c as getAgentScopedMediaLocalRoots,o as loadWebMedia}from"./render-NRLMXKq3.js";import{t as finalizeInboundContext}from"./inbound-context-C3QX6t8E.js";import{i as convertMarkdownTables,r as setActiveWebListener}from"./active-listener-FQKmkr1L.js";import{n as resolveAgentRoute,t as buildAgentSessionKey}from"./resolve-route-D5Ptdm3e.js";import{i as markdownToWhatsApp,n as sendMessageWhatsApp,r as sendReactionWhatsApp}from"./outbound-JmV6INRK.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-DdbDbdLz.js";import{t as loginWeb}from"./login-Ieb7RHYd.js";import{randomUUID}from"node:crypto";import{getMaxListeners,setMaxListeners}from"node:events";import{DisconnectReason,downloadMediaMessage,extractMessageContent,getContentType,isJidGroup,normalizeMessageContent}from"@whiskeysockets/baileys";const DEFAULT_RECONNECT_POLICY={initialMs:2e3,maxMs:3e4,factor:1.8,jitter:.25,maxAttempts:12};function resolveHeartbeatSeconds(cfg,overrideSeconds){let candidate=overrideSeconds??cfg.web?.heartbeatSeconds;return typeof candidate==`number`&&candidate>0?candidate:60}function resolveReconnectPolicy(cfg,overrides){let reconnectOverrides=cfg.web?.reconnect??{},overrideConfig=overrides??{},merged={...DEFAULT_RECONNECT_POLICY,...reconnectOverrides,...overrideConfig};return merged.initialMs=Math.max(250,merged.initialMs),merged.maxMs=Math.max(merged.initialMs,merged.maxMs),merged.factor=clamp(merged.factor,1.1,10),merged.jitter=clamp(merged.jitter,0,1),merged.maxAttempts=Math.max(0,Math.floor(merged.maxAttempts)),merged}function newConnectionId(){return randomUUID()}const whatsappLog=createSubsystemLogger(`gateway/channels/whatsapp`),whatsappInboundLog=whatsappLog.child(`inbound`),whatsappOutboundLog=whatsappLog.child(`outbound`),whatsappHeartbeatLog=whatsappLog.child(`heartbeat`);function elide(text,limit=400){return!text||text.length<=limit?text:`${text.slice(0,limit)}… (truncated ${text.length-limit} chars)`}function isLikelyWhatsAppCryptoError(reason){let haystack=(reason instanceof Error?`${reason.message}\n${reason.stack??``}`:(value=>{if(value==null)return``;if(typeof value==`string`)return value;if(value instanceof Error)return`${value.message}\n${value.stack??``}`;if(typeof value==`object`)try{return JSON.stringify(value)}catch{return Object.prototype.toString.call(value)}return typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value):typeof value==`symbol`?value.description??value.toString():typeof value==`function`?value.name?`[function ${value.name}]`:`[function]`:Object.prototype.toString.call(value)})(reason)).toLowerCase();return haystack.includes(`unsupported state or unable to authenticate data`)||haystack.includes(`bad mac`)?haystack.includes(`@whiskeysockets/baileys`)||haystack.includes(`baileys`)||haystack.includes(`noise-handler`)||haystack.includes(`aesdecryptgcm`):!1}function waitForever(){return setInterval(()=>{},1e6).unref(),new Promise(()=>{})}const recentInboundMessages=createDedupeCache({ttlMs:20*6e4,maxSize:5e3});function isRecentInboundMessage(key){return recentInboundMessages.check(key)}const ALLOWED_VCARD_KEYS=new Set([`FN`,`N`,`TEL`]);function parseVcard(vcard){if(!vcard)return{phones:[]};let lines=vcard.split(/\r?\n/),nameFromN,nameFromFn,phones=[];for(let rawLine of lines){let line=rawLine.trim();if(!line)continue;let colonIndex=line.indexOf(`:`);if(colonIndex===-1)continue;let key=line.slice(0,colonIndex).toUpperCase(),rawValue=line.slice(colonIndex+1).trim();if(!rawValue)continue;let baseKey=normalizeVcardKey(key);if(!baseKey||!ALLOWED_VCARD_KEYS.has(baseKey))continue;let value=cleanVcardValue(rawValue);if(value){if(baseKey===`FN`&&!nameFromFn){nameFromFn=normalizeVcardName(value);continue}if(baseKey===`N`&&!nameFromN){nameFromN=normalizeVcardName(value);continue}if(baseKey===`TEL`){let phone=normalizeVcardPhone(value);phone&&phones.push(phone)}}}return{name:nameFromFn??nameFromN,phones}}function normalizeVcardKey(key){let[primary]=key.split(`;`);if(!primary)return;let segments=primary.split(`.`);return segments[segments.length-1]||void 0}function cleanVcardValue(value){return value.replace(/\\n/gi,` `).replace(/\\,/g,`,`).replace(/\\;/g,`;`).trim()}function normalizeVcardName(value){return value.replace(/;/g,` `).replace(/\s+/g,` `).trim()}function normalizeVcardPhone(value){let trimmed=value.trim();return trimmed?trimmed.toLowerCase().startsWith(`tel:`)?trimmed.slice(4).trim():trimmed:``}function unwrapMessage$1(message){return normalizeMessageContent(message)}function extractContextInfo(message){if(!message)return;let contentType=getContentType(message),candidate=contentType?message[contentType]:void 0,contextInfo=candidate&&typeof candidate==`object`&&`contextInfo`in candidate?candidate.contextInfo:void 0;if(contextInfo)return contextInfo;let fallback=message.extendedTextMessage?.contextInfo??message.imageMessage?.contextInfo??message.videoMessage?.contextInfo??message.documentMessage?.contextInfo??message.audioMessage?.contextInfo??message.stickerMessage?.contextInfo??message.buttonsResponseMessage?.contextInfo??message.listResponseMessage?.contextInfo??message.templateButtonReplyMessage?.contextInfo??message.interactiveResponseMessage?.contextInfo??message.buttonsMessage?.contextInfo??message.listMessage?.contextInfo;if(fallback)return fallback;for(let value of Object.values(message)){if(!value||typeof value!=`object`||!(`contextInfo`in value))continue;let candidateContext=value.contextInfo;if(candidateContext)return candidateContext}}function extractMentionedJids(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let flattened=[message.extendedTextMessage?.contextInfo?.mentionedJid,message.extendedTextMessage?.contextInfo?.quotedMessage?.extendedTextMessage?.contextInfo?.mentionedJid,message.imageMessage?.contextInfo?.mentionedJid,message.videoMessage?.contextInfo?.mentionedJid,message.documentMessage?.contextInfo?.mentionedJid,message.audioMessage?.contextInfo?.mentionedJid,message.stickerMessage?.contextInfo?.mentionedJid,message.buttonsResponseMessage?.contextInfo?.mentionedJid,message.listResponseMessage?.contextInfo?.mentionedJid].flatMap(arr=>arr??[]).filter(Boolean);if(flattened.length!==0)return Array.from(new Set(flattened))}function extractText(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let extracted=extractMessageContent(message),candidates=[message,extracted&&extracted!==message?extracted:void 0];for(let candidate of candidates){if(!candidate)continue;if(typeof candidate.conversation==`string`&&candidate.conversation.trim())return candidate.conversation.trim();let extended=candidate.extendedTextMessage?.text;if(extended?.trim())return extended.trim();let caption=candidate.imageMessage?.caption??candidate.videoMessage?.caption??candidate.documentMessage?.caption;if(caption?.trim())return caption.trim()}let contactPlaceholder=extractContactPlaceholder(message)??(extracted&&extracted!==message?extractContactPlaceholder(extracted):void 0);if(contactPlaceholder)return contactPlaceholder}function extractMediaPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(message){if(message.imageMessage)return`<media:image>`;if(message.videoMessage)return`<media:video>`;if(message.audioMessage)return`<media:audio>`;if(message.documentMessage)return`<media:document>`;if(message.stickerMessage)return`<media:sticker>`}}function extractContactPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let contact=message.contactMessage??void 0;if(contact){let{name,phones}=describeContact({displayName:contact.displayName,vcard:contact.vcard});return formatContactPlaceholder(name,phones)}let contactsArray=message.contactsArrayMessage?.contacts??void 0;if(!(!contactsArray||contactsArray.length===0))return formatContactsPlaceholder(contactsArray.map(entry=>describeContact({displayName:entry.displayName,vcard:entry.vcard})).map(entry=>formatContactLabel(entry.name,entry.phones)).filter(value=>!!value),contactsArray.length)}function describeContact(input){let displayName=(input.displayName??``).trim(),parsed=parseVcard(input.vcard??void 0);return{name:displayName||parsed.name,phones:parsed.phones}}function formatContactPlaceholder(name,phones){let label=formatContactLabel(name,phones);return label?`<contact: ${label}>`:`<contact>`}function formatContactsPlaceholder(labels,total){let cleaned=labels.map(label=>label.trim()).filter(Boolean);if(cleaned.length===0)return`<contacts: ${total} ${total===1?`contact`:`contacts`}>`;let remaining=Math.max(total-cleaned.length,0),suffix=remaining>0?` +${remaining} more`:``;return`<contacts: ${cleaned.join(`, `)}${suffix}>`}function formatContactLabel(name,phones){let parts=[name,formatPhoneList(phones)].filter(value=>!!value);if(parts.length!==0)return parts.join(`, `)}function formatPhoneList(phones){let cleaned=phones?.map(phone=>phone.trim()).filter(Boolean)??[];if(cleaned.length===0)return;let{shown,remaining}=summarizeList(cleaned,cleaned.length,1),[primary]=shown;if(primary)return remaining===0?primary:`${primary} (+${remaining} more)`}function summarizeList(values,total,maxShown){let shown=values.slice(0,maxShown);return{shown,remaining:Math.max(total-shown.length,0)}}function extractLocationData(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let live=message.liveLocationMessage??void 0;if(live){let latitudeRaw=live.degreesLatitude,longitudeRaw=live.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude))return{latitude,longitude,accuracy:live.accuracyInMeters??void 0,caption:live.caption??void 0,source:`live`,isLive:!0}}}let location=message.locationMessage??void 0;if(location){let latitudeRaw=location.degreesLatitude,longitudeRaw=location.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude)){let isLive=!!location.isLive;return{latitude,longitude,accuracy:location.accuracyInMeters??void 0,name:location.name??void 0,address:location.address??void 0,caption:location.comment??void 0,source:isLive?`live`:location.name||location.address?`place`:`pin`,isLive}}}}return null}function describeReplyContext(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let contextInfo=extractContextInfo(message),quoted=normalizeMessageContent(contextInfo?.quotedMessage);if(!quoted)return null;let location=extractLocationData(quoted),locationText=location?formatLocationText(location):void 0,body=[extractText(quoted),locationText].filter(Boolean).join(`
|
|
2
2
|
`).trim();if(body||=extractMediaPlaceholder(quoted),!body){let quotedType=quoted?getContentType(quoted):void 0;return logVerbose(`Quoted message missing extractable body${quotedType?` (type ${quotedType})`:``}`),null}let senderJid=contextInfo?.participant??void 0,senderE164=senderJid?jidToE164(senderJid)??senderJid:void 0,sender=senderE164??`unknown sender`;return{id:contextInfo?.stanzaId?String(contextInfo.stanzaId):void 0,body,sender,senderJid,senderE164}}async function checkInboundAccessControl(params){let cfg=loadConfig(),account=resolveWhatsAppAccount({cfg,accountId:params.accountId}),dmPolicy=account.dmPolicy??`pairing`,configuredAllowFrom=account.allowFrom,storeAllowFrom=await readChannelAllowFromStore(`whatsapp`,process.env,account.accountId).catch(()=>[]),combinedAllowFrom=Array.from(new Set([...configuredAllowFrom??[],...storeAllowFrom])),defaultAllowFrom=combinedAllowFrom.length===0&¶ms.selfE164?[params.selfE164]:void 0,allowFrom=combinedAllowFrom.length>0?combinedAllowFrom:defaultAllowFrom,groupAllowFrom=account.groupAllowFrom??(configuredAllowFrom&&configuredAllowFrom.length>0?configuredAllowFrom:void 0),isSamePhone=params.from===params.selfE164,isSelfChat=isSelfChatMode(params.selfE164,configuredAllowFrom),pairingGraceMs=typeof params.pairingGraceMs==`number`&¶ms.pairingGraceMs>0?params.pairingGraceMs:3e4,suppressPairingReply=typeof params.connectedAtMs==`number`&&typeof params.messageTimestampMs==`number`&¶ms.messageTimestampMs<params.connectedAtMs-pairingGraceMs,dmHasWildcard=allowFrom?.includes(`*`)??!1,normalizedAllowFrom=allowFrom&&allowFrom.length>0?allowFrom.filter(entry=>entry!==`*`).map(normalizeE164):[],groupHasWildcard=groupAllowFrom?.includes(`*`)??!1,normalizedGroupAllowFrom=groupAllowFrom&&groupAllowFrom.length>0?groupAllowFrom.filter(entry=>entry!==`*`).map(normalizeE164):[],defaultGroupPolicy=cfg.channels?.defaults?.groupPolicy,groupPolicy=account.groupPolicy??defaultGroupPolicy??`open`;if(params.group&&groupPolicy===`disabled`)return logVerbose(`Blocked group message (groupPolicy: disabled)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(params.group&&groupPolicy===`allowlist`){if(!groupAllowFrom||groupAllowFrom.length===0)return logVerbose(`Blocked group message (groupPolicy: allowlist, no groupAllowFrom)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(!(groupHasWildcard||params.senderE164!=null&&normalizedGroupAllowFrom.includes(params.senderE164)))return logVerbose(`Blocked group message from ${params.senderE164??`unknown sender`} (groupPolicy: allowlist)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId}}if(!params.group){if(params.isFromMe&&!isSamePhone)return logVerbose(`Skipping outbound DM (fromMe); no pairing reply needed.`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(dmPolicy===`disabled`)return logVerbose(`Blocked dm (dmPolicy: disabled)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(dmPolicy!==`open`&&!isSamePhone){let candidate=params.from;if(!(dmHasWildcard||normalizedAllowFrom.length>0&&normalizedAllowFrom.includes(candidate))){if(dmPolicy===`pairing`)if(suppressPairingReply)logVerbose(`Skipping pairing reply for historical DM from ${candidate}.`);else{let{code,created}=await upsertChannelPairingRequest({channel:`whatsapp`,id:candidate,accountId:account.accountId,meta:{name:(params.pushName??``).trim()||void 0}});if(created){logVerbose(`whatsapp pairing request sender=${candidate} name=${params.pushName??`unknown`}`);try{await params.sock.sendMessage(params.remoteJid,{text:buildPairingReply({channel:`whatsapp`,idLine:`Your WhatsApp phone number: ${candidate}`,code})})}catch(err){logVerbose(`whatsapp pairing reply failed for ${candidate}: ${String(err)}`)}}}else logVerbose(`Blocked unauthorized sender ${candidate} (dmPolicy=${dmPolicy})`);return{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId}}}}return{allowed:!0,shouldMarkRead:!0,isSelfChat,resolvedAccountId:account.accountId}}function unwrapMessage(message){return normalizeMessageContent(message)}function resolveMediaMimetype(message){let explicit=message.imageMessage?.mimetype??message.videoMessage?.mimetype??message.documentMessage?.mimetype??message.audioMessage?.mimetype??message.stickerMessage?.mimetype??void 0;if(explicit)return explicit;if(message.audioMessage)return`audio/ogg; codecs=opus`;if(message.imageMessage)return`image/jpeg`;if(message.videoMessage)return`video/mp4`;if(message.stickerMessage)return`image/webp`}async function downloadInboundMedia(msg,sock){let message=unwrapMessage(msg.message);if(!message)return;let mimetype=resolveMediaMimetype(message),fileName=message.documentMessage?.fileName??void 0;if(!(!message.imageMessage&&!message.videoMessage&&!message.documentMessage&&!message.audioMessage&&!message.stickerMessage))try{return{buffer:await downloadMediaMessage(msg,`buffer`,{},{reuploadRequest:sock.updateMediaMessage,logger:sock.logger}),mimetype,fileName}}catch(err){logVerbose(`downloadMediaMessage failed: ${String(err)}`);return}}function recordWhatsAppOutbound(accountId){recordChannelActivity({channel:`whatsapp`,accountId,direction:`outbound`})}function resolveOutboundMessageId(result){return typeof result==`object`&&result&&`key`in result?String(result.key?.id??`unknown`):`unknown`}function createWebSendApi(params){return{sendMessage:async(to,text,mediaBuffer,mediaType,sendOptions)=>{let jid=toWhatsappJid(to),payload;if(mediaBuffer&&mediaType)if(mediaType.startsWith(`image/`))payload={image:mediaBuffer,caption:text||void 0,mimetype:mediaType};else if(mediaType.startsWith(`audio/`))payload={audio:mediaBuffer,ptt:!0,mimetype:mediaType};else if(mediaType.startsWith(`video/`)){let gifPlayback=sendOptions?.gifPlayback;payload={video:mediaBuffer,caption:text||void 0,mimetype:mediaType,...gifPlayback?{gifPlayback:!0}:{}}}else payload={document:mediaBuffer,fileName:sendOptions?.fileName?.trim()||`file`,caption:text||void 0,mimetype:mediaType};else payload={text};let result=await params.sock.sendMessage(jid,payload);return recordWhatsAppOutbound(sendOptions?.accountId??params.defaultAccountId),{messageId:resolveOutboundMessageId(result)}},sendPoll:async(to,poll)=>{let jid=toWhatsappJid(to),result=await params.sock.sendMessage(jid,{poll:{name:poll.question,values:poll.options,selectableCount:poll.maxSelections??1}});return recordWhatsAppOutbound(params.defaultAccountId),{messageId:resolveOutboundMessageId(result)}},sendReaction:async(chatJid,messageId,emoji,fromMe,participant)=>{let jid=toWhatsappJid(chatJid);await params.sock.sendMessage(jid,{react:{text:emoji,key:{remoteJid:jid,id:messageId,fromMe,participant:participant?toWhatsappJid(participant):void 0}}})},sendComposingTo:async to=>{let jid=toWhatsappJid(to);await params.sock.sendPresenceUpdate(`composing`,jid)}}}async function monitorWebInbox(options){let inboundLogger=getChildLogger({module:`web-inbound`}),inboundConsoleLog=createSubsystemLogger(`gateway/channels/whatsapp`).child(`inbound`),sock=await createWaSocket(!1,options.verbose,{authDir:options.authDir});await waitForWaConnection(sock);let connectedAtMs=Date.now(),onCloseResolve=null,onClose=new Promise(resolve=>{onCloseResolve=resolve}),resolveClose=reason=>{if(!onCloseResolve)return;let resolver=onCloseResolve;onCloseResolve=null,resolver(reason)};try{await sock.sendPresenceUpdate(`available`),shouldLogVerbose()&&logVerbose(`Sent global 'available' presence on connect`)}catch(err){logVerbose(`Failed to send 'available' presence on connect: ${String(err)}`)}let selfJid=sock.user?.id,selfE164=selfJid?jidToE164(selfJid):null,debouncer=createInboundDebouncer({debounceMs:options.debounceMs??0,buildKey:msg=>{let senderKey=msg.chatType===`group`?msg.senderJid??msg.senderE164??msg.senderName??msg.from:msg.from;if(!senderKey)return null;let conversationKey=msg.chatType===`group`?msg.chatId:msg.from;return`${msg.accountId}:${conversationKey}:${senderKey}`},shouldDebounce:options.shouldDebounce,onFlush:async entries=>{let last=entries.at(-1);if(!last)return;if(entries.length===1){await options.onMessage(last);return}let mentioned=new Set;for(let entry of entries)for(let jid of entry.mentionedJids??[])mentioned.add(jid);let combinedBody=entries.map(entry=>entry.body).filter(Boolean).join(`
|
|
3
3
|
`),combinedMessage={...last,body:combinedBody,mentionedJids:mentioned.size>0?Array.from(mentioned):void 0};await options.onMessage(combinedMessage)},onError:err=>{inboundLogger.error({error:String(err)},`failed handling inbound web message`),inboundConsoleLog.error(`Failed handling inbound web message: ${String(err)}`)}}),groupMetaCache=new Map,GROUP_META_TTL_MS=300*1e3,lidLookup=sock.signalRepository?.lidMapping,resolveInboundJid=async jid=>resolveJidToE164(jid,{authDir:options.authDir,lidLookup}),getGroupMeta=async jid=>{let cached=groupMetaCache.get(jid);if(cached&&cached.expires>Date.now())return cached;try{let meta=await sock.groupMetadata(jid),participants=(await Promise.all(meta.participants?.map(async p=>await resolveInboundJid(p.id)??p.id)??[])).filter(Boolean)??[],entry={subject:meta.subject,participants,expires:Date.now()+GROUP_META_TTL_MS};return groupMetaCache.set(jid,entry),entry}catch(err){return logVerbose(`Failed to fetch group metadata for ${jid}: ${String(err)}`),{expires:Date.now()+GROUP_META_TTL_MS}}},handleMessagesUpsert=async upsert=>{if(!(upsert.type!==`notify`&&upsert.type!==`append`))for(let msg of upsert.messages??[]){recordChannelActivity({channel:`whatsapp`,accountId:options.accountId,direction:`inbound`});let id=msg.key?.id??void 0,remoteJid=msg.key?.remoteJid;if(!remoteJid||remoteJid.endsWith(`@status`)||remoteJid.endsWith(`@broadcast`))continue;let group=isJidGroup(remoteJid)===!0;if(id&&isRecentInboundMessage(`${options.accountId}:${remoteJid}:${id}`))continue;let participantJid=msg.key?.participant??void 0,from=group?remoteJid:await resolveInboundJid(remoteJid);if(!from)continue;let senderE164=group?participantJid?await resolveInboundJid(participantJid):null:from,groupSubject,groupParticipants;if(group){let meta=await getGroupMeta(remoteJid);groupSubject=meta.subject,groupParticipants=meta.participants}let messageTimestampMs=msg.messageTimestamp?Number(msg.messageTimestamp)*1e3:void 0,access=await checkInboundAccessControl({accountId:options.accountId,from,selfE164,senderE164,group,pushName:msg.pushName??void 0,isFromMe:!!msg.key?.fromMe,messageTimestampMs,connectedAtMs,sock:{sendMessage:(jid,content)=>sock.sendMessage(jid,content)},remoteJid});if(!access.allowed)continue;if(id&&!access.isSelfChat&&options.sendReadReceipts!==!1){let participant=msg.key?.participant;try{await sock.readMessages([{remoteJid,id,participant,fromMe:!1}]),shouldLogVerbose()&&logVerbose(`Marked message ${id} as read for ${remoteJid}${participant?` (participant ${participant})`:``}`)}catch(err){logVerbose(`Failed to mark message ${id} read: ${String(err)}`)}}else id&&access.isSelfChat&&shouldLogVerbose()&&logVerbose(`Self-chat mode: skipping read receipt for ${id}`);if(upsert.type===`append`)continue;let location=extractLocationData(msg.message??void 0),locationText=location?formatLocationText(location):void 0,body=extractText(msg.message??void 0);if(locationText&&(body=[body,locationText].filter(Boolean).join(`
|
|
4
4
|
`).trim()),!body&&(body=extractMediaPlaceholder(msg.message??void 0),!body))continue;let replyContext=describeReplyContext(msg.message),mediaPath,mediaType,mediaFileName;try{let inboundMedia=await downloadInboundMedia(msg,sock);if(inboundMedia){let maxBytes=(typeof options.mediaMaxMb==`number`&&options.mediaMaxMb>0?options.mediaMaxMb:50)*1024*1024;mediaPath=(await saveMediaBuffer(inboundMedia.buffer,inboundMedia.mimetype,`inbound`,maxBytes,inboundMedia.fileName)).path,mediaType=inboundMedia.mimetype,mediaFileName=inboundMedia.fileName}}catch(err){logVerbose(`Inbound media download failed: ${String(err)}`)}let chatJid=remoteJid,sendComposing=async()=>{try{await sock.sendPresenceUpdate(`composing`,chatJid)}catch(err){logVerbose(`Presence update failed: ${String(err)}`)}},reply=async text=>{await sock.sendMessage(chatJid,{text})},sendMedia=async payload=>{await sock.sendMessage(chatJid,payload)},timestamp=messageTimestampMs,mentionedJids=extractMentionedJids(msg.message),senderName=msg.pushName??void 0;inboundLogger.info({from,to:selfE164??`me`,body,mediaPath,mediaType,mediaFileName,timestamp},`inbound message`);let inboundMessage={id,from,conversationId:from,to:selfE164??`me`,accountId:access.resolvedAccountId,body,pushName:senderName,timestamp,chatType:group?`group`:`direct`,chatId:remoteJid,senderJid:participantJid,senderE164:senderE164??void 0,senderName,replyToId:replyContext?.id,replyToBody:replyContext?.body,replyToSender:replyContext?.sender,replyToSenderJid:replyContext?.senderJid,replyToSenderE164:replyContext?.senderE164,groupSubject,groupParticipants,mentionedJids:mentionedJids??void 0,selfJid,selfE164,location:location??void 0,sendComposing,reply,sendMedia,mediaPath,mediaType,mediaFileName};try{Promise.resolve(debouncer.enqueue(inboundMessage)).catch(err=>{inboundLogger.error({error:String(err)},`failed handling inbound web message`),inboundConsoleLog.error(`Failed handling inbound web message: ${String(err)}`)})}catch(err){inboundLogger.error({error:String(err)},`failed handling inbound web message`),inboundConsoleLog.error(`Failed handling inbound web message: ${String(err)}`)}}};sock.ev.on(`messages.upsert`,handleMessagesUpsert);let handleConnectionUpdate=update=>{try{if(update.connection===`close`){let status=getStatusCode(update.lastDisconnect?.error);resolveClose({status,isLoggedOut:status===DisconnectReason.loggedOut,error:update.lastDisconnect?.error})}}catch(err){inboundLogger.error({error:String(err)},`connection.update handler error`),resolveClose({status:void 0,isLoggedOut:!1,error:err})}};return sock.ev.on(`connection.update`,handleConnectionUpdate),{close:async()=>{try{let ev=sock.ev,messagesUpsertHandler=handleMessagesUpsert,connectionUpdateHandler=handleConnectionUpdate;typeof ev.off==`function`?(ev.off(`messages.upsert`,messagesUpsertHandler),ev.off(`connection.update`,connectionUpdateHandler)):typeof ev.removeListener==`function`&&(ev.removeListener(`messages.upsert`,messagesUpsertHandler),ev.removeListener(`connection.update`,connectionUpdateHandler)),sock.ws?.close()}catch(err){logVerbose(`Socket close failed: ${String(err)}`)}},onClose,signalClose:reason=>{resolveClose(reason??{status:void 0,isLoggedOut:!1,error:`closed`})},...createWebSendApi({sock:{sendMessage:(jid,content)=>sock.sendMessage(jid,content),sendPresenceUpdate:(presence,jid)=>sock.sendPresenceUpdate(presence,jid)},defaultAccountId:options.accountId})}}function buildMentionConfig(cfg,agentId){return{mentionRegexes:buildMentionRegexes(cfg,agentId),allowFrom:cfg.channels?.whatsapp?.allowFrom}}function resolveMentionTargets(msg,authDir){let jidOptions=authDir?{authDir}:void 0;return{normalizedMentions:msg.mentionedJids?.length?msg.mentionedJids.map(jid=>jidToE164(jid,jidOptions)??jid).filter(Boolean):[],selfE164:msg.selfE164??(msg.selfJid?jidToE164(msg.selfJid,jidOptions):null),selfJid:msg.selfJid?msg.selfJid.replace(/:\\d+/,``):null}}function isBotMentionedFromTargets(msg,mentionCfg,targets){let clean=text=>normalizeMentionText(text),isSelfChat=isSelfChatMode(targets.selfE164,mentionCfg.allowFrom);if((msg.mentionedJids?.length??0)>0&&!isSelfChat)return!!(targets.selfE164&&targets.normalizedMentions.includes(targets.selfE164)||targets.selfJid&&targets.normalizedMentions.includes(targets.selfJid));let bodyClean=clean(msg.body);if(mentionCfg.mentionRegexes.some(re=>re.test(bodyClean)))return!0;if(targets.selfE164){let selfDigits=targets.selfE164.replace(/\D/g,``);if(selfDigits){if(bodyClean.replace(/[^\d]/g,``).includes(selfDigits))return!0;let bodyNoSpace=msg.body.replace(/[\s-]/g,``);if(RegExp(`\\+?${selfDigits}`,`i`).test(bodyNoSpace))return!0}}return!1}function debugMention(msg,mentionCfg,authDir){let mentionTargets=resolveMentionTargets(msg,authDir);return{wasMentioned:isBotMentionedFromTargets(msg,mentionCfg,mentionTargets),details:{from:msg.from,body:msg.body,bodyClean:normalizeMentionText(msg.body),mentionedJids:msg.mentionedJids??null,normalizedMentionedJids:mentionTargets.normalizedMentions.length?mentionTargets.normalizedMentions:null,selfJid:msg.selfJid??null,selfJidBare:mentionTargets.selfJid,selfE164:msg.selfE164??null,resolvedSelfE164:mentionTargets.selfE164}}}function resolveOwnerList(mentionCfg,selfE164){let allowFrom=mentionCfg.allowFrom;return(Array.isArray(allowFrom)&&allowFrom.length>0?allowFrom:selfE164?[selfE164]:[]).filter(entry=>!!(entry&&entry!==`*`)).map(entry=>normalizeE164(entry)).filter(entry=>!!entry)}function createEchoTracker(params){let recentlySent=new Set,maxItems=Math.max(1,params.maxItems??100),buildCombinedKey=p=>`combined:${p.sessionKey}:${p.combinedBody}`,trim=()=>{for(;recentlySent.size>maxItems;){let firstKey=recentlySent.values().next().value;if(!firstKey)break;recentlySent.delete(firstKey)}};return{rememberText:(text,opts)=>{text&&(recentlySent.add(text),opts.combinedBody&&opts.combinedBodySessionKey&&recentlySent.add(buildCombinedKey({sessionKey:opts.combinedBodySessionKey,combinedBody:opts.combinedBody})),opts.logVerboseMessage&¶ms.logVerbose?.(`Added to echo detection set (size now: ${recentlySent.size}): ${text.substring(0,50)}...`),trim())},has:key=>recentlySent.has(key),forget:key=>{recentlySent.delete(key)},buildCombinedKey}}async function maybeBroadcastMessage(params){let broadcastAgents=params.cfg.broadcast?.[params.peerId];if(!broadcastAgents||!Array.isArray(broadcastAgents)||broadcastAgents.length===0)return!1;let strategy=params.cfg.broadcast?.strategy||`parallel`;whatsappInboundLog.info(`Broadcasting message to ${broadcastAgents.length} agents (${strategy})`);let agentIds=params.cfg.agents?.list?.map(agent=>normalizeAgentId(agent.id)),hasKnownAgents=(agentIds?.length??0)>0,groupHistorySnapshot=params.msg.chatType===`group`?params.groupHistories.get(params.groupHistoryKey)??[]:void 0,processForAgent=async agentId=>{let normalizedAgentId=normalizeAgentId(agentId);if(hasKnownAgents&&!agentIds?.includes(normalizedAgentId))return whatsappInboundLog.warn(`Broadcast agent ${agentId} not found in agents.list; skipping`),!1;let agentRoute={...params.route,agentId:normalizedAgentId,sessionKey:buildAgentSessionKey({agentId:normalizedAgentId,channel:`whatsapp`,accountId:params.route.accountId,peer:{kind:params.msg.chatType===`group`?`group`:`direct`,id:params.peerId},dmScope:params.cfg.session?.dmScope,identityLinks:params.cfg.session?.identityLinks}),mainSessionKey:buildAgentMainSessionKey({agentId:normalizedAgentId,mainKey:DEFAULT_MAIN_KEY})};try{return await params.processMessage(params.msg,agentRoute,params.groupHistoryKey,{groupHistory:groupHistorySnapshot,suppressGroupHistoryClear:!0})}catch(err){return whatsappInboundLog.error(`Broadcast agent ${agentId} failed: ${formatError(err)}`),!1}};if(strategy===`sequential`)for(let agentId of broadcastAgents)await processForAgent(agentId);else await Promise.allSettled(broadcastAgents.map(processForAgent));return params.msg.chatType===`group`&¶ms.groupHistories.set(params.groupHistoryKey,[]),!0}function stripMentionsForCommand(text,mentionRegexes,selfE164){let result=text;for(let re of mentionRegexes)result=result.replace(re,` `);if(selfE164){let digits=selfE164.replace(/\D/g,``);if(digits){let pattern=RegExp(`\\+?${digits}`,`g`);result=result.replace(pattern,` `)}}return result.replace(/\s+/g,` `).trim()}function resolveGroupPolicyFor(cfg,conversationId){let groupId=resolveGroupSessionKey({From:conversationId,ChatType:`group`,Provider:`whatsapp`})?.id;return resolveChannelGroupPolicy({cfg,channel:`whatsapp`,groupId:groupId??conversationId})}function resolveGroupRequireMentionFor(cfg,conversationId){let groupId=resolveGroupSessionKey({From:conversationId,ChatType:`group`,Provider:`whatsapp`})?.id;return resolveChannelGroupRequireMention({cfg,channel:`whatsapp`,groupId:groupId??conversationId})}function resolveGroupActivationFor(params){let entry=loadSessionStore(resolveStorePath(params.cfg.session?.store,{agentId:params.agentId}))[params.sessionKey],defaultActivation=resolveGroupRequireMentionFor(params.cfg,params.conversationId)?`mention`:`always`;return normalizeGroupActivation(entry?.groupActivation)??defaultActivation}function noteGroupMember(groupMemberNames,conversationId,e164,name){if(!e164||!name)return;let key=normalizeE164(e164)??e164;if(!key)return;let roster=groupMemberNames.get(conversationId);roster||(roster=new Map,groupMemberNames.set(conversationId,roster)),roster.set(key,name)}function formatGroupMembers(params){let{participants,roster,fallbackE164}=params,seen=new Set,ordered=[];if(participants?.length)for(let entry of participants){if(!entry)continue;let normalized=normalizeE164(entry)??entry;!normalized||seen.has(normalized)||(seen.add(normalized),ordered.push(normalized))}if(roster)for(let entry of roster.keys()){let normalized=normalizeE164(entry)??entry;!normalized||seen.has(normalized)||(seen.add(normalized),ordered.push(normalized))}if(ordered.length===0&&fallbackE164){let normalized=normalizeE164(fallbackE164)??fallbackE164;normalized&&ordered.push(normalized)}if(ordered.length!==0)return ordered.map(entry=>{let name=roster?.get(entry);return name?`${name} (${entry})`:entry}).join(`, `)}function isOwnerSender(baseMentionConfig,msg){let sender=normalizeE164(msg.senderE164??``);return sender?resolveOwnerList(baseMentionConfig,msg.selfE164??void 0).includes(sender):!1}function recordPendingGroupHistoryEntry(params){let sender=params.msg.senderName&¶ms.msg.senderE164?`${params.msg.senderName} (${params.msg.senderE164})`:params.msg.senderName??params.msg.senderE164??`Unknown`;recordPendingHistoryEntryIfEnabled({historyMap:params.groupHistories,historyKey:params.groupHistoryKey,limit:params.groupHistoryLimit,entry:{sender,body:params.msg.body,timestamp:params.msg.timestamp,id:params.msg.id,senderJid:params.msg.senderJid}})}function applyGroupGating(params){let groupPolicy=resolveGroupPolicyFor(params.cfg,params.conversationId);if(groupPolicy.allowlistEnabled&&!groupPolicy.allowed)return params.logVerbose(`Skipping group message ${params.conversationId} (not in allowlist)`),{shouldProcess:!1};noteGroupMember(params.groupMemberNames,params.groupHistoryKey,params.msg.senderE164,params.msg.senderName);let mentionConfig=buildMentionConfig(params.cfg,params.agentId),commandBody=stripMentionsForCommand(params.msg.body,mentionConfig.mentionRegexes,params.msg.selfE164),activationCommand=parseActivationCommand(commandBody),owner=isOwnerSender(params.baseMentionConfig,params.msg),shouldBypassMention=owner&&hasControlCommand(commandBody,params.cfg);if(activationCommand.hasCommand&&!owner)return params.logVerbose(`Ignoring /activation from non-owner in group ${params.conversationId}`),recordPendingGroupHistoryEntry({msg:params.msg,groupHistories:params.groupHistories,groupHistoryKey:params.groupHistoryKey,groupHistoryLimit:params.groupHistoryLimit}),{shouldProcess:!1};let mentionDebug=debugMention(params.msg,mentionConfig,params.authDir);params.replyLogger.debug({conversationId:params.conversationId,wasMentioned:mentionDebug.wasMentioned,...mentionDebug.details},`group mention debug`);let wasMentioned=mentionDebug.wasMentioned,requireMention=resolveGroupActivationFor({cfg:params.cfg,agentId:params.agentId,sessionKey:params.sessionKey,conversationId:params.conversationId})!==`always`,selfJid=params.msg.selfJid?.replace(/:\\d+/,``),replySenderJid=params.msg.replyToSenderJid?.replace(/:\\d+/,``),selfE164=params.msg.selfE164?normalizeE164(params.msg.selfE164):null,replySenderE164=params.msg.replyToSenderE164?normalizeE164(params.msg.replyToSenderE164):null,mentionGate=resolveMentionGating({requireMention,canDetectMention:!0,wasMentioned,implicitMention:!!(selfJid&&replySenderJid&&selfJid===replySenderJid||selfE164&&replySenderE164&&selfE164===replySenderE164),shouldBypassMention});return params.msg.wasMentioned=mentionGate.effectiveWasMentioned,!shouldBypassMention&&requireMention&&mentionGate.shouldSkip?(params.logVerbose(`Group message stored for context (no mention detected) in ${params.conversationId}: ${params.msg.body}`),recordPendingGroupHistoryEntry({msg:params.msg,groupHistories:params.groupHistories,groupHistoryKey:params.groupHistoryKey,groupHistoryLimit:params.groupHistoryLimit}),{shouldProcess:!1}):{shouldProcess:!0}}function trackBackgroundTask(backgroundTasks,task){backgroundTasks.add(task),task.finally(()=>{backgroundTasks.delete(task)})}function updateLastRouteInBackground(params){let storePath=resolveStorePath(params.cfg.session?.store,{agentId:params.storeAgentId}),task=updateLastRoute({storePath,sessionKey:params.sessionKey,deliveryContext:{channel:params.channel,to:params.to,accountId:params.accountId},ctx:params.ctx}).catch(err=>{params.warn({error:formatError(err),storePath,sessionKey:params.sessionKey,to:params.to},`failed updating last route`)});trackBackgroundTask(params.backgroundTasks,task)}function resolvePeerId(msg){return msg.chatType===`group`?msg.conversationId??msg.from:msg.senderE164?normalizeE164(msg.senderE164)??msg.senderE164:msg.from.includes(`@`)?jidToE164(msg.from)??msg.from:normalizeE164(msg.from)??msg.from}async function deliverWebReply(params){let{replyResult,msg,maxMediaBytes,textLimit,replyLogger,connectionId,skipLog}=params,replyStarted=Date.now(),tableMode=params.tableMode??`code`,chunkMode=params.chunkMode??`length`,textChunks=chunkMarkdownTextWithMode(markdownToWhatsApp(convertMarkdownTables(replyResult.text||``,tableMode)),textLimit,chunkMode),mediaList=replyResult.mediaUrls?.length?replyResult.mediaUrls:replyResult.mediaUrl?[replyResult.mediaUrl]:[],sendWithRetry=async(fn,label,maxAttempts=3)=>{let lastErr;for(let attempt=1;attempt<=maxAttempts;attempt++)try{return await fn()}catch(err){lastErr=err;let errText=formatError(err),isLast=attempt===maxAttempts;if(!/closed|reset|timed\\s*out|disconnect/i.test(errText)||isLast)throw err;let backoffMs=500*attempt;logVerbose(`Retrying ${label} to ${msg.from} after failure (${attempt}/${maxAttempts-1}) in ${backoffMs}ms: ${errText}`),await sleep(backoffMs)}throw lastErr};if(mediaList.length===0&&textChunks.length){let totalChunks=textChunks.length;for(let[index,chunk]of textChunks.entries()){let chunkStarted=Date.now();if(await sendWithRetry(()=>msg.reply(chunk),`text`),!skipLog){let durationMs=Date.now()-chunkStarted;whatsappOutboundLog.debug(`Sent chunk ${index+1}/${totalChunks} to ${msg.from} (${durationMs.toFixed(0)}ms)`)}}replyLogger.info({correlationId:msg.id??newConnectionId(),connectionId:connectionId??null,to:msg.from,from:msg.to,text:elide(replyResult.text,240),mediaUrl:null,mediaSizeBytes:null,mediaKind:null,durationMs:Date.now()-replyStarted},`auto-reply sent (text)`);return}let remainingText=[...textChunks];for(let[index,mediaUrl]of mediaList.entries()){let caption=index===0&&remainingText.shift()||void 0;try{let media=await loadWebMedia(mediaUrl,{maxBytes:maxMediaBytes,localRoots:params.mediaLocalRoots});if(shouldLogVerbose()&&(logVerbose(`Web auto-reply media size: ${(media.buffer.length/(1024*1024)).toFixed(2)}MB`),logVerbose(`Web auto-reply media source: ${mediaUrl} (kind ${media.kind})`)),media.kind===`image`)await sendWithRetry(()=>msg.sendMedia({image:media.buffer,caption,mimetype:media.contentType}),`media:image`);else if(media.kind===`audio`)await sendWithRetry(()=>msg.sendMedia({audio:media.buffer,ptt:!0,mimetype:media.contentType,caption}),`media:audio`);else if(media.kind===`video`)await sendWithRetry(()=>msg.sendMedia({video:media.buffer,caption,mimetype:media.contentType}),`media:video`);else{let fileName=media.fileName??mediaUrl.split(`/`).pop()??`file`,mimetype=media.contentType??`application/octet-stream`;await sendWithRetry(()=>msg.sendMedia({document:media.buffer,fileName,caption,mimetype}),`media:document`)}whatsappOutboundLog.info(`Sent media reply to ${msg.from} (${(media.buffer.length/(1024*1024)).toFixed(2)}MB)`),replyLogger.info({correlationId:msg.id??newConnectionId(),connectionId:connectionId??null,to:msg.from,from:msg.to,text:caption??null,mediaUrl,mediaSizeBytes:media.buffer.length,mediaKind:media.kind,durationMs:Date.now()-replyStarted},`auto-reply sent (media)`)}catch(err){if(whatsappOutboundLog.error(`Failed sending web media to ${msg.from}: ${formatError(err)}`),replyLogger.warn({err,mediaUrl},`failed to send web media reply`),index===0){let warning=err instanceof Error?`⚠️ Media failed: ${err.message}`:`⚠️ Media failed.`,fallbackText=[remainingText.shift()??caption??``,warning].filter(Boolean).join(`
|