@seanhogg/builderforce-agents 2026.10.8 → 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.
Files changed (98) hide show
  1. package/dist/{audio-preflight-hAkEddaf.js → audio-preflight-CBZJKBS8.js} +1 -1
  2. package/dist/build-info.json +3 -3
  3. package/dist/{builderforce-wxtgU9xu.js → builderforce-2EpP2M8q.js} +3 -3
  4. package/dist/{builderforce-BWCp-M9e.js → builderforce-Cyg20uU8.js} +3 -3
  5. package/dist/{builderforce-onboarding-DuUfZ6oL.js → builderforce-onboarding-C89jVb-9.js} +1 -1
  6. package/dist/{builderforce-onboarding-Dq6VUSKZ.js → builderforce-onboarding-D5A-wEs-.js} +1 -1
  7. package/dist/bundled/boot-md/handler.js +1 -1
  8. package/dist/bundled/session-memory/handler.js +1 -1
  9. package/dist/chrome-CtTMuhww.js +4 -0
  10. package/dist/{command-registry-D_LkOB4n.js → command-registry-CDcuHGpx.js} +1 -1
  11. package/dist/{command-registry-CiR8PUQY.js → command-registry-hHegQvBn.js} +1 -1
  12. package/dist/{completion-cli-C7munVvb.js → completion-cli-Bqr0W4L6.js} +1 -1
  13. package/dist/{completion-cli-CBES884A.js → completion-cli-Ch9ozmkg.js} +1 -1
  14. package/dist/{completion-cli-B72GX2so.js → completion-cli-Ck0FTqPT.js} +1 -1
  15. package/dist/{completion-cli-CijodCzU.js → completion-cli-Do4vXo1k.js} +1 -1
  16. package/dist/{doctor-completion-FErwMP3Y.js → doctor-completion-BjBTLcoC.js} +1 -1
  17. package/dist/{doctor-completion-Bv2ztEeW.js → doctor-completion-Ccs-JEvV.js} +1 -1
  18. package/dist/{embedded-DXDHduG1.js → embedded-BcHzh_y8.js} +6 -6
  19. package/dist/entry.js +1 -1
  20. package/dist/{gateway-cli-DpJjgVYH.js → gateway-cli-CiHNwzdS.js} +3 -3
  21. package/dist/{gateway-cli-U8RlUIuT.js → gateway-cli-z47dfosr.js} +3 -3
  22. package/dist/index.js +2 -2
  23. package/dist/llm-slug-generator.js +1 -1
  24. package/dist/{onboard-O2gyfB4L.js → onboard-D4uXN5Ec.js} +1 -1
  25. package/dist/{onboard-7JGHJRfj.js → onboard-cB37uVxy.js} +1 -1
  26. package/dist/{onboard-interactive-FWIy0HTu.js → onboard-interactive-CnXgQrpI.js} +1 -1
  27. package/dist/{onboard-interactive-DboEcFKf.js → onboard-interactive-CoFFuSJT.js} +1 -1
  28. package/dist/{onboard-interactive-Gl5J4kVC.js → onboard-interactive-gvfRcLOt.js} +1 -1
  29. package/dist/{onboard-interactive-DqpGicxB.js → onboard-interactive-vwqLS6pe.js} +1 -1
  30. package/dist/{onboarding-Ctq_bdkC.js → onboarding-B9GqKO5L.js} +2 -2
  31. package/dist/{onboarding-hPRXZReM.js → onboarding-DdKW5K8Y.js} +2 -2
  32. package/dist/{onboarding.finalize-Db6smxZL.js → onboarding.finalize-CcuO4Yxw.js} +1 -1
  33. package/dist/{onboarding.finalize-B4Tc4IDN.js → onboarding.finalize-D3mTpOdc.js} +1 -1
  34. package/dist/plugin-sdk/{accounts-Cy3WCbWg.js → accounts-BwreSNAR.js} +1 -1
  35. package/dist/plugin-sdk/{active-listener-DVWVNlT9.js → active-listener-DpQ7aGYd.js} +1 -1
  36. package/dist/plugin-sdk/{agent-scope-DgKN27hJ.js → agent-scope-BQByW0cD.js} +1 -1
  37. package/dist/plugin-sdk/{api-key-rotation-ftXf7mBZ.js → api-key-rotation-7YdImWrh.js} +1 -1
  38. package/dist/plugin-sdk/{audio-preflight-CfTmmeS-.js → audio-preflight-EbkaATDO.js} +1 -1
  39. package/dist/plugin-sdk/{auth-json-BrNBg87n.js → auth-json-DK6qod1_.js} +1 -1
  40. package/dist/plugin-sdk/{bindings-CH-YLOLC.js → bindings-CDEzl4kl.js} +1 -1
  41. package/dist/plugin-sdk/{channel-web-B6rg0Rbf.js → channel-web-D2KuONp0.js} +1 -1
  42. package/dist/plugin-sdk/{chrome-CuXP-hes.js → chrome-SOXFIkUM.js} +1 -1
  43. package/dist/plugin-sdk/{chunk-C94IAOuf.js → chunk-cW0POl22.js} +1 -1
  44. package/dist/plugin-sdk/{command-format-B3XMq_73.js → command-format-CAX9XFjI.js} +1 -1
  45. package/dist/plugin-sdk/{common-n0l_XN-S.js → common-BxEWhN2X.js} +1 -1
  46. package/dist/plugin-sdk/{config-DsXZsCkJ.js → config-v1EU9Ll8.js} +2 -2
  47. package/dist/plugin-sdk/{fetch-B-GxSYRO.js → fetch-DH0Y8iyO.js} +1 -1
  48. package/dist/plugin-sdk/index.js +1 -1
  49. package/dist/plugin-sdk/{login-_my8QwPP.js → login-d1zBgykF.js} +1 -1
  50. package/dist/plugin-sdk/{login-qr-BaePtXuG.js → login-qr-B6exvQnN.js} +1 -1
  51. package/dist/plugin-sdk/{manager-BsC-4ymy.js → manager-BH_bmGds.js} +1 -1
  52. package/dist/plugin-sdk/{markdown-tables-BUfhHgfs.js → markdown-tables-Epim9b-0.js} +1 -1
  53. package/dist/plugin-sdk/{message-channel-CuZ2xOAM.js → message-channel-sBPQc_-T.js} +1 -1
  54. package/dist/plugin-sdk/{model-catalog-yuiXVcmw.js → model-catalog-cXsza5GU.js} +1 -1
  55. package/dist/plugin-sdk/{model-selection-BtgvnqB5.js → model-selection-K82MAGlL.js} +1 -1
  56. package/dist/plugin-sdk/{outbound-D_attiyO.js → outbound-Chn_H1O7.js} +1 -1
  57. package/dist/plugin-sdk/{plugins-BdkC9v5E.js → plugins-CaUOZBVb.js} +1 -1
  58. package/dist/plugin-sdk/{pw-ai-A7Rathx6.js → pw-ai-BIiJF7ZD.js} +1 -1
  59. package/dist/plugin-sdk/{qmd-manager-Dxn0jCpE.js → qmd-manager-BRe5fGZw.js} +1 -1
  60. package/dist/plugin-sdk/{registry-CZHRcH-q.js → registry-DJq2Cvo9.js} +1 -1
  61. package/dist/plugin-sdk/{render-CuA_WRX5.js → render-BUCRXPIk.js} +1 -1
  62. package/dist/plugin-sdk/{replies-DmLfO-pg.js → replies-Cz5OD3qN.js} +1 -1
  63. package/dist/plugin-sdk/{reply-3-ne-N_7.js → reply-D5Uk7pUv.js} +9 -9
  64. package/dist/plugin-sdk/{reply-prefix-w7kAvH11.js → reply-prefix-CCymsmsP.js} +1 -1
  65. package/dist/plugin-sdk/{resolve-route-0sbvl4ZN.js → resolve-route-DN1J7Wyc.js} +1 -1
  66. package/dist/plugin-sdk/{runner-4UfrAQnx.js → runner-CYkuO7Fh.js} +4 -4
  67. package/dist/plugin-sdk/{session-BB-yfDWx.js → session-D5jHDo78.js} +1 -1
  68. package/dist/plugin-sdk/{sqlite-JjFgDV-H.js → sqlite-BlMLqMl8.js} +1 -1
  69. package/dist/plugin-sdk/{subsystem-D0Ril4rt.js → subsystem-COTa5Ly_.js} +1 -1
  70. package/dist/plugin-sdk/{tool-images-WRTP95FT.js → tool-images-DSpchb4x.js} +1 -1
  71. package/dist/plugin-sdk/{tool-loop-detection-sC_rhJfb.js → tool-loop-detection-BP6u-mbh.js} +1 -1
  72. package/dist/plugin-sdk/web-BbganhKi.js +1 -0
  73. package/dist/plugin-sdk/{whatsapp-actions-ThxQ5niy.js → whatsapp-actions-CZUqxmP1.js} +1 -1
  74. package/dist/{program-DHWSgdol.js → program-BgDciyOQ.js} +2 -2
  75. package/dist/{program-context-7XUznN5J.js → program-context-CpxTJP1m.js} +1 -1
  76. package/dist/{prompt-select-styled-Depbcbpw.js → prompt-select-styled-Bu7WPMzB.js} +1 -1
  77. package/dist/{prompt-select-styled-Cy70lEMU.js → prompt-select-styled-Qb0DubNy.js} +1 -1
  78. package/dist/{pw-ai-UGketqfG.js → pw-ai-CsJmJcNk.js} +1 -1
  79. package/dist/{register.maintenance-ohxXhvKX.js → register.maintenance-CPnm6L-m.js} +1 -1
  80. package/dist/{register.maintenance-BmnagkdH.js → register.maintenance-D8WmeEaD.js} +1 -1
  81. package/dist/{register.onboard-C2Cnd-e9.js → register.onboard-BoUicPRh.js} +1 -1
  82. package/dist/{register.onboard-FSaweh3A.js → register.onboard-DMfqe2nX.js} +1 -1
  83. package/dist/{register.setup-CyTZQLXP.js → register.setup-BK6OEvY3.js} +1 -1
  84. package/dist/{register.setup-Dk9hBOkZ.js → register.setup-CtcAR3JR.js} +1 -1
  85. package/dist/{register.subclis-lGgi7ATb.js → register.subclis-Dl6jPPsc.js} +1 -1
  86. package/dist/{register.subclis-DqO3Ciiv.js → register.subclis-EScCVgbV.js} +1 -1
  87. package/dist/{run-main-BipfHjUR.js → run-main-C3lmcvyV.js} +1 -1
  88. package/dist/{runner-B70PGCqP.js → runner-D7af_RBH.js} +3 -3
  89. package/dist/{tui-DHjIJOFN.js → tui-D2sTsa4p.js} +1 -1
  90. package/dist/{tui-C5ChWpBg.js → tui-DY2oYbxk.js} +1 -1
  91. package/dist/{tui-cli-BeFWcUWU.js → tui-cli-GW-qybY6.js} +1 -1
  92. package/dist/{tui-cli-wPseN93O.js → tui-cli-wn3DmvUG.js} +1 -1
  93. package/dist/{update-cli-CRkZnN_N.js → update-cli-CN0oxZ_A.js} +1 -1
  94. package/dist/{update-cli-DekV-CP_.js → update-cli-K5dGZmg8.js} +1 -1
  95. package/dist/{web-D44jKC1F.js → web-DPGGHIc_.js} +1 -1
  96. package/package.json +1 -1
  97. package/dist/chrome-Blk2Jftn.js +0 -4
  98. package/dist/plugin-sdk/web-CThgoHQp.js +0 -1
@@ -1 +1 @@
1
- import{d as readCredsJsonRaw,h as resolveWebCredsPath,l as maybeRestoreCredsFromBackup,m as resolveWebCredsBackupPath,p as resolveDefaultWebAuthDir}from"./accounts-Cy3WCbWg.js";import{K as success,Z as getChildLogger,b as ensureDir,j as resolveUserPath,nt as toPinoLikeLogger,z as danger}from"./registry-CZHRcH-q.js";import{E as VERSION}from"./config-DsXZsCkJ.js";import{t as formatCliCommand}from"./command-format-B3XMq_73.js";import fs from"node:fs";import"node:crypto";import{DisconnectReason,fetchLatestBaileysVersion,makeCacheableSignalKeyStore,makeWASocket,useMultiFileAuthState}from"@whiskeysockets/baileys";import qrcode from"qrcode-terminal";let credsSaveQueue=Promise.resolve();function enqueueSaveCreds(authDir,saveCreds,logger){credsSaveQueue=credsSaveQueue.then(()=>safeSaveCreds(authDir,saveCreds,logger)).catch(err=>{logger.warn({error:String(err)},`WhatsApp creds save queue error`)})}async function safeSaveCreds(authDir,saveCreds,logger){try{let credsPath=resolveWebCredsPath(authDir),backupPath=resolveWebCredsBackupPath(authDir),raw=readCredsJsonRaw(credsPath);if(raw)try{JSON.parse(raw),fs.copyFileSync(credsPath,backupPath);try{fs.chmodSync(backupPath,384)}catch{}}catch{}}catch{}try{await Promise.resolve(saveCreds());try{fs.chmodSync(resolveWebCredsPath(authDir),384)}catch{}}catch(err){logger.warn({error:String(err)},`failed saving WhatsApp creds`)}}async function createWaSocket(printQr,verbose,opts={}){let logger=toPinoLikeLogger(getChildLogger({module:`baileys`},{level:verbose?`info`:`silent`}),verbose?`info`:`silent`),authDir=resolveUserPath(opts.authDir??resolveDefaultWebAuthDir());await ensureDir(authDir);let sessionLogger=getChildLogger({module:`web-session`});maybeRestoreCredsFromBackup(authDir);let{state,saveCreds}=await useMultiFileAuthState(authDir),{version}=await fetchLatestBaileysVersion(),sock=makeWASocket({auth:{creds:state.creds,keys:makeCacheableSignalKeyStore(state.keys,logger)},version,logger,printQRInTerminal:!1,browser:[`builderforce`,`cli`,VERSION],syncFullHistory:!1,markOnlineOnConnect:!1});return sock.ev.on(`creds.update`,()=>enqueueSaveCreds(authDir,saveCreds,sessionLogger)),sock.ev.on(`connection.update`,update=>{try{let{connection,lastDisconnect,qr}=update;qr&&(opts.onQr?.(qr),printQr&&(console.log(`Scan this QR in WhatsApp (Linked Devices):`),qrcode.generate(qr,{small:!0}))),connection===`close`&&getStatusCode(lastDisconnect?.error)===DisconnectReason.loggedOut&&console.error(danger(`WhatsApp session logged out. Run: ${formatCliCommand(`builderforce channels login`)}`)),connection===`open`&&verbose&&console.log(success(`WhatsApp Web connected.`))}catch(err){sessionLogger.error({error:String(err)},`connection.update handler error`)}}),sock.ws&&typeof sock.ws.on==`function`&&sock.ws.on(`error`,err=>{sessionLogger.error({error:String(err)},`WebSocket error`)}),sock}async function waitForWaConnection(sock){return new Promise((resolve,reject)=>{let evWithOff=sock.ev,handler=(...args)=>{let update=args[0]??{};update.connection===`open`&&(evWithOff.off?.(`connection.update`,handler),resolve()),update.connection===`close`&&(evWithOff.off?.(`connection.update`,handler),reject(update.lastDisconnect??Error(`Connection closed`)))};sock.ev.on(`connection.update`,handler)})}function getStatusCode(err){return err?.output?.statusCode??err?.status}function safeStringify(value,limit=800){try{let seen=new WeakSet,raw=JSON.stringify(value,(_key,v)=>{if(typeof v==`bigint`)return v.toString();if(typeof v==`function`){let maybeName=v.name;return`[Function ${typeof maybeName==`string`&&maybeName.length>0?maybeName:`anonymous`}]`}if(typeof v==`object`&&v){if(seen.has(v))return`[Circular]`;seen.add(v)}return v},2);return raw?raw.length>limit?`${raw.slice(0,limit)}…`:raw:String(value)}catch{return String(value)}}function extractBoomDetails(err){if(!err||typeof err!=`object`)return null;let output=err?.output;if(!output||typeof output!=`object`)return null;let payload=output.payload,statusCode=typeof output.statusCode==`number`?output.statusCode:typeof payload?.statusCode==`number`?payload.statusCode:void 0,error=typeof payload?.error==`string`?payload.error:void 0,message=typeof payload?.message==`string`?payload.message:void 0;return!statusCode&&!error&&!message?null:{statusCode,error,message}}function formatError(err){if(err instanceof Error)return err.message;if(typeof err==`string`)return err;if(!err||typeof err!=`object`)return String(err);let boom=extractBoomDetails(err)??extractBoomDetails(err?.error)??extractBoomDetails(err?.lastDisconnect?.error),status=boom?.statusCode??getStatusCode(err),code=err?.code,codeText=typeof code==`string`||typeof code==`number`?String(code):void 0,message=[boom?.message,typeof err?.message==`string`?err.message:void 0,typeof err?.error?.message==`string`?err.error?.message:void 0].filter(v=>!!(v&&v.trim().length>0))[0],pieces=[];return typeof status==`number`&&pieces.push(`status=${status}`),boom?.error&&pieces.push(boom.error),message&&pieces.push(message),codeText&&pieces.push(`code=${codeText}`),pieces.length>0?pieces.join(` `):safeStringify(err)}export{waitForWaConnection as i,formatError as n,getStatusCode as r,createWaSocket as t};
1
+ import{d as readCredsJsonRaw,h as resolveWebCredsPath,l as maybeRestoreCredsFromBackup,m as resolveWebCredsBackupPath,p as resolveDefaultWebAuthDir}from"./accounts-BwreSNAR.js";import{K as success,Z as getChildLogger,b as ensureDir,j as resolveUserPath,nt as toPinoLikeLogger,z as danger}from"./registry-DJq2Cvo9.js";import{E as VERSION}from"./config-v1EU9Ll8.js";import{t as formatCliCommand}from"./command-format-CAX9XFjI.js";import fs from"node:fs";import"node:crypto";import{DisconnectReason,fetchLatestBaileysVersion,makeCacheableSignalKeyStore,makeWASocket,useMultiFileAuthState}from"@whiskeysockets/baileys";import qrcode from"qrcode-terminal";let credsSaveQueue=Promise.resolve();function enqueueSaveCreds(authDir,saveCreds,logger){credsSaveQueue=credsSaveQueue.then(()=>safeSaveCreds(authDir,saveCreds,logger)).catch(err=>{logger.warn({error:String(err)},`WhatsApp creds save queue error`)})}async function safeSaveCreds(authDir,saveCreds,logger){try{let credsPath=resolveWebCredsPath(authDir),backupPath=resolveWebCredsBackupPath(authDir),raw=readCredsJsonRaw(credsPath);if(raw)try{JSON.parse(raw),fs.copyFileSync(credsPath,backupPath);try{fs.chmodSync(backupPath,384)}catch{}}catch{}}catch{}try{await Promise.resolve(saveCreds());try{fs.chmodSync(resolveWebCredsPath(authDir),384)}catch{}}catch(err){logger.warn({error:String(err)},`failed saving WhatsApp creds`)}}async function createWaSocket(printQr,verbose,opts={}){let logger=toPinoLikeLogger(getChildLogger({module:`baileys`},{level:verbose?`info`:`silent`}),verbose?`info`:`silent`),authDir=resolveUserPath(opts.authDir??resolveDefaultWebAuthDir());await ensureDir(authDir);let sessionLogger=getChildLogger({module:`web-session`});maybeRestoreCredsFromBackup(authDir);let{state,saveCreds}=await useMultiFileAuthState(authDir),{version}=await fetchLatestBaileysVersion(),sock=makeWASocket({auth:{creds:state.creds,keys:makeCacheableSignalKeyStore(state.keys,logger)},version,logger,printQRInTerminal:!1,browser:[`builderforce`,`cli`,VERSION],syncFullHistory:!1,markOnlineOnConnect:!1});return sock.ev.on(`creds.update`,()=>enqueueSaveCreds(authDir,saveCreds,sessionLogger)),sock.ev.on(`connection.update`,update=>{try{let{connection,lastDisconnect,qr}=update;qr&&(opts.onQr?.(qr),printQr&&(console.log(`Scan this QR in WhatsApp (Linked Devices):`),qrcode.generate(qr,{small:!0}))),connection===`close`&&getStatusCode(lastDisconnect?.error)===DisconnectReason.loggedOut&&console.error(danger(`WhatsApp session logged out. Run: ${formatCliCommand(`builderforce channels login`)}`)),connection===`open`&&verbose&&console.log(success(`WhatsApp Web connected.`))}catch(err){sessionLogger.error({error:String(err)},`connection.update handler error`)}}),sock.ws&&typeof sock.ws.on==`function`&&sock.ws.on(`error`,err=>{sessionLogger.error({error:String(err)},`WebSocket error`)}),sock}async function waitForWaConnection(sock){return new Promise((resolve,reject)=>{let evWithOff=sock.ev,handler=(...args)=>{let update=args[0]??{};update.connection===`open`&&(evWithOff.off?.(`connection.update`,handler),resolve()),update.connection===`close`&&(evWithOff.off?.(`connection.update`,handler),reject(update.lastDisconnect??Error(`Connection closed`)))};sock.ev.on(`connection.update`,handler)})}function getStatusCode(err){return err?.output?.statusCode??err?.status}function safeStringify(value,limit=800){try{let seen=new WeakSet,raw=JSON.stringify(value,(_key,v)=>{if(typeof v==`bigint`)return v.toString();if(typeof v==`function`){let maybeName=v.name;return`[Function ${typeof maybeName==`string`&&maybeName.length>0?maybeName:`anonymous`}]`}if(typeof v==`object`&&v){if(seen.has(v))return`[Circular]`;seen.add(v)}return v},2);return raw?raw.length>limit?`${raw.slice(0,limit)}…`:raw:String(value)}catch{return String(value)}}function extractBoomDetails(err){if(!err||typeof err!=`object`)return null;let output=err?.output;if(!output||typeof output!=`object`)return null;let payload=output.payload,statusCode=typeof output.statusCode==`number`?output.statusCode:typeof payload?.statusCode==`number`?payload.statusCode:void 0,error=typeof payload?.error==`string`?payload.error:void 0,message=typeof payload?.message==`string`?payload.message:void 0;return!statusCode&&!error&&!message?null:{statusCode,error,message}}function formatError(err){if(err instanceof Error)return err.message;if(typeof err==`string`)return err;if(!err||typeof err!=`object`)return String(err);let boom=extractBoomDetails(err)??extractBoomDetails(err?.error)??extractBoomDetails(err?.lastDisconnect?.error),status=boom?.statusCode??getStatusCode(err),code=err?.code,codeText=typeof code==`string`||typeof code==`number`?String(code):void 0,message=[boom?.message,typeof err?.message==`string`?err.message:void 0,typeof err?.error?.message==`string`?err.error?.message:void 0].filter(v=>!!(v&&v.trim().length>0))[0],pieces=[];return typeof status==`number`&&pieces.push(`status=${status}`),boom?.error&&pieces.push(boom.error),message&&pieces.push(message),codeText&&pieces.push(`code=${codeText}`),pieces.length>0?pieces.join(` `):safeStringify(err)}export{waitForWaConnection as i,formatError as n,getStatusCode as r,createWaSocket as t};
@@ -1,4 +1,4 @@
1
- import{t as createSubsystemLogger}from"./subsystem-D0Ril4rt.js";import{C as resolveWorkspaceFilePath,S as resolveAgentRuntimeDir}from"./agent-scope-DgKN27hJ.js";import{t as redactSensitiveText}from"./redact-Bv8wnIZm.js";import{o as resolveSessionTranscriptsDirForAgent}from"./paths-DtbnCdO7.js";import{createRequire}from"node:module";import path from"node:path";import fs from"node:fs";import crypto from"node:crypto";import fs$1 from"node:fs/promises";async function runTasksWithConcurrency(params){let{tasks,limit,onTaskError}=params,errorMode=params.errorMode??`continue`;if(tasks.length===0)return{results:[],firstError:void 0,hasError:!1};let resolvedLimit=Math.max(1,Math.min(limit,tasks.length)),results=Array.from({length:tasks.length}),next=0,firstError,hasError=!1,workers=Array.from({length:resolvedLimit},async()=>{for(;;){if(errorMode===`stop`&&hasError)return;let index=next;if(next+=1,index>=tasks.length)return;try{results[index]=await tasks[index]()}catch(error){if(hasError||=(firstError=error,!0),onTaskError?.(error,index),errorMode===`stop`)return}}});return await Promise.allSettled(workers),{results,firstError,hasError}}function ensureDir(dir){try{fs.mkdirSync(dir,{recursive:!0})}catch{}return dir}function normalizeRelPath(value){return value.trim().replace(/^[./]+/,``).replace(/\\/g,`/`)}function normalizeExtraMemoryPaths(workspaceDir,extraPaths){if(!extraPaths?.length)return[];let resolved=extraPaths.map(value=>value.trim()).filter(Boolean).map(value=>path.isAbsolute(value)?path.resolve(value):path.resolve(workspaceDir,value));return Array.from(new Set(resolved))}function getLegacyMemoryDir(workspaceDir){return path.join(workspaceDir,`memory`)}function getCanonicalMemoryDir(workspaceDir){return path.join(resolveAgentRuntimeDir(workspaceDir),`memory`)}function getDefaultMemoryDirs(workspaceDir){return[getLegacyMemoryDir(workspaceDir),getCanonicalMemoryDir(workspaceDir)]}function getDefaultMemoryFilePaths(workspaceDir){return[resolveWorkspaceFilePath(workspaceDir,`MEMORY.md`),resolveWorkspaceFilePath(workspaceDir,`memory.md`)]}function getDefaultMemoryWatchPatterns(workspaceDir){let files=getDefaultMemoryFilePaths(workspaceDir),dirs=getDefaultMemoryDirs(workspaceDir),patterns=[];patterns.push(...files);for(let d of dirs)patterns.push(path.join(d,`**`,`*.md`));return patterns}function isMemoryPath(relPath){let normalized=normalizeRelPath(relPath);return normalized?normalized===`MEMORY.md`||normalized===`memory.md`?!0:normalized===`memory`||normalized.startsWith(`memory/`)||normalized.startsWith(`.builderforce/memory/`):!1}async function walkDir(dir,files){let entries=await fs$1.readdir(dir,{withFileTypes:!0});for(let entry of entries){let full=path.join(dir,entry.name);if(!entry.isSymbolicLink()){if(entry.isDirectory()){await walkDir(full,files);continue}entry.isFile()&&entry.name.endsWith(`.md`)&&files.push(full)}}}async function listMemoryFiles(workspaceDir,extraPaths){let result=[],[memoryFile,altMemoryFile]=getDefaultMemoryFilePaths(workspaceDir),[legacyDir,canonicalDir]=getDefaultMemoryDirs(workspaceDir),addMarkdownFile=async absPath=>{try{let stat=await fs$1.lstat(absPath);if(stat.isSymbolicLink()||!stat.isFile()||!absPath.endsWith(`.md`))return;result.push(absPath)}catch{}};await addMarkdownFile(memoryFile),await addMarkdownFile(altMemoryFile);let dirsToScan=[legacyDir,canonicalDir];for(let dir of dirsToScan)try{let dirStat=await fs$1.lstat(dir);!dirStat.isSymbolicLink()&&dirStat.isDirectory()&&await walkDir(dir,result)}catch{}let normalizedExtraPaths=normalizeExtraMemoryPaths(workspaceDir,extraPaths);if(normalizedExtraPaths.length>0)for(let inputPath of normalizedExtraPaths)try{let stat=await fs$1.lstat(inputPath);if(stat.isSymbolicLink())continue;if(stat.isDirectory()){await walkDir(inputPath,result);continue}stat.isFile()&&inputPath.endsWith(`.md`)&&result.push(inputPath)}catch{}if(result.length<=1)return result;let seen=new Set,deduped=[];for(let entry of result){let key=entry;try{key=await fs$1.realpath(entry)}catch{}seen.has(key)||(seen.add(key),deduped.push(entry))}return deduped}function hashText(value){return crypto.createHash(`sha256`).update(value).digest(`hex`)}async function buildFileEntry(absPath,workspaceDir){let stat=await fs$1.stat(absPath),hash=hashText(await fs$1.readFile(absPath,`utf-8`));return{path:path.relative(workspaceDir,absPath).replace(/\\/g,`/`),absPath,mtimeMs:stat.mtimeMs,size:stat.size,hash}}function chunkMarkdown(content,chunking){let lines=content.split(`
1
+ import{t as createSubsystemLogger}from"./subsystem-COTa5Ly_.js";import{C as resolveWorkspaceFilePath,S as resolveAgentRuntimeDir}from"./agent-scope-BQByW0cD.js";import{t as redactSensitiveText}from"./redact-Bv8wnIZm.js";import{o as resolveSessionTranscriptsDirForAgent}from"./paths-DtbnCdO7.js";import{createRequire}from"node:module";import path from"node:path";import fs from"node:fs";import crypto from"node:crypto";import fs$1 from"node:fs/promises";async function runTasksWithConcurrency(params){let{tasks,limit,onTaskError}=params,errorMode=params.errorMode??`continue`;if(tasks.length===0)return{results:[],firstError:void 0,hasError:!1};let resolvedLimit=Math.max(1,Math.min(limit,tasks.length)),results=Array.from({length:tasks.length}),next=0,firstError,hasError=!1,workers=Array.from({length:resolvedLimit},async()=>{for(;;){if(errorMode===`stop`&&hasError)return;let index=next;if(next+=1,index>=tasks.length)return;try{results[index]=await tasks[index]()}catch(error){if(hasError||=(firstError=error,!0),onTaskError?.(error,index),errorMode===`stop`)return}}});return await Promise.allSettled(workers),{results,firstError,hasError}}function ensureDir(dir){try{fs.mkdirSync(dir,{recursive:!0})}catch{}return dir}function normalizeRelPath(value){return value.trim().replace(/^[./]+/,``).replace(/\\/g,`/`)}function normalizeExtraMemoryPaths(workspaceDir,extraPaths){if(!extraPaths?.length)return[];let resolved=extraPaths.map(value=>value.trim()).filter(Boolean).map(value=>path.isAbsolute(value)?path.resolve(value):path.resolve(workspaceDir,value));return Array.from(new Set(resolved))}function getLegacyMemoryDir(workspaceDir){return path.join(workspaceDir,`memory`)}function getCanonicalMemoryDir(workspaceDir){return path.join(resolveAgentRuntimeDir(workspaceDir),`memory`)}function getDefaultMemoryDirs(workspaceDir){return[getLegacyMemoryDir(workspaceDir),getCanonicalMemoryDir(workspaceDir)]}function getDefaultMemoryFilePaths(workspaceDir){return[resolveWorkspaceFilePath(workspaceDir,`MEMORY.md`),resolveWorkspaceFilePath(workspaceDir,`memory.md`)]}function getDefaultMemoryWatchPatterns(workspaceDir){let files=getDefaultMemoryFilePaths(workspaceDir),dirs=getDefaultMemoryDirs(workspaceDir),patterns=[];patterns.push(...files);for(let d of dirs)patterns.push(path.join(d,`**`,`*.md`));return patterns}function isMemoryPath(relPath){let normalized=normalizeRelPath(relPath);return normalized?normalized===`MEMORY.md`||normalized===`memory.md`?!0:normalized===`memory`||normalized.startsWith(`memory/`)||normalized.startsWith(`.builderforce/memory/`):!1}async function walkDir(dir,files){let entries=await fs$1.readdir(dir,{withFileTypes:!0});for(let entry of entries){let full=path.join(dir,entry.name);if(!entry.isSymbolicLink()){if(entry.isDirectory()){await walkDir(full,files);continue}entry.isFile()&&entry.name.endsWith(`.md`)&&files.push(full)}}}async function listMemoryFiles(workspaceDir,extraPaths){let result=[],[memoryFile,altMemoryFile]=getDefaultMemoryFilePaths(workspaceDir),[legacyDir,canonicalDir]=getDefaultMemoryDirs(workspaceDir),addMarkdownFile=async absPath=>{try{let stat=await fs$1.lstat(absPath);if(stat.isSymbolicLink()||!stat.isFile()||!absPath.endsWith(`.md`))return;result.push(absPath)}catch{}};await addMarkdownFile(memoryFile),await addMarkdownFile(altMemoryFile);let dirsToScan=[legacyDir,canonicalDir];for(let dir of dirsToScan)try{let dirStat=await fs$1.lstat(dir);!dirStat.isSymbolicLink()&&dirStat.isDirectory()&&await walkDir(dir,result)}catch{}let normalizedExtraPaths=normalizeExtraMemoryPaths(workspaceDir,extraPaths);if(normalizedExtraPaths.length>0)for(let inputPath of normalizedExtraPaths)try{let stat=await fs$1.lstat(inputPath);if(stat.isSymbolicLink())continue;if(stat.isDirectory()){await walkDir(inputPath,result);continue}stat.isFile()&&inputPath.endsWith(`.md`)&&result.push(inputPath)}catch{}if(result.length<=1)return result;let seen=new Set,deduped=[];for(let entry of result){let key=entry;try{key=await fs$1.realpath(entry)}catch{}seen.has(key)||(seen.add(key),deduped.push(entry))}return deduped}function hashText(value){return crypto.createHash(`sha256`).update(value).digest(`hex`)}async function buildFileEntry(absPath,workspaceDir){let stat=await fs$1.stat(absPath),hash=hashText(await fs$1.readFile(absPath,`utf-8`));return{path:path.relative(workspaceDir,absPath).replace(/\\/g,`/`),absPath,mtimeMs:stat.mtimeMs,size:stat.size,hash}}function chunkMarkdown(content,chunking){let lines=content.split(`
2
2
  `);if(lines.length===0)return[];let maxChars=Math.max(32,chunking.tokens*4),overlapChars=Math.max(0,chunking.overlap*4),chunks=[],current=[],currentChars=0,flush=()=>{if(current.length===0)return;let firstEntry=current[0],lastEntry=current[current.length-1];if(!firstEntry||!lastEntry)return;let text=current.map(entry=>entry.line).join(`
3
3
  `),startLine=firstEntry.lineNo,endLine=lastEntry.lineNo;chunks.push({startLine,endLine,text,hash:hashText(text)})},carryOverlap=()=>{if(overlapChars<=0||current.length===0){current=[],currentChars=0;return}let acc=0,kept=[];for(let i=current.length-1;i>=0;--i){let entry=current[i];if(entry&&(acc+=entry.line.length+1,kept.unshift(entry),acc>=overlapChars))break}current=kept,currentChars=kept.reduce((sum,entry)=>sum+entry.line.length+1,0)};for(let i=0;i<lines.length;i+=1){let line=lines[i]??``,lineNo=i+1,segments=[];if(line.length===0)segments.push(``);else for(let start=0;start<line.length;start+=maxChars)segments.push(line.slice(start,start+maxChars));for(let segment of segments){let lineSize=segment.length+1;currentChars+lineSize>maxChars&&current.length>0&&(flush(),carryOverlap()),current.push({line:segment,lineNo}),currentChars+=lineSize}}return flush(),chunks}function remapChunkLines(chunks,lineMap){if(!(!lineMap||lineMap.length===0))for(let chunk of chunks)chunk.startLine=lineMap[chunk.startLine-1]??chunk.startLine,chunk.endLine=lineMap[chunk.endLine-1]??chunk.endLine}function parseEmbedding(raw){try{let parsed=JSON.parse(raw);return Array.isArray(parsed)?parsed:[]}catch{return[]}}async function runWithConcurrency(tasks,limit){let{results,firstError,hasError}=await runTasksWithConcurrency({tasks,limit,errorMode:`stop`});if(hasError)throw firstError;return results}const log=createSubsystemLogger(`memory`);async function listSessionFilesForAgent(agentId){let dir=resolveSessionTranscriptsDirForAgent(agentId);try{return(await fs$1.readdir(dir,{withFileTypes:!0})).filter(entry=>entry.isFile()).map(entry=>entry.name).filter(name=>name.endsWith(`.jsonl`)).map(name=>path.join(dir,name))}catch{return[]}}function sessionPathForFile(absPath){return path.join(`sessions`,path.basename(absPath)).replace(/\\/g,`/`)}function normalizeSessionText(value){return value.replace(/\s*\n+\s*/g,` `).replace(/\s+/g,` `).trim()}function extractSessionText(content){if(typeof content==`string`)return normalizeSessionText(content)||null;if(!Array.isArray(content))return null;let parts=[];for(let block of content){if(!block||typeof block!=`object`)continue;let record=block;if(record.type!==`text`||typeof record.text!=`string`)continue;let normalized=normalizeSessionText(record.text);normalized&&parts.push(normalized)}return parts.length===0?null:parts.join(` `)}async function buildSessionEntry(absPath){try{let stat=await fs$1.stat(absPath),lines=(await fs$1.readFile(absPath,`utf-8`)).split(`
4
4
  `),collected=[],lineMap=[];for(let jsonlIdx=0;jsonlIdx<lines.length;jsonlIdx++){let line=lines[jsonlIdx];if(!line.trim())continue;let record;try{record=JSON.parse(line)}catch{continue}if(!record||typeof record!=`object`||record.type!==`message`)continue;let message=record.message;if(!message||typeof message.role!=`string`||message.role!==`user`&&message.role!==`assistant`)continue;let text=extractSessionText(message.content);if(!text)continue;let safe=redactSensitiveText(text,{mode:`tools`}),label=message.role===`user`?`User`:`Assistant`;collected.push(`${label}: ${safe}`),lineMap.push(jsonlIdx+1)}let content=collected.join(`
@@ -1 +1 @@
1
- import{$ as isFileLogLevelEnabled,V as isVerbose,Z as getChildLogger,at as normalizeLogLevel,it as levelToMinLevel,n as CHAT_CHANNEL_ORDER,ot as readLoggingConfig,rt as loggingState}from"./registry-CZHRcH-q.js";import{createRequire}from"node:module";import{Chalk}from"chalk";import"node:util";let activeStream=null;function registerActiveProgressLine(stream){stream.isTTY&&(activeStream=stream)}function clearActiveProgressLine(){activeStream?.isTTY&&activeStream.write(`\r\x1B[2K`)}function unregisterActiveProgressLine(stream){activeStream&&(stream&&activeStream!==stream||(activeStream=null))}function reportRestoreFailure(scope,err,reason){let suffix=reason?` (${reason})`:``,message=`[terminal] restore ${scope} failed${suffix}: ${String(err)}`;try{process.stderr.write(`${message}\n`)}catch(writeErr){console.error(`[terminal] restore reporting failed${suffix}: ${String(writeErr)}`)}}function restoreTerminalState(reason,options={}){let resumeStdin=options.resumeStdinIfPaused??options.resumeStdin??!1;try{clearActiveProgressLine()}catch(err){reportRestoreFailure(`progress line`,err,reason)}let stdin=process.stdin;if(stdin.isTTY&&typeof stdin.setRawMode==`function`){try{stdin.setRawMode(!1)}catch(err){reportRestoreFailure(`raw mode`,err,reason)}if(resumeStdin&&typeof stdin.isPaused==`function`&&stdin.isPaused())try{stdin.resume()}catch(err){reportRestoreFailure(`stdin resume`,err,reason)}}if(process.stdout.isTTY)try{process.stdout.write(`\x1B[0m\x1B[?25h\x1B[?1000l\x1B[?1002l\x1B[?1003l\x1B[?1006l\x1B[?2004l`)}catch(err){reportRestoreFailure(`stdout reset`,err,reason)}}function shouldEmitRuntimeLog(env=process.env){return env.VITEST!==`true`||env.BUILDERFORCE_AGENTS_TEST_RUNTIME_LOG===`1`?!0:typeof console.log.mock==`object`}function createRuntimeIo(){return{log:(...args)=>{shouldEmitRuntimeLog()&&(clearActiveProgressLine(),console.log(...args))},error:(...args)=>{clearActiveProgressLine(),console.error(...args)}}}const defaultRuntime={...createRuntimeIo(),exit:code=>{throw restoreTerminalState(`runtime exit`,{resumeStdinIfPaused:!1}),process.exit(code),Error(`unreachable`)}};function createNonExitingRuntime(){return{...createRuntimeIo(),exit:code=>{throw Error(`exit ${code}`)}}}const ANSI_SGR_PATTERN=`\\x1b\\[[0-9;]*m`,OSC8_PATTERN=`\\x1b\\]8;;.*?\\x1b\\\\|\\x1b\\]8;;\\x1b\\\\`,ANSI_REGEX=new RegExp(ANSI_SGR_PATTERN,`g`),OSC8_REGEX=new RegExp(OSC8_PATTERN,`g`);function stripAnsi(input){return input.replace(OSC8_REGEX,``).replace(ANSI_REGEX,``)}RegExp(`${OSC8_PATTERN}|${ANSI_SGR_PATTERN}`,`g`);const requireConfig=createRequire(import.meta.url);let loadConfigFallback=()=>{try{return requireConfig(`../config/config.js`).loadConfig?.().logging}catch{return}};function normalizeConsoleLevel(level){return isVerbose()?`debug`:!level&&process.env.VITEST===`true`&&process.env.BUILDERFORCE_AGENTS_TEST_CONSOLE!==`1`?`silent`:normalizeLogLevel(level,`info`)}function normalizeConsoleStyle(style){return style===`compact`||style===`json`||style===`pretty`?style:process.stdout.isTTY?`pretty`:`compact`}function resolveConsoleSettings(){let cfg=loggingState.overrideSettings??readLoggingConfig();if(!cfg)if(loggingState.resolvingConsoleSettings)cfg=void 0;else{loggingState.resolvingConsoleSettings=!0;try{cfg=loadConfigFallback()}finally{loggingState.resolvingConsoleSettings=!1}}return{level:normalizeConsoleLevel(cfg?.consoleLevel),style:normalizeConsoleStyle(cfg?.consoleStyle)}}function consoleSettingsChanged(a,b){return a?a.level!==b.level||a.style!==b.style:!0}function getConsoleSettings(){let settings=resolveConsoleSettings(),cached=loggingState.cachedConsoleSettings;return(!cached||consoleSettingsChanged(cached,settings))&&(loggingState.cachedConsoleSettings=settings),loggingState.cachedConsoleSettings}function shouldLogSubsystemToConsole(subsystem){let filter=loggingState.consoleSubsystemFilter;return!filter||filter.length===0?!0:filter.some(prefix=>subsystem===prefix||subsystem.startsWith(`${prefix}/`))}function shouldLogToConsole(level,settings){return settings.level===`silent`?!1:levelToMinLevel(level)<=levelToMinLevel(settings.level)}function isRichConsoleEnv(){let term=(process.env.TERM??``).toLowerCase();return process.env.COLORTERM||process.env.TERM_PROGRAM?!0:term.length>0&&term!==`dumb`}function getColorForConsole(){let hasForceColor=typeof process.env.FORCE_COLOR==`string`&&process.env.FORCE_COLOR.trim().length>0&&process.env.FORCE_COLOR.trim()!==`0`;return process.env.NO_COLOR&&!hasForceColor?new Chalk({level:0}):process.stdout.isTTY||process.stderr.isTTY||isRichConsoleEnv()?new Chalk({level:1}):new Chalk({level:0})}const SUBSYSTEM_COLORS=[`cyan`,`green`,`yellow`,`blue`,`magenta`,`red`],SUBSYSTEM_COLOR_OVERRIDES={"gmail-watcher":`blue`},SUBSYSTEM_PREFIXES_TO_DROP=[`gateway`,`channels`,`providers`],CHANNEL_SUBSYSTEM_PREFIXES=new Set(CHAT_CHANNEL_ORDER);function pickSubsystemColor(color,subsystem){let override=SUBSYSTEM_COLOR_OVERRIDES[subsystem];if(override)return color[override];let hash=0;for(let i=0;i<subsystem.length;i+=1)hash=hash*31+subsystem.charCodeAt(i)|0;return color[SUBSYSTEM_COLORS[Math.abs(hash)%SUBSYSTEM_COLORS.length]]}function formatSubsystemForConsole(subsystem){let parts=subsystem.split(`/`).filter(Boolean),original=parts.join(`/`)||subsystem;for(;parts.length>0&&SUBSYSTEM_PREFIXES_TO_DROP.includes(parts[0]);)parts.shift();return parts.length===0?original:CHANNEL_SUBSYSTEM_PREFIXES.has(parts[0])?parts[0]:parts.length>2?parts.slice(-2).join(`/`):parts.join(`/`)}function stripRedundantSubsystemPrefixForConsole(message,displaySubsystem){if(!displaySubsystem)return message;if(message.startsWith(`[`)){let closeIdx=message.indexOf(`]`);if(closeIdx>1&&message.slice(1,closeIdx).toLowerCase()===displaySubsystem.toLowerCase()){let i=closeIdx+1;for(;message[i]===` `;)i+=1;return message.slice(i)}}if(message.slice(0,displaySubsystem.length).toLowerCase()!==displaySubsystem.toLowerCase())return message;let next=message.slice(displaySubsystem.length,displaySubsystem.length+1);if(next!==`:`&&next!==` `)return message;let i=displaySubsystem.length;for(;message[i]===` `;)i+=1;for(message[i]===`:`&&(i+=1);message[i]===` `;)i+=1;return message.slice(i)}function formatConsoleLine(opts){let displaySubsystem=opts.style===`json`?opts.subsystem:formatSubsystemForConsole(opts.subsystem);if(opts.style===`json`)return JSON.stringify({time:new Date().toISOString(),level:opts.level,subsystem:displaySubsystem,message:opts.message,...opts.meta});let color=getColorForConsole(),prefix=`[${displaySubsystem}]`,prefixColor=pickSubsystemColor(color,displaySubsystem),levelColor=opts.level===`error`||opts.level===`fatal`?color.red:opts.level===`warn`?color.yellow:opts.level===`debug`||opts.level===`trace`?color.gray:color.cyan,displayMessage=stripRedundantSubsystemPrefixForConsole(opts.message,displaySubsystem);return`${[opts.style===`pretty`?color.gray(new Date().toISOString().slice(11,19)):loggingState.consoleTimestampPrefix?color.gray(new Date().toISOString()):``,prefixColor(prefix)].filter(Boolean).join(` `)} ${levelColor(displayMessage)}`}function writeConsoleLine(level,line){clearActiveProgressLine();let sanitized=process.platform===`win32`&&process.env.GITHUB_ACTIONS===`true`?line.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,`?`).replace(/[\uD800-\uDFFF]/g,`?`):line,sink=loggingState.rawConsole??console;loggingState.forceConsoleToStderr||level===`error`||level===`fatal`?(sink.error??console.error)(sanitized):level===`warn`?(sink.warn??console.warn)(sanitized):(sink.log??console.log)(sanitized)}function logToFile(fileLogger,level,message,meta){if(level===`silent`)return;let method=fileLogger[level];typeof method==`function`&&(meta&&Object.keys(meta).length>0?method.call(fileLogger,meta,message):method.call(fileLogger,message))}function createSubsystemLogger(subsystem){let fileLogger=null,getFileLogger=()=>(fileLogger||=getChildLogger({subsystem}),fileLogger),emit=(level,message,meta)=>{let consoleSettings=getConsoleSettings(),consoleMessageOverride,fileMeta=meta;if(meta&&Object.keys(meta).length>0){let{consoleMessage,...rest}=meta;typeof consoleMessage==`string`&&(consoleMessageOverride=consoleMessage),fileMeta=Object.keys(rest).length>0?rest:void 0}if(logToFile(getFileLogger(),level,message,fileMeta),!shouldLogToConsole(level,{level:consoleSettings.level})||!shouldLogSubsystemToConsole(subsystem))return;let consoleMessage=consoleMessageOverride??message;!isVerbose()&&subsystem===`agent/embedded`&&/(sessionId|runId)=probe-/.test(consoleMessage)||writeConsoleLine(level,formatConsoleLine({level,subsystem,message:consoleSettings.style===`json`?message:consoleMessage,style:consoleSettings.style,meta:fileMeta}))},isConsoleEnabled=level=>shouldLogToConsole(level,{level:getConsoleSettings().level})&&shouldLogSubsystemToConsole(subsystem),isFileEnabled=level=>isFileLogLevelEnabled(level);return{subsystem,isEnabled:(level,target=`any`)=>target===`console`?isConsoleEnabled(level):target===`file`?isFileEnabled(level):isConsoleEnabled(level)||isFileEnabled(level),trace:(message,meta)=>emit(`trace`,message,meta),debug:(message,meta)=>emit(`debug`,message,meta),info:(message,meta)=>emit(`info`,message,meta),warn:(message,meta)=>emit(`warn`,message,meta),error:(message,meta)=>emit(`error`,message,meta),fatal:(message,meta)=>emit(`fatal`,message,meta),raw:message=>{if(logToFile(getFileLogger(),`info`,message,{raw:!0}),shouldLogSubsystemToConsole(subsystem)){if(!isVerbose()&&subsystem===`agent/embedded`&&/(sessionId|runId)=probe-/.test(message))return;writeConsoleLine(`info`,message)}},child:name=>createSubsystemLogger(`${subsystem}/${name}`)}}export{clearActiveProgressLine as a,defaultRuntime as i,stripAnsi as n,registerActiveProgressLine as o,createNonExitingRuntime as r,unregisterActiveProgressLine as s,createSubsystemLogger as t};
1
+ import{$ as isFileLogLevelEnabled,V as isVerbose,Z as getChildLogger,at as normalizeLogLevel,it as levelToMinLevel,n as CHAT_CHANNEL_ORDER,ot as readLoggingConfig,rt as loggingState}from"./registry-DJq2Cvo9.js";import{createRequire}from"node:module";import{Chalk}from"chalk";import"node:util";let activeStream=null;function registerActiveProgressLine(stream){stream.isTTY&&(activeStream=stream)}function clearActiveProgressLine(){activeStream?.isTTY&&activeStream.write(`\r\x1B[2K`)}function unregisterActiveProgressLine(stream){activeStream&&(stream&&activeStream!==stream||(activeStream=null))}function reportRestoreFailure(scope,err,reason){let suffix=reason?` (${reason})`:``,message=`[terminal] restore ${scope} failed${suffix}: ${String(err)}`;try{process.stderr.write(`${message}\n`)}catch(writeErr){console.error(`[terminal] restore reporting failed${suffix}: ${String(writeErr)}`)}}function restoreTerminalState(reason,options={}){let resumeStdin=options.resumeStdinIfPaused??options.resumeStdin??!1;try{clearActiveProgressLine()}catch(err){reportRestoreFailure(`progress line`,err,reason)}let stdin=process.stdin;if(stdin.isTTY&&typeof stdin.setRawMode==`function`){try{stdin.setRawMode(!1)}catch(err){reportRestoreFailure(`raw mode`,err,reason)}if(resumeStdin&&typeof stdin.isPaused==`function`&&stdin.isPaused())try{stdin.resume()}catch(err){reportRestoreFailure(`stdin resume`,err,reason)}}if(process.stdout.isTTY)try{process.stdout.write(`\x1B[0m\x1B[?25h\x1B[?1000l\x1B[?1002l\x1B[?1003l\x1B[?1006l\x1B[?2004l`)}catch(err){reportRestoreFailure(`stdout reset`,err,reason)}}function shouldEmitRuntimeLog(env=process.env){return env.VITEST!==`true`||env.BUILDERFORCE_AGENTS_TEST_RUNTIME_LOG===`1`?!0:typeof console.log.mock==`object`}function createRuntimeIo(){return{log:(...args)=>{shouldEmitRuntimeLog()&&(clearActiveProgressLine(),console.log(...args))},error:(...args)=>{clearActiveProgressLine(),console.error(...args)}}}const defaultRuntime={...createRuntimeIo(),exit:code=>{throw restoreTerminalState(`runtime exit`,{resumeStdinIfPaused:!1}),process.exit(code),Error(`unreachable`)}};function createNonExitingRuntime(){return{...createRuntimeIo(),exit:code=>{throw Error(`exit ${code}`)}}}const ANSI_SGR_PATTERN=`\\x1b\\[[0-9;]*m`,OSC8_PATTERN=`\\x1b\\]8;;.*?\\x1b\\\\|\\x1b\\]8;;\\x1b\\\\`,ANSI_REGEX=new RegExp(ANSI_SGR_PATTERN,`g`),OSC8_REGEX=new RegExp(OSC8_PATTERN,`g`);function stripAnsi(input){return input.replace(OSC8_REGEX,``).replace(ANSI_REGEX,``)}RegExp(`${OSC8_PATTERN}|${ANSI_SGR_PATTERN}`,`g`);const requireConfig=createRequire(import.meta.url);let loadConfigFallback=()=>{try{return requireConfig(`../config/config.js`).loadConfig?.().logging}catch{return}};function normalizeConsoleLevel(level){return isVerbose()?`debug`:!level&&process.env.VITEST===`true`&&process.env.BUILDERFORCE_AGENTS_TEST_CONSOLE!==`1`?`silent`:normalizeLogLevel(level,`info`)}function normalizeConsoleStyle(style){return style===`compact`||style===`json`||style===`pretty`?style:process.stdout.isTTY?`pretty`:`compact`}function resolveConsoleSettings(){let cfg=loggingState.overrideSettings??readLoggingConfig();if(!cfg)if(loggingState.resolvingConsoleSettings)cfg=void 0;else{loggingState.resolvingConsoleSettings=!0;try{cfg=loadConfigFallback()}finally{loggingState.resolvingConsoleSettings=!1}}return{level:normalizeConsoleLevel(cfg?.consoleLevel),style:normalizeConsoleStyle(cfg?.consoleStyle)}}function consoleSettingsChanged(a,b){return a?a.level!==b.level||a.style!==b.style:!0}function getConsoleSettings(){let settings=resolveConsoleSettings(),cached=loggingState.cachedConsoleSettings;return(!cached||consoleSettingsChanged(cached,settings))&&(loggingState.cachedConsoleSettings=settings),loggingState.cachedConsoleSettings}function shouldLogSubsystemToConsole(subsystem){let filter=loggingState.consoleSubsystemFilter;return!filter||filter.length===0?!0:filter.some(prefix=>subsystem===prefix||subsystem.startsWith(`${prefix}/`))}function shouldLogToConsole(level,settings){return settings.level===`silent`?!1:levelToMinLevel(level)<=levelToMinLevel(settings.level)}function isRichConsoleEnv(){let term=(process.env.TERM??``).toLowerCase();return process.env.COLORTERM||process.env.TERM_PROGRAM?!0:term.length>0&&term!==`dumb`}function getColorForConsole(){let hasForceColor=typeof process.env.FORCE_COLOR==`string`&&process.env.FORCE_COLOR.trim().length>0&&process.env.FORCE_COLOR.trim()!==`0`;return process.env.NO_COLOR&&!hasForceColor?new Chalk({level:0}):process.stdout.isTTY||process.stderr.isTTY||isRichConsoleEnv()?new Chalk({level:1}):new Chalk({level:0})}const SUBSYSTEM_COLORS=[`cyan`,`green`,`yellow`,`blue`,`magenta`,`red`],SUBSYSTEM_COLOR_OVERRIDES={"gmail-watcher":`blue`},SUBSYSTEM_PREFIXES_TO_DROP=[`gateway`,`channels`,`providers`],CHANNEL_SUBSYSTEM_PREFIXES=new Set(CHAT_CHANNEL_ORDER);function pickSubsystemColor(color,subsystem){let override=SUBSYSTEM_COLOR_OVERRIDES[subsystem];if(override)return color[override];let hash=0;for(let i=0;i<subsystem.length;i+=1)hash=hash*31+subsystem.charCodeAt(i)|0;return color[SUBSYSTEM_COLORS[Math.abs(hash)%SUBSYSTEM_COLORS.length]]}function formatSubsystemForConsole(subsystem){let parts=subsystem.split(`/`).filter(Boolean),original=parts.join(`/`)||subsystem;for(;parts.length>0&&SUBSYSTEM_PREFIXES_TO_DROP.includes(parts[0]);)parts.shift();return parts.length===0?original:CHANNEL_SUBSYSTEM_PREFIXES.has(parts[0])?parts[0]:parts.length>2?parts.slice(-2).join(`/`):parts.join(`/`)}function stripRedundantSubsystemPrefixForConsole(message,displaySubsystem){if(!displaySubsystem)return message;if(message.startsWith(`[`)){let closeIdx=message.indexOf(`]`);if(closeIdx>1&&message.slice(1,closeIdx).toLowerCase()===displaySubsystem.toLowerCase()){let i=closeIdx+1;for(;message[i]===` `;)i+=1;return message.slice(i)}}if(message.slice(0,displaySubsystem.length).toLowerCase()!==displaySubsystem.toLowerCase())return message;let next=message.slice(displaySubsystem.length,displaySubsystem.length+1);if(next!==`:`&&next!==` `)return message;let i=displaySubsystem.length;for(;message[i]===` `;)i+=1;for(message[i]===`:`&&(i+=1);message[i]===` `;)i+=1;return message.slice(i)}function formatConsoleLine(opts){let displaySubsystem=opts.style===`json`?opts.subsystem:formatSubsystemForConsole(opts.subsystem);if(opts.style===`json`)return JSON.stringify({time:new Date().toISOString(),level:opts.level,subsystem:displaySubsystem,message:opts.message,...opts.meta});let color=getColorForConsole(),prefix=`[${displaySubsystem}]`,prefixColor=pickSubsystemColor(color,displaySubsystem),levelColor=opts.level===`error`||opts.level===`fatal`?color.red:opts.level===`warn`?color.yellow:opts.level===`debug`||opts.level===`trace`?color.gray:color.cyan,displayMessage=stripRedundantSubsystemPrefixForConsole(opts.message,displaySubsystem);return`${[opts.style===`pretty`?color.gray(new Date().toISOString().slice(11,19)):loggingState.consoleTimestampPrefix?color.gray(new Date().toISOString()):``,prefixColor(prefix)].filter(Boolean).join(` `)} ${levelColor(displayMessage)}`}function writeConsoleLine(level,line){clearActiveProgressLine();let sanitized=process.platform===`win32`&&process.env.GITHUB_ACTIONS===`true`?line.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,`?`).replace(/[\uD800-\uDFFF]/g,`?`):line,sink=loggingState.rawConsole??console;loggingState.forceConsoleToStderr||level===`error`||level===`fatal`?(sink.error??console.error)(sanitized):level===`warn`?(sink.warn??console.warn)(sanitized):(sink.log??console.log)(sanitized)}function logToFile(fileLogger,level,message,meta){if(level===`silent`)return;let method=fileLogger[level];typeof method==`function`&&(meta&&Object.keys(meta).length>0?method.call(fileLogger,meta,message):method.call(fileLogger,message))}function createSubsystemLogger(subsystem){let fileLogger=null,getFileLogger=()=>(fileLogger||=getChildLogger({subsystem}),fileLogger),emit=(level,message,meta)=>{let consoleSettings=getConsoleSettings(),consoleMessageOverride,fileMeta=meta;if(meta&&Object.keys(meta).length>0){let{consoleMessage,...rest}=meta;typeof consoleMessage==`string`&&(consoleMessageOverride=consoleMessage),fileMeta=Object.keys(rest).length>0?rest:void 0}if(logToFile(getFileLogger(),level,message,fileMeta),!shouldLogToConsole(level,{level:consoleSettings.level})||!shouldLogSubsystemToConsole(subsystem))return;let consoleMessage=consoleMessageOverride??message;!isVerbose()&&subsystem===`agent/embedded`&&/(sessionId|runId)=probe-/.test(consoleMessage)||writeConsoleLine(level,formatConsoleLine({level,subsystem,message:consoleSettings.style===`json`?message:consoleMessage,style:consoleSettings.style,meta:fileMeta}))},isConsoleEnabled=level=>shouldLogToConsole(level,{level:getConsoleSettings().level})&&shouldLogSubsystemToConsole(subsystem),isFileEnabled=level=>isFileLogLevelEnabled(level);return{subsystem,isEnabled:(level,target=`any`)=>target===`console`?isConsoleEnabled(level):target===`file`?isFileEnabled(level):isConsoleEnabled(level)||isFileEnabled(level),trace:(message,meta)=>emit(`trace`,message,meta),debug:(message,meta)=>emit(`debug`,message,meta),info:(message,meta)=>emit(`info`,message,meta),warn:(message,meta)=>emit(`warn`,message,meta),error:(message,meta)=>emit(`error`,message,meta),fatal:(message,meta)=>emit(`fatal`,message,meta),raw:message=>{if(logToFile(getFileLogger(),`info`,message,{raw:!0}),shouldLogSubsystemToConsole(subsystem)){if(!isVerbose()&&subsystem===`agent/embedded`&&/(sessionId|runId)=probe-/.test(message))return;writeConsoleLine(`info`,message)}},child:name=>createSubsystemLogger(`${subsystem}/${name}`)}}export{clearActiveProgressLine as a,defaultRuntime as i,stripAnsi as n,registerActiveProgressLine as o,createNonExitingRuntime as r,unregisterActiveProgressLine as s,createSubsystemLogger as t};
@@ -1 +1 @@
1
- import{_ as resizeToJpeg,d as IMAGE_REDUCE_QUALITY_STEPS,f as buildImageResizeSideGrid,m as getImageMetadata}from"./fetch-B-GxSYRO.js";import{t as createSubsystemLogger}from"./subsystem-D0Ril4rt.js";function resolveImageSanitizationLimits(cfg){let configured=cfg?.agents?.defaults?.imageMaxDimensionPx;return typeof configured!=`number`||!Number.isFinite(configured)?{}:{maxDimensionPx:Math.max(1,Math.floor(configured))}}const log=createSubsystemLogger(`agents/tool-images`);function isImageBlock(block){if(!block||typeof block!=`object`)return!1;let rec=block;return rec.type===`image`&&typeof rec.data==`string`&&typeof rec.mimeType==`string`}function isTextBlock(block){if(!block||typeof block!=`object`)return!1;let rec=block;return rec.type===`text`&&typeof rec.text==`string`}function inferMimeTypeFromBase64(base64){let trimmed=base64.trim();if(trimmed){if(trimmed.startsWith(`/9j/`))return`image/jpeg`;if(trimmed.startsWith(`iVBOR`))return`image/png`;if(trimmed.startsWith(`R0lGOD`))return`image/gif`}}function formatBytesShort(bytes){return!Number.isFinite(bytes)||bytes<1024?`${Math.max(0,Math.round(bytes))}B`:bytes<1024*1024?`${(bytes/1024).toFixed(1)}KB`:`${(bytes/(1024*1024)).toFixed(2)}MB`}async function resizeImageBase64IfNeeded(params){let buf=Buffer.from(params.base64,`base64`),meta=await getImageMetadata(buf),width=meta?.width,height=meta?.height,overBytes=buf.byteLength>params.maxBytes,hasDimensions=typeof width==`number`&&typeof height==`number`,overDimensions=hasDimensions&&(width>params.maxDimensionPx||height>params.maxDimensionPx);if(hasDimensions&&!overBytes&&width<=params.maxDimensionPx&&height<=params.maxDimensionPx)return{base64:params.base64,mimeType:params.mimeType,resized:!1,width,height};let maxDim=hasDimensions?Math.max(width??0,height??0):params.maxDimensionPx,sideStart=maxDim>0?Math.min(params.maxDimensionPx,maxDim):params.maxDimensionPx,sideGrid=buildImageResizeSideGrid(params.maxDimensionPx,sideStart),smallest=null;for(let side of sideGrid)for(let quality of IMAGE_REDUCE_QUALITY_STEPS){let out=await resizeToJpeg({buffer:buf,maxSide:side,quality,withoutEnlargement:!0});if((!smallest||out.byteLength<smallest.size)&&(smallest={buffer:out,size:out.byteLength}),out.byteLength<=params.maxBytes){let sourcePixels=typeof width==`number`&&typeof height==`number`?`${width}x${height}px`:`unknown`,byteReductionPct=buf.byteLength>0?Number(((buf.byteLength-out.byteLength)/buf.byteLength*100).toFixed(1)):0;return log.info(`Image resized to fit limits: ${sourcePixels} ${formatBytesShort(buf.byteLength)} -> ${formatBytesShort(out.byteLength)} (-${byteReductionPct}%)`,{label:params.label,sourceMimeType:params.mimeType,sourceWidth:width,sourceHeight:height,sourceBytes:buf.byteLength,maxBytes:params.maxBytes,maxDimensionPx:params.maxDimensionPx,triggerOverBytes:overBytes,triggerOverDimensions:overDimensions,outputMimeType:`image/jpeg`,outputBytes:out.byteLength,outputQuality:quality,outputMaxSide:side,byteReductionPct}),{base64:out.toString(`base64`),mimeType:`image/jpeg`,resized:!0,width,height}}}let best=smallest?.buffer??buf,maxMb=(params.maxBytes/(1024*1024)).toFixed(0),gotMb=(best.byteLength/(1024*1024)).toFixed(2),sourcePixels=typeof width==`number`&&typeof height==`number`?`${width}x${height}px`:`unknown`;throw log.warn(`Image resize failed to fit limits: ${sourcePixels} best=${formatBytesShort(best.byteLength)} limit=${formatBytesShort(params.maxBytes)}`,{label:params.label,sourceMimeType:params.mimeType,sourceWidth:width,sourceHeight:height,sourceBytes:buf.byteLength,maxDimensionPx:params.maxDimensionPx,maxBytes:params.maxBytes,smallestCandidateBytes:best.byteLength,triggerOverBytes:overBytes,triggerOverDimensions:overDimensions}),Error(`Image could not be reduced below ${maxMb}MB (got ${gotMb}MB)`)}async function sanitizeContentBlocksImages(blocks,label,opts={}){let maxDimensionPx=Math.max(opts.maxDimensionPx??1200,1),maxBytes=Math.max(opts.maxBytes??5242880,1),out=[];for(let block of blocks){if(!isImageBlock(block)){out.push(block);continue}let data=block.data.trim();if(!data){out.push({type:`text`,text:`[${label}] omitted empty image payload`});continue}try{let mimeType=inferMimeTypeFromBase64(data)??block.mimeType,resized=await resizeImageBase64IfNeeded({base64:data,mimeType,maxDimensionPx,maxBytes,label});out.push({...block,data:resized.base64,mimeType:resized.resized?resized.mimeType:mimeType})}catch(err){out.push({type:`text`,text:`[${label}] omitted image payload: ${String(err)}`})}}return out}async function sanitizeImageBlocks(images,label,opts={}){if(images.length===0)return{images,dropped:0};let next=(await sanitizeContentBlocksImages(images,label,opts)).filter(isImageBlock);return{images:next,dropped:Math.max(0,images.length-next.length)}}async function sanitizeToolResultImages(result,label,opts={}){let content=Array.isArray(result.content)?result.content:[];if(!content.some(b=>isImageBlock(b)||isTextBlock(b)))return result;let next=await sanitizeContentBlocksImages(content,label,opts);return{...result,content:next}}export{resolveImageSanitizationLimits as i,sanitizeImageBlocks as n,sanitizeToolResultImages as r,sanitizeContentBlocksImages as t};
1
+ import{_ as resizeToJpeg,d as IMAGE_REDUCE_QUALITY_STEPS,f as buildImageResizeSideGrid,m as getImageMetadata}from"./fetch-DH0Y8iyO.js";import{t as createSubsystemLogger}from"./subsystem-COTa5Ly_.js";function resolveImageSanitizationLimits(cfg){let configured=cfg?.agents?.defaults?.imageMaxDimensionPx;return typeof configured!=`number`||!Number.isFinite(configured)?{}:{maxDimensionPx:Math.max(1,Math.floor(configured))}}const log=createSubsystemLogger(`agents/tool-images`);function isImageBlock(block){if(!block||typeof block!=`object`)return!1;let rec=block;return rec.type===`image`&&typeof rec.data==`string`&&typeof rec.mimeType==`string`}function isTextBlock(block){if(!block||typeof block!=`object`)return!1;let rec=block;return rec.type===`text`&&typeof rec.text==`string`}function inferMimeTypeFromBase64(base64){let trimmed=base64.trim();if(trimmed){if(trimmed.startsWith(`/9j/`))return`image/jpeg`;if(trimmed.startsWith(`iVBOR`))return`image/png`;if(trimmed.startsWith(`R0lGOD`))return`image/gif`}}function formatBytesShort(bytes){return!Number.isFinite(bytes)||bytes<1024?`${Math.max(0,Math.round(bytes))}B`:bytes<1024*1024?`${(bytes/1024).toFixed(1)}KB`:`${(bytes/(1024*1024)).toFixed(2)}MB`}async function resizeImageBase64IfNeeded(params){let buf=Buffer.from(params.base64,`base64`),meta=await getImageMetadata(buf),width=meta?.width,height=meta?.height,overBytes=buf.byteLength>params.maxBytes,hasDimensions=typeof width==`number`&&typeof height==`number`,overDimensions=hasDimensions&&(width>params.maxDimensionPx||height>params.maxDimensionPx);if(hasDimensions&&!overBytes&&width<=params.maxDimensionPx&&height<=params.maxDimensionPx)return{base64:params.base64,mimeType:params.mimeType,resized:!1,width,height};let maxDim=hasDimensions?Math.max(width??0,height??0):params.maxDimensionPx,sideStart=maxDim>0?Math.min(params.maxDimensionPx,maxDim):params.maxDimensionPx,sideGrid=buildImageResizeSideGrid(params.maxDimensionPx,sideStart),smallest=null;for(let side of sideGrid)for(let quality of IMAGE_REDUCE_QUALITY_STEPS){let out=await resizeToJpeg({buffer:buf,maxSide:side,quality,withoutEnlargement:!0});if((!smallest||out.byteLength<smallest.size)&&(smallest={buffer:out,size:out.byteLength}),out.byteLength<=params.maxBytes){let sourcePixels=typeof width==`number`&&typeof height==`number`?`${width}x${height}px`:`unknown`,byteReductionPct=buf.byteLength>0?Number(((buf.byteLength-out.byteLength)/buf.byteLength*100).toFixed(1)):0;return log.info(`Image resized to fit limits: ${sourcePixels} ${formatBytesShort(buf.byteLength)} -> ${formatBytesShort(out.byteLength)} (-${byteReductionPct}%)`,{label:params.label,sourceMimeType:params.mimeType,sourceWidth:width,sourceHeight:height,sourceBytes:buf.byteLength,maxBytes:params.maxBytes,maxDimensionPx:params.maxDimensionPx,triggerOverBytes:overBytes,triggerOverDimensions:overDimensions,outputMimeType:`image/jpeg`,outputBytes:out.byteLength,outputQuality:quality,outputMaxSide:side,byteReductionPct}),{base64:out.toString(`base64`),mimeType:`image/jpeg`,resized:!0,width,height}}}let best=smallest?.buffer??buf,maxMb=(params.maxBytes/(1024*1024)).toFixed(0),gotMb=(best.byteLength/(1024*1024)).toFixed(2),sourcePixels=typeof width==`number`&&typeof height==`number`?`${width}x${height}px`:`unknown`;throw log.warn(`Image resize failed to fit limits: ${sourcePixels} best=${formatBytesShort(best.byteLength)} limit=${formatBytesShort(params.maxBytes)}`,{label:params.label,sourceMimeType:params.mimeType,sourceWidth:width,sourceHeight:height,sourceBytes:buf.byteLength,maxDimensionPx:params.maxDimensionPx,maxBytes:params.maxBytes,smallestCandidateBytes:best.byteLength,triggerOverBytes:overBytes,triggerOverDimensions:overDimensions}),Error(`Image could not be reduced below ${maxMb}MB (got ${gotMb}MB)`)}async function sanitizeContentBlocksImages(blocks,label,opts={}){let maxDimensionPx=Math.max(opts.maxDimensionPx??1200,1),maxBytes=Math.max(opts.maxBytes??5242880,1),out=[];for(let block of blocks){if(!isImageBlock(block)){out.push(block);continue}let data=block.data.trim();if(!data){out.push({type:`text`,text:`[${label}] omitted empty image payload`});continue}try{let mimeType=inferMimeTypeFromBase64(data)??block.mimeType,resized=await resizeImageBase64IfNeeded({base64:data,mimeType,maxDimensionPx,maxBytes,label});out.push({...block,data:resized.base64,mimeType:resized.resized?resized.mimeType:mimeType})}catch(err){out.push({type:`text`,text:`[${label}] omitted image payload: ${String(err)}`})}}return out}async function sanitizeImageBlocks(images,label,opts={}){if(images.length===0)return{images,dropped:0};let next=(await sanitizeContentBlocksImages(images,label,opts)).filter(isImageBlock);return{images:next,dropped:Math.max(0,images.length-next.length)}}async function sanitizeToolResultImages(result,label,opts={}){let content=Array.isArray(result.content)?result.content:[];if(!content.some(b=>isImageBlock(b)||isTextBlock(b)))return result;let next=await sanitizeContentBlocksImages(content,label,opts);return{...result,content:next}}export{resolveImageSanitizationLimits as i,sanitizeImageBlocks as n,sanitizeToolResultImages as r,sanitizeContentBlocksImages as t};
@@ -1,2 +1,2 @@
1
- import{C as isPlainObject}from"./registry-CZHRcH-q.js";import"./paths-Cb8zTlyG.js";import{t as createSubsystemLogger}from"./subsystem-D0Ril4rt.js";import{t as stableStringify}from"./src-BcDibXPq.js";import{createHash}from"node:crypto";const log=createSubsystemLogger(`agents/loop-detection`),DEFAULT_LOOP_DETECTION_CONFIG={enabled:!1,historySize:30,warningThreshold:10,criticalThreshold:20,globalCircuitBreakerThreshold:30,detectors:{genericRepeat:!0,knownPollNoProgress:!0,pingPong:!0}};function asPositiveInt(value,fallback){return typeof value!=`number`||!Number.isInteger(value)||value<=0?fallback:value}function resolveLoopDetectionConfig(config){let warningThreshold=asPositiveInt(config?.warningThreshold,DEFAULT_LOOP_DETECTION_CONFIG.warningThreshold),criticalThreshold=asPositiveInt(config?.criticalThreshold,DEFAULT_LOOP_DETECTION_CONFIG.criticalThreshold),globalCircuitBreakerThreshold=asPositiveInt(config?.globalCircuitBreakerThreshold,DEFAULT_LOOP_DETECTION_CONFIG.globalCircuitBreakerThreshold);return criticalThreshold<=warningThreshold&&(criticalThreshold=warningThreshold+1),globalCircuitBreakerThreshold<=criticalThreshold&&(globalCircuitBreakerThreshold=criticalThreshold+1),{enabled:config?.enabled??DEFAULT_LOOP_DETECTION_CONFIG.enabled,historySize:asPositiveInt(config?.historySize,DEFAULT_LOOP_DETECTION_CONFIG.historySize),warningThreshold,criticalThreshold,globalCircuitBreakerThreshold,detectors:{genericRepeat:config?.detectors?.genericRepeat??DEFAULT_LOOP_DETECTION_CONFIG.detectors.genericRepeat,knownPollNoProgress:config?.detectors?.knownPollNoProgress??DEFAULT_LOOP_DETECTION_CONFIG.detectors.knownPollNoProgress,pingPong:config?.detectors?.pingPong??DEFAULT_LOOP_DETECTION_CONFIG.detectors.pingPong}}}function hashToolCall(toolName,params){return`${toolName}:${digestStable(params)}`}function digestStable(value){let serialized=stableStringifyFallback(value);return createHash(`sha256`).update(serialized).digest(`hex`)}function stableStringifyFallback(value){try{return stableStringify(value)}catch{return value==null?`${value}`:typeof value==`string`?value:typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?`${value}`:value instanceof Error?`${value.name}:${value.message}`:Object.prototype.toString.call(value)}}function isKnownPollToolCall(toolName,params){if(toolName===`command_status`)return!0;if(toolName!==`process`||!isPlainObject(params))return!1;let action=params.action;return action===`poll`||action===`log`}function extractTextContent(result){return!isPlainObject(result)||!Array.isArray(result.content)?``:result.content.filter(entry=>isPlainObject(entry)&&typeof entry.type==`string`&&typeof entry.text==`string`).map(entry=>entry.text).join(`
1
+ import{C as isPlainObject}from"./registry-DJq2Cvo9.js";import"./paths-Cb8zTlyG.js";import{t as createSubsystemLogger}from"./subsystem-COTa5Ly_.js";import{t as stableStringify}from"./src-BcDibXPq.js";import{createHash}from"node:crypto";const log=createSubsystemLogger(`agents/loop-detection`),DEFAULT_LOOP_DETECTION_CONFIG={enabled:!1,historySize:30,warningThreshold:10,criticalThreshold:20,globalCircuitBreakerThreshold:30,detectors:{genericRepeat:!0,knownPollNoProgress:!0,pingPong:!0}};function asPositiveInt(value,fallback){return typeof value!=`number`||!Number.isInteger(value)||value<=0?fallback:value}function resolveLoopDetectionConfig(config){let warningThreshold=asPositiveInt(config?.warningThreshold,DEFAULT_LOOP_DETECTION_CONFIG.warningThreshold),criticalThreshold=asPositiveInt(config?.criticalThreshold,DEFAULT_LOOP_DETECTION_CONFIG.criticalThreshold),globalCircuitBreakerThreshold=asPositiveInt(config?.globalCircuitBreakerThreshold,DEFAULT_LOOP_DETECTION_CONFIG.globalCircuitBreakerThreshold);return criticalThreshold<=warningThreshold&&(criticalThreshold=warningThreshold+1),globalCircuitBreakerThreshold<=criticalThreshold&&(globalCircuitBreakerThreshold=criticalThreshold+1),{enabled:config?.enabled??DEFAULT_LOOP_DETECTION_CONFIG.enabled,historySize:asPositiveInt(config?.historySize,DEFAULT_LOOP_DETECTION_CONFIG.historySize),warningThreshold,criticalThreshold,globalCircuitBreakerThreshold,detectors:{genericRepeat:config?.detectors?.genericRepeat??DEFAULT_LOOP_DETECTION_CONFIG.detectors.genericRepeat,knownPollNoProgress:config?.detectors?.knownPollNoProgress??DEFAULT_LOOP_DETECTION_CONFIG.detectors.knownPollNoProgress,pingPong:config?.detectors?.pingPong??DEFAULT_LOOP_DETECTION_CONFIG.detectors.pingPong}}}function hashToolCall(toolName,params){return`${toolName}:${digestStable(params)}`}function digestStable(value){let serialized=stableStringifyFallback(value);return createHash(`sha256`).update(serialized).digest(`hex`)}function stableStringifyFallback(value){try{return stableStringify(value)}catch{return value==null?`${value}`:typeof value==`string`?value:typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?`${value}`:value instanceof Error?`${value.name}:${value.message}`:Object.prototype.toString.call(value)}}function isKnownPollToolCall(toolName,params){if(toolName===`command_status`)return!0;if(toolName!==`process`||!isPlainObject(params))return!1;let action=params.action;return action===`poll`||action===`log`}function extractTextContent(result){return!isPlainObject(result)||!Array.isArray(result.content)?``:result.content.filter(entry=>isPlainObject(entry)&&typeof entry.type==`string`&&typeof entry.text==`string`).map(entry=>entry.text).join(`
2
2
  `).trim()}function formatErrorForHash(error){return error instanceof Error?error.message||error.name:typeof error==`string`?error:typeof error==`number`||typeof error==`boolean`||typeof error==`bigint`?`${error}`:stableStringify(error)}function hashToolOutcome(toolName,params,result,error){if(error!==void 0)return`error:${digestStable(formatErrorForHash(error))}`;if(!isPlainObject(result))return result===void 0?void 0:digestStable(result);let details=isPlainObject(result.details)?result.details:{},text=extractTextContent(result);if(isKnownPollToolCall(toolName,params)&&toolName===`process`&&isPlainObject(params)){let action=params.action;if(action===`poll`)return digestStable({action,status:details.status,exitCode:details.exitCode??null,exitSignal:details.exitSignal??null,aggregated:details.aggregated??null,text});if(action===`log`)return digestStable({action,status:details.status,totalLines:details.totalLines??null,totalChars:details.totalChars??null,truncated:details.truncated??null,exitCode:details.exitCode??null,exitSignal:details.exitSignal??null,text})}return digestStable({details,text})}function getNoProgressStreak(history,toolName,argsHash){let streak=0,latestResultHash;for(let i=history.length-1;i>=0;--i){let record=history[i];if(!(!record||record.toolName!==toolName||record.argsHash!==argsHash)&&!(typeof record.resultHash!=`string`||!record.resultHash)){if(!latestResultHash){latestResultHash=record.resultHash,streak=1;continue}if(record.resultHash!==latestResultHash)break;streak+=1}}return{count:streak,latestResultHash}}function getPingPongStreak(history,currentSignature){let last=history.at(-1);if(!last)return{count:0,noProgressEvidence:!1};let otherSignature,otherToolName;for(let i=history.length-2;i>=0;--i){let call=history[i];if(call&&call.argsHash!==last.argsHash){otherSignature=call.argsHash,otherToolName=call.toolName;break}}if(!otherSignature||!otherToolName)return{count:0,noProgressEvidence:!1};let alternatingTailCount=0;for(let i=history.length-1;i>=0;--i){let call=history[i];if(!call)continue;let expected=alternatingTailCount%2==0?last.argsHash:otherSignature;if(call.argsHash!==expected)break;alternatingTailCount+=1}if(alternatingTailCount<2||currentSignature!==otherSignature)return{count:0,noProgressEvidence:!1};let tailStart=Math.max(0,history.length-alternatingTailCount),firstHashA,firstHashB,noProgressEvidence=!0;for(let i=tailStart;i<history.length;i+=1){let call=history[i];if(call){if(!call.resultHash){noProgressEvidence=!1;break}if(call.argsHash===last.argsHash){if(!firstHashA)firstHashA=call.resultHash;else if(firstHashA!==call.resultHash){noProgressEvidence=!1;break}continue}if(call.argsHash===otherSignature){if(!firstHashB)firstHashB=call.resultHash;else if(firstHashB!==call.resultHash){noProgressEvidence=!1;break}continue}noProgressEvidence=!1;break}}return(!firstHashA||!firstHashB)&&(noProgressEvidence=!1),{count:alternatingTailCount+1,pairedToolName:last.toolName,pairedSignature:last.argsHash,noProgressEvidence}}function canonicalPairKey(signatureA,signatureB){return[signatureA,signatureB].toSorted().join(`|`)}function detectToolCallLoop(state,toolName,params,config){let resolvedConfig=resolveLoopDetectionConfig(config);if(!resolvedConfig.enabled)return{stuck:!1};let history=state.toolCallHistory??[],currentHash=hashToolCall(toolName,params),noProgress=getNoProgressStreak(history,toolName,currentHash),noProgressStreak=noProgress.count,knownPollTool=isKnownPollToolCall(toolName,params),pingPong=getPingPongStreak(history,currentHash);if(noProgressStreak>=resolvedConfig.globalCircuitBreakerThreshold)return log.error(`Global circuit breaker triggered: ${toolName} repeated ${noProgressStreak} times with no progress`),{stuck:!0,level:`critical`,detector:`global_circuit_breaker`,count:noProgressStreak,message:`CRITICAL: ${toolName} has repeated identical no-progress outcomes ${noProgressStreak} times. Session execution blocked by global circuit breaker to prevent runaway loops.`,warningKey:`global:${toolName}:${currentHash}:${noProgress.latestResultHash??`none`}`};if(knownPollTool&&resolvedConfig.detectors.knownPollNoProgress&&noProgressStreak>=resolvedConfig.criticalThreshold)return log.error(`Critical polling loop detected: ${toolName} repeated ${noProgressStreak} times`),{stuck:!0,level:`critical`,detector:`known_poll_no_progress`,count:noProgressStreak,message:`CRITICAL: Called ${toolName} with identical arguments and no progress ${noProgressStreak} times. This appears to be a stuck polling loop. Session execution blocked to prevent resource waste.`,warningKey:`poll:${toolName}:${currentHash}:${noProgress.latestResultHash??`none`}`};if(knownPollTool&&resolvedConfig.detectors.knownPollNoProgress&&noProgressStreak>=resolvedConfig.warningThreshold)return log.warn(`Polling loop warning: ${toolName} repeated ${noProgressStreak} times`),{stuck:!0,level:`warning`,detector:`known_poll_no_progress`,count:noProgressStreak,message:`WARNING: You have called ${toolName} ${noProgressStreak} times with identical arguments and no progress. Stop polling and either (1) increase wait time between checks, or (2) report the task as failed if the process is stuck.`,warningKey:`poll:${toolName}:${currentHash}:${noProgress.latestResultHash??`none`}`};let pingPongWarningKey=pingPong.pairedSignature?`pingpong:${canonicalPairKey(currentHash,pingPong.pairedSignature)}`:`pingpong:${toolName}:${currentHash}`;if(resolvedConfig.detectors.pingPong&&pingPong.count>=resolvedConfig.criticalThreshold&&pingPong.noProgressEvidence)return log.error(`Critical ping-pong loop detected: alternating calls count=${pingPong.count} currentTool=${toolName}`),{stuck:!0,level:`critical`,detector:`ping_pong`,count:pingPong.count,message:`CRITICAL: You are alternating between repeated tool-call patterns (${pingPong.count} consecutive calls) with no progress. This appears to be a stuck ping-pong loop. Session execution blocked to prevent resource waste.`,pairedToolName:pingPong.pairedToolName,warningKey:pingPongWarningKey};if(resolvedConfig.detectors.pingPong&&pingPong.count>=resolvedConfig.warningThreshold)return log.warn(`Ping-pong loop warning: alternating calls count=${pingPong.count} currentTool=${toolName}`),{stuck:!0,level:`warning`,detector:`ping_pong`,count:pingPong.count,message:`WARNING: You are alternating between repeated tool-call patterns (${pingPong.count} consecutive calls). This looks like a ping-pong loop; stop retrying and report the task as failed.`,pairedToolName:pingPong.pairedToolName,warningKey:pingPongWarningKey};let recentCount=history.filter(h=>h.toolName===toolName&&h.argsHash===currentHash).length;return!knownPollTool&&resolvedConfig.detectors.genericRepeat&&recentCount>=resolvedConfig.warningThreshold?(log.warn(`Loop warning: ${toolName} called ${recentCount} times with identical arguments`),{stuck:!0,level:`warning`,detector:`generic_repeat`,count:recentCount,message:`WARNING: You have called ${toolName} ${recentCount} times with identical arguments. If this is not making progress, stop retrying and report the task as failed.`,warningKey:`generic:${toolName}:${currentHash}`}):{stuck:!1}}function recordToolCall(state,toolName,params,toolCallId,config){let resolvedConfig=resolveLoopDetectionConfig(config);state.toolCallHistory||=[],state.toolCallHistory.push({toolName,argsHash:hashToolCall(toolName,params),toolCallId,timestamp:Date.now()}),state.toolCallHistory.length>resolvedConfig.historySize&&state.toolCallHistory.shift()}function recordToolCallOutcome(state,params){let resolvedConfig=resolveLoopDetectionConfig(params.config),resultHash=hashToolOutcome(params.toolName,params.toolParams,params.result,params.error);if(!resultHash)return;state.toolCallHistory||=[];let argsHash=hashToolCall(params.toolName,params.toolParams),matched=!1;for(let i=state.toolCallHistory.length-1;i>=0;--i){let call=state.toolCallHistory[i];if(call&&!(params.toolCallId&&call.toolCallId!==params.toolCallId)&&!(call.toolName!==params.toolName||call.argsHash!==argsHash)&&call.resultHash===void 0){call.resultHash=resultHash,matched=!0;break}}matched||state.toolCallHistory.push({toolName:params.toolName,argsHash,toolCallId:params.toolCallId,resultHash,timestamp:Date.now()}),state.toolCallHistory.length>resolvedConfig.historySize&&state.toolCallHistory.splice(0,state.toolCallHistory.length-resolvedConfig.historySize)}export{detectToolCallLoop,recordToolCall,recordToolCallOutcome};
@@ -0,0 +1 @@
1
+ import"./session-key-5J69DULS.js";import{a as WA_WEB_AUTH_DIR,g as webAuthExists,s as logWebSelfId,u as pickWebChannel}from"./accounts-BwreSNAR.js";import"./reply-D5Uk7pUv.js";import"./registry-DJq2Cvo9.js";import"./paths-Cb8zTlyG.js";import"./model-selection-K82MAGlL.js";import"./config-v1EU9Ll8.js";import"./fetch-DH0Y8iyO.js";import"./subsystem-COTa5Ly_.js";import"./agent-scope-BQByW0cD.js";import"./tool-images-DSpchb4x.js";import"./common-BxEWhN2X.js";import"./replies-Cz5OD3qN.js";import"./reply-prefix-CCymsmsP.js";import"./runner-CYkuO7Fh.js";import"./redact-Bv8wnIZm.js";import"./errors-L3rugjUL.js";import"./chrome-SOXFIkUM.js";import"./command-format-CAX9XFjI.js";import"./plugins-CaUOZBVb.js";import"./bindings-CDEzl4kl.js";import"./message-channel-sBPQc_-T.js";import"./src-BcDibXPq.js";import"./paths-DtbnCdO7.js";import"./api-key-rotation-7YdImWrh.js";import"./active-listener-DpQ7aGYd.js";import"./render-BUCRXPIk.js";import"./chunk-cW0POl22.js";import"./manager-BH_bmGds.js";import"./markdown-tables-Epim9b-0.js";import{n as monitorWebInbox,t as monitorWebChannel}from"./channel-web-D2KuONp0.js";import"./model-catalog-cXsza5GU.js";import"./sqlite-BlMLqMl8.js";import"./resolve-route-DN1J7Wyc.js";import{n as sendMessageWhatsApp}from"./outbound-Chn_H1O7.js";import{i as waitForWaConnection,t as createWaSocket}from"./session-D5jHDo78.js";import{t as loginWeb}from"./login-d1zBgykF.js";export{WA_WEB_AUTH_DIR,createWaSocket,logWebSelfId,loginWeb,monitorWebChannel,monitorWebInbox,pickWebChannel,sendMessageWhatsApp,waitForWaConnection,webAuthExists};
@@ -1 +1 @@
1
- import"./session-key-5J69DULS.js";import"./accounts-Cy3WCbWg.js";import"./registry-CZHRcH-q.js";import"./paths-Cb8zTlyG.js";import"./model-selection-BtgvnqB5.js";import"./config-DsXZsCkJ.js";import"./fetch-B-GxSYRO.js";import"./subsystem-D0Ril4rt.js";import"./agent-scope-DgKN27hJ.js";import"./tool-images-WRTP95FT.js";import{a as jsonResult,n as createActionGate,s as readReactionParams,u as readStringParam}from"./common-n0l_XN-S.js";import"./command-format-B3XMq_73.js";import"./plugins-BdkC9v5E.js";import"./bindings-CH-YLOLC.js";import"./message-channel-CuZ2xOAM.js";import"./src-BcDibXPq.js";import"./active-listener-DVWVNlT9.js";import"./render-CuA_WRX5.js";import"./chunk-C94IAOuf.js";import"./markdown-tables-BUfhHgfs.js";import{r as sendReactionWhatsApp}from"./outbound-D_attiyO.js";async function handleWhatsAppAction(params,cfg){let action=readStringParam(params,`action`,{required:!0}),isActionEnabled=createActionGate(cfg.channels?.whatsapp?.actions);if(action===`react`){if(!isActionEnabled(`reactions`))throw Error(`WhatsApp reactions are disabled.`);let chatJid=readStringParam(params,`chatJid`,{required:!0}),messageId=readStringParam(params,`messageId`,{required:!0}),{emoji,remove,isEmpty}=readReactionParams(params,{removeErrorMessage:`Emoji is required to remove a WhatsApp reaction.`}),participant=readStringParam(params,`participant`),accountId=readStringParam(params,`accountId`),fromMeRaw=params.fromMe;return await sendReactionWhatsApp(chatJid,messageId,remove?``:emoji,{verbose:!1,fromMe:typeof fromMeRaw==`boolean`?fromMeRaw:void 0,participant:participant??void 0,accountId:accountId??void 0}),jsonResult(!remove&&!isEmpty?{ok:!0,added:emoji}:{ok:!0,removed:!0})}throw Error(`Unsupported WhatsApp action: ${action}`)}export{handleWhatsAppAction};
1
+ import"./session-key-5J69DULS.js";import"./accounts-BwreSNAR.js";import"./registry-DJq2Cvo9.js";import"./paths-Cb8zTlyG.js";import"./model-selection-K82MAGlL.js";import"./config-v1EU9Ll8.js";import"./fetch-DH0Y8iyO.js";import"./subsystem-COTa5Ly_.js";import"./agent-scope-BQByW0cD.js";import"./tool-images-DSpchb4x.js";import{a as jsonResult,n as createActionGate,s as readReactionParams,u as readStringParam}from"./common-BxEWhN2X.js";import"./command-format-CAX9XFjI.js";import"./plugins-CaUOZBVb.js";import"./bindings-CDEzl4kl.js";import"./message-channel-sBPQc_-T.js";import"./src-BcDibXPq.js";import"./active-listener-DpQ7aGYd.js";import"./render-BUCRXPIk.js";import"./chunk-cW0POl22.js";import"./markdown-tables-Epim9b-0.js";import{r as sendReactionWhatsApp}from"./outbound-Chn_H1O7.js";async function handleWhatsAppAction(params,cfg){let action=readStringParam(params,`action`,{required:!0}),isActionEnabled=createActionGate(cfg.channels?.whatsapp?.actions);if(action===`react`){if(!isActionEnabled(`reactions`))throw Error(`WhatsApp reactions are disabled.`);let chatJid=readStringParam(params,`chatJid`,{required:!0}),messageId=readStringParam(params,`messageId`,{required:!0}),{emoji,remove,isEmpty}=readReactionParams(params,{removeErrorMessage:`Emoji is required to remove a WhatsApp reaction.`}),participant=readStringParam(params,`participant`),accountId=readStringParam(params,`accountId`),fromMeRaw=params.fromMe;return await sendReactionWhatsApp(chatJid,messageId,remove?``:emoji,{verbose:!1,fromMe:typeof fromMeRaw==`boolean`?fromMeRaw:void 0,participant:participant??void 0,accountId:accountId??void 0}),jsonResult(!remove&&!isEmpty?{ok:!0,added:emoji}:{ok:!0,removed:!0})}throw Error(`Unsupported WhatsApp action: ${action}`)}export{handleWhatsAppAction};
@@ -1,2 +1,2 @@
1
- import"./paths-BHg-VHB4.js";import{c as hasHelpOrVersion,n as getCommandPath,o as getVerboseFlag}from"./argv-BgQk38nl.js";import"./registry-Cv7CoWAs.js";import{N as setVerbose,R as isRich,c as escapeRegExp,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-C1VbcUOm.js";import{n as replaceCliName,r as resolveCliName}from"./command-format-DTMaGKs7.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{U as VERSION}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"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-DmAU4cRX.js";import"./message-channel-z5YRpR2d.js";import"./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"./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"./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"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DbkT_5BV.js";import"./onboard-helpers-CckrS8_K.js";import"./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"./catalog-li4bSIE2.js";import"./plugin-registry-SAdxNUwm.js";import{n as resolveCliChannelOptions}from"./channel-options-d4EwVQD0.js";import{t as getSubCliCommandsWithSubcommands}from"./register.subclis-DqO3Ciiv.js";import{a as registerProgramCommands,n as getCoreCliCommandsWithSubcommands}from"./command-registry-D_LkOB4n.js";import{n as setProgramContext}from"./program-context-Wpc-6CdI.js";import"./ports-6RmfZEmk.js";import{n as formatCliBannerLine,r as hasEmittedCliBanner,t as emitCliBanner}from"./banner-DY-L7_eI.js";import{Command}from"commander";function createProgramContext(){let channelOptions=resolveCliChannelOptions();return{programVersion:VERSION,channelOptions,messageChannelOptions:channelOptions.join(`|`),agentChannelOptions:[`last`,...channelOptions].join(`|`)}}const CLI_NAME=resolveCliName(),CLI_NAME_PATTERN=escapeRegExp(CLI_NAME),ROOT_COMMANDS_WITH_SUBCOMMANDS=new Set([...getCoreCliCommandsWithSubcommands(),...getSubCliCommandsWithSubcommands()]),EXAMPLES=[[`builderforce models --help`,`Show detailed help for the models command.`],[`builderforce channels login --verbose`,`Link personal WhatsApp Web and show QR + connection logs.`],[`builderforce message send --target +15555550123 --message "Hi" --json`,`Send via your web session and print JSON result.`],[`builderforce gateway --port 18789`,`Run the WebSocket Gateway locally.`],[`builderforce --dev gateway`,`Run a dev Gateway (isolated state/config) on ws://127.0.0.1:19001.`],[`builderforce gateway --force`,`Kill anything bound to the default gateway port, then start it.`],[`builderforce gateway ...`,`Gateway control via WebSocket.`],[`builderforce agent --to +15555550123 --message "Run summary" --deliver`,`Talk directly to the agent using the Gateway; optionally send the WhatsApp reply.`],[`builderforce message send --channel telegram --target @mychat --message "Hi"`,`Send via your Telegram bot.`]];function configureProgramHelp(program,ctx){program.name(CLI_NAME).description(``).version(ctx.programVersion).option(`--dev`,`Dev profile: isolate state under ~/.builderforce-dev, default gateway port 19001, and shift derived ports (browser/canvas)`).option(`--profile <name>`,`Use a named profile (isolates BUILDERFORCE_AGENTS_STATE_DIR/BUILDERFORCE_AGENTS_CONFIG_PATH under ~/.builderforce-<name>)`),program.option(`--no-color`,`Disable ANSI colors`,!1),program.helpOption(`-h, --help`,`Display help for command`),program.helpCommand(`help [command]`,`Display help for command`),program.configureHelp({sortSubcommands:!0,sortOptions:!0,optionTerm:option=>theme.option(option.flags),subcommandTerm:cmd=>{let hasSubcommands=cmd.parent===program&&ROOT_COMMANDS_WITH_SUBCOMMANDS.has(cmd.name());return theme.command(hasSubcommands?`${cmd.name()} *`:cmd.name())}});let formatHelpOutput=str=>{let output=str;return RegExp(`^Usage:\\s+${CLI_NAME_PATTERN}\\s+\\[options\\]\\s+\\[command\\]\\s*$`,`m`).test(output)&&/^Commands:/m.test(output)&&(output=output.replace(/^Commands:/m,`Commands:\n ${theme.muted(`Hint: commands suffixed with * have subcommands. Run <command> --help for details.`)}`)),output.replace(/^Usage:/gm,theme.heading(`Usage:`)).replace(/^Options:/gm,theme.heading(`Options:`)).replace(/^Commands:/gm,theme.heading(`Commands:`))};program.configureOutput({writeOut:str=>{process.stdout.write(formatHelpOutput(str))},writeErr:str=>{process.stderr.write(formatHelpOutput(str))},outputError:(str,write)=>write(theme.error(str))}),(process.argv.includes(`-V`)||process.argv.includes(`--version`)||process.argv.includes(`-v`))&&(console.log(ctx.programVersion),process.exit(0)),program.addHelpText(`beforeAll`,()=>{if(hasEmittedCliBanner())return``;let rich=isRich();return`\n${formatCliBannerLine(ctx.programVersion,{richTty:rich})}\n`});let fmtExamples=EXAMPLES.map(([cmd,desc])=>` ${theme.command(replaceCliName(cmd,CLI_NAME))}\n ${theme.muted(desc)}`).join(`
2
- `);program.addHelpText(`afterAll`,({command})=>{if(command!==program)return``;let docs=formatDocsLink(`/cli`,`docs.builderforce.ai/cli`);return`\n${theme.heading(`Examples:`)}\n${fmtExamples}\n\n${theme.muted(`Docs:`)} ${docs}\n`})}function setProcessTitleForCommand(actionCommand){let current=actionCommand;for(;current.parent&&current.parent.parent;)current=current.parent;let name=current.name(),cliName=resolveCliName();!name||name===cliName||(process.title=`${cliName}-${name}`)}const PLUGIN_REQUIRED_COMMANDS=new Set([`message`,`channels`,`directory`]);function registerPreActionHooks(program,programVersion){program.hook(`preAction`,async(_thisCommand,actionCommand)=>{setProcessTitleForCommand(actionCommand);let argv=process.argv;if(hasHelpOrVersion(argv))return;let commandPath=getCommandPath(argv,2);isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_HIDE_BANNER)||commandPath[0]===`update`||commandPath[0]===`completion`||commandPath[0]===`plugins`&&commandPath[1]===`update`||emitCliBanner(programVersion);let verbose=getVerboseFlag(argv,{includeDebug:!0});if(setVerbose(verbose),verbose||(process.env.NODE_NO_WARNINGS??=`1`),commandPath[0]===`doctor`||commandPath[0]===`completion`)return;let{ensureConfigReady}=await import(`./config-guard-B4in8l8I.js`);if(await ensureConfigReady({runtime:defaultRuntime,commandPath}),PLUGIN_REQUIRED_COMMANDS.has(commandPath[0])){let{ensurePluginRegistryLoaded}=await import(`./plugin-registry-B-UOeWqM.js`);ensurePluginRegistryLoaded()}})}function buildProgram(){let program=new Command,ctx=createProgramContext(),argv=process.argv;return setProgramContext(program,ctx),configureProgramHelp(program,ctx),registerPreActionHooks(program,ctx.programVersion),registerProgramCommands(program,ctx,argv),program.option(`-m, --message <text>`,`Start a session and send this as the first message`).action(async opts=>{let{runBuilderForceAgentsSession}=await import(`./builderforce-wxtgU9xu.js`);await runBuilderForceAgentsSession(process.cwd(),{message:opts.message})}),program}export{buildProgram};
1
+ import"./paths-BHg-VHB4.js";import{c as hasHelpOrVersion,n as getCommandPath,o as getVerboseFlag}from"./argv-BgQk38nl.js";import"./registry-Cv7CoWAs.js";import{N as setVerbose,R as isRich,c as escapeRegExp,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-C1VbcUOm.js";import{n as replaceCliName,r as resolveCliName}from"./command-format-DTMaGKs7.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{U as VERSION}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"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-DmAU4cRX.js";import"./message-channel-z5YRpR2d.js";import"./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"./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"./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"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DbkT_5BV.js";import"./onboard-helpers-CckrS8_K.js";import"./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"./catalog-li4bSIE2.js";import"./plugin-registry-SAdxNUwm.js";import{n as resolveCliChannelOptions}from"./channel-options-d4EwVQD0.js";import{t as getSubCliCommandsWithSubcommands}from"./register.subclis-EScCVgbV.js";import{a as registerProgramCommands,n as getCoreCliCommandsWithSubcommands}from"./command-registry-CDcuHGpx.js";import{n as setProgramContext}from"./program-context-Wpc-6CdI.js";import"./ports-6RmfZEmk.js";import{n as formatCliBannerLine,r as hasEmittedCliBanner,t as emitCliBanner}from"./banner-DY-L7_eI.js";import{Command}from"commander";function createProgramContext(){let channelOptions=resolveCliChannelOptions();return{programVersion:VERSION,channelOptions,messageChannelOptions:channelOptions.join(`|`),agentChannelOptions:[`last`,...channelOptions].join(`|`)}}const CLI_NAME=resolveCliName(),CLI_NAME_PATTERN=escapeRegExp(CLI_NAME),ROOT_COMMANDS_WITH_SUBCOMMANDS=new Set([...getCoreCliCommandsWithSubcommands(),...getSubCliCommandsWithSubcommands()]),EXAMPLES=[[`builderforce models --help`,`Show detailed help for the models command.`],[`builderforce channels login --verbose`,`Link personal WhatsApp Web and show QR + connection logs.`],[`builderforce message send --target +15555550123 --message "Hi" --json`,`Send via your web session and print JSON result.`],[`builderforce gateway --port 18789`,`Run the WebSocket Gateway locally.`],[`builderforce --dev gateway`,`Run a dev Gateway (isolated state/config) on ws://127.0.0.1:19001.`],[`builderforce gateway --force`,`Kill anything bound to the default gateway port, then start it.`],[`builderforce gateway ...`,`Gateway control via WebSocket.`],[`builderforce agent --to +15555550123 --message "Run summary" --deliver`,`Talk directly to the agent using the Gateway; optionally send the WhatsApp reply.`],[`builderforce message send --channel telegram --target @mychat --message "Hi"`,`Send via your Telegram bot.`]];function configureProgramHelp(program,ctx){program.name(CLI_NAME).description(``).version(ctx.programVersion).option(`--dev`,`Dev profile: isolate state under ~/.builderforce-dev, default gateway port 19001, and shift derived ports (browser/canvas)`).option(`--profile <name>`,`Use a named profile (isolates BUILDERFORCE_AGENTS_STATE_DIR/BUILDERFORCE_AGENTS_CONFIG_PATH under ~/.builderforce-<name>)`),program.option(`--no-color`,`Disable ANSI colors`,!1),program.helpOption(`-h, --help`,`Display help for command`),program.helpCommand(`help [command]`,`Display help for command`),program.configureHelp({sortSubcommands:!0,sortOptions:!0,optionTerm:option=>theme.option(option.flags),subcommandTerm:cmd=>{let hasSubcommands=cmd.parent===program&&ROOT_COMMANDS_WITH_SUBCOMMANDS.has(cmd.name());return theme.command(hasSubcommands?`${cmd.name()} *`:cmd.name())}});let formatHelpOutput=str=>{let output=str;return RegExp(`^Usage:\\s+${CLI_NAME_PATTERN}\\s+\\[options\\]\\s+\\[command\\]\\s*$`,`m`).test(output)&&/^Commands:/m.test(output)&&(output=output.replace(/^Commands:/m,`Commands:\n ${theme.muted(`Hint: commands suffixed with * have subcommands. Run <command> --help for details.`)}`)),output.replace(/^Usage:/gm,theme.heading(`Usage:`)).replace(/^Options:/gm,theme.heading(`Options:`)).replace(/^Commands:/gm,theme.heading(`Commands:`))};program.configureOutput({writeOut:str=>{process.stdout.write(formatHelpOutput(str))},writeErr:str=>{process.stderr.write(formatHelpOutput(str))},outputError:(str,write)=>write(theme.error(str))}),(process.argv.includes(`-V`)||process.argv.includes(`--version`)||process.argv.includes(`-v`))&&(console.log(ctx.programVersion),process.exit(0)),program.addHelpText(`beforeAll`,()=>{if(hasEmittedCliBanner())return``;let rich=isRich();return`\n${formatCliBannerLine(ctx.programVersion,{richTty:rich})}\n`});let fmtExamples=EXAMPLES.map(([cmd,desc])=>` ${theme.command(replaceCliName(cmd,CLI_NAME))}\n ${theme.muted(desc)}`).join(`
2
+ `);program.addHelpText(`afterAll`,({command})=>{if(command!==program)return``;let docs=formatDocsLink(`/cli`,`docs.builderforce.ai/cli`);return`\n${theme.heading(`Examples:`)}\n${fmtExamples}\n\n${theme.muted(`Docs:`)} ${docs}\n`})}function setProcessTitleForCommand(actionCommand){let current=actionCommand;for(;current.parent&&current.parent.parent;)current=current.parent;let name=current.name(),cliName=resolveCliName();!name||name===cliName||(process.title=`${cliName}-${name}`)}const PLUGIN_REQUIRED_COMMANDS=new Set([`message`,`channels`,`directory`]);function registerPreActionHooks(program,programVersion){program.hook(`preAction`,async(_thisCommand,actionCommand)=>{setProcessTitleForCommand(actionCommand);let argv=process.argv;if(hasHelpOrVersion(argv))return;let commandPath=getCommandPath(argv,2);isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_HIDE_BANNER)||commandPath[0]===`update`||commandPath[0]===`completion`||commandPath[0]===`plugins`&&commandPath[1]===`update`||emitCliBanner(programVersion);let verbose=getVerboseFlag(argv,{includeDebug:!0});if(setVerbose(verbose),verbose||(process.env.NODE_NO_WARNINGS??=`1`),commandPath[0]===`doctor`||commandPath[0]===`completion`)return;let{ensureConfigReady}=await import(`./config-guard-B4in8l8I.js`);if(await ensureConfigReady({runtime:defaultRuntime,commandPath}),PLUGIN_REQUIRED_COMMANDS.has(commandPath[0])){let{ensurePluginRegistryLoaded}=await import(`./plugin-registry-B-UOeWqM.js`);ensurePluginRegistryLoaded()}})}function buildProgram(){let program=new Command,ctx=createProgramContext(),argv=process.argv;return setProgramContext(program,ctx),configureProgramHelp(program,ctx),registerPreActionHooks(program,ctx.programVersion),registerProgramCommands(program,ctx,argv),program.option(`-m, --message <text>`,`Start a session and send this as the first message`).action(async opts=>{let{runBuilderForceAgentsSession}=await import(`./builderforce-2EpP2M8q.js`);await runBuilderForceAgentsSession(process.cwd(),{message:opts.message})}),program}export{buildProgram};
@@ -1 +1 @@
1
- import{t as isTruthyEnvValue}from"./env-BIdU5BAp.js";import{r as resolveActionArgs}from"./helpers-CESJCicC.js";const HELP_FLAGS=new Set([`-h`,`--help`]),VERSION_FLAGS=new Set([`-v`,`-V`,`--version`]);function hasHelpOrVersion(argv){return argv.some(arg=>HELP_FLAGS.has(arg)||VERSION_FLAGS.has(arg))?!0:getPrimaryCommand(argv)===`help`}function hasFlag(argv,name){let args=argv.slice(2);for(let arg of args){if(arg===`--`)break;if(arg===name)return!0}return!1}function getVerboseFlag(argv,options){return!!(hasFlag(argv,`--verbose`)||options?.includeDebug&&hasFlag(argv,`--debug`))}function getCommandPath(argv,depth=2){let args=argv.slice(2),path=[];for(let i=0;i<args.length;i+=1){let arg=args[i];if(arg&&(arg===`--`||!arg.startsWith(`-`)&&(path.push(arg),path.length>=depth)))break}return path}function getPrimaryCommand(argv){let[primary]=getCommandPath(argv,1);return primary??null}function buildParseArgv(params){let baseArgv=params.rawArgs&&params.rawArgs.length>0?params.rawArgs:params.fallbackArgv&&params.fallbackArgv.length>0?params.fallbackArgv:process.argv,programName=params.programName??``,normalizedArgv=programName&&baseArgv[0]===programName||baseArgv[0]?.endsWith(`builderforce`)||baseArgv[0]?.endsWith(`builderforce`)?baseArgv.slice(1):baseArgv,executable=(normalizedArgv[0]?.split(/[/\\]/).pop()??``).toLowerCase();return normalizedArgv.length>=2&&(isNodeExecutable(executable)||isBunExecutable(executable))?normalizedArgv:[`node`,programName||`builderforce`,...normalizedArgv]}const nodeExecutablePattern=/^node-\d+(?:\.\d+)*(?:\.exe)?$/;function isNodeExecutable(executable){return executable===`node`||executable===`node.exe`||executable===`nodejs`||executable===`nodejs.exe`||nodeExecutablePattern.test(executable)}function isBunExecutable(executable){return executable===`bun`||executable===`bun.exe`}async function reparseProgramFromActionArgs(program,actionArgs){let actionCommand=actionArgs.at(-1),rawArgs=(actionCommand?.parent??program).rawArgs,actionArgsList=resolveActionArgs(actionCommand),fallbackArgv=actionCommand?.name()?[actionCommand.name(),...actionArgsList]:actionArgsList,parseArgv=buildParseArgv({programName:program.name(),rawArgs,fallbackArgv});await program.parseAsync(parseArgv)}const shouldRegisterPrimaryOnly=argv=>!(isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_DISABLE_LAZY_SUBCOMMANDS)||hasHelpOrVersion(argv)),shouldEagerRegisterSubcommands=_argv=>isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_DISABLE_LAZY_SUBCOMMANDS),loadConfig=async()=>{let{loadConfig:_load}=await import(`./io-6jLoKffb.js`);return _load()},entries=[{name:`acp`,description:`Agent Control Protocol tools`,hasSubcommands:!0,register:async program=>{(await import(`./acp-cli-DcKpPsJa.js`)).registerAcpCli(program)}},{name:`gateway`,description:`Run, inspect, and query the WebSocket Gateway`,hasSubcommands:!0,register:async program=>{(await import(`./gateway-cli-DpJjgVYH.js`)).registerGatewayCli(program)}},{name:`daemon`,description:`Gateway service (legacy alias)`,hasSubcommands:!0,register:async program=>{(await import(`./daemon-cli-Br0wu9xQ.js`)).registerDaemonCli(program)}},{name:`logs`,description:`Tail gateway file logs via RPC`,hasSubcommands:!1,register:async program=>{(await import(`./logs-cli-jh5Xn3TD.js`)).registerLogsCli(program)}},{name:`usage`,description:`Show provider usage / quota (and workspace spend via gateway)`,hasSubcommands:!1,register:async program=>{(await import(`./usage-cli-CfEg1_NZ.js`)).registerUsageCli(program)}},{name:`system`,description:`System events, heartbeat, and presence`,hasSubcommands:!0,register:async program=>{(await import(`./system-cli-b4YgXPHv.js`)).registerSystemCli(program)}},{name:`models`,description:`Discover, scan, and configure models`,hasSubcommands:!0,register:async program=>{(await import(`./models-cli-BcNxU4P_.js`)).registerModelsCli(program)}},{name:`approvals`,description:`Manage exec approvals (gateway or node host)`,hasSubcommands:!0,register:async program=>{(await import(`./exec-approvals-cli-YuOu7mVg.js`)).registerExecApprovalsCli(program)}},{name:`nodes`,description:`Manage gateway-owned node pairing and node commands`,hasSubcommands:!0,register:async program=>{(await import(`./nodes-cli-BX8TznFK.js`)).registerNodesCli(program)}},{name:`devices`,description:`Device pairing + token management`,hasSubcommands:!0,register:async program=>{(await import(`./devices-cli-BfXeDnbx.js`)).registerDevicesCli(program)}},{name:`node`,description:`Run and manage the headless node host service`,hasSubcommands:!0,register:async program=>{(await import(`./node-cli-EmTU-Gh0.js`)).registerNodeCli(program)}},{name:`sandbox`,description:`Manage sandbox containers for agent isolation`,hasSubcommands:!0,register:async program=>{(await import(`./sandbox-cli-B8FpLgyY.js`)).registerSandboxCli(program)}},{name:`tui`,description:`Open a terminal UI connected to the Gateway`,hasSubcommands:!1,register:async program=>{(await import(`./tui-cli-BeFWcUWU.js`)).registerTuiCli(program)}},{name:`cron`,description:`Manage cron jobs via the Gateway scheduler`,hasSubcommands:!0,register:async program=>{(await import(`./cron-cli-CwtTX6pg.js`)).registerCronCli(program)}},{name:`workflow`,description:`Trigger Builderforce workflows from the CLI / CI`,hasSubcommands:!0,register:async program=>{(await import(`./workflow-cli-CYDXEdu_.js`)).registerWorkflowCli(program)}},{name:`dns`,description:`DNS helpers for wide-area discovery (Tailscale + CoreDNS)`,hasSubcommands:!0,register:async program=>{(await import(`./dns-cli-C4f4Tyij.js`)).registerDnsCli(program)}},{name:`docs`,description:`Search the live BuilderForceAgents docs`,hasSubcommands:!1,register:async program=>{(await import(`./docs-cli-CNrjm2Tf.js`)).registerDocsCli(program)}},{name:`hooks`,description:`Manage internal agent hooks`,hasSubcommands:!0,register:async program=>{(await import(`./hooks-cli-DsVmrQAG.js`)).registerHooksCli(program)}},{name:`webhooks`,description:`Webhook helpers and integrations`,hasSubcommands:!0,register:async program=>{(await import(`./webhooks-cli-Bi0t3w6P.js`)).registerWebhooksCli(program)}},{name:`qr`,description:`Generate iOS pairing QR/setup code`,hasSubcommands:!1,register:async program=>{(await import(`./qr-cli-CMlAIzrD.js`)).registerQrCli(program)}},{name:`agentbot`,description:`Legacy agentbot command aliases`,hasSubcommands:!0,register:async program=>{(await import(`./agentbot-cli-Cub3Abbt.js`)).registerAgentbotCli(program)}},{name:`pairing`,description:`Secure DM pairing (approve inbound requests)`,hasSubcommands:!0,register:async program=>{let{registerPluginCliCommands}=await import(`./cli-DkWt7p2x.js`);registerPluginCliCommands(program,await loadConfig()),(await import(`./pairing-cli-CEr0yEsc.js`)).registerPairingCli(program)}},{name:`plugins`,description:`Manage BuilderForceAgents plugins and extensions`,hasSubcommands:!0,register:async program=>{(await import(`./plugins-cli-CPkSgvdL.js`)).registerPluginsCli(program);let{registerPluginCliCommands}=await import(`./cli-DkWt7p2x.js`);registerPluginCliCommands(program,await loadConfig())}},{name:`channels`,description:`Manage connected chat channels (Telegram, Discord, etc.)`,hasSubcommands:!0,register:async program=>{(await import(`./channels-cli-BgKy0MbE.js`)).registerChannelsCli(program)}},{name:`directory`,description:`Lookup contact and group IDs (self, peers, groups) for supported chat channels`,hasSubcommands:!0,register:async program=>{(await import(`./directory-cli-D5ciZ5fY.js`)).registerDirectoryCli(program)}},{name:`security`,description:`Security tools and local config audits`,hasSubcommands:!0,register:async program=>{(await import(`./security-cli-IIMR7Pb4.js`)).registerSecurityCli(program)}},{name:`skills`,description:`List and inspect available skills`,hasSubcommands:!0,register:async program=>{(await import(`./skills-cli-BXbGr7vl.js`)).registerSkillsCli(program)}},{name:`update`,description:`Update BuilderForceAgents and inspect update channel status`,hasSubcommands:!0,register:async program=>{(await import(`./update-cli-DekV-CP_.js`)).registerUpdateCli(program)}},{name:`completion`,description:`Generate shell completion script`,hasSubcommands:!1,register:async program=>{(await import(`./completion-cli-C7munVvb.js`)).registerCompletionCli(program)}}];function getSubCliEntries(){return entries}function getSubCliCommandsWithSubcommands(){return entries.filter(entry=>entry.hasSubcommands).map(entry=>entry.name)}function removeCommand$1(program,command){let commands=program.commands,index=commands.indexOf(command);index>=0&&commands.splice(index,1)}async function registerSubCliByName(program,name){let entry=entries.find(candidate=>candidate.name===name);if(!entry)return!1;let existing=program.commands.find(cmd=>cmd.name()===entry.name);return existing&&removeCommand$1(program,existing),await entry.register(program),!0}function registerLazyCommand(program,entry){let placeholder=program.command(entry.name).description(entry.description);placeholder.allowUnknownOption(!0),placeholder.allowExcessArguments(!0),placeholder.action(async(...actionArgs)=>{removeCommand$1(program,placeholder),await entry.register(program),await reparseProgramFromActionArgs(program,actionArgs)})}function registerSubCliCommands(program,argv=process.argv){if(shouldEagerRegisterSubcommands(argv)){for(let entry of entries)entry.register(program);return}let primary=getPrimaryCommand(argv);if(primary&&shouldRegisterPrimaryOnly(argv)){let entry=entries.find(candidate=>candidate.name===primary);if(entry){registerLazyCommand(program,entry);return}}for(let candidate of entries)registerLazyCommand(program,candidate)}const shouldRegisterCorePrimaryOnly=argv=>!hasHelpOrVersion(argv),coreEntries=[{commands:[{name:`setup`,description:`Initialize local config and agent workspace`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.setup-Dk9hBOkZ.js`)).registerSetupCommand(program)}},{commands:[{name:`onboard`,description:`Interactive onboarding wizard for gateway, workspace, and skills`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.onboard-C2Cnd-e9.js`)).registerOnboardCommand(program)}},{commands:[{name:`connect`,description:`Register this machine as an agent host in a Builderforce workspace`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.connect-XYBhwMY8.js`)).registerConnectCommand(program)}},{commands:[{name:`configure`,description:`Interactive setup wizard for credentials, channels, gateway, and agent defaults`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.configure-DZG7-WVi.js`)).registerConfigureCommand(program)}},{commands:[{name:`config`,description:`Non-interactive config helpers (get/set/unset). Default: starts setup wizard.`,hasSubcommands:!0}],register:async({program})=>{(await import(`./config-cli-DeiQz5sY.js`)).registerConfigCli(program)}},{commands:[{name:`doctor`,description:`Health checks + quick fixes for the gateway and channels`,hasSubcommands:!1},{name:`dashboard`,description:`Open the Control UI with your current token`,hasSubcommands:!1},{name:`reset`,description:`Reset local config/state (keeps the CLI installed)`,hasSubcommands:!1},{name:`stop`,description:`Stop the running gateway service`,hasSubcommands:!1},{name:`uninstall`,description:`Uninstall the gateway service + local data (CLI remains)`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.maintenance-BmnagkdH.js`)).registerMaintenanceCommands(program)}},{commands:[{name:`message`,description:`Send, read, and manage messages`,hasSubcommands:!0}],register:async({program,ctx})=>{(await import(`./register.message-DiZRRAE5.js`)).registerMessageCommands(program,ctx)}},{commands:[{name:`memory`,description:`Search and reindex memory files`,hasSubcommands:!0}],register:async({program})=>{(await import(`./memory-cli-PdyTQ84w.js`)).registerMemoryCli(program)}},{commands:[{name:`agent`,description:`Run one agent turn via the Gateway`,hasSubcommands:!1},{name:`agents`,description:`Manage isolated agents (workspaces, auth, routing)`,hasSubcommands:!0}],register:async({program,ctx})=>{(await import(`./register.agent-BA6LIJSb.js`)).registerAgentCommands(program,{agentChannelOptions:ctx.agentChannelOptions})}},{commands:[{name:`status`,description:`Show channel health and recent session recipients`,hasSubcommands:!1},{name:`health`,description:`Fetch health from the running gateway`,hasSubcommands:!1},{name:`sessions`,description:`List stored conversation sessions`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.status-health-sessions-ZSufYw5j.js`)).registerStatusHealthSessionsCommands(program)}},{commands:[{name:`browser`,description:`Manage BuilderForceAgents's dedicated browser (Chrome/Chromium)`,hasSubcommands:!0}],register:async({program})=>{(await import(`./browser-cli-CoRx_4iM.js`)).registerBrowserCli(program)}},{commands:[{name:`init`,description:`Initialize a project with builderForceAgents`,hasSubcommands:!1},{name:`project`,description:`Manage builderForceAgents project context`,hasSubcommands:!0},{name:`workforce`,description:`Manage Builderforce Workforce agents (custom trained LLMs)`,hasSubcommands:!0}],register:async({program})=>{let mod=await import(`./builderforce-BWCp-M9e.js`);program.addCommand(mod.createInitCommand()),program.addCommand(mod.createBuilderForceAgentsCommand()),program.addCommand(mod.createAgentCommand())}}];function collectCoreCliCommandNames(predicate){let seen=new Set,names=[];for(let entry of coreEntries)for(let command of entry.commands)predicate&&!predicate(command)||seen.has(command.name)||(seen.add(command.name),names.push(command.name));return names}function getCoreCliCommandNames(){return collectCoreCliCommandNames()}function getCoreCliCommandsWithSubcommands(){return collectCoreCliCommandNames(command=>command.hasSubcommands)}function removeCommand(program,command){let commands=program.commands,index=commands.indexOf(command);index>=0&&commands.splice(index,1)}function removeEntryCommands(program,entry){for(let cmd of entry.commands){let existing=program.commands.find(c=>c.name()===cmd.name);existing&&removeCommand(program,existing)}}function registerLazyCoreCommand(program,ctx,entry,command){let placeholder=program.command(command.name).description(command.description);placeholder.allowUnknownOption(!0),placeholder.allowExcessArguments(!0),placeholder.action(async(...actionArgs)=>{removeEntryCommands(program,entry),await entry.register({program,ctx,argv:process.argv}),await reparseProgramFromActionArgs(program,actionArgs)})}async function registerCoreCliByName(program,ctx,name,argv=process.argv){let entry=coreEntries.find(candidate=>candidate.commands.some(cmd=>cmd.name===name));return entry?(removeEntryCommands(program,entry),await entry.register({program,ctx,argv}),!0):!1}function registerCoreCliCommands(program,ctx,argv){let primary=getPrimaryCommand(argv);if(primary&&shouldRegisterCorePrimaryOnly(argv)){let entry=coreEntries.find(candidate=>candidate.commands.some(cmd=>cmd.name===primary));if(entry){let cmd=entry.commands.find(c=>c.name===primary);cmd&&registerLazyCoreCommand(program,ctx,entry,cmd);return}}for(let entry of coreEntries)for(let cmd of entry.commands)registerLazyCoreCommand(program,ctx,entry,cmd)}function registerProgramCommands(program,ctx,argv=process.argv){registerCoreCliCommands(program,ctx,argv),registerSubCliCommands(program,argv)}const PROGRAM_CONTEXT_SYMBOL=Symbol.for(`builderforce.cli.programContext`);function setProgramContext(program,ctx){program[PROGRAM_CONTEXT_SYMBOL]=ctx}function getProgramContext(program){return program[PROGRAM_CONTEXT_SYMBOL]}export{registerCoreCliByName as a,getSubCliEntries as c,getVerboseFlag as d,hasHelpOrVersion as f,getCoreCliCommandsWithSubcommands as i,registerSubCliByName as l,setProgramContext as n,registerProgramCommands as o,getCoreCliCommandNames as r,getSubCliCommandsWithSubcommands as s,getProgramContext as t,getCommandPath as u};
1
+ import{t as isTruthyEnvValue}from"./env-BIdU5BAp.js";import{r as resolveActionArgs}from"./helpers-CESJCicC.js";const HELP_FLAGS=new Set([`-h`,`--help`]),VERSION_FLAGS=new Set([`-v`,`-V`,`--version`]);function hasHelpOrVersion(argv){return argv.some(arg=>HELP_FLAGS.has(arg)||VERSION_FLAGS.has(arg))?!0:getPrimaryCommand(argv)===`help`}function hasFlag(argv,name){let args=argv.slice(2);for(let arg of args){if(arg===`--`)break;if(arg===name)return!0}return!1}function getVerboseFlag(argv,options){return!!(hasFlag(argv,`--verbose`)||options?.includeDebug&&hasFlag(argv,`--debug`))}function getCommandPath(argv,depth=2){let args=argv.slice(2),path=[];for(let i=0;i<args.length;i+=1){let arg=args[i];if(arg&&(arg===`--`||!arg.startsWith(`-`)&&(path.push(arg),path.length>=depth)))break}return path}function getPrimaryCommand(argv){let[primary]=getCommandPath(argv,1);return primary??null}function buildParseArgv(params){let baseArgv=params.rawArgs&&params.rawArgs.length>0?params.rawArgs:params.fallbackArgv&&params.fallbackArgv.length>0?params.fallbackArgv:process.argv,programName=params.programName??``,normalizedArgv=programName&&baseArgv[0]===programName||baseArgv[0]?.endsWith(`builderforce`)||baseArgv[0]?.endsWith(`builderforce`)?baseArgv.slice(1):baseArgv,executable=(normalizedArgv[0]?.split(/[/\\]/).pop()??``).toLowerCase();return normalizedArgv.length>=2&&(isNodeExecutable(executable)||isBunExecutable(executable))?normalizedArgv:[`node`,programName||`builderforce`,...normalizedArgv]}const nodeExecutablePattern=/^node-\d+(?:\.\d+)*(?:\.exe)?$/;function isNodeExecutable(executable){return executable===`node`||executable===`node.exe`||executable===`nodejs`||executable===`nodejs.exe`||nodeExecutablePattern.test(executable)}function isBunExecutable(executable){return executable===`bun`||executable===`bun.exe`}async function reparseProgramFromActionArgs(program,actionArgs){let actionCommand=actionArgs.at(-1),rawArgs=(actionCommand?.parent??program).rawArgs,actionArgsList=resolveActionArgs(actionCommand),fallbackArgv=actionCommand?.name()?[actionCommand.name(),...actionArgsList]:actionArgsList,parseArgv=buildParseArgv({programName:program.name(),rawArgs,fallbackArgv});await program.parseAsync(parseArgv)}const shouldRegisterPrimaryOnly=argv=>!(isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_DISABLE_LAZY_SUBCOMMANDS)||hasHelpOrVersion(argv)),shouldEagerRegisterSubcommands=_argv=>isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_DISABLE_LAZY_SUBCOMMANDS),loadConfig=async()=>{let{loadConfig:_load}=await import(`./io-6jLoKffb.js`);return _load()},entries=[{name:`acp`,description:`Agent Control Protocol tools`,hasSubcommands:!0,register:async program=>{(await import(`./acp-cli-DcKpPsJa.js`)).registerAcpCli(program)}},{name:`gateway`,description:`Run, inspect, and query the WebSocket Gateway`,hasSubcommands:!0,register:async program=>{(await import(`./gateway-cli-CiHNwzdS.js`)).registerGatewayCli(program)}},{name:`daemon`,description:`Gateway service (legacy alias)`,hasSubcommands:!0,register:async program=>{(await import(`./daemon-cli-Br0wu9xQ.js`)).registerDaemonCli(program)}},{name:`logs`,description:`Tail gateway file logs via RPC`,hasSubcommands:!1,register:async program=>{(await import(`./logs-cli-jh5Xn3TD.js`)).registerLogsCli(program)}},{name:`usage`,description:`Show provider usage / quota (and workspace spend via gateway)`,hasSubcommands:!1,register:async program=>{(await import(`./usage-cli-CfEg1_NZ.js`)).registerUsageCli(program)}},{name:`system`,description:`System events, heartbeat, and presence`,hasSubcommands:!0,register:async program=>{(await import(`./system-cli-b4YgXPHv.js`)).registerSystemCli(program)}},{name:`models`,description:`Discover, scan, and configure models`,hasSubcommands:!0,register:async program=>{(await import(`./models-cli-BcNxU4P_.js`)).registerModelsCli(program)}},{name:`approvals`,description:`Manage exec approvals (gateway or node host)`,hasSubcommands:!0,register:async program=>{(await import(`./exec-approvals-cli-YuOu7mVg.js`)).registerExecApprovalsCli(program)}},{name:`nodes`,description:`Manage gateway-owned node pairing and node commands`,hasSubcommands:!0,register:async program=>{(await import(`./nodes-cli-BX8TznFK.js`)).registerNodesCli(program)}},{name:`devices`,description:`Device pairing + token management`,hasSubcommands:!0,register:async program=>{(await import(`./devices-cli-BfXeDnbx.js`)).registerDevicesCli(program)}},{name:`node`,description:`Run and manage the headless node host service`,hasSubcommands:!0,register:async program=>{(await import(`./node-cli-EmTU-Gh0.js`)).registerNodeCli(program)}},{name:`sandbox`,description:`Manage sandbox containers for agent isolation`,hasSubcommands:!0,register:async program=>{(await import(`./sandbox-cli-B8FpLgyY.js`)).registerSandboxCli(program)}},{name:`tui`,description:`Open a terminal UI connected to the Gateway`,hasSubcommands:!1,register:async program=>{(await import(`./tui-cli-GW-qybY6.js`)).registerTuiCli(program)}},{name:`cron`,description:`Manage cron jobs via the Gateway scheduler`,hasSubcommands:!0,register:async program=>{(await import(`./cron-cli-CwtTX6pg.js`)).registerCronCli(program)}},{name:`workflow`,description:`Trigger Builderforce workflows from the CLI / CI`,hasSubcommands:!0,register:async program=>{(await import(`./workflow-cli-CYDXEdu_.js`)).registerWorkflowCli(program)}},{name:`dns`,description:`DNS helpers for wide-area discovery (Tailscale + CoreDNS)`,hasSubcommands:!0,register:async program=>{(await import(`./dns-cli-C4f4Tyij.js`)).registerDnsCli(program)}},{name:`docs`,description:`Search the live BuilderForceAgents docs`,hasSubcommands:!1,register:async program=>{(await import(`./docs-cli-CNrjm2Tf.js`)).registerDocsCli(program)}},{name:`hooks`,description:`Manage internal agent hooks`,hasSubcommands:!0,register:async program=>{(await import(`./hooks-cli-DsVmrQAG.js`)).registerHooksCli(program)}},{name:`webhooks`,description:`Webhook helpers and integrations`,hasSubcommands:!0,register:async program=>{(await import(`./webhooks-cli-Bi0t3w6P.js`)).registerWebhooksCli(program)}},{name:`qr`,description:`Generate iOS pairing QR/setup code`,hasSubcommands:!1,register:async program=>{(await import(`./qr-cli-CMlAIzrD.js`)).registerQrCli(program)}},{name:`agentbot`,description:`Legacy agentbot command aliases`,hasSubcommands:!0,register:async program=>{(await import(`./agentbot-cli-Cub3Abbt.js`)).registerAgentbotCli(program)}},{name:`pairing`,description:`Secure DM pairing (approve inbound requests)`,hasSubcommands:!0,register:async program=>{let{registerPluginCliCommands}=await import(`./cli-DkWt7p2x.js`);registerPluginCliCommands(program,await loadConfig()),(await import(`./pairing-cli-CEr0yEsc.js`)).registerPairingCli(program)}},{name:`plugins`,description:`Manage BuilderForceAgents plugins and extensions`,hasSubcommands:!0,register:async program=>{(await import(`./plugins-cli-CPkSgvdL.js`)).registerPluginsCli(program);let{registerPluginCliCommands}=await import(`./cli-DkWt7p2x.js`);registerPluginCliCommands(program,await loadConfig())}},{name:`channels`,description:`Manage connected chat channels (Telegram, Discord, etc.)`,hasSubcommands:!0,register:async program=>{(await import(`./channels-cli-BgKy0MbE.js`)).registerChannelsCli(program)}},{name:`directory`,description:`Lookup contact and group IDs (self, peers, groups) for supported chat channels`,hasSubcommands:!0,register:async program=>{(await import(`./directory-cli-D5ciZ5fY.js`)).registerDirectoryCli(program)}},{name:`security`,description:`Security tools and local config audits`,hasSubcommands:!0,register:async program=>{(await import(`./security-cli-IIMR7Pb4.js`)).registerSecurityCli(program)}},{name:`skills`,description:`List and inspect available skills`,hasSubcommands:!0,register:async program=>{(await import(`./skills-cli-BXbGr7vl.js`)).registerSkillsCli(program)}},{name:`update`,description:`Update BuilderForceAgents and inspect update channel status`,hasSubcommands:!0,register:async program=>{(await import(`./update-cli-K5dGZmg8.js`)).registerUpdateCli(program)}},{name:`completion`,description:`Generate shell completion script`,hasSubcommands:!1,register:async program=>{(await import(`./completion-cli-Bqr0W4L6.js`)).registerCompletionCli(program)}}];function getSubCliEntries(){return entries}function getSubCliCommandsWithSubcommands(){return entries.filter(entry=>entry.hasSubcommands).map(entry=>entry.name)}function removeCommand$1(program,command){let commands=program.commands,index=commands.indexOf(command);index>=0&&commands.splice(index,1)}async function registerSubCliByName(program,name){let entry=entries.find(candidate=>candidate.name===name);if(!entry)return!1;let existing=program.commands.find(cmd=>cmd.name()===entry.name);return existing&&removeCommand$1(program,existing),await entry.register(program),!0}function registerLazyCommand(program,entry){let placeholder=program.command(entry.name).description(entry.description);placeholder.allowUnknownOption(!0),placeholder.allowExcessArguments(!0),placeholder.action(async(...actionArgs)=>{removeCommand$1(program,placeholder),await entry.register(program),await reparseProgramFromActionArgs(program,actionArgs)})}function registerSubCliCommands(program,argv=process.argv){if(shouldEagerRegisterSubcommands(argv)){for(let entry of entries)entry.register(program);return}let primary=getPrimaryCommand(argv);if(primary&&shouldRegisterPrimaryOnly(argv)){let entry=entries.find(candidate=>candidate.name===primary);if(entry){registerLazyCommand(program,entry);return}}for(let candidate of entries)registerLazyCommand(program,candidate)}const shouldRegisterCorePrimaryOnly=argv=>!hasHelpOrVersion(argv),coreEntries=[{commands:[{name:`setup`,description:`Initialize local config and agent workspace`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.setup-CtcAR3JR.js`)).registerSetupCommand(program)}},{commands:[{name:`onboard`,description:`Interactive onboarding wizard for gateway, workspace, and skills`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.onboard-BoUicPRh.js`)).registerOnboardCommand(program)}},{commands:[{name:`connect`,description:`Register this machine as an agent host in a Builderforce workspace`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.connect-XYBhwMY8.js`)).registerConnectCommand(program)}},{commands:[{name:`configure`,description:`Interactive setup wizard for credentials, channels, gateway, and agent defaults`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.configure-DZG7-WVi.js`)).registerConfigureCommand(program)}},{commands:[{name:`config`,description:`Non-interactive config helpers (get/set/unset). Default: starts setup wizard.`,hasSubcommands:!0}],register:async({program})=>{(await import(`./config-cli-DeiQz5sY.js`)).registerConfigCli(program)}},{commands:[{name:`doctor`,description:`Health checks + quick fixes for the gateway and channels`,hasSubcommands:!1},{name:`dashboard`,description:`Open the Control UI with your current token`,hasSubcommands:!1},{name:`reset`,description:`Reset local config/state (keeps the CLI installed)`,hasSubcommands:!1},{name:`stop`,description:`Stop the running gateway service`,hasSubcommands:!1},{name:`uninstall`,description:`Uninstall the gateway service + local data (CLI remains)`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.maintenance-D8WmeEaD.js`)).registerMaintenanceCommands(program)}},{commands:[{name:`message`,description:`Send, read, and manage messages`,hasSubcommands:!0}],register:async({program,ctx})=>{(await import(`./register.message-DiZRRAE5.js`)).registerMessageCommands(program,ctx)}},{commands:[{name:`memory`,description:`Search and reindex memory files`,hasSubcommands:!0}],register:async({program})=>{(await import(`./memory-cli-PdyTQ84w.js`)).registerMemoryCli(program)}},{commands:[{name:`agent`,description:`Run one agent turn via the Gateway`,hasSubcommands:!1},{name:`agents`,description:`Manage isolated agents (workspaces, auth, routing)`,hasSubcommands:!0}],register:async({program,ctx})=>{(await import(`./register.agent-BA6LIJSb.js`)).registerAgentCommands(program,{agentChannelOptions:ctx.agentChannelOptions})}},{commands:[{name:`status`,description:`Show channel health and recent session recipients`,hasSubcommands:!1},{name:`health`,description:`Fetch health from the running gateway`,hasSubcommands:!1},{name:`sessions`,description:`List stored conversation sessions`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.status-health-sessions-ZSufYw5j.js`)).registerStatusHealthSessionsCommands(program)}},{commands:[{name:`browser`,description:`Manage BuilderForceAgents's dedicated browser (Chrome/Chromium)`,hasSubcommands:!0}],register:async({program})=>{(await import(`./browser-cli-CoRx_4iM.js`)).registerBrowserCli(program)}},{commands:[{name:`init`,description:`Initialize a project with builderForceAgents`,hasSubcommands:!1},{name:`project`,description:`Manage builderForceAgents project context`,hasSubcommands:!0},{name:`workforce`,description:`Manage Builderforce Workforce agents (custom trained LLMs)`,hasSubcommands:!0}],register:async({program})=>{let mod=await import(`./builderforce-Cyg20uU8.js`);program.addCommand(mod.createInitCommand()),program.addCommand(mod.createBuilderForceAgentsCommand()),program.addCommand(mod.createAgentCommand())}}];function collectCoreCliCommandNames(predicate){let seen=new Set,names=[];for(let entry of coreEntries)for(let command of entry.commands)predicate&&!predicate(command)||seen.has(command.name)||(seen.add(command.name),names.push(command.name));return names}function getCoreCliCommandNames(){return collectCoreCliCommandNames()}function getCoreCliCommandsWithSubcommands(){return collectCoreCliCommandNames(command=>command.hasSubcommands)}function removeCommand(program,command){let commands=program.commands,index=commands.indexOf(command);index>=0&&commands.splice(index,1)}function removeEntryCommands(program,entry){for(let cmd of entry.commands){let existing=program.commands.find(c=>c.name()===cmd.name);existing&&removeCommand(program,existing)}}function registerLazyCoreCommand(program,ctx,entry,command){let placeholder=program.command(command.name).description(command.description);placeholder.allowUnknownOption(!0),placeholder.allowExcessArguments(!0),placeholder.action(async(...actionArgs)=>{removeEntryCommands(program,entry),await entry.register({program,ctx,argv:process.argv}),await reparseProgramFromActionArgs(program,actionArgs)})}async function registerCoreCliByName(program,ctx,name,argv=process.argv){let entry=coreEntries.find(candidate=>candidate.commands.some(cmd=>cmd.name===name));return entry?(removeEntryCommands(program,entry),await entry.register({program,ctx,argv}),!0):!1}function registerCoreCliCommands(program,ctx,argv){let primary=getPrimaryCommand(argv);if(primary&&shouldRegisterCorePrimaryOnly(argv)){let entry=coreEntries.find(candidate=>candidate.commands.some(cmd=>cmd.name===primary));if(entry){let cmd=entry.commands.find(c=>c.name===primary);cmd&&registerLazyCoreCommand(program,ctx,entry,cmd);return}}for(let entry of coreEntries)for(let cmd of entry.commands)registerLazyCoreCommand(program,ctx,entry,cmd)}function registerProgramCommands(program,ctx,argv=process.argv){registerCoreCliCommands(program,ctx,argv),registerSubCliCommands(program,argv)}const PROGRAM_CONTEXT_SYMBOL=Symbol.for(`builderforce.cli.programContext`);function setProgramContext(program,ctx){program[PROGRAM_CONTEXT_SYMBOL]=ctx}function getProgramContext(program){return program[PROGRAM_CONTEXT_SYMBOL]}export{registerCoreCliByName as a,getSubCliEntries as c,getVerboseFlag as d,hasHelpOrVersion as f,getCoreCliCommandsWithSubcommands as i,registerSubCliByName as l,setProgramContext as n,registerProgramCommands as o,getCoreCliCommandNames as r,getSubCliCommandsWithSubcommands as s,getProgramContext as t,getCommandPath as u};
@@ -1,4 +1,4 @@
1
- import{d as resolveIsNixMode,f as resolveLegacyStateDirs,g as resolveStateDir,m as resolveOAuthDir,p as resolveNewStateDir,t as CONFIG_PATH,u as resolveGatewayPort,y as resolveRequiredHomeDir}from"./paths-BHg-VHB4.js";import{C as sleep,S as shortenHomePath,W as getResolvedLoggerSettings,_ as resolveHomeDir$1,d as isRecord,y as resolveUserPath}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{H as resolveConfiguredModelRef,N as getModelRefStatus,S as updateAuthProfileStoreWithLock,W as resolveHooksGmailModel,_n as DEFAULT_PROVIDER,b as ensureAuthProfileStore,bn as CODEX_CLI_PROFILE_ID,gn as DEFAULT_MODEL,o as resolveProfileUnusableUntilForDisplay,p as repairOAuthProfileIdMismatch,qt as resolveApiKeyForProvider,s as resolveApiKeyForProfile,yn as CLAUDE_CLI_PROFILE_ID}from"./auth-profiles-C1VbcUOm.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,n as DEFAULT_ACCOUNT_ID}from"./session-key-CksCYipj.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{n as runExec,t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir,i as resolveAgentDir,l as resolveDefaultAgentId,p as DEFAULT_AGENTS_FILENAME}from"./agent-scope-CufEmNj_.js";import{a as readConfigFileSnapshot,c as writeConfigFile,p as BuilderForceAgentsSchema}from"./io-CohJffHG.js";import{t as migrateLegacyConfig}from"./config-toczWD3q.js";import{r as loadModelCatalog}from"./model-catalog-CiiFJX77.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-CGlKz1D1.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-DmAU4cRX.js";import{l as resolveGatewayBindHost,n as isLoopbackHost}from"./net-DtnXq2dW.js";import{Mn as buildAuthHealthSummary,Nn as formatRemainingShort,jn as DEFAULT_OAUTH_WARN_MS,w as loadBuilderForceAgentsPlugins}from"./subagent-registry-CyGxu3kP.js";import{A as canonicalizeMainSessionAlias,N as resolveMainSessionKey,X as cleanStaleLockFiles,a as loadSessionStore,c as saveSessionStore}from"./sessions-Bl1wwotX.js";import{c as listTelegramAccountIds,l as resolveTelegramAccount,n as listChannelPlugins}from"./plugins-1Mn6RiNf.js";import{D as DEFAULT_SANDBOX_IMAGE,E as DEFAULT_SANDBOX_COMMON_IMAGE,T as DEFAULT_SANDBOX_BROWSER_IMAGE,f as resolveSandboxScope}from"./sandbox-z9t_PRf9.js";import{i as resolveGatewayAuth}from"./auth-ChecwOXS.js";import{a as formatPortDiagnostics,n as inspectPortUsage}from"./ports-DTku9NSx.js";import{c as resolveStorePath,n as resolveSessionFilePath,s as resolveSessionTranscriptsDirForAgent}from"./paths-ClsbsPQP.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName,m as resolveNodeLaunchAgentLabel}from"./constants-D2th5NXV.js";import{c as getDefaultMemoryDirs,l as getDefaultMemoryFilePaths}from"./sqlite-CIGM1WKg.js";import{r as resolveMemorySearchConfig}from"./manager-CRba8roB.js";import{t as formatDurationCompact}from"./format-duration-HN2dpHE0.js";import{f as printWizardHeader,m as randomToken,n as applyWizardMetadata,s as guardCancel}from"./onboard-helpers-CckrS8_K.js";import{n as isWSLEnv,t as isWSL}from"./wsl-BO1sLIB6.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BMWmaqSC.js";import{t as note$1}from"./note-DgDXuE0F.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DPPVplyk.js";import{t as applyPluginAutoEnable}from"./plugin-auto-enable-BV9K9Vhr.js";import{t as isWithinDir}from"./path-safety-D04ClLIY.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-NLYb8w9i.js";import{a as gatewayInstallErrorHint,f as renderSystemNodeWarning,i as buildGatewayInstallPlan,m as resolveSystemNodeInfo,n as GATEWAY_DAEMON_RUNTIME_OPTIONS,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-B4UjqdyJ.js";import{r as isSystemdUserServiceAvailable}from"./systemd-DdVd5Yet.js";import{a as launchAgentPlistExists,i as isLaunchAgentLoaded,o as repairLaunchAgentBootstrap,r as isLaunchAgentListed,s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-EKJG69M3.js";import{a as isSystemdUnavailableDetail,c as auditGatewayServiceConfig,l as needsNodeRuntimeMigration,o as renderSystemdUnavailableHints,s as SERVICE_AUDIT_CODES,y as formatRuntimeStatus}from"./lifecycle-core-BpMvDXy1.js";import{t as readLastGatewayErrorLine}from"./diagnostics-DamNPi4e.js";import{a as renderGatewayServiceCleanupHints,i as findExtraGatewayServices}from"./daemon-cli-DyVsMf8p.js";import{r as healthCommand}from"./health-DVo8a9yg.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-BxgWcomx.js";import{n as isNumericTelegramUserId,r as normalizeTelegramAllowFromEntry,t as resolveDmAllowState}from"./dm-policy-shared-CRZpjRv0.js";import{n as runGatewayUpdate,t as resolveAgentSessionDirs}from"./session-dirs-OxQuIvJW.js";import{n as logConfigUpdated}from"./logging-ayt7F7vy.js";import{t as ensureSystemdUserLingerInteractive}from"./systemd-linger-CPKngdUf.js";import{t as formatHealthCheckFailure}from"./health-format-D4MaIjaG.js";import{n as doctorShellCompletion}from"./doctor-completion-FErwMP3Y.js";import{execFile}from"node:child_process";import os from"node:os";import path from"node:path";import fs from"node:fs";import{promisify}from"node:util";import JSON5 from"json5";import fs$1 from"node:fs/promises";import{confirm,intro,outro,select}from"@clack/prompts";async function maybeRepairAnthropicOAuthProfileId(cfg,prompter){let repair=repairOAuthProfileIdMismatch({cfg,store:await ensureAuthProfileStore(),provider:`anthropic`,legacyProfileId:`anthropic:default`});return!repair.migrated||repair.changes.length===0||(note$1(repair.changes.map(c=>`- ${c}`).join(`
1
+ import{d as resolveIsNixMode,f as resolveLegacyStateDirs,g as resolveStateDir,m as resolveOAuthDir,p as resolveNewStateDir,t as CONFIG_PATH,u as resolveGatewayPort,y as resolveRequiredHomeDir}from"./paths-BHg-VHB4.js";import{C as sleep,S as shortenHomePath,W as getResolvedLoggerSettings,_ as resolveHomeDir$1,d as isRecord,y as resolveUserPath}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{H as resolveConfiguredModelRef,N as getModelRefStatus,S as updateAuthProfileStoreWithLock,W as resolveHooksGmailModel,_n as DEFAULT_PROVIDER,b as ensureAuthProfileStore,bn as CODEX_CLI_PROFILE_ID,gn as DEFAULT_MODEL,o as resolveProfileUnusableUntilForDisplay,p as repairOAuthProfileIdMismatch,qt as resolveApiKeyForProvider,s as resolveApiKeyForProfile,yn as CLAUDE_CLI_PROFILE_ID}from"./auth-profiles-C1VbcUOm.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,n as DEFAULT_ACCOUNT_ID}from"./session-key-CksCYipj.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{n as runExec,t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir,i as resolveAgentDir,l as resolveDefaultAgentId,p as DEFAULT_AGENTS_FILENAME}from"./agent-scope-CufEmNj_.js";import{a as readConfigFileSnapshot,c as writeConfigFile,p as BuilderForceAgentsSchema}from"./io-CohJffHG.js";import{t as migrateLegacyConfig}from"./config-toczWD3q.js";import{r as loadModelCatalog}from"./model-catalog-CiiFJX77.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-CGlKz1D1.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-DmAU4cRX.js";import{l as resolveGatewayBindHost,n as isLoopbackHost}from"./net-DtnXq2dW.js";import{Mn as buildAuthHealthSummary,Nn as formatRemainingShort,jn as DEFAULT_OAUTH_WARN_MS,w as loadBuilderForceAgentsPlugins}from"./subagent-registry-CyGxu3kP.js";import{A as canonicalizeMainSessionAlias,N as resolveMainSessionKey,X as cleanStaleLockFiles,a as loadSessionStore,c as saveSessionStore}from"./sessions-Bl1wwotX.js";import{c as listTelegramAccountIds,l as resolveTelegramAccount,n as listChannelPlugins}from"./plugins-1Mn6RiNf.js";import{D as DEFAULT_SANDBOX_IMAGE,E as DEFAULT_SANDBOX_COMMON_IMAGE,T as DEFAULT_SANDBOX_BROWSER_IMAGE,f as resolveSandboxScope}from"./sandbox-z9t_PRf9.js";import{i as resolveGatewayAuth}from"./auth-ChecwOXS.js";import{a as formatPortDiagnostics,n as inspectPortUsage}from"./ports-DTku9NSx.js";import{c as resolveStorePath,n as resolveSessionFilePath,s as resolveSessionTranscriptsDirForAgent}from"./paths-ClsbsPQP.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName,m as resolveNodeLaunchAgentLabel}from"./constants-D2th5NXV.js";import{c as getDefaultMemoryDirs,l as getDefaultMemoryFilePaths}from"./sqlite-CIGM1WKg.js";import{r as resolveMemorySearchConfig}from"./manager-CRba8roB.js";import{t as formatDurationCompact}from"./format-duration-HN2dpHE0.js";import{f as printWizardHeader,m as randomToken,n as applyWizardMetadata,s as guardCancel}from"./onboard-helpers-CckrS8_K.js";import{n as isWSLEnv,t as isWSL}from"./wsl-BO1sLIB6.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BMWmaqSC.js";import{t as note$1}from"./note-DgDXuE0F.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DPPVplyk.js";import{t as applyPluginAutoEnable}from"./plugin-auto-enable-BV9K9Vhr.js";import{t as isWithinDir}from"./path-safety-D04ClLIY.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-NLYb8w9i.js";import{a as gatewayInstallErrorHint,f as renderSystemNodeWarning,i as buildGatewayInstallPlan,m as resolveSystemNodeInfo,n as GATEWAY_DAEMON_RUNTIME_OPTIONS,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-B4UjqdyJ.js";import{r as isSystemdUserServiceAvailable}from"./systemd-DdVd5Yet.js";import{a as launchAgentPlistExists,i as isLaunchAgentLoaded,o as repairLaunchAgentBootstrap,r as isLaunchAgentListed,s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-EKJG69M3.js";import{a as isSystemdUnavailableDetail,c as auditGatewayServiceConfig,l as needsNodeRuntimeMigration,o as renderSystemdUnavailableHints,s as SERVICE_AUDIT_CODES,y as formatRuntimeStatus}from"./lifecycle-core-BpMvDXy1.js";import{t as readLastGatewayErrorLine}from"./diagnostics-DamNPi4e.js";import{a as renderGatewayServiceCleanupHints,i as findExtraGatewayServices}from"./daemon-cli-DyVsMf8p.js";import{r as healthCommand}from"./health-DVo8a9yg.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-BxgWcomx.js";import{n as isNumericTelegramUserId,r as normalizeTelegramAllowFromEntry,t as resolveDmAllowState}from"./dm-policy-shared-CRZpjRv0.js";import{n as runGatewayUpdate,t as resolveAgentSessionDirs}from"./session-dirs-OxQuIvJW.js";import{n as logConfigUpdated}from"./logging-ayt7F7vy.js";import{t as ensureSystemdUserLingerInteractive}from"./systemd-linger-CPKngdUf.js";import{t as formatHealthCheckFailure}from"./health-format-D4MaIjaG.js";import{n as doctorShellCompletion}from"./doctor-completion-BjBTLcoC.js";import{execFile}from"node:child_process";import os from"node:os";import path from"node:path";import fs from"node:fs";import{promisify}from"node:util";import JSON5 from"json5";import fs$1 from"node:fs/promises";import{confirm,intro,outro,select}from"@clack/prompts";async function maybeRepairAnthropicOAuthProfileId(cfg,prompter){let repair=repairOAuthProfileIdMismatch({cfg,store:await ensureAuthProfileStore(),provider:`anthropic`,legacyProfileId:`anthropic:default`});return!repair.migrated||repair.changes.length===0||(note$1(repair.changes.map(c=>`- ${c}`).join(`
2
2
  `),`Auth profiles`),!await prompter.confirm({message:`Update Anthropic OAuth profile id in config now?`,initialValue:!0}))?cfg:repair.config}function pruneAuthOrder(order,profileIds){if(!order)return{next:order,changed:!1};let changed=!1,next={};for(let[provider,list]of Object.entries(order)){let filtered=list.filter(id=>!profileIds.has(id));filtered.length!==list.length&&(changed=!0),filtered.length>0&&(next[provider]=filtered)}return{next:Object.keys(next).length>0?next:void 0,changed}}function pruneAuthProfiles(cfg,profileIds){let profiles=cfg.auth?.profiles,order=cfg.auth?.order,nextProfiles=profiles?{...profiles}:void 0,changed=!1;if(nextProfiles)for(let id of profileIds)id in nextProfiles&&(delete nextProfiles[id],changed=!0);let prunedOrder=pruneAuthOrder(order,profileIds);if(prunedOrder.changed&&(changed=!0),!changed)return{next:cfg,changed:!1};let nextAuth=nextProfiles||prunedOrder.next?{...cfg.auth,profiles:nextProfiles&&Object.keys(nextProfiles).length>0?nextProfiles:void 0,order:prunedOrder.next}:void 0;return{next:{...cfg,auth:nextAuth},changed:!0}}async function maybeRemoveDeprecatedCliAuthProfiles(cfg,prompter){let store=await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1}),deprecated=new Set;if((store.profiles[CLAUDE_CLI_PROFILE_ID]||cfg.auth?.profiles?.[CLAUDE_CLI_PROFILE_ID])&&deprecated.add(CLAUDE_CLI_PROFILE_ID),(store.profiles[CODEX_CLI_PROFILE_ID]||cfg.auth?.profiles?.[CODEX_CLI_PROFILE_ID])&&deprecated.add(CODEX_CLI_PROFILE_ID),deprecated.size===0)return cfg;let lines=[`Deprecated external CLI auth profiles detected (no longer supported):`];if(deprecated.has(CLAUDE_CLI_PROFILE_ID)&&lines.push(`- ${CLAUDE_CLI_PROFILE_ID} (Anthropic): use setup-token → ${formatCliCommand(`builderforce models auth setup-token`)}`),deprecated.has(CODEX_CLI_PROFILE_ID)&&lines.push(`- ${CODEX_CLI_PROFILE_ID} (OpenAI Codex): use OAuth → ${formatCliCommand(`builderforce models auth login --provider openai-codex`)}`),note$1(lines.join(`
3
3
  `),`Auth profiles`),!await prompter.confirmRepair({message:`Remove deprecated CLI auth profiles now?`,initialValue:!0}))return cfg;await updateAuthProfileStoreWithLock({updater:nextStore=>{let mutated=!1;for(let id of deprecated)nextStore.profiles[id]&&(delete nextStore.profiles[id],mutated=!0),nextStore.usageStats?.[id]&&(delete nextStore.usageStats[id],mutated=!0);if(nextStore.order)for(let[provider,list]of Object.entries(nextStore.order)){let filtered=list.filter(id=>!deprecated.has(id));filtered.length!==list.length&&(mutated=!0,filtered.length>0?nextStore.order[provider]=filtered:delete nextStore.order[provider])}if(nextStore.lastGood)for(let[provider,profileId]of Object.entries(nextStore.lastGood))deprecated.has(profileId)&&(delete nextStore.lastGood[provider],mutated=!0);return mutated}});let pruned=pruneAuthProfiles(cfg,deprecated);return pruned.changed&&note$1(Array.from(deprecated.values()).map(id=>`- removed ${id} from config`).join(`
4
4
  `),`Doctor changes`),pruned.next}function formatAuthIssueHint(issue){return issue.provider===`anthropic`&&issue.profileId===CLAUDE_CLI_PROFILE_ID?`Deprecated profile. Use ${formatCliCommand(`builderforce models auth setup-token`)} or ${formatCliCommand(`builderforce configure`)}.`:issue.provider===`openai-codex`&&issue.profileId===CODEX_CLI_PROFILE_ID?`Deprecated profile. Use ${formatCliCommand(`builderforce models auth login --provider openai-codex`)} or ${formatCliCommand(`builderforce configure`)}.`:`Re-auth via \`${formatCliCommand(`builderforce configure`)}\` or \`${formatCliCommand(`builderforce onboard`)}\`.`}function formatAuthIssueLine(issue){let remaining=issue.remainingMs===void 0?``:` (${formatRemainingShort(issue.remainingMs)})`,hint=formatAuthIssueHint(issue);return`- ${issue.profileId}: ${issue.status}${remaining}${hint?` — ${hint}`:``}`}async function noteAuthProfileHealth(params){let store=await ensureAuthProfileStore(void 0,{allowKeychainPrompt:params.allowKeychainPrompt}),unusable=(()=>{let now=Date.now(),out=[];for(let profileId of Object.keys(store.usageStats??{})){let until=resolveProfileUnusableUntilForDisplay(store,profileId);if(!until||now>=until)continue;let stats=store.usageStats?.[profileId],remaining=formatRemainingShort(until-now),kind=typeof stats?.disabledUntil==`number`&&now<stats.disabledUntil?`disabled${stats.disabledReason?`:${stats.disabledReason}`:``}`:`cooldown`,hint=kind.startsWith(`disabled:billing`)?`Top up credits (provider billing) or switch provider.`:`Wait for cooldown or switch provider.`;out.push(`- ${profileId}: ${kind} (${remaining})${hint?` — ${hint}`:``}`)}return out})();unusable.length>0&&note$1(unusable.join(`
@@ -1,4 +1,4 @@
1
- import{d as resolveIsNixMode,f as resolveLegacyStateDirs,g as resolveStateDir,m as resolveOAuthDir,p as resolveNewStateDir,t as CONFIG_PATH,u as resolveGatewayPort,y as resolveRequiredHomeDir}from"./paths-5FcIFMsj.js";import{C as shortenHomePath,G as getResolvedLoggerSettings,b as resolveUserPath,f as isRecord,v as resolveHomeDir$1,w as sleep}from"./utils-DbaBVFaK.js";import{Mt as loadBuilderForceAgentsPlugins,ai as DEFAULT_OAUTH_WARN_MS,oi as buildAuthHealthSummary,si as formatRemainingShort}from"./reply-Cd3vVnD7.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,n as DEFAULT_ACCOUNT_ID}from"./session-key-EoB0qaG9.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import{n as runExec,t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir,i as resolveAgentDir,l as resolveDefaultAgentId,p as DEFAULT_AGENTS_FILENAME}from"./agent-scope-DPtjOxzp.js";import{Gt as resolveApiKeyForProfile,Wt as resolveProfileUnusableUntilForDisplay,Zt as repairOAuthProfileIdMismatch,_n as CODEX_CLI_PROFILE_ID,a as getModelRefStatus,bn as DEFAULT_PROVIDER,g as resolveHooksGmailModel,gn as CLAUDE_CLI_PROFILE_ID,in as ensureAuthProfileStore,m as resolveConfiguredModelRef,on as updateAuthProfileStoreWithLock,yn as DEFAULT_MODEL,yt as resolveApiKeyForProvider}from"./model-selection-9bRFKBI_.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{t as isTruthyEnvValue}from"./env-BIdU5BAp.js";import{a as readConfigFileSnapshot,c as writeConfigFile,p as BuilderForceAgentsSchema}from"./io-3R_ZyUxB.js";import{t as migrateLegacyConfig}from"./config-_1Ca6jGb.js";import{r as loadModelCatalog}from"./model-catalog-C6UrZ0uG.js";import{D as DEFAULT_SANDBOX_IMAGE,E as DEFAULT_SANDBOX_COMMON_IMAGE,T as DEFAULT_SANDBOX_BROWSER_IMAGE,f as resolveSandboxScope}from"./sandbox-BZibn6PX.js";import{i as resolveGatewayAuth}from"./auth-lebUHrkd.js";import{r as isLoopbackHost,u as resolveGatewayBindHost}from"./ws-Bbu03j3h.js";import{a as inspectPortUsage,c as formatPortDiagnostics}from"./ports-DgmEDNOm.js";import{B as resolveMainSessionKey,L as canonicalizeMainSessionAlias,a as loadSessionStore,c as saveSessionStore,rt as cleanStaleLockFiles}from"./sessions-CdanN_ZI.js";import{c as listTelegramAccountIds,l as resolveTelegramAccount,n as listChannelPlugins}from"./plugins-D5zP6ENo.js";import{c as resolveStorePath,n as resolveSessionFilePath,s as resolveSessionTranscriptsDirForAgent}from"./paths-DJ6rztqJ.js";import{c as getDefaultMemoryDirs,l as getDefaultMemoryFilePaths}from"./sqlite-C39E12XS.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName,m as resolveNodeLaunchAgentLabel}from"./constants-BBbGeL3t.js";import{r as resolveMemorySearchConfig}from"./manager-DwywI_5-.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-BbRf8gFM.js";import{t as formatDurationCompact}from"./format-duration-HN2dpHE0.js";import{f as printWizardHeader,m as randomToken,n as applyWizardMetadata,s as guardCancel}from"./onboard-helpers-Cf5dNq7-.js";import{n as isWSLEnv,t as isWSL}from"./wsl-DkYsHmN5.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BpVK43GK.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-vWC0PU8J.js";import{t as note$1}from"./note-B6NtFdXt.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DTDCy17p.js";import{t as applyPluginAutoEnable}from"./plugin-auto-enable-DDry2fA6.js";import{t as isWithinDir}from"./path-safety-CS-EmF4c.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-BlOu0Ul_.js";import{a as gatewayInstallErrorHint,f as renderSystemNodeWarning,i as buildGatewayInstallPlan,m as resolveSystemNodeInfo,n as GATEWAY_DAEMON_RUNTIME_OPTIONS,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-CtOr1ncS.js";import{r as isSystemdUserServiceAvailable}from"./systemd-BG3_QT6W.js";import{a as launchAgentPlistExists,i as isLaunchAgentLoaded,o as repairLaunchAgentBootstrap,r as isLaunchAgentListed,s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-D-NLDyK3.js";import{a as isSystemdUnavailableDetail,c as auditGatewayServiceConfig,l as needsNodeRuntimeMigration,o as renderSystemdUnavailableHints,s as SERVICE_AUDIT_CODES,y as formatRuntimeStatus}from"./lifecycle-core-Dwb4gHjZ.js";import{t as readLastGatewayErrorLine}from"./diagnostics-DCjg0nBH.js";import{a as renderGatewayServiceCleanupHints,i as findExtraGatewayServices}from"./daemon-cli-DlwOVDbt.js";import{r as healthCommand}from"./health-yS3NRKvY.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-CWgH1Tda.js";import{n as isNumericTelegramUserId,r as normalizeTelegramAllowFromEntry,t as resolveDmAllowState}from"./dm-policy-shared-Dhw9_6mi.js";import{n as runGatewayUpdate,t as resolveAgentSessionDirs}from"./session-dirs-D_ARkyw0.js";import{n as logConfigUpdated}from"./logging-DHa3jQN3.js";import{t as ensureSystemdUserLingerInteractive}from"./systemd-linger-CT-VHPB3.js";import{t as formatHealthCheckFailure}from"./health-format-iE_KYEwP.js";import{n as doctorShellCompletion}from"./doctor-completion-Bv2ztEeW.js";import fs from"node:fs";import os from"node:os";import path from"node:path";import JSON5 from"json5";import fs$1 from"node:fs/promises";import{execFile}from"node:child_process";import{promisify}from"node:util";import{confirm,intro,outro,select}from"@clack/prompts";async function maybeRepairAnthropicOAuthProfileId(cfg,prompter){let repair=repairOAuthProfileIdMismatch({cfg,store:await ensureAuthProfileStore(),provider:`anthropic`,legacyProfileId:`anthropic:default`});return!repair.migrated||repair.changes.length===0||(note$1(repair.changes.map(c=>`- ${c}`).join(`
1
+ import{d as resolveIsNixMode,f as resolveLegacyStateDirs,g as resolveStateDir,m as resolveOAuthDir,p as resolveNewStateDir,t as CONFIG_PATH,u as resolveGatewayPort,y as resolveRequiredHomeDir}from"./paths-5FcIFMsj.js";import{C as shortenHomePath,G as getResolvedLoggerSettings,b as resolveUserPath,f as isRecord,v as resolveHomeDir$1,w as sleep}from"./utils-DbaBVFaK.js";import{Mt as loadBuilderForceAgentsPlugins,ai as DEFAULT_OAUTH_WARN_MS,oi as buildAuthHealthSummary,si as formatRemainingShort}from"./reply-Cd3vVnD7.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,n as DEFAULT_ACCOUNT_ID}from"./session-key-EoB0qaG9.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import{n as runExec,t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir,i as resolveAgentDir,l as resolveDefaultAgentId,p as DEFAULT_AGENTS_FILENAME}from"./agent-scope-DPtjOxzp.js";import{Gt as resolveApiKeyForProfile,Wt as resolveProfileUnusableUntilForDisplay,Zt as repairOAuthProfileIdMismatch,_n as CODEX_CLI_PROFILE_ID,a as getModelRefStatus,bn as DEFAULT_PROVIDER,g as resolveHooksGmailModel,gn as CLAUDE_CLI_PROFILE_ID,in as ensureAuthProfileStore,m as resolveConfiguredModelRef,on as updateAuthProfileStoreWithLock,yn as DEFAULT_MODEL,yt as resolveApiKeyForProvider}from"./model-selection-9bRFKBI_.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{t as isTruthyEnvValue}from"./env-BIdU5BAp.js";import{a as readConfigFileSnapshot,c as writeConfigFile,p as BuilderForceAgentsSchema}from"./io-3R_ZyUxB.js";import{t as migrateLegacyConfig}from"./config-_1Ca6jGb.js";import{r as loadModelCatalog}from"./model-catalog-C6UrZ0uG.js";import{D as DEFAULT_SANDBOX_IMAGE,E as DEFAULT_SANDBOX_COMMON_IMAGE,T as DEFAULT_SANDBOX_BROWSER_IMAGE,f as resolveSandboxScope}from"./sandbox-BZibn6PX.js";import{i as resolveGatewayAuth}from"./auth-lebUHrkd.js";import{r as isLoopbackHost,u as resolveGatewayBindHost}from"./ws-Bbu03j3h.js";import{a as inspectPortUsage,c as formatPortDiagnostics}from"./ports-DgmEDNOm.js";import{B as resolveMainSessionKey,L as canonicalizeMainSessionAlias,a as loadSessionStore,c as saveSessionStore,rt as cleanStaleLockFiles}from"./sessions-CdanN_ZI.js";import{c as listTelegramAccountIds,l as resolveTelegramAccount,n as listChannelPlugins}from"./plugins-D5zP6ENo.js";import{c as resolveStorePath,n as resolveSessionFilePath,s as resolveSessionTranscriptsDirForAgent}from"./paths-DJ6rztqJ.js";import{c as getDefaultMemoryDirs,l as getDefaultMemoryFilePaths}from"./sqlite-C39E12XS.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName,m as resolveNodeLaunchAgentLabel}from"./constants-BBbGeL3t.js";import{r as resolveMemorySearchConfig}from"./manager-DwywI_5-.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-BbRf8gFM.js";import{t as formatDurationCompact}from"./format-duration-HN2dpHE0.js";import{f as printWizardHeader,m as randomToken,n as applyWizardMetadata,s as guardCancel}from"./onboard-helpers-Cf5dNq7-.js";import{n as isWSLEnv,t as isWSL}from"./wsl-DkYsHmN5.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BpVK43GK.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-vWC0PU8J.js";import{t as note$1}from"./note-B6NtFdXt.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DTDCy17p.js";import{t as applyPluginAutoEnable}from"./plugin-auto-enable-DDry2fA6.js";import{t as isWithinDir}from"./path-safety-CS-EmF4c.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-BlOu0Ul_.js";import{a as gatewayInstallErrorHint,f as renderSystemNodeWarning,i as buildGatewayInstallPlan,m as resolveSystemNodeInfo,n as GATEWAY_DAEMON_RUNTIME_OPTIONS,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-CtOr1ncS.js";import{r as isSystemdUserServiceAvailable}from"./systemd-BG3_QT6W.js";import{a as launchAgentPlistExists,i as isLaunchAgentLoaded,o as repairLaunchAgentBootstrap,r as isLaunchAgentListed,s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-D-NLDyK3.js";import{a as isSystemdUnavailableDetail,c as auditGatewayServiceConfig,l as needsNodeRuntimeMigration,o as renderSystemdUnavailableHints,s as SERVICE_AUDIT_CODES,y as formatRuntimeStatus}from"./lifecycle-core-Dwb4gHjZ.js";import{t as readLastGatewayErrorLine}from"./diagnostics-DCjg0nBH.js";import{a as renderGatewayServiceCleanupHints,i as findExtraGatewayServices}from"./daemon-cli-DlwOVDbt.js";import{r as healthCommand}from"./health-yS3NRKvY.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-CWgH1Tda.js";import{n as isNumericTelegramUserId,r as normalizeTelegramAllowFromEntry,t as resolveDmAllowState}from"./dm-policy-shared-Dhw9_6mi.js";import{n as runGatewayUpdate,t as resolveAgentSessionDirs}from"./session-dirs-D_ARkyw0.js";import{n as logConfigUpdated}from"./logging-DHa3jQN3.js";import{t as ensureSystemdUserLingerInteractive}from"./systemd-linger-CT-VHPB3.js";import{t as formatHealthCheckFailure}from"./health-format-iE_KYEwP.js";import{n as doctorShellCompletion}from"./doctor-completion-Ccs-JEvV.js";import fs from"node:fs";import os from"node:os";import path from"node:path";import JSON5 from"json5";import fs$1 from"node:fs/promises";import{execFile}from"node:child_process";import{promisify}from"node:util";import{confirm,intro,outro,select}from"@clack/prompts";async function maybeRepairAnthropicOAuthProfileId(cfg,prompter){let repair=repairOAuthProfileIdMismatch({cfg,store:await ensureAuthProfileStore(),provider:`anthropic`,legacyProfileId:`anthropic:default`});return!repair.migrated||repair.changes.length===0||(note$1(repair.changes.map(c=>`- ${c}`).join(`
2
2
  `),`Auth profiles`),!await prompter.confirm({message:`Update Anthropic OAuth profile id in config now?`,initialValue:!0}))?cfg:repair.config}function pruneAuthOrder(order,profileIds){if(!order)return{next:order,changed:!1};let changed=!1,next={};for(let[provider,list]of Object.entries(order)){let filtered=list.filter(id=>!profileIds.has(id));filtered.length!==list.length&&(changed=!0),filtered.length>0&&(next[provider]=filtered)}return{next:Object.keys(next).length>0?next:void 0,changed}}function pruneAuthProfiles(cfg,profileIds){let profiles=cfg.auth?.profiles,order=cfg.auth?.order,nextProfiles=profiles?{...profiles}:void 0,changed=!1;if(nextProfiles)for(let id of profileIds)id in nextProfiles&&(delete nextProfiles[id],changed=!0);let prunedOrder=pruneAuthOrder(order,profileIds);if(prunedOrder.changed&&(changed=!0),!changed)return{next:cfg,changed:!1};let nextAuth=nextProfiles||prunedOrder.next?{...cfg.auth,profiles:nextProfiles&&Object.keys(nextProfiles).length>0?nextProfiles:void 0,order:prunedOrder.next}:void 0;return{next:{...cfg,auth:nextAuth},changed:!0}}async function maybeRemoveDeprecatedCliAuthProfiles(cfg,prompter){let store=await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1}),deprecated=new Set;if((store.profiles[CLAUDE_CLI_PROFILE_ID]||cfg.auth?.profiles?.[CLAUDE_CLI_PROFILE_ID])&&deprecated.add(CLAUDE_CLI_PROFILE_ID),(store.profiles[CODEX_CLI_PROFILE_ID]||cfg.auth?.profiles?.[CODEX_CLI_PROFILE_ID])&&deprecated.add(CODEX_CLI_PROFILE_ID),deprecated.size===0)return cfg;let lines=[`Deprecated external CLI auth profiles detected (no longer supported):`];if(deprecated.has(CLAUDE_CLI_PROFILE_ID)&&lines.push(`- ${CLAUDE_CLI_PROFILE_ID} (Anthropic): use setup-token → ${formatCliCommand(`builderforce models auth setup-token`)}`),deprecated.has(CODEX_CLI_PROFILE_ID)&&lines.push(`- ${CODEX_CLI_PROFILE_ID} (OpenAI Codex): use OAuth → ${formatCliCommand(`builderforce models auth login --provider openai-codex`)}`),note$1(lines.join(`
3
3
  `),`Auth profiles`),!await prompter.confirmRepair({message:`Remove deprecated CLI auth profiles now?`,initialValue:!0}))return cfg;await updateAuthProfileStoreWithLock({updater:nextStore=>{let mutated=!1;for(let id of deprecated)nextStore.profiles[id]&&(delete nextStore.profiles[id],mutated=!0),nextStore.usageStats?.[id]&&(delete nextStore.usageStats[id],mutated=!0);if(nextStore.order)for(let[provider,list]of Object.entries(nextStore.order)){let filtered=list.filter(id=>!deprecated.has(id));filtered.length!==list.length&&(mutated=!0,filtered.length>0?nextStore.order[provider]=filtered:delete nextStore.order[provider])}if(nextStore.lastGood)for(let[provider,profileId]of Object.entries(nextStore.lastGood))deprecated.has(profileId)&&(delete nextStore.lastGood[provider],mutated=!0);return mutated}});let pruned=pruneAuthProfiles(cfg,deprecated);return pruned.changed&&note$1(Array.from(deprecated.values()).map(id=>`- removed ${id} from config`).join(`
4
4
  `),`Doctor changes`),pruned.next}function formatAuthIssueHint(issue){return issue.provider===`anthropic`&&issue.profileId===CLAUDE_CLI_PROFILE_ID?`Deprecated profile. Use ${formatCliCommand(`builderforce models auth setup-token`)} or ${formatCliCommand(`builderforce configure`)}.`:issue.provider===`openai-codex`&&issue.profileId===CODEX_CLI_PROFILE_ID?`Deprecated profile. Use ${formatCliCommand(`builderforce models auth login --provider openai-codex`)} or ${formatCliCommand(`builderforce configure`)}.`:`Re-auth via \`${formatCliCommand(`builderforce configure`)}\` or \`${formatCliCommand(`builderforce onboard`)}\`.`}function formatAuthIssueLine(issue){let remaining=issue.remainingMs===void 0?``:` (${formatRemainingShort(issue.remainingMs)})`,hint=formatAuthIssueHint(issue);return`- ${issue.profileId}: ${issue.status}${remaining}${hint?` — ${hint}`:``}`}async function noteAuthProfileHealth(params){let store=await ensureAuthProfileStore(void 0,{allowKeychainPrompt:params.allowKeychainPrompt}),unusable=(()=>{let now=Date.now(),out=[];for(let profileId of Object.keys(store.usageStats??{})){let until=resolveProfileUnusableUntilForDisplay(store,profileId);if(!until||now>=until)continue;let stats=store.usageStats?.[profileId],remaining=formatRemainingShort(until-now),kind=typeof stats?.disabledUntil==`number`&&now<stats.disabledUntil?`disabled${stats.disabledReason?`:${stats.disabledReason}`:``}`:`cooldown`,hint=kind.startsWith(`disabled:billing`)?`Top up credits (provider billing) or switch provider.`:`Wait for cooldown or switch provider.`;out.push(`- ${profileId}: ${kind} (${remaining})${hint?` — ${hint}`:``}`)}return out})();unusable.length>0&&note$1(unusable.join(`
@@ -1,4 +1,4 @@
1
- import"./paths-BVMSM1lQ.js";import"./session-key-CYpYHc1e.js";import"./registry-D_frpmHZ.js";import"./agent-scope-EkacNLg3.js";import"./subsystem-BakM_oqD.js";import"./workspace-BCjtHT4u.js";import{St as normalizeBaseUrl}from"./model-selection-BJ0saFZo.js";import{n as formatCliCommand}from"./env-BhRm7_r8.js";import"./boolean-ssGoaBPk.js";import"./src-CLWuGn12.js";import"./redact-sNZY-pGx.js";import{n as formatErrorMessage}from"./errors-BmztzL5I.js";import"./config-bxyMjPHU.js";import{_ as withCdpSocket,d as normalizeCdpWsUrl,g as getHeadersWithAuth,m as fetchJson,p as appendCdpPath,t as getChromeWebSocketUrl,u as formatAriaSnapshot}from"./chrome-Blk2Jftn.js";import{t as resolvePreferredBuilderForceAgentsTmpDir}from"./tmp-builderforce-dir-CB4MW5x2.js";import fs from"node:fs/promises";import path from"node:path";import crypto from"node:crypto";import{chromium,devices}from"playwright-core";const pageStates=new WeakMap,contextStates=new WeakMap,observedContexts=new WeakSet,observedPages=new WeakSet,roleRefsByTarget=new Map;let cached=null,connecting=null;function normalizeCdpUrl(raw){return raw.replace(/\/$/,``)}function findNetworkRequestById(state,id){for(let i=state.requests.length-1;i>=0;--i){let candidate=state.requests[i];if(candidate&&candidate.id===id)return candidate}}function roleRefsKey(cdpUrl,targetId){return`${normalizeCdpUrl(cdpUrl)}::${targetId}`}function rememberRoleRefsForTarget(opts){let targetId=opts.targetId.trim();if(targetId)for(roleRefsByTarget.set(roleRefsKey(opts.cdpUrl,targetId),{refs:opts.refs,...opts.frameSelector?{frameSelector:opts.frameSelector}:{},...opts.mode?{mode:opts.mode}:{}});roleRefsByTarget.size>50;){let first=roleRefsByTarget.keys().next();if(first.done)break;roleRefsByTarget.delete(first.value)}}function storeRoleRefsForTarget(opts){let state=ensurePageState(opts.page);state.roleRefs=opts.refs,state.roleRefsFrameSelector=opts.frameSelector,state.roleRefsMode=opts.mode,opts.targetId?.trim()&&rememberRoleRefsForTarget({cdpUrl:opts.cdpUrl,targetId:opts.targetId,refs:opts.refs,frameSelector:opts.frameSelector,mode:opts.mode})}function restoreRoleRefsForTarget(opts){let targetId=opts.targetId?.trim()||``;if(!targetId)return;let cached=roleRefsByTarget.get(roleRefsKey(opts.cdpUrl,targetId));if(!cached)return;let state=ensurePageState(opts.page);state.roleRefs||(state.roleRefs=cached.refs,state.roleRefsFrameSelector=cached.frameSelector,state.roleRefsMode=cached.mode)}function ensurePageState(page){let existing=pageStates.get(page);if(existing)return existing;let state={console:[],errors:[],requests:[],requestIds:new WeakMap,nextRequestId:0,armIdUpload:0,armIdDialog:0,armIdDownload:0};return pageStates.set(page,state),observedPages.has(page)||(observedPages.add(page),page.on(`console`,msg=>{let entry={type:msg.type(),text:msg.text(),timestamp:new Date().toISOString(),location:msg.location()};state.console.push(entry),state.console.length>500&&state.console.shift()}),page.on(`pageerror`,err=>{state.errors.push({message:err?.message?String(err.message):String(err),name:err?.name?String(err.name):void 0,stack:err?.stack?String(err.stack):void 0,timestamp:new Date().toISOString()}),state.errors.length>200&&state.errors.shift()}),page.on(`request`,req=>{state.nextRequestId+=1;let id=`r${state.nextRequestId}`;state.requestIds.set(req,id),state.requests.push({id,timestamp:new Date().toISOString(),method:req.method(),url:req.url(),resourceType:req.resourceType()}),state.requests.length>500&&state.requests.shift()}),page.on(`response`,resp=>{let req=resp.request(),id=state.requestIds.get(req);if(!id)return;let rec=findNetworkRequestById(state,id);rec&&(rec.status=resp.status(),rec.ok=resp.ok())}),page.on(`requestfailed`,req=>{let id=state.requestIds.get(req);if(!id)return;let rec=findNetworkRequestById(state,id);rec&&(rec.failureText=req.failure()?.errorText,rec.ok=!1)}),page.on(`close`,()=>{pageStates.delete(page),observedPages.delete(page)})),state}function observeContext(context){if(!observedContexts.has(context)){observedContexts.add(context),ensureContextState(context);for(let page of context.pages())ensurePageState(page);context.on(`page`,page=>ensurePageState(page))}}function ensureContextState(context){let existing=contextStates.get(context);if(existing)return existing;let state={traceActive:!1};return contextStates.set(context,state),state}function observeBrowser(browser){for(let context of browser.contexts())observeContext(context)}async function connectBrowser(cdpUrl){let normalized=normalizeCdpUrl(cdpUrl);return cached?.cdpUrl===normalized?cached:(connecting||=(async()=>{let lastErr;for(let attempt=0;attempt<3;attempt+=1)try{let timeout=5e3+attempt*2e3,endpoint=await getChromeWebSocketUrl(normalized,timeout).catch(()=>null)??normalized,headers=getHeadersWithAuth(endpoint),browser=await chromium.connectOverCDP(endpoint,{timeout,headers}),onDisconnected=()=>{cached?.browser===browser&&(cached=null)},connected={browser,cdpUrl:normalized,onDisconnected};return cached=connected,browser.on(`disconnected`,onDisconnected),observeBrowser(browser),connected}catch(err){lastErr=err;let delay=250+attempt*250;await new Promise(r=>setTimeout(r,delay))}if(lastErr instanceof Error)throw lastErr;let message=lastErr?formatErrorMessage(lastErr):`CDP connect failed`;throw Error(message)})().finally(()=>{connecting=null}),await connecting)}async function getAllPages(browser){return browser.contexts().flatMap(c=>c.pages())}async function pageTargetId(page){let session=await page.context().newCDPSession(page);try{let info=await session.send(`Target.getTargetInfo`);return String(info?.targetInfo?.targetId??``).trim()||null}finally{await session.detach().catch(()=>{})}}async function findPageByTargetId(browser,targetId,cdpUrl){let pages=await getAllPages(browser),resolvedViaCdp=!1;for(let page of pages){let tid=null;try{tid=await pageTargetId(page),resolvedViaCdp=!0}catch{tid=null}if(tid&&tid===targetId)return page}if(!resolvedViaCdp&&pages.length===1)return pages[0];if(cdpUrl)try{let listUrl=`${normalizeBaseUrl(cdpUrl).replace(/^ws:/,`http:`).replace(/\/cdp$/,``)}/json/list`,response=await fetch(listUrl,{headers:getHeadersWithAuth(listUrl)});if(response.ok){let targets=await response.json(),target=targets.find(t=>t.id===targetId);if(target){let urlMatch=pages.filter(p=>p.url()===target.url);if(urlMatch.length===1)return urlMatch[0];if(urlMatch.length>1){let sameUrlTargets=targets.filter(t=>t.url===target.url);if(sameUrlTargets.length===urlMatch.length){let idx=sameUrlTargets.findIndex(t=>t.id===targetId);if(idx>=0&&idx<urlMatch.length)return urlMatch[idx]}}}}}catch{}return null}async function getPageForTargetId(opts){let{browser}=await connectBrowser(opts.cdpUrl),pages=await getAllPages(browser);if(!pages.length)throw Error(`No pages available in the connected browser.`);let first=pages[0];if(!opts.targetId)return first;let found=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!found){if(pages.length===1)return first;throw Error(`tab not found`)}return found}function refLocator(page,ref){let normalized=ref.startsWith(`@`)?ref.slice(1):ref.startsWith(`ref=`)?ref.slice(4):ref;if(/^e\d+$/.test(normalized)){let state=pageStates.get(page);if(state?.roleRefsMode===`aria`)return(state.roleRefsFrameSelector?page.frameLocator(state.roleRefsFrameSelector):page).locator(`aria-ref=${normalized}`);let info=state?.roleRefs?.[normalized];if(!info)throw Error(`Unknown ref "${normalized}". Run a new snapshot and use a ref from that snapshot.`);let locAny=state?.roleRefsFrameSelector?page.frameLocator(state.roleRefsFrameSelector):page,locator=info.name?locAny.getByRole(info.role,{name:info.name,exact:!0}):locAny.getByRole(info.role);return info.nth===void 0?locator:locator.nth(info.nth)}return page.locator(`aria-ref=${normalized}`)}async function closePlaywrightBrowserConnection(){let cur=cached;cached=null,connecting=null,cur&&(cur.onDisconnected&&typeof cur.browser.off==`function`&&cur.browser.off(`disconnected`,cur.onDisconnected),await cur.browser.close().catch(()=>{}))}function normalizeCdpHttpBaseForJsonEndpoints(cdpUrl){try{let url=new URL(cdpUrl);return url.protocol===`ws:`?url.protocol=`http:`:url.protocol===`wss:`&&(url.protocol=`https:`),url.pathname=url.pathname.replace(/\/devtools\/browser\/.*$/,``),url.pathname=url.pathname.replace(/\/cdp$/,``),url.toString().replace(/\/$/,``)}catch{return cdpUrl.replace(/^ws:/,`http:`).replace(/^wss:/,`https:`).replace(/\/devtools\/browser\/.*$/,``).replace(/\/cdp$/,``).replace(/\/$/,``)}}function cdpSocketNeedsAttach(wsUrl){try{let pathname=new URL(wsUrl).pathname;return pathname===`/cdp`||pathname.endsWith(`/cdp`)||pathname.includes(`/devtools/browser/`)}catch{return!1}}async function tryTerminateExecutionViaCdp(opts){let cdpHttpBase=normalizeCdpHttpBaseForJsonEndpoints(opts.cdpUrl),pages=await fetchJson(appendCdpPath(cdpHttpBase,`/json/list`),2e3).catch(()=>null);if(!pages||pages.length===0)return;let target=pages.find(p=>String(p.id??``).trim()===opts.targetId),wsUrlRaw=String(target?.webSocketDebuggerUrl??``).trim();if(!wsUrlRaw)return;let wsUrl=normalizeCdpWsUrl(wsUrlRaw,cdpHttpBase),needsAttach=cdpSocketNeedsAttach(wsUrl),runWithTimeout=async(work,ms)=>{let timer,timeoutPromise=new Promise((_,reject)=>{timer=setTimeout(()=>reject(Error(`CDP command timed out`)),ms)});try{return await Promise.race([work,timeoutPromise])}finally{timer&&clearTimeout(timer)}};await withCdpSocket(wsUrl,async send=>{let sessionId;try{if(needsAttach){let attached=await runWithTimeout(send(`Target.attachToTarget`,{targetId:opts.targetId,flatten:!0}),1500);typeof attached?.sessionId==`string`&&attached.sessionId.trim()&&(sessionId=attached.sessionId)}await runWithTimeout(send(`Runtime.terminateExecution`,void 0,sessionId),1500),sessionId&&send(`Target.detachFromTarget`,{sessionId}).catch(()=>{})}catch{}},{handshakeTimeoutMs:2e3}).catch(()=>{})}async function forceDisconnectPlaywrightForTarget(opts){let normalized=normalizeCdpUrl(opts.cdpUrl);if(cached?.cdpUrl!==normalized)return;let cur=cached;if(cached=null,connecting=null,cur){cur.onDisconnected&&typeof cur.browser.off==`function`&&cur.browser.off(`disconnected`,cur.onDisconnected);let targetId=opts.targetId?.trim()||``;targetId&&await tryTerminateExecutionViaCdp({cdpUrl:normalized,targetId}).catch(()=>{}),cur.browser.close().catch(()=>{})}}async function listPagesViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),pages=await getAllPages(browser),results=[];for(let page of pages){let tid=await pageTargetId(page).catch(()=>null);tid&&results.push({targetId:tid,title:await page.title().catch(()=>``),url:page.url(),type:`page`})}return results}async function createPageViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),context=browser.contexts()[0]??await browser.newContext();ensureContextState(context);let page=await context.newPage();ensurePageState(page);let targetUrl=opts.url.trim()||`about:blank`;targetUrl!==`about:blank`&&await page.goto(targetUrl,{timeout:3e4}).catch(()=>{});let tid=await pageTargetId(page).catch(()=>null);if(!tid)throw Error(`Failed to get targetId for new page`);return{targetId:tid,title:await page.title().catch(()=>``),url:page.url(),type:`page`}}async function closePageByTargetIdViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),page=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!page)throw Error(`tab not found`);await page.close()}async function focusPageByTargetIdViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),page=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!page)throw Error(`tab not found`);try{await page.bringToFront()}catch(err){let session=await page.context().newCDPSession(page);try{await session.send(`Page.bringToFront`);return}catch{throw err}finally{await session.detach().catch(()=>{})}}}async function getPageErrorsViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts)),errors=[...state.errors];return opts.clear&&(state.errors=[]),{errors}}async function getNetworkRequestsViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts)),raw=[...state.requests],filter=typeof opts.filter==`string`?opts.filter.trim():``,requests=filter?raw.filter(r=>r.url.includes(filter)):raw;return opts.clear&&(state.requests=[],state.requestIds=new WeakMap),{requests}}function consolePriority(level){switch(level){case`error`:return 3;case`warning`:return 2;case`info`:case`log`:return 1;case`debug`:return 0;default:return 1}}async function getConsoleMessagesViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts));if(!opts.level)return[...state.console];let min=consolePriority(opts.level);return state.console.filter(msg=>consolePriority(msg.type)>=min)}const INTERACTIVE_ROLES=new Set([`button`,`link`,`textbox`,`checkbox`,`radio`,`combobox`,`listbox`,`menuitem`,`menuitemcheckbox`,`menuitemradio`,`option`,`searchbox`,`slider`,`spinbutton`,`switch`,`tab`,`treeitem`]),CONTENT_ROLES=new Set([`heading`,`cell`,`gridcell`,`columnheader`,`rowheader`,`listitem`,`article`,`region`,`main`,`navigation`]),STRUCTURAL_ROLES=new Set([`generic`,`group`,`list`,`table`,`row`,`rowgroup`,`grid`,`treegrid`,`menu`,`menubar`,`toolbar`,`tablist`,`tree`,`directory`,`document`,`application`,`presentation`,`none`]);function getRoleSnapshotStats(snapshot,refs){let interactive=Object.values(refs).filter(r=>INTERACTIVE_ROLES.has(r.role)).length;return{lines:snapshot.split(`
1
+ import"./paths-BVMSM1lQ.js";import"./session-key-CYpYHc1e.js";import"./registry-D_frpmHZ.js";import"./agent-scope-EkacNLg3.js";import"./subsystem-BakM_oqD.js";import"./workspace-BCjtHT4u.js";import{St as normalizeBaseUrl}from"./model-selection-BJ0saFZo.js";import{n as formatCliCommand}from"./env-BhRm7_r8.js";import"./boolean-ssGoaBPk.js";import"./src-CLWuGn12.js";import"./redact-sNZY-pGx.js";import{n as formatErrorMessage}from"./errors-BmztzL5I.js";import"./config-bxyMjPHU.js";import{_ as withCdpSocket,d as normalizeCdpWsUrl,g as getHeadersWithAuth,m as fetchJson,p as appendCdpPath,t as getChromeWebSocketUrl,u as formatAriaSnapshot}from"./chrome-CtTMuhww.js";import{t as resolvePreferredBuilderForceAgentsTmpDir}from"./tmp-builderforce-dir-CB4MW5x2.js";import fs from"node:fs/promises";import path from"node:path";import crypto from"node:crypto";import{chromium,devices}from"playwright-core";const pageStates=new WeakMap,contextStates=new WeakMap,observedContexts=new WeakSet,observedPages=new WeakSet,roleRefsByTarget=new Map;let cached=null,connecting=null;function normalizeCdpUrl(raw){return raw.replace(/\/$/,``)}function findNetworkRequestById(state,id){for(let i=state.requests.length-1;i>=0;--i){let candidate=state.requests[i];if(candidate&&candidate.id===id)return candidate}}function roleRefsKey(cdpUrl,targetId){return`${normalizeCdpUrl(cdpUrl)}::${targetId}`}function rememberRoleRefsForTarget(opts){let targetId=opts.targetId.trim();if(targetId)for(roleRefsByTarget.set(roleRefsKey(opts.cdpUrl,targetId),{refs:opts.refs,...opts.frameSelector?{frameSelector:opts.frameSelector}:{},...opts.mode?{mode:opts.mode}:{}});roleRefsByTarget.size>50;){let first=roleRefsByTarget.keys().next();if(first.done)break;roleRefsByTarget.delete(first.value)}}function storeRoleRefsForTarget(opts){let state=ensurePageState(opts.page);state.roleRefs=opts.refs,state.roleRefsFrameSelector=opts.frameSelector,state.roleRefsMode=opts.mode,opts.targetId?.trim()&&rememberRoleRefsForTarget({cdpUrl:opts.cdpUrl,targetId:opts.targetId,refs:opts.refs,frameSelector:opts.frameSelector,mode:opts.mode})}function restoreRoleRefsForTarget(opts){let targetId=opts.targetId?.trim()||``;if(!targetId)return;let cached=roleRefsByTarget.get(roleRefsKey(opts.cdpUrl,targetId));if(!cached)return;let state=ensurePageState(opts.page);state.roleRefs||(state.roleRefs=cached.refs,state.roleRefsFrameSelector=cached.frameSelector,state.roleRefsMode=cached.mode)}function ensurePageState(page){let existing=pageStates.get(page);if(existing)return existing;let state={console:[],errors:[],requests:[],requestIds:new WeakMap,nextRequestId:0,armIdUpload:0,armIdDialog:0,armIdDownload:0};return pageStates.set(page,state),observedPages.has(page)||(observedPages.add(page),page.on(`console`,msg=>{let entry={type:msg.type(),text:msg.text(),timestamp:new Date().toISOString(),location:msg.location()};state.console.push(entry),state.console.length>500&&state.console.shift()}),page.on(`pageerror`,err=>{state.errors.push({message:err?.message?String(err.message):String(err),name:err?.name?String(err.name):void 0,stack:err?.stack?String(err.stack):void 0,timestamp:new Date().toISOString()}),state.errors.length>200&&state.errors.shift()}),page.on(`request`,req=>{state.nextRequestId+=1;let id=`r${state.nextRequestId}`;state.requestIds.set(req,id),state.requests.push({id,timestamp:new Date().toISOString(),method:req.method(),url:req.url(),resourceType:req.resourceType()}),state.requests.length>500&&state.requests.shift()}),page.on(`response`,resp=>{let req=resp.request(),id=state.requestIds.get(req);if(!id)return;let rec=findNetworkRequestById(state,id);rec&&(rec.status=resp.status(),rec.ok=resp.ok())}),page.on(`requestfailed`,req=>{let id=state.requestIds.get(req);if(!id)return;let rec=findNetworkRequestById(state,id);rec&&(rec.failureText=req.failure()?.errorText,rec.ok=!1)}),page.on(`close`,()=>{pageStates.delete(page),observedPages.delete(page)})),state}function observeContext(context){if(!observedContexts.has(context)){observedContexts.add(context),ensureContextState(context);for(let page of context.pages())ensurePageState(page);context.on(`page`,page=>ensurePageState(page))}}function ensureContextState(context){let existing=contextStates.get(context);if(existing)return existing;let state={traceActive:!1};return contextStates.set(context,state),state}function observeBrowser(browser){for(let context of browser.contexts())observeContext(context)}async function connectBrowser(cdpUrl){let normalized=normalizeCdpUrl(cdpUrl);return cached?.cdpUrl===normalized?cached:(connecting||=(async()=>{let lastErr;for(let attempt=0;attempt<3;attempt+=1)try{let timeout=5e3+attempt*2e3,endpoint=await getChromeWebSocketUrl(normalized,timeout).catch(()=>null)??normalized,headers=getHeadersWithAuth(endpoint),browser=await chromium.connectOverCDP(endpoint,{timeout,headers}),onDisconnected=()=>{cached?.browser===browser&&(cached=null)},connected={browser,cdpUrl:normalized,onDisconnected};return cached=connected,browser.on(`disconnected`,onDisconnected),observeBrowser(browser),connected}catch(err){lastErr=err;let delay=250+attempt*250;await new Promise(r=>setTimeout(r,delay))}if(lastErr instanceof Error)throw lastErr;let message=lastErr?formatErrorMessage(lastErr):`CDP connect failed`;throw Error(message)})().finally(()=>{connecting=null}),await connecting)}async function getAllPages(browser){return browser.contexts().flatMap(c=>c.pages())}async function pageTargetId(page){let session=await page.context().newCDPSession(page);try{let info=await session.send(`Target.getTargetInfo`);return String(info?.targetInfo?.targetId??``).trim()||null}finally{await session.detach().catch(()=>{})}}async function findPageByTargetId(browser,targetId,cdpUrl){let pages=await getAllPages(browser),resolvedViaCdp=!1;for(let page of pages){let tid=null;try{tid=await pageTargetId(page),resolvedViaCdp=!0}catch{tid=null}if(tid&&tid===targetId)return page}if(!resolvedViaCdp&&pages.length===1)return pages[0];if(cdpUrl)try{let listUrl=`${normalizeBaseUrl(cdpUrl).replace(/^ws:/,`http:`).replace(/\/cdp$/,``)}/json/list`,response=await fetch(listUrl,{headers:getHeadersWithAuth(listUrl)});if(response.ok){let targets=await response.json(),target=targets.find(t=>t.id===targetId);if(target){let urlMatch=pages.filter(p=>p.url()===target.url);if(urlMatch.length===1)return urlMatch[0];if(urlMatch.length>1){let sameUrlTargets=targets.filter(t=>t.url===target.url);if(sameUrlTargets.length===urlMatch.length){let idx=sameUrlTargets.findIndex(t=>t.id===targetId);if(idx>=0&&idx<urlMatch.length)return urlMatch[idx]}}}}}catch{}return null}async function getPageForTargetId(opts){let{browser}=await connectBrowser(opts.cdpUrl),pages=await getAllPages(browser);if(!pages.length)throw Error(`No pages available in the connected browser.`);let first=pages[0];if(!opts.targetId)return first;let found=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!found){if(pages.length===1)return first;throw Error(`tab not found`)}return found}function refLocator(page,ref){let normalized=ref.startsWith(`@`)?ref.slice(1):ref.startsWith(`ref=`)?ref.slice(4):ref;if(/^e\d+$/.test(normalized)){let state=pageStates.get(page);if(state?.roleRefsMode===`aria`)return(state.roleRefsFrameSelector?page.frameLocator(state.roleRefsFrameSelector):page).locator(`aria-ref=${normalized}`);let info=state?.roleRefs?.[normalized];if(!info)throw Error(`Unknown ref "${normalized}". Run a new snapshot and use a ref from that snapshot.`);let locAny=state?.roleRefsFrameSelector?page.frameLocator(state.roleRefsFrameSelector):page,locator=info.name?locAny.getByRole(info.role,{name:info.name,exact:!0}):locAny.getByRole(info.role);return info.nth===void 0?locator:locator.nth(info.nth)}return page.locator(`aria-ref=${normalized}`)}async function closePlaywrightBrowserConnection(){let cur=cached;cached=null,connecting=null,cur&&(cur.onDisconnected&&typeof cur.browser.off==`function`&&cur.browser.off(`disconnected`,cur.onDisconnected),await cur.browser.close().catch(()=>{}))}function normalizeCdpHttpBaseForJsonEndpoints(cdpUrl){try{let url=new URL(cdpUrl);return url.protocol===`ws:`?url.protocol=`http:`:url.protocol===`wss:`&&(url.protocol=`https:`),url.pathname=url.pathname.replace(/\/devtools\/browser\/.*$/,``),url.pathname=url.pathname.replace(/\/cdp$/,``),url.toString().replace(/\/$/,``)}catch{return cdpUrl.replace(/^ws:/,`http:`).replace(/^wss:/,`https:`).replace(/\/devtools\/browser\/.*$/,``).replace(/\/cdp$/,``).replace(/\/$/,``)}}function cdpSocketNeedsAttach(wsUrl){try{let pathname=new URL(wsUrl).pathname;return pathname===`/cdp`||pathname.endsWith(`/cdp`)||pathname.includes(`/devtools/browser/`)}catch{return!1}}async function tryTerminateExecutionViaCdp(opts){let cdpHttpBase=normalizeCdpHttpBaseForJsonEndpoints(opts.cdpUrl),pages=await fetchJson(appendCdpPath(cdpHttpBase,`/json/list`),2e3).catch(()=>null);if(!pages||pages.length===0)return;let target=pages.find(p=>String(p.id??``).trim()===opts.targetId),wsUrlRaw=String(target?.webSocketDebuggerUrl??``).trim();if(!wsUrlRaw)return;let wsUrl=normalizeCdpWsUrl(wsUrlRaw,cdpHttpBase),needsAttach=cdpSocketNeedsAttach(wsUrl),runWithTimeout=async(work,ms)=>{let timer,timeoutPromise=new Promise((_,reject)=>{timer=setTimeout(()=>reject(Error(`CDP command timed out`)),ms)});try{return await Promise.race([work,timeoutPromise])}finally{timer&&clearTimeout(timer)}};await withCdpSocket(wsUrl,async send=>{let sessionId;try{if(needsAttach){let attached=await runWithTimeout(send(`Target.attachToTarget`,{targetId:opts.targetId,flatten:!0}),1500);typeof attached?.sessionId==`string`&&attached.sessionId.trim()&&(sessionId=attached.sessionId)}await runWithTimeout(send(`Runtime.terminateExecution`,void 0,sessionId),1500),sessionId&&send(`Target.detachFromTarget`,{sessionId}).catch(()=>{})}catch{}},{handshakeTimeoutMs:2e3}).catch(()=>{})}async function forceDisconnectPlaywrightForTarget(opts){let normalized=normalizeCdpUrl(opts.cdpUrl);if(cached?.cdpUrl!==normalized)return;let cur=cached;if(cached=null,connecting=null,cur){cur.onDisconnected&&typeof cur.browser.off==`function`&&cur.browser.off(`disconnected`,cur.onDisconnected);let targetId=opts.targetId?.trim()||``;targetId&&await tryTerminateExecutionViaCdp({cdpUrl:normalized,targetId}).catch(()=>{}),cur.browser.close().catch(()=>{})}}async function listPagesViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),pages=await getAllPages(browser),results=[];for(let page of pages){let tid=await pageTargetId(page).catch(()=>null);tid&&results.push({targetId:tid,title:await page.title().catch(()=>``),url:page.url(),type:`page`})}return results}async function createPageViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),context=browser.contexts()[0]??await browser.newContext();ensureContextState(context);let page=await context.newPage();ensurePageState(page);let targetUrl=opts.url.trim()||`about:blank`;targetUrl!==`about:blank`&&await page.goto(targetUrl,{timeout:3e4}).catch(()=>{});let tid=await pageTargetId(page).catch(()=>null);if(!tid)throw Error(`Failed to get targetId for new page`);return{targetId:tid,title:await page.title().catch(()=>``),url:page.url(),type:`page`}}async function closePageByTargetIdViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),page=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!page)throw Error(`tab not found`);await page.close()}async function focusPageByTargetIdViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),page=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!page)throw Error(`tab not found`);try{await page.bringToFront()}catch(err){let session=await page.context().newCDPSession(page);try{await session.send(`Page.bringToFront`);return}catch{throw err}finally{await session.detach().catch(()=>{})}}}async function getPageErrorsViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts)),errors=[...state.errors];return opts.clear&&(state.errors=[]),{errors}}async function getNetworkRequestsViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts)),raw=[...state.requests],filter=typeof opts.filter==`string`?opts.filter.trim():``,requests=filter?raw.filter(r=>r.url.includes(filter)):raw;return opts.clear&&(state.requests=[],state.requestIds=new WeakMap),{requests}}function consolePriority(level){switch(level){case`error`:return 3;case`warning`:return 2;case`info`:case`log`:return 1;case`debug`:return 0;default:return 1}}async function getConsoleMessagesViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts));if(!opts.level)return[...state.console];let min=consolePriority(opts.level);return state.console.filter(msg=>consolePriority(msg.type)>=min)}const INTERACTIVE_ROLES=new Set([`button`,`link`,`textbox`,`checkbox`,`radio`,`combobox`,`listbox`,`menuitem`,`menuitemcheckbox`,`menuitemradio`,`option`,`searchbox`,`slider`,`spinbutton`,`switch`,`tab`,`treeitem`]),CONTENT_ROLES=new Set([`heading`,`cell`,`gridcell`,`columnheader`,`rowheader`,`listitem`,`article`,`region`,`main`,`navigation`]),STRUCTURAL_ROLES=new Set([`generic`,`group`,`list`,`table`,`row`,`rowgroup`,`grid`,`treegrid`,`menu`,`menubar`,`toolbar`,`tablist`,`tree`,`directory`,`document`,`application`,`presentation`,`none`]);function getRoleSnapshotStats(snapshot,refs){let interactive=Object.values(refs).filter(r=>INTERACTIVE_ROLES.has(r.role)).length;return{lines:snapshot.split(`
2
2
  `).length,chars:snapshot.length,refs:Object.keys(refs).length,interactive}}function getIndentLevel(line){let match=line.match(/^(\s*)/);return match?Math.floor(match[1].length/2):0}function matchInteractiveSnapshotLine(line,options){let depth=getIndentLevel(line);if(options.maxDepth!==void 0&&depth>options.maxDepth)return null;let match=line.match(/^(\s*-\s*)(\w+)(?:\s+"([^"]*)")?(.*)$/);if(!match)return null;let[,,roleRaw,name,suffix]=match;return roleRaw.startsWith(`/`)?null:{roleRaw,role:roleRaw.toLowerCase(),...name?{name}:{},suffix}}function createRoleNameTracker(){let counts=new Map,refsByKey=new Map;return{counts,refsByKey,getKey(role,name){return`${role}:${name??``}`},getNextIndex(role,name){let key=this.getKey(role,name),current=counts.get(key)??0;return counts.set(key,current+1),current},trackRef(role,name,ref){let key=this.getKey(role,name),list=refsByKey.get(key)??[];list.push(ref),refsByKey.set(key,list)},getDuplicateKeys(){let out=new Set;for(let[key,refs]of refsByKey)refs.length>1&&out.add(key);return out}}}function removeNthFromNonDuplicates(refs,tracker){let duplicates=tracker.getDuplicateKeys();for(let[ref,data]of Object.entries(refs)){let key=tracker.getKey(data.role,data.name);duplicates.has(key)||delete refs[ref]?.nth}}function compactTree(tree){let lines=tree.split(`
3
3
  `),result=[];for(let i=0;i<lines.length;i+=1){let line=lines[i];if(line.includes(`[ref=`)){result.push(line);continue}if(line.includes(`:`)&&!line.trimEnd().endsWith(`:`)){result.push(line);continue}let currentIndent=getIndentLevel(line),hasRelevantChildren=!1;for(let j=i+1;j<lines.length&&!(getIndentLevel(lines[j])<=currentIndent);j+=1)if(lines[j]?.includes(`[ref=`)){hasRelevantChildren=!0;break}hasRelevantChildren&&result.push(line)}return result.join(`
4
4
  `)}function processLine(line,refs,options,tracker,nextRef){let depth=getIndentLevel(line);if(options.maxDepth!==void 0&&depth>options.maxDepth)return null;let match=line.match(/^(\s*-\s*)(\w+)(?:\s+"([^"]*)")?(.*)$/);if(!match)return options.interactive?null:line;let[,prefix,roleRaw,name,suffix]=match;if(roleRaw.startsWith(`/`))return options.interactive?null:line;let role=roleRaw.toLowerCase(),isInteractive=INTERACTIVE_ROLES.has(role),isContent=CONTENT_ROLES.has(role),isStructural=STRUCTURAL_ROLES.has(role);if(options.interactive&&!isInteractive||options.compact&&isStructural&&!name)return null;if(!(isInteractive||isContent&&name))return line;let ref=nextRef(),nth=tracker.getNextIndex(role,name);tracker.trackRef(role,name,ref),refs[ref]={role,name,nth};let enhanced=`${prefix}${roleRaw}`;return name&&(enhanced+=` "${name}"`),enhanced+=` [ref=${ref}]`,nth>0&&(enhanced+=` [nth=${nth}]`),suffix&&(enhanced+=suffix),enhanced}function parseRoleRef(raw){let trimmed=raw.trim();if(!trimmed)return null;let normalized=trimmed.startsWith(`@`)?trimmed.slice(1):trimmed.startsWith(`ref=`)?trimmed.slice(4):trimmed;return/^e\d+$/.test(normalized)?normalized:null}function buildRoleSnapshotFromAriaSnapshot(ariaSnapshot,options={}){let lines=ariaSnapshot.split(`