@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"./paths-BVMSM1lQ.js";import"./session-key-CYpYHc1e.js";import{X as shouldLogVerbose,q as logVerbose}from"./registry-D_frpmHZ.js";import"./agent-scope-EkacNLg3.js";import"./subsystem-BakM_oqD.js";import"./workspace-BCjtHT4u.js";import"./model-selection-BJ0saFZo.js";import"./env-BhRm7_r8.js";import"./boolean-ssGoaBPk.js";import"./src-CLWuGn12.js";import"./plugins-J28Y83f5.js";import"./accounts-193gfWbH.js";import"./bindings-BfB5A-by.js";import"./accounts-DHeA4T6C.js";import"./fetch-BklyLYYN.js";import"./model-catalog-Abk8cdEI.js";import"./redact-sNZY-pGx.js";import"./errors-BmztzL5I.js";import{a as runCapability,n as createMediaAttachmentCache,o as isAudioAttachment,r as normalizeMediaAttachments,t as buildProviderRegistry}from"./runner-B70PGCqP.js";import"./config-bxyMjPHU.js";import"./chrome-Blk2Jftn.js";import"./frontmatter-DBVosMFY.js";import"./store-DN9AcI73.js";import"./message-channel-tBuQgYSD.js";import"./accounts-C7FtIPYB.js";import"./paths-CzXKnIOb.js";import"./gemini-auth-CzGGgJ0p.js";import"./tool-images-mfC2sOfJ.js";async function transcribeFirstAudio(params){let{ctx,cfg}=params,audioConfig=cfg.tools?.media?.audio;if(!audioConfig||audioConfig.enabled===!1)return;let attachments=normalizeMediaAttachments(ctx);if(!attachments||attachments.length===0)return;let firstAudio=attachments.find(att=>att&&isAudioAttachment(att)&&!att.alreadyTranscribed);if(!firstAudio)return;shouldLogVerbose()&&logVerbose(`audio-preflight: transcribing attachment ${firstAudio.index} for mention check`);let providerRegistry=buildProviderRegistry(params.providers),cache=createMediaAttachmentCache(attachments);try{let result=await runCapability({capability:`audio`,cfg,ctx,attachments:cache,media:attachments,agentDir:params.agentDir,providerRegistry,config:audioConfig,activeModel:params.activeModel});if(!result||result.outputs.length===0)return;let audioOutput=result.outputs.find(output=>output.kind===`audio.transcription`);return!audioOutput||!audioOutput.text?void 0:(firstAudio.alreadyTranscribed=!0,shouldLogVerbose()&&logVerbose(`audio-preflight: transcribed ${audioOutput.text.length} chars from attachment ${firstAudio.index}`),audioOutput.text)}catch(err){shouldLogVerbose()&&logVerbose(`audio-preflight: transcription failed: ${String(err)}`);return}finally{await cache.cleanup()}}export{transcribeFirstAudio};
1
+ import"./paths-BVMSM1lQ.js";import"./session-key-CYpYHc1e.js";import{X as shouldLogVerbose,q as logVerbose}from"./registry-D_frpmHZ.js";import"./agent-scope-EkacNLg3.js";import"./subsystem-BakM_oqD.js";import"./workspace-BCjtHT4u.js";import"./model-selection-BJ0saFZo.js";import"./env-BhRm7_r8.js";import"./boolean-ssGoaBPk.js";import"./src-CLWuGn12.js";import"./plugins-J28Y83f5.js";import"./accounts-193gfWbH.js";import"./bindings-BfB5A-by.js";import"./accounts-DHeA4T6C.js";import"./fetch-BklyLYYN.js";import"./model-catalog-Abk8cdEI.js";import"./redact-sNZY-pGx.js";import"./errors-BmztzL5I.js";import{a as runCapability,n as createMediaAttachmentCache,o as isAudioAttachment,r as normalizeMediaAttachments,t as buildProviderRegistry}from"./runner-D7af_RBH.js";import"./config-bxyMjPHU.js";import"./chrome-CtTMuhww.js";import"./frontmatter-DBVosMFY.js";import"./store-DN9AcI73.js";import"./message-channel-tBuQgYSD.js";import"./accounts-C7FtIPYB.js";import"./paths-CzXKnIOb.js";import"./gemini-auth-CzGGgJ0p.js";import"./tool-images-mfC2sOfJ.js";async function transcribeFirstAudio(params){let{ctx,cfg}=params,audioConfig=cfg.tools?.media?.audio;if(!audioConfig||audioConfig.enabled===!1)return;let attachments=normalizeMediaAttachments(ctx);if(!attachments||attachments.length===0)return;let firstAudio=attachments.find(att=>att&&isAudioAttachment(att)&&!att.alreadyTranscribed);if(!firstAudio)return;shouldLogVerbose()&&logVerbose(`audio-preflight: transcribing attachment ${firstAudio.index} for mention check`);let providerRegistry=buildProviderRegistry(params.providers),cache=createMediaAttachmentCache(attachments);try{let result=await runCapability({capability:`audio`,cfg,ctx,attachments:cache,media:attachments,agentDir:params.agentDir,providerRegistry,config:audioConfig,activeModel:params.activeModel});if(!result||result.outputs.length===0)return;let audioOutput=result.outputs.find(output=>output.kind===`audio.transcription`);return!audioOutput||!audioOutput.text?void 0:(firstAudio.alreadyTranscribed=!0,shouldLogVerbose()&&logVerbose(`audio-preflight: transcribed ${audioOutput.text.length} chars from attachment ${firstAudio.index}`),audioOutput.text)}catch(err){shouldLogVerbose()&&logVerbose(`audio-preflight: transcription failed: ${String(err)}`);return}finally{await cache.cleanup()}}export{transcribeFirstAudio};
@@ -1 +1 @@
1
- import"./paths-CAQcjxp2.js";import"./session-key-CYpYHc1e.js";import{G as logVerbose,J as shouldLogVerbose}from"./registry-j1UKIotU.js";import"./agent-scope-C7zGN7Pz.js";import"./subsystem-ykSbyaud.js";import"./model-selection-BGEkWWV7.js";import"./env-44XUbLhk.js";import"./src-izs0XSXm.js";import"./plugins-CjU7Ut5E.js";import"./accounts-xbnfJmsd.js";import"./bindings-6UAwilZE.js";import{a as runCapability,n as createMediaAttachmentCache,o as isAudioAttachment,r as normalizeMediaAttachments,t as buildProviderRegistry}from"./runner-CviGu3Nk.js";import"./fetch-D2i2BBd3.js";import"./model-catalog-BTMhKeCz.js";import"./redact-xFefzy4M.js";import"./errors-CguQr0Ja.js";import"./config-C7baFOp1.js";import"./chrome-DUBgoZpO.js";import"./message-channel-BKGbjp9g.js";import"./paths-ZHayVsQS.js";import"./gemini-auth-eXEUozQC.js";import"./tool-images-B8YdlzZb.js";async function transcribeFirstAudio(params){let{ctx,cfg}=params,audioConfig=cfg.tools?.media?.audio;if(!audioConfig||audioConfig.enabled===!1)return;let attachments=normalizeMediaAttachments(ctx);if(!attachments||attachments.length===0)return;let firstAudio=attachments.find(att=>att&&isAudioAttachment(att)&&!att.alreadyTranscribed);if(!firstAudio)return;shouldLogVerbose()&&logVerbose(`audio-preflight: transcribing attachment ${firstAudio.index} for mention check`);let providerRegistry=buildProviderRegistry(params.providers),cache=createMediaAttachmentCache(attachments);try{let result=await runCapability({capability:`audio`,cfg,ctx,attachments:cache,media:attachments,agentDir:params.agentDir,providerRegistry,config:audioConfig,activeModel:params.activeModel});if(!result||result.outputs.length===0)return;let audioOutput=result.outputs.find(output=>output.kind===`audio.transcription`);return!audioOutput||!audioOutput.text?void 0:(firstAudio.alreadyTranscribed=!0,shouldLogVerbose()&&logVerbose(`audio-preflight: transcribed ${audioOutput.text.length} chars from attachment ${firstAudio.index}`),audioOutput.text)}catch(err){shouldLogVerbose()&&logVerbose(`audio-preflight: transcription failed: ${String(err)}`);return}finally{await cache.cleanup()}}export{transcribeFirstAudio};
1
+ import"./paths-CAQcjxp2.js";import"./session-key-CYpYHc1e.js";import{G as logVerbose,J as shouldLogVerbose}from"./registry-j1UKIotU.js";import"./agent-scope-C7zGN7Pz.js";import"./subsystem-ykSbyaud.js";import"./model-selection-BGEkWWV7.js";import"./env-44XUbLhk.js";import"./src-izs0XSXm.js";import"./plugins-CjU7Ut5E.js";import"./accounts-xbnfJmsd.js";import"./bindings-6UAwilZE.js";import{a as runCapability,n as createMediaAttachmentCache,o as isAudioAttachment,r as normalizeMediaAttachments,t as buildProviderRegistry}from"./runner-COldX-El.js";import"./fetch-D2i2BBd3.js";import"./model-catalog-BTMhKeCz.js";import"./redact-xFefzy4M.js";import"./errors-CguQr0Ja.js";import"./config-C7baFOp1.js";import"./chrome-Brg9KsB9.js";import"./message-channel-BKGbjp9g.js";import"./paths-ZHayVsQS.js";import"./gemini-auth-eXEUozQC.js";import"./tool-images-B8YdlzZb.js";async function transcribeFirstAudio(params){let{ctx,cfg}=params,audioConfig=cfg.tools?.media?.audio;if(!audioConfig||audioConfig.enabled===!1)return;let attachments=normalizeMediaAttachments(ctx);if(!attachments||attachments.length===0)return;let firstAudio=attachments.find(att=>att&&isAudioAttachment(att)&&!att.alreadyTranscribed);if(!firstAudio)return;shouldLogVerbose()&&logVerbose(`audio-preflight: transcribing attachment ${firstAudio.index} for mention check`);let providerRegistry=buildProviderRegistry(params.providers),cache=createMediaAttachmentCache(attachments);try{let result=await runCapability({capability:`audio`,cfg,ctx,attachments:cache,media:attachments,agentDir:params.agentDir,providerRegistry,config:audioConfig,activeModel:params.activeModel});if(!result||result.outputs.length===0)return;let audioOutput=result.outputs.find(output=>output.kind===`audio.transcription`);return!audioOutput||!audioOutput.text?void 0:(firstAudio.alreadyTranscribed=!0,shouldLogVerbose()&&logVerbose(`audio-preflight: transcribed ${audioOutput.text.length} chars from attachment ${firstAudio.index}`),audioOutput.text)}catch(err){shouldLogVerbose()&&logVerbose(`audio-preflight: transcription failed: ${String(err)}`);return}finally{await cache.cleanup()}}export{transcribeFirstAudio};
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026.10.8",
3
- "commit": "5d9ad7343669e2fb347d25fc224f02252d4a0bc8",
4
- "builtAt": "2026-10-17T22:01:58.252Z"
2
+ "version": "2026.10.9",
3
+ "commit": "5724d76fb1f3cea007a0f671860cdd51da949ca3",
4
+ "builtAt": "2026-10-17T23:44:48.741Z"
5
5
  }
@@ -1,4 +1,4 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-C1VbcUOm.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import{t as normalizeBaseUrl}from"./normalize-base-url-D_sv6Zgt.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{U as VERSION,a as readConfigFileSnapshot,c as writeConfigFile}from"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./model-discovery-C9Xm95uL.js";import"./model-catalog-CiiFJX77.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./client-CGgp3zkQ.js";import"./call-DmAU4cRX.js";import"./message-channel-z5YRpR2d.js";import"./sessions-Bl1wwotX.js";import{_ as isBuilderForceAgentsProject,n as loadProjectContext,o as updateProjectContextFields}from"./project-context-store-CIUcwUP_.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./accounts-Cx82nj4E.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-DK8_apW0.js";import"./sandbox-z9t_PRf9.js";import"./chrome-BnEbJV3D.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-owOmmyUM.js";import"./routes-lclJHOYY.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./tool-display-Cs4hDP1f.js";import{n as fetchWithTimeout}from"./fetch-timeout-Cb8Yj9Tw.js";import"./builderforcellm-syscheck-CprBhARf.js";import"./usage-format-5sp5AMSu.js";import{f as initializeBuilderForceAgentsProject}from"./project-context-D3Mx4maV.js";import{r as saveMambaState}from"./mamba-state-engine-CV4nDcCk.js";import"./transformers-stream-Buj40qHl.js";import"./builderforce-directory-sync-DQ6u60yX.js";import"./shared-xj-xaKFi.js";import{_ as setOpenrouterApiKey,c as setAnthropicApiKey,u as setGeminiApiKey}from"./onboard-auth.credentials-yagR-VMG.js";import"./model-picker-swoSwauV.js";import"./auth-choice.apply.transformers-1plI0MUg.js";import{t as runTui}from"./tui-C5ChWpBg.js";import"./tui-stream-assembler-q9GANTDr.js";import path from"node:path";import fs from"node:fs/promises";import{confirm,intro,note,outro,password,select,spinner,text}from"@clack/prompts";import{Command}from"commander";const DEFAULT_REGISTRY_URL=`https://api.builderforce.ai`;function resolveRegistryUrl(){return normalizeBaseUrl(readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_URL`)??DEFAULT_REGISTRY_URL)}function resolveAuthHeaders(){let apiKey=readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_API_KEY`);return apiKey?{Authorization:`Bearer ${apiKey}`}:{}}function isV2Package(pkg){return pkg.version===`2.0`}async function fetchAgentPackage(params){let url=`${normalizeBaseUrl(params.registryUrl??resolveRegistryUrl())}/api/agents/${encodeURIComponent(params.agentId)}/package`,res;try{res=await fetchWithTimeout(url,{method:`GET`,headers:{Accept:`application/json`,...resolveAuthHeaders()}},3e4)}catch(err){let msg=err instanceof Error?err.message:String(err);throw Error(`Network error fetching agent package: ${msg}`,{cause:err})}if(!res.ok){let text=await res.text().catch(()=>``);throw Error(`Registry returned ${res.status} ${res.statusText}${text?`: ${text}`:``}`)}let pkg=await res.json();if(!pkg.version||!pkg.platform||!pkg.name||!pkg.base_model)throw Error(`Invalid agent package: missing required fields (version, platform, name, base_model)`);return pkg}function resolveWorkforceModelRef(params){return readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_API_KEY`)?`builderforcellm/workforce-${params.agentId}`:params.pkg.base_model}async function installWorkforceAgent(params){let registryUrl=params.registryUrl??resolveRegistryUrl(),spin=spinner();spin.start(`Fetching agent package for "${params.agentId}" from ${registryUrl}…`);let pkg;try{pkg=await fetchAgentPackage({agentId:params.agentId,registryUrl}),spin.stop(`Package downloaded: ${pkg.name} (v${pkg.version})`)}catch(err){throw spin.stop(`Failed to download agent package`),err}let modelRef=resolveWorkforceModelRef({agentId:params.agentId,pkg}),hasMambaState=isV2Package(pkg)&&!!pkg.mamba_state,installed={agentId:params.agentId,name:pkg.name,title:pkg.title,baseModel:pkg.base_model,modelRef,loraArtifactKey:pkg.r2_artifact_key,packageVersion:pkg.version,hasMambaState,installedAt:new Date().toISOString(),registryUrl};return await updateProjectContextFields(params.projectRoot,{customAgent:installed,llm:{provider:`builderforcellm`,model:modelRef}}),hasMambaState&&isV2Package(pkg)&&pkg.mamba_state&&await saveMambaState(params.projectRoot,pkg.mamba_state),[`Workforce agent installed: ${pkg.name} (${params.agentId})`,` Base model: ${pkg.base_model}`,` Package: v${pkg.version}`,` Mamba state: ${hasMambaState?`yes (persistent memory)`:`no`}`,` Model ref: ${modelRef}`].join(`
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-C1VbcUOm.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import{t as normalizeBaseUrl}from"./normalize-base-url-D_sv6Zgt.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{U as VERSION,a as readConfigFileSnapshot,c as writeConfigFile}from"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./model-discovery-C9Xm95uL.js";import"./model-catalog-CiiFJX77.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./client-CGgp3zkQ.js";import"./call-DmAU4cRX.js";import"./message-channel-z5YRpR2d.js";import"./sessions-Bl1wwotX.js";import{_ as isBuilderForceAgentsProject,n as loadProjectContext,o as updateProjectContextFields}from"./project-context-store-CIUcwUP_.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./accounts-Cx82nj4E.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-DK8_apW0.js";import"./sandbox-z9t_PRf9.js";import"./chrome-BnEbJV3D.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-owOmmyUM.js";import"./routes-lclJHOYY.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./tool-display-Cs4hDP1f.js";import{n as fetchWithTimeout}from"./fetch-timeout-Cb8Yj9Tw.js";import"./builderforcellm-syscheck-CprBhARf.js";import"./usage-format-5sp5AMSu.js";import{f as initializeBuilderForceAgentsProject}from"./project-context-D3Mx4maV.js";import{r as saveMambaState}from"./mamba-state-engine-CV4nDcCk.js";import"./transformers-stream-Buj40qHl.js";import"./builderforce-directory-sync-DQ6u60yX.js";import"./shared-xj-xaKFi.js";import{_ as setOpenrouterApiKey,c as setAnthropicApiKey,u as setGeminiApiKey}from"./onboard-auth.credentials-yagR-VMG.js";import"./model-picker-swoSwauV.js";import"./auth-choice.apply.transformers-1plI0MUg.js";import{t as runTui}from"./tui-BwWMByVp.js";import"./tui-stream-assembler-q9GANTDr.js";import path from"node:path";import fs from"node:fs/promises";import{confirm,intro,note,outro,password,select,spinner,text}from"@clack/prompts";import{Command}from"commander";const DEFAULT_REGISTRY_URL=`https://api.builderforce.ai`;function resolveRegistryUrl(){return normalizeBaseUrl(readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_URL`)??DEFAULT_REGISTRY_URL)}function resolveAuthHeaders(){let apiKey=readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_API_KEY`);return apiKey?{Authorization:`Bearer ${apiKey}`}:{}}function isV2Package(pkg){return pkg.version===`2.0`}async function fetchAgentPackage(params){let url=`${normalizeBaseUrl(params.registryUrl??resolveRegistryUrl())}/api/agents/${encodeURIComponent(params.agentId)}/package`,res;try{res=await fetchWithTimeout(url,{method:`GET`,headers:{Accept:`application/json`,...resolveAuthHeaders()}},3e4)}catch(err){let msg=err instanceof Error?err.message:String(err);throw Error(`Network error fetching agent package: ${msg}`,{cause:err})}if(!res.ok){let text=await res.text().catch(()=>``);throw Error(`Registry returned ${res.status} ${res.statusText}${text?`: ${text}`:``}`)}let pkg=await res.json();if(!pkg.version||!pkg.platform||!pkg.name||!pkg.base_model)throw Error(`Invalid agent package: missing required fields (version, platform, name, base_model)`);return pkg}function resolveWorkforceModelRef(params){return readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_API_KEY`)?`builderforcellm/workforce-${params.agentId}`:params.pkg.base_model}async function installWorkforceAgent(params){let registryUrl=params.registryUrl??resolveRegistryUrl(),spin=spinner();spin.start(`Fetching agent package for "${params.agentId}" from ${registryUrl}…`);let pkg;try{pkg=await fetchAgentPackage({agentId:params.agentId,registryUrl}),spin.stop(`Package downloaded: ${pkg.name} (v${pkg.version})`)}catch(err){throw spin.stop(`Failed to download agent package`),err}let modelRef=resolveWorkforceModelRef({agentId:params.agentId,pkg}),hasMambaState=isV2Package(pkg)&&!!pkg.mamba_state,installed={agentId:params.agentId,name:pkg.name,title:pkg.title,baseModel:pkg.base_model,modelRef,loraArtifactKey:pkg.r2_artifact_key,packageVersion:pkg.version,hasMambaState,installedAt:new Date().toISOString(),registryUrl};return await updateProjectContextFields(params.projectRoot,{customAgent:installed,llm:{provider:`builderforcellm`,model:modelRef}}),hasMambaState&&isV2Package(pkg)&&pkg.mamba_state&&await saveMambaState(params.projectRoot,pkg.mamba_state),[`Workforce agent installed: ${pkg.name} (${params.agentId})`,` Base model: ${pkg.base_model}`,` Package: v${pkg.version}`,` Mamba state: ${hasMambaState?`yes (persistent memory)`:`no`}`,` Model ref: ${modelRef}`].join(`
2
2
  `)}async function showWorkforceAgentInfo(projectRoot){let ctx=await loadProjectContext(projectRoot);if(!ctx?.customAgent){note(`No Workforce agent is installed in this project.
3
3
 
4
4
  Run: builderforce agent install <agentId>`,`No agent installed`);return}let a=ctx.customAgent;note([theme.heading(`Workforce Agent`),` ID: ${a.agentId}`,` Name: ${a.name}${a.title?` — ${a.title}`:``}`,` Base model: ${a.baseModel}`,` Model ref: ${a.modelRef}`,` Package: v${a.packageVersion}`,` Mamba state: ${a.hasMambaState?`yes (persistent memory)`:`no`}`,` Installed: ${a.installedAt}`,` Registry: ${a.registryUrl}`].join(`
@@ -1,4 +1,4 @@
1
- import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./embedded-helpers-CEsr3aQ0.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import{t as normalizeBaseUrl}from"./normalize-base-url-DmugqkQ6.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import{U as VERSION,a as readConfigFileSnapshot,c as writeConfigFile}from"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./model-catalog-C6UrZ0uG.js";import"./sandbox-BZibn6PX.js";import"./chrome-a3X9_-nf.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DJZT7Upf.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-BzfLvF8W.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-CdanN_ZI.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import{n as fetchWithTimeout}from"./fetch-timeout-BIqoSVfA.js";import{_ as isBuilderForceAgentsProject,n as loadProjectContext,o as updateProjectContextFields}from"./project-context-store-wcq7lXuI.js";import"./client-xfoidwPI.js";import"./call-BbRf8gFM.js";import"./builderforcellm-syscheck-DrFJ638L.js";import"./usage-format-DGf8ZWPH.js";import{f as initializeBuilderForceAgentsProject}from"./project-context-CJj0Inz-.js";import{r as saveMambaState}from"./mamba-state-engine-CoGqoBTH.js";import"./transformers-stream-D7nRu4Qu.js";import"./builderforce-directory-sync-DAH62b3b.js";import"./shared-BPN3qd7G.js";import{_ as setOpenrouterApiKey,c as setAnthropicApiKey,u as setGeminiApiKey}from"./onboard-auth.credentials-BuT-etnE.js";import"./model-picker-BUePD7Zg.js";import"./auth-choice.apply.transformers-CIn3fs7K.js";import{t as runTui}from"./tui-DHjIJOFN.js";import"./tui-stream-assembler-ign_cPkv.js";import path from"node:path";import fs from"node:fs/promises";import{confirm,intro,note,outro,password,select,spinner,text}from"@clack/prompts";import{Command}from"commander";const DEFAULT_REGISTRY_URL=`https://api.builderforce.ai`;function resolveRegistryUrl(){return normalizeBaseUrl(readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_URL`)??DEFAULT_REGISTRY_URL)}function resolveAuthHeaders(){let apiKey=readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_API_KEY`);return apiKey?{Authorization:`Bearer ${apiKey}`}:{}}function isV2Package(pkg){return pkg.version===`2.0`}async function fetchAgentPackage(params){let url=`${normalizeBaseUrl(params.registryUrl??resolveRegistryUrl())}/api/agents/${encodeURIComponent(params.agentId)}/package`,res;try{res=await fetchWithTimeout(url,{method:`GET`,headers:{Accept:`application/json`,...resolveAuthHeaders()}},3e4)}catch(err){let msg=err instanceof Error?err.message:String(err);throw Error(`Network error fetching agent package: ${msg}`,{cause:err})}if(!res.ok){let text=await res.text().catch(()=>``);throw Error(`Registry returned ${res.status} ${res.statusText}${text?`: ${text}`:``}`)}let pkg=await res.json();if(!pkg.version||!pkg.platform||!pkg.name||!pkg.base_model)throw Error(`Invalid agent package: missing required fields (version, platform, name, base_model)`);return pkg}function resolveWorkforceModelRef(params){return readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_API_KEY`)?`builderforcellm/workforce-${params.agentId}`:params.pkg.base_model}async function installWorkforceAgent(params){let registryUrl=params.registryUrl??resolveRegistryUrl(),spin=spinner();spin.start(`Fetching agent package for "${params.agentId}" from ${registryUrl}…`);let pkg;try{pkg=await fetchAgentPackage({agentId:params.agentId,registryUrl}),spin.stop(`Package downloaded: ${pkg.name} (v${pkg.version})`)}catch(err){throw spin.stop(`Failed to download agent package`),err}let modelRef=resolveWorkforceModelRef({agentId:params.agentId,pkg}),hasMambaState=isV2Package(pkg)&&!!pkg.mamba_state,installed={agentId:params.agentId,name:pkg.name,title:pkg.title,baseModel:pkg.base_model,modelRef,loraArtifactKey:pkg.r2_artifact_key,packageVersion:pkg.version,hasMambaState,installedAt:new Date().toISOString(),registryUrl};return await updateProjectContextFields(params.projectRoot,{customAgent:installed,llm:{provider:`builderforcellm`,model:modelRef}}),hasMambaState&&isV2Package(pkg)&&pkg.mamba_state&&await saveMambaState(params.projectRoot,pkg.mamba_state),[`Workforce agent installed: ${pkg.name} (${params.agentId})`,` Base model: ${pkg.base_model}`,` Package: v${pkg.version}`,` Mamba state: ${hasMambaState?`yes (persistent memory)`:`no`}`,` Model ref: ${modelRef}`].join(`
1
+ import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./embedded-helpers-CEsr3aQ0.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import{t as normalizeBaseUrl}from"./normalize-base-url-DmugqkQ6.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import{U as VERSION,a as readConfigFileSnapshot,c as writeConfigFile}from"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./model-catalog-C6UrZ0uG.js";import"./sandbox-BZibn6PX.js";import"./chrome-a3X9_-nf.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DJZT7Upf.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-BzfLvF8W.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-CdanN_ZI.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import{n as fetchWithTimeout}from"./fetch-timeout-BIqoSVfA.js";import{_ as isBuilderForceAgentsProject,n as loadProjectContext,o as updateProjectContextFields}from"./project-context-store-wcq7lXuI.js";import"./client-xfoidwPI.js";import"./call-BbRf8gFM.js";import"./builderforcellm-syscheck-DrFJ638L.js";import"./usage-format-DGf8ZWPH.js";import{f as initializeBuilderForceAgentsProject}from"./project-context-CJj0Inz-.js";import{r as saveMambaState}from"./mamba-state-engine-CoGqoBTH.js";import"./transformers-stream-D7nRu4Qu.js";import"./builderforce-directory-sync-DAH62b3b.js";import"./shared-BPN3qd7G.js";import{_ as setOpenrouterApiKey,c as setAnthropicApiKey,u as setGeminiApiKey}from"./onboard-auth.credentials-BuT-etnE.js";import"./model-picker-BUePD7Zg.js";import"./auth-choice.apply.transformers-CIn3fs7K.js";import{t as runTui}from"./tui-DylWbrDx.js";import"./tui-stream-assembler-ign_cPkv.js";import path from"node:path";import fs from"node:fs/promises";import{confirm,intro,note,outro,password,select,spinner,text}from"@clack/prompts";import{Command}from"commander";const DEFAULT_REGISTRY_URL=`https://api.builderforce.ai`;function resolveRegistryUrl(){return normalizeBaseUrl(readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_URL`)??DEFAULT_REGISTRY_URL)}function resolveAuthHeaders(){let apiKey=readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_API_KEY`);return apiKey?{Authorization:`Bearer ${apiKey}`}:{}}function isV2Package(pkg){return pkg.version===`2.0`}async function fetchAgentPackage(params){let url=`${normalizeBaseUrl(params.registryUrl??resolveRegistryUrl())}/api/agents/${encodeURIComponent(params.agentId)}/package`,res;try{res=await fetchWithTimeout(url,{method:`GET`,headers:{Accept:`application/json`,...resolveAuthHeaders()}},3e4)}catch(err){let msg=err instanceof Error?err.message:String(err);throw Error(`Network error fetching agent package: ${msg}`,{cause:err})}if(!res.ok){let text=await res.text().catch(()=>``);throw Error(`Registry returned ${res.status} ${res.statusText}${text?`: ${text}`:``}`)}let pkg=await res.json();if(!pkg.version||!pkg.platform||!pkg.name||!pkg.base_model)throw Error(`Invalid agent package: missing required fields (version, platform, name, base_model)`);return pkg}function resolveWorkforceModelRef(params){return readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_API_KEY`)?`builderforcellm/workforce-${params.agentId}`:params.pkg.base_model}async function installWorkforceAgent(params){let registryUrl=params.registryUrl??resolveRegistryUrl(),spin=spinner();spin.start(`Fetching agent package for "${params.agentId}" from ${registryUrl}…`);let pkg;try{pkg=await fetchAgentPackage({agentId:params.agentId,registryUrl}),spin.stop(`Package downloaded: ${pkg.name} (v${pkg.version})`)}catch(err){throw spin.stop(`Failed to download agent package`),err}let modelRef=resolveWorkforceModelRef({agentId:params.agentId,pkg}),hasMambaState=isV2Package(pkg)&&!!pkg.mamba_state,installed={agentId:params.agentId,name:pkg.name,title:pkg.title,baseModel:pkg.base_model,modelRef,loraArtifactKey:pkg.r2_artifact_key,packageVersion:pkg.version,hasMambaState,installedAt:new Date().toISOString(),registryUrl};return await updateProjectContextFields(params.projectRoot,{customAgent:installed,llm:{provider:`builderforcellm`,model:modelRef}}),hasMambaState&&isV2Package(pkg)&&pkg.mamba_state&&await saveMambaState(params.projectRoot,pkg.mamba_state),[`Workforce agent installed: ${pkg.name} (${params.agentId})`,` Base model: ${pkg.base_model}`,` Package: v${pkg.version}`,` Mamba state: ${hasMambaState?`yes (persistent memory)`:`no`}`,` Model ref: ${modelRef}`].join(`
2
2
  `)}async function showWorkforceAgentInfo(projectRoot){let ctx=await loadProjectContext(projectRoot);if(!ctx?.customAgent){note(`No Workforce agent is installed in this project.
3
3
 
4
4
  Run: builderforce agent install <agentId>`,`No agent installed`);return}let a=ctx.customAgent;note([theme.heading(`Workforce Agent`),` ID: ${a.agentId}`,` Name: ${a.name}${a.title?` — ${a.title}`:``}`,` Base model: ${a.baseModel}`,` Model ref: ${a.modelRef}`,` Package: v${a.packageVersion}`,` Mamba state: ${a.hasMambaState?`yes (persistent memory)`:`no`}`,` Installed: ${a.installedAt}`,` Registry: ${a.registryUrl}`].join(`
@@ -1,2 +1,2 @@
1
- import"../../paths-BVMSM1lQ.js";import{d as resolveAgentIdFromSessionKey,l as normalizeAgentId,u as normalizeMainKey}from"../../session-key-CYpYHc1e.js";import{r as DEFAULT_CHAT_CHANNEL}from"../../registry-D_frpmHZ.js";import{a as resolveAgentModelPrimary,l as resolveEffectiveModelFallbacks,o as resolveAgentSkillsFilter,r as resolveAgentDir,s as resolveAgentWorkspaceDir,t as listAgentIds,u as resolveSessionAgentId}from"../../agent-scope-EkacNLg3.js";import{r as defaultRuntime,t as createSubsystemLogger}from"../../subsystem-BakM_oqD.js";import{h as resolveWorkspaceFilePath,l as ensureAgentWorkspace}from"../../workspace-BCjtHT4u.js";import{Ct as DEFAULT_CONTEXT_TOKENS,Tt as DEFAULT_PROVIDER,a as isCliProvider,d as resolveConfiguredModelRef,g as resolveThinkingDefault,mt as ensureAuthProfileStore,o as modelKey,s as normalizeModelRef,t as buildAllowedModelSet,wt as DEFAULT_MODEL}from"../../model-selection-BJ0saFZo.js";import{n as formatCliCommand}from"../../env-BhRm7_r8.js";import"../../boolean-ssGoaBPk.js";import"../../src-CLWuGn12.js";import{A as clearSessionAuthProfileOverride,C as deriveSessionTotalTokens,D as getRemoteSkillEligibility,E as resolveSendPolicy,G as formatOutboundPayloadLog,J as clearAgentRunContext,K as normalizeOutboundPayloads,M as applyVerboseOverride,O as getSkillsSnapshotVersion,U as resolveAgentTimeoutMs,W as deliverOutboundPayloads,X as registerAgentRunContext,Y as emitAgentEvent,Z as runWithModelFallback,_ as resolveOutboundTarget,b as AGENT_LANE_SUBAGENT,g as runCliAgent,h as setCliSessionId,j as applyModelOverrideToSessionEntry,k as lookupContextTokens,m as getCliSessionId,q as normalizeOutboundPayloadsForJson,t as runEmbeddedAgent,v as resolveSessionDeliveryTarget,w as hasNonzeroUsage,y as AGENT_LANE_NESTED}from"../../embedded-DXDHduG1.js";import{s as SILENT_REPLY_TOKEN}from"../../replies-BG-eHErp.js";import{r as normalizeChannelId,t as getChannelPlugin}from"../../plugins-J28Y83f5.js";import"../../accounts-193gfWbH.js";import"../../bindings-BfB5A-by.js";import"../../send-DcxNvcKU.js";import"../../send-d9H-BT6p.js";import"../../accounts-DHeA4T6C.js";import"../../send-BxVr1pPI.js";import"../../fetch-BklyLYYN.js";import{n as loadModelCatalog}from"../../model-catalog-Abk8cdEI.js";import"../../redact-sNZY-pGx.js";import"../../errors-BmztzL5I.js";import{$t as resolveChannelResetConfig,An as buildWorkspaceSkillSnapshot,H as normalizeThinkLevel,Ht as normalizeAccountId,K as supportsXHighThinking,L as formatThinkingLevels,Nt as updateSessionStore,Qt as evaluateSessionFreshness,R as formatXHighModelHint,W as normalizeVerboseLevel,Zt as resolveSessionKey,en as resolveSessionResetPolicy,kt as loadSessionStore,on as resolveExplicitAgentSessionKey,sn as resolveMainSessionKey,tn as resolveSessionResetType}from"../../runner-B70PGCqP.js";import{n as loadConfig}from"../../config-bxyMjPHU.js";import"../../chrome-Blk2Jftn.js";import"../../frontmatter-DBVosMFY.js";import"../../store-DN9AcI73.js";import{i as isInternalMessageChannel,l as resolveMessageChannel,n as isDeliverableMessageChannel,r as isGatewayMessageChannel,s as normalizeMessageChannel,t as INTERNAL_MESSAGE_CHANNEL}from"../../message-channel-tBuQgYSD.js";import"../../accounts-C7FtIPYB.js";import{n as resolveSessionFilePath,s as resolveStorePath}from"../../paths-CzXKnIOb.js";import"../../gemini-auth-CzGGgJ0p.js";import"../../tool-images-mfC2sOfJ.js";import"../../config-DfXnxW-V.js";import"../../reply-prefix-me5vnbrB.js";import"../../sqlite-D3Ov16zb.js";import"../../manager-BdFSM6B3.js";import"../../retry-BYnMCvOU.js";import"../../common-CDXsNQYT.js";import"../../chunk-CrsAQ01n.js";import"../../markdown-tables-DvSC1OTb.js";import"../../ir-Ct8GNKB7.js";import"../../render-CVWbhuqU.js";import"../../send-ZeI8StQK.js";import"../../outbound-attachment-U-XtahS5.js";import"../../fetch-Jq1KZsRq.js";import"../../send-CqER7CIV.js";import"../../resolve-route-CGe48x_Z.js";import"../../channel-activity-xLea9vdo.js";import"../../tables-Desw59m6.js";import"../../active-listener-BQLkI7vg.js";import fs from"node:fs/promises";import crypto from"node:crypto";function createDefaultDeps(){return{sendMessageWhatsApp:async(...args)=>{let{sendMessageWhatsApp}=await import(`../../web-D44jKC1F.js`);return await sendMessageWhatsApp(...args)},sendMessageTelegram:async(...args)=>{let{sendMessageTelegram}=await import(`../../send-BxVr1pPI.js`).then(n=>n.l);return await sendMessageTelegram(...args)},sendMessageDiscord:async(...args)=>{let{sendMessageDiscord}=await import(`../../send-d9H-BT6p.js`).then(n=>n.t);return await sendMessageDiscord(...args)},sendMessageSlack:async(...args)=>{let{sendMessageSlack}=await import(`../../send-DcxNvcKU.js`).then(n=>n.n);return await sendMessageSlack(...args)},sendMessageSignal:async(...args)=>{let{sendMessageSignal}=await import(`../../send-ZeI8StQK.js`).then(n=>n.i);return await sendMessageSignal(...args)},sendMessageIMessage:async(...args)=>{let{sendMessageIMessage}=await import(`../../send-CqER7CIV.js`).then(n=>n.n);return await sendMessageIMessage(...args)}}}function createOutboundSendDeps(deps){return{sendWhatsApp:deps.sendMessageWhatsApp,sendTelegram:deps.sendMessageTelegram,sendDiscord:deps.sendMessageDiscord,sendSlack:deps.sendMessageSlack,sendSignal:deps.sendMessageSignal,sendIMessage:deps.sendMessageIMessage}}function resolveAgentDeliveryPlan(params){let requestedRaw=typeof params.requestedChannel==`string`?params.requestedChannel.trim():``,requestedChannel=(requestedRaw?normalizeMessageChannel(requestedRaw):void 0)||`last`,explicitTo=typeof params.explicitTo==`string`&&params.explicitTo.trim()?params.explicitTo.trim():void 0,baseDelivery=resolveSessionDeliveryTarget({entry:params.sessionEntry,requestedChannel:requestedChannel===INTERNAL_MESSAGE_CHANNEL?`last`:requestedChannel,explicitTo,explicitThreadId:params.explicitThreadId}),resolvedChannel=requestedChannel===INTERNAL_MESSAGE_CHANNEL?INTERNAL_MESSAGE_CHANNEL:requestedChannel===`last`?baseDelivery.channel&&baseDelivery.channel!==INTERNAL_MESSAGE_CHANNEL?baseDelivery.channel:params.wantsDelivery?DEFAULT_CHAT_CHANNEL:INTERNAL_MESSAGE_CHANNEL:isGatewayMessageChannel(requestedChannel)?requestedChannel:baseDelivery.channel&&baseDelivery.channel!==INTERNAL_MESSAGE_CHANNEL?baseDelivery.channel:params.wantsDelivery?DEFAULT_CHAT_CHANNEL:INTERNAL_MESSAGE_CHANNEL,deliveryTargetMode=explicitTo?`explicit`:isDeliverableMessageChannel(resolvedChannel)?`implicit`:void 0,resolvedAccountId=normalizeAccountId(params.accountId)??(deliveryTargetMode===`implicit`?baseDelivery.accountId:void 0),resolvedTo=explicitTo;return!resolvedTo&&isDeliverableMessageChannel(resolvedChannel)&&resolvedChannel===baseDelivery.lastChannel&&(resolvedTo=baseDelivery.lastTo),{baseDelivery,resolvedChannel,resolvedTo,resolvedAccountId,resolvedThreadId:baseDelivery.threadId,deliveryTargetMode}}function resolveAgentOutboundTarget(params){let targetMode=params.targetMode??params.plan.deliveryTargetMode??(params.plan.resolvedTo?`explicit`:`implicit`);if(!isDeliverableMessageChannel(params.plan.resolvedChannel)||params.validateExplicitTarget!==!0&&params.plan.resolvedTo)return{resolvedTarget:null,resolvedTo:params.plan.resolvedTo,targetMode};let resolvedTarget=resolveOutboundTarget({channel:params.plan.resolvedChannel,to:params.plan.resolvedTo,cfg:params.cfg,accountId:params.plan.resolvedAccountId,mode:targetMode});return{resolvedTarget,resolvedTo:resolvedTarget.ok?resolvedTarget.to:params.plan.resolvedTo,targetMode}}const isOutboundPayloadJson=payload=>`mediaUrl`in payload;function buildOutboundResultEnvelope(params){let hasPayloads=params.payloads!==void 0,payloads=params.payloads===void 0?void 0:params.payloads.length===0?[]:isOutboundPayloadJson(params.payloads[0])?params.payloads:normalizeOutboundPayloadsForJson(params.payloads);return params.flattenDelivery!==!1&&params.delivery&&!params.meta&&!hasPayloads?params.delivery:{...hasPayloads?{payloads}:{},...params.meta?{meta:params.meta}:{},...params.delivery?{delivery:params.delivery}:{}}}function formatNestedLogPrefix(opts){let parts=[`[agent:nested]`],session=opts.sessionKey??opts.sessionId;session&&parts.push(`session=${session}`),opts.runId&&parts.push(`run=${opts.runId}`);let channel=opts.messageChannel??opts.channel;return channel&&parts.push(`channel=${channel}`),opts.to&&parts.push(`to=${opts.to}`),opts.accountId&&parts.push(`account=${opts.accountId}`),parts.join(` `)}function logNestedOutput(runtime,opts,output){let prefix=formatNestedLogPrefix(opts);for(let line of output.split(/\r?\n/))line&&runtime.log(`${prefix} ${line}`)}async function deliverAgentCommandResult(params){let{cfg,deps,runtime,opts,sessionEntry,payloads,result}=params,deliver=opts.deliver===!0,bestEffortDeliver=opts.bestEffortDeliver===!0,deliveryPlan=resolveAgentDeliveryPlan({sessionEntry,requestedChannel:opts.replyChannel??opts.channel,explicitTo:opts.replyTo??opts.to,explicitThreadId:opts.threadId,accountId:opts.replyAccountId??opts.accountId,wantsDelivery:deliver}),deliveryChannel=deliveryPlan.resolvedChannel,deliveryPlugin=isInternalMessageChannel(deliveryChannel)?void 0:getChannelPlugin(normalizeChannelId(deliveryChannel)??deliveryChannel),isDeliveryChannelKnown=isInternalMessageChannel(deliveryChannel)||!!deliveryPlugin,targetMode=opts.deliveryTargetMode??deliveryPlan.deliveryTargetMode??(opts.to?`explicit`:`implicit`),resolvedAccountId=deliveryPlan.resolvedAccountId,resolved=deliver&&isDeliveryChannelKnown&&deliveryChannel?resolveAgentOutboundTarget({cfg,plan:deliveryPlan,targetMode,validateExplicitTarget:!0}):{resolvedTarget:null,resolvedTo:deliveryPlan.resolvedTo,targetMode},resolvedTarget=resolved.resolvedTarget,deliveryTarget=resolved.resolvedTo,resolvedThreadId=deliveryPlan.resolvedThreadId??opts.threadId,resolvedReplyToId=deliveryChannel===`slack`&&resolvedThreadId!=null?String(resolvedThreadId):void 0,resolvedThreadTarget=deliveryChannel===`slack`?void 0:resolvedThreadId,logDeliveryError=err=>{let message=`Delivery failed (${deliveryChannel}${deliveryTarget?` to ${deliveryTarget}`:``}): ${String(err)}`;runtime.error?.(message),runtime.error||runtime.log(message)};if(deliver){if(!isDeliveryChannelKnown){let err=Error(`Unknown channel: ${deliveryChannel}`);if(!bestEffortDeliver)throw err;logDeliveryError(err)}else if(resolvedTarget&&!resolvedTarget.ok){if(!bestEffortDeliver)throw resolvedTarget.error;logDeliveryError(resolvedTarget.error)}}let normalizedPayloads=normalizeOutboundPayloadsForJson(payloads??[]);if(opts.json&&(runtime.log(JSON.stringify(buildOutboundResultEnvelope({payloads:normalizedPayloads,meta:result.meta}),null,2)),!deliver))return{payloads:normalizedPayloads,meta:result.meta};if(!payloads||payloads.length===0)return runtime.log(`No reply from agent.`),{payloads:[],meta:result.meta};let deliveryPayloads=normalizeOutboundPayloads(payloads),logPayload=payload=>{if(opts.json)return;let output=formatOutboundPayloadLog(payload);if(output){if(opts.lane===AGENT_LANE_NESTED){logNestedOutput(runtime,opts,output);return}runtime.log(output)}};if(!deliver)for(let payload of deliveryPayloads)logPayload(payload);return deliver&&deliveryChannel&&!isInternalMessageChannel(deliveryChannel)&&deliveryTarget&&await deliverOutboundPayloads({cfg,channel:deliveryChannel,to:deliveryTarget,accountId:resolvedAccountId,payloads:deliveryPayloads,agentId:opts.agentId??(opts.sessionKey?resolveSessionAgentId({sessionKey:opts.sessionKey,config:cfg}):void 0),replyToId:resolvedReplyToId??null,threadId:resolvedThreadTarget??null,bestEffort:bestEffortDeliver,onError:err=>logDeliveryError(err),onPayload:logPayload,deps:createOutboundSendDeps(deps)}),{payloads:normalizedPayloads,meta:result.meta}}function resolveAgentRunContext(opts){let merged=opts.runContext?{...opts.runContext}:{},normalizedChannel=resolveMessageChannel(merged.messageChannel??opts.messageChannel,opts.replyChannel??opts.channel);normalizedChannel&&(merged.messageChannel=normalizedChannel);let normalizedAccountId=normalizeAccountId(merged.accountId??opts.accountId);normalizedAccountId&&(merged.accountId=normalizedAccountId);let groupId=(merged.groupId??opts.groupId)?.toString().trim();groupId&&(merged.groupId=groupId);let groupChannel=(merged.groupChannel??opts.groupChannel)?.toString().trim();groupChannel&&(merged.groupChannel=groupChannel);let groupSpace=(merged.groupSpace??opts.groupSpace)?.toString().trim();if(groupSpace&&(merged.groupSpace=groupSpace),merged.currentThreadTs==null&&opts.threadId!=null&&opts.threadId!==``&&opts.threadId!==null&&(merged.currentThreadTs=String(opts.threadId)),!merged.currentChannelId&&opts.to){let trimmedTo=opts.to.trim();trimmedTo&&(merged.currentChannelId=trimmedTo)}return merged}async function updateSessionStoreAfterAgentRun(params){let{cfg,sessionId,sessionKey,storePath,sessionStore,defaultProvider,defaultModel,fallbackProvider,fallbackModel,result}=params,usage=result.meta.agentMeta?.usage,promptTokens=result.meta.agentMeta?.promptTokens,compactionsThisRun=Math.max(0,result.meta.agentMeta?.compactionCount??0),modelUsed=result.meta.agentMeta?.model??fallbackModel??defaultModel,providerUsed=result.meta.agentMeta?.provider??fallbackProvider??defaultProvider,contextTokens=params.contextTokensOverride??lookupContextTokens(modelUsed)??DEFAULT_CONTEXT_TOKENS,entry=sessionStore[sessionKey]??{sessionId,updatedAt:Date.now()},next={...entry,sessionId,updatedAt:Date.now(),modelProvider:providerUsed,model:modelUsed,contextTokens};if(isCliProvider(providerUsed,cfg)){let cliSessionId=result.meta.agentMeta?.sessionId?.trim();cliSessionId&&setCliSessionId(next,providerUsed,cliSessionId)}if(next.abortedLastRun=result.meta.aborted??!1,hasNonzeroUsage(usage)){let input=usage.input??0,output=usage.output??0,totalTokens=deriveSessionTotalTokens({usage,contextTokens,promptTokens})??input;next.inputTokens=input,next.outputTokens=output,next.totalTokens=totalTokens,next.totalTokensFresh=!0}compactionsThisRun>0&&(next.compactionCount=(entry.compactionCount??0)+compactionsThisRun),sessionStore[sessionKey]=next,await updateSessionStore(storePath,store=>{store[sessionKey]=next})}function resolveSessionKeyForRequest(opts){let sessionCfg=opts.cfg.session,scope=sessionCfg?.scope??`per-sender`,mainKey=normalizeMainKey(sessionCfg?.mainKey),explicitSessionKey=opts.sessionKey?.trim()||resolveExplicitAgentSessionKey({cfg:opts.cfg,agentId:opts.agentId}),storeAgentId=resolveAgentIdFromSessionKey(explicitSessionKey),storePath=resolveStorePath(sessionCfg?.store,{agentId:storeAgentId}),sessionStore=loadSessionStore(storePath),ctx=opts.to?.trim()?{From:opts.to}:void 0,sessionKey=explicitSessionKey??(ctx?resolveSessionKey(scope,ctx,mainKey):void 0);if(!explicitSessionKey&&opts.sessionId&&(!sessionKey||sessionStore[sessionKey]?.sessionId!==opts.sessionId)){let foundKey=Object.keys(sessionStore).find(key=>sessionStore[key]?.sessionId===opts.sessionId);foundKey&&(sessionKey=foundKey)}if(opts.sessionId&&!explicitSessionKey&&(!sessionKey||sessionStore[sessionKey]?.sessionId!==opts.sessionId)){let allAgentIds=listAgentIds(opts.cfg);for(let agentId of allAgentIds){if(agentId===storeAgentId)continue;let altStorePath=resolveStorePath(sessionCfg?.store,{agentId}),altStore=loadSessionStore(altStorePath),foundKey=Object.keys(altStore).find(key=>altStore[key]?.sessionId===opts.sessionId);if(foundKey)return{sessionKey:foundKey,sessionStore:altStore,storePath:altStorePath}}}return{sessionKey,sessionStore,storePath}}function resolveSession(opts){let sessionCfg=opts.cfg.session,{sessionKey,sessionStore,storePath}=resolveSessionKeyForRequest({cfg:opts.cfg,to:opts.to,sessionId:opts.sessionId,sessionKey:opts.sessionKey,agentId:opts.agentId}),now=Date.now(),sessionEntry=sessionKey?sessionStore[sessionKey]:void 0,resetPolicy=resolveSessionResetPolicy({sessionCfg,resetType:resolveSessionResetType({sessionKey}),resetOverride:resolveChannelResetConfig({sessionCfg,channel:sessionEntry?.lastChannel??sessionEntry?.channel})}),fresh=sessionEntry?evaluateSessionFreshness({updatedAt:sessionEntry.updatedAt,now,policy:resetPolicy}).fresh:!1;return{sessionId:opts.sessionId?.trim()||(fresh?sessionEntry?.sessionId:void 0)||crypto.randomUUID(),sessionKey,sessionEntry,sessionStore,storePath,isNewSession:!fresh&&!opts.sessionId,persistedThinking:fresh&&sessionEntry?.thinkingLevel?normalizeThinkLevel(sessionEntry.thinkingLevel):void 0,persistedVerbose:fresh&&sessionEntry?.verboseLevel?normalizeVerboseLevel(sessionEntry.verboseLevel):void 0}}async function persistSessionEntry(params){params.sessionStore[params.sessionKey]=params.entry,await updateSessionStore(params.storePath,store=>{store[params.sessionKey]=params.entry})}function resolveFallbackRetryPrompt(params){return params.isFallbackRetry?`Continue where you left off. The previous model attempt failed or timed out.`:params.body}function runAgentAttempt(params){let effectivePrompt=resolveFallbackRetryPrompt({body:params.body,isFallbackRetry:params.isFallbackRetry});if(isCliProvider(params.providerOverride,params.cfg)){let cliSessionId=getCliSessionId(params.sessionEntry,params.providerOverride);return runCliAgent({sessionId:params.sessionId,sessionKey:params.sessionKey,agentId:params.sessionAgentId,sessionFile:params.sessionFile,workspaceDir:params.workspaceDir,config:params.cfg,prompt:effectivePrompt,provider:params.providerOverride,model:params.modelOverride,thinkLevel:params.resolvedThinkLevel,timeoutMs:params.timeoutMs,runId:params.runId,extraSystemPrompt:params.opts.extraSystemPrompt,cliSessionId,images:params.isFallbackRetry?void 0:params.opts.images,streamParams:params.opts.streamParams})}let authProfileId=params.providerOverride===params.primaryProvider?params.sessionEntry?.authProfileOverride:void 0;return runEmbeddedAgent({sessionId:params.sessionId,sessionKey:params.sessionKey,agentId:params.sessionAgentId,messageChannel:params.messageChannel,agentAccountId:params.runContext.accountId,messageTo:params.opts.replyTo??params.opts.to,messageThreadId:params.opts.threadId,groupId:params.runContext.groupId,groupChannel:params.runContext.groupChannel,groupSpace:params.runContext.groupSpace,spawnedBy:params.spawnedBy,currentChannelId:params.runContext.currentChannelId,currentThreadTs:params.runContext.currentThreadTs,replyToMode:params.runContext.replyToMode,hasRepliedRef:params.runContext.hasRepliedRef,senderIsOwner:!0,sessionFile:params.sessionFile,workspaceDir:params.workspaceDir,config:params.cfg,skillsSnapshot:params.skillsSnapshot,prompt:effectivePrompt,images:params.isFallbackRetry?void 0:params.opts.images,clientTools:params.opts.clientTools,provider:params.providerOverride,model:params.modelOverride,authProfileId,authProfileIdSource:authProfileId?params.sessionEntry?.authProfileOverrideSource:void 0,thinkLevel:params.resolvedThinkLevel,verboseLevel:params.resolvedVerboseLevel,timeoutMs:params.timeoutMs,runId:params.runId,lane:params.opts.lane,abortSignal:params.opts.abortSignal,extraSystemPrompt:params.opts.extraSystemPrompt,inputProvenance:params.opts.inputProvenance,streamParams:params.opts.streamParams,agentDir:params.agentDir,onAgentEvent:params.onAgentEvent})}async function agentCommand(opts,runtime=defaultRuntime,deps=createDefaultDeps()){let body=(opts.message??``).trim();if(!body)throw Error(`Message (--message) is required`);if(!opts.to&&!opts.sessionId&&!opts.sessionKey&&!opts.agentId)throw Error(`Pass --to <E.164>, --session-id, or --agent to choose a session`);let cfg=loadConfig(),agentIdOverrideRaw=opts.agentId?.trim(),agentIdOverride=agentIdOverrideRaw?normalizeAgentId(agentIdOverrideRaw):void 0;if(agentIdOverride&&!listAgentIds(cfg).includes(agentIdOverride))throw Error(`Unknown agent id "${agentIdOverrideRaw}". Use "${formatCliCommand(`builderforce agents list`)}" to see configured agents.`);if(agentIdOverride&&opts.sessionKey){let sessionAgentId=resolveAgentIdFromSessionKey(opts.sessionKey);if(sessionAgentId!==agentIdOverride)throw Error(`Agent id "${agentIdOverrideRaw}" does not match session key agent "${sessionAgentId}".`)}let agentCfg=cfg.agents?.defaults,sessionAgentId=agentIdOverride??resolveAgentIdFromSessionKey(opts.sessionKey?.trim()),workspaceDirRaw=resolveAgentWorkspaceDir(cfg,sessionAgentId),agentDir=resolveAgentDir(cfg,sessionAgentId),workspaceDir=(await ensureAgentWorkspace({dir:workspaceDirRaw,ensureBootstrapFiles:!agentCfg?.skipBootstrap})).dir,configuredModel=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),thinkingLevelsHint=formatThinkingLevels(configuredModel.provider,configuredModel.model),thinkOverride=normalizeThinkLevel(opts.thinking),thinkOnce=normalizeThinkLevel(opts.thinkingOnce);if(opts.thinking&&!thinkOverride)throw Error(`Invalid thinking level. Use one of: ${thinkingLevelsHint}.`);if(opts.thinkingOnce&&!thinkOnce)throw Error(`Invalid one-shot thinking level. Use one of: ${thinkingLevelsHint}.`);let verboseOverride=normalizeVerboseLevel(opts.verbose);if(opts.verbose&&!verboseOverride)throw Error(`Invalid verbose level. Use "on", "full", or "off".`);let isSubagentLane=(typeof opts.lane==`string`?opts.lane.trim():``)===String(AGENT_LANE_SUBAGENT),timeoutSecondsRaw=opts.timeout===void 0?isSubagentLane?0:void 0:Number.parseInt(String(opts.timeout),10);if(timeoutSecondsRaw!==void 0&&(Number.isNaN(timeoutSecondsRaw)||timeoutSecondsRaw<0))throw Error(`--timeout must be a non-negative integer (seconds; 0 means no timeout)`);let timeoutMs=resolveAgentTimeoutMs({cfg,overrideSeconds:timeoutSecondsRaw}),{sessionId,sessionKey,sessionEntry:resolvedSessionEntry,sessionStore,storePath,isNewSession,persistedThinking,persistedVerbose}=resolveSession({cfg,to:opts.to,sessionId:opts.sessionId,sessionKey:opts.sessionKey,agentId:agentIdOverride}),sessionEntry=resolvedSessionEntry,runId=opts.runId?.trim()||sessionId;try{if(opts.deliver===!0&&resolveSendPolicy({cfg,entry:sessionEntry,sessionKey,channel:sessionEntry?.channel,chatType:sessionEntry?.chatType})===`deny`)throw Error(`send blocked by session policy`);let resolvedThinkLevel=thinkOnce??thinkOverride??persistedThinking??agentCfg?.thinkingDefault,resolvedVerboseLevel=verboseOverride??persistedVerbose??agentCfg?.verboseDefault??`on`;sessionKey&&registerAgentRunContext(runId,{sessionKey,verboseLevel:resolvedVerboseLevel});let needsSkillsSnapshot=isNewSession||!sessionEntry?.skillsSnapshot,skillsSnapshotVersion=getSkillsSnapshotVersion(workspaceDir),skillFilter=resolveAgentSkillsFilter(cfg,sessionAgentId),skillsSnapshot=needsSkillsSnapshot?buildWorkspaceSkillSnapshot(workspaceDir,{config:cfg,eligibility:{remote:getRemoteSkillEligibility()},snapshotVersion:skillsSnapshotVersion,skillFilter}):sessionEntry?.skillsSnapshot;if(skillsSnapshot&&sessionStore&&sessionKey&&needsSkillsSnapshot){let next={...sessionEntry??{sessionId,updatedAt:Date.now()},sessionId,updatedAt:Date.now(),skillsSnapshot};await persistSessionEntry({sessionStore,sessionKey,storePath,entry:next}),sessionEntry=next}if(sessionStore&&sessionKey){let next={...sessionStore[sessionKey]??sessionEntry??{sessionId,updatedAt:Date.now()},sessionId,updatedAt:Date.now()};thinkOverride&&(next.thinkingLevel=thinkOverride),applyVerboseOverride(next,verboseOverride),await persistSessionEntry({sessionStore,sessionKey,storePath,entry:next})}let agentModelPrimary=resolveAgentModelPrimary(cfg,sessionAgentId),configuredDefaultRef=resolveConfiguredModelRef({cfg:agentModelPrimary?{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,model:{...typeof cfg.agents?.defaults?.model==`object`?cfg.agents.defaults.model:void 0,primary:agentModelPrimary}}}}:cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),{provider:defaultProvider,model:defaultModel}=normalizeModelRef(configuredDefaultRef.provider,configuredDefaultRef.model),provider=defaultProvider,model=defaultModel,hasAllowlist=agentCfg?.models&&Object.keys(agentCfg.models).length>0,hasStoredOverride=!!(sessionEntry?.modelOverride||sessionEntry?.providerOverride),needsModelCatalog=hasAllowlist||hasStoredOverride,allowedModelKeys=new Set,allowedModelCatalog=[],modelCatalog=null;if(needsModelCatalog){modelCatalog=await loadModelCatalog({config:cfg});let allowed=buildAllowedModelSet({cfg,catalog:modelCatalog,defaultProvider,defaultModel});allowedModelKeys=allowed.allowedKeys,allowedModelCatalog=allowed.allowedCatalog}if(sessionEntry&&sessionStore&&sessionKey&&hasStoredOverride){let entry=sessionEntry,overrideProvider=sessionEntry.providerOverride?.trim()||defaultProvider,overrideModel=sessionEntry.modelOverride?.trim();if(overrideModel){let normalizedOverride=normalizeModelRef(overrideProvider,overrideModel),key=modelKey(normalizedOverride.provider,normalizedOverride.model);if(!isCliProvider(normalizedOverride.provider,cfg)&&allowedModelKeys.size>0&&!allowedModelKeys.has(key)){let{updated}=applyModelOverrideToSessionEntry({entry,selection:{provider:defaultProvider,model:defaultModel,isDefault:!0}});updated&&await persistSessionEntry({sessionStore,sessionKey,storePath,entry})}}}let storedProviderOverride=sessionEntry?.providerOverride?.trim(),storedModelOverride=sessionEntry?.modelOverride?.trim();if(storedModelOverride){let normalizedStored=normalizeModelRef(storedProviderOverride||defaultProvider,storedModelOverride),key=modelKey(normalizedStored.provider,normalizedStored.model);(isCliProvider(normalizedStored.provider,cfg)||allowedModelKeys.size===0||allowedModelKeys.has(key))&&(provider=normalizedStored.provider,model=normalizedStored.model)}if(sessionEntry){let authProfileId=sessionEntry.authProfileOverride;if(authProfileId){let entry=sessionEntry,profile=(await ensureAuthProfileStore()).profiles[authProfileId];(!profile||profile.provider!==provider)&&sessionStore&&sessionKey&&await clearSessionAuthProfileOverride({sessionEntry:entry,sessionStore,sessionKey,storePath})}}if(!resolvedThinkLevel){let catalogForThinking=modelCatalog??allowedModelCatalog;(!catalogForThinking||catalogForThinking.length===0)&&(modelCatalog=await loadModelCatalog({config:cfg}),catalogForThinking=modelCatalog),resolvedThinkLevel=resolveThinkingDefault({cfg,provider,model,catalog:catalogForThinking})}if(resolvedThinkLevel===`xhigh`&&!supportsXHighThinking(provider,model)){if(thinkOnce||thinkOverride)throw Error(`Thinking level "xhigh" is only supported for ${formatXHighModelHint()}.`);if(resolvedThinkLevel=`high`,sessionEntry&&sessionStore&&sessionKey&&sessionEntry.thinkingLevel===`xhigh`){let entry=sessionEntry;entry.thinkingLevel=`high`,entry.updatedAt=Date.now(),await persistSessionEntry({sessionStore,sessionKey,storePath,entry})}}let sessionFile=resolveSessionFilePath(sessionId,sessionEntry,{agentId:sessionAgentId}),startedAt=Date.now(),lifecycleEnded=!1,result,fallbackProvider=provider,fallbackModel=model;try{let runContext=resolveAgentRunContext(opts),messageChannel=resolveMessageChannel(runContext.messageChannel,opts.replyChannel??opts.channel),spawnedBy=opts.spawnedBy??sessionEntry?.spawnedBy,effectiveFallbacksOverride=resolveEffectiveModelFallbacks({cfg,agentId:sessionAgentId,hasSessionModelOverride:!!storedModelOverride}),fallbackAttemptIndex=0,fallbackResult=await runWithModelFallback({cfg,provider,model,agentDir,fallbacksOverride:effectiveFallbacksOverride,run:(providerOverride,modelOverride)=>{let isFallbackRetry=fallbackAttemptIndex>0;return fallbackAttemptIndex+=1,runAgentAttempt({providerOverride,modelOverride,cfg,sessionEntry,sessionId,sessionKey,sessionAgentId,sessionFile,workspaceDir,body,isFallbackRetry,resolvedThinkLevel,timeoutMs,runId,opts,runContext,spawnedBy,messageChannel,skillsSnapshot,resolvedVerboseLevel,agentDir,primaryProvider:provider,onAgentEvent:evt=>{evt.stream===`lifecycle`&&typeof evt.data?.phase==`string`&&(evt.data.phase===`end`||evt.data.phase===`error`)&&(lifecycleEnded=!0)}})}});result=fallbackResult.result,fallbackProvider=fallbackResult.provider,fallbackModel=fallbackResult.model,lifecycleEnded||emitAgentEvent({runId,stream:`lifecycle`,data:{phase:`end`,startedAt,endedAt:Date.now(),aborted:result.meta.aborted??!1}})}catch(err){throw lifecycleEnded||emitAgentEvent({runId,stream:`lifecycle`,data:{phase:`error`,startedAt,endedAt:Date.now(),error:String(err)}}),err}sessionStore&&sessionKey&&await updateSessionStoreAfterAgentRun({cfg,contextTokensOverride:agentCfg?.contextTokens,sessionId,sessionKey,storePath,sessionStore,defaultProvider:provider,defaultModel:model,fallbackProvider,fallbackModel,result});let payloads=result.payloads??[];return await deliverAgentCommandResult({cfg,deps,runtime,opts,sessionEntry,result,payloads})}finally{clearAgentRunContext(runId)}}function generateBootSessionId(){return`boot-${new Date().toISOString().replace(/[:.]/g,`-`).replace(`T`,`_`).replace(`Z`,``)}-${crypto.randomUUID().slice(0,8)}`}const log=createSubsystemLogger(`gateway/boot`),BOOT_FILENAME=`BOOT.md`;function buildBootPrompt(content){return[`You are running a boot check. Follow BOOT.md instructions exactly.`,``,`BOOT.md:`,content,``,`If BOOT.md asks you to send a message, use the message tool (action=send with channel + target).`,"Use the `target` field (not `to`) for message tool destinations.",`After sending with the message tool, reply with ONLY: ${SILENT_REPLY_TOKEN}.`,`If nothing needs attention, reply with ONLY: ${SILENT_REPLY_TOKEN}.`].join(`
1
+ import"../../paths-BVMSM1lQ.js";import{d as resolveAgentIdFromSessionKey,l as normalizeAgentId,u as normalizeMainKey}from"../../session-key-CYpYHc1e.js";import{r as DEFAULT_CHAT_CHANNEL}from"../../registry-D_frpmHZ.js";import{a as resolveAgentModelPrimary,l as resolveEffectiveModelFallbacks,o as resolveAgentSkillsFilter,r as resolveAgentDir,s as resolveAgentWorkspaceDir,t as listAgentIds,u as resolveSessionAgentId}from"../../agent-scope-EkacNLg3.js";import{r as defaultRuntime,t as createSubsystemLogger}from"../../subsystem-BakM_oqD.js";import{h as resolveWorkspaceFilePath,l as ensureAgentWorkspace}from"../../workspace-BCjtHT4u.js";import{Ct as DEFAULT_CONTEXT_TOKENS,Tt as DEFAULT_PROVIDER,a as isCliProvider,d as resolveConfiguredModelRef,g as resolveThinkingDefault,mt as ensureAuthProfileStore,o as modelKey,s as normalizeModelRef,t as buildAllowedModelSet,wt as DEFAULT_MODEL}from"../../model-selection-BJ0saFZo.js";import{n as formatCliCommand}from"../../env-BhRm7_r8.js";import"../../boolean-ssGoaBPk.js";import"../../src-CLWuGn12.js";import{A as clearSessionAuthProfileOverride,C as deriveSessionTotalTokens,D as getRemoteSkillEligibility,E as resolveSendPolicy,G as formatOutboundPayloadLog,J as clearAgentRunContext,K as normalizeOutboundPayloads,M as applyVerboseOverride,O as getSkillsSnapshotVersion,U as resolveAgentTimeoutMs,W as deliverOutboundPayloads,X as registerAgentRunContext,Y as emitAgentEvent,Z as runWithModelFallback,_ as resolveOutboundTarget,b as AGENT_LANE_SUBAGENT,g as runCliAgent,h as setCliSessionId,j as applyModelOverrideToSessionEntry,k as lookupContextTokens,m as getCliSessionId,q as normalizeOutboundPayloadsForJson,t as runEmbeddedAgent,v as resolveSessionDeliveryTarget,w as hasNonzeroUsage,y as AGENT_LANE_NESTED}from"../../embedded-BcHzh_y8.js";import{s as SILENT_REPLY_TOKEN}from"../../replies-BG-eHErp.js";import{r as normalizeChannelId,t as getChannelPlugin}from"../../plugins-J28Y83f5.js";import"../../accounts-193gfWbH.js";import"../../bindings-BfB5A-by.js";import"../../send-DcxNvcKU.js";import"../../send-d9H-BT6p.js";import"../../accounts-DHeA4T6C.js";import"../../send-BxVr1pPI.js";import"../../fetch-BklyLYYN.js";import{n as loadModelCatalog}from"../../model-catalog-Abk8cdEI.js";import"../../redact-sNZY-pGx.js";import"../../errors-BmztzL5I.js";import{$t as resolveChannelResetConfig,An as buildWorkspaceSkillSnapshot,H as normalizeThinkLevel,Ht as normalizeAccountId,K as supportsXHighThinking,L as formatThinkingLevels,Nt as updateSessionStore,Qt as evaluateSessionFreshness,R as formatXHighModelHint,W as normalizeVerboseLevel,Zt as resolveSessionKey,en as resolveSessionResetPolicy,kt as loadSessionStore,on as resolveExplicitAgentSessionKey,sn as resolveMainSessionKey,tn as resolveSessionResetType}from"../../runner-D7af_RBH.js";import{n as loadConfig}from"../../config-bxyMjPHU.js";import"../../chrome-CtTMuhww.js";import"../../frontmatter-DBVosMFY.js";import"../../store-DN9AcI73.js";import{i as isInternalMessageChannel,l as resolveMessageChannel,n as isDeliverableMessageChannel,r as isGatewayMessageChannel,s as normalizeMessageChannel,t as INTERNAL_MESSAGE_CHANNEL}from"../../message-channel-tBuQgYSD.js";import"../../accounts-C7FtIPYB.js";import{n as resolveSessionFilePath,s as resolveStorePath}from"../../paths-CzXKnIOb.js";import"../../gemini-auth-CzGGgJ0p.js";import"../../tool-images-mfC2sOfJ.js";import"../../config-DfXnxW-V.js";import"../../reply-prefix-me5vnbrB.js";import"../../sqlite-D3Ov16zb.js";import"../../manager-BdFSM6B3.js";import"../../retry-BYnMCvOU.js";import"../../common-CDXsNQYT.js";import"../../chunk-CrsAQ01n.js";import"../../markdown-tables-DvSC1OTb.js";import"../../ir-Ct8GNKB7.js";import"../../render-CVWbhuqU.js";import"../../send-ZeI8StQK.js";import"../../outbound-attachment-U-XtahS5.js";import"../../fetch-Jq1KZsRq.js";import"../../send-CqER7CIV.js";import"../../resolve-route-CGe48x_Z.js";import"../../channel-activity-xLea9vdo.js";import"../../tables-Desw59m6.js";import"../../active-listener-BQLkI7vg.js";import fs from"node:fs/promises";import crypto from"node:crypto";function createDefaultDeps(){return{sendMessageWhatsApp:async(...args)=>{let{sendMessageWhatsApp}=await import(`../../web-DPGGHIc_.js`);return await sendMessageWhatsApp(...args)},sendMessageTelegram:async(...args)=>{let{sendMessageTelegram}=await import(`../../send-BxVr1pPI.js`).then(n=>n.l);return await sendMessageTelegram(...args)},sendMessageDiscord:async(...args)=>{let{sendMessageDiscord}=await import(`../../send-d9H-BT6p.js`).then(n=>n.t);return await sendMessageDiscord(...args)},sendMessageSlack:async(...args)=>{let{sendMessageSlack}=await import(`../../send-DcxNvcKU.js`).then(n=>n.n);return await sendMessageSlack(...args)},sendMessageSignal:async(...args)=>{let{sendMessageSignal}=await import(`../../send-ZeI8StQK.js`).then(n=>n.i);return await sendMessageSignal(...args)},sendMessageIMessage:async(...args)=>{let{sendMessageIMessage}=await import(`../../send-CqER7CIV.js`).then(n=>n.n);return await sendMessageIMessage(...args)}}}function createOutboundSendDeps(deps){return{sendWhatsApp:deps.sendMessageWhatsApp,sendTelegram:deps.sendMessageTelegram,sendDiscord:deps.sendMessageDiscord,sendSlack:deps.sendMessageSlack,sendSignal:deps.sendMessageSignal,sendIMessage:deps.sendMessageIMessage}}function resolveAgentDeliveryPlan(params){let requestedRaw=typeof params.requestedChannel==`string`?params.requestedChannel.trim():``,requestedChannel=(requestedRaw?normalizeMessageChannel(requestedRaw):void 0)||`last`,explicitTo=typeof params.explicitTo==`string`&&params.explicitTo.trim()?params.explicitTo.trim():void 0,baseDelivery=resolveSessionDeliveryTarget({entry:params.sessionEntry,requestedChannel:requestedChannel===INTERNAL_MESSAGE_CHANNEL?`last`:requestedChannel,explicitTo,explicitThreadId:params.explicitThreadId}),resolvedChannel=requestedChannel===INTERNAL_MESSAGE_CHANNEL?INTERNAL_MESSAGE_CHANNEL:requestedChannel===`last`?baseDelivery.channel&&baseDelivery.channel!==INTERNAL_MESSAGE_CHANNEL?baseDelivery.channel:params.wantsDelivery?DEFAULT_CHAT_CHANNEL:INTERNAL_MESSAGE_CHANNEL:isGatewayMessageChannel(requestedChannel)?requestedChannel:baseDelivery.channel&&baseDelivery.channel!==INTERNAL_MESSAGE_CHANNEL?baseDelivery.channel:params.wantsDelivery?DEFAULT_CHAT_CHANNEL:INTERNAL_MESSAGE_CHANNEL,deliveryTargetMode=explicitTo?`explicit`:isDeliverableMessageChannel(resolvedChannel)?`implicit`:void 0,resolvedAccountId=normalizeAccountId(params.accountId)??(deliveryTargetMode===`implicit`?baseDelivery.accountId:void 0),resolvedTo=explicitTo;return!resolvedTo&&isDeliverableMessageChannel(resolvedChannel)&&resolvedChannel===baseDelivery.lastChannel&&(resolvedTo=baseDelivery.lastTo),{baseDelivery,resolvedChannel,resolvedTo,resolvedAccountId,resolvedThreadId:baseDelivery.threadId,deliveryTargetMode}}function resolveAgentOutboundTarget(params){let targetMode=params.targetMode??params.plan.deliveryTargetMode??(params.plan.resolvedTo?`explicit`:`implicit`);if(!isDeliverableMessageChannel(params.plan.resolvedChannel)||params.validateExplicitTarget!==!0&&params.plan.resolvedTo)return{resolvedTarget:null,resolvedTo:params.plan.resolvedTo,targetMode};let resolvedTarget=resolveOutboundTarget({channel:params.plan.resolvedChannel,to:params.plan.resolvedTo,cfg:params.cfg,accountId:params.plan.resolvedAccountId,mode:targetMode});return{resolvedTarget,resolvedTo:resolvedTarget.ok?resolvedTarget.to:params.plan.resolvedTo,targetMode}}const isOutboundPayloadJson=payload=>`mediaUrl`in payload;function buildOutboundResultEnvelope(params){let hasPayloads=params.payloads!==void 0,payloads=params.payloads===void 0?void 0:params.payloads.length===0?[]:isOutboundPayloadJson(params.payloads[0])?params.payloads:normalizeOutboundPayloadsForJson(params.payloads);return params.flattenDelivery!==!1&&params.delivery&&!params.meta&&!hasPayloads?params.delivery:{...hasPayloads?{payloads}:{},...params.meta?{meta:params.meta}:{},...params.delivery?{delivery:params.delivery}:{}}}function formatNestedLogPrefix(opts){let parts=[`[agent:nested]`],session=opts.sessionKey??opts.sessionId;session&&parts.push(`session=${session}`),opts.runId&&parts.push(`run=${opts.runId}`);let channel=opts.messageChannel??opts.channel;return channel&&parts.push(`channel=${channel}`),opts.to&&parts.push(`to=${opts.to}`),opts.accountId&&parts.push(`account=${opts.accountId}`),parts.join(` `)}function logNestedOutput(runtime,opts,output){let prefix=formatNestedLogPrefix(opts);for(let line of output.split(/\r?\n/))line&&runtime.log(`${prefix} ${line}`)}async function deliverAgentCommandResult(params){let{cfg,deps,runtime,opts,sessionEntry,payloads,result}=params,deliver=opts.deliver===!0,bestEffortDeliver=opts.bestEffortDeliver===!0,deliveryPlan=resolveAgentDeliveryPlan({sessionEntry,requestedChannel:opts.replyChannel??opts.channel,explicitTo:opts.replyTo??opts.to,explicitThreadId:opts.threadId,accountId:opts.replyAccountId??opts.accountId,wantsDelivery:deliver}),deliveryChannel=deliveryPlan.resolvedChannel,deliveryPlugin=isInternalMessageChannel(deliveryChannel)?void 0:getChannelPlugin(normalizeChannelId(deliveryChannel)??deliveryChannel),isDeliveryChannelKnown=isInternalMessageChannel(deliveryChannel)||!!deliveryPlugin,targetMode=opts.deliveryTargetMode??deliveryPlan.deliveryTargetMode??(opts.to?`explicit`:`implicit`),resolvedAccountId=deliveryPlan.resolvedAccountId,resolved=deliver&&isDeliveryChannelKnown&&deliveryChannel?resolveAgentOutboundTarget({cfg,plan:deliveryPlan,targetMode,validateExplicitTarget:!0}):{resolvedTarget:null,resolvedTo:deliveryPlan.resolvedTo,targetMode},resolvedTarget=resolved.resolvedTarget,deliveryTarget=resolved.resolvedTo,resolvedThreadId=deliveryPlan.resolvedThreadId??opts.threadId,resolvedReplyToId=deliveryChannel===`slack`&&resolvedThreadId!=null?String(resolvedThreadId):void 0,resolvedThreadTarget=deliveryChannel===`slack`?void 0:resolvedThreadId,logDeliveryError=err=>{let message=`Delivery failed (${deliveryChannel}${deliveryTarget?` to ${deliveryTarget}`:``}): ${String(err)}`;runtime.error?.(message),runtime.error||runtime.log(message)};if(deliver){if(!isDeliveryChannelKnown){let err=Error(`Unknown channel: ${deliveryChannel}`);if(!bestEffortDeliver)throw err;logDeliveryError(err)}else if(resolvedTarget&&!resolvedTarget.ok){if(!bestEffortDeliver)throw resolvedTarget.error;logDeliveryError(resolvedTarget.error)}}let normalizedPayloads=normalizeOutboundPayloadsForJson(payloads??[]);if(opts.json&&(runtime.log(JSON.stringify(buildOutboundResultEnvelope({payloads:normalizedPayloads,meta:result.meta}),null,2)),!deliver))return{payloads:normalizedPayloads,meta:result.meta};if(!payloads||payloads.length===0)return runtime.log(`No reply from agent.`),{payloads:[],meta:result.meta};let deliveryPayloads=normalizeOutboundPayloads(payloads),logPayload=payload=>{if(opts.json)return;let output=formatOutboundPayloadLog(payload);if(output){if(opts.lane===AGENT_LANE_NESTED){logNestedOutput(runtime,opts,output);return}runtime.log(output)}};if(!deliver)for(let payload of deliveryPayloads)logPayload(payload);return deliver&&deliveryChannel&&!isInternalMessageChannel(deliveryChannel)&&deliveryTarget&&await deliverOutboundPayloads({cfg,channel:deliveryChannel,to:deliveryTarget,accountId:resolvedAccountId,payloads:deliveryPayloads,agentId:opts.agentId??(opts.sessionKey?resolveSessionAgentId({sessionKey:opts.sessionKey,config:cfg}):void 0),replyToId:resolvedReplyToId??null,threadId:resolvedThreadTarget??null,bestEffort:bestEffortDeliver,onError:err=>logDeliveryError(err),onPayload:logPayload,deps:createOutboundSendDeps(deps)}),{payloads:normalizedPayloads,meta:result.meta}}function resolveAgentRunContext(opts){let merged=opts.runContext?{...opts.runContext}:{},normalizedChannel=resolveMessageChannel(merged.messageChannel??opts.messageChannel,opts.replyChannel??opts.channel);normalizedChannel&&(merged.messageChannel=normalizedChannel);let normalizedAccountId=normalizeAccountId(merged.accountId??opts.accountId);normalizedAccountId&&(merged.accountId=normalizedAccountId);let groupId=(merged.groupId??opts.groupId)?.toString().trim();groupId&&(merged.groupId=groupId);let groupChannel=(merged.groupChannel??opts.groupChannel)?.toString().trim();groupChannel&&(merged.groupChannel=groupChannel);let groupSpace=(merged.groupSpace??opts.groupSpace)?.toString().trim();if(groupSpace&&(merged.groupSpace=groupSpace),merged.currentThreadTs==null&&opts.threadId!=null&&opts.threadId!==``&&opts.threadId!==null&&(merged.currentThreadTs=String(opts.threadId)),!merged.currentChannelId&&opts.to){let trimmedTo=opts.to.trim();trimmedTo&&(merged.currentChannelId=trimmedTo)}return merged}async function updateSessionStoreAfterAgentRun(params){let{cfg,sessionId,sessionKey,storePath,sessionStore,defaultProvider,defaultModel,fallbackProvider,fallbackModel,result}=params,usage=result.meta.agentMeta?.usage,promptTokens=result.meta.agentMeta?.promptTokens,compactionsThisRun=Math.max(0,result.meta.agentMeta?.compactionCount??0),modelUsed=result.meta.agentMeta?.model??fallbackModel??defaultModel,providerUsed=result.meta.agentMeta?.provider??fallbackProvider??defaultProvider,contextTokens=params.contextTokensOverride??lookupContextTokens(modelUsed)??DEFAULT_CONTEXT_TOKENS,entry=sessionStore[sessionKey]??{sessionId,updatedAt:Date.now()},next={...entry,sessionId,updatedAt:Date.now(),modelProvider:providerUsed,model:modelUsed,contextTokens};if(isCliProvider(providerUsed,cfg)){let cliSessionId=result.meta.agentMeta?.sessionId?.trim();cliSessionId&&setCliSessionId(next,providerUsed,cliSessionId)}if(next.abortedLastRun=result.meta.aborted??!1,hasNonzeroUsage(usage)){let input=usage.input??0,output=usage.output??0,totalTokens=deriveSessionTotalTokens({usage,contextTokens,promptTokens})??input;next.inputTokens=input,next.outputTokens=output,next.totalTokens=totalTokens,next.totalTokensFresh=!0}compactionsThisRun>0&&(next.compactionCount=(entry.compactionCount??0)+compactionsThisRun),sessionStore[sessionKey]=next,await updateSessionStore(storePath,store=>{store[sessionKey]=next})}function resolveSessionKeyForRequest(opts){let sessionCfg=opts.cfg.session,scope=sessionCfg?.scope??`per-sender`,mainKey=normalizeMainKey(sessionCfg?.mainKey),explicitSessionKey=opts.sessionKey?.trim()||resolveExplicitAgentSessionKey({cfg:opts.cfg,agentId:opts.agentId}),storeAgentId=resolveAgentIdFromSessionKey(explicitSessionKey),storePath=resolveStorePath(sessionCfg?.store,{agentId:storeAgentId}),sessionStore=loadSessionStore(storePath),ctx=opts.to?.trim()?{From:opts.to}:void 0,sessionKey=explicitSessionKey??(ctx?resolveSessionKey(scope,ctx,mainKey):void 0);if(!explicitSessionKey&&opts.sessionId&&(!sessionKey||sessionStore[sessionKey]?.sessionId!==opts.sessionId)){let foundKey=Object.keys(sessionStore).find(key=>sessionStore[key]?.sessionId===opts.sessionId);foundKey&&(sessionKey=foundKey)}if(opts.sessionId&&!explicitSessionKey&&(!sessionKey||sessionStore[sessionKey]?.sessionId!==opts.sessionId)){let allAgentIds=listAgentIds(opts.cfg);for(let agentId of allAgentIds){if(agentId===storeAgentId)continue;let altStorePath=resolveStorePath(sessionCfg?.store,{agentId}),altStore=loadSessionStore(altStorePath),foundKey=Object.keys(altStore).find(key=>altStore[key]?.sessionId===opts.sessionId);if(foundKey)return{sessionKey:foundKey,sessionStore:altStore,storePath:altStorePath}}}return{sessionKey,sessionStore,storePath}}function resolveSession(opts){let sessionCfg=opts.cfg.session,{sessionKey,sessionStore,storePath}=resolveSessionKeyForRequest({cfg:opts.cfg,to:opts.to,sessionId:opts.sessionId,sessionKey:opts.sessionKey,agentId:opts.agentId}),now=Date.now(),sessionEntry=sessionKey?sessionStore[sessionKey]:void 0,resetPolicy=resolveSessionResetPolicy({sessionCfg,resetType:resolveSessionResetType({sessionKey}),resetOverride:resolveChannelResetConfig({sessionCfg,channel:sessionEntry?.lastChannel??sessionEntry?.channel})}),fresh=sessionEntry?evaluateSessionFreshness({updatedAt:sessionEntry.updatedAt,now,policy:resetPolicy}).fresh:!1;return{sessionId:opts.sessionId?.trim()||(fresh?sessionEntry?.sessionId:void 0)||crypto.randomUUID(),sessionKey,sessionEntry,sessionStore,storePath,isNewSession:!fresh&&!opts.sessionId,persistedThinking:fresh&&sessionEntry?.thinkingLevel?normalizeThinkLevel(sessionEntry.thinkingLevel):void 0,persistedVerbose:fresh&&sessionEntry?.verboseLevel?normalizeVerboseLevel(sessionEntry.verboseLevel):void 0}}async function persistSessionEntry(params){params.sessionStore[params.sessionKey]=params.entry,await updateSessionStore(params.storePath,store=>{store[params.sessionKey]=params.entry})}function resolveFallbackRetryPrompt(params){return params.isFallbackRetry?`Continue where you left off. The previous model attempt failed or timed out.`:params.body}function runAgentAttempt(params){let effectivePrompt=resolveFallbackRetryPrompt({body:params.body,isFallbackRetry:params.isFallbackRetry});if(isCliProvider(params.providerOverride,params.cfg)){let cliSessionId=getCliSessionId(params.sessionEntry,params.providerOverride);return runCliAgent({sessionId:params.sessionId,sessionKey:params.sessionKey,agentId:params.sessionAgentId,sessionFile:params.sessionFile,workspaceDir:params.workspaceDir,config:params.cfg,prompt:effectivePrompt,provider:params.providerOverride,model:params.modelOverride,thinkLevel:params.resolvedThinkLevel,timeoutMs:params.timeoutMs,runId:params.runId,extraSystemPrompt:params.opts.extraSystemPrompt,cliSessionId,images:params.isFallbackRetry?void 0:params.opts.images,streamParams:params.opts.streamParams})}let authProfileId=params.providerOverride===params.primaryProvider?params.sessionEntry?.authProfileOverride:void 0;return runEmbeddedAgent({sessionId:params.sessionId,sessionKey:params.sessionKey,agentId:params.sessionAgentId,messageChannel:params.messageChannel,agentAccountId:params.runContext.accountId,messageTo:params.opts.replyTo??params.opts.to,messageThreadId:params.opts.threadId,groupId:params.runContext.groupId,groupChannel:params.runContext.groupChannel,groupSpace:params.runContext.groupSpace,spawnedBy:params.spawnedBy,currentChannelId:params.runContext.currentChannelId,currentThreadTs:params.runContext.currentThreadTs,replyToMode:params.runContext.replyToMode,hasRepliedRef:params.runContext.hasRepliedRef,senderIsOwner:!0,sessionFile:params.sessionFile,workspaceDir:params.workspaceDir,config:params.cfg,skillsSnapshot:params.skillsSnapshot,prompt:effectivePrompt,images:params.isFallbackRetry?void 0:params.opts.images,clientTools:params.opts.clientTools,provider:params.providerOverride,model:params.modelOverride,authProfileId,authProfileIdSource:authProfileId?params.sessionEntry?.authProfileOverrideSource:void 0,thinkLevel:params.resolvedThinkLevel,verboseLevel:params.resolvedVerboseLevel,timeoutMs:params.timeoutMs,runId:params.runId,lane:params.opts.lane,abortSignal:params.opts.abortSignal,extraSystemPrompt:params.opts.extraSystemPrompt,inputProvenance:params.opts.inputProvenance,streamParams:params.opts.streamParams,agentDir:params.agentDir,onAgentEvent:params.onAgentEvent})}async function agentCommand(opts,runtime=defaultRuntime,deps=createDefaultDeps()){let body=(opts.message??``).trim();if(!body)throw Error(`Message (--message) is required`);if(!opts.to&&!opts.sessionId&&!opts.sessionKey&&!opts.agentId)throw Error(`Pass --to <E.164>, --session-id, or --agent to choose a session`);let cfg=loadConfig(),agentIdOverrideRaw=opts.agentId?.trim(),agentIdOverride=agentIdOverrideRaw?normalizeAgentId(agentIdOverrideRaw):void 0;if(agentIdOverride&&!listAgentIds(cfg).includes(agentIdOverride))throw Error(`Unknown agent id "${agentIdOverrideRaw}". Use "${formatCliCommand(`builderforce agents list`)}" to see configured agents.`);if(agentIdOverride&&opts.sessionKey){let sessionAgentId=resolveAgentIdFromSessionKey(opts.sessionKey);if(sessionAgentId!==agentIdOverride)throw Error(`Agent id "${agentIdOverrideRaw}" does not match session key agent "${sessionAgentId}".`)}let agentCfg=cfg.agents?.defaults,sessionAgentId=agentIdOverride??resolveAgentIdFromSessionKey(opts.sessionKey?.trim()),workspaceDirRaw=resolveAgentWorkspaceDir(cfg,sessionAgentId),agentDir=resolveAgentDir(cfg,sessionAgentId),workspaceDir=(await ensureAgentWorkspace({dir:workspaceDirRaw,ensureBootstrapFiles:!agentCfg?.skipBootstrap})).dir,configuredModel=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),thinkingLevelsHint=formatThinkingLevels(configuredModel.provider,configuredModel.model),thinkOverride=normalizeThinkLevel(opts.thinking),thinkOnce=normalizeThinkLevel(opts.thinkingOnce);if(opts.thinking&&!thinkOverride)throw Error(`Invalid thinking level. Use one of: ${thinkingLevelsHint}.`);if(opts.thinkingOnce&&!thinkOnce)throw Error(`Invalid one-shot thinking level. Use one of: ${thinkingLevelsHint}.`);let verboseOverride=normalizeVerboseLevel(opts.verbose);if(opts.verbose&&!verboseOverride)throw Error(`Invalid verbose level. Use "on", "full", or "off".`);let isSubagentLane=(typeof opts.lane==`string`?opts.lane.trim():``)===String(AGENT_LANE_SUBAGENT),timeoutSecondsRaw=opts.timeout===void 0?isSubagentLane?0:void 0:Number.parseInt(String(opts.timeout),10);if(timeoutSecondsRaw!==void 0&&(Number.isNaN(timeoutSecondsRaw)||timeoutSecondsRaw<0))throw Error(`--timeout must be a non-negative integer (seconds; 0 means no timeout)`);let timeoutMs=resolveAgentTimeoutMs({cfg,overrideSeconds:timeoutSecondsRaw}),{sessionId,sessionKey,sessionEntry:resolvedSessionEntry,sessionStore,storePath,isNewSession,persistedThinking,persistedVerbose}=resolveSession({cfg,to:opts.to,sessionId:opts.sessionId,sessionKey:opts.sessionKey,agentId:agentIdOverride}),sessionEntry=resolvedSessionEntry,runId=opts.runId?.trim()||sessionId;try{if(opts.deliver===!0&&resolveSendPolicy({cfg,entry:sessionEntry,sessionKey,channel:sessionEntry?.channel,chatType:sessionEntry?.chatType})===`deny`)throw Error(`send blocked by session policy`);let resolvedThinkLevel=thinkOnce??thinkOverride??persistedThinking??agentCfg?.thinkingDefault,resolvedVerboseLevel=verboseOverride??persistedVerbose??agentCfg?.verboseDefault??`on`;sessionKey&&registerAgentRunContext(runId,{sessionKey,verboseLevel:resolvedVerboseLevel});let needsSkillsSnapshot=isNewSession||!sessionEntry?.skillsSnapshot,skillsSnapshotVersion=getSkillsSnapshotVersion(workspaceDir),skillFilter=resolveAgentSkillsFilter(cfg,sessionAgentId),skillsSnapshot=needsSkillsSnapshot?buildWorkspaceSkillSnapshot(workspaceDir,{config:cfg,eligibility:{remote:getRemoteSkillEligibility()},snapshotVersion:skillsSnapshotVersion,skillFilter}):sessionEntry?.skillsSnapshot;if(skillsSnapshot&&sessionStore&&sessionKey&&needsSkillsSnapshot){let next={...sessionEntry??{sessionId,updatedAt:Date.now()},sessionId,updatedAt:Date.now(),skillsSnapshot};await persistSessionEntry({sessionStore,sessionKey,storePath,entry:next}),sessionEntry=next}if(sessionStore&&sessionKey){let next={...sessionStore[sessionKey]??sessionEntry??{sessionId,updatedAt:Date.now()},sessionId,updatedAt:Date.now()};thinkOverride&&(next.thinkingLevel=thinkOverride),applyVerboseOverride(next,verboseOverride),await persistSessionEntry({sessionStore,sessionKey,storePath,entry:next})}let agentModelPrimary=resolveAgentModelPrimary(cfg,sessionAgentId),configuredDefaultRef=resolveConfiguredModelRef({cfg:agentModelPrimary?{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,model:{...typeof cfg.agents?.defaults?.model==`object`?cfg.agents.defaults.model:void 0,primary:agentModelPrimary}}}}:cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),{provider:defaultProvider,model:defaultModel}=normalizeModelRef(configuredDefaultRef.provider,configuredDefaultRef.model),provider=defaultProvider,model=defaultModel,hasAllowlist=agentCfg?.models&&Object.keys(agentCfg.models).length>0,hasStoredOverride=!!(sessionEntry?.modelOverride||sessionEntry?.providerOverride),needsModelCatalog=hasAllowlist||hasStoredOverride,allowedModelKeys=new Set,allowedModelCatalog=[],modelCatalog=null;if(needsModelCatalog){modelCatalog=await loadModelCatalog({config:cfg});let allowed=buildAllowedModelSet({cfg,catalog:modelCatalog,defaultProvider,defaultModel});allowedModelKeys=allowed.allowedKeys,allowedModelCatalog=allowed.allowedCatalog}if(sessionEntry&&sessionStore&&sessionKey&&hasStoredOverride){let entry=sessionEntry,overrideProvider=sessionEntry.providerOverride?.trim()||defaultProvider,overrideModel=sessionEntry.modelOverride?.trim();if(overrideModel){let normalizedOverride=normalizeModelRef(overrideProvider,overrideModel),key=modelKey(normalizedOverride.provider,normalizedOverride.model);if(!isCliProvider(normalizedOverride.provider,cfg)&&allowedModelKeys.size>0&&!allowedModelKeys.has(key)){let{updated}=applyModelOverrideToSessionEntry({entry,selection:{provider:defaultProvider,model:defaultModel,isDefault:!0}});updated&&await persistSessionEntry({sessionStore,sessionKey,storePath,entry})}}}let storedProviderOverride=sessionEntry?.providerOverride?.trim(),storedModelOverride=sessionEntry?.modelOverride?.trim();if(storedModelOverride){let normalizedStored=normalizeModelRef(storedProviderOverride||defaultProvider,storedModelOverride),key=modelKey(normalizedStored.provider,normalizedStored.model);(isCliProvider(normalizedStored.provider,cfg)||allowedModelKeys.size===0||allowedModelKeys.has(key))&&(provider=normalizedStored.provider,model=normalizedStored.model)}if(sessionEntry){let authProfileId=sessionEntry.authProfileOverride;if(authProfileId){let entry=sessionEntry,profile=(await ensureAuthProfileStore()).profiles[authProfileId];(!profile||profile.provider!==provider)&&sessionStore&&sessionKey&&await clearSessionAuthProfileOverride({sessionEntry:entry,sessionStore,sessionKey,storePath})}}if(!resolvedThinkLevel){let catalogForThinking=modelCatalog??allowedModelCatalog;(!catalogForThinking||catalogForThinking.length===0)&&(modelCatalog=await loadModelCatalog({config:cfg}),catalogForThinking=modelCatalog),resolvedThinkLevel=resolveThinkingDefault({cfg,provider,model,catalog:catalogForThinking})}if(resolvedThinkLevel===`xhigh`&&!supportsXHighThinking(provider,model)){if(thinkOnce||thinkOverride)throw Error(`Thinking level "xhigh" is only supported for ${formatXHighModelHint()}.`);if(resolvedThinkLevel=`high`,sessionEntry&&sessionStore&&sessionKey&&sessionEntry.thinkingLevel===`xhigh`){let entry=sessionEntry;entry.thinkingLevel=`high`,entry.updatedAt=Date.now(),await persistSessionEntry({sessionStore,sessionKey,storePath,entry})}}let sessionFile=resolveSessionFilePath(sessionId,sessionEntry,{agentId:sessionAgentId}),startedAt=Date.now(),lifecycleEnded=!1,result,fallbackProvider=provider,fallbackModel=model;try{let runContext=resolveAgentRunContext(opts),messageChannel=resolveMessageChannel(runContext.messageChannel,opts.replyChannel??opts.channel),spawnedBy=opts.spawnedBy??sessionEntry?.spawnedBy,effectiveFallbacksOverride=resolveEffectiveModelFallbacks({cfg,agentId:sessionAgentId,hasSessionModelOverride:!!storedModelOverride}),fallbackAttemptIndex=0,fallbackResult=await runWithModelFallback({cfg,provider,model,agentDir,fallbacksOverride:effectiveFallbacksOverride,run:(providerOverride,modelOverride)=>{let isFallbackRetry=fallbackAttemptIndex>0;return fallbackAttemptIndex+=1,runAgentAttempt({providerOverride,modelOverride,cfg,sessionEntry,sessionId,sessionKey,sessionAgentId,sessionFile,workspaceDir,body,isFallbackRetry,resolvedThinkLevel,timeoutMs,runId,opts,runContext,spawnedBy,messageChannel,skillsSnapshot,resolvedVerboseLevel,agentDir,primaryProvider:provider,onAgentEvent:evt=>{evt.stream===`lifecycle`&&typeof evt.data?.phase==`string`&&(evt.data.phase===`end`||evt.data.phase===`error`)&&(lifecycleEnded=!0)}})}});result=fallbackResult.result,fallbackProvider=fallbackResult.provider,fallbackModel=fallbackResult.model,lifecycleEnded||emitAgentEvent({runId,stream:`lifecycle`,data:{phase:`end`,startedAt,endedAt:Date.now(),aborted:result.meta.aborted??!1}})}catch(err){throw lifecycleEnded||emitAgentEvent({runId,stream:`lifecycle`,data:{phase:`error`,startedAt,endedAt:Date.now(),error:String(err)}}),err}sessionStore&&sessionKey&&await updateSessionStoreAfterAgentRun({cfg,contextTokensOverride:agentCfg?.contextTokens,sessionId,sessionKey,storePath,sessionStore,defaultProvider:provider,defaultModel:model,fallbackProvider,fallbackModel,result});let payloads=result.payloads??[];return await deliverAgentCommandResult({cfg,deps,runtime,opts,sessionEntry,result,payloads})}finally{clearAgentRunContext(runId)}}function generateBootSessionId(){return`boot-${new Date().toISOString().replace(/[:.]/g,`-`).replace(`T`,`_`).replace(`Z`,``)}-${crypto.randomUUID().slice(0,8)}`}const log=createSubsystemLogger(`gateway/boot`),BOOT_FILENAME=`BOOT.md`;function buildBootPrompt(content){return[`You are running a boot check. Follow BOOT.md instructions exactly.`,``,`BOOT.md:`,content,``,`If BOOT.md asks you to send a message, use the message tool (action=send with channel + target).`,"Use the `target` field (not `to`) for message tool destinations.",`After sending with the message tool, reply with ONLY: ${SILENT_REPLY_TOKEN}.`,`If nothing needs attention, reply with ONLY: ${SILENT_REPLY_TOKEN}.`].join(`
2
2
  `)}async function loadBootFile(workspaceDir){let bootPath=resolveWorkspaceFilePath(workspaceDir,BOOT_FILENAME);try{let trimmed=(await fs.readFile(bootPath,`utf-8`)).trim();return trimmed?{status:`ok`,content:trimmed}:{status:`empty`}}catch(err){if(err.code===`ENOENT`)return{status:`missing`};throw err}}function snapshotMainSessionMapping(params){let agentId=resolveAgentIdFromSessionKey(params.sessionKey),storePath=resolveStorePath(params.cfg.session?.store,{agentId});try{let entry=loadSessionStore(storePath,{skipCache:!0})[params.sessionKey];return entry?{storePath,sessionKey:params.sessionKey,canRestore:!0,hadEntry:!0,entry:structuredClone(entry)}:{storePath,sessionKey:params.sessionKey,canRestore:!0,hadEntry:!1}}catch(err){return log.debug(`boot: could not snapshot main session mapping`,{sessionKey:params.sessionKey,error:String(err)}),{storePath,sessionKey:params.sessionKey,canRestore:!1,hadEntry:!1}}}async function restoreMainSessionMapping(snapshot){if(snapshot.canRestore)try{await updateSessionStore(snapshot.storePath,store=>{if(snapshot.hadEntry&&snapshot.entry){store[snapshot.sessionKey]=snapshot.entry;return}delete store[snapshot.sessionKey]},{activeSessionKey:snapshot.sessionKey});return}catch(err){return err instanceof Error?err.message:String(err)}}async function runBootOnce(params){let bootRuntime={log:()=>{},error:message=>log.error(String(message)),exit:defaultRuntime.exit},result;try{result=await loadBootFile(params.workspaceDir)}catch(err){let message=err instanceof Error?err.message:String(err);return log.error(`boot: failed to read ${BOOT_FILENAME}: ${message}`),{status:`failed`,reason:message}}if(result.status===`missing`||result.status===`empty`)return{status:`skipped`,reason:result.status};let sessionKey=resolveMainSessionKey(params.cfg),message=buildBootPrompt(result.content??``),sessionId=generateBootSessionId(),mappingSnapshot=snapshotMainSessionMapping({cfg:params.cfg,sessionKey}),agentFailure;try{await agentCommand({message,sessionKey,sessionId,deliver:!1},bootRuntime,params.deps)}catch(err){agentFailure=err instanceof Error?err.message:String(err),log.error(`boot: agent run failed: ${agentFailure}`)}let mappingRestoreFailure=await restoreMainSessionMapping(mappingSnapshot);return mappingRestoreFailure&&log.error(`boot: failed to restore main session mapping: ${mappingRestoreFailure}`),!agentFailure&&!mappingRestoreFailure?{status:`ran`}:{status:`failed`,reason:[agentFailure?`agent run failed: ${agentFailure}`:void 0,mappingRestoreFailure?`mapping restore failed: ${mappingRestoreFailure}`:void 0].filter(part=>!!part).join(`; `)}}const runBootChecklist=async event=>{if(event.type!==`gateway`||event.action!==`startup`)return;let context=event.context??{};if(!context.cfg||!context.workspaceDir)return;let deps=context.deps??createDefaultDeps();await runBootOnce({cfg:context.cfg,deps,workspaceDir:context.workspaceDir})};export{runBootChecklist as default};
@@ -1,4 +1,4 @@
1
- import{s as resolveStateDir}from"../../paths-BVMSM1lQ.js";import{d as resolveAgentIdFromSessionKey}from"../../session-key-CYpYHc1e.js";import"../../registry-D_frpmHZ.js";import{s as resolveAgentWorkspaceDir}from"../../agent-scope-EkacNLg3.js";import{t as createSubsystemLogger}from"../../subsystem-BakM_oqD.js";import"../../workspace-BCjtHT4u.js";import"../../model-selection-BJ0saFZo.js";import"../../env-BhRm7_r8.js";import"../../boolean-ssGoaBPk.js";import"../../src-CLWuGn12.js";import"../../embedded-DXDHduG1.js";import"../../replies-BG-eHErp.js";import"../../plugins-J28Y83f5.js";import"../../accounts-193gfWbH.js";import"../../bindings-BfB5A-by.js";import"../../send-DcxNvcKU.js";import"../../send-d9H-BT6p.js";import"../../accounts-DHeA4T6C.js";import"../../send-BxVr1pPI.js";import"../../fetch-BklyLYYN.js";import"../../model-catalog-Abk8cdEI.js";import"../../redact-sNZY-pGx.js";import"../../errors-BmztzL5I.js";import{Yt as hasInterSessionUserProvenance}from"../../runner-B70PGCqP.js";import"../../config-bxyMjPHU.js";import"../../chrome-Blk2Jftn.js";import"../../frontmatter-DBVosMFY.js";import"../../store-DN9AcI73.js";import"../../message-channel-tBuQgYSD.js";import"../../accounts-C7FtIPYB.js";import"../../paths-CzXKnIOb.js";import"../../gemini-auth-CzGGgJ0p.js";import"../../tool-images-mfC2sOfJ.js";import{t as resolveHookConfig}from"../../config-DfXnxW-V.js";import"../../reply-prefix-me5vnbrB.js";import"../../sqlite-D3Ov16zb.js";import"../../manager-BdFSM6B3.js";import"../../retry-BYnMCvOU.js";import"../../common-CDXsNQYT.js";import"../../chunk-CrsAQ01n.js";import"../../markdown-tables-DvSC1OTb.js";import"../../ir-Ct8GNKB7.js";import"../../render-CVWbhuqU.js";import"../../send-ZeI8StQK.js";import"../../outbound-attachment-U-XtahS5.js";import"../../fetch-Jq1KZsRq.js";import"../../send-CqER7CIV.js";import"../../resolve-route-CGe48x_Z.js";import"../../channel-activity-xLea9vdo.js";import"../../tables-Desw59m6.js";import"../../active-listener-BQLkI7vg.js";import{generateSlugViaLLM}from"../../llm-slug-generator.js";import fs from"node:fs/promises";import os from"node:os";import path from"node:path";const log=createSubsystemLogger(`hooks/session-memory`);async function getRecentSessionContent(sessionFilePath,messageCount=15){try{let lines=(await fs.readFile(sessionFilePath,`utf-8`)).trim().split(`
1
+ import{s as resolveStateDir}from"../../paths-BVMSM1lQ.js";import{d as resolveAgentIdFromSessionKey}from"../../session-key-CYpYHc1e.js";import"../../registry-D_frpmHZ.js";import{s as resolveAgentWorkspaceDir}from"../../agent-scope-EkacNLg3.js";import{t as createSubsystemLogger}from"../../subsystem-BakM_oqD.js";import"../../workspace-BCjtHT4u.js";import"../../model-selection-BJ0saFZo.js";import"../../env-BhRm7_r8.js";import"../../boolean-ssGoaBPk.js";import"../../src-CLWuGn12.js";import"../../embedded-BcHzh_y8.js";import"../../replies-BG-eHErp.js";import"../../plugins-J28Y83f5.js";import"../../accounts-193gfWbH.js";import"../../bindings-BfB5A-by.js";import"../../send-DcxNvcKU.js";import"../../send-d9H-BT6p.js";import"../../accounts-DHeA4T6C.js";import"../../send-BxVr1pPI.js";import"../../fetch-BklyLYYN.js";import"../../model-catalog-Abk8cdEI.js";import"../../redact-sNZY-pGx.js";import"../../errors-BmztzL5I.js";import{Yt as hasInterSessionUserProvenance}from"../../runner-D7af_RBH.js";import"../../config-bxyMjPHU.js";import"../../chrome-CtTMuhww.js";import"../../frontmatter-DBVosMFY.js";import"../../store-DN9AcI73.js";import"../../message-channel-tBuQgYSD.js";import"../../accounts-C7FtIPYB.js";import"../../paths-CzXKnIOb.js";import"../../gemini-auth-CzGGgJ0p.js";import"../../tool-images-mfC2sOfJ.js";import{t as resolveHookConfig}from"../../config-DfXnxW-V.js";import"../../reply-prefix-me5vnbrB.js";import"../../sqlite-D3Ov16zb.js";import"../../manager-BdFSM6B3.js";import"../../retry-BYnMCvOU.js";import"../../common-CDXsNQYT.js";import"../../chunk-CrsAQ01n.js";import"../../markdown-tables-DvSC1OTb.js";import"../../ir-Ct8GNKB7.js";import"../../render-CVWbhuqU.js";import"../../send-ZeI8StQK.js";import"../../outbound-attachment-U-XtahS5.js";import"../../fetch-Jq1KZsRq.js";import"../../send-CqER7CIV.js";import"../../resolve-route-CGe48x_Z.js";import"../../channel-activity-xLea9vdo.js";import"../../tables-Desw59m6.js";import"../../active-listener-BQLkI7vg.js";import{generateSlugViaLLM}from"../../llm-slug-generator.js";import fs from"node:fs/promises";import os from"node:os";import path from"node:path";const log=createSubsystemLogger(`hooks/session-memory`);async function getRecentSessionContent(sessionFilePath,messageCount=15){try{let lines=(await fs.readFile(sessionFilePath,`utf-8`)).trim().split(`
2
2
  `),allMessages=[];for(let line of lines)try{let entry=JSON.parse(line);if(entry.type===`message`&&entry.message){let msg=entry.message,role=msg.role;if((role===`user`||role===`assistant`)&&msg.content){if(role===`user`&&hasInterSessionUserProvenance(msg))continue;let text=Array.isArray(msg.content)?msg.content.find(c=>c.type===`text`)?.text:msg.content;text&&!text.startsWith(`/`)&&allMessages.push(`${role}: ${text}`)}}}catch{}return allMessages.slice(-messageCount).join(`
3
3
  `)}catch{return null}}async function getRecentSessionContentWithResetFallback(sessionFilePath,messageCount=15){let primary=await getRecentSessionContent(sessionFilePath,messageCount);if(primary)return primary;try{let dir=path.dirname(sessionFilePath),resetPrefix=`${path.basename(sessionFilePath)}.reset.`,resetCandidates=(await fs.readdir(dir)).filter(name=>name.startsWith(resetPrefix)).toSorted();if(resetCandidates.length===0)return primary;let latestResetPath=path.join(dir,resetCandidates[resetCandidates.length-1]),fallback=await getRecentSessionContent(latestResetPath,messageCount);return fallback&&log.debug(`Loaded session content from reset fallback`,{sessionFilePath,latestResetPath}),fallback||primary}catch{return primary}}function stripResetSuffix(fileName){let resetIndex=fileName.indexOf(`.reset.`);return resetIndex===-1?fileName:fileName.slice(0,resetIndex)}async function findPreviousSessionFile(params){try{let files=await fs.readdir(params.sessionsDir),fileSet=new Set(files),baseFromReset=params.currentSessionFile?stripResetSuffix(path.basename(params.currentSessionFile)):void 0;if(baseFromReset&&fileSet.has(baseFromReset))return path.join(params.sessionsDir,baseFromReset);let trimmedSessionId=params.sessionId?.trim();if(trimmedSessionId){let canonicalFile=`${trimmedSessionId}.jsonl`;if(fileSet.has(canonicalFile))return path.join(params.sessionsDir,canonicalFile);let topicVariants=files.filter(name=>name.startsWith(`${trimmedSessionId}-topic-`)&&name.endsWith(`.jsonl`)&&!name.includes(`.reset.`)).toSorted().toReversed();if(topicVariants.length>0)return path.join(params.sessionsDir,topicVariants[0])}if(!params.currentSessionFile)return;let nonResetJsonl=files.filter(name=>name.endsWith(`.jsonl`)&&!name.includes(`.reset.`)).toSorted().toReversed();if(nonResetJsonl.length>0)return path.join(params.sessionsDir,nonResetJsonl[0])}catch{}}const saveSessionToMemory=async event=>{if(!(event.type!==`command`||event.action!==`new`))try{log.debug(`Hook triggered for /new command`);let context=event.context||{},cfg=context.cfg,agentId=resolveAgentIdFromSessionKey(event.sessionKey),workspaceDir=cfg?resolveAgentWorkspaceDir(cfg,agentId):path.join(resolveStateDir(process.env,os.homedir),`workspace`),memoryDir=path.join(workspaceDir,`.builderforce`,`memory`);await fs.mkdir(memoryDir,{recursive:!0});let now=new Date(event.timestamp),dateStr=now.toISOString().split(`T`)[0],sessionEntry=context.previousSessionEntry||context.sessionEntry||{},currentSessionId=sessionEntry.sessionId,currentSessionFile=sessionEntry.sessionFile||void 0;if(!currentSessionFile||currentSessionFile.includes(`.reset.`)){let sessionsDirs=new Set;currentSessionFile&&sessionsDirs.add(path.dirname(currentSessionFile)),sessionsDirs.add(path.join(workspaceDir,`sessions`));for(let sessionsDir of sessionsDirs){let recoveredSessionFile=await findPreviousSessionFile({sessionsDir,currentSessionFile,sessionId:currentSessionId});if(recoveredSessionFile){currentSessionFile=recoveredSessionFile,log.debug(`Found previous session file`,{file:currentSessionFile});break}}}log.debug(`Session context resolved`,{sessionId:currentSessionId,sessionFile:currentSessionFile,hasCfg:!!cfg});let sessionFile=currentSessionFile||void 0,hookConfig=resolveHookConfig(cfg,`session-memory`),messageCount=typeof hookConfig?.messages==`number`&&hookConfig.messages>0?hookConfig.messages:15,slug=null,sessionContent=null;if(sessionFile){sessionContent=await getRecentSessionContentWithResetFallback(sessionFile,messageCount),log.debug(`Session content loaded`,{length:sessionContent?.length??0,messageCount});let allowLlmSlug=!(process.env.BUILDERFORCE_AGENTS_TEST_FAST===`1`||process.env.VITEST===`true`||process.env.VITEST===`1`)&&hookConfig?.llmSlug!==!1;sessionContent&&cfg&&allowLlmSlug&&(log.debug(`Calling generateSlugViaLLM...`),slug=await generateSlugViaLLM({sessionContent,cfg}),log.debug(`Generated slug`,{slug}))}slug||(slug=now.toISOString().split(`T`)[1].split(`.`)[0].replace(/:/g,``).slice(0,4),log.debug(`Using fallback timestamp slug`,{slug}));let filename=`${dateStr}-${slug}.md`,memoryFilePath=path.join(memoryDir,filename);log.debug(`Memory file path resolved`,{filename,path:memoryFilePath.replace(os.homedir(),`~`)});let timeStr=now.toISOString().split(`T`)[1].split(`.`)[0],sessionId=sessionEntry.sessionId||`unknown`,source=context.commandSource||`unknown`,entryParts=[`# Session: ${dateStr} ${timeStr} UTC`,``,`- **Session Key**: ${event.sessionKey}`,`- **Session ID**: ${sessionId}`,`- **Source**: ${source}`,``];sessionContent&&entryParts.push(`## Conversation Summary`,``,sessionContent,``);let entry=entryParts.join(`
4
4
  `);await fs.writeFile(memoryFilePath,entry,`utf-8`),log.debug(`Memory file written successfully`);let relPath=memoryFilePath.replace(os.homedir(),`~`);log.info(`Session context saved to ${relPath}`)}catch(err){err instanceof Error?log.error(`Failed to save session memory`,{errorName:err.name,errorMessage:err.message,stack:err.stack}):log.error(`Failed to save session memory`,{error:String(err)})}};export{saveSessionToMemory as default};
@@ -0,0 +1,4 @@
1
+ import{y as CONFIG_DIR}from"./registry-j1UKIotU.js";import{t as createSubsystemLogger}from"./subsystem-ykSbyaud.js";import{i as isErrno}from"./errors-CguQr0Ja.js";import{n as loadConfig}from"./config-C7baFOp1.js";import path from"node:path";import fs from"node:fs";import os from"node:os";import{createHash,randomBytes}from"node:crypto";import"node:fs/promises";import{execFileSync,spawn}from"node:child_process";import net from"node:net";import{createServer}from"node:http";import WebSocket,{WebSocketServer}from"ws";import{Buffer as Buffer$1}from"node:buffer";const DEFAULT_BUILDERFORCE_AGENTS_BROWSER_ENABLED=!0,DEFAULT_BROWSER_EVALUATE_ENABLED=!0,DEFAULT_BUILDERFORCE_AGENTS_BROWSER_COLOR=`#FF4500`,DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME=`builderforce`,DEFAULT_BROWSER_DEFAULT_PROFILE_NAME=`chrome`,DEFAULT_AI_SNAPSHOT_MAX_CHARS=8e4,DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS=1e4,DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH=6;function isTailnetIPv4(address){let parts=address.split(`.`);if(parts.length!==4)return!1;let octets=parts.map(p=>Number.parseInt(p,10));if(octets.some(n=>!Number.isFinite(n)||n<0||n>255))return!1;let[a,b]=octets;return a===100&&b>=64&&b<=127}function isTailnetIPv6(address){return address.trim().toLowerCase().startsWith(`fd7a:115c:a1e0:`)}function listTailnetAddresses(){let ipv4=[],ipv6=[],ifaces=os.networkInterfaces();for(let entries of Object.values(ifaces))if(entries)for(let e of entries){if(!e||e.internal)continue;let address=e.address?.trim();address&&(isTailnetIPv4(address)&&ipv4.push(address),isTailnetIPv6(address)&&ipv6.push(address))}return{ipv4:[...new Set(ipv4)],ipv6:[...new Set(ipv6)]}}function pickPrimaryTailnetIPv4(){return listTailnetAddresses().ipv4[0]}function pickPrimaryLanIPv4(){let nets=os.networkInterfaces();for(let name of[`en0`,`eth0`]){let entry=nets[name]?.find(n=>n.family===`IPv4`&&!n.internal);if(entry?.address)return entry.address}for(let list of Object.values(nets)){let entry=list?.find(n=>n.family===`IPv4`&&!n.internal);if(entry?.address)return entry.address}}function isLoopbackAddress(ip){return ip?!!(ip===`127.0.0.1`||ip.startsWith(`127.`)||ip===`::1`||ip.startsWith(`::ffff:127.`)):!1}function isLoopbackHost(host){if(!host)return!1;let h=host.trim().toLowerCase();return h===`localhost`?!0:isLoopbackAddress(h.startsWith(`[`)&&h.endsWith(`]`)?h.slice(1,-1):h)}const POSIX_BUILDERFORCE_AGENTS_TMP_DIR=`/tmp/builderforce`;function isNodeErrorWithCode(err,code){return typeof err==`object`&&!!err&&`code`in err&&err.code===code}function resolvePreferredBuilderForceAgentsTmpDir(options={}){let accessSync=options.accessSync??fs.accessSync,lstatSync=options.lstatSync??fs.lstatSync,mkdirSync=options.mkdirSync??fs.mkdirSync,getuid=options.getuid??(()=>{try{return typeof process.getuid==`function`?process.getuid():void 0}catch{return}}),tmpdir=options.tmpdir??os.tmpdir,uid=getuid(),isSecureDirForUser=st=>uid===void 0?!0:!(typeof st.uid==`number`&&st.uid!==uid||typeof st.mode==`number`&&st.mode&18),fallback=()=>{let base=tmpdir(),suffix=uid===void 0?`builderforce`:`builderforce-${uid}`;return path.join(base,suffix)};try{let preferred=lstatSync(POSIX_BUILDERFORCE_AGENTS_TMP_DIR);return!preferred.isDirectory()||preferred.isSymbolicLink()||(accessSync(POSIX_BUILDERFORCE_AGENTS_TMP_DIR,fs.constants.W_OK|fs.constants.X_OK),!isSecureDirForUser(preferred))?fallback():POSIX_BUILDERFORCE_AGENTS_TMP_DIR}catch(err){if(!isNodeErrorWithCode(err,`ENOENT`))return fallback()}try{accessSync(`/tmp`,fs.constants.W_OK|fs.constants.X_OK),mkdirSync(POSIX_BUILDERFORCE_AGENTS_TMP_DIR,{recursive:!0,mode:448});try{let preferred=lstatSync(POSIX_BUILDERFORCE_AGENTS_TMP_DIR);if(!preferred.isDirectory()||preferred.isSymbolicLink()||!isSecureDirForUser(preferred))return fallback()}catch{return fallback()}return POSIX_BUILDERFORCE_AGENTS_TMP_DIR}catch{return fallback()}}function rawDataToString(data,encoding=`utf8`){return typeof data==`string`?data:Buffer$1.isBuffer(data)?data.toString(encoding):Array.isArray(data)?Buffer$1.concat(data).toString(encoding):data instanceof ArrayBuffer?Buffer$1.from(data).toString(encoding):Buffer$1.from(String(data)).toString(encoding)}const RELAY_AUTH_HEADER=`x-builderforce-relay-token`;function headerValue(value){if(value)return Array.isArray(value)?value[0]:value}function getHeader(req,name){return headerValue(req.headers[name.toLowerCase()])}function parseBaseUrl(raw){let parsed=new URL(raw.trim().replace(/\/$/,``));if(parsed.protocol!==`http:`&&parsed.protocol!==`https:`)throw Error(`extension relay cdpUrl must be http(s), got ${parsed.protocol}`);let host=parsed.hostname,port=parsed.port?.trim()===``?parsed.protocol===`https:`?443:80:Number(parsed.port);if(!Number.isFinite(port)||port<=0||port>65535)throw Error(`extension relay cdpUrl has invalid port: ${parsed.port||`(empty)`}`);return{host,port,baseUrl:parsed.toString().replace(/\/$/,``)}}function text(res,status,bodyText){let body=Buffer.from(bodyText);res.write(`HTTP/1.1 ${status} ${status===200?`OK`:`ERR`}\r\nContent-Type: text/plain; charset=utf-8\r
2
+ Content-Length: ${body.length}\r\nConnection: close\r
3
+ \r
4
+ `),res.write(body),res.end()}function rejectUpgrade(socket,status,bodyText){text(socket,status,bodyText);try{socket.destroy()}catch{}}const serversByPort=new Map,relayAuthByPort=new Map;function resolveGatewayAuthToken(){let envToken=process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN?.trim()||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN?.trim();if(envToken)return envToken;try{let configToken=loadConfig().gateway?.auth?.token?.trim();if(configToken)return configToken}catch{}return null}function deriveDeterministicRelayAuthToken(port){let gatewayToken=resolveGatewayAuthToken();return gatewayToken?createHash(`sha256`).update(`builderforce-relay:${port}:`).update(gatewayToken).digest(`base64url`):null}function resolveRelayAuthToken(port){return deriveDeterministicRelayAuthToken(port)??randomBytes(32).toString(`base64url`)}function isAddrInUseError(err){return typeof err==`object`&&!!err&&`code`in err&&err.code===`EADDRINUSE`}async function looksLikeBuilderForceAgentsRelay(baseUrl){let ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),500);try{let statusUrl=new URL(`/extension/status`,`${baseUrl}/`).toString(),res=await fetch(statusUrl,{signal:ctrl.signal});return res.ok?typeof(await res.json()).connected==`boolean`:!1}catch{return!1}finally{clearTimeout(timer)}}function relayAuthTokenForUrl(url){try{let parsed=new URL(url);if(!isLoopbackHost(parsed.hostname))return null;let port=parsed.port?.trim()===``?parsed.protocol===`https:`||parsed.protocol===`wss:`?443:80:Number(parsed.port);return Number.isFinite(port)?relayAuthByPort.get(port)??deriveDeterministicRelayAuthToken(port):null}catch{return null}}function getChromeExtensionRelayAuthHeaders(url){let token=relayAuthTokenForUrl(url);return token?{[RELAY_AUTH_HEADER]:token}:{}}async function ensureChromeExtensionRelayServer(opts){let info=parseBaseUrl(opts.cdpUrl);if(!isLoopbackHost(info.host))throw Error(`extension relay requires loopback cdpUrl host (got ${info.host})`);let existing=serversByPort.get(info.port);if(existing)return existing;let relayAuthToken=resolveRelayAuthToken(info.port),extensionWs=null,cdpClients=new Set,connectedTargets=new Map,pendingExtension=new Map,nextExtensionId=1,sendToExtension=async payload=>{let ws=extensionWs;if(!ws||ws.readyState!==WebSocket.OPEN)throw Error(`Chrome extension not connected`);return ws.send(JSON.stringify(payload)),await new Promise((resolve,reject)=>{let timer=setTimeout(()=>{pendingExtension.delete(payload.id),reject(Error(`extension request timeout: ${payload.params.method}`))},3e4);pendingExtension.set(payload.id,{resolve,reject,timer})})},broadcastToCdpClients=evt=>{let msg=JSON.stringify(evt);for(let ws of cdpClients)ws.readyState===WebSocket.OPEN&&ws.send(msg)},sendResponseToCdp=(ws,res)=>{ws.readyState===WebSocket.OPEN&&ws.send(JSON.stringify(res))},ensureTargetEventsForClient=(ws,mode)=>{for(let target of connectedTargets.values())mode===`autoAttach`?ws.send(JSON.stringify({method:`Target.attachedToTarget`,params:{sessionId:target.sessionId,targetInfo:{...target.targetInfo,attached:!0},waitingForDebugger:!1}})):ws.send(JSON.stringify({method:`Target.targetCreated`,params:{targetInfo:{...target.targetInfo,attached:!0}}}))},routeCdpCommand=async cmd=>{switch(cmd.method){case`Browser.getVersion`:return{protocolVersion:`1.3`,product:`Chrome/BuilderForceAgents-Extension-Relay`,revision:`0`,userAgent:`BuilderForceAgents-Extension-Relay`,jsVersion:`V8`};case`Browser.setDownloadBehavior`:return{};case`Target.setAutoAttach`:case`Target.setDiscoverTargets`:return{};case`Target.getTargets`:return{targetInfos:Array.from(connectedTargets.values()).map(t=>({...t.targetInfo,attached:!0}))};case`Target.getTargetInfo`:{let params=cmd.params??{},targetId=typeof params.targetId==`string`?params.targetId:void 0;if(targetId){for(let t of connectedTargets.values())if(t.targetId===targetId)return{targetInfo:t.targetInfo}}if(cmd.sessionId&&connectedTargets.has(cmd.sessionId)){let t=connectedTargets.get(cmd.sessionId);if(t)return{targetInfo:t.targetInfo}}return{targetInfo:Array.from(connectedTargets.values())[0]?.targetInfo}}case`Target.attachToTarget`:{let params=cmd.params??{},targetId=typeof params.targetId==`string`?params.targetId:void 0;if(!targetId)throw Error(`targetId required`);for(let t of connectedTargets.values())if(t.targetId===targetId)return{sessionId:t.sessionId};throw Error(`target not found`)}default:return await sendToExtension({id:nextExtensionId++,method:`forwardCDPCommand`,params:{method:cmd.method,sessionId:cmd.sessionId,params:cmd.params}})}},server=createServer((req,res)=>{let path=new URL(req.url??`/`,info.baseUrl).pathname;if(path.startsWith(`/json`)){let token=getHeader(req,RELAY_AUTH_HEADER);if(!token||token!==relayAuthToken){res.writeHead(401),res.end(`Unauthorized`);return}}if(req.method===`HEAD`&&path===`/`){res.writeHead(200),res.end();return}if(path===`/`){res.writeHead(200,{"Content-Type":`text/plain; charset=utf-8`}),res.end(`OK`);return}if(path===`/extension/status`){res.writeHead(200,{"Content-Type":`application/json`}),res.end(JSON.stringify({connected:!!extensionWs}));return}let cdpWsUrl=`${`ws://${req.headers.host?.trim()||`${info.host}:${info.port}`}`}/cdp`;if((path===`/json/version`||path===`/json/version/`)&&(req.method===`GET`||req.method===`PUT`)){let payload={Browser:`BuilderForceAgents/extension-relay`,"Protocol-Version":`1.3`};extensionWs&&(payload.webSocketDebuggerUrl=cdpWsUrl),res.writeHead(200,{"Content-Type":`application/json`}),res.end(JSON.stringify(payload));return}if(new Set([`/json`,`/json/`,`/json/list`,`/json/list/`]).has(path)&&(req.method===`GET`||req.method===`PUT`)){let list=Array.from(connectedTargets.values()).map(t=>({id:t.targetId,type:t.targetInfo.type??`page`,title:t.targetInfo.title??``,description:t.targetInfo.title??``,url:t.targetInfo.url??``,webSocketDebuggerUrl:cdpWsUrl,devtoolsFrontendUrl:`/devtools/inspector.html?ws=${cdpWsUrl.replace(`ws://`,``)}`}));res.writeHead(200,{"Content-Type":`application/json`}),res.end(JSON.stringify(list));return}let activateMatch=path.match(/^\/json\/activate\/(.+)$/);if(activateMatch&&(req.method===`GET`||req.method===`PUT`)){let targetId=decodeURIComponent(activateMatch[1]??``).trim();if(!targetId){res.writeHead(400),res.end(`targetId required`);return}(async()=>{try{await sendToExtension({id:nextExtensionId++,method:`forwardCDPCommand`,params:{method:`Target.activateTarget`,params:{targetId}}})}catch{}})(),res.writeHead(200),res.end(`OK`);return}let closeMatch=path.match(/^\/json\/close\/(.+)$/);if(closeMatch&&(req.method===`GET`||req.method===`PUT`)){let targetId=decodeURIComponent(closeMatch[1]??``).trim();if(!targetId){res.writeHead(400),res.end(`targetId required`);return}(async()=>{try{await sendToExtension({id:nextExtensionId++,method:`forwardCDPCommand`,params:{method:`Target.closeTarget`,params:{targetId}}})}catch{}})(),res.writeHead(200),res.end(`OK`);return}res.writeHead(404),res.end(`not found`)}),wssExtension=new WebSocketServer({noServer:!0}),wssCdp=new WebSocketServer({noServer:!0});server.on(`upgrade`,(req,socket,head)=>{let pathname=new URL(req.url??`/`,info.baseUrl).pathname,remote=req.socket.remoteAddress;if(!isLoopbackAddress(remote)){rejectUpgrade(socket,403,`Forbidden`);return}let origin=headerValue(req.headers.origin);if(origin&&!origin.startsWith(`chrome-extension://`)){rejectUpgrade(socket,403,`Forbidden: invalid origin`);return}if(pathname===`/extension`){if(extensionWs){rejectUpgrade(socket,409,`Extension already connected`);return}wssExtension.handleUpgrade(req,socket,head,ws=>{wssExtension.emit(`connection`,ws,req)});return}if(pathname===`/cdp`){let token=getHeader(req,RELAY_AUTH_HEADER);if(!token||token!==relayAuthToken){rejectUpgrade(socket,401,`Unauthorized`);return}if(!extensionWs){rejectUpgrade(socket,503,`Extension not connected`);return}wssCdp.handleUpgrade(req,socket,head,ws=>{wssCdp.emit(`connection`,ws,req)});return}rejectUpgrade(socket,404,`Not Found`)}),wssExtension.on(`connection`,ws=>{extensionWs=ws;let ping=setInterval(()=>{ws.readyState===WebSocket.OPEN&&ws.send(JSON.stringify({method:`ping`}))},5e3);ws.on(`message`,data=>{let parsed=null;try{parsed=JSON.parse(rawDataToString(data))}catch{return}if(parsed&&typeof parsed==`object`&&`id`in parsed&&typeof parsed.id==`number`){let pending=pendingExtension.get(parsed.id);if(!pending)return;pendingExtension.delete(parsed.id),clearTimeout(pending.timer),`error`in parsed&&typeof parsed.error==`string`&&parsed.error.trim()?pending.reject(Error(parsed.error)):pending.resolve(parsed.result);return}if(parsed&&typeof parsed==`object`&&`method`in parsed){if(parsed.method===`pong`||parsed.method!==`forwardCDPEvent`)return;let evt=parsed,method=evt.params?.method,params=evt.params?.params,sessionId=evt.params?.sessionId;if(!method||typeof method!=`string`)return;if(method===`Target.attachedToTarget`){let attached=params??{};if((attached?.targetInfo?.type??`page`)!==`page`)return;if(attached?.sessionId&&attached?.targetInfo?.targetId){let prev=connectedTargets.get(attached.sessionId),nextTargetId=attached.targetInfo.targetId,prevTargetId=prev?.targetId,changedTarget=!!(prev&&prevTargetId&&prevTargetId!==nextTargetId);connectedTargets.set(attached.sessionId,{sessionId:attached.sessionId,targetId:nextTargetId,targetInfo:attached.targetInfo}),changedTarget&&prevTargetId&&broadcastToCdpClients({method:`Target.detachedFromTarget`,params:{sessionId:attached.sessionId,targetId:prevTargetId},sessionId:attached.sessionId}),(!prev||changedTarget)&&broadcastToCdpClients({method,params,sessionId});return}}if(method===`Target.detachedFromTarget`){let detached=params??{};detached?.sessionId&&connectedTargets.delete(detached.sessionId),broadcastToCdpClients({method,params,sessionId});return}if(method===`Target.targetInfoChanged`){let targetInfo=(params??{})?.targetInfo,targetId=targetInfo?.targetId;if(targetId&&(targetInfo?.type??`page`)===`page`)for(let[sid,target]of connectedTargets)target.targetId===targetId&&connectedTargets.set(sid,{...target,targetInfo:{...target.targetInfo,...targetInfo}})}broadcastToCdpClients({method,params,sessionId})}}),ws.on(`close`,()=>{clearInterval(ping),extensionWs=null;for(let[,pending]of pendingExtension)clearTimeout(pending.timer),pending.reject(Error(`extension disconnected`));pendingExtension.clear(),connectedTargets.clear();for(let client of cdpClients)try{client.close(1011,`extension disconnected`)}catch{}cdpClients.clear()})}),wssCdp.on(`connection`,ws=>{cdpClients.add(ws),ws.on(`message`,async data=>{let cmd=null;try{cmd=JSON.parse(rawDataToString(data))}catch{return}if(!(!cmd||typeof cmd!=`object`)&&!(typeof cmd.id!=`number`||typeof cmd.method!=`string`)){if(!extensionWs){sendResponseToCdp(ws,{id:cmd.id,sessionId:cmd.sessionId,error:{message:`Extension not connected`}});return}try{let result=await routeCdpCommand(cmd);if(cmd.method===`Target.setAutoAttach`&&!cmd.sessionId&&ensureTargetEventsForClient(ws,`autoAttach`),cmd.method===`Target.setDiscoverTargets`&&(cmd.params??{}).discover===!0&&ensureTargetEventsForClient(ws,`discover`),cmd.method===`Target.attachToTarget`){let params=cmd.params??{},targetId=typeof params.targetId==`string`?params.targetId:void 0;if(targetId){let target=Array.from(connectedTargets.values()).find(t=>t.targetId===targetId);target&&ws.send(JSON.stringify({method:`Target.attachedToTarget`,params:{sessionId:target.sessionId,targetInfo:{...target.targetInfo,attached:!0},waitingForDebugger:!1}}))}}sendResponseToCdp(ws,{id:cmd.id,sessionId:cmd.sessionId,result})}catch(err){sendResponseToCdp(ws,{id:cmd.id,sessionId:cmd.sessionId,error:{message:err instanceof Error?err.message:String(err)}})}}}),ws.on(`close`,()=>{cdpClients.delete(ws)})});try{await new Promise((resolve,reject)=>{server.listen(info.port,info.host,()=>resolve()),server.once(`error`,reject)})}catch(err){if(isAddrInUseError(err)&&await looksLikeBuilderForceAgentsRelay(info.baseUrl)){let existingRelay={host:info.host,port:info.port,baseUrl:info.baseUrl,cdpWsUrl:`ws://${info.host}:${info.port}/cdp`,extensionConnected:()=>!1,stop:async()=>{serversByPort.delete(info.port),relayAuthByPort.delete(info.port)}};return relayAuthByPort.set(info.port,relayAuthToken),serversByPort.set(info.port,existingRelay),existingRelay}throw err}let port=server.address()?.port??info.port,host=info.host,relay={host,port,baseUrl:`${new URL(info.baseUrl).protocol}//${host}:${port}`,cdpWsUrl:`ws://${host}:${port}/cdp`,extensionConnected:()=>!!extensionWs,stop:async()=>{serversByPort.delete(port),relayAuthByPort.delete(port);try{extensionWs?.close(1001,`server stopping`)}catch{}for(let ws of cdpClients)try{ws.close(1001,`server stopping`)}catch{}await new Promise(resolve=>{server.close(()=>resolve())}),wssExtension.close(),wssCdp.close()}};return relayAuthByPort.set(port,relayAuthToken),serversByPort.set(port,relay),relay}async function stopChromeExtensionRelayServer(opts){let info=parseBaseUrl(opts.cdpUrl),existing=serversByPort.get(info.port);return existing?(await existing.stop(),relayAuthByPort.delete(info.port),!0):!1}function getHeadersWithAuth(url,headers={}){let mergedHeaders={...getChromeExtensionRelayAuthHeaders(url),...headers};try{let parsed=new URL(url);if(Object.keys(mergedHeaders).some(key=>key.toLowerCase()===`authorization`))return mergedHeaders;if(parsed.username||parsed.password){let auth=Buffer.from(`${parsed.username}:${parsed.password}`).toString(`base64`);return{...mergedHeaders,Authorization:`Basic ${auth}`}}}catch{}return mergedHeaders}function appendCdpPath(cdpUrl,path){let url=new URL(cdpUrl);return url.pathname=`${url.pathname.replace(/\/$/,``)}${path.startsWith(`/`)?path:`/${path}`}`,url.toString()}function createCdpSender(ws){let nextId=1,pending=new Map,send=(method,params,sessionId)=>{let id=nextId++,msg={id,method,params,sessionId};return ws.send(JSON.stringify(msg)),new Promise((resolve,reject)=>{pending.set(id,{resolve,reject})})},closeWithError=err=>{for(let[,p]of pending)p.reject(err);pending.clear();try{ws.close()}catch{}};return ws.on(`error`,err=>{closeWithError(err instanceof Error?err:Error(String(err)))}),ws.on(`message`,data=>{try{let parsed=JSON.parse(rawDataToString(data));if(typeof parsed.id!=`number`)return;let p=pending.get(parsed.id);if(!p)return;if(pending.delete(parsed.id),parsed.error?.message){p.reject(Error(parsed.error.message));return}p.resolve(parsed.result)}catch{}}),ws.on(`close`,()=>{closeWithError(Error(`CDP socket closed`))}),{send,closeWithError}}async function fetchJson(url,timeoutMs=1500,init){return await(await fetchChecked(url,timeoutMs,init)).json()}async function fetchChecked(url,timeoutMs=1500,init){let ctrl=new AbortController,t=setTimeout(ctrl.abort.bind(ctrl),timeoutMs);try{let headers=getHeadersWithAuth(url,init?.headers||{}),res=await fetch(url,{...init,headers,signal:ctrl.signal});if(!res.ok)throw Error(`HTTP ${res.status}`);return res}finally{clearTimeout(t)}}async function fetchOk(url,timeoutMs=1500,init){await fetchChecked(url,timeoutMs,init)}async function withCdpSocket(wsUrl,fn,opts){let headers=getHeadersWithAuth(wsUrl,opts?.headers??{}),ws=new WebSocket(wsUrl,{handshakeTimeout:typeof opts?.handshakeTimeoutMs==`number`&&Number.isFinite(opts.handshakeTimeoutMs)?Math.max(1,Math.floor(opts.handshakeTimeoutMs)):5e3,...Object.keys(headers).length?{headers}:{}}),{send,closeWithError}=createCdpSender(ws),openPromise=new Promise((resolve,reject)=>{ws.once(`open`,()=>resolve()),ws.once(`error`,err=>reject(err)),ws.once(`close`,()=>reject(Error(`CDP socket closed`)))});try{await openPromise}catch(err){throw closeWithError(err instanceof Error?err:Error(String(err))),err}try{return await fn(send)}catch(err){throw closeWithError(err instanceof Error?err:Error(String(err))),err}finally{try{ws.close()}catch{}}}function normalizeCdpWsUrl(wsUrl,cdpUrl){let ws=new URL(wsUrl),cdp=new URL(cdpUrl);if(isLoopbackHost(ws.hostname)&&!isLoopbackHost(cdp.hostname)){ws.hostname=cdp.hostname;let cdpPort=cdp.port||(cdp.protocol===`https:`?`443`:`80`);cdpPort&&(ws.port=cdpPort),ws.protocol=cdp.protocol===`https:`?`wss:`:`ws:`}cdp.protocol===`https:`&&ws.protocol===`ws:`&&(ws.protocol=`wss:`),!ws.username&&!ws.password&&(cdp.username||cdp.password)&&(ws.username=cdp.username,ws.password=cdp.password);for(let[key,value]of cdp.searchParams.entries())ws.searchParams.has(key)||ws.searchParams.append(key,value);return ws.toString()}async function captureScreenshot(opts){return await withCdpSocket(opts.wsUrl,async send=>{await send(`Page.enable`);let clip;if(opts.fullPage){let metrics=await send(`Page.getLayoutMetrics`),size=metrics?.cssContentSize??metrics?.contentSize,width=Number(size?.width??0),height=Number(size?.height??0);width>0&&height>0&&(clip={x:0,y:0,width,height,scale:1})}let format=opts.format??`png`,quality=format===`jpeg`?Math.max(0,Math.min(100,Math.round(opts.quality??85))):void 0,base64=(await send(`Page.captureScreenshot`,{format,...quality===void 0?{}:{quality},fromSurface:!0,captureBeyondViewport:!0,...clip?{clip}:{}}))?.data;if(!base64)throw Error(`Screenshot failed: missing data`);return Buffer.from(base64,`base64`)})}async function createTargetViaCdp(opts){let version=await fetchJson(appendCdpPath(opts.cdpUrl,`/json/version`),1500),wsUrlRaw=String(version?.webSocketDebuggerUrl??``).trim(),wsUrl=wsUrlRaw?normalizeCdpWsUrl(wsUrlRaw,opts.cdpUrl):``;if(!wsUrl)throw Error(`CDP /json/version missing webSocketDebuggerUrl`);return await withCdpSocket(wsUrl,async send=>{let created=await send(`Target.createTarget`,{url:opts.url}),targetId=String(created?.targetId??``).trim();if(!targetId)throw Error(`CDP Target.createTarget returned no targetId`);return{targetId}})}function axValue(v){if(!v||typeof v!=`object`)return``;let value=v.value;return typeof value==`string`?value:typeof value==`number`||typeof value==`boolean`?String(value):``}function formatAriaSnapshot(nodes,limit){let byId=new Map;for(let n of nodes)n.nodeId&&byId.set(n.nodeId,n);let referenced=new Set;for(let n of nodes)for(let c of n.childIds??[])referenced.add(c);let root=nodes.find(n=>n.nodeId&&!referenced.has(n.nodeId))??nodes[0];if(!root?.nodeId)return[];let out=[],stack=[{id:root.nodeId,depth:0}];for(;stack.length&&out.length<limit;){let popped=stack.pop();if(!popped)break;let{id,depth}=popped,n=byId.get(id);if(!n)continue;let role=axValue(n.role),name=axValue(n.name),value=axValue(n.value),description=axValue(n.description),ref=`ax${out.length+1}`;out.push({ref,role:role||`unknown`,name:name||``,...value?{value}:{},...description?{description}:{},...typeof n.backendDOMNodeId==`number`?{backendDOMNodeId:n.backendDOMNodeId}:{},depth});let children=(n.childIds??[]).filter(c=>byId.has(c));for(let i=children.length-1;i>=0;i--){let child=children[i];child&&stack.push({id:child,depth:depth+1})}}return out}async function snapshotAria(opts){let limit=Math.max(1,Math.min(2e3,Math.floor(opts.limit??500)));return await withCdpSocket(opts.wsUrl,async send=>{await send(`Accessibility.enable`).catch(()=>{});let res=await send(`Accessibility.getFullAXTree`);return{nodes:formatAriaSnapshot(Array.isArray(res?.nodes)?res.nodes:[],limit)}})}const CHROMIUM_BUNDLE_IDS=new Set([`com.google.Chrome`,`com.google.Chrome.beta`,`com.google.Chrome.canary`,`com.google.Chrome.dev`,`com.brave.Browser`,`com.brave.Browser.beta`,`com.brave.Browser.nightly`,`com.microsoft.Edge`,`com.microsoft.EdgeBeta`,`com.microsoft.EdgeDev`,`com.microsoft.EdgeCanary`,`org.chromium.Chromium`,`com.vivaldi.Vivaldi`,`com.operasoftware.Opera`,`com.operasoftware.OperaGX`,`com.yandex.desktop.yandex-browser`,`company.thebrowser.Browser`]),CHROMIUM_DESKTOP_IDS=new Set([`google-chrome.desktop`,`google-chrome-beta.desktop`,`google-chrome-unstable.desktop`,`brave-browser.desktop`,`microsoft-edge.desktop`,`microsoft-edge-beta.desktop`,`microsoft-edge-dev.desktop`,`microsoft-edge-canary.desktop`,`chromium.desktop`,`chromium-browser.desktop`,`vivaldi.desktop`,`vivaldi-stable.desktop`,`opera.desktop`,`opera-gx.desktop`,`yandex-browser.desktop`,`org.chromium.Chromium.desktop`]),CHROMIUM_EXE_NAMES=new Set(`chrome.exe,msedge.exe,brave.exe,brave-browser.exe,chromium.exe,vivaldi.exe,opera.exe,launcher.exe,yandex.exe,yandexbrowser.exe,google chrome,google chrome canary,brave browser,microsoft edge,chromium,chrome,brave,msedge,brave-browser,google-chrome,google-chrome-stable,google-chrome-beta,google-chrome-unstable,microsoft-edge,microsoft-edge-beta,microsoft-edge-dev,microsoft-edge-canary,chromium-browser,vivaldi,vivaldi-stable,opera,opera-stable,opera-gx,yandex-browser`.split(`,`));function exists$1(filePath){try{return fs.existsSync(filePath)}catch{return!1}}function execText(command,args,timeoutMs=1200,maxBuffer=1024*1024){try{let output=execFileSync(command,args,{timeout:timeoutMs,encoding:`utf8`,maxBuffer});return String(output??``).trim()||null}catch{return null}}function inferKindFromIdentifier(identifier){let id=identifier.toLowerCase();return id.includes(`brave`)?`brave`:id.includes(`edge`)?`edge`:id.includes(`chromium`)?`chromium`:id.includes(`canary`)?`canary`:id.includes(`opera`)||id.includes(`vivaldi`)||id.includes(`yandex`)||id.includes(`thebrowser`)?`chromium`:`chrome`}function inferKindFromExecutableName(name){let lower=name.toLowerCase();return lower.includes(`brave`)?`brave`:lower.includes(`edge`)||lower.includes(`msedge`)?`edge`:lower.includes(`chromium`)?`chromium`:lower.includes(`canary`)||lower.includes(`sxs`)?`canary`:lower.includes(`opera`)||lower.includes(`vivaldi`)||lower.includes(`yandex`)?`chromium`:`chrome`}function detectDefaultChromiumExecutable(platform){return platform===`darwin`?detectDefaultChromiumExecutableMac():platform===`linux`?detectDefaultChromiumExecutableLinux():platform===`win32`?detectDefaultChromiumExecutableWindows():null}function detectDefaultChromiumExecutableMac(){let bundleId=detectDefaultBrowserBundleIdMac();if(!bundleId||!CHROMIUM_BUNDLE_IDS.has(bundleId))return null;let appPathRaw=execText(`/usr/bin/osascript`,[`-e`,`POSIX path of (path to application id "${bundleId}")`]);if(!appPathRaw)return null;let appPath=appPathRaw.trim().replace(/\/$/,``),exeName=execText(`/usr/bin/defaults`,[`read`,path.join(appPath,`Contents`,`Info`),`CFBundleExecutable`]);if(!exeName)return null;let exePath=path.join(appPath,`Contents`,`MacOS`,exeName.trim());return exists$1(exePath)?{kind:inferKindFromIdentifier(bundleId),path:exePath}:null}function detectDefaultBrowserBundleIdMac(){let plistPath=path.join(os.homedir(),`Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist`);if(!exists$1(plistPath))return null;let handlersRaw=execText(`/usr/bin/plutil`,[`-extract`,`LSHandlers`,`json`,`-o`,`-`,`--`,plistPath],2e3,5*1024*1024);if(!handlersRaw)return null;let handlers;try{handlers=JSON.parse(handlersRaw)}catch{return null}if(!Array.isArray(handlers))return null;let resolveScheme=scheme=>{let candidate=null;for(let entry of handlers){if(!entry||typeof entry!=`object`)continue;let record=entry;if(record.LSHandlerURLScheme!==scheme)continue;let role=typeof record.LSHandlerRoleAll==`string`&&record.LSHandlerRoleAll||typeof record.LSHandlerRoleViewer==`string`&&record.LSHandlerRoleViewer||null;role&&(candidate=role)}return candidate};return resolveScheme(`http`)??resolveScheme(`https`)}function detectDefaultChromiumExecutableLinux(){let desktopId=execText(`xdg-settings`,[`get`,`default-web-browser`])||execText(`xdg-mime`,[`query`,`default`,`x-scheme-handler/http`]);if(!desktopId)return null;let trimmed=desktopId.trim();if(!CHROMIUM_DESKTOP_IDS.has(trimmed))return null;let desktopPath=findDesktopFilePath(trimmed);if(!desktopPath)return null;let execLine=readDesktopExecLine(desktopPath);if(!execLine)return null;let command=extractExecutableFromExecLine(execLine);if(!command)return null;let resolved=resolveLinuxExecutablePath(command);if(!resolved)return null;let exeName=path.posix.basename(resolved).toLowerCase();return CHROMIUM_EXE_NAMES.has(exeName)?{kind:inferKindFromExecutableName(exeName),path:resolved}:null}function detectDefaultChromiumExecutableWindows(){let progId=readWindowsProgId(),command=(progId?readWindowsCommandForProgId(progId):null)||readWindowsCommandForProgId(`http`);if(!command)return null;let exePath=extractWindowsExecutablePath(expandWindowsEnvVars(command));if(!exePath||!exists$1(exePath))return null;let exeName=path.win32.basename(exePath).toLowerCase();return CHROMIUM_EXE_NAMES.has(exeName)?{kind:inferKindFromExecutableName(exeName),path:exePath}:null}function findDesktopFilePath(desktopId){let candidates=[path.join(os.homedir(),`.local`,`share`,`applications`,desktopId),path.join(`/usr/local/share/applications`,desktopId),path.join(`/usr/share/applications`,desktopId),path.join(`/var/lib/snapd/desktop/applications`,desktopId)];for(let candidate of candidates)if(exists$1(candidate))return candidate;return null}function readDesktopExecLine(desktopPath){try{let lines=fs.readFileSync(desktopPath,`utf8`).split(/\r?\n/);for(let line of lines)if(line.startsWith(`Exec=`))return line.slice(5).trim()}catch{}return null}function extractExecutableFromExecLine(execLine){let tokens=splitExecLine(execLine);for(let token of tokens)if(token&&token!==`env`&&!(token.includes(`=`)&&!token.startsWith(`/`)&&!token.includes(`\\`)))return token.replace(/^["']|["']$/g,``);return null}function splitExecLine(line){let tokens=[],current=``,inQuotes=!1,quoteChar=``;for(let i=0;i<line.length;i+=1){let ch=line[i];if((ch===`"`||ch===`'`)&&(!inQuotes||ch===quoteChar)){inQuotes?(inQuotes=!1,quoteChar=``):(inQuotes=!0,quoteChar=ch);continue}if(!inQuotes&&/\s/.test(ch)){current&&=(tokens.push(current),``);continue}current+=ch}return current&&tokens.push(current),tokens}function resolveLinuxExecutablePath(command){let cleaned=command.trim().replace(/%[a-zA-Z]/g,``);if(!cleaned)return null;if(cleaned.startsWith(`/`))return cleaned;let resolved=execText(`which`,[cleaned],800);return resolved?resolved.trim():null}function readWindowsProgId(){let output=execText(`reg`,[`query`,`HKCU\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice`,`/v`,`ProgId`]);return output&&output.match(/ProgId\s+REG_\w+\s+(.+)$/im)?.[1]?.trim()||null}function readWindowsCommandForProgId(progId){let output=execText(`reg`,[`query`,progId===`http`?`HKCR\\http\\shell\\open\\command`:`HKCR\\${progId}\\shell\\open\\command`,`/ve`]);return output&&output.match(/REG_\w+\s+(.+)$/im)?.[1]?.trim()||null}function expandWindowsEnvVars(value){return value.replace(/%([^%]+)%/g,(_match,name)=>{let key=String(name??``).trim();return key?process.env[key]??`%${key}%`:_match})}function extractWindowsExecutablePath(command){let quoted=command.match(/"([^"]+\\.exe)"/i);if(quoted?.[1])return quoted[1];let unquoted=command.match(/([^\\s]+\\.exe)/i);return unquoted?.[1]?unquoted[1]:null}function findFirstExecutable(candidates){for(let candidate of candidates)if(exists$1(candidate.path))return candidate;return null}function findChromeExecutableMac(){return findFirstExecutable([{kind:`chrome`,path:`/Applications/Google Chrome.app/Contents/MacOS/Google Chrome`},{kind:`chrome`,path:path.join(os.homedir(),`Applications/Google Chrome.app/Contents/MacOS/Google Chrome`)},{kind:`brave`,path:`/Applications/Brave Browser.app/Contents/MacOS/Brave Browser`},{kind:`brave`,path:path.join(os.homedir(),`Applications/Brave Browser.app/Contents/MacOS/Brave Browser`)},{kind:`edge`,path:`/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge`},{kind:`edge`,path:path.join(os.homedir(),`Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge`)},{kind:`chromium`,path:`/Applications/Chromium.app/Contents/MacOS/Chromium`},{kind:`chromium`,path:path.join(os.homedir(),`Applications/Chromium.app/Contents/MacOS/Chromium`)},{kind:`canary`,path:`/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary`},{kind:`canary`,path:path.join(os.homedir(),`Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary`)}])}function findChromeExecutableLinux(){return findFirstExecutable([{kind:`chrome`,path:`/usr/bin/google-chrome`},{kind:`chrome`,path:`/usr/bin/google-chrome-stable`},{kind:`chrome`,path:`/usr/bin/chrome`},{kind:`brave`,path:`/usr/bin/brave-browser`},{kind:`brave`,path:`/usr/bin/brave-browser-stable`},{kind:`brave`,path:`/usr/bin/brave`},{kind:`brave`,path:`/snap/bin/brave`},{kind:`edge`,path:`/usr/bin/microsoft-edge`},{kind:`edge`,path:`/usr/bin/microsoft-edge-stable`},{kind:`chromium`,path:`/usr/bin/chromium`},{kind:`chromium`,path:`/usr/bin/chromium-browser`},{kind:`chromium`,path:`/snap/bin/chromium`}])}function findChromeExecutableWindows(){let localAppData=process.env.LOCALAPPDATA??``,programFiles=process.env.ProgramFiles??`C:\\Program Files`,programFilesX86=process.env[`ProgramFiles(x86)`]??`C:\\Program Files (x86)`,joinWin=path.win32.join,candidates=[];return localAppData&&(candidates.push({kind:`chrome`,path:joinWin(localAppData,`Google`,`Chrome`,`Application`,`chrome.exe`)}),candidates.push({kind:`brave`,path:joinWin(localAppData,`BraveSoftware`,`Brave-Browser`,`Application`,`brave.exe`)}),candidates.push({kind:`edge`,path:joinWin(localAppData,`Microsoft`,`Edge`,`Application`,`msedge.exe`)}),candidates.push({kind:`chromium`,path:joinWin(localAppData,`Chromium`,`Application`,`chrome.exe`)}),candidates.push({kind:`canary`,path:joinWin(localAppData,`Google`,`Chrome SxS`,`Application`,`chrome.exe`)})),candidates.push({kind:`chrome`,path:joinWin(programFiles,`Google`,`Chrome`,`Application`,`chrome.exe`)}),candidates.push({kind:`chrome`,path:joinWin(programFilesX86,`Google`,`Chrome`,`Application`,`chrome.exe`)}),candidates.push({kind:`brave`,path:joinWin(programFiles,`BraveSoftware`,`Brave-Browser`,`Application`,`brave.exe`)}),candidates.push({kind:`brave`,path:joinWin(programFilesX86,`BraveSoftware`,`Brave-Browser`,`Application`,`brave.exe`)}),candidates.push({kind:`edge`,path:joinWin(programFiles,`Microsoft`,`Edge`,`Application`,`msedge.exe`)}),candidates.push({kind:`edge`,path:joinWin(programFilesX86,`Microsoft`,`Edge`,`Application`,`msedge.exe`)}),findFirstExecutable(candidates)}function resolveBrowserExecutableForPlatform(resolved,platform){if(resolved.executablePath){if(!exists$1(resolved.executablePath))throw Error(`browser.executablePath not found: ${resolved.executablePath}`);return{kind:`custom`,path:resolved.executablePath}}return detectDefaultChromiumExecutable(platform)||(platform===`darwin`?findChromeExecutableMac():platform===`linux`?findChromeExecutableLinux():platform===`win32`?findChromeExecutableWindows():null)}process.platform;var PortInUseError=class extends Error{constructor(port,details){super(`Port ${port} is already in use.`),this.name=`PortInUseError`,this.port=port,this.details=details}};async function ensurePortAvailable(port){try{await new Promise((resolve,reject)=>{let tester=net.createServer().once(`error`,err=>reject(err)).once(`listening`,()=>{tester.close(()=>resolve())}).listen(port)})}catch(err){throw isErrno(err)&&err.code===`EADDRINUSE`?new PortInUseError(port):err}}function decoratedMarkerPath(userDataDir){return path.join(userDataDir,`.builderforce-profile-decorated`)}function safeReadJson(filePath){try{if(!fs.existsSync(filePath))return null;let raw=fs.readFileSync(filePath,`utf-8`),parsed=JSON.parse(raw);return typeof parsed!=`object`||!parsed||Array.isArray(parsed)?null:parsed}catch{return null}}function safeWriteJson(filePath,data){fs.mkdirSync(path.dirname(filePath),{recursive:!0}),fs.writeFileSync(filePath,JSON.stringify(data,null,2))}function setDeep(obj,keys,value){let node=obj;for(let key of keys.slice(0,-1)){let next=node[key];(typeof next!=`object`||!next||Array.isArray(next))&&(node[key]={}),node=node[key]}node[keys[keys.length-1]??``]=value}function parseHexRgbToSignedArgbInt(hex){let cleaned=hex.trim().replace(/^#/,``);if(!/^[0-9a-fA-F]{6}$/.test(cleaned))return null;let argbUnsigned=255<<24|Number.parseInt(cleaned,16);return argbUnsigned>2147483647?argbUnsigned-4294967296:argbUnsigned}function isProfileDecorated(userDataDir,desiredName,desiredColorHex){let desiredColorInt=parseHexRgbToSignedArgbInt(desiredColorHex),localStatePath=path.join(userDataDir,`Local State`),preferencesPath=path.join(userDataDir,`Default`,`Preferences`),profile=safeReadJson(localStatePath)?.profile,infoCache=typeof profile==`object`&&profile&&!Array.isArray(profile)?profile.info_cache:null,info=typeof infoCache==`object`&&infoCache&&!Array.isArray(infoCache)&&typeof infoCache.Default==`object`&&infoCache.Default!==null&&!Array.isArray(infoCache.Default)?infoCache.Default:null,prefs=safeReadJson(preferencesPath),browserTheme=(()=>{let browser=prefs?.browser,theme=typeof browser==`object`&&browser&&!Array.isArray(browser)?browser.theme:null;return typeof theme==`object`&&theme&&!Array.isArray(theme)?theme:null})(),autogeneratedTheme=(()=>{let autogenerated=prefs?.autogenerated,theme=typeof autogenerated==`object`&&autogenerated&&!Array.isArray(autogenerated)?autogenerated.theme:null;return typeof theme==`object`&&theme&&!Array.isArray(theme)?theme:null})(),nameOk=typeof info?.name==`string`?info.name===desiredName:!0;if(desiredColorInt==null)return nameOk;let localSeedOk=typeof info?.profile_color_seed==`number`?info.profile_color_seed===desiredColorInt:!1,prefOk=typeof browserTheme?.user_color2==`number`&&browserTheme.user_color2===desiredColorInt||typeof autogeneratedTheme?.color==`number`&&autogeneratedTheme.color===desiredColorInt;return nameOk&&localSeedOk&&prefOk}function decorateBuilderForceAgentsProfile(userDataDir,opts){let desiredName=opts?.name??DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME,desiredColor=(opts?.color??DEFAULT_BUILDERFORCE_AGENTS_BROWSER_COLOR).toUpperCase(),desiredColorInt=parseHexRgbToSignedArgbInt(desiredColor),localStatePath=path.join(userDataDir,`Local State`),preferencesPath=path.join(userDataDir,`Default`,`Preferences`),localState=safeReadJson(localStatePath)??{};setDeep(localState,[`profile`,`info_cache`,`Default`,`name`],desiredName),setDeep(localState,[`profile`,`info_cache`,`Default`,`shortcut_name`],desiredName),setDeep(localState,[`profile`,`info_cache`,`Default`,`user_name`],desiredName),setDeep(localState,[`profile`,`info_cache`,`Default`,`profile_color`],desiredColor),setDeep(localState,[`profile`,`info_cache`,`Default`,`user_color`],desiredColor),desiredColorInt!=null&&(setDeep(localState,[`profile`,`info_cache`,`Default`,`profile_color_seed`],desiredColorInt),setDeep(localState,[`profile`,`info_cache`,`Default`,`profile_highlight_color`],desiredColorInt),setDeep(localState,[`profile`,`info_cache`,`Default`,`default_avatar_fill_color`],desiredColorInt),setDeep(localState,[`profile`,`info_cache`,`Default`,`default_avatar_stroke_color`],desiredColorInt)),safeWriteJson(localStatePath,localState);let prefs=safeReadJson(preferencesPath)??{};setDeep(prefs,[`profile`,`name`],desiredName),setDeep(prefs,[`profile`,`profile_color`],desiredColor),setDeep(prefs,[`profile`,`user_color`],desiredColor),desiredColorInt!=null&&(setDeep(prefs,[`autogenerated`,`theme`,`color`],desiredColorInt),setDeep(prefs,[`browser`,`theme`,`user_color2`],desiredColorInt)),safeWriteJson(preferencesPath,prefs);try{fs.writeFileSync(decoratedMarkerPath(userDataDir),`${Date.now()}\n`,`utf-8`)}catch{}}function ensureProfileCleanExit(userDataDir){let preferencesPath=path.join(userDataDir,`Default`,`Preferences`),prefs=safeReadJson(preferencesPath)??{};setDeep(prefs,[`exit_type`],`Normal`),setDeep(prefs,[`exited_cleanly`],!0),safeWriteJson(preferencesPath,prefs)}const log=createSubsystemLogger(`browser`).child(`chrome`);function exists(filePath){try{return fs.existsSync(filePath)}catch{return!1}}function resolveBrowserExecutable(resolved){return resolveBrowserExecutableForPlatform(resolved,process.platform)}function resolveBuilderForceAgentsUserDataDir(profileName=DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME){return path.join(CONFIG_DIR,`browser`,profileName,`user-data`)}function cdpUrlForPort(cdpPort){return`http://127.0.0.1:${cdpPort}`}async function isChromeReachable(cdpUrl,timeoutMs=500){return!!await fetchChromeVersion(cdpUrl,timeoutMs)}async function fetchChromeVersion(cdpUrl,timeoutMs=500){let ctrl=new AbortController,t=setTimeout(ctrl.abort.bind(ctrl),timeoutMs);try{let versionUrl=appendCdpPath(cdpUrl,`/json/version`),res=await fetch(versionUrl,{signal:ctrl.signal,headers:getHeadersWithAuth(versionUrl)});if(!res.ok)return null;let data=await res.json();return!data||typeof data!=`object`?null:data}catch{return null}finally{clearTimeout(t)}}async function getChromeWebSocketUrl(cdpUrl,timeoutMs=500){let version=await fetchChromeVersion(cdpUrl,timeoutMs),wsUrl=String(version?.webSocketDebuggerUrl??``).trim();return wsUrl?normalizeCdpWsUrl(wsUrl,cdpUrl):null}async function canOpenWebSocket(wsUrl,timeoutMs=800){return await new Promise(resolve=>{let headers=getHeadersWithAuth(wsUrl),ws=new WebSocket(wsUrl,{handshakeTimeout:timeoutMs,...Object.keys(headers).length?{headers}:{}}),timer=setTimeout(()=>{try{ws.terminate()}catch{}resolve(!1)},Math.max(50,timeoutMs+25));ws.once(`open`,()=>{clearTimeout(timer);try{ws.close()}catch{}resolve(!0)}),ws.once(`error`,()=>{clearTimeout(timer),resolve(!1)})})}async function isChromeCdpReady(cdpUrl,timeoutMs=500,handshakeTimeoutMs=800){let wsUrl=await getChromeWebSocketUrl(cdpUrl,timeoutMs);return wsUrl?await canOpenWebSocket(wsUrl,handshakeTimeoutMs):!1}async function launchBuilderForceAgentsChrome(resolved,profile){if(!profile.cdpIsLoopback)throw Error(`Profile "${profile.name}" is remote; cannot launch local Chrome.`);await ensurePortAvailable(profile.cdpPort);let exe=resolveBrowserExecutable(resolved);if(!exe)throw Error(`No supported browser found (Chrome/Brave/Edge/Chromium on macOS, Linux, or Windows).`);let userDataDir=resolveBuilderForceAgentsUserDataDir(profile.name);fs.mkdirSync(userDataDir,{recursive:!0});let needsDecorate=!isProfileDecorated(userDataDir,profile.name,(profile.color??DEFAULT_BUILDERFORCE_AGENTS_BROWSER_COLOR).toUpperCase()),spawnOnce=()=>{let args=[`--remote-debugging-port=${profile.cdpPort}`,`--user-data-dir=${userDataDir}`,`--no-first-run`,`--no-default-browser-check`,`--disable-sync`,`--disable-background-networking`,`--disable-component-update`,`--disable-features=Translate,MediaRouter`,`--disable-session-crashed-bubble`,`--hide-crash-restore-bubble`,`--password-store=basic`];return resolved.headless&&(args.push(`--headless=new`),args.push(`--disable-gpu`)),resolved.noSandbox&&(args.push(`--no-sandbox`),args.push(`--disable-setuid-sandbox`)),process.platform===`linux`&&args.push(`--disable-dev-shm-usage`),args.push(`--disable-blink-features=AutomationControlled`),resolved.extraArgs.length>0&&args.push(...resolved.extraArgs),args.push(`about:blank`),spawn(exe.path,args,{stdio:`pipe`,env:{...process.env,HOME:os.homedir()}})},startedAt=Date.now(),localStatePath=path.join(userDataDir,`Local State`),preferencesPath=path.join(userDataDir,`Default`,`Preferences`);if(!exists(localStatePath)||!exists(preferencesPath)){let bootstrap=spawnOnce(),deadline=Date.now()+1e4;for(;Date.now()<deadline&&!(exists(localStatePath)&&exists(preferencesPath));)await new Promise(r=>setTimeout(r,100));try{bootstrap.kill(`SIGTERM`)}catch{}let exitDeadline=Date.now()+5e3;for(;Date.now()<exitDeadline&&bootstrap.exitCode==null;)await new Promise(r=>setTimeout(r,50))}if(needsDecorate)try{decorateBuilderForceAgentsProfile(userDataDir,{name:profile.name,color:profile.color}),log.info(`🤖 builderforce browser profile decorated (${profile.color})`)}catch(err){log.warn(`builderforce browser profile decoration failed: ${String(err)}`)}try{ensureProfileCleanExit(userDataDir)}catch(err){log.warn(`builderforce browser clean-exit prefs failed: ${String(err)}`)}let proc=spawnOnce(),readyDeadline=Date.now()+15e3;for(;Date.now()<readyDeadline&&!await isChromeReachable(profile.cdpUrl,500);)await new Promise(r=>setTimeout(r,200));if(!await isChromeReachable(profile.cdpUrl,500)){try{proc.kill(`SIGKILL`)}catch{}throw Error(`Failed to start Chrome CDP on port ${profile.cdpPort} for profile "${profile.name}".`)}let pid=proc.pid??-1;return log.info(`🤖 builderforce browser started (${exe.kind}) profile "${profile.name}" on 127.0.0.1:${profile.cdpPort} (pid ${pid})`),{pid,exe,userDataDir,cdpPort:profile.cdpPort,startedAt,proc}}async function stopBuilderForceAgentsChrome(running,timeoutMs=2500){let proc=running.proc;if(proc.killed)return;try{proc.kill(`SIGTERM`)}catch{}let start=Date.now();for(;Date.now()-start<timeoutMs&&!(!proc.exitCode&&proc.killed);){if(!await isChromeReachable(cdpUrlForPort(running.cdpPort),200))return;await new Promise(r=>setTimeout(r,100))}try{proc.kill(`SIGKILL`)}catch{}}export{DEFAULT_BUILDERFORCE_AGENTS_BROWSER_COLOR as A,pickPrimaryLanIPv4 as C,DEFAULT_AI_SNAPSHOT_MAX_CHARS as D,DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS as E,DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME as M,DEFAULT_BROWSER_DEFAULT_PROFILE_NAME as O,isLoopbackHost as S,DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH as T,withCdpSocket as _,resolveBuilderForceAgentsUserDataDir as a,rawDataToString as b,captureScreenshot as c,normalizeCdpWsUrl as d,snapshotAria as f,getHeadersWithAuth as g,fetchOk as h,launchBuilderForceAgentsChrome as i,DEFAULT_BUILDERFORCE_AGENTS_BROWSER_ENABLED as j,DEFAULT_BROWSER_EVALUATE_ENABLED as k,createTargetViaCdp as l,fetchJson as m,isChromeCdpReady as n,stopBuilderForceAgentsChrome as o,appendCdpPath as p,isChromeReachable as r,resolveBrowserExecutableForPlatform as s,getChromeWebSocketUrl as t,formatAriaSnapshot as u,ensureChromeExtensionRelayServer as v,pickPrimaryTailnetIPv4 as w,resolvePreferredBuilderForceAgentsTmpDir as x,stopChromeExtensionRelayServer as y};
@@ -0,0 +1,4 @@
1
+ import{x as CONFIG_DIR}from"./registry-D_frpmHZ.js";import{t as createSubsystemLogger}from"./subsystem-BakM_oqD.js";import{i as isErrno}from"./errors-BmztzL5I.js";import{n as loadConfig}from"./config-bxyMjPHU.js";import"node:fs/promises";import os from"node:os";import path from"node:path";import fs$1 from"node:fs";import{createHash,randomBytes}from"node:crypto";import{execFileSync,spawn}from"node:child_process";import net from"node:net";import{createServer}from"node:http";import WebSocket$1,{WebSocketServer}from"ws";import{Buffer as Buffer$1}from"node:buffer";const DEFAULT_BUILDERFORCE_AGENTS_BROWSER_ENABLED=!0,DEFAULT_BROWSER_EVALUATE_ENABLED=!0,DEFAULT_BUILDERFORCE_AGENTS_BROWSER_COLOR=`#FF4500`,DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME=`builderforce`,DEFAULT_BROWSER_DEFAULT_PROFILE_NAME=`chrome`,DEFAULT_AI_SNAPSHOT_MAX_CHARS=8e4,DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS=1e4,DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH=6;function isTailnetIPv4(address){let parts=address.split(`.`);if(parts.length!==4)return!1;let octets=parts.map(p=>Number.parseInt(p,10));if(octets.some(n=>!Number.isFinite(n)||n<0||n>255))return!1;let[a,b]=octets;return a===100&&b>=64&&b<=127}function isTailnetIPv6(address){return address.trim().toLowerCase().startsWith(`fd7a:115c:a1e0:`)}function listTailnetAddresses(){let ipv4=[],ipv6=[],ifaces=os.networkInterfaces();for(let entries of Object.values(ifaces))if(entries)for(let e of entries){if(!e||e.internal)continue;let address=e.address?.trim();address&&(isTailnetIPv4(address)&&ipv4.push(address),isTailnetIPv6(address)&&ipv6.push(address))}return{ipv4:[...new Set(ipv4)],ipv6:[...new Set(ipv6)]}}function pickPrimaryTailnetIPv4(){return listTailnetAddresses().ipv4[0]}function pickPrimaryLanIPv4(){let nets=os.networkInterfaces();for(let name of[`en0`,`eth0`]){let entry=nets[name]?.find(n=>n.family===`IPv4`&&!n.internal);if(entry?.address)return entry.address}for(let list of Object.values(nets)){let entry=list?.find(n=>n.family===`IPv4`&&!n.internal);if(entry?.address)return entry.address}}function isLoopbackAddress(ip){return ip?!!(ip===`127.0.0.1`||ip.startsWith(`127.`)||ip===`::1`||ip.startsWith(`::ffff:127.`)):!1}function isLoopbackHost(host){if(!host)return!1;let h=host.trim().toLowerCase();return h===`localhost`?!0:isLoopbackAddress(h.startsWith(`[`)&&h.endsWith(`]`)?h.slice(1,-1):h)}function rawDataToString(data,encoding=`utf8`){return typeof data==`string`?data:Buffer$1.isBuffer(data)?data.toString(encoding):Array.isArray(data)?Buffer$1.concat(data).toString(encoding):data instanceof ArrayBuffer?Buffer$1.from(data).toString(encoding):Buffer$1.from(String(data)).toString(encoding)}const RELAY_AUTH_HEADER=`x-builderforce-relay-token`;function headerValue(value){if(value)return Array.isArray(value)?value[0]:value}function getHeader(req,name){return headerValue(req.headers[name.toLowerCase()])}function parseBaseUrl(raw){let parsed=new URL(raw.trim().replace(/\/$/,``));if(parsed.protocol!==`http:`&&parsed.protocol!==`https:`)throw Error(`extension relay cdpUrl must be http(s), got ${parsed.protocol}`);let host=parsed.hostname,port=parsed.port?.trim()===``?parsed.protocol===`https:`?443:80:Number(parsed.port);if(!Number.isFinite(port)||port<=0||port>65535)throw Error(`extension relay cdpUrl has invalid port: ${parsed.port||`(empty)`}`);return{host,port,baseUrl:parsed.toString().replace(/\/$/,``)}}function text(res,status,bodyText){let body=Buffer.from(bodyText);res.write(`HTTP/1.1 ${status} ${status===200?`OK`:`ERR`}\r\nContent-Type: text/plain; charset=utf-8\r
2
+ Content-Length: ${body.length}\r\nConnection: close\r
3
+ \r
4
+ `),res.write(body),res.end()}function rejectUpgrade(socket,status,bodyText){text(socket,status,bodyText);try{socket.destroy()}catch{}}const serversByPort=new Map,relayAuthByPort=new Map;function resolveGatewayAuthToken(){let envToken=process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN?.trim()||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN?.trim();if(envToken)return envToken;try{let configToken=loadConfig().gateway?.auth?.token?.trim();if(configToken)return configToken}catch{}return null}function deriveDeterministicRelayAuthToken(port){let gatewayToken=resolveGatewayAuthToken();return gatewayToken?createHash(`sha256`).update(`builderforce-relay:${port}:`).update(gatewayToken).digest(`base64url`):null}function resolveRelayAuthToken(port){return deriveDeterministicRelayAuthToken(port)??randomBytes(32).toString(`base64url`)}function isAddrInUseError(err){return typeof err==`object`&&!!err&&`code`in err&&err.code===`EADDRINUSE`}async function looksLikeBuilderForceAgentsRelay(baseUrl){let ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),500);try{let statusUrl=new URL(`/extension/status`,`${baseUrl}/`).toString(),res=await fetch(statusUrl,{signal:ctrl.signal});return res.ok?typeof(await res.json()).connected==`boolean`:!1}catch{return!1}finally{clearTimeout(timer)}}function relayAuthTokenForUrl(url){try{let parsed=new URL(url);if(!isLoopbackHost(parsed.hostname))return null;let port=parsed.port?.trim()===``?parsed.protocol===`https:`||parsed.protocol===`wss:`?443:80:Number(parsed.port);return Number.isFinite(port)?relayAuthByPort.get(port)??deriveDeterministicRelayAuthToken(port):null}catch{return null}}function getChromeExtensionRelayAuthHeaders(url){let token=relayAuthTokenForUrl(url);return token?{[RELAY_AUTH_HEADER]:token}:{}}async function ensureChromeExtensionRelayServer(opts){let info=parseBaseUrl(opts.cdpUrl);if(!isLoopbackHost(info.host))throw Error(`extension relay requires loopback cdpUrl host (got ${info.host})`);let existing=serversByPort.get(info.port);if(existing)return existing;let relayAuthToken=resolveRelayAuthToken(info.port),extensionWs=null,cdpClients=new Set,connectedTargets=new Map,pendingExtension=new Map,nextExtensionId=1,sendToExtension=async payload=>{let ws=extensionWs;if(!ws||ws.readyState!==WebSocket$1.OPEN)throw Error(`Chrome extension not connected`);return ws.send(JSON.stringify(payload)),await new Promise((resolve,reject)=>{let timer=setTimeout(()=>{pendingExtension.delete(payload.id),reject(Error(`extension request timeout: ${payload.params.method}`))},3e4);pendingExtension.set(payload.id,{resolve,reject,timer})})},broadcastToCdpClients=evt=>{let msg=JSON.stringify(evt);for(let ws of cdpClients)ws.readyState===WebSocket$1.OPEN&&ws.send(msg)},sendResponseToCdp=(ws,res)=>{ws.readyState===WebSocket$1.OPEN&&ws.send(JSON.stringify(res))},ensureTargetEventsForClient=(ws,mode)=>{for(let target of connectedTargets.values())mode===`autoAttach`?ws.send(JSON.stringify({method:`Target.attachedToTarget`,params:{sessionId:target.sessionId,targetInfo:{...target.targetInfo,attached:!0},waitingForDebugger:!1}})):ws.send(JSON.stringify({method:`Target.targetCreated`,params:{targetInfo:{...target.targetInfo,attached:!0}}}))},routeCdpCommand=async cmd=>{switch(cmd.method){case`Browser.getVersion`:return{protocolVersion:`1.3`,product:`Chrome/BuilderForceAgents-Extension-Relay`,revision:`0`,userAgent:`BuilderForceAgents-Extension-Relay`,jsVersion:`V8`};case`Browser.setDownloadBehavior`:return{};case`Target.setAutoAttach`:case`Target.setDiscoverTargets`:return{};case`Target.getTargets`:return{targetInfos:Array.from(connectedTargets.values()).map(t=>({...t.targetInfo,attached:!0}))};case`Target.getTargetInfo`:{let params=cmd.params??{},targetId=typeof params.targetId==`string`?params.targetId:void 0;if(targetId){for(let t of connectedTargets.values())if(t.targetId===targetId)return{targetInfo:t.targetInfo}}if(cmd.sessionId&&connectedTargets.has(cmd.sessionId)){let t=connectedTargets.get(cmd.sessionId);if(t)return{targetInfo:t.targetInfo}}return{targetInfo:Array.from(connectedTargets.values())[0]?.targetInfo}}case`Target.attachToTarget`:{let params=cmd.params??{},targetId=typeof params.targetId==`string`?params.targetId:void 0;if(!targetId)throw Error(`targetId required`);for(let t of connectedTargets.values())if(t.targetId===targetId)return{sessionId:t.sessionId};throw Error(`target not found`)}default:return await sendToExtension({id:nextExtensionId++,method:`forwardCDPCommand`,params:{method:cmd.method,sessionId:cmd.sessionId,params:cmd.params}})}},server=createServer((req,res)=>{let path=new URL(req.url??`/`,info.baseUrl).pathname;if(path.startsWith(`/json`)){let token=getHeader(req,RELAY_AUTH_HEADER);if(!token||token!==relayAuthToken){res.writeHead(401),res.end(`Unauthorized`);return}}if(req.method===`HEAD`&&path===`/`){res.writeHead(200),res.end();return}if(path===`/`){res.writeHead(200,{"Content-Type":`text/plain; charset=utf-8`}),res.end(`OK`);return}if(path===`/extension/status`){res.writeHead(200,{"Content-Type":`application/json`}),res.end(JSON.stringify({connected:!!extensionWs}));return}let cdpWsUrl=`${`ws://${req.headers.host?.trim()||`${info.host}:${info.port}`}`}/cdp`;if((path===`/json/version`||path===`/json/version/`)&&(req.method===`GET`||req.method===`PUT`)){let payload={Browser:`BuilderForceAgents/extension-relay`,"Protocol-Version":`1.3`};extensionWs&&(payload.webSocketDebuggerUrl=cdpWsUrl),res.writeHead(200,{"Content-Type":`application/json`}),res.end(JSON.stringify(payload));return}if(new Set([`/json`,`/json/`,`/json/list`,`/json/list/`]).has(path)&&(req.method===`GET`||req.method===`PUT`)){let list=Array.from(connectedTargets.values()).map(t=>({id:t.targetId,type:t.targetInfo.type??`page`,title:t.targetInfo.title??``,description:t.targetInfo.title??``,url:t.targetInfo.url??``,webSocketDebuggerUrl:cdpWsUrl,devtoolsFrontendUrl:`/devtools/inspector.html?ws=${cdpWsUrl.replace(`ws://`,``)}`}));res.writeHead(200,{"Content-Type":`application/json`}),res.end(JSON.stringify(list));return}let activateMatch=path.match(/^\/json\/activate\/(.+)$/);if(activateMatch&&(req.method===`GET`||req.method===`PUT`)){let targetId=decodeURIComponent(activateMatch[1]??``).trim();if(!targetId){res.writeHead(400),res.end(`targetId required`);return}(async()=>{try{await sendToExtension({id:nextExtensionId++,method:`forwardCDPCommand`,params:{method:`Target.activateTarget`,params:{targetId}}})}catch{}})(),res.writeHead(200),res.end(`OK`);return}let closeMatch=path.match(/^\/json\/close\/(.+)$/);if(closeMatch&&(req.method===`GET`||req.method===`PUT`)){let targetId=decodeURIComponent(closeMatch[1]??``).trim();if(!targetId){res.writeHead(400),res.end(`targetId required`);return}(async()=>{try{await sendToExtension({id:nextExtensionId++,method:`forwardCDPCommand`,params:{method:`Target.closeTarget`,params:{targetId}}})}catch{}})(),res.writeHead(200),res.end(`OK`);return}res.writeHead(404),res.end(`not found`)}),wssExtension=new WebSocketServer({noServer:!0}),wssCdp=new WebSocketServer({noServer:!0});server.on(`upgrade`,(req,socket,head)=>{let pathname=new URL(req.url??`/`,info.baseUrl).pathname,remote=req.socket.remoteAddress;if(!isLoopbackAddress(remote)){rejectUpgrade(socket,403,`Forbidden`);return}let origin=headerValue(req.headers.origin);if(origin&&!origin.startsWith(`chrome-extension://`)){rejectUpgrade(socket,403,`Forbidden: invalid origin`);return}if(pathname===`/extension`){if(extensionWs){rejectUpgrade(socket,409,`Extension already connected`);return}wssExtension.handleUpgrade(req,socket,head,ws=>{wssExtension.emit(`connection`,ws,req)});return}if(pathname===`/cdp`){let token=getHeader(req,RELAY_AUTH_HEADER);if(!token||token!==relayAuthToken){rejectUpgrade(socket,401,`Unauthorized`);return}if(!extensionWs){rejectUpgrade(socket,503,`Extension not connected`);return}wssCdp.handleUpgrade(req,socket,head,ws=>{wssCdp.emit(`connection`,ws,req)});return}rejectUpgrade(socket,404,`Not Found`)}),wssExtension.on(`connection`,ws=>{extensionWs=ws;let ping=setInterval(()=>{ws.readyState===WebSocket$1.OPEN&&ws.send(JSON.stringify({method:`ping`}))},5e3);ws.on(`message`,data=>{let parsed=null;try{parsed=JSON.parse(rawDataToString(data))}catch{return}if(parsed&&typeof parsed==`object`&&`id`in parsed&&typeof parsed.id==`number`){let pending=pendingExtension.get(parsed.id);if(!pending)return;pendingExtension.delete(parsed.id),clearTimeout(pending.timer),`error`in parsed&&typeof parsed.error==`string`&&parsed.error.trim()?pending.reject(Error(parsed.error)):pending.resolve(parsed.result);return}if(parsed&&typeof parsed==`object`&&`method`in parsed){if(parsed.method===`pong`||parsed.method!==`forwardCDPEvent`)return;let evt=parsed,method=evt.params?.method,params=evt.params?.params,sessionId=evt.params?.sessionId;if(!method||typeof method!=`string`)return;if(method===`Target.attachedToTarget`){let attached=params??{};if((attached?.targetInfo?.type??`page`)!==`page`)return;if(attached?.sessionId&&attached?.targetInfo?.targetId){let prev=connectedTargets.get(attached.sessionId),nextTargetId=attached.targetInfo.targetId,prevTargetId=prev?.targetId,changedTarget=!!(prev&&prevTargetId&&prevTargetId!==nextTargetId);connectedTargets.set(attached.sessionId,{sessionId:attached.sessionId,targetId:nextTargetId,targetInfo:attached.targetInfo}),changedTarget&&prevTargetId&&broadcastToCdpClients({method:`Target.detachedFromTarget`,params:{sessionId:attached.sessionId,targetId:prevTargetId},sessionId:attached.sessionId}),(!prev||changedTarget)&&broadcastToCdpClients({method,params,sessionId});return}}if(method===`Target.detachedFromTarget`){let detached=params??{};detached?.sessionId&&connectedTargets.delete(detached.sessionId),broadcastToCdpClients({method,params,sessionId});return}if(method===`Target.targetInfoChanged`){let targetInfo=(params??{})?.targetInfo,targetId=targetInfo?.targetId;if(targetId&&(targetInfo?.type??`page`)===`page`)for(let[sid,target]of connectedTargets)target.targetId===targetId&&connectedTargets.set(sid,{...target,targetInfo:{...target.targetInfo,...targetInfo}})}broadcastToCdpClients({method,params,sessionId})}}),ws.on(`close`,()=>{clearInterval(ping),extensionWs=null;for(let[,pending]of pendingExtension)clearTimeout(pending.timer),pending.reject(Error(`extension disconnected`));pendingExtension.clear(),connectedTargets.clear();for(let client of cdpClients)try{client.close(1011,`extension disconnected`)}catch{}cdpClients.clear()})}),wssCdp.on(`connection`,ws=>{cdpClients.add(ws),ws.on(`message`,async data=>{let cmd=null;try{cmd=JSON.parse(rawDataToString(data))}catch{return}if(!(!cmd||typeof cmd!=`object`)&&!(typeof cmd.id!=`number`||typeof cmd.method!=`string`)){if(!extensionWs){sendResponseToCdp(ws,{id:cmd.id,sessionId:cmd.sessionId,error:{message:`Extension not connected`}});return}try{let result=await routeCdpCommand(cmd);if(cmd.method===`Target.setAutoAttach`&&!cmd.sessionId&&ensureTargetEventsForClient(ws,`autoAttach`),cmd.method===`Target.setDiscoverTargets`&&(cmd.params??{}).discover===!0&&ensureTargetEventsForClient(ws,`discover`),cmd.method===`Target.attachToTarget`){let params=cmd.params??{},targetId=typeof params.targetId==`string`?params.targetId:void 0;if(targetId){let target=Array.from(connectedTargets.values()).find(t=>t.targetId===targetId);target&&ws.send(JSON.stringify({method:`Target.attachedToTarget`,params:{sessionId:target.sessionId,targetInfo:{...target.targetInfo,attached:!0},waitingForDebugger:!1}}))}}sendResponseToCdp(ws,{id:cmd.id,sessionId:cmd.sessionId,result})}catch(err){sendResponseToCdp(ws,{id:cmd.id,sessionId:cmd.sessionId,error:{message:err instanceof Error?err.message:String(err)}})}}}),ws.on(`close`,()=>{cdpClients.delete(ws)})});try{await new Promise((resolve,reject)=>{server.listen(info.port,info.host,()=>resolve()),server.once(`error`,reject)})}catch(err){if(isAddrInUseError(err)&&await looksLikeBuilderForceAgentsRelay(info.baseUrl)){let existingRelay={host:info.host,port:info.port,baseUrl:info.baseUrl,cdpWsUrl:`ws://${info.host}:${info.port}/cdp`,extensionConnected:()=>!1,stop:async()=>{serversByPort.delete(info.port),relayAuthByPort.delete(info.port)}};return relayAuthByPort.set(info.port,relayAuthToken),serversByPort.set(info.port,existingRelay),existingRelay}throw err}let port=server.address()?.port??info.port,host=info.host,relay={host,port,baseUrl:`${new URL(info.baseUrl).protocol}//${host}:${port}`,cdpWsUrl:`ws://${host}:${port}/cdp`,extensionConnected:()=>!!extensionWs,stop:async()=>{serversByPort.delete(port),relayAuthByPort.delete(port);try{extensionWs?.close(1001,`server stopping`)}catch{}for(let ws of cdpClients)try{ws.close(1001,`server stopping`)}catch{}await new Promise(resolve=>{server.close(()=>resolve())}),wssExtension.close(),wssCdp.close()}};return relayAuthByPort.set(port,relayAuthToken),serversByPort.set(port,relay),relay}async function stopChromeExtensionRelayServer(opts){let info=parseBaseUrl(opts.cdpUrl),existing=serversByPort.get(info.port);return existing?(await existing.stop(),relayAuthByPort.delete(info.port),!0):!1}function getHeadersWithAuth(url,headers={}){let mergedHeaders={...getChromeExtensionRelayAuthHeaders(url),...headers};try{let parsed=new URL(url);if(Object.keys(mergedHeaders).some(key=>key.toLowerCase()===`authorization`))return mergedHeaders;if(parsed.username||parsed.password){let auth=Buffer.from(`${parsed.username}:${parsed.password}`).toString(`base64`);return{...mergedHeaders,Authorization:`Basic ${auth}`}}}catch{}return mergedHeaders}function appendCdpPath(cdpUrl,path){let url=new URL(cdpUrl);return url.pathname=`${url.pathname.replace(/\/$/,``)}${path.startsWith(`/`)?path:`/${path}`}`,url.toString()}function createCdpSender(ws){let nextId=1,pending=new Map,send=(method,params,sessionId)=>{let id=nextId++,msg={id,method,params,sessionId};return ws.send(JSON.stringify(msg)),new Promise((resolve,reject)=>{pending.set(id,{resolve,reject})})},closeWithError=err=>{for(let[,p]of pending)p.reject(err);pending.clear();try{ws.close()}catch{}};return ws.on(`error`,err=>{closeWithError(err instanceof Error?err:Error(String(err)))}),ws.on(`message`,data=>{try{let parsed=JSON.parse(rawDataToString(data));if(typeof parsed.id!=`number`)return;let p=pending.get(parsed.id);if(!p)return;if(pending.delete(parsed.id),parsed.error?.message){p.reject(Error(parsed.error.message));return}p.resolve(parsed.result)}catch{}}),ws.on(`close`,()=>{closeWithError(Error(`CDP socket closed`))}),{send,closeWithError}}async function fetchJson(url,timeoutMs=1500,init){return await(await fetchChecked(url,timeoutMs,init)).json()}async function fetchChecked(url,timeoutMs=1500,init){let ctrl=new AbortController,t=setTimeout(ctrl.abort.bind(ctrl),timeoutMs);try{let headers=getHeadersWithAuth(url,init?.headers||{}),res=await fetch(url,{...init,headers,signal:ctrl.signal});if(!res.ok)throw Error(`HTTP ${res.status}`);return res}finally{clearTimeout(t)}}async function fetchOk(url,timeoutMs=1500,init){await fetchChecked(url,timeoutMs,init)}async function withCdpSocket(wsUrl,fn,opts){let headers=getHeadersWithAuth(wsUrl,opts?.headers??{}),ws=new WebSocket$1(wsUrl,{handshakeTimeout:typeof opts?.handshakeTimeoutMs==`number`&&Number.isFinite(opts.handshakeTimeoutMs)?Math.max(1,Math.floor(opts.handshakeTimeoutMs)):5e3,...Object.keys(headers).length?{headers}:{}}),{send,closeWithError}=createCdpSender(ws),openPromise=new Promise((resolve,reject)=>{ws.once(`open`,()=>resolve()),ws.once(`error`,err=>reject(err)),ws.once(`close`,()=>reject(Error(`CDP socket closed`)))});try{await openPromise}catch(err){throw closeWithError(err instanceof Error?err:Error(String(err))),err}try{return await fn(send)}catch(err){throw closeWithError(err instanceof Error?err:Error(String(err))),err}finally{try{ws.close()}catch{}}}function normalizeCdpWsUrl(wsUrl,cdpUrl){let ws=new URL(wsUrl),cdp=new URL(cdpUrl);if(isLoopbackHost(ws.hostname)&&!isLoopbackHost(cdp.hostname)){ws.hostname=cdp.hostname;let cdpPort=cdp.port||(cdp.protocol===`https:`?`443`:`80`);cdpPort&&(ws.port=cdpPort),ws.protocol=cdp.protocol===`https:`?`wss:`:`ws:`}cdp.protocol===`https:`&&ws.protocol===`ws:`&&(ws.protocol=`wss:`),!ws.username&&!ws.password&&(cdp.username||cdp.password)&&(ws.username=cdp.username,ws.password=cdp.password);for(let[key,value]of cdp.searchParams.entries())ws.searchParams.has(key)||ws.searchParams.append(key,value);return ws.toString()}async function captureScreenshot(opts){return await withCdpSocket(opts.wsUrl,async send=>{await send(`Page.enable`);let clip;if(opts.fullPage){let metrics=await send(`Page.getLayoutMetrics`),size=metrics?.cssContentSize??metrics?.contentSize,width=Number(size?.width??0),height=Number(size?.height??0);width>0&&height>0&&(clip={x:0,y:0,width,height,scale:1})}let format=opts.format??`png`,quality=format===`jpeg`?Math.max(0,Math.min(100,Math.round(opts.quality??85))):void 0,base64=(await send(`Page.captureScreenshot`,{format,...quality===void 0?{}:{quality},fromSurface:!0,captureBeyondViewport:!0,...clip?{clip}:{}}))?.data;if(!base64)throw Error(`Screenshot failed: missing data`);return Buffer.from(base64,`base64`)})}async function createTargetViaCdp(opts){let version=await fetchJson(appendCdpPath(opts.cdpUrl,`/json/version`),1500),wsUrlRaw=String(version?.webSocketDebuggerUrl??``).trim(),wsUrl=wsUrlRaw?normalizeCdpWsUrl(wsUrlRaw,opts.cdpUrl):``;if(!wsUrl)throw Error(`CDP /json/version missing webSocketDebuggerUrl`);return await withCdpSocket(wsUrl,async send=>{let created=await send(`Target.createTarget`,{url:opts.url}),targetId=String(created?.targetId??``).trim();if(!targetId)throw Error(`CDP Target.createTarget returned no targetId`);return{targetId}})}function axValue(v){if(!v||typeof v!=`object`)return``;let value=v.value;return typeof value==`string`?value:typeof value==`number`||typeof value==`boolean`?String(value):``}function formatAriaSnapshot(nodes,limit){let byId=new Map;for(let n of nodes)n.nodeId&&byId.set(n.nodeId,n);let referenced=new Set;for(let n of nodes)for(let c of n.childIds??[])referenced.add(c);let root=nodes.find(n=>n.nodeId&&!referenced.has(n.nodeId))??nodes[0];if(!root?.nodeId)return[];let out=[],stack=[{id:root.nodeId,depth:0}];for(;stack.length&&out.length<limit;){let popped=stack.pop();if(!popped)break;let{id,depth}=popped,n=byId.get(id);if(!n)continue;let role=axValue(n.role),name=axValue(n.name),value=axValue(n.value),description=axValue(n.description),ref=`ax${out.length+1}`;out.push({ref,role:role||`unknown`,name:name||``,...value?{value}:{},...description?{description}:{},...typeof n.backendDOMNodeId==`number`?{backendDOMNodeId:n.backendDOMNodeId}:{},depth});let children=(n.childIds??[]).filter(c=>byId.has(c));for(let i=children.length-1;i>=0;i--){let child=children[i];child&&stack.push({id:child,depth:depth+1})}}return out}async function snapshotAria(opts){let limit=Math.max(1,Math.min(2e3,Math.floor(opts.limit??500)));return await withCdpSocket(opts.wsUrl,async send=>{await send(`Accessibility.enable`).catch(()=>{});let res=await send(`Accessibility.getFullAXTree`);return{nodes:formatAriaSnapshot(Array.isArray(res?.nodes)?res.nodes:[],limit)}})}const CHROMIUM_BUNDLE_IDS=new Set([`com.google.Chrome`,`com.google.Chrome.beta`,`com.google.Chrome.canary`,`com.google.Chrome.dev`,`com.brave.Browser`,`com.brave.Browser.beta`,`com.brave.Browser.nightly`,`com.microsoft.Edge`,`com.microsoft.EdgeBeta`,`com.microsoft.EdgeDev`,`com.microsoft.EdgeCanary`,`org.chromium.Chromium`,`com.vivaldi.Vivaldi`,`com.operasoftware.Opera`,`com.operasoftware.OperaGX`,`com.yandex.desktop.yandex-browser`,`company.thebrowser.Browser`]),CHROMIUM_DESKTOP_IDS=new Set([`google-chrome.desktop`,`google-chrome-beta.desktop`,`google-chrome-unstable.desktop`,`brave-browser.desktop`,`microsoft-edge.desktop`,`microsoft-edge-beta.desktop`,`microsoft-edge-dev.desktop`,`microsoft-edge-canary.desktop`,`chromium.desktop`,`chromium-browser.desktop`,`vivaldi.desktop`,`vivaldi-stable.desktop`,`opera.desktop`,`opera-gx.desktop`,`yandex-browser.desktop`,`org.chromium.Chromium.desktop`]),CHROMIUM_EXE_NAMES=new Set(`chrome.exe,msedge.exe,brave.exe,brave-browser.exe,chromium.exe,vivaldi.exe,opera.exe,launcher.exe,yandex.exe,yandexbrowser.exe,google chrome,google chrome canary,brave browser,microsoft edge,chromium,chrome,brave,msedge,brave-browser,google-chrome,google-chrome-stable,google-chrome-beta,google-chrome-unstable,microsoft-edge,microsoft-edge-beta,microsoft-edge-dev,microsoft-edge-canary,chromium-browser,vivaldi,vivaldi-stable,opera,opera-stable,opera-gx,yandex-browser`.split(`,`));function exists$1(filePath){try{return fs$1.existsSync(filePath)}catch{return!1}}function execText(command,args,timeoutMs=1200,maxBuffer=1024*1024){try{let output=execFileSync(command,args,{timeout:timeoutMs,encoding:`utf8`,maxBuffer});return String(output??``).trim()||null}catch{return null}}function inferKindFromIdentifier(identifier){let id=identifier.toLowerCase();return id.includes(`brave`)?`brave`:id.includes(`edge`)?`edge`:id.includes(`chromium`)?`chromium`:id.includes(`canary`)?`canary`:id.includes(`opera`)||id.includes(`vivaldi`)||id.includes(`yandex`)||id.includes(`thebrowser`)?`chromium`:`chrome`}function inferKindFromExecutableName(name){let lower=name.toLowerCase();return lower.includes(`brave`)?`brave`:lower.includes(`edge`)||lower.includes(`msedge`)?`edge`:lower.includes(`chromium`)?`chromium`:lower.includes(`canary`)||lower.includes(`sxs`)?`canary`:lower.includes(`opera`)||lower.includes(`vivaldi`)||lower.includes(`yandex`)?`chromium`:`chrome`}function detectDefaultChromiumExecutable(platform){return platform===`darwin`?detectDefaultChromiumExecutableMac():platform===`linux`?detectDefaultChromiumExecutableLinux():platform===`win32`?detectDefaultChromiumExecutableWindows():null}function detectDefaultChromiumExecutableMac(){let bundleId=detectDefaultBrowserBundleIdMac();if(!bundleId||!CHROMIUM_BUNDLE_IDS.has(bundleId))return null;let appPathRaw=execText(`/usr/bin/osascript`,[`-e`,`POSIX path of (path to application id "${bundleId}")`]);if(!appPathRaw)return null;let appPath=appPathRaw.trim().replace(/\/$/,``),exeName=execText(`/usr/bin/defaults`,[`read`,path.join(appPath,`Contents`,`Info`),`CFBundleExecutable`]);if(!exeName)return null;let exePath=path.join(appPath,`Contents`,`MacOS`,exeName.trim());return exists$1(exePath)?{kind:inferKindFromIdentifier(bundleId),path:exePath}:null}function detectDefaultBrowserBundleIdMac(){let plistPath=path.join(os.homedir(),`Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist`);if(!exists$1(plistPath))return null;let handlersRaw=execText(`/usr/bin/plutil`,[`-extract`,`LSHandlers`,`json`,`-o`,`-`,`--`,plistPath],2e3,5*1024*1024);if(!handlersRaw)return null;let handlers;try{handlers=JSON.parse(handlersRaw)}catch{return null}if(!Array.isArray(handlers))return null;let resolveScheme=scheme=>{let candidate=null;for(let entry of handlers){if(!entry||typeof entry!=`object`)continue;let record=entry;if(record.LSHandlerURLScheme!==scheme)continue;let role=typeof record.LSHandlerRoleAll==`string`&&record.LSHandlerRoleAll||typeof record.LSHandlerRoleViewer==`string`&&record.LSHandlerRoleViewer||null;role&&(candidate=role)}return candidate};return resolveScheme(`http`)??resolveScheme(`https`)}function detectDefaultChromiumExecutableLinux(){let desktopId=execText(`xdg-settings`,[`get`,`default-web-browser`])||execText(`xdg-mime`,[`query`,`default`,`x-scheme-handler/http`]);if(!desktopId)return null;let trimmed=desktopId.trim();if(!CHROMIUM_DESKTOP_IDS.has(trimmed))return null;let desktopPath=findDesktopFilePath(trimmed);if(!desktopPath)return null;let execLine=readDesktopExecLine(desktopPath);if(!execLine)return null;let command=extractExecutableFromExecLine(execLine);if(!command)return null;let resolved=resolveLinuxExecutablePath(command);if(!resolved)return null;let exeName=path.posix.basename(resolved).toLowerCase();return CHROMIUM_EXE_NAMES.has(exeName)?{kind:inferKindFromExecutableName(exeName),path:resolved}:null}function detectDefaultChromiumExecutableWindows(){let progId=readWindowsProgId(),command=(progId?readWindowsCommandForProgId(progId):null)||readWindowsCommandForProgId(`http`);if(!command)return null;let exePath=extractWindowsExecutablePath(expandWindowsEnvVars(command));if(!exePath||!exists$1(exePath))return null;let exeName=path.win32.basename(exePath).toLowerCase();return CHROMIUM_EXE_NAMES.has(exeName)?{kind:inferKindFromExecutableName(exeName),path:exePath}:null}function findDesktopFilePath(desktopId){let candidates=[path.join(os.homedir(),`.local`,`share`,`applications`,desktopId),path.join(`/usr/local/share/applications`,desktopId),path.join(`/usr/share/applications`,desktopId),path.join(`/var/lib/snapd/desktop/applications`,desktopId)];for(let candidate of candidates)if(exists$1(candidate))return candidate;return null}function readDesktopExecLine(desktopPath){try{let lines=fs$1.readFileSync(desktopPath,`utf8`).split(/\r?\n/);for(let line of lines)if(line.startsWith(`Exec=`))return line.slice(5).trim()}catch{}return null}function extractExecutableFromExecLine(execLine){let tokens=splitExecLine(execLine);for(let token of tokens)if(token&&token!==`env`&&!(token.includes(`=`)&&!token.startsWith(`/`)&&!token.includes(`\\`)))return token.replace(/^["']|["']$/g,``);return null}function splitExecLine(line){let tokens=[],current=``,inQuotes=!1,quoteChar=``;for(let i=0;i<line.length;i+=1){let ch=line[i];if((ch===`"`||ch===`'`)&&(!inQuotes||ch===quoteChar)){inQuotes?(inQuotes=!1,quoteChar=``):(inQuotes=!0,quoteChar=ch);continue}if(!inQuotes&&/\s/.test(ch)){current&&=(tokens.push(current),``);continue}current+=ch}return current&&tokens.push(current),tokens}function resolveLinuxExecutablePath(command){let cleaned=command.trim().replace(/%[a-zA-Z]/g,``);if(!cleaned)return null;if(cleaned.startsWith(`/`))return cleaned;let resolved=execText(`which`,[cleaned],800);return resolved?resolved.trim():null}function readWindowsProgId(){let output=execText(`reg`,[`query`,`HKCU\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice`,`/v`,`ProgId`]);return output&&output.match(/ProgId\s+REG_\w+\s+(.+)$/im)?.[1]?.trim()||null}function readWindowsCommandForProgId(progId){let output=execText(`reg`,[`query`,progId===`http`?`HKCR\\http\\shell\\open\\command`:`HKCR\\${progId}\\shell\\open\\command`,`/ve`]);return output&&output.match(/REG_\w+\s+(.+)$/im)?.[1]?.trim()||null}function expandWindowsEnvVars(value){return value.replace(/%([^%]+)%/g,(_match,name)=>{let key=String(name??``).trim();return key?process.env[key]??`%${key}%`:_match})}function extractWindowsExecutablePath(command){let quoted=command.match(/"([^"]+\\.exe)"/i);if(quoted?.[1])return quoted[1];let unquoted=command.match(/([^\\s]+\\.exe)/i);return unquoted?.[1]?unquoted[1]:null}function findFirstExecutable(candidates){for(let candidate of candidates)if(exists$1(candidate.path))return candidate;return null}function findChromeExecutableMac(){return findFirstExecutable([{kind:`chrome`,path:`/Applications/Google Chrome.app/Contents/MacOS/Google Chrome`},{kind:`chrome`,path:path.join(os.homedir(),`Applications/Google Chrome.app/Contents/MacOS/Google Chrome`)},{kind:`brave`,path:`/Applications/Brave Browser.app/Contents/MacOS/Brave Browser`},{kind:`brave`,path:path.join(os.homedir(),`Applications/Brave Browser.app/Contents/MacOS/Brave Browser`)},{kind:`edge`,path:`/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge`},{kind:`edge`,path:path.join(os.homedir(),`Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge`)},{kind:`chromium`,path:`/Applications/Chromium.app/Contents/MacOS/Chromium`},{kind:`chromium`,path:path.join(os.homedir(),`Applications/Chromium.app/Contents/MacOS/Chromium`)},{kind:`canary`,path:`/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary`},{kind:`canary`,path:path.join(os.homedir(),`Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary`)}])}function findChromeExecutableLinux(){return findFirstExecutable([{kind:`chrome`,path:`/usr/bin/google-chrome`},{kind:`chrome`,path:`/usr/bin/google-chrome-stable`},{kind:`chrome`,path:`/usr/bin/chrome`},{kind:`brave`,path:`/usr/bin/brave-browser`},{kind:`brave`,path:`/usr/bin/brave-browser-stable`},{kind:`brave`,path:`/usr/bin/brave`},{kind:`brave`,path:`/snap/bin/brave`},{kind:`edge`,path:`/usr/bin/microsoft-edge`},{kind:`edge`,path:`/usr/bin/microsoft-edge-stable`},{kind:`chromium`,path:`/usr/bin/chromium`},{kind:`chromium`,path:`/usr/bin/chromium-browser`},{kind:`chromium`,path:`/snap/bin/chromium`}])}function findChromeExecutableWindows(){let localAppData=process.env.LOCALAPPDATA??``,programFiles=process.env.ProgramFiles??`C:\\Program Files`,programFilesX86=process.env[`ProgramFiles(x86)`]??`C:\\Program Files (x86)`,joinWin=path.win32.join,candidates=[];return localAppData&&(candidates.push({kind:`chrome`,path:joinWin(localAppData,`Google`,`Chrome`,`Application`,`chrome.exe`)}),candidates.push({kind:`brave`,path:joinWin(localAppData,`BraveSoftware`,`Brave-Browser`,`Application`,`brave.exe`)}),candidates.push({kind:`edge`,path:joinWin(localAppData,`Microsoft`,`Edge`,`Application`,`msedge.exe`)}),candidates.push({kind:`chromium`,path:joinWin(localAppData,`Chromium`,`Application`,`chrome.exe`)}),candidates.push({kind:`canary`,path:joinWin(localAppData,`Google`,`Chrome SxS`,`Application`,`chrome.exe`)})),candidates.push({kind:`chrome`,path:joinWin(programFiles,`Google`,`Chrome`,`Application`,`chrome.exe`)}),candidates.push({kind:`chrome`,path:joinWin(programFilesX86,`Google`,`Chrome`,`Application`,`chrome.exe`)}),candidates.push({kind:`brave`,path:joinWin(programFiles,`BraveSoftware`,`Brave-Browser`,`Application`,`brave.exe`)}),candidates.push({kind:`brave`,path:joinWin(programFilesX86,`BraveSoftware`,`Brave-Browser`,`Application`,`brave.exe`)}),candidates.push({kind:`edge`,path:joinWin(programFiles,`Microsoft`,`Edge`,`Application`,`msedge.exe`)}),candidates.push({kind:`edge`,path:joinWin(programFilesX86,`Microsoft`,`Edge`,`Application`,`msedge.exe`)}),findFirstExecutable(candidates)}function resolveBrowserExecutableForPlatform(resolved,platform){if(resolved.executablePath){if(!exists$1(resolved.executablePath))throw Error(`browser.executablePath not found: ${resolved.executablePath}`);return{kind:`custom`,path:resolved.executablePath}}return detectDefaultChromiumExecutable(platform)||(platform===`darwin`?findChromeExecutableMac():platform===`linux`?findChromeExecutableLinux():platform===`win32`?findChromeExecutableWindows():null)}process.platform;var PortInUseError=class extends Error{constructor(port,details){super(`Port ${port} is already in use.`),this.name=`PortInUseError`,this.port=port,this.details=details}};async function ensurePortAvailable(port){try{await new Promise((resolve,reject)=>{let tester=net.createServer().once(`error`,err=>reject(err)).once(`listening`,()=>{tester.close(()=>resolve())}).listen(port)})}catch(err){throw isErrno(err)&&err.code===`EADDRINUSE`?new PortInUseError(port):err}}function decoratedMarkerPath(userDataDir){return path.join(userDataDir,`.builderforce-profile-decorated`)}function safeReadJson(filePath){try{if(!fs$1.existsSync(filePath))return null;let raw=fs$1.readFileSync(filePath,`utf-8`),parsed=JSON.parse(raw);return typeof parsed!=`object`||!parsed||Array.isArray(parsed)?null:parsed}catch{return null}}function safeWriteJson(filePath,data){fs$1.mkdirSync(path.dirname(filePath),{recursive:!0}),fs$1.writeFileSync(filePath,JSON.stringify(data,null,2))}function setDeep(obj,keys,value){let node=obj;for(let key of keys.slice(0,-1)){let next=node[key];(typeof next!=`object`||!next||Array.isArray(next))&&(node[key]={}),node=node[key]}node[keys[keys.length-1]??``]=value}function parseHexRgbToSignedArgbInt(hex){let cleaned=hex.trim().replace(/^#/,``);if(!/^[0-9a-fA-F]{6}$/.test(cleaned))return null;let argbUnsigned=255<<24|Number.parseInt(cleaned,16);return argbUnsigned>2147483647?argbUnsigned-4294967296:argbUnsigned}function isProfileDecorated(userDataDir,desiredName,desiredColorHex){let desiredColorInt=parseHexRgbToSignedArgbInt(desiredColorHex),localStatePath=path.join(userDataDir,`Local State`),preferencesPath=path.join(userDataDir,`Default`,`Preferences`),profile=safeReadJson(localStatePath)?.profile,infoCache=typeof profile==`object`&&profile&&!Array.isArray(profile)?profile.info_cache:null,info=typeof infoCache==`object`&&infoCache&&!Array.isArray(infoCache)&&typeof infoCache.Default==`object`&&infoCache.Default!==null&&!Array.isArray(infoCache.Default)?infoCache.Default:null,prefs=safeReadJson(preferencesPath),browserTheme=(()=>{let browser=prefs?.browser,theme=typeof browser==`object`&&browser&&!Array.isArray(browser)?browser.theme:null;return typeof theme==`object`&&theme&&!Array.isArray(theme)?theme:null})(),autogeneratedTheme=(()=>{let autogenerated=prefs?.autogenerated,theme=typeof autogenerated==`object`&&autogenerated&&!Array.isArray(autogenerated)?autogenerated.theme:null;return typeof theme==`object`&&theme&&!Array.isArray(theme)?theme:null})(),nameOk=typeof info?.name==`string`?info.name===desiredName:!0;if(desiredColorInt==null)return nameOk;let localSeedOk=typeof info?.profile_color_seed==`number`?info.profile_color_seed===desiredColorInt:!1,prefOk=typeof browserTheme?.user_color2==`number`&&browserTheme.user_color2===desiredColorInt||typeof autogeneratedTheme?.color==`number`&&autogeneratedTheme.color===desiredColorInt;return nameOk&&localSeedOk&&prefOk}function decorateBuilderForceAgentsProfile(userDataDir,opts){let desiredName=opts?.name??DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME,desiredColor=(opts?.color??DEFAULT_BUILDERFORCE_AGENTS_BROWSER_COLOR).toUpperCase(),desiredColorInt=parseHexRgbToSignedArgbInt(desiredColor),localStatePath=path.join(userDataDir,`Local State`),preferencesPath=path.join(userDataDir,`Default`,`Preferences`),localState=safeReadJson(localStatePath)??{};setDeep(localState,[`profile`,`info_cache`,`Default`,`name`],desiredName),setDeep(localState,[`profile`,`info_cache`,`Default`,`shortcut_name`],desiredName),setDeep(localState,[`profile`,`info_cache`,`Default`,`user_name`],desiredName),setDeep(localState,[`profile`,`info_cache`,`Default`,`profile_color`],desiredColor),setDeep(localState,[`profile`,`info_cache`,`Default`,`user_color`],desiredColor),desiredColorInt!=null&&(setDeep(localState,[`profile`,`info_cache`,`Default`,`profile_color_seed`],desiredColorInt),setDeep(localState,[`profile`,`info_cache`,`Default`,`profile_highlight_color`],desiredColorInt),setDeep(localState,[`profile`,`info_cache`,`Default`,`default_avatar_fill_color`],desiredColorInt),setDeep(localState,[`profile`,`info_cache`,`Default`,`default_avatar_stroke_color`],desiredColorInt)),safeWriteJson(localStatePath,localState);let prefs=safeReadJson(preferencesPath)??{};setDeep(prefs,[`profile`,`name`],desiredName),setDeep(prefs,[`profile`,`profile_color`],desiredColor),setDeep(prefs,[`profile`,`user_color`],desiredColor),desiredColorInt!=null&&(setDeep(prefs,[`autogenerated`,`theme`,`color`],desiredColorInt),setDeep(prefs,[`browser`,`theme`,`user_color2`],desiredColorInt)),safeWriteJson(preferencesPath,prefs);try{fs$1.writeFileSync(decoratedMarkerPath(userDataDir),`${Date.now()}\n`,`utf-8`)}catch{}}function ensureProfileCleanExit(userDataDir){let preferencesPath=path.join(userDataDir,`Default`,`Preferences`),prefs=safeReadJson(preferencesPath)??{};setDeep(prefs,[`exit_type`],`Normal`),setDeep(prefs,[`exited_cleanly`],!0),safeWriteJson(preferencesPath,prefs)}const log=createSubsystemLogger(`browser`).child(`chrome`);function exists(filePath){try{return fs$1.existsSync(filePath)}catch{return!1}}function resolveBrowserExecutable(resolved){return resolveBrowserExecutableForPlatform(resolved,process.platform)}function resolveBuilderForceAgentsUserDataDir(profileName=DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME){return path.join(CONFIG_DIR,`browser`,profileName,`user-data`)}function cdpUrlForPort(cdpPort){return`http://127.0.0.1:${cdpPort}`}async function isChromeReachable(cdpUrl,timeoutMs=500){return!!await fetchChromeVersion(cdpUrl,timeoutMs)}async function fetchChromeVersion(cdpUrl,timeoutMs=500){let ctrl=new AbortController,t=setTimeout(ctrl.abort.bind(ctrl),timeoutMs);try{let versionUrl=appendCdpPath(cdpUrl,`/json/version`),res=await fetch(versionUrl,{signal:ctrl.signal,headers:getHeadersWithAuth(versionUrl)});if(!res.ok)return null;let data=await res.json();return!data||typeof data!=`object`?null:data}catch{return null}finally{clearTimeout(t)}}async function getChromeWebSocketUrl(cdpUrl,timeoutMs=500){let version=await fetchChromeVersion(cdpUrl,timeoutMs),wsUrl=String(version?.webSocketDebuggerUrl??``).trim();return wsUrl?normalizeCdpWsUrl(wsUrl,cdpUrl):null}async function canOpenWebSocket(wsUrl,timeoutMs=800){return await new Promise(resolve=>{let headers=getHeadersWithAuth(wsUrl),ws=new WebSocket$1(wsUrl,{handshakeTimeout:timeoutMs,...Object.keys(headers).length?{headers}:{}}),timer=setTimeout(()=>{try{ws.terminate()}catch{}resolve(!1)},Math.max(50,timeoutMs+25));ws.once(`open`,()=>{clearTimeout(timer);try{ws.close()}catch{}resolve(!0)}),ws.once(`error`,()=>{clearTimeout(timer),resolve(!1)})})}async function isChromeCdpReady(cdpUrl,timeoutMs=500,handshakeTimeoutMs=800){let wsUrl=await getChromeWebSocketUrl(cdpUrl,timeoutMs);return wsUrl?await canOpenWebSocket(wsUrl,handshakeTimeoutMs):!1}async function launchBuilderForceAgentsChrome(resolved,profile){if(!profile.cdpIsLoopback)throw Error(`Profile "${profile.name}" is remote; cannot launch local Chrome.`);await ensurePortAvailable(profile.cdpPort);let exe=resolveBrowserExecutable(resolved);if(!exe)throw Error(`No supported browser found (Chrome/Brave/Edge/Chromium on macOS, Linux, or Windows).`);let userDataDir=resolveBuilderForceAgentsUserDataDir(profile.name);fs$1.mkdirSync(userDataDir,{recursive:!0});let needsDecorate=!isProfileDecorated(userDataDir,profile.name,(profile.color??DEFAULT_BUILDERFORCE_AGENTS_BROWSER_COLOR).toUpperCase()),spawnOnce=()=>{let args=[`--remote-debugging-port=${profile.cdpPort}`,`--user-data-dir=${userDataDir}`,`--no-first-run`,`--no-default-browser-check`,`--disable-sync`,`--disable-background-networking`,`--disable-component-update`,`--disable-features=Translate,MediaRouter`,`--disable-session-crashed-bubble`,`--hide-crash-restore-bubble`,`--password-store=basic`];return resolved.headless&&(args.push(`--headless=new`),args.push(`--disable-gpu`)),resolved.noSandbox&&(args.push(`--no-sandbox`),args.push(`--disable-setuid-sandbox`)),process.platform===`linux`&&args.push(`--disable-dev-shm-usage`),args.push(`--disable-blink-features=AutomationControlled`),resolved.extraArgs.length>0&&args.push(...resolved.extraArgs),args.push(`about:blank`),spawn(exe.path,args,{stdio:`pipe`,env:{...process.env,HOME:os.homedir()}})},startedAt=Date.now(),localStatePath=path.join(userDataDir,`Local State`),preferencesPath=path.join(userDataDir,`Default`,`Preferences`);if(!exists(localStatePath)||!exists(preferencesPath)){let bootstrap=spawnOnce(),deadline=Date.now()+1e4;for(;Date.now()<deadline&&!(exists(localStatePath)&&exists(preferencesPath));)await new Promise(r=>setTimeout(r,100));try{bootstrap.kill(`SIGTERM`)}catch{}let exitDeadline=Date.now()+5e3;for(;Date.now()<exitDeadline&&bootstrap.exitCode==null;)await new Promise(r=>setTimeout(r,50))}if(needsDecorate)try{decorateBuilderForceAgentsProfile(userDataDir,{name:profile.name,color:profile.color}),log.info(`🤖 builderforce browser profile decorated (${profile.color})`)}catch(err){log.warn(`builderforce browser profile decoration failed: ${String(err)}`)}try{ensureProfileCleanExit(userDataDir)}catch(err){log.warn(`builderforce browser clean-exit prefs failed: ${String(err)}`)}let proc=spawnOnce(),readyDeadline=Date.now()+15e3;for(;Date.now()<readyDeadline&&!await isChromeReachable(profile.cdpUrl,500);)await new Promise(r=>setTimeout(r,200));if(!await isChromeReachable(profile.cdpUrl,500)){try{proc.kill(`SIGKILL`)}catch{}throw Error(`Failed to start Chrome CDP on port ${profile.cdpPort} for profile "${profile.name}".`)}let pid=proc.pid??-1;return log.info(`🤖 builderforce browser started (${exe.kind}) profile "${profile.name}" on 127.0.0.1:${profile.cdpPort} (pid ${pid})`),{pid,exe,userDataDir,cdpPort:profile.cdpPort,startedAt,proc}}async function stopBuilderForceAgentsChrome(running,timeoutMs=2500){let proc=running.proc;if(proc.killed)return;try{proc.kill(`SIGTERM`)}catch{}let start=Date.now();for(;Date.now()-start<timeoutMs&&!(!proc.exitCode&&proc.killed);){if(!await isChromeReachable(cdpUrlForPort(running.cdpPort),200))return;await new Promise(r=>setTimeout(r,100))}try{proc.kill(`SIGKILL`)}catch{}}export{DEFAULT_BUILDERFORCE_AGENTS_BROWSER_ENABLED as A,pickPrimaryTailnetIPv4 as C,DEFAULT_BROWSER_DEFAULT_PROFILE_NAME as D,DEFAULT_AI_SNAPSHOT_MAX_CHARS as E,DEFAULT_BROWSER_EVALUATE_ENABLED as O,pickPrimaryLanIPv4 as S,DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS as T,withCdpSocket as _,resolveBuilderForceAgentsUserDataDir as a,rawDataToString as b,captureScreenshot as c,normalizeCdpWsUrl as d,snapshotAria as f,getHeadersWithAuth as g,fetchOk as h,launchBuilderForceAgentsChrome as i,DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME as j,DEFAULT_BUILDERFORCE_AGENTS_BROWSER_COLOR as k,createTargetViaCdp as l,fetchJson as m,isChromeCdpReady as n,stopBuilderForceAgentsChrome as o,appendCdpPath as p,isChromeReachable as r,resolveBrowserExecutableForPlatform as s,getChromeWebSocketUrl as t,formatAriaSnapshot as u,ensureChromeExtensionRelayServer as v,DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH as w,isLoopbackHost as x,stopChromeExtensionRelayServer as y};
@@ -1 +1 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./register.subclis-DqO3Ciiv.js";import{r as registerCoreCliByName}from"./command-registry-D_LkOB4n.js";export{registerCoreCliByName};
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./register.subclis-Cr9DoYcv.js";import{r as registerCoreCliByName}from"./command-registry-COUcUWby.js";export{registerCoreCliByName};
@@ -1 +1 @@
1
- import{a as getPrimaryCommand,c as hasHelpOrVersion}from"./argv-BgQk38nl.js";import{a as reparseProgramFromActionArgs,i as registerSubCliCommands}from"./register.subclis-DqO3Ciiv.js";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-CyTZQLXP.js`)).registerSetupCommand(program)}},{commands:[{name:`onboard`,description:`Interactive onboarding wizard for gateway, workspace, and skills`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.onboard-FSaweh3A.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-CAmn1QTl.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-DAL38e7r.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-CfczShaZ.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-ohxXhvKX.js`)).registerMaintenanceCommands(program)}},{commands:[{name:`message`,description:`Send, read, and manage messages`,hasSubcommands:!0}],register:async({program,ctx})=>{(await import(`./register.message-8iGDhO8h.js`)).registerMessageCommands(program,ctx)}},{commands:[{name:`memory`,description:`Search and reindex memory files`,hasSubcommands:!0}],register:async({program})=>{(await import(`./memory-cli-BlayFTAM.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-D2uCH8jZ.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-D6wdwPwV.js`)).registerStatusHealthSessionsCommands(program)}},{commands:[{name:`browser`,description:`Manage BuilderForceAgents's dedicated browser (Chrome/Chromium)`,hasSubcommands:!0}],register:async({program})=>{(await import(`./browser-cli-D2O94twn.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-wxtgU9xu.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)}export{registerProgramCommands as a,registerCoreCliCommands as i,getCoreCliCommandsWithSubcommands as n,registerCoreCliByName as r,getCoreCliCommandNames as t};
1
+ import{a as getPrimaryCommand,c as hasHelpOrVersion}from"./argv-BgQk38nl.js";import{a as reparseProgramFromActionArgs,i as registerSubCliCommands}from"./register.subclis-Cr9DoYcv.js";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-CSF-2ImP.js`)).registerSetupCommand(program)}},{commands:[{name:`onboard`,description:`Interactive onboarding wizard for gateway, workspace, and skills`,hasSubcommands:!1}],register:async({program})=>{(await import(`./register.onboard-B9DMNfHE.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-CAmn1QTl.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-DAL38e7r.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-CfczShaZ.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-BELfCO_C.js`)).registerMaintenanceCommands(program)}},{commands:[{name:`message`,description:`Send, read, and manage messages`,hasSubcommands:!0}],register:async({program,ctx})=>{(await import(`./register.message-8iGDhO8h.js`)).registerMessageCommands(program,ctx)}},{commands:[{name:`memory`,description:`Search and reindex memory files`,hasSubcommands:!0}],register:async({program})=>{(await import(`./memory-cli-BlayFTAM.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-D2uCH8jZ.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-D6wdwPwV.js`)).registerStatusHealthSessionsCommands(program)}},{commands:[{name:`browser`,description:`Manage BuilderForceAgents's dedicated browser (Chrome/Chromium)`,hasSubcommands:!0}],register:async({program})=>{(await import(`./browser-cli-D2O94twn.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-BmrsVdFw.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)}export{registerProgramCommands as a,registerCoreCliCommands as i,getCoreCliCommandsWithSubcommands as n,registerCoreCliByName as r,getCoreCliCommandNames as t};