@seanhogg/builderforce-agents 2026.10.8 → 2026.10.9

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 (63) hide show
  1. package/dist/{audio-preflight-hAkEddaf.js → audio-preflight-CBZJKBS8.js} +1 -1
  2. package/dist/{audio-preflight-Dm9zyfJq.js → audio-preflight-CvvHdoWy.js} +1 -1
  3. package/dist/build-info.json +3 -3
  4. package/dist/{builderforce-wxtgU9xu.js → builderforce-BmrsVdFw.js} +1 -1
  5. package/dist/{builderforce-BWCp-M9e.js → builderforce-Bwyw0GJ6.js} +1 -1
  6. package/dist/bundled/boot-md/handler.js +1 -1
  7. package/dist/bundled/session-memory/handler.js +1 -1
  8. package/dist/chrome-Brg9KsB9.js +4 -0
  9. package/dist/chrome-CtTMuhww.js +4 -0
  10. package/dist/{command-registry-CiR8PUQY.js → command-registry-4_K-lfW5.js} +1 -1
  11. package/dist/{command-registry-D_LkOB4n.js → command-registry-COUcUWby.js} +1 -1
  12. package/dist/{completion-cli-CBES884A.js → completion-cli-B2qcVd6q.js} +1 -1
  13. package/dist/{completion-cli-C7munVvb.js → completion-cli-DlvHqL86.js} +1 -1
  14. package/dist/{completion-cli-CijodCzU.js → completion-cli-DpFvU4Qn.js} +1 -1
  15. package/dist/{completion-cli-B72GX2so.js → completion-cli-SdcQ-kQj.js} +1 -1
  16. package/dist/{doctor-completion-FErwMP3Y.js → doctor-completion-BSotFS6p.js} +1 -1
  17. package/dist/{doctor-completion-Bv2ztEeW.js → doctor-completion-DVxbs-74.js} +1 -1
  18. package/dist/{embedded-DXDHduG1.js → embedded-BcHzh_y8.js} +6 -6
  19. package/dist/{embedded-cvG_LpfQ.js → embedded-D-citLF2.js} +6 -6
  20. package/dist/entry.js +1 -1
  21. package/dist/extensionAPI.js +1 -1
  22. package/dist/{gateway-cli-DpJjgVYH.js → gateway-cli-D2Bg1Um6.js} +3 -3
  23. package/dist/{gateway-cli-U8RlUIuT.js → gateway-cli-DFEo8C0z.js} +3 -3
  24. package/dist/index.js +2 -2
  25. package/dist/llm-slug-generator.js +1 -1
  26. package/dist/{onboard-7JGHJRfj.js → onboard-BVmZ4jMw.js} +1 -1
  27. package/dist/{onboard-O2gyfB4L.js → onboard-DfMVh1bM.js} +1 -1
  28. package/dist/{onboard-interactive-FWIy0HTu.js → onboard-interactive-B3-KBZbZ.js} +1 -1
  29. package/dist/{onboard-interactive-DqpGicxB.js → onboard-interactive-DYJttZ2w.js} +1 -1
  30. package/dist/{onboard-interactive-DboEcFKf.js → onboard-interactive-Dc_7URYb.js} +1 -1
  31. package/dist/{onboard-interactive-Gl5J4kVC.js → onboard-interactive-zgjmwJz-.js} +1 -1
  32. package/dist/{onboarding-Ctq_bdkC.js → onboarding-CP9rrz8y.js} +1 -1
  33. package/dist/{onboarding-hPRXZReM.js → onboarding-D4-HDbmU.js} +1 -1
  34. package/dist/{onboarding.finalize-B4Tc4IDN.js → onboarding.finalize-BfWXPgX7.js} +1 -1
  35. package/dist/{onboarding.finalize-Db6smxZL.js → onboarding.finalize-C2kZi7F0.js} +1 -1
  36. package/dist/{program-DHWSgdol.js → program-2w7Ue902.js} +2 -2
  37. package/dist/{program-context-7XUznN5J.js → program-context-BCwL3wlM.js} +1 -1
  38. package/dist/{prompt-select-styled-Depbcbpw.js → prompt-select-styled-Dd5swW2b.js} +1 -1
  39. package/dist/{prompt-select-styled-Cy70lEMU.js → prompt-select-styled-hB_nLOn1.js} +1 -1
  40. package/dist/{pw-ai-UGketqfG.js → pw-ai-CsJmJcNk.js} +1 -1
  41. package/dist/{pw-ai-D8HJAvv-.js → pw-ai-DaxMmaVL.js} +1 -1
  42. package/dist/{register.maintenance-ohxXhvKX.js → register.maintenance-BELfCO_C.js} +1 -1
  43. package/dist/{register.maintenance-BmnagkdH.js → register.maintenance-DukWFS_D.js} +1 -1
  44. package/dist/{register.onboard-FSaweh3A.js → register.onboard-B9DMNfHE.js} +1 -1
  45. package/dist/{register.onboard-C2Cnd-e9.js → register.onboard-Dt7rzAq-.js} +1 -1
  46. package/dist/{register.setup-Dk9hBOkZ.js → register.setup-BRRVPrx7.js} +1 -1
  47. package/dist/{register.setup-CyTZQLXP.js → register.setup-CSF-2ImP.js} +1 -1
  48. package/dist/{register.subclis-lGgi7ATb.js → register.subclis-4eDV9jKH.js} +1 -1
  49. package/dist/{register.subclis-DqO3Ciiv.js → register.subclis-Cr9DoYcv.js} +1 -1
  50. package/dist/{run-main-BipfHjUR.js → run-main-DLcDEJgv.js} +1 -1
  51. package/dist/{runner-CviGu3Nk.js → runner-COldX-El.js} +3 -3
  52. package/dist/{runner-B70PGCqP.js → runner-D7af_RBH.js} +3 -3
  53. package/dist/{tui-C5ChWpBg.js → tui-BwWMByVp.js} +1 -1
  54. package/dist/{tui-DHjIJOFN.js → tui-DylWbrDx.js} +1 -1
  55. package/dist/{tui-cli-wPseN93O.js → tui-cli-Bh1V8-w9.js} +1 -1
  56. package/dist/{tui-cli-BeFWcUWU.js → tui-cli-C_TTgabr.js} +1 -1
  57. package/dist/{update-cli-CRkZnN_N.js → update-cli-CA3LuuJ7.js} +1 -1
  58. package/dist/{update-cli-DekV-CP_.js → update-cli-DUrUIrYQ.js} +1 -1
  59. package/dist/{web-DONGrYXq.js → web-BQPd6gQJ.js} +1 -1
  60. package/dist/{web-D44jKC1F.js → web-DPGGHIc_.js} +1 -1
  61. package/package.json +1 -1
  62. package/dist/chrome-Blk2Jftn.js +0 -4
  63. package/dist/chrome-DUBgoZpO.js +0 -4
@@ -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-D2Bg1Um6.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-C_TTgabr.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-DUrUIrYQ.js`)).registerUpdateCli(program)}},{name:`completion`,description:`Generate shell completion script`,hasSubcommands:!1,register:async program=>{(await import(`./completion-cli-DlvHqL86.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-BRRVPrx7.js`)).registerSetupCommand(program)}},{commands:[{name:`onboard`,description:`Interactive onboarding wizard for gateway, workspace, and skills`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.onboard-Dt7rzAq-.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-DukWFS_D.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-Bwyw0GJ6.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-BSotFS6p.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-DVxbs-74.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(`
@@ -1,4 +1,4 @@
1
- import"./paths-CAQcjxp2.js";import"./session-key-CYpYHc1e.js";import"./registry-j1UKIotU.js";import"./agent-scope-C7zGN7Pz.js";import"./subsystem-ykSbyaud.js";import{St as normalizeBaseUrl}from"./model-selection-BGEkWWV7.js";import{r as formatCliCommand}from"./env-44XUbLhk.js";import"./src-izs0XSXm.js";import"./redact-xFefzy4M.js";import{n as formatErrorMessage}from"./errors-CguQr0Ja.js";import"./config-C7baFOp1.js";import{_ as withCdpSocket,d as normalizeCdpWsUrl,g as getHeadersWithAuth,m as fetchJson,p as appendCdpPath,t as getChromeWebSocketUrl,u as formatAriaSnapshot,x as resolvePreferredBuilderForceAgentsTmpDir}from"./chrome-DUBgoZpO.js";import path from"node:path";import crypto from"node:crypto";import fs from"node:fs/promises";import{chromium,devices}from"playwright-core";const pageStates=new WeakMap,contextStates=new WeakMap,observedContexts=new WeakSet,observedPages=new WeakSet,roleRefsByTarget=new Map;let cached=null,connecting=null;function normalizeCdpUrl(raw){return raw.replace(/\/$/,``)}function findNetworkRequestById(state,id){for(let i=state.requests.length-1;i>=0;--i){let candidate=state.requests[i];if(candidate&&candidate.id===id)return candidate}}function roleRefsKey(cdpUrl,targetId){return`${normalizeCdpUrl(cdpUrl)}::${targetId}`}function rememberRoleRefsForTarget(opts){let targetId=opts.targetId.trim();if(targetId)for(roleRefsByTarget.set(roleRefsKey(opts.cdpUrl,targetId),{refs:opts.refs,...opts.frameSelector?{frameSelector:opts.frameSelector}:{},...opts.mode?{mode:opts.mode}:{}});roleRefsByTarget.size>50;){let first=roleRefsByTarget.keys().next();if(first.done)break;roleRefsByTarget.delete(first.value)}}function storeRoleRefsForTarget(opts){let state=ensurePageState(opts.page);state.roleRefs=opts.refs,state.roleRefsFrameSelector=opts.frameSelector,state.roleRefsMode=opts.mode,opts.targetId?.trim()&&rememberRoleRefsForTarget({cdpUrl:opts.cdpUrl,targetId:opts.targetId,refs:opts.refs,frameSelector:opts.frameSelector,mode:opts.mode})}function restoreRoleRefsForTarget(opts){let targetId=opts.targetId?.trim()||``;if(!targetId)return;let cached=roleRefsByTarget.get(roleRefsKey(opts.cdpUrl,targetId));if(!cached)return;let state=ensurePageState(opts.page);state.roleRefs||(state.roleRefs=cached.refs,state.roleRefsFrameSelector=cached.frameSelector,state.roleRefsMode=cached.mode)}function ensurePageState(page){let existing=pageStates.get(page);if(existing)return existing;let state={console:[],errors:[],requests:[],requestIds:new WeakMap,nextRequestId:0,armIdUpload:0,armIdDialog:0,armIdDownload:0};return pageStates.set(page,state),observedPages.has(page)||(observedPages.add(page),page.on(`console`,msg=>{let entry={type:msg.type(),text:msg.text(),timestamp:new Date().toISOString(),location:msg.location()};state.console.push(entry),state.console.length>500&&state.console.shift()}),page.on(`pageerror`,err=>{state.errors.push({message:err?.message?String(err.message):String(err),name:err?.name?String(err.name):void 0,stack:err?.stack?String(err.stack):void 0,timestamp:new Date().toISOString()}),state.errors.length>200&&state.errors.shift()}),page.on(`request`,req=>{state.nextRequestId+=1;let id=`r${state.nextRequestId}`;state.requestIds.set(req,id),state.requests.push({id,timestamp:new Date().toISOString(),method:req.method(),url:req.url(),resourceType:req.resourceType()}),state.requests.length>500&&state.requests.shift()}),page.on(`response`,resp=>{let req=resp.request(),id=state.requestIds.get(req);if(!id)return;let rec=findNetworkRequestById(state,id);rec&&(rec.status=resp.status(),rec.ok=resp.ok())}),page.on(`requestfailed`,req=>{let id=state.requestIds.get(req);if(!id)return;let rec=findNetworkRequestById(state,id);rec&&(rec.failureText=req.failure()?.errorText,rec.ok=!1)}),page.on(`close`,()=>{pageStates.delete(page),observedPages.delete(page)})),state}function observeContext(context){if(!observedContexts.has(context)){observedContexts.add(context),ensureContextState(context);for(let page of context.pages())ensurePageState(page);context.on(`page`,page=>ensurePageState(page))}}function ensureContextState(context){let existing=contextStates.get(context);if(existing)return existing;let state={traceActive:!1};return contextStates.set(context,state),state}function observeBrowser(browser){for(let context of browser.contexts())observeContext(context)}async function connectBrowser(cdpUrl){let normalized=normalizeCdpUrl(cdpUrl);return cached?.cdpUrl===normalized?cached:(connecting||=(async()=>{let lastErr;for(let attempt=0;attempt<3;attempt+=1)try{let timeout=5e3+attempt*2e3,endpoint=await getChromeWebSocketUrl(normalized,timeout).catch(()=>null)??normalized,headers=getHeadersWithAuth(endpoint),browser=await chromium.connectOverCDP(endpoint,{timeout,headers}),onDisconnected=()=>{cached?.browser===browser&&(cached=null)},connected={browser,cdpUrl:normalized,onDisconnected};return cached=connected,browser.on(`disconnected`,onDisconnected),observeBrowser(browser),connected}catch(err){lastErr=err;let delay=250+attempt*250;await new Promise(r=>setTimeout(r,delay))}if(lastErr instanceof Error)throw lastErr;let message=lastErr?formatErrorMessage(lastErr):`CDP connect failed`;throw Error(message)})().finally(()=>{connecting=null}),await connecting)}async function getAllPages(browser){return browser.contexts().flatMap(c=>c.pages())}async function pageTargetId(page){let session=await page.context().newCDPSession(page);try{let info=await session.send(`Target.getTargetInfo`);return String(info?.targetInfo?.targetId??``).trim()||null}finally{await session.detach().catch(()=>{})}}async function findPageByTargetId(browser,targetId,cdpUrl){let pages=await getAllPages(browser),resolvedViaCdp=!1;for(let page of pages){let tid=null;try{tid=await pageTargetId(page),resolvedViaCdp=!0}catch{tid=null}if(tid&&tid===targetId)return page}if(!resolvedViaCdp&&pages.length===1)return pages[0];if(cdpUrl)try{let listUrl=`${normalizeBaseUrl(cdpUrl).replace(/^ws:/,`http:`).replace(/\/cdp$/,``)}/json/list`,response=await fetch(listUrl,{headers:getHeadersWithAuth(listUrl)});if(response.ok){let targets=await response.json(),target=targets.find(t=>t.id===targetId);if(target){let urlMatch=pages.filter(p=>p.url()===target.url);if(urlMatch.length===1)return urlMatch[0];if(urlMatch.length>1){let sameUrlTargets=targets.filter(t=>t.url===target.url);if(sameUrlTargets.length===urlMatch.length){let idx=sameUrlTargets.findIndex(t=>t.id===targetId);if(idx>=0&&idx<urlMatch.length)return urlMatch[idx]}}}}}catch{}return null}async function getPageForTargetId(opts){let{browser}=await connectBrowser(opts.cdpUrl),pages=await getAllPages(browser);if(!pages.length)throw Error(`No pages available in the connected browser.`);let first=pages[0];if(!opts.targetId)return first;let found=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!found){if(pages.length===1)return first;throw Error(`tab not found`)}return found}function refLocator(page,ref){let normalized=ref.startsWith(`@`)?ref.slice(1):ref.startsWith(`ref=`)?ref.slice(4):ref;if(/^e\d+$/.test(normalized)){let state=pageStates.get(page);if(state?.roleRefsMode===`aria`)return(state.roleRefsFrameSelector?page.frameLocator(state.roleRefsFrameSelector):page).locator(`aria-ref=${normalized}`);let info=state?.roleRefs?.[normalized];if(!info)throw Error(`Unknown ref "${normalized}". Run a new snapshot and use a ref from that snapshot.`);let locAny=state?.roleRefsFrameSelector?page.frameLocator(state.roleRefsFrameSelector):page,locator=info.name?locAny.getByRole(info.role,{name:info.name,exact:!0}):locAny.getByRole(info.role);return info.nth===void 0?locator:locator.nth(info.nth)}return page.locator(`aria-ref=${normalized}`)}async function closePlaywrightBrowserConnection(){let cur=cached;cached=null,connecting=null,cur&&(cur.onDisconnected&&typeof cur.browser.off==`function`&&cur.browser.off(`disconnected`,cur.onDisconnected),await cur.browser.close().catch(()=>{}))}function normalizeCdpHttpBaseForJsonEndpoints(cdpUrl){try{let url=new URL(cdpUrl);return url.protocol===`ws:`?url.protocol=`http:`:url.protocol===`wss:`&&(url.protocol=`https:`),url.pathname=url.pathname.replace(/\/devtools\/browser\/.*$/,``),url.pathname=url.pathname.replace(/\/cdp$/,``),url.toString().replace(/\/$/,``)}catch{return cdpUrl.replace(/^ws:/,`http:`).replace(/^wss:/,`https:`).replace(/\/devtools\/browser\/.*$/,``).replace(/\/cdp$/,``).replace(/\/$/,``)}}function cdpSocketNeedsAttach(wsUrl){try{let pathname=new URL(wsUrl).pathname;return pathname===`/cdp`||pathname.endsWith(`/cdp`)||pathname.includes(`/devtools/browser/`)}catch{return!1}}async function tryTerminateExecutionViaCdp(opts){let cdpHttpBase=normalizeCdpHttpBaseForJsonEndpoints(opts.cdpUrl),pages=await fetchJson(appendCdpPath(cdpHttpBase,`/json/list`),2e3).catch(()=>null);if(!pages||pages.length===0)return;let target=pages.find(p=>String(p.id??``).trim()===opts.targetId),wsUrlRaw=String(target?.webSocketDebuggerUrl??``).trim();if(!wsUrlRaw)return;let wsUrl=normalizeCdpWsUrl(wsUrlRaw,cdpHttpBase),needsAttach=cdpSocketNeedsAttach(wsUrl),runWithTimeout=async(work,ms)=>{let timer,timeoutPromise=new Promise((_,reject)=>{timer=setTimeout(()=>reject(Error(`CDP command timed out`)),ms)});try{return await Promise.race([work,timeoutPromise])}finally{timer&&clearTimeout(timer)}};await withCdpSocket(wsUrl,async send=>{let sessionId;try{if(needsAttach){let attached=await runWithTimeout(send(`Target.attachToTarget`,{targetId:opts.targetId,flatten:!0}),1500);typeof attached?.sessionId==`string`&&attached.sessionId.trim()&&(sessionId=attached.sessionId)}await runWithTimeout(send(`Runtime.terminateExecution`,void 0,sessionId),1500),sessionId&&send(`Target.detachFromTarget`,{sessionId}).catch(()=>{})}catch{}},{handshakeTimeoutMs:2e3}).catch(()=>{})}async function forceDisconnectPlaywrightForTarget(opts){let normalized=normalizeCdpUrl(opts.cdpUrl);if(cached?.cdpUrl!==normalized)return;let cur=cached;if(cached=null,connecting=null,cur){cur.onDisconnected&&typeof cur.browser.off==`function`&&cur.browser.off(`disconnected`,cur.onDisconnected);let targetId=opts.targetId?.trim()||``;targetId&&await tryTerminateExecutionViaCdp({cdpUrl:normalized,targetId}).catch(()=>{}),cur.browser.close().catch(()=>{})}}async function listPagesViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),pages=await getAllPages(browser),results=[];for(let page of pages){let tid=await pageTargetId(page).catch(()=>null);tid&&results.push({targetId:tid,title:await page.title().catch(()=>``),url:page.url(),type:`page`})}return results}async function createPageViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),context=browser.contexts()[0]??await browser.newContext();ensureContextState(context);let page=await context.newPage();ensurePageState(page);let targetUrl=opts.url.trim()||`about:blank`;targetUrl!==`about:blank`&&await page.goto(targetUrl,{timeout:3e4}).catch(()=>{});let tid=await pageTargetId(page).catch(()=>null);if(!tid)throw Error(`Failed to get targetId for new page`);return{targetId:tid,title:await page.title().catch(()=>``),url:page.url(),type:`page`}}async function closePageByTargetIdViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),page=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!page)throw Error(`tab not found`);await page.close()}async function focusPageByTargetIdViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),page=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!page)throw Error(`tab not found`);try{await page.bringToFront()}catch(err){let session=await page.context().newCDPSession(page);try{await session.send(`Page.bringToFront`);return}catch{throw err}finally{await session.detach().catch(()=>{})}}}async function getPageErrorsViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts)),errors=[...state.errors];return opts.clear&&(state.errors=[]),{errors}}async function getNetworkRequestsViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts)),raw=[...state.requests],filter=typeof opts.filter==`string`?opts.filter.trim():``,requests=filter?raw.filter(r=>r.url.includes(filter)):raw;return opts.clear&&(state.requests=[],state.requestIds=new WeakMap),{requests}}function consolePriority(level){switch(level){case`error`:return 3;case`warning`:return 2;case`info`:case`log`:return 1;case`debug`:return 0;default:return 1}}async function getConsoleMessagesViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts));if(!opts.level)return[...state.console];let min=consolePriority(opts.level);return state.console.filter(msg=>consolePriority(msg.type)>=min)}const INTERACTIVE_ROLES=new Set([`button`,`link`,`textbox`,`checkbox`,`radio`,`combobox`,`listbox`,`menuitem`,`menuitemcheckbox`,`menuitemradio`,`option`,`searchbox`,`slider`,`spinbutton`,`switch`,`tab`,`treeitem`]),CONTENT_ROLES=new Set([`heading`,`cell`,`gridcell`,`columnheader`,`rowheader`,`listitem`,`article`,`region`,`main`,`navigation`]),STRUCTURAL_ROLES=new Set([`generic`,`group`,`list`,`table`,`row`,`rowgroup`,`grid`,`treegrid`,`menu`,`menubar`,`toolbar`,`tablist`,`tree`,`directory`,`document`,`application`,`presentation`,`none`]);function getRoleSnapshotStats(snapshot,refs){let interactive=Object.values(refs).filter(r=>INTERACTIVE_ROLES.has(r.role)).length;return{lines:snapshot.split(`
1
+ import"./paths-CAQcjxp2.js";import"./session-key-CYpYHc1e.js";import"./registry-j1UKIotU.js";import"./agent-scope-C7zGN7Pz.js";import"./subsystem-ykSbyaud.js";import{St as normalizeBaseUrl}from"./model-selection-BGEkWWV7.js";import{r as formatCliCommand}from"./env-44XUbLhk.js";import"./src-izs0XSXm.js";import"./redact-xFefzy4M.js";import{n as formatErrorMessage}from"./errors-CguQr0Ja.js";import"./config-C7baFOp1.js";import{_ as withCdpSocket,d as normalizeCdpWsUrl,g as getHeadersWithAuth,m as fetchJson,p as appendCdpPath,t as getChromeWebSocketUrl,u as formatAriaSnapshot,x as resolvePreferredBuilderForceAgentsTmpDir}from"./chrome-Brg9KsB9.js";import path from"node:path";import crypto from"node:crypto";import fs from"node:fs/promises";import{chromium,devices}from"playwright-core";const pageStates=new WeakMap,contextStates=new WeakMap,observedContexts=new WeakSet,observedPages=new WeakSet,roleRefsByTarget=new Map;let cached=null,connecting=null;function normalizeCdpUrl(raw){return raw.replace(/\/$/,``)}function findNetworkRequestById(state,id){for(let i=state.requests.length-1;i>=0;--i){let candidate=state.requests[i];if(candidate&&candidate.id===id)return candidate}}function roleRefsKey(cdpUrl,targetId){return`${normalizeCdpUrl(cdpUrl)}::${targetId}`}function rememberRoleRefsForTarget(opts){let targetId=opts.targetId.trim();if(targetId)for(roleRefsByTarget.set(roleRefsKey(opts.cdpUrl,targetId),{refs:opts.refs,...opts.frameSelector?{frameSelector:opts.frameSelector}:{},...opts.mode?{mode:opts.mode}:{}});roleRefsByTarget.size>50;){let first=roleRefsByTarget.keys().next();if(first.done)break;roleRefsByTarget.delete(first.value)}}function storeRoleRefsForTarget(opts){let state=ensurePageState(opts.page);state.roleRefs=opts.refs,state.roleRefsFrameSelector=opts.frameSelector,state.roleRefsMode=opts.mode,opts.targetId?.trim()&&rememberRoleRefsForTarget({cdpUrl:opts.cdpUrl,targetId:opts.targetId,refs:opts.refs,frameSelector:opts.frameSelector,mode:opts.mode})}function restoreRoleRefsForTarget(opts){let targetId=opts.targetId?.trim()||``;if(!targetId)return;let cached=roleRefsByTarget.get(roleRefsKey(opts.cdpUrl,targetId));if(!cached)return;let state=ensurePageState(opts.page);state.roleRefs||(state.roleRefs=cached.refs,state.roleRefsFrameSelector=cached.frameSelector,state.roleRefsMode=cached.mode)}function ensurePageState(page){let existing=pageStates.get(page);if(existing)return existing;let state={console:[],errors:[],requests:[],requestIds:new WeakMap,nextRequestId:0,armIdUpload:0,armIdDialog:0,armIdDownload:0};return pageStates.set(page,state),observedPages.has(page)||(observedPages.add(page),page.on(`console`,msg=>{let entry={type:msg.type(),text:msg.text(),timestamp:new Date().toISOString(),location:msg.location()};state.console.push(entry),state.console.length>500&&state.console.shift()}),page.on(`pageerror`,err=>{state.errors.push({message:err?.message?String(err.message):String(err),name:err?.name?String(err.name):void 0,stack:err?.stack?String(err.stack):void 0,timestamp:new Date().toISOString()}),state.errors.length>200&&state.errors.shift()}),page.on(`request`,req=>{state.nextRequestId+=1;let id=`r${state.nextRequestId}`;state.requestIds.set(req,id),state.requests.push({id,timestamp:new Date().toISOString(),method:req.method(),url:req.url(),resourceType:req.resourceType()}),state.requests.length>500&&state.requests.shift()}),page.on(`response`,resp=>{let req=resp.request(),id=state.requestIds.get(req);if(!id)return;let rec=findNetworkRequestById(state,id);rec&&(rec.status=resp.status(),rec.ok=resp.ok())}),page.on(`requestfailed`,req=>{let id=state.requestIds.get(req);if(!id)return;let rec=findNetworkRequestById(state,id);rec&&(rec.failureText=req.failure()?.errorText,rec.ok=!1)}),page.on(`close`,()=>{pageStates.delete(page),observedPages.delete(page)})),state}function observeContext(context){if(!observedContexts.has(context)){observedContexts.add(context),ensureContextState(context);for(let page of context.pages())ensurePageState(page);context.on(`page`,page=>ensurePageState(page))}}function ensureContextState(context){let existing=contextStates.get(context);if(existing)return existing;let state={traceActive:!1};return contextStates.set(context,state),state}function observeBrowser(browser){for(let context of browser.contexts())observeContext(context)}async function connectBrowser(cdpUrl){let normalized=normalizeCdpUrl(cdpUrl);return cached?.cdpUrl===normalized?cached:(connecting||=(async()=>{let lastErr;for(let attempt=0;attempt<3;attempt+=1)try{let timeout=5e3+attempt*2e3,endpoint=await getChromeWebSocketUrl(normalized,timeout).catch(()=>null)??normalized,headers=getHeadersWithAuth(endpoint),browser=await chromium.connectOverCDP(endpoint,{timeout,headers}),onDisconnected=()=>{cached?.browser===browser&&(cached=null)},connected={browser,cdpUrl:normalized,onDisconnected};return cached=connected,browser.on(`disconnected`,onDisconnected),observeBrowser(browser),connected}catch(err){lastErr=err;let delay=250+attempt*250;await new Promise(r=>setTimeout(r,delay))}if(lastErr instanceof Error)throw lastErr;let message=lastErr?formatErrorMessage(lastErr):`CDP connect failed`;throw Error(message)})().finally(()=>{connecting=null}),await connecting)}async function getAllPages(browser){return browser.contexts().flatMap(c=>c.pages())}async function pageTargetId(page){let session=await page.context().newCDPSession(page);try{let info=await session.send(`Target.getTargetInfo`);return String(info?.targetInfo?.targetId??``).trim()||null}finally{await session.detach().catch(()=>{})}}async function findPageByTargetId(browser,targetId,cdpUrl){let pages=await getAllPages(browser),resolvedViaCdp=!1;for(let page of pages){let tid=null;try{tid=await pageTargetId(page),resolvedViaCdp=!0}catch{tid=null}if(tid&&tid===targetId)return page}if(!resolvedViaCdp&&pages.length===1)return pages[0];if(cdpUrl)try{let listUrl=`${normalizeBaseUrl(cdpUrl).replace(/^ws:/,`http:`).replace(/\/cdp$/,``)}/json/list`,response=await fetch(listUrl,{headers:getHeadersWithAuth(listUrl)});if(response.ok){let targets=await response.json(),target=targets.find(t=>t.id===targetId);if(target){let urlMatch=pages.filter(p=>p.url()===target.url);if(urlMatch.length===1)return urlMatch[0];if(urlMatch.length>1){let sameUrlTargets=targets.filter(t=>t.url===target.url);if(sameUrlTargets.length===urlMatch.length){let idx=sameUrlTargets.findIndex(t=>t.id===targetId);if(idx>=0&&idx<urlMatch.length)return urlMatch[idx]}}}}}catch{}return null}async function getPageForTargetId(opts){let{browser}=await connectBrowser(opts.cdpUrl),pages=await getAllPages(browser);if(!pages.length)throw Error(`No pages available in the connected browser.`);let first=pages[0];if(!opts.targetId)return first;let found=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!found){if(pages.length===1)return first;throw Error(`tab not found`)}return found}function refLocator(page,ref){let normalized=ref.startsWith(`@`)?ref.slice(1):ref.startsWith(`ref=`)?ref.slice(4):ref;if(/^e\d+$/.test(normalized)){let state=pageStates.get(page);if(state?.roleRefsMode===`aria`)return(state.roleRefsFrameSelector?page.frameLocator(state.roleRefsFrameSelector):page).locator(`aria-ref=${normalized}`);let info=state?.roleRefs?.[normalized];if(!info)throw Error(`Unknown ref "${normalized}". Run a new snapshot and use a ref from that snapshot.`);let locAny=state?.roleRefsFrameSelector?page.frameLocator(state.roleRefsFrameSelector):page,locator=info.name?locAny.getByRole(info.role,{name:info.name,exact:!0}):locAny.getByRole(info.role);return info.nth===void 0?locator:locator.nth(info.nth)}return page.locator(`aria-ref=${normalized}`)}async function closePlaywrightBrowserConnection(){let cur=cached;cached=null,connecting=null,cur&&(cur.onDisconnected&&typeof cur.browser.off==`function`&&cur.browser.off(`disconnected`,cur.onDisconnected),await cur.browser.close().catch(()=>{}))}function normalizeCdpHttpBaseForJsonEndpoints(cdpUrl){try{let url=new URL(cdpUrl);return url.protocol===`ws:`?url.protocol=`http:`:url.protocol===`wss:`&&(url.protocol=`https:`),url.pathname=url.pathname.replace(/\/devtools\/browser\/.*$/,``),url.pathname=url.pathname.replace(/\/cdp$/,``),url.toString().replace(/\/$/,``)}catch{return cdpUrl.replace(/^ws:/,`http:`).replace(/^wss:/,`https:`).replace(/\/devtools\/browser\/.*$/,``).replace(/\/cdp$/,``).replace(/\/$/,``)}}function cdpSocketNeedsAttach(wsUrl){try{let pathname=new URL(wsUrl).pathname;return pathname===`/cdp`||pathname.endsWith(`/cdp`)||pathname.includes(`/devtools/browser/`)}catch{return!1}}async function tryTerminateExecutionViaCdp(opts){let cdpHttpBase=normalizeCdpHttpBaseForJsonEndpoints(opts.cdpUrl),pages=await fetchJson(appendCdpPath(cdpHttpBase,`/json/list`),2e3).catch(()=>null);if(!pages||pages.length===0)return;let target=pages.find(p=>String(p.id??``).trim()===opts.targetId),wsUrlRaw=String(target?.webSocketDebuggerUrl??``).trim();if(!wsUrlRaw)return;let wsUrl=normalizeCdpWsUrl(wsUrlRaw,cdpHttpBase),needsAttach=cdpSocketNeedsAttach(wsUrl),runWithTimeout=async(work,ms)=>{let timer,timeoutPromise=new Promise((_,reject)=>{timer=setTimeout(()=>reject(Error(`CDP command timed out`)),ms)});try{return await Promise.race([work,timeoutPromise])}finally{timer&&clearTimeout(timer)}};await withCdpSocket(wsUrl,async send=>{let sessionId;try{if(needsAttach){let attached=await runWithTimeout(send(`Target.attachToTarget`,{targetId:opts.targetId,flatten:!0}),1500);typeof attached?.sessionId==`string`&&attached.sessionId.trim()&&(sessionId=attached.sessionId)}await runWithTimeout(send(`Runtime.terminateExecution`,void 0,sessionId),1500),sessionId&&send(`Target.detachFromTarget`,{sessionId}).catch(()=>{})}catch{}},{handshakeTimeoutMs:2e3}).catch(()=>{})}async function forceDisconnectPlaywrightForTarget(opts){let normalized=normalizeCdpUrl(opts.cdpUrl);if(cached?.cdpUrl!==normalized)return;let cur=cached;if(cached=null,connecting=null,cur){cur.onDisconnected&&typeof cur.browser.off==`function`&&cur.browser.off(`disconnected`,cur.onDisconnected);let targetId=opts.targetId?.trim()||``;targetId&&await tryTerminateExecutionViaCdp({cdpUrl:normalized,targetId}).catch(()=>{}),cur.browser.close().catch(()=>{})}}async function listPagesViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),pages=await getAllPages(browser),results=[];for(let page of pages){let tid=await pageTargetId(page).catch(()=>null);tid&&results.push({targetId:tid,title:await page.title().catch(()=>``),url:page.url(),type:`page`})}return results}async function createPageViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),context=browser.contexts()[0]??await browser.newContext();ensureContextState(context);let page=await context.newPage();ensurePageState(page);let targetUrl=opts.url.trim()||`about:blank`;targetUrl!==`about:blank`&&await page.goto(targetUrl,{timeout:3e4}).catch(()=>{});let tid=await pageTargetId(page).catch(()=>null);if(!tid)throw Error(`Failed to get targetId for new page`);return{targetId:tid,title:await page.title().catch(()=>``),url:page.url(),type:`page`}}async function closePageByTargetIdViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),page=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!page)throw Error(`tab not found`);await page.close()}async function focusPageByTargetIdViaPlaywright(opts){let{browser}=await connectBrowser(opts.cdpUrl),page=await findPageByTargetId(browser,opts.targetId,opts.cdpUrl);if(!page)throw Error(`tab not found`);try{await page.bringToFront()}catch(err){let session=await page.context().newCDPSession(page);try{await session.send(`Page.bringToFront`);return}catch{throw err}finally{await session.detach().catch(()=>{})}}}async function getPageErrorsViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts)),errors=[...state.errors];return opts.clear&&(state.errors=[]),{errors}}async function getNetworkRequestsViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts)),raw=[...state.requests],filter=typeof opts.filter==`string`?opts.filter.trim():``,requests=filter?raw.filter(r=>r.url.includes(filter)):raw;return opts.clear&&(state.requests=[],state.requestIds=new WeakMap),{requests}}function consolePriority(level){switch(level){case`error`:return 3;case`warning`:return 2;case`info`:case`log`:return 1;case`debug`:return 0;default:return 1}}async function getConsoleMessagesViaPlaywright(opts){let state=ensurePageState(await getPageForTargetId(opts));if(!opts.level)return[...state.console];let min=consolePriority(opts.level);return state.console.filter(msg=>consolePriority(msg.type)>=min)}const INTERACTIVE_ROLES=new Set([`button`,`link`,`textbox`,`checkbox`,`radio`,`combobox`,`listbox`,`menuitem`,`menuitemcheckbox`,`menuitemradio`,`option`,`searchbox`,`slider`,`spinbutton`,`switch`,`tab`,`treeitem`]),CONTENT_ROLES=new Set([`heading`,`cell`,`gridcell`,`columnheader`,`rowheader`,`listitem`,`article`,`region`,`main`,`navigation`]),STRUCTURAL_ROLES=new Set([`generic`,`group`,`list`,`table`,`row`,`rowgroup`,`grid`,`treegrid`,`menu`,`menubar`,`toolbar`,`tablist`,`tree`,`directory`,`document`,`application`,`presentation`,`none`]);function getRoleSnapshotStats(snapshot,refs){let interactive=Object.values(refs).filter(r=>INTERACTIVE_ROLES.has(r.role)).length;return{lines:snapshot.split(`
2
2
  `).length,chars:snapshot.length,refs:Object.keys(refs).length,interactive}}function getIndentLevel(line){let match=line.match(/^(\s*)/);return match?Math.floor(match[1].length/2):0}function matchInteractiveSnapshotLine(line,options){let depth=getIndentLevel(line);if(options.maxDepth!==void 0&&depth>options.maxDepth)return null;let match=line.match(/^(\s*-\s*)(\w+)(?:\s+"([^"]*)")?(.*)$/);if(!match)return null;let[,,roleRaw,name,suffix]=match;return roleRaw.startsWith(`/`)?null:{roleRaw,role:roleRaw.toLowerCase(),...name?{name}:{},suffix}}function createRoleNameTracker(){let counts=new Map,refsByKey=new Map;return{counts,refsByKey,getKey(role,name){return`${role}:${name??``}`},getNextIndex(role,name){let key=this.getKey(role,name),current=counts.get(key)??0;return counts.set(key,current+1),current},trackRef(role,name,ref){let key=this.getKey(role,name),list=refsByKey.get(key)??[];list.push(ref),refsByKey.set(key,list)},getDuplicateKeys(){let out=new Set;for(let[key,refs]of refsByKey)refs.length>1&&out.add(key);return out}}}function removeNthFromNonDuplicates(refs,tracker){let duplicates=tracker.getDuplicateKeys();for(let[ref,data]of Object.entries(refs)){let key=tracker.getKey(data.role,data.name);duplicates.has(key)||delete refs[ref]?.nth}}function compactTree(tree){let lines=tree.split(`
3
3
  `),result=[];for(let i=0;i<lines.length;i+=1){let line=lines[i];if(line.includes(`[ref=`)){result.push(line);continue}if(line.includes(`:`)&&!line.trimEnd().endsWith(`:`)){result.push(line);continue}let currentIndent=getIndentLevel(line),hasRelevantChildren=!1;for(let j=i+1;j<lines.length&&!(getIndentLevel(lines[j])<=currentIndent);j+=1)if(lines[j]?.includes(`[ref=`)){hasRelevantChildren=!0;break}hasRelevantChildren&&result.push(line)}return result.join(`
4
4
  `)}function processLine(line,refs,options,tracker,nextRef){let depth=getIndentLevel(line);if(options.maxDepth!==void 0&&depth>options.maxDepth)return null;let match=line.match(/^(\s*-\s*)(\w+)(?:\s+"([^"]*)")?(.*)$/);if(!match)return options.interactive?null:line;let[,prefix,roleRaw,name,suffix]=match;if(roleRaw.startsWith(`/`))return options.interactive?null:line;let role=roleRaw.toLowerCase(),isInteractive=INTERACTIVE_ROLES.has(role),isContent=CONTENT_ROLES.has(role),isStructural=STRUCTURAL_ROLES.has(role);if(options.interactive&&!isInteractive||options.compact&&isStructural&&!name)return null;if(!(isInteractive||isContent&&name))return line;let ref=nextRef(),nth=tracker.getNextIndex(role,name);tracker.trackRef(role,name,ref),refs[ref]={role,name,nth};let enhanced=`${prefix}${roleRaw}`;return name&&(enhanced+=` "${name}"`),enhanced+=` [ref=${ref}]`,nth>0&&(enhanced+=` [nth=${nth}]`),suffix&&(enhanced+=suffix),enhanced}function parseRoleRef(raw){let trimmed=raw.trim();if(!trimmed)return null;let normalized=trimmed.startsWith(`@`)?trimmed.slice(1):trimmed.startsWith(`ref=`)?trimmed.slice(4):trimmed;return/^e\d+$/.test(normalized)?normalized:null}function buildRoleSnapshotFromAriaSnapshot(ariaSnapshot,options={}){let lines=ariaSnapshot.split(`
@@ -1 +1 @@
1
- import{g as resolveStateDir,i as isNixMode,m as resolveOAuthDir,o as resolveConfigPath,u as resolveGatewayPort}from"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{_ as resolveHomeDir,x as shortenHomeInString,y as resolveUserPath,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-C1VbcUOm.js";import{t as formatCliCommand}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{k as resolveDefaultAgentWorkspaceDir}from"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{a as readConfigFileSnapshot,r as loadConfig}from"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./model-discovery-C9Xm95uL.js";import"./model-catalog-CiiFJX77.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./skills-status-CGlKz1D1.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-DmAU4cRX.js";import"./message-channel-z5YRpR2d.js";import"./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{n as runCommandWithRuntime}from"./cli-utils-C9pW69LF.js";import"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DbkT_5BV.js";import{d as openUrl,g as resolveControlUiLinks,i as detectBrowserOpenSupport,o as formatControlUiSshHint}from"./onboard-helpers-CckrS8_K.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BMWmaqSC.js";import"./pairing-labels-3j_iRYOO.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-CV4nDcCk.js";import"./transformers-stream-Buj40qHl.js";import{t as copyToClipboard}from"./clipboard-BuWqKeWo.js";import"./catalog-li4bSIE2.js";import"./note-DgDXuE0F.js";import"./helpers-DPPVplyk.js";import"./plugin-auto-enable-BV9K9Vhr.js";import"./channels-status-issues-NLYb8w9i.js";import"./register.subclis-DqO3Ciiv.js";import"./command-registry-D_LkOB4n.js";import"./program-context-Wpc-6CdI.js";import"./completion-cli-CijodCzU.js";import"./daemon-runtime-B4UjqdyJ.js";import"./runtime-guard-Bi8k55v9.js";import"./systemd-DdVd5Yet.js";import{t as resolveGatewayService}from"./service-EKJG69M3.js";import"./lifecycle-core-BpMvDXy1.js";import"./diagnostics-DamNPi4e.js";import{c as runDaemonStop}from"./daemon-cli-DyVsMf8p.js";import"./health-DVo8a9yg.js";import"./control-ui-assets-BxgWcomx.js";import"./update-check-B0YqSZJr.js";import"./dm-policy-shared-CRZpjRv0.js";import"./session-dirs-OxQuIvJW.js";import"./logging-ayt7F7vy.js";import"./systemd-linger-CPKngdUf.js";import"./health-format-D4MaIjaG.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-Depbcbpw.js";import"./doctor-completion-FErwMP3Y.js";import path from"node:path";import fs from"node:fs";import fs$1 from"node:fs/promises";import{cancel,confirm,isCancel,multiselect}from"@clack/prompts";async function dashboardCommand(runtime=defaultRuntime,options={}){let snapshot=await readConfigFileSnapshot(),cfg=snapshot.valid?snapshot.config:{},port=resolveGatewayPort(cfg),bind=cfg.gateway?.bind??`loopback`,basePath=cfg.gateway?.controlUi?.basePath,customBindHost=cfg.gateway?.customBindHost,token=cfg.gateway?.auth?.token??process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN??``,links=resolveControlUiLinks({port,bind:bind===`lan`?`loopback`:bind,customBindHost,basePath}),dashboardUrl=token?`${links.httpUrl}#token=${encodeURIComponent(token)}`:links.httpUrl;runtime.log(`Dashboard URL: ${dashboardUrl}`);let copied=await copyToClipboard(dashboardUrl).catch(()=>!1);runtime.log(copied?`Copied to clipboard.`:`Copy to clipboard unavailable.`);let opened=!1,hint;options.noOpen?hint=`Browser launch disabled (--no-open). Use the URL above.`:((await detectBrowserOpenSupport()).ok&&(opened=await openUrl(dashboardUrl)),opened||(hint=formatControlUiSshHint({port,basePath,token:token||void 0}))),opened?runtime.log(`Opened in your browser. Keep that tab to control BuilderForceAgents.`):hint&&runtime.log(hint)}function collectWorkspaceDirs(cfg){let dirs=new Set,defaults=cfg?.agents?.defaults;typeof defaults?.workspace==`string`&&defaults.workspace.trim()&&dirs.add(resolveUserPath(defaults.workspace));let list=Array.isArray(cfg?.agents?.list)?cfg?.agents?.list:[];for(let agent of list){let workspace=agent.workspace;typeof workspace==`string`&&workspace.trim()&&dirs.add(resolveUserPath(workspace))}return dirs.size===0&&dirs.add(resolveDefaultAgentWorkspaceDir()),[...dirs]}function buildCleanupPlan(params){return{configInsideState:isPathWithin(params.configPath,params.stateDir),oauthInsideState:isPathWithin(params.oauthDir,params.stateDir),workspaceDirs:collectWorkspaceDirs(params.cfg)}}function isPathWithin(child,parent){let relative=path.relative(parent,child);return relative===``||!relative.startsWith(`..`)&&!path.isAbsolute(relative)}function isUnsafeRemovalTarget(target){if(!target.trim())return!0;let resolved=path.resolve(target);if(resolved===path.parse(resolved).root)return!0;let home=resolveHomeDir();return!!(home&&resolved===path.resolve(home))}async function removePath(target,runtime,opts){if(!target?.trim())return{ok:!1,skipped:!0};let resolved=path.resolve(target),displayLabel=shortenHomeInString(opts?.label??resolved);if(isUnsafeRemovalTarget(resolved))return runtime.error(`Refusing to remove unsafe path: ${displayLabel}`),{ok:!1};if(opts?.dryRun)return runtime.log(`[dry-run] remove ${displayLabel}`),{ok:!0,skipped:!0};try{return await fs$1.rm(resolved,{recursive:!0,force:!0}),runtime.log(`Removed ${displayLabel}`),{ok:!0}}catch(err){return runtime.error(`Failed to remove ${displayLabel}: ${String(err)}`),{ok:!1}}}async function listAgentSessionDirs(stateDir){let root=path.join(stateDir,`agents`);try{return(await fs$1.readdir(root,{withFileTypes:!0})).filter(entry=>entry.isDirectory()).map(entry=>path.join(root,entry.name,`sessions`))}catch{return[]}}function resolveCleanupPlanFromDisk(){let cfg=loadConfig(),stateDir=resolveStateDir(),configPath=resolveConfigPath(),oauthDir=resolveOAuthDir();return{cfg,stateDir,configPath,oauthDir,...buildCleanupPlan({cfg,stateDir,configPath,oauthDir})}}async function stopGatewayIfRunning(runtime){if(isNixMode)return;let service=resolveGatewayService(),loaded=!1;try{loaded=await service.isLoaded({env:process.env})}catch(err){runtime.error(`Gateway service check failed: ${String(err)}`);return}if(loaded)try{await service.stop({env:process.env,stdout:process.stdout})}catch(err){runtime.error(`Gateway stop failed: ${String(err)}`)}}async function resetCommand(runtime,opts){let interactive=!opts.nonInteractive;if(!interactive&&!opts.yes){runtime.error(`Non-interactive mode requires --yes.`),runtime.exit(1);return}let scope=opts.scope;if(!scope){if(!interactive){runtime.error(`Non-interactive mode requires --scope.`),runtime.exit(1);return}let selection=await selectStyled({message:`Reset scope`,options:[{value:`config`,label:`Config only`,hint:`builderforce.json`},{value:`config+creds+sessions`,label:`Config + credentials + sessions`,hint:`keeps workspace + auth profiles`},{value:`full`,label:`Full reset`,hint:`state dir + workspace`}],initialValue:`config+creds+sessions`});if(isCancel(selection)){cancel(stylePromptTitle(`Reset cancelled.`)??`Reset cancelled.`),runtime.exit(0);return}scope=selection}if(![`config`,`config+creds+sessions`,`full`].includes(scope)){runtime.error(`Invalid --scope. Expected "config", "config+creds+sessions", or "full".`),runtime.exit(1);return}if(interactive&&!opts.yes){let ok=await confirm({message:stylePromptMessage(`Proceed with ${scope} reset?`)});if(isCancel(ok)||!ok){cancel(stylePromptTitle(`Reset cancelled.`)??`Reset cancelled.`),runtime.exit(0);return}}let dryRun=!!opts.dryRun,{stateDir,configPath,oauthDir,configInsideState,oauthInsideState,workspaceDirs}=resolveCleanupPlanFromDisk();if(scope!==`config`&&(dryRun?runtime.log(`[dry-run] stop gateway service`):await stopGatewayIfRunning(runtime)),scope===`config`){await removePath(configPath,runtime,{dryRun,label:configPath});return}if(scope===`config+creds+sessions`){await removePath(configPath,runtime,{dryRun,label:configPath}),await removePath(oauthDir,runtime,{dryRun,label:oauthDir});let sessionDirs=await listAgentSessionDirs(stateDir);for(let dir of sessionDirs)await removePath(dir,runtime,{dryRun,label:dir});runtime.log(`Next: ${formatCliCommand(`builderforce onboard --install-daemon`)}`);return}if(scope===`full`){await removePath(stateDir,runtime,{dryRun,label:stateDir}),configInsideState||await removePath(configPath,runtime,{dryRun,label:configPath}),oauthInsideState||await removePath(oauthDir,runtime,{dryRun,label:oauthDir});for(let workspace of workspaceDirs)await removePath(workspace,runtime,{dryRun,label:workspace});runtime.log(`Next: ${formatCliCommand(`builderforce onboard --install-daemon`)}`);return}}const multiselectStyled=params=>multiselect({...params,message:stylePromptMessage(params.message),options:params.options.map(opt=>opt.hint===void 0?opt:{...opt,hint:stylePromptHint(opt.hint)})});function buildScopeSelection(opts){let hadExplicit=!!(opts.all||opts.service||opts.state||opts.workspace||opts.app),scopes=new Set;return(opts.all||opts.service)&&scopes.add(`service`),(opts.all||opts.state)&&scopes.add(`state`),(opts.all||opts.workspace)&&scopes.add(`workspace`),(opts.all||opts.app)&&scopes.add(`app`),{scopes,hadExplicit}}async function stopAndUninstallService(runtime){if(isNixMode)return runtime.error(`Nix mode detected; service uninstall is disabled.`),!1;let service=resolveGatewayService(),loaded=!1;try{loaded=await service.isLoaded({env:process.env})}catch(err){return runtime.error(`Gateway service check failed: ${String(err)}`),!1}if(!loaded)return runtime.log(`Gateway service ${service.notLoadedText}.`),!0;try{await service.stop({env:process.env,stdout:process.stdout})}catch(err){runtime.error(`Gateway stop failed: ${String(err)}`)}try{return await service.uninstall({env:process.env,stdout:process.stdout}),!0}catch(err){return runtime.error(`Gateway uninstall failed: ${String(err)}`),!1}}const MAC_APP_PATH=`/Applications/Builderforce.app`,LEGACY_MAC_APP_PATH=`/Applications/BuilderForceAgents.app`;async function removeMacApp(runtime,dryRun){process.platform===`darwin`&&(await removePath(MAC_APP_PATH,runtime,{dryRun,label:MAC_APP_PATH}),fs.existsSync(LEGACY_MAC_APP_PATH)&&await removePath(LEGACY_MAC_APP_PATH,runtime,{dryRun,label:LEGACY_MAC_APP_PATH}))}async function uninstallCommand(runtime,opts){let{scopes,hadExplicit}=buildScopeSelection(opts),interactive=!opts.nonInteractive;if(!interactive&&!opts.yes){runtime.error(`Non-interactive mode requires --yes.`),runtime.exit(1);return}if(!hadExplicit){if(!interactive){runtime.error(`Non-interactive mode requires explicit scopes (use --all).`),runtime.exit(1);return}let selection=await multiselectStyled({message:`Uninstall which components?`,options:[{value:`service`,label:`Gateway service`,hint:`launchd / systemd / schtasks`},{value:`state`,label:`State + config`,hint:`~/.builderforce`},{value:`workspace`,label:`Workspace`,hint:`agent files`},{value:`app`,label:`macOS app`,hint:MAC_APP_PATH}],initialValues:[`service`,`state`,`workspace`]});if(isCancel(selection)){cancel(stylePromptTitle(`Uninstall cancelled.`)??`Uninstall cancelled.`),runtime.exit(0);return}for(let value of selection)scopes.add(value)}if(scopes.size===0){runtime.log(`Nothing selected.`);return}if(interactive&&!opts.yes){let ok=await confirm({message:stylePromptMessage(`Proceed with uninstall?`)});if(isCancel(ok)||!ok){cancel(stylePromptTitle(`Uninstall cancelled.`)??`Uninstall cancelled.`),runtime.exit(0);return}}let dryRun=!!opts.dryRun,{stateDir,configPath,oauthDir,configInsideState,oauthInsideState,workspaceDirs}=resolveCleanupPlanFromDisk();if(scopes.has(`service`)&&(dryRun?runtime.log(`[dry-run] remove gateway service`):await stopAndUninstallService(runtime)),scopes.has(`state`)&&(await removePath(stateDir,runtime,{dryRun,label:stateDir}),configInsideState||await removePath(configPath,runtime,{dryRun,label:configPath}),oauthInsideState||await removePath(oauthDir,runtime,{dryRun,label:oauthDir})),scopes.has(`workspace`))for(let workspace of workspaceDirs)await removePath(workspace,runtime,{dryRun,label:workspace});if(scopes.has(`app`)&&await removeMacApp(runtime,dryRun),runtime.log(`CLI still installed. Remove via npm/pnpm if desired.`),scopes.has(`state`)&&!scopes.has(`workspace`)){let home=resolveHomeDir();home&&workspaceDirs.some(dir=>dir.startsWith(path.resolve(home)))&&runtime.log(`Tip: workspaces were preserved. Re-run with --workspace to remove them.`)}}function registerMaintenanceCommands(program){program.command(`doctor`).description(`Health checks + quick fixes for the gateway and channels`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/doctor`,`docs.builderforce.ai/cli/doctor`)}\n`).option(`--no-workspace-suggestions`,`Disable workspace memory system suggestions`,!1).option(`--yes`,`Accept defaults without prompting`,!1).option(`--repair`,`Apply recommended repairs without prompting`,!1).option(`--fix`,`Apply recommended repairs (alias for --repair)`,!1).option(`--force`,`Apply aggressive repairs (overwrites custom service config)`,!1).option(`--non-interactive`,`Run without prompts (safe migrations only)`,!1).option(`--generate-gateway-token`,`Generate and configure a gateway token`,!1).option(`--deep`,`Scan system services for extra gateway installs`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await doctorCommand(defaultRuntime,{workspaceSuggestions:opts.workspaceSuggestions,yes:!!opts.yes,repair:!!opts.repair||!!opts.fix,force:!!opts.force,nonInteractive:!!opts.nonInteractive,generateGatewayToken:!!opts.generateGatewayToken,deep:!!opts.deep}),defaultRuntime.exit(0)})}),program.command(`dashboard`).description(`Open the Control UI with your current token`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/dashboard`,`docs.builderforce.ai/cli/dashboard`)}\n`).option(`--no-open`,`Print URL but do not launch a browser`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await dashboardCommand(defaultRuntime,{noOpen:!!opts.noOpen})})}),program.command(`reset`).description(`Reset local config/state (keeps the CLI installed)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/reset`,`docs.builderforce.ai/cli/reset`)}\n`).option(`--scope <scope>`,`config|config+creds+sessions|full (default: interactive prompt)`).option(`--yes`,`Skip confirmation prompts`,!1).option(`--non-interactive`,`Disable prompts (requires --scope + --yes)`,!1).option(`--dry-run`,`Print actions without removing files`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await resetCommand(defaultRuntime,{scope:opts.scope,yes:!!opts.yes,nonInteractive:!!opts.nonInteractive,dryRun:!!opts.dryRun})})}),program.command(`uninstall`).description(`Uninstall the gateway service + local data (CLI remains)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/uninstall`,`docs.builderforce.ai/cli/uninstall`)}\n`).option(`--service`,`Remove the gateway service`,!1).option(`--state`,`Remove state + config`,!1).option(`--workspace`,`Remove workspace dirs`,!1).option(`--app`,`Remove the macOS app`,!1).option(`--all`,`Remove service + state + workspace + app`,!1).option(`--yes`,`Skip confirmation prompts`,!1).option(`--non-interactive`,`Disable prompts (requires --yes)`,!1).option(`--dry-run`,`Print actions without removing files`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await uninstallCommand(defaultRuntime,{service:!!opts.service,state:!!opts.state,workspace:!!opts.workspace,app:!!opts.app,all:!!opts.all,yes:!!opts.yes,nonInteractive:!!opts.nonInteractive,dryRun:!!opts.dryRun})})}),program.command(`stop`).description(`Stop the running gateway service (launchd/systemd/schtasks)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/gateway`,`docs.builderforce.ai/cli/gateway`)}\n`).option(`--json`,`Output JSON`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await runDaemonStop({json:!!opts.json})})})}export{registerMaintenanceCommands};
1
+ import{g as resolveStateDir,i as isNixMode,m as resolveOAuthDir,o as resolveConfigPath,u as resolveGatewayPort}from"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{_ as resolveHomeDir,x as shortenHomeInString,y as resolveUserPath,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-C1VbcUOm.js";import{t as formatCliCommand}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{k as resolveDefaultAgentWorkspaceDir}from"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{a as readConfigFileSnapshot,r as loadConfig}from"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./model-discovery-C9Xm95uL.js";import"./model-catalog-CiiFJX77.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./skills-status-CGlKz1D1.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-DmAU4cRX.js";import"./message-channel-z5YRpR2d.js";import"./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{n as runCommandWithRuntime}from"./cli-utils-C9pW69LF.js";import"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DbkT_5BV.js";import{d as openUrl,g as resolveControlUiLinks,i as detectBrowserOpenSupport,o as formatControlUiSshHint}from"./onboard-helpers-CckrS8_K.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BMWmaqSC.js";import"./pairing-labels-3j_iRYOO.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-CV4nDcCk.js";import"./transformers-stream-Buj40qHl.js";import{t as copyToClipboard}from"./clipboard-BuWqKeWo.js";import"./catalog-li4bSIE2.js";import"./note-DgDXuE0F.js";import"./helpers-DPPVplyk.js";import"./plugin-auto-enable-BV9K9Vhr.js";import"./channels-status-issues-NLYb8w9i.js";import"./register.subclis-Cr9DoYcv.js";import"./command-registry-COUcUWby.js";import"./program-context-Wpc-6CdI.js";import"./completion-cli-DpFvU4Qn.js";import"./daemon-runtime-B4UjqdyJ.js";import"./runtime-guard-Bi8k55v9.js";import"./systemd-DdVd5Yet.js";import{t as resolveGatewayService}from"./service-EKJG69M3.js";import"./lifecycle-core-BpMvDXy1.js";import"./diagnostics-DamNPi4e.js";import{c as runDaemonStop}from"./daemon-cli-DyVsMf8p.js";import"./health-DVo8a9yg.js";import"./control-ui-assets-BxgWcomx.js";import"./update-check-B0YqSZJr.js";import"./dm-policy-shared-CRZpjRv0.js";import"./session-dirs-OxQuIvJW.js";import"./logging-ayt7F7vy.js";import"./systemd-linger-CPKngdUf.js";import"./health-format-D4MaIjaG.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-Dd5swW2b.js";import"./doctor-completion-BSotFS6p.js";import path from"node:path";import fs from"node:fs";import fs$1 from"node:fs/promises";import{cancel,confirm,isCancel,multiselect}from"@clack/prompts";async function dashboardCommand(runtime=defaultRuntime,options={}){let snapshot=await readConfigFileSnapshot(),cfg=snapshot.valid?snapshot.config:{},port=resolveGatewayPort(cfg),bind=cfg.gateway?.bind??`loopback`,basePath=cfg.gateway?.controlUi?.basePath,customBindHost=cfg.gateway?.customBindHost,token=cfg.gateway?.auth?.token??process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN??``,links=resolveControlUiLinks({port,bind:bind===`lan`?`loopback`:bind,customBindHost,basePath}),dashboardUrl=token?`${links.httpUrl}#token=${encodeURIComponent(token)}`:links.httpUrl;runtime.log(`Dashboard URL: ${dashboardUrl}`);let copied=await copyToClipboard(dashboardUrl).catch(()=>!1);runtime.log(copied?`Copied to clipboard.`:`Copy to clipboard unavailable.`);let opened=!1,hint;options.noOpen?hint=`Browser launch disabled (--no-open). Use the URL above.`:((await detectBrowserOpenSupport()).ok&&(opened=await openUrl(dashboardUrl)),opened||(hint=formatControlUiSshHint({port,basePath,token:token||void 0}))),opened?runtime.log(`Opened in your browser. Keep that tab to control BuilderForceAgents.`):hint&&runtime.log(hint)}function collectWorkspaceDirs(cfg){let dirs=new Set,defaults=cfg?.agents?.defaults;typeof defaults?.workspace==`string`&&defaults.workspace.trim()&&dirs.add(resolveUserPath(defaults.workspace));let list=Array.isArray(cfg?.agents?.list)?cfg?.agents?.list:[];for(let agent of list){let workspace=agent.workspace;typeof workspace==`string`&&workspace.trim()&&dirs.add(resolveUserPath(workspace))}return dirs.size===0&&dirs.add(resolveDefaultAgentWorkspaceDir()),[...dirs]}function buildCleanupPlan(params){return{configInsideState:isPathWithin(params.configPath,params.stateDir),oauthInsideState:isPathWithin(params.oauthDir,params.stateDir),workspaceDirs:collectWorkspaceDirs(params.cfg)}}function isPathWithin(child,parent){let relative=path.relative(parent,child);return relative===``||!relative.startsWith(`..`)&&!path.isAbsolute(relative)}function isUnsafeRemovalTarget(target){if(!target.trim())return!0;let resolved=path.resolve(target);if(resolved===path.parse(resolved).root)return!0;let home=resolveHomeDir();return!!(home&&resolved===path.resolve(home))}async function removePath(target,runtime,opts){if(!target?.trim())return{ok:!1,skipped:!0};let resolved=path.resolve(target),displayLabel=shortenHomeInString(opts?.label??resolved);if(isUnsafeRemovalTarget(resolved))return runtime.error(`Refusing to remove unsafe path: ${displayLabel}`),{ok:!1};if(opts?.dryRun)return runtime.log(`[dry-run] remove ${displayLabel}`),{ok:!0,skipped:!0};try{return await fs$1.rm(resolved,{recursive:!0,force:!0}),runtime.log(`Removed ${displayLabel}`),{ok:!0}}catch(err){return runtime.error(`Failed to remove ${displayLabel}: ${String(err)}`),{ok:!1}}}async function listAgentSessionDirs(stateDir){let root=path.join(stateDir,`agents`);try{return(await fs$1.readdir(root,{withFileTypes:!0})).filter(entry=>entry.isDirectory()).map(entry=>path.join(root,entry.name,`sessions`))}catch{return[]}}function resolveCleanupPlanFromDisk(){let cfg=loadConfig(),stateDir=resolveStateDir(),configPath=resolveConfigPath(),oauthDir=resolveOAuthDir();return{cfg,stateDir,configPath,oauthDir,...buildCleanupPlan({cfg,stateDir,configPath,oauthDir})}}async function stopGatewayIfRunning(runtime){if(isNixMode)return;let service=resolveGatewayService(),loaded=!1;try{loaded=await service.isLoaded({env:process.env})}catch(err){runtime.error(`Gateway service check failed: ${String(err)}`);return}if(loaded)try{await service.stop({env:process.env,stdout:process.stdout})}catch(err){runtime.error(`Gateway stop failed: ${String(err)}`)}}async function resetCommand(runtime,opts){let interactive=!opts.nonInteractive;if(!interactive&&!opts.yes){runtime.error(`Non-interactive mode requires --yes.`),runtime.exit(1);return}let scope=opts.scope;if(!scope){if(!interactive){runtime.error(`Non-interactive mode requires --scope.`),runtime.exit(1);return}let selection=await selectStyled({message:`Reset scope`,options:[{value:`config`,label:`Config only`,hint:`builderforce.json`},{value:`config+creds+sessions`,label:`Config + credentials + sessions`,hint:`keeps workspace + auth profiles`},{value:`full`,label:`Full reset`,hint:`state dir + workspace`}],initialValue:`config+creds+sessions`});if(isCancel(selection)){cancel(stylePromptTitle(`Reset cancelled.`)??`Reset cancelled.`),runtime.exit(0);return}scope=selection}if(![`config`,`config+creds+sessions`,`full`].includes(scope)){runtime.error(`Invalid --scope. Expected "config", "config+creds+sessions", or "full".`),runtime.exit(1);return}if(interactive&&!opts.yes){let ok=await confirm({message:stylePromptMessage(`Proceed with ${scope} reset?`)});if(isCancel(ok)||!ok){cancel(stylePromptTitle(`Reset cancelled.`)??`Reset cancelled.`),runtime.exit(0);return}}let dryRun=!!opts.dryRun,{stateDir,configPath,oauthDir,configInsideState,oauthInsideState,workspaceDirs}=resolveCleanupPlanFromDisk();if(scope!==`config`&&(dryRun?runtime.log(`[dry-run] stop gateway service`):await stopGatewayIfRunning(runtime)),scope===`config`){await removePath(configPath,runtime,{dryRun,label:configPath});return}if(scope===`config+creds+sessions`){await removePath(configPath,runtime,{dryRun,label:configPath}),await removePath(oauthDir,runtime,{dryRun,label:oauthDir});let sessionDirs=await listAgentSessionDirs(stateDir);for(let dir of sessionDirs)await removePath(dir,runtime,{dryRun,label:dir});runtime.log(`Next: ${formatCliCommand(`builderforce onboard --install-daemon`)}`);return}if(scope===`full`){await removePath(stateDir,runtime,{dryRun,label:stateDir}),configInsideState||await removePath(configPath,runtime,{dryRun,label:configPath}),oauthInsideState||await removePath(oauthDir,runtime,{dryRun,label:oauthDir});for(let workspace of workspaceDirs)await removePath(workspace,runtime,{dryRun,label:workspace});runtime.log(`Next: ${formatCliCommand(`builderforce onboard --install-daemon`)}`);return}}const multiselectStyled=params=>multiselect({...params,message:stylePromptMessage(params.message),options:params.options.map(opt=>opt.hint===void 0?opt:{...opt,hint:stylePromptHint(opt.hint)})});function buildScopeSelection(opts){let hadExplicit=!!(opts.all||opts.service||opts.state||opts.workspace||opts.app),scopes=new Set;return(opts.all||opts.service)&&scopes.add(`service`),(opts.all||opts.state)&&scopes.add(`state`),(opts.all||opts.workspace)&&scopes.add(`workspace`),(opts.all||opts.app)&&scopes.add(`app`),{scopes,hadExplicit}}async function stopAndUninstallService(runtime){if(isNixMode)return runtime.error(`Nix mode detected; service uninstall is disabled.`),!1;let service=resolveGatewayService(),loaded=!1;try{loaded=await service.isLoaded({env:process.env})}catch(err){return runtime.error(`Gateway service check failed: ${String(err)}`),!1}if(!loaded)return runtime.log(`Gateway service ${service.notLoadedText}.`),!0;try{await service.stop({env:process.env,stdout:process.stdout})}catch(err){runtime.error(`Gateway stop failed: ${String(err)}`)}try{return await service.uninstall({env:process.env,stdout:process.stdout}),!0}catch(err){return runtime.error(`Gateway uninstall failed: ${String(err)}`),!1}}const MAC_APP_PATH=`/Applications/Builderforce.app`,LEGACY_MAC_APP_PATH=`/Applications/BuilderForceAgents.app`;async function removeMacApp(runtime,dryRun){process.platform===`darwin`&&(await removePath(MAC_APP_PATH,runtime,{dryRun,label:MAC_APP_PATH}),fs.existsSync(LEGACY_MAC_APP_PATH)&&await removePath(LEGACY_MAC_APP_PATH,runtime,{dryRun,label:LEGACY_MAC_APP_PATH}))}async function uninstallCommand(runtime,opts){let{scopes,hadExplicit}=buildScopeSelection(opts),interactive=!opts.nonInteractive;if(!interactive&&!opts.yes){runtime.error(`Non-interactive mode requires --yes.`),runtime.exit(1);return}if(!hadExplicit){if(!interactive){runtime.error(`Non-interactive mode requires explicit scopes (use --all).`),runtime.exit(1);return}let selection=await multiselectStyled({message:`Uninstall which components?`,options:[{value:`service`,label:`Gateway service`,hint:`launchd / systemd / schtasks`},{value:`state`,label:`State + config`,hint:`~/.builderforce`},{value:`workspace`,label:`Workspace`,hint:`agent files`},{value:`app`,label:`macOS app`,hint:MAC_APP_PATH}],initialValues:[`service`,`state`,`workspace`]});if(isCancel(selection)){cancel(stylePromptTitle(`Uninstall cancelled.`)??`Uninstall cancelled.`),runtime.exit(0);return}for(let value of selection)scopes.add(value)}if(scopes.size===0){runtime.log(`Nothing selected.`);return}if(interactive&&!opts.yes){let ok=await confirm({message:stylePromptMessage(`Proceed with uninstall?`)});if(isCancel(ok)||!ok){cancel(stylePromptTitle(`Uninstall cancelled.`)??`Uninstall cancelled.`),runtime.exit(0);return}}let dryRun=!!opts.dryRun,{stateDir,configPath,oauthDir,configInsideState,oauthInsideState,workspaceDirs}=resolveCleanupPlanFromDisk();if(scopes.has(`service`)&&(dryRun?runtime.log(`[dry-run] remove gateway service`):await stopAndUninstallService(runtime)),scopes.has(`state`)&&(await removePath(stateDir,runtime,{dryRun,label:stateDir}),configInsideState||await removePath(configPath,runtime,{dryRun,label:configPath}),oauthInsideState||await removePath(oauthDir,runtime,{dryRun,label:oauthDir})),scopes.has(`workspace`))for(let workspace of workspaceDirs)await removePath(workspace,runtime,{dryRun,label:workspace});if(scopes.has(`app`)&&await removeMacApp(runtime,dryRun),runtime.log(`CLI still installed. Remove via npm/pnpm if desired.`),scopes.has(`state`)&&!scopes.has(`workspace`)){let home=resolveHomeDir();home&&workspaceDirs.some(dir=>dir.startsWith(path.resolve(home)))&&runtime.log(`Tip: workspaces were preserved. Re-run with --workspace to remove them.`)}}function registerMaintenanceCommands(program){program.command(`doctor`).description(`Health checks + quick fixes for the gateway and channels`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/doctor`,`docs.builderforce.ai/cli/doctor`)}\n`).option(`--no-workspace-suggestions`,`Disable workspace memory system suggestions`,!1).option(`--yes`,`Accept defaults without prompting`,!1).option(`--repair`,`Apply recommended repairs without prompting`,!1).option(`--fix`,`Apply recommended repairs (alias for --repair)`,!1).option(`--force`,`Apply aggressive repairs (overwrites custom service config)`,!1).option(`--non-interactive`,`Run without prompts (safe migrations only)`,!1).option(`--generate-gateway-token`,`Generate and configure a gateway token`,!1).option(`--deep`,`Scan system services for extra gateway installs`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await doctorCommand(defaultRuntime,{workspaceSuggestions:opts.workspaceSuggestions,yes:!!opts.yes,repair:!!opts.repair||!!opts.fix,force:!!opts.force,nonInteractive:!!opts.nonInteractive,generateGatewayToken:!!opts.generateGatewayToken,deep:!!opts.deep}),defaultRuntime.exit(0)})}),program.command(`dashboard`).description(`Open the Control UI with your current token`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/dashboard`,`docs.builderforce.ai/cli/dashboard`)}\n`).option(`--no-open`,`Print URL but do not launch a browser`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await dashboardCommand(defaultRuntime,{noOpen:!!opts.noOpen})})}),program.command(`reset`).description(`Reset local config/state (keeps the CLI installed)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/reset`,`docs.builderforce.ai/cli/reset`)}\n`).option(`--scope <scope>`,`config|config+creds+sessions|full (default: interactive prompt)`).option(`--yes`,`Skip confirmation prompts`,!1).option(`--non-interactive`,`Disable prompts (requires --scope + --yes)`,!1).option(`--dry-run`,`Print actions without removing files`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await resetCommand(defaultRuntime,{scope:opts.scope,yes:!!opts.yes,nonInteractive:!!opts.nonInteractive,dryRun:!!opts.dryRun})})}),program.command(`uninstall`).description(`Uninstall the gateway service + local data (CLI remains)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/uninstall`,`docs.builderforce.ai/cli/uninstall`)}\n`).option(`--service`,`Remove the gateway service`,!1).option(`--state`,`Remove state + config`,!1).option(`--workspace`,`Remove workspace dirs`,!1).option(`--app`,`Remove the macOS app`,!1).option(`--all`,`Remove service + state + workspace + app`,!1).option(`--yes`,`Skip confirmation prompts`,!1).option(`--non-interactive`,`Disable prompts (requires --yes)`,!1).option(`--dry-run`,`Print actions without removing files`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await uninstallCommand(defaultRuntime,{service:!!opts.service,state:!!opts.state,workspace:!!opts.workspace,app:!!opts.app,all:!!opts.all,yes:!!opts.yes,nonInteractive:!!opts.nonInteractive,dryRun:!!opts.dryRun})})}),program.command(`stop`).description(`Stop the running gateway service (launchd/systemd/schtasks)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/gateway`,`docs.builderforce.ai/cli/gateway`)}\n`).option(`--json`,`Output JSON`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await runDaemonStop({json:!!opts.json})})})}export{registerMaintenanceCommands};
@@ -1 +1 @@
1
- import{g as resolveStateDir,i as isNixMode,m as resolveOAuthDir,o as resolveConfigPath,u as resolveGatewayPort}from"./paths-5FcIFMsj.js";import{B as theme,S as shortenHomeInString,b as resolveUserPath,v as resolveHomeDir}from"./utils-DbaBVFaK.js";import"./embedded-helpers-CEsr3aQ0.js";import"./reply-Cd3vVnD7.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import{k as resolveDefaultAgentWorkspaceDir}from"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import{a as readConfigFileSnapshot,r as loadConfig}from"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./runner-SxCr9kXD.js";import"./model-catalog-C6UrZ0uG.js";import"./sandbox-BZibn6PX.js";import"./chrome-a3X9_-nf.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DJZT7Upf.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-BzfLvF8W.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-CdanN_ZI.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-DerUBvXW.js";import"./send-DyF1Xy9K.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-CHBjUwUJ.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-wcq7lXuI.js";import"./with-timeout-Bwq-GyUQ.js";import"./deliver-BpLm3ktn.js";import"./send-CBBziNqM.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import"./memory-cli-DRz4wtHk.js";import"./manager-DwywI_5-.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-BbRf8gFM.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-DrFJ638L.js";import"./send-4d9NswaD.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-CbvMJhD3.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import{n as runCommandWithRuntime}from"./cli-utils-LBYKdNFb.js";import"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import"./resolve-route-D49haUnv.js";import"./replies-Bd2RPZwQ.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-6qh9acJy.js";import"./send-BJDzwYJN.js";import{d as openUrl,g as resolveControlUiLinks,i as detectBrowserOpenSupport,o as formatControlUiSshHint}from"./onboard-helpers-Cf5dNq7-.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BpVK43GK.js";import"./pairing-labels-BW5jQZlr.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-BdrU4cIE.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-CJj0Inz-.js";import"./control-service-BbsswoMy.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-CoGqoBTH.js";import"./transformers-stream-D7nRu4Qu.js";import"./runtime-guard-DhksRHci.js";import"./program-context-7XUznN5J.js";import"./catalog-rgiY__UQ.js";import"./skills-status-vWC0PU8J.js";import{t as copyToClipboard}from"./clipboard-CGHe68at.js";import"./note-B6NtFdXt.js";import"./helpers-DTDCy17p.js";import"./plugin-auto-enable-DDry2fA6.js";import"./channels-status-issues-BlOu0Ul_.js";import"./completion-cli-CBES884A.js";import"./daemon-runtime-CtOr1ncS.js";import"./systemd-BG3_QT6W.js";import{t as resolveGatewayService}from"./service-D-NLDyK3.js";import"./lifecycle-core-Dwb4gHjZ.js";import"./diagnostics-DCjg0nBH.js";import{c as runDaemonStop}from"./daemon-cli-DlwOVDbt.js";import"./health-yS3NRKvY.js";import"./control-ui-assets-CWgH1Tda.js";import"./update-check-D6MvqVFE.js";import"./dm-policy-shared-Dhw9_6mi.js";import"./session-dirs-D_ARkyw0.js";import"./logging-DHa3jQN3.js";import"./systemd-linger-CT-VHPB3.js";import"./health-format-iE_KYEwP.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-Cy70lEMU.js";import"./doctor-completion-Bv2ztEeW.js";import fs from"node:fs";import path from"node:path";import fs$1 from"node:fs/promises";import{cancel,confirm,isCancel,multiselect}from"@clack/prompts";async function dashboardCommand(runtime=defaultRuntime,options={}){let snapshot=await readConfigFileSnapshot(),cfg=snapshot.valid?snapshot.config:{},port=resolveGatewayPort(cfg),bind=cfg.gateway?.bind??`loopback`,basePath=cfg.gateway?.controlUi?.basePath,customBindHost=cfg.gateway?.customBindHost,token=cfg.gateway?.auth?.token??process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN??``,links=resolveControlUiLinks({port,bind:bind===`lan`?`loopback`:bind,customBindHost,basePath}),dashboardUrl=token?`${links.httpUrl}#token=${encodeURIComponent(token)}`:links.httpUrl;runtime.log(`Dashboard URL: ${dashboardUrl}`);let copied=await copyToClipboard(dashboardUrl).catch(()=>!1);runtime.log(copied?`Copied to clipboard.`:`Copy to clipboard unavailable.`);let opened=!1,hint;options.noOpen?hint=`Browser launch disabled (--no-open). Use the URL above.`:((await detectBrowserOpenSupport()).ok&&(opened=await openUrl(dashboardUrl)),opened||(hint=formatControlUiSshHint({port,basePath,token:token||void 0}))),opened?runtime.log(`Opened in your browser. Keep that tab to control BuilderForceAgents.`):hint&&runtime.log(hint)}function collectWorkspaceDirs(cfg){let dirs=new Set,defaults=cfg?.agents?.defaults;typeof defaults?.workspace==`string`&&defaults.workspace.trim()&&dirs.add(resolveUserPath(defaults.workspace));let list=Array.isArray(cfg?.agents?.list)?cfg?.agents?.list:[];for(let agent of list){let workspace=agent.workspace;typeof workspace==`string`&&workspace.trim()&&dirs.add(resolveUserPath(workspace))}return dirs.size===0&&dirs.add(resolveDefaultAgentWorkspaceDir()),[...dirs]}function buildCleanupPlan(params){return{configInsideState:isPathWithin(params.configPath,params.stateDir),oauthInsideState:isPathWithin(params.oauthDir,params.stateDir),workspaceDirs:collectWorkspaceDirs(params.cfg)}}function isPathWithin(child,parent){let relative=path.relative(parent,child);return relative===``||!relative.startsWith(`..`)&&!path.isAbsolute(relative)}function isUnsafeRemovalTarget(target){if(!target.trim())return!0;let resolved=path.resolve(target);if(resolved===path.parse(resolved).root)return!0;let home=resolveHomeDir();return!!(home&&resolved===path.resolve(home))}async function removePath(target,runtime,opts){if(!target?.trim())return{ok:!1,skipped:!0};let resolved=path.resolve(target),displayLabel=shortenHomeInString(opts?.label??resolved);if(isUnsafeRemovalTarget(resolved))return runtime.error(`Refusing to remove unsafe path: ${displayLabel}`),{ok:!1};if(opts?.dryRun)return runtime.log(`[dry-run] remove ${displayLabel}`),{ok:!0,skipped:!0};try{return await fs$1.rm(resolved,{recursive:!0,force:!0}),runtime.log(`Removed ${displayLabel}`),{ok:!0}}catch(err){return runtime.error(`Failed to remove ${displayLabel}: ${String(err)}`),{ok:!1}}}async function listAgentSessionDirs(stateDir){let root=path.join(stateDir,`agents`);try{return(await fs$1.readdir(root,{withFileTypes:!0})).filter(entry=>entry.isDirectory()).map(entry=>path.join(root,entry.name,`sessions`))}catch{return[]}}function resolveCleanupPlanFromDisk(){let cfg=loadConfig(),stateDir=resolveStateDir(),configPath=resolveConfigPath(),oauthDir=resolveOAuthDir();return{cfg,stateDir,configPath,oauthDir,...buildCleanupPlan({cfg,stateDir,configPath,oauthDir})}}async function stopGatewayIfRunning(runtime){if(isNixMode)return;let service=resolveGatewayService(),loaded=!1;try{loaded=await service.isLoaded({env:process.env})}catch(err){runtime.error(`Gateway service check failed: ${String(err)}`);return}if(loaded)try{await service.stop({env:process.env,stdout:process.stdout})}catch(err){runtime.error(`Gateway stop failed: ${String(err)}`)}}async function resetCommand(runtime,opts){let interactive=!opts.nonInteractive;if(!interactive&&!opts.yes){runtime.error(`Non-interactive mode requires --yes.`),runtime.exit(1);return}let scope=opts.scope;if(!scope){if(!interactive){runtime.error(`Non-interactive mode requires --scope.`),runtime.exit(1);return}let selection=await selectStyled({message:`Reset scope`,options:[{value:`config`,label:`Config only`,hint:`builderforce.json`},{value:`config+creds+sessions`,label:`Config + credentials + sessions`,hint:`keeps workspace + auth profiles`},{value:`full`,label:`Full reset`,hint:`state dir + workspace`}],initialValue:`config+creds+sessions`});if(isCancel(selection)){cancel(stylePromptTitle(`Reset cancelled.`)??`Reset cancelled.`),runtime.exit(0);return}scope=selection}if(![`config`,`config+creds+sessions`,`full`].includes(scope)){runtime.error(`Invalid --scope. Expected "config", "config+creds+sessions", or "full".`),runtime.exit(1);return}if(interactive&&!opts.yes){let ok=await confirm({message:stylePromptMessage(`Proceed with ${scope} reset?`)});if(isCancel(ok)||!ok){cancel(stylePromptTitle(`Reset cancelled.`)??`Reset cancelled.`),runtime.exit(0);return}}let dryRun=!!opts.dryRun,{stateDir,configPath,oauthDir,configInsideState,oauthInsideState,workspaceDirs}=resolveCleanupPlanFromDisk();if(scope!==`config`&&(dryRun?runtime.log(`[dry-run] stop gateway service`):await stopGatewayIfRunning(runtime)),scope===`config`){await removePath(configPath,runtime,{dryRun,label:configPath});return}if(scope===`config+creds+sessions`){await removePath(configPath,runtime,{dryRun,label:configPath}),await removePath(oauthDir,runtime,{dryRun,label:oauthDir});let sessionDirs=await listAgentSessionDirs(stateDir);for(let dir of sessionDirs)await removePath(dir,runtime,{dryRun,label:dir});runtime.log(`Next: ${formatCliCommand(`builderforce onboard --install-daemon`)}`);return}if(scope===`full`){await removePath(stateDir,runtime,{dryRun,label:stateDir}),configInsideState||await removePath(configPath,runtime,{dryRun,label:configPath}),oauthInsideState||await removePath(oauthDir,runtime,{dryRun,label:oauthDir});for(let workspace of workspaceDirs)await removePath(workspace,runtime,{dryRun,label:workspace});runtime.log(`Next: ${formatCliCommand(`builderforce onboard --install-daemon`)}`);return}}const multiselectStyled=params=>multiselect({...params,message:stylePromptMessage(params.message),options:params.options.map(opt=>opt.hint===void 0?opt:{...opt,hint:stylePromptHint(opt.hint)})});function buildScopeSelection(opts){let hadExplicit=!!(opts.all||opts.service||opts.state||opts.workspace||opts.app),scopes=new Set;return(opts.all||opts.service)&&scopes.add(`service`),(opts.all||opts.state)&&scopes.add(`state`),(opts.all||opts.workspace)&&scopes.add(`workspace`),(opts.all||opts.app)&&scopes.add(`app`),{scopes,hadExplicit}}async function stopAndUninstallService(runtime){if(isNixMode)return runtime.error(`Nix mode detected; service uninstall is disabled.`),!1;let service=resolveGatewayService(),loaded=!1;try{loaded=await service.isLoaded({env:process.env})}catch(err){return runtime.error(`Gateway service check failed: ${String(err)}`),!1}if(!loaded)return runtime.log(`Gateway service ${service.notLoadedText}.`),!0;try{await service.stop({env:process.env,stdout:process.stdout})}catch(err){runtime.error(`Gateway stop failed: ${String(err)}`)}try{return await service.uninstall({env:process.env,stdout:process.stdout}),!0}catch(err){return runtime.error(`Gateway uninstall failed: ${String(err)}`),!1}}const MAC_APP_PATH=`/Applications/Builderforce.app`,LEGACY_MAC_APP_PATH=`/Applications/BuilderForceAgents.app`;async function removeMacApp(runtime,dryRun){process.platform===`darwin`&&(await removePath(MAC_APP_PATH,runtime,{dryRun,label:MAC_APP_PATH}),fs.existsSync(LEGACY_MAC_APP_PATH)&&await removePath(LEGACY_MAC_APP_PATH,runtime,{dryRun,label:LEGACY_MAC_APP_PATH}))}async function uninstallCommand(runtime,opts){let{scopes,hadExplicit}=buildScopeSelection(opts),interactive=!opts.nonInteractive;if(!interactive&&!opts.yes){runtime.error(`Non-interactive mode requires --yes.`),runtime.exit(1);return}if(!hadExplicit){if(!interactive){runtime.error(`Non-interactive mode requires explicit scopes (use --all).`),runtime.exit(1);return}let selection=await multiselectStyled({message:`Uninstall which components?`,options:[{value:`service`,label:`Gateway service`,hint:`launchd / systemd / schtasks`},{value:`state`,label:`State + config`,hint:`~/.builderforce`},{value:`workspace`,label:`Workspace`,hint:`agent files`},{value:`app`,label:`macOS app`,hint:MAC_APP_PATH}],initialValues:[`service`,`state`,`workspace`]});if(isCancel(selection)){cancel(stylePromptTitle(`Uninstall cancelled.`)??`Uninstall cancelled.`),runtime.exit(0);return}for(let value of selection)scopes.add(value)}if(scopes.size===0){runtime.log(`Nothing selected.`);return}if(interactive&&!opts.yes){let ok=await confirm({message:stylePromptMessage(`Proceed with uninstall?`)});if(isCancel(ok)||!ok){cancel(stylePromptTitle(`Uninstall cancelled.`)??`Uninstall cancelled.`),runtime.exit(0);return}}let dryRun=!!opts.dryRun,{stateDir,configPath,oauthDir,configInsideState,oauthInsideState,workspaceDirs}=resolveCleanupPlanFromDisk();if(scopes.has(`service`)&&(dryRun?runtime.log(`[dry-run] remove gateway service`):await stopAndUninstallService(runtime)),scopes.has(`state`)&&(await removePath(stateDir,runtime,{dryRun,label:stateDir}),configInsideState||await removePath(configPath,runtime,{dryRun,label:configPath}),oauthInsideState||await removePath(oauthDir,runtime,{dryRun,label:oauthDir})),scopes.has(`workspace`))for(let workspace of workspaceDirs)await removePath(workspace,runtime,{dryRun,label:workspace});if(scopes.has(`app`)&&await removeMacApp(runtime,dryRun),runtime.log(`CLI still installed. Remove via npm/pnpm if desired.`),scopes.has(`state`)&&!scopes.has(`workspace`)){let home=resolveHomeDir();home&&workspaceDirs.some(dir=>dir.startsWith(path.resolve(home)))&&runtime.log(`Tip: workspaces were preserved. Re-run with --workspace to remove them.`)}}function registerMaintenanceCommands(program){program.command(`doctor`).description(`Health checks + quick fixes for the gateway and channels`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/doctor`,`docs.builderforce.ai/cli/doctor`)}\n`).option(`--no-workspace-suggestions`,`Disable workspace memory system suggestions`,!1).option(`--yes`,`Accept defaults without prompting`,!1).option(`--repair`,`Apply recommended repairs without prompting`,!1).option(`--fix`,`Apply recommended repairs (alias for --repair)`,!1).option(`--force`,`Apply aggressive repairs (overwrites custom service config)`,!1).option(`--non-interactive`,`Run without prompts (safe migrations only)`,!1).option(`--generate-gateway-token`,`Generate and configure a gateway token`,!1).option(`--deep`,`Scan system services for extra gateway installs`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await doctorCommand(defaultRuntime,{workspaceSuggestions:opts.workspaceSuggestions,yes:!!opts.yes,repair:!!opts.repair||!!opts.fix,force:!!opts.force,nonInteractive:!!opts.nonInteractive,generateGatewayToken:!!opts.generateGatewayToken,deep:!!opts.deep}),defaultRuntime.exit(0)})}),program.command(`dashboard`).description(`Open the Control UI with your current token`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/dashboard`,`docs.builderforce.ai/cli/dashboard`)}\n`).option(`--no-open`,`Print URL but do not launch a browser`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await dashboardCommand(defaultRuntime,{noOpen:!!opts.noOpen})})}),program.command(`reset`).description(`Reset local config/state (keeps the CLI installed)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/reset`,`docs.builderforce.ai/cli/reset`)}\n`).option(`--scope <scope>`,`config|config+creds+sessions|full (default: interactive prompt)`).option(`--yes`,`Skip confirmation prompts`,!1).option(`--non-interactive`,`Disable prompts (requires --scope + --yes)`,!1).option(`--dry-run`,`Print actions without removing files`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await resetCommand(defaultRuntime,{scope:opts.scope,yes:!!opts.yes,nonInteractive:!!opts.nonInteractive,dryRun:!!opts.dryRun})})}),program.command(`uninstall`).description(`Uninstall the gateway service + local data (CLI remains)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/uninstall`,`docs.builderforce.ai/cli/uninstall`)}\n`).option(`--service`,`Remove the gateway service`,!1).option(`--state`,`Remove state + config`,!1).option(`--workspace`,`Remove workspace dirs`,!1).option(`--app`,`Remove the macOS app`,!1).option(`--all`,`Remove service + state + workspace + app`,!1).option(`--yes`,`Skip confirmation prompts`,!1).option(`--non-interactive`,`Disable prompts (requires --yes)`,!1).option(`--dry-run`,`Print actions without removing files`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await uninstallCommand(defaultRuntime,{service:!!opts.service,state:!!opts.state,workspace:!!opts.workspace,app:!!opts.app,all:!!opts.all,yes:!!opts.yes,nonInteractive:!!opts.nonInteractive,dryRun:!!opts.dryRun})})}),program.command(`stop`).description(`Stop the running gateway service (launchd/systemd/schtasks)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/gateway`,`docs.builderforce.ai/cli/gateway`)}\n`).option(`--json`,`Output JSON`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await runDaemonStop({json:!!opts.json})})})}export{registerMaintenanceCommands};
1
+ import{g as resolveStateDir,i as isNixMode,m as resolveOAuthDir,o as resolveConfigPath,u as resolveGatewayPort}from"./paths-5FcIFMsj.js";import{B as theme,S as shortenHomeInString,b as resolveUserPath,v as resolveHomeDir}from"./utils-DbaBVFaK.js";import"./embedded-helpers-CEsr3aQ0.js";import"./reply-Cd3vVnD7.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import{k as resolveDefaultAgentWorkspaceDir}from"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import{a as readConfigFileSnapshot,r as loadConfig}from"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./runner-SxCr9kXD.js";import"./model-catalog-C6UrZ0uG.js";import"./sandbox-BZibn6PX.js";import"./chrome-a3X9_-nf.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DJZT7Upf.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-BzfLvF8W.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-CdanN_ZI.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-DerUBvXW.js";import"./send-DyF1Xy9K.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-CHBjUwUJ.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-wcq7lXuI.js";import"./with-timeout-Bwq-GyUQ.js";import"./deliver-BpLm3ktn.js";import"./send-CBBziNqM.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import"./memory-cli-DRz4wtHk.js";import"./manager-DwywI_5-.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-BbRf8gFM.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-DrFJ638L.js";import"./send-4d9NswaD.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-CbvMJhD3.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import{n as runCommandWithRuntime}from"./cli-utils-LBYKdNFb.js";import"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import"./resolve-route-D49haUnv.js";import"./replies-Bd2RPZwQ.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-6qh9acJy.js";import"./send-BJDzwYJN.js";import{d as openUrl,g as resolveControlUiLinks,i as detectBrowserOpenSupport,o as formatControlUiSshHint}from"./onboard-helpers-Cf5dNq7-.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BpVK43GK.js";import"./pairing-labels-BW5jQZlr.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-BdrU4cIE.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-CJj0Inz-.js";import"./control-service-BbsswoMy.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-CoGqoBTH.js";import"./transformers-stream-D7nRu4Qu.js";import"./runtime-guard-DhksRHci.js";import"./program-context-BCwL3wlM.js";import"./catalog-rgiY__UQ.js";import"./skills-status-vWC0PU8J.js";import{t as copyToClipboard}from"./clipboard-CGHe68at.js";import"./note-B6NtFdXt.js";import"./helpers-DTDCy17p.js";import"./plugin-auto-enable-DDry2fA6.js";import"./channels-status-issues-BlOu0Ul_.js";import"./completion-cli-B2qcVd6q.js";import"./daemon-runtime-CtOr1ncS.js";import"./systemd-BG3_QT6W.js";import{t as resolveGatewayService}from"./service-D-NLDyK3.js";import"./lifecycle-core-Dwb4gHjZ.js";import"./diagnostics-DCjg0nBH.js";import{c as runDaemonStop}from"./daemon-cli-DlwOVDbt.js";import"./health-yS3NRKvY.js";import"./control-ui-assets-CWgH1Tda.js";import"./update-check-D6MvqVFE.js";import"./dm-policy-shared-Dhw9_6mi.js";import"./session-dirs-D_ARkyw0.js";import"./logging-DHa3jQN3.js";import"./systemd-linger-CT-VHPB3.js";import"./health-format-iE_KYEwP.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-hB_nLOn1.js";import"./doctor-completion-DVxbs-74.js";import fs from"node:fs";import path from"node:path";import fs$1 from"node:fs/promises";import{cancel,confirm,isCancel,multiselect}from"@clack/prompts";async function dashboardCommand(runtime=defaultRuntime,options={}){let snapshot=await readConfigFileSnapshot(),cfg=snapshot.valid?snapshot.config:{},port=resolveGatewayPort(cfg),bind=cfg.gateway?.bind??`loopback`,basePath=cfg.gateway?.controlUi?.basePath,customBindHost=cfg.gateway?.customBindHost,token=cfg.gateway?.auth?.token??process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN??``,links=resolveControlUiLinks({port,bind:bind===`lan`?`loopback`:bind,customBindHost,basePath}),dashboardUrl=token?`${links.httpUrl}#token=${encodeURIComponent(token)}`:links.httpUrl;runtime.log(`Dashboard URL: ${dashboardUrl}`);let copied=await copyToClipboard(dashboardUrl).catch(()=>!1);runtime.log(copied?`Copied to clipboard.`:`Copy to clipboard unavailable.`);let opened=!1,hint;options.noOpen?hint=`Browser launch disabled (--no-open). Use the URL above.`:((await detectBrowserOpenSupport()).ok&&(opened=await openUrl(dashboardUrl)),opened||(hint=formatControlUiSshHint({port,basePath,token:token||void 0}))),opened?runtime.log(`Opened in your browser. Keep that tab to control BuilderForceAgents.`):hint&&runtime.log(hint)}function collectWorkspaceDirs(cfg){let dirs=new Set,defaults=cfg?.agents?.defaults;typeof defaults?.workspace==`string`&&defaults.workspace.trim()&&dirs.add(resolveUserPath(defaults.workspace));let list=Array.isArray(cfg?.agents?.list)?cfg?.agents?.list:[];for(let agent of list){let workspace=agent.workspace;typeof workspace==`string`&&workspace.trim()&&dirs.add(resolveUserPath(workspace))}return dirs.size===0&&dirs.add(resolveDefaultAgentWorkspaceDir()),[...dirs]}function buildCleanupPlan(params){return{configInsideState:isPathWithin(params.configPath,params.stateDir),oauthInsideState:isPathWithin(params.oauthDir,params.stateDir),workspaceDirs:collectWorkspaceDirs(params.cfg)}}function isPathWithin(child,parent){let relative=path.relative(parent,child);return relative===``||!relative.startsWith(`..`)&&!path.isAbsolute(relative)}function isUnsafeRemovalTarget(target){if(!target.trim())return!0;let resolved=path.resolve(target);if(resolved===path.parse(resolved).root)return!0;let home=resolveHomeDir();return!!(home&&resolved===path.resolve(home))}async function removePath(target,runtime,opts){if(!target?.trim())return{ok:!1,skipped:!0};let resolved=path.resolve(target),displayLabel=shortenHomeInString(opts?.label??resolved);if(isUnsafeRemovalTarget(resolved))return runtime.error(`Refusing to remove unsafe path: ${displayLabel}`),{ok:!1};if(opts?.dryRun)return runtime.log(`[dry-run] remove ${displayLabel}`),{ok:!0,skipped:!0};try{return await fs$1.rm(resolved,{recursive:!0,force:!0}),runtime.log(`Removed ${displayLabel}`),{ok:!0}}catch(err){return runtime.error(`Failed to remove ${displayLabel}: ${String(err)}`),{ok:!1}}}async function listAgentSessionDirs(stateDir){let root=path.join(stateDir,`agents`);try{return(await fs$1.readdir(root,{withFileTypes:!0})).filter(entry=>entry.isDirectory()).map(entry=>path.join(root,entry.name,`sessions`))}catch{return[]}}function resolveCleanupPlanFromDisk(){let cfg=loadConfig(),stateDir=resolveStateDir(),configPath=resolveConfigPath(),oauthDir=resolveOAuthDir();return{cfg,stateDir,configPath,oauthDir,...buildCleanupPlan({cfg,stateDir,configPath,oauthDir})}}async function stopGatewayIfRunning(runtime){if(isNixMode)return;let service=resolveGatewayService(),loaded=!1;try{loaded=await service.isLoaded({env:process.env})}catch(err){runtime.error(`Gateway service check failed: ${String(err)}`);return}if(loaded)try{await service.stop({env:process.env,stdout:process.stdout})}catch(err){runtime.error(`Gateway stop failed: ${String(err)}`)}}async function resetCommand(runtime,opts){let interactive=!opts.nonInteractive;if(!interactive&&!opts.yes){runtime.error(`Non-interactive mode requires --yes.`),runtime.exit(1);return}let scope=opts.scope;if(!scope){if(!interactive){runtime.error(`Non-interactive mode requires --scope.`),runtime.exit(1);return}let selection=await selectStyled({message:`Reset scope`,options:[{value:`config`,label:`Config only`,hint:`builderforce.json`},{value:`config+creds+sessions`,label:`Config + credentials + sessions`,hint:`keeps workspace + auth profiles`},{value:`full`,label:`Full reset`,hint:`state dir + workspace`}],initialValue:`config+creds+sessions`});if(isCancel(selection)){cancel(stylePromptTitle(`Reset cancelled.`)??`Reset cancelled.`),runtime.exit(0);return}scope=selection}if(![`config`,`config+creds+sessions`,`full`].includes(scope)){runtime.error(`Invalid --scope. Expected "config", "config+creds+sessions", or "full".`),runtime.exit(1);return}if(interactive&&!opts.yes){let ok=await confirm({message:stylePromptMessage(`Proceed with ${scope} reset?`)});if(isCancel(ok)||!ok){cancel(stylePromptTitle(`Reset cancelled.`)??`Reset cancelled.`),runtime.exit(0);return}}let dryRun=!!opts.dryRun,{stateDir,configPath,oauthDir,configInsideState,oauthInsideState,workspaceDirs}=resolveCleanupPlanFromDisk();if(scope!==`config`&&(dryRun?runtime.log(`[dry-run] stop gateway service`):await stopGatewayIfRunning(runtime)),scope===`config`){await removePath(configPath,runtime,{dryRun,label:configPath});return}if(scope===`config+creds+sessions`){await removePath(configPath,runtime,{dryRun,label:configPath}),await removePath(oauthDir,runtime,{dryRun,label:oauthDir});let sessionDirs=await listAgentSessionDirs(stateDir);for(let dir of sessionDirs)await removePath(dir,runtime,{dryRun,label:dir});runtime.log(`Next: ${formatCliCommand(`builderforce onboard --install-daemon`)}`);return}if(scope===`full`){await removePath(stateDir,runtime,{dryRun,label:stateDir}),configInsideState||await removePath(configPath,runtime,{dryRun,label:configPath}),oauthInsideState||await removePath(oauthDir,runtime,{dryRun,label:oauthDir});for(let workspace of workspaceDirs)await removePath(workspace,runtime,{dryRun,label:workspace});runtime.log(`Next: ${formatCliCommand(`builderforce onboard --install-daemon`)}`);return}}const multiselectStyled=params=>multiselect({...params,message:stylePromptMessage(params.message),options:params.options.map(opt=>opt.hint===void 0?opt:{...opt,hint:stylePromptHint(opt.hint)})});function buildScopeSelection(opts){let hadExplicit=!!(opts.all||opts.service||opts.state||opts.workspace||opts.app),scopes=new Set;return(opts.all||opts.service)&&scopes.add(`service`),(opts.all||opts.state)&&scopes.add(`state`),(opts.all||opts.workspace)&&scopes.add(`workspace`),(opts.all||opts.app)&&scopes.add(`app`),{scopes,hadExplicit}}async function stopAndUninstallService(runtime){if(isNixMode)return runtime.error(`Nix mode detected; service uninstall is disabled.`),!1;let service=resolveGatewayService(),loaded=!1;try{loaded=await service.isLoaded({env:process.env})}catch(err){return runtime.error(`Gateway service check failed: ${String(err)}`),!1}if(!loaded)return runtime.log(`Gateway service ${service.notLoadedText}.`),!0;try{await service.stop({env:process.env,stdout:process.stdout})}catch(err){runtime.error(`Gateway stop failed: ${String(err)}`)}try{return await service.uninstall({env:process.env,stdout:process.stdout}),!0}catch(err){return runtime.error(`Gateway uninstall failed: ${String(err)}`),!1}}const MAC_APP_PATH=`/Applications/Builderforce.app`,LEGACY_MAC_APP_PATH=`/Applications/BuilderForceAgents.app`;async function removeMacApp(runtime,dryRun){process.platform===`darwin`&&(await removePath(MAC_APP_PATH,runtime,{dryRun,label:MAC_APP_PATH}),fs.existsSync(LEGACY_MAC_APP_PATH)&&await removePath(LEGACY_MAC_APP_PATH,runtime,{dryRun,label:LEGACY_MAC_APP_PATH}))}async function uninstallCommand(runtime,opts){let{scopes,hadExplicit}=buildScopeSelection(opts),interactive=!opts.nonInteractive;if(!interactive&&!opts.yes){runtime.error(`Non-interactive mode requires --yes.`),runtime.exit(1);return}if(!hadExplicit){if(!interactive){runtime.error(`Non-interactive mode requires explicit scopes (use --all).`),runtime.exit(1);return}let selection=await multiselectStyled({message:`Uninstall which components?`,options:[{value:`service`,label:`Gateway service`,hint:`launchd / systemd / schtasks`},{value:`state`,label:`State + config`,hint:`~/.builderforce`},{value:`workspace`,label:`Workspace`,hint:`agent files`},{value:`app`,label:`macOS app`,hint:MAC_APP_PATH}],initialValues:[`service`,`state`,`workspace`]});if(isCancel(selection)){cancel(stylePromptTitle(`Uninstall cancelled.`)??`Uninstall cancelled.`),runtime.exit(0);return}for(let value of selection)scopes.add(value)}if(scopes.size===0){runtime.log(`Nothing selected.`);return}if(interactive&&!opts.yes){let ok=await confirm({message:stylePromptMessage(`Proceed with uninstall?`)});if(isCancel(ok)||!ok){cancel(stylePromptTitle(`Uninstall cancelled.`)??`Uninstall cancelled.`),runtime.exit(0);return}}let dryRun=!!opts.dryRun,{stateDir,configPath,oauthDir,configInsideState,oauthInsideState,workspaceDirs}=resolveCleanupPlanFromDisk();if(scopes.has(`service`)&&(dryRun?runtime.log(`[dry-run] remove gateway service`):await stopAndUninstallService(runtime)),scopes.has(`state`)&&(await removePath(stateDir,runtime,{dryRun,label:stateDir}),configInsideState||await removePath(configPath,runtime,{dryRun,label:configPath}),oauthInsideState||await removePath(oauthDir,runtime,{dryRun,label:oauthDir})),scopes.has(`workspace`))for(let workspace of workspaceDirs)await removePath(workspace,runtime,{dryRun,label:workspace});if(scopes.has(`app`)&&await removeMacApp(runtime,dryRun),runtime.log(`CLI still installed. Remove via npm/pnpm if desired.`),scopes.has(`state`)&&!scopes.has(`workspace`)){let home=resolveHomeDir();home&&workspaceDirs.some(dir=>dir.startsWith(path.resolve(home)))&&runtime.log(`Tip: workspaces were preserved. Re-run with --workspace to remove them.`)}}function registerMaintenanceCommands(program){program.command(`doctor`).description(`Health checks + quick fixes for the gateway and channels`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/doctor`,`docs.builderforce.ai/cli/doctor`)}\n`).option(`--no-workspace-suggestions`,`Disable workspace memory system suggestions`,!1).option(`--yes`,`Accept defaults without prompting`,!1).option(`--repair`,`Apply recommended repairs without prompting`,!1).option(`--fix`,`Apply recommended repairs (alias for --repair)`,!1).option(`--force`,`Apply aggressive repairs (overwrites custom service config)`,!1).option(`--non-interactive`,`Run without prompts (safe migrations only)`,!1).option(`--generate-gateway-token`,`Generate and configure a gateway token`,!1).option(`--deep`,`Scan system services for extra gateway installs`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await doctorCommand(defaultRuntime,{workspaceSuggestions:opts.workspaceSuggestions,yes:!!opts.yes,repair:!!opts.repair||!!opts.fix,force:!!opts.force,nonInteractive:!!opts.nonInteractive,generateGatewayToken:!!opts.generateGatewayToken,deep:!!opts.deep}),defaultRuntime.exit(0)})}),program.command(`dashboard`).description(`Open the Control UI with your current token`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/dashboard`,`docs.builderforce.ai/cli/dashboard`)}\n`).option(`--no-open`,`Print URL but do not launch a browser`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await dashboardCommand(defaultRuntime,{noOpen:!!opts.noOpen})})}),program.command(`reset`).description(`Reset local config/state (keeps the CLI installed)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/reset`,`docs.builderforce.ai/cli/reset`)}\n`).option(`--scope <scope>`,`config|config+creds+sessions|full (default: interactive prompt)`).option(`--yes`,`Skip confirmation prompts`,!1).option(`--non-interactive`,`Disable prompts (requires --scope + --yes)`,!1).option(`--dry-run`,`Print actions without removing files`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await resetCommand(defaultRuntime,{scope:opts.scope,yes:!!opts.yes,nonInteractive:!!opts.nonInteractive,dryRun:!!opts.dryRun})})}),program.command(`uninstall`).description(`Uninstall the gateway service + local data (CLI remains)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/uninstall`,`docs.builderforce.ai/cli/uninstall`)}\n`).option(`--service`,`Remove the gateway service`,!1).option(`--state`,`Remove state + config`,!1).option(`--workspace`,`Remove workspace dirs`,!1).option(`--app`,`Remove the macOS app`,!1).option(`--all`,`Remove service + state + workspace + app`,!1).option(`--yes`,`Skip confirmation prompts`,!1).option(`--non-interactive`,`Disable prompts (requires --yes)`,!1).option(`--dry-run`,`Print actions without removing files`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await uninstallCommand(defaultRuntime,{service:!!opts.service,state:!!opts.state,workspace:!!opts.workspace,app:!!opts.app,all:!!opts.all,yes:!!opts.yes,nonInteractive:!!opts.nonInteractive,dryRun:!!opts.dryRun})})}),program.command(`stop`).description(`Stop the running gateway service (launchd/systemd/schtasks)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/gateway`,`docs.builderforce.ai/cli/gateway`)}\n`).option(`--json`,`Output JSON`,!1).action(async opts=>{await runCommandWithRuntime(defaultRuntime,async()=>{await runDaemonStop({json:!!opts.json})})})}export{registerMaintenanceCommands};
@@ -1 +1 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-C1VbcUOm.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./model-discovery-C9Xm95uL.js";import"./model-catalog-CiiFJX77.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./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{n as runCommandWithRuntime}from"./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"./note-DgDXuE0F.js";import"./clack-prompter-B52CP7eY.js";import"./helpers-DPPVplyk.js";import"./daemon-runtime-B4UjqdyJ.js";import"./runtime-guard-Bi8k55v9.js";import"./systemd-DdVd5Yet.js";import"./service-EKJG69M3.js";import"./health-DVo8a9yg.js";import"./onboarding-Ctq_bdkC.js";import"./shared-xj-xaKFi.js";import"./onboard-auth.credentials-yagR-VMG.js";import"./auth-token-CoQ5ePPl.js";import"./logging-ayt7F7vy.js";import{n as formatAuthChoiceChoicesForCli}from"./auth-choice-options-CyKfoFNI.js";import"./openai-model-default-BMRrqTmH.js";import"./model-picker-swoSwauV.js";import"./systemd-linger-CPKngdUf.js";import"./onboard-custom-D1nd8Hlu.js";import{n as ONBOARD_PROVIDER_AUTH_FLAGS,t as onboardCommand}from"./onboard-O2gyfB4L.js";import"./onboard-interactive-DqpGicxB.js";function resolveInstallDaemonFlag(command,opts){if(!command||typeof command!=`object`)return;let getOptionValueSource=`getOptionValueSource`in command?command.getOptionValueSource:void 0;if(typeof getOptionValueSource==`function`){if(getOptionValueSource.call(command,`skipDaemon`)===`cli`)return!1;if(getOptionValueSource.call(command,`installDaemon`)===`cli`)return!!opts.installDaemon}}const AUTH_CHOICE_HELP=formatAuthChoiceChoicesForCli({includeLegacyAliases:!0,includeSkip:!0});function registerOnboardCommand(program){let command=program.command(`onboard`).description(`Interactive wizard to set up the gateway, workspace, and skills`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/onboard`,`docs.builderforce.ai/cli/onboard`)}\n`).option(`--workspace <dir>`,`Agent workspace directory (default: ~/.builderforce/workspace)`).option(`--reset`,`Reset config + credentials + sessions + workspace before running wizard`).option(`--non-interactive`,`Run without prompts`,!1).option(`--accept-risk`,`Acknowledge that agents are powerful and full system access is risky (required for --non-interactive)`,!1).option(`--flow <flow>`,`Wizard flow: quickstart|advanced|manual`).option(`--mode <mode>`,`Wizard mode: local|remote`).option(`--auth-choice <choice>`,`Auth (default: builderforcellm): ${AUTH_CHOICE_HELP}`).option(`--token-provider <id>`,`Token provider id (non-interactive; used with --auth-choice token)`).option(`--token <token>`,`Token value (non-interactive; used with --auth-choice token)`).option(`--token-profile-id <id>`,`Auth profile id (non-interactive; default: <provider>:manual)`).option(`--token-expires-in <duration>`,`Optional token expiry duration (e.g. 365d, 12h)`).option(`--cloudflare-ai-gateway-account-id <id>`,`Cloudflare Account ID`).option(`--cloudflare-ai-gateway-gateway-id <id>`,`Cloudflare AI Gateway ID`);for(let providerFlag of ONBOARD_PROVIDER_AUTH_FLAGS)command.option(providerFlag.cliOption,providerFlag.description);command.option(`--custom-base-url <url>`,`Custom provider base URL`).option(`--custom-api-key <key>`,`Custom provider API key (optional)`).option(`--custom-model-id <id>`,`Custom provider model ID`).option(`--custom-provider-id <id>`,`Custom provider ID (optional; auto-derived by default)`).option(`--custom-compatibility <mode>`,`Custom provider API compatibility: openai|anthropic (default: openai)`).option(`--gateway-port <port>`,`Gateway port`).option(`--gateway-bind <mode>`,`Gateway bind: loopback|tailnet|lan|auto|custom`).option(`--gateway-auth <mode>`,`Gateway auth: token|password`).option(`--gateway-token <token>`,`Gateway token (token auth)`).option(`--gateway-password <password>`,`Gateway password (password auth)`).option(`--remote-url <url>`,`Remote Gateway WebSocket URL`).option(`--remote-token <token>`,`Remote Gateway token (optional)`).option(`--tailscale <mode>`,`Tailscale: off|serve|funnel`).option(`--tailscale-reset-on-exit`,`Reset tailscale serve/funnel on exit`).option(`--install-daemon`,`Install gateway service`).option(`--no-install-daemon`,`Skip gateway service install`).option(`--skip-daemon`,`Skip gateway service install`).option(`--daemon-runtime <runtime>`,`Daemon runtime: node|bun`).option(`--skip-channels`,`Skip channel setup`).option(`--skip-skills`,`Skip skills setup`).option(`--skip-health`,`Skip health check`).option(`--skip-ui`,`Skip Control UI/TUI prompts`).option(`--node-manager <name>`,`Node manager for skills: npm|pnpm|bun`).option(`--json`,`Output JSON summary`,!1),command.action(async(opts,commandRuntime)=>{await runCommandWithRuntime(defaultRuntime,async()=>{let installDaemon=resolveInstallDaemonFlag(commandRuntime,{installDaemon:!!opts.installDaemon}),gatewayPort=typeof opts.gatewayPort==`string`?Number.parseInt(opts.gatewayPort,10):void 0;await onboardCommand({workspace:opts.workspace,nonInteractive:!!opts.nonInteractive,acceptRisk:!!opts.acceptRisk,flow:opts.flow,mode:opts.mode,authChoice:opts.authChoice,tokenProvider:opts.tokenProvider,token:opts.token,tokenProfileId:opts.tokenProfileId,tokenExpiresIn:opts.tokenExpiresIn,anthropicApiKey:opts.anthropicApiKey,openaiApiKey:opts.openaiApiKey,openrouterApiKey:opts.openrouterApiKey,aiGatewayApiKey:opts.aiGatewayApiKey,cloudflareAiGatewayAccountId:opts.cloudflareAiGatewayAccountId,cloudflareAiGatewayGatewayId:opts.cloudflareAiGatewayGatewayId,cloudflareAiGatewayApiKey:opts.cloudflareAiGatewayApiKey,moonshotApiKey:opts.moonshotApiKey,kimiCodeApiKey:opts.kimiCodeApiKey,geminiApiKey:opts.geminiApiKey,zaiApiKey:opts.zaiApiKey,xiaomiApiKey:opts.xiaomiApiKey,qianfanApiKey:opts.qianfanApiKey,minimaxApiKey:opts.minimaxApiKey,syntheticApiKey:opts.syntheticApiKey,veniceApiKey:opts.veniceApiKey,togetherApiKey:opts.togetherApiKey,huggingfaceApiKey:opts.huggingfaceApiKey,opencodeZenApiKey:opts.opencodeZenApiKey,xaiApiKey:opts.xaiApiKey,litellmApiKey:opts.litellmApiKey,customBaseUrl:opts.customBaseUrl,customApiKey:opts.customApiKey,customModelId:opts.customModelId,customProviderId:opts.customProviderId,customCompatibility:opts.customCompatibility,gatewayPort:typeof gatewayPort==`number`&&Number.isFinite(gatewayPort)?gatewayPort:void 0,gatewayBind:opts.gatewayBind,gatewayAuth:opts.gatewayAuth,gatewayToken:opts.gatewayToken,gatewayPassword:opts.gatewayPassword,remoteUrl:opts.remoteUrl,remoteToken:opts.remoteToken,tailscale:opts.tailscale,tailscaleResetOnExit:!!opts.tailscaleResetOnExit,reset:!!opts.reset,installDaemon,daemonRuntime:opts.daemonRuntime,skipChannels:!!opts.skipChannels,skipSkills:!!opts.skipSkills,skipHealth:!!opts.skipHealth,skipUi:!!opts.skipUi,nodeManager:opts.nodeManager,json:!!opts.json},defaultRuntime)})})}export{registerOnboardCommand};
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-C1VbcUOm.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./model-discovery-C9Xm95uL.js";import"./model-catalog-CiiFJX77.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./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{n as runCommandWithRuntime}from"./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"./note-DgDXuE0F.js";import"./clack-prompter-B52CP7eY.js";import"./helpers-DPPVplyk.js";import"./daemon-runtime-B4UjqdyJ.js";import"./runtime-guard-Bi8k55v9.js";import"./systemd-DdVd5Yet.js";import"./service-EKJG69M3.js";import"./health-DVo8a9yg.js";import"./onboarding-CP9rrz8y.js";import"./shared-xj-xaKFi.js";import"./onboard-auth.credentials-yagR-VMG.js";import"./auth-token-CoQ5ePPl.js";import"./logging-ayt7F7vy.js";import{n as formatAuthChoiceChoicesForCli}from"./auth-choice-options-CyKfoFNI.js";import"./openai-model-default-BMRrqTmH.js";import"./model-picker-swoSwauV.js";import"./systemd-linger-CPKngdUf.js";import"./onboard-custom-D1nd8Hlu.js";import{n as ONBOARD_PROVIDER_AUTH_FLAGS,t as onboardCommand}from"./onboard-DfMVh1bM.js";import"./onboard-interactive-DYJttZ2w.js";function resolveInstallDaemonFlag(command,opts){if(!command||typeof command!=`object`)return;let getOptionValueSource=`getOptionValueSource`in command?command.getOptionValueSource:void 0;if(typeof getOptionValueSource==`function`){if(getOptionValueSource.call(command,`skipDaemon`)===`cli`)return!1;if(getOptionValueSource.call(command,`installDaemon`)===`cli`)return!!opts.installDaemon}}const AUTH_CHOICE_HELP=formatAuthChoiceChoicesForCli({includeLegacyAliases:!0,includeSkip:!0});function registerOnboardCommand(program){let command=program.command(`onboard`).description(`Interactive wizard to set up the gateway, workspace, and skills`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/onboard`,`docs.builderforce.ai/cli/onboard`)}\n`).option(`--workspace <dir>`,`Agent workspace directory (default: ~/.builderforce/workspace)`).option(`--reset`,`Reset config + credentials + sessions + workspace before running wizard`).option(`--non-interactive`,`Run without prompts`,!1).option(`--accept-risk`,`Acknowledge that agents are powerful and full system access is risky (required for --non-interactive)`,!1).option(`--flow <flow>`,`Wizard flow: quickstart|advanced|manual`).option(`--mode <mode>`,`Wizard mode: local|remote`).option(`--auth-choice <choice>`,`Auth (default: builderforcellm): ${AUTH_CHOICE_HELP}`).option(`--token-provider <id>`,`Token provider id (non-interactive; used with --auth-choice token)`).option(`--token <token>`,`Token value (non-interactive; used with --auth-choice token)`).option(`--token-profile-id <id>`,`Auth profile id (non-interactive; default: <provider>:manual)`).option(`--token-expires-in <duration>`,`Optional token expiry duration (e.g. 365d, 12h)`).option(`--cloudflare-ai-gateway-account-id <id>`,`Cloudflare Account ID`).option(`--cloudflare-ai-gateway-gateway-id <id>`,`Cloudflare AI Gateway ID`);for(let providerFlag of ONBOARD_PROVIDER_AUTH_FLAGS)command.option(providerFlag.cliOption,providerFlag.description);command.option(`--custom-base-url <url>`,`Custom provider base URL`).option(`--custom-api-key <key>`,`Custom provider API key (optional)`).option(`--custom-model-id <id>`,`Custom provider model ID`).option(`--custom-provider-id <id>`,`Custom provider ID (optional; auto-derived by default)`).option(`--custom-compatibility <mode>`,`Custom provider API compatibility: openai|anthropic (default: openai)`).option(`--gateway-port <port>`,`Gateway port`).option(`--gateway-bind <mode>`,`Gateway bind: loopback|tailnet|lan|auto|custom`).option(`--gateway-auth <mode>`,`Gateway auth: token|password`).option(`--gateway-token <token>`,`Gateway token (token auth)`).option(`--gateway-password <password>`,`Gateway password (password auth)`).option(`--remote-url <url>`,`Remote Gateway WebSocket URL`).option(`--remote-token <token>`,`Remote Gateway token (optional)`).option(`--tailscale <mode>`,`Tailscale: off|serve|funnel`).option(`--tailscale-reset-on-exit`,`Reset tailscale serve/funnel on exit`).option(`--install-daemon`,`Install gateway service`).option(`--no-install-daemon`,`Skip gateway service install`).option(`--skip-daemon`,`Skip gateway service install`).option(`--daemon-runtime <runtime>`,`Daemon runtime: node|bun`).option(`--skip-channels`,`Skip channel setup`).option(`--skip-skills`,`Skip skills setup`).option(`--skip-health`,`Skip health check`).option(`--skip-ui`,`Skip Control UI/TUI prompts`).option(`--node-manager <name>`,`Node manager for skills: npm|pnpm|bun`).option(`--json`,`Output JSON summary`,!1),command.action(async(opts,commandRuntime)=>{await runCommandWithRuntime(defaultRuntime,async()=>{let installDaemon=resolveInstallDaemonFlag(commandRuntime,{installDaemon:!!opts.installDaemon}),gatewayPort=typeof opts.gatewayPort==`string`?Number.parseInt(opts.gatewayPort,10):void 0;await onboardCommand({workspace:opts.workspace,nonInteractive:!!opts.nonInteractive,acceptRisk:!!opts.acceptRisk,flow:opts.flow,mode:opts.mode,authChoice:opts.authChoice,tokenProvider:opts.tokenProvider,token:opts.token,tokenProfileId:opts.tokenProfileId,tokenExpiresIn:opts.tokenExpiresIn,anthropicApiKey:opts.anthropicApiKey,openaiApiKey:opts.openaiApiKey,openrouterApiKey:opts.openrouterApiKey,aiGatewayApiKey:opts.aiGatewayApiKey,cloudflareAiGatewayAccountId:opts.cloudflareAiGatewayAccountId,cloudflareAiGatewayGatewayId:opts.cloudflareAiGatewayGatewayId,cloudflareAiGatewayApiKey:opts.cloudflareAiGatewayApiKey,moonshotApiKey:opts.moonshotApiKey,kimiCodeApiKey:opts.kimiCodeApiKey,geminiApiKey:opts.geminiApiKey,zaiApiKey:opts.zaiApiKey,xiaomiApiKey:opts.xiaomiApiKey,qianfanApiKey:opts.qianfanApiKey,minimaxApiKey:opts.minimaxApiKey,syntheticApiKey:opts.syntheticApiKey,veniceApiKey:opts.veniceApiKey,togetherApiKey:opts.togetherApiKey,huggingfaceApiKey:opts.huggingfaceApiKey,opencodeZenApiKey:opts.opencodeZenApiKey,xaiApiKey:opts.xaiApiKey,litellmApiKey:opts.litellmApiKey,customBaseUrl:opts.customBaseUrl,customApiKey:opts.customApiKey,customModelId:opts.customModelId,customProviderId:opts.customProviderId,customCompatibility:opts.customCompatibility,gatewayPort:typeof gatewayPort==`number`&&Number.isFinite(gatewayPort)?gatewayPort:void 0,gatewayBind:opts.gatewayBind,gatewayAuth:opts.gatewayAuth,gatewayToken:opts.gatewayToken,gatewayPassword:opts.gatewayPassword,remoteUrl:opts.remoteUrl,remoteToken:opts.remoteToken,tailscale:opts.tailscale,tailscaleResetOnExit:!!opts.tailscaleResetOnExit,reset:!!opts.reset,installDaemon,daemonRuntime:opts.daemonRuntime,skipChannels:!!opts.skipChannels,skipSkills:!!opts.skipSkills,skipHealth:!!opts.skipHealth,skipUi:!!opts.skipUi,nodeManager:opts.nodeManager,json:!!opts.json},defaultRuntime)})})}export{registerOnboardCommand};