@seanhogg/builderforce-agents 2026.10.3 → 2026.10.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/dist/{agent-CxhUn-aN.js → agent-Cu57zjv6.js} +1 -1
  2. package/dist/{agent-CiEaiH-p.js → agent-LoZ_09Jv.js} +1 -1
  3. package/dist/{agents-DkKFDcYq.js → agents-Dgrr6E7S.js} +1 -1
  4. package/dist/{agents-IZrPoZIi.js → agents-DiRof4zA.js} +1 -1
  5. package/dist/{audio-preflight-COZAlqnx.js → audio-preflight-Cg4vjX8I.js} +1 -1
  6. package/dist/{auth-choice-CrYQF7zX.js → auth-choice-BJmosINc.js} +1 -1
  7. package/dist/{auth-choice-DhUBmu6y.js → auth-choice-CDoW8QDy.js} +1 -1
  8. package/dist/{auth-choice.apply-Botyf6Sg.js → auth-choice.apply-25j_lhua.js} +1 -1
  9. package/dist/{auth-choice.apply-k9tk1hGj.js → auth-choice.apply-CE1TC_Ts.js} +1 -1
  10. package/dist/{auth-choice.apply-Cch5UXis.js → auth-choice.apply-DSHzvYNu.js} +1 -1
  11. package/dist/{auth-choice.apply-CXRcLO-h.js → auth-choice.apply-ND2C2oSe.js} +1 -1
  12. package/dist/{auth-choice.apply.transformers-BkN8HlZJ.js → auth-choice.apply.transformers-BF-qyu2L.js} +1 -1
  13. package/dist/{auth-choice.apply.transformers-B9SieNNk.js → auth-choice.apply.transformers-CBQbUAwr.js} +1 -1
  14. package/dist/{auth-choice.apply.transformers-D02W3zy7.js → auth-choice.apply.transformers-DE9QrzbX.js} +1 -1
  15. package/dist/{auth-choice.apply.transformers-Dnr7Izx1.js → auth-choice.apply.transformers-vr05ATPq.js} +1 -1
  16. package/dist/{banner-Bd45EXyp.js → banner-Bx4c92N8.js} +1 -1
  17. package/dist/build-info.json +3 -3
  18. package/dist/{builderforce-BxVfTQsc.js → builderforce-DHU87PJG.js} +1 -1
  19. package/dist/{builderforce-C86noipf.js → builderforce-DgYCZ3Up.js} +1 -1
  20. package/dist/bundled/boot-md/handler.js +1 -1
  21. package/dist/bundled/session-memory/handler.js +1 -1
  22. package/dist/{channel-options-BHetVK54.js → channel-options-BZoCW2EZ.js} +1 -1
  23. package/dist/{channel-options-D5PmuxT-.js → channel-options-DAkHvC-x.js} +1 -1
  24. package/dist/{channel-web-B5QgCj6B.js → channel-web-BWEX1FnI.js} +1 -1
  25. package/dist/{channels-cli-sHtDH37K.js → channels-cli-DHFIXbTT.js} +1 -1
  26. package/dist/{channels-cli-CgZqXqUm.js → channels-cli-DvkQEBwz.js} +1 -1
  27. package/dist/chrome-CbBg1ngA.js +4 -0
  28. package/dist/{cli-DKoe6Ywl.js → cli-C9bsC2UP.js} +1 -1
  29. package/dist/{cli-DlaHihmr.js → cli-DnMFuBeA.js} +1 -1
  30. package/dist/{command-registry-FQIQbQAx.js → command-registry-DUOpdtcT.js} +1 -1
  31. package/dist/{command-registry-BhyY4aXy.js → command-registry-DrRz6Wgg.js} +1 -1
  32. package/dist/{completion-cli-D86ydD3X.js → completion-cli-BtLeKqh_.js} +1 -1
  33. package/dist/{completion-cli-H4iKy2_f.js → completion-cli-Cq33pQdJ.js} +1 -1
  34. package/dist/{completion-cli-CoFRiwNp.js → completion-cli-EbyCUnCP.js} +1 -1
  35. package/dist/{completion-cli-DF6vmGRs.js → completion-cli-mzQa8oTd.js} +1 -1
  36. package/dist/{config-cli-D6KAk3vw.js → config-cli-BIQl_nrn.js} +1 -1
  37. package/dist/{config-cli-9HoPtGDR.js → config-cli-Dw1pr9MW.js} +1 -1
  38. package/dist/{configure-B_FvthXy.js → configure-B1HJIRSM.js} +1 -1
  39. package/dist/{configure-CYwCU0Hw.js → configure-BPX5i4at.js} +1 -1
  40. package/dist/{configure-BgZGeNXf.js → configure-CKm9_xkS.js} +1 -1
  41. package/dist/{configure-6QCgecON.js → configure-CQPFd8N9.js} +1 -1
  42. package/dist/{deps-jUQM2eq1.js → deps-DN7fhGiB.js} +1 -1
  43. package/dist/{doctor-completion-CZrfkBfj.js → doctor-completion-B7JXY8EJ.js} +1 -1
  44. package/dist/{doctor-completion-BSbAN5p1.js → doctor-completion-BEVC1EV7.js} +1 -1
  45. package/dist/{embedded-CA0n2tyG.js → embedded-BBM-usEa.js} +7 -7
  46. package/dist/{embedded-SSuKQ6Yc.js → embedded-CIuP-6Ex.js} +2 -2
  47. package/dist/entry.js +1 -1
  48. package/dist/extensionAPI.js +1 -1
  49. package/dist/{gateway-cli-8SuDvuCq.js → gateway-cli-CvdguqNO.js} +2 -2
  50. package/dist/{gateway-cli-D5pW1jLs.js → gateway-cli-DvMzpFIF.js} +2 -2
  51. package/dist/{health-BLW40WUJ.js → health-Bd0YvHPq.js} +1 -1
  52. package/dist/{health-DqZB_jd8.js → health-CcUquV5P.js} +1 -1
  53. package/dist/{health-Cggr6c-2.js → health-CoTbsx1p.js} +1 -1
  54. package/dist/{hooks-cli-BQZjt-Fk.js → hooks-cli-D1mx0_F_.js} +1 -1
  55. package/dist/{hooks-cli-D5Zt0sN4.js → hooks-cli-Dr0hMOiz.js} +1 -1
  56. package/dist/index.js +2 -2
  57. package/dist/llm-slug-generator.js +1 -1
  58. package/dist/{models-DH9Vrv7O.js → models-D3MukbTO.js} +1 -1
  59. package/dist/{models-cli-DLZZwy_m.js → models-cli-CBUEjJ_T.js} +1 -1
  60. package/dist/{models-cli-CAaWi4TX.js → models-cli-nD2MyRO3.js} +1 -1
  61. package/dist/{models-bp562zNz.js → models-px2EtCBB.js} +1 -1
  62. package/dist/{onboard-pzmSj6MG.js → onboard-CelRLEbD.js} +1 -1
  63. package/dist/{onboard-CpFQ-bpz.js → onboard-D_Ja6cJL.js} +1 -1
  64. package/dist/{onboard-channels-BsMS0Ehd.js → onboard-channels-C5v3gxTE.js} +1 -1
  65. package/dist/{onboard-channels-D1FMu5M8.js → onboard-channels-CEMtoVzX.js} +1 -1
  66. package/dist/{onboard-channels-CKWKLbTn.js → onboard-channels-DIvxrZLb.js} +1 -1
  67. package/dist/{onboard-channels-CqXCWPaQ.js → onboard-channels-pPjt4AF5.js} +1 -1
  68. package/dist/{onboard-interactive-BAcb1Yd8.js → onboard-interactive-BIVMtUaZ.js} +1 -1
  69. package/dist/{onboard-interactive-COTt-hGf.js → onboard-interactive-CeQp6fAt.js} +1 -1
  70. package/dist/{onboard-interactive-B_YG0JwA.js → onboard-interactive-D3YgFz9n.js} +1 -1
  71. package/dist/{onboard-interactive-BdwTeKJ2.js → onboard-interactive-tVpsWM3V.js} +1 -1
  72. package/dist/{onboarding-C8IDtM8O.js → onboarding-B9P9Rocf.js} +2 -2
  73. package/dist/{onboarding-BhMZqtBx.js → onboarding-DXxufSuN.js} +2 -2
  74. package/dist/{onboarding.finalize-DpyMh92r.js → onboarding.finalize-BJbv33Sa.js} +1 -1
  75. package/dist/{onboarding.finalize-DEhEHZPV.js → onboarding.finalize-CiIdxWgH.js} +1 -1
  76. package/dist/{outbound-send-deps-CKOfRpqk.js → outbound-send-deps-DL5n0r7v.js} +1 -1
  77. package/dist/{plugin-registry-Bi-9AQMd.js → plugin-registry-B5gTbK3m.js} +1 -1
  78. package/dist/{plugin-registry-nxUQWv6l.js → plugin-registry-CBXZbshG.js} +1 -1
  79. package/dist/{plugin-registry-BlKyKAq2.js → plugin-registry-DEWbh_9i.js} +1 -1
  80. package/dist/{plugin-registry-CqGq9jzk.js → plugin-registry-Glc-xriO.js} +1 -1
  81. package/dist/plugin-sdk/{channel-web-C3UtHX6b.js → channel-web-CW5s6vEZ.js} +1 -1
  82. package/dist/plugin-sdk/index.js +1 -1
  83. package/dist/plugin-sdk/{reply-BTKDKB2t.js → reply-pngAtrhW.js} +2 -2
  84. package/dist/plugin-sdk/{web-CsPSK9U2.js → web-DfrDkFj_.js} +1 -1
  85. package/dist/{plugins-CUhWH9-E.js → plugins-BJNBD6Si.js} +1 -1
  86. package/dist/{plugins-B8Lge-oB.js → plugins-BZnMash4.js} +1 -1
  87. package/dist/{plugins-cli-c36MSKiX.js → plugins-cli-Cv_bwpr4.js} +1 -1
  88. package/dist/{plugins-cli-CgjC_YvF.js → plugins-cli-DkFN_JgK.js} +1 -1
  89. package/dist/{program-QMtnfrM_.js → program-DYU1raxm.js} +2 -2
  90. package/dist/{program-context-BgCNjcCh.js → program-context-D4S-3zNt.js} +1 -1
  91. package/dist/{prompt-select-styled-CWG9o2CX.js → prompt-select-styled-BhKY5Oj4.js} +1 -1
  92. package/dist/{prompt-select-styled-m1_NXutn.js → prompt-select-styled-D1StbM6j.js} +1 -1
  93. package/dist/{provider-auth-helpers-BFCTgzr_.js → provider-auth-helpers-5ZQb3SEz.js} +1 -1
  94. package/dist/{provider-auth-helpers-D0eiRpeb.js → provider-auth-helpers-Cibq8oDi.js} +1 -1
  95. package/dist/{provider-dispatcher-Djomkp5i.js → provider-dispatcher-Bwaplzm8.js} +1 -1
  96. package/dist/{provider-dispatcher-B6kumPDM.js → provider-dispatcher-kL8Yl9XU.js} +1 -1
  97. package/dist/{push-apns-DalSFp-6.js → push-apns-BXmSvfvx.js} +1 -1
  98. package/dist/{push-apns-DwSjHMuA.js → push-apns-C9hsLIBU.js} +1 -1
  99. package/dist/{pw-ai-1DyAPekE.js → pw-ai-BLyUwyRC.js} +1 -1
  100. package/dist/{register.agent-BZn434eF.js → register.agent-C4x77WJe.js} +1 -1
  101. package/dist/{register.agent-DNaHcARI.js → register.agent-CbP_v3k5.js} +1 -1
  102. package/dist/{register.configure-GTH7BPIx.js → register.configure-B-j2lVkz.js} +1 -1
  103. package/dist/{register.configure-Bflad790.js → register.configure-BsBerk8U.js} +1 -1
  104. package/dist/{register.maintenance-Dl7P66Jm.js → register.maintenance-B83yzc-P.js} +1 -1
  105. package/dist/{register.maintenance-B1XK1zeY.js → register.maintenance-WLPWJ7vr.js} +1 -1
  106. package/dist/{register.message-CJS3PPCy.js → register.message-BVo8xLbS.js} +1 -1
  107. package/dist/{register.message-CA5LiG16.js → register.message-DZ9zcORn.js} +1 -1
  108. package/dist/{register.onboard-Bj6wFSzC.js → register.onboard-CWCqKyU7.js} +1 -1
  109. package/dist/{register.onboard-4y1mzgCn.js → register.onboard-D9mB9MLj.js} +1 -1
  110. package/dist/{register.setup-Cvk8SB1q.js → register.setup-BMFb9IC4.js} +1 -1
  111. package/dist/{register.setup-zLIWO_nF.js → register.setup-C22fWTFR.js} +1 -1
  112. package/dist/{register.status-health-sessions-CjxA4ATI.js → register.status-health-sessions-BqMqFeMA.js} +1 -1
  113. package/dist/{register.status-health-sessions-CIYKmgKO.js → register.status-health-sessions-C-jqKRZ5.js} +1 -1
  114. package/dist/{register.subclis-Ua7PkPpv.js → register.subclis-Ceyv8kgc.js} +1 -1
  115. package/dist/{register.subclis-Ct4QBaKi.js → register.subclis-DxcQwaQg.js} +1 -1
  116. package/dist/{reply-gZ_yr2mJ.js → reply-BeKidf2F.js} +4 -4
  117. package/dist/{run-main-Cyc_C0B-.js → run-main-EhlBxGJB.js} +1 -1
  118. package/dist/{runner-C1sy_uJN.js → runner-P3IfAnSL.js} +3 -3
  119. package/dist/{server-node-events-CSsH-eIF.js → server-node-events-BZuSkcbo.js} +1 -1
  120. package/dist/{server-node-events-Bz_Qo5BV.js → server-node-events-CIsEZSfR.js} +1 -1
  121. package/dist/{session-dirs-fh5kvbyH.js → session-dirs-DH7k5ehu.js} +1 -1
  122. package/dist/{session-dirs-DVL9vHmq.js → session-dirs-DgwMogyJ.js} +1 -1
  123. package/dist/{status-sAc6yoa3.js → status-BY0kS_wo.js} +1 -1
  124. package/dist/{status-SPonEO1J.js → status-B_SXw9W4.js} +1 -1
  125. package/dist/{status-DZYF4S6_.js → status-BqEzSHhZ.js} +1 -1
  126. package/dist/{status-ChEjU5un.js → status-Ca-hgLW_.js} +1 -1
  127. package/dist/{status-CpxCM8BO.js → status-_KIJcQH-.js} +1 -1
  128. package/dist/{subagent-registry-BHP3_ka8.js → subagent-registry-98yia-RN.js} +4 -4
  129. package/dist/{subagent-registry-BYK0Wq_w.js → subagent-registry-Ch9dN-TR.js} +1 -1
  130. package/dist/{subagent-registry-DR5M5QUP.js → subagent-registry-CiYeuaym.js} +1 -1
  131. package/dist/{tui-Ujq2bTco.js → tui-BIpdEy5i.js} +2 -2
  132. package/dist/{tui-BsMw6I4Y.js → tui-DeG1am8h.js} +2 -2
  133. package/dist/{tui-cli-CLYxMYyC.js → tui-cli-3mxSu-O0.js} +1 -1
  134. package/dist/{tui-cli-BBKMdwDt.js → tui-cli-CXRFHYWv.js} +1 -1
  135. package/dist/{update-cli-uQLI7RCN.js → update-cli-BYhJHTZ0.js} +1 -1
  136. package/dist/{update-cli-BKcCNOzz.js → update-cli-DkgHl95y.js} +1 -1
  137. package/dist/{web-Bkk568P6.js → web--D7qJmx6.js} +1 -1
  138. package/dist/{web-wR7gzEVJ.js → web-CgypI7gs.js} +1 -1
  139. package/dist/{web-CGo9DnE4.js → web-DKmwaw7q.js} +1 -1
  140. package/dist/{web-DktK5vCb.js → web-Dvcfg5Kd.js} +1 -1
  141. package/extensions/memory-lancedb/package.json +2 -2
  142. package/package.json +1 -1
  143. package/dist/chrome-CAuboFG7.js +0 -4
@@ -1 +1 @@
1
- import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.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"./model-selection-DlYajIzF.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./src-CQLQD-1r.js";import"./io-DhUMGsxN.js";import"./manifest-registry-CBVaj2md.js";import"./config-lGOyM6Kq.js";import"./model-catalog-BQUEoIev.js";import"./transformers-stream-QS2dnQob.js";import"./shared-BMSboHpU.js";import"./model-picker-DWc0Kexq.js";import{u as downloadAndWireLocalBrain}from"./auth-choice.apply.transformers-D02W3zy7.js";export{downloadAndWireLocalBrain};
1
+ import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.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"./model-selection-DlYajIzF.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./src-CQLQD-1r.js";import"./io-DhUMGsxN.js";import"./manifest-registry-CBVaj2md.js";import"./config-lGOyM6Kq.js";import"./model-catalog-BQUEoIev.js";import"./transformers-stream-QS2dnQob.js";import"./shared-BMSboHpU.js";import"./model-picker-DWc0Kexq.js";import{u as downloadAndWireLocalBrain}from"./auth-choice.apply.transformers-DE9QrzbX.js";export{downloadAndWireLocalBrain};
@@ -1,2 +1,2 @@
1
1
  import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import{b as ensureAuthProfileStore}from"./auth-profiles-BcStSGQ1.js";import{s as downloadBuilderForceAgentsLlmModel}from"./transformers-stream-nSL4Xu31.js";import{t as promptAuthChoiceGrouped}from"./auth-choice-prompt-DvWWxKmC.js";import{r as applyPrimaryModel}from"./model-picker-Dz1ecLd0.js";import path from"node:path";const BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID=`builderforcellm-local`,TRANSFORMERS_PROVIDER_ID=BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID,AMYGDALA_MODEL_ID=`HuggingFaceTB/SmolLM2-1.7B-Instruct`,AMYGDALA_DTYPE=`q4`,HIPPOCAMPUS_MODEL_ID=`onnx-community/Qwen3-0.6B-ONNX`,HIPPOCAMPUS_DTYPE=`q4f16`;function defaultCacheDir(){return path.join(resolveStateDir(),`models`)}function toModelKey(modelId){return`${TRANSFORMERS_PROVIDER_ID}/${modelId}`}function applyTransformersProviderConfig(cfg,amygdalaModelId,amygdalaDtype,hippocampusModelId,hippocampusDtype,cacheDir){return{...cfg,models:{...cfg.models,mode:cfg.models?.mode??`merge`,providers:{...cfg.models?.providers,[TRANSFORMERS_PROVIDER_ID]:{baseUrl:cacheDir,api:`transformers`,apiKey:`local`,models:[{id:amygdalaModelId,name:`amygdala (${amygdalaModelId})`,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:8192,maxTokens:2048,headers:{"x-transformers-dtype":amygdalaDtype,"x-brain-role":`amygdala`}},{id:hippocampusModelId,name:`hippocampus (${hippocampusModelId})`,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:40960,maxTokens:4096,headers:{"x-transformers-dtype":hippocampusDtype,"x-brain-role":`hippocampus`}}]}}},localBrain:{...cfg.localBrain,enabled:!0,models:{amygdala:{modelId:amygdalaModelId,dtype:amygdalaDtype},hippocampus:{modelId:hippocampusModelId,dtype:hippocampusDtype}}}}}function extractPrimaryModel(cfg){let model=cfg.agents?.defaults?.model;if(typeof model==`string`)return model;if(model&&typeof model==`object`)return model.primary}function setModelWithFallback(cfg,primary,fallback){let defaults=cfg.agents?.defaults,existingModel=defaults?.model;return{...cfg,agents:{...cfg.agents,defaults:{...defaults,model:{...typeof existingModel==`object`?existingModel:void 0,primary,fallbacks:[fallback]}}}}}async function downloadAndWireLocalBrain(opts){let nextConfig=opts.config,configuredModelKey=extractPrimaryModel(nextConfig),amygdalaModelId=nextConfig.localBrain?.models?.amygdala?.modelId??AMYGDALA_MODEL_ID,amygdalaDtype=nextConfig.localBrain?.models?.amygdala?.dtype??`q4`,hippocampusModelId=nextConfig.localBrain?.models?.hippocampus?.modelId??HIPPOCAMPUS_MODEL_ID,hippocampusDtype=nextConfig.localBrain?.models?.hippocampus?.dtype??HIPPOCAMPUS_DTYPE,cacheDir=defaultCacheDir();nextConfig=applyTransformersProviderConfig(nextConfig,amygdalaModelId,amygdalaDtype,hippocampusModelId,hippocampusDtype,cacheDir);let lastFile=``,amygdalaSpinner=opts.prompter.progress(`Downloading amygdala (${amygdalaModelId}, ${amygdalaDtype})… (~0.9 GB)`);try{await downloadBuilderForceAgentsLlmModel({modelId:amygdalaModelId,dtype:amygdalaDtype,cacheDir,onProgress:(file,pct)=>{file!==lastFile&&(lastFile=file),amygdalaSpinner.update(`Amygdala: ${path.basename(file)} — ${pct}%`)}}),amygdalaSpinner.stop(`Amygdala (fast router) downloaded and ready.`)}catch(err){let msg=err instanceof Error?err.message:String(err);return amygdalaSpinner.stop(`Amygdala download failed: ${msg}\nThe cortex (registered LLM) will be used without a local brain.\nRe-run "builderforce configure" to try again.`),{config:nextConfig}}lastFile=``;let hippoSpinner=opts.prompter.progress(`Downloading hippocampus (${hippocampusModelId}, ${hippocampusDtype})… (~2.3 GB)`);try{await downloadBuilderForceAgentsLlmModel({modelId:hippocampusModelId,dtype:hippocampusDtype,cacheDir,onProgress:(file,pct)=>{file!==lastFile&&(lastFile=file),hippoSpinner.update(`Hippocampus: ${path.basename(file)} — ${pct}%`)}}),hippoSpinner.stop(`Hippocampus (memory model) downloaded and ready.`)}catch(err){let msg=err instanceof Error?err.message:String(err);hippoSpinner.stop(`Hippocampus download failed: ${msg}\nAmygdala will run solo; hippocampus features disabled.\nRe-run "builderforce configure" to try again.`)}let localModelKey=toModelKey(amygdalaModelId);return nextConfig=configuredModelKey&&configuredModelKey!==localModelKey?setModelWithFallback(nextConfig,localModelKey,configuredModelKey):applyPrimaryModel(nextConfig,localModelKey),{config:nextConfig}}async function applyAuthChoiceTransformers(params){if(params.authChoice!==`builderforcellm-local`)return null;await params.prompter.note(`First, pick your main LLM provider.
2
- This handles coding tasks, complex reasoning, and everything the local brain defers.`,`Configure LLM`);let llmChoice=await promptAuthChoiceGrouped({prompter:params.prompter,store:await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),includeSkip:!1}),{applyAuthChoice}=await import(`./auth-choice.apply-CXRcLO-h.js`),nextConfig=(await applyAuthChoice({authChoice:llmChoice,config:params.config,prompter:params.prompter,runtime:params.runtime,setDefaultModel:!0})).config;return await params.prompter.confirm({message:`Enable local brain? (handles simple tasks, defers complex ones)`,initialValue:!0})?{config:(await downloadAndWireLocalBrain({config:nextConfig,prompter:params.prompter})).config}:{config:nextConfig}}export{HIPPOCAMPUS_MODEL_ID as a,applyTransformersProviderConfig as c,HIPPOCAMPUS_DTYPE as i,defaultCacheDir as l,AMYGDALA_MODEL_ID as n,TRANSFORMERS_PROVIDER_ID as o,BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID as r,applyAuthChoiceTransformers as s,AMYGDALA_DTYPE as t,downloadAndWireLocalBrain as u};
2
+ This handles coding tasks, complex reasoning, and everything the local brain defers.`,`Configure LLM`);let llmChoice=await promptAuthChoiceGrouped({prompter:params.prompter,store:await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),includeSkip:!1}),{applyAuthChoice}=await import(`./auth-choice.apply-ND2C2oSe.js`),nextConfig=(await applyAuthChoice({authChoice:llmChoice,config:params.config,prompter:params.prompter,runtime:params.runtime,setDefaultModel:!0})).config;return await params.prompter.confirm({message:`Enable local brain? (handles simple tasks, defers complex ones)`,initialValue:!0})?{config:(await downloadAndWireLocalBrain({config:nextConfig,prompter:params.prompter})).config}:{config:nextConfig}}export{HIPPOCAMPUS_MODEL_ID as a,applyTransformersProviderConfig as c,HIPPOCAMPUS_DTYPE as i,defaultCacheDir as l,AMYGDALA_MODEL_ID as n,TRANSFORMERS_PROVIDER_ID as o,BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID as r,applyAuthChoiceTransformers as s,AMYGDALA_DTYPE as t,downloadAndWireLocalBrain as u};
@@ -1,2 +1,2 @@
1
1
  import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{qt as ensureAuthProfileStore}from"./model-selection-DlYajIzF.js";import{s as downloadBuilderForceAgentsLlmModel}from"./transformers-stream-QS2dnQob.js";import{t as promptAuthChoiceGrouped}from"./auth-choice-prompt-D_tSFWQL.js";import{r as applyPrimaryModel}from"./model-picker-DWc0Kexq.js";import path from"node:path";const BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID=`builderforcellm-local`,TRANSFORMERS_PROVIDER_ID=BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID,AMYGDALA_MODEL_ID=`HuggingFaceTB/SmolLM2-1.7B-Instruct`,AMYGDALA_DTYPE=`q4`,HIPPOCAMPUS_MODEL_ID=`onnx-community/Qwen3-0.6B-ONNX`,HIPPOCAMPUS_DTYPE=`q4f16`;function defaultCacheDir(){return path.join(resolveStateDir(),`models`)}function toModelKey(modelId){return`${TRANSFORMERS_PROVIDER_ID}/${modelId}`}function applyTransformersProviderConfig(cfg,amygdalaModelId,amygdalaDtype,hippocampusModelId,hippocampusDtype,cacheDir){return{...cfg,models:{...cfg.models,mode:cfg.models?.mode??`merge`,providers:{...cfg.models?.providers,[TRANSFORMERS_PROVIDER_ID]:{baseUrl:cacheDir,api:`transformers`,apiKey:`local`,models:[{id:amygdalaModelId,name:`amygdala (${amygdalaModelId})`,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:8192,maxTokens:2048,headers:{"x-transformers-dtype":amygdalaDtype,"x-brain-role":`amygdala`}},{id:hippocampusModelId,name:`hippocampus (${hippocampusModelId})`,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:40960,maxTokens:4096,headers:{"x-transformers-dtype":hippocampusDtype,"x-brain-role":`hippocampus`}}]}}},localBrain:{...cfg.localBrain,enabled:!0,models:{amygdala:{modelId:amygdalaModelId,dtype:amygdalaDtype},hippocampus:{modelId:hippocampusModelId,dtype:hippocampusDtype}}}}}function extractPrimaryModel(cfg){let model=cfg.agents?.defaults?.model;if(typeof model==`string`)return model;if(model&&typeof model==`object`)return model.primary}function setModelWithFallback(cfg,primary,fallback){let defaults=cfg.agents?.defaults,existingModel=defaults?.model;return{...cfg,agents:{...cfg.agents,defaults:{...defaults,model:{...typeof existingModel==`object`?existingModel:void 0,primary,fallbacks:[fallback]}}}}}async function downloadAndWireLocalBrain(opts){let nextConfig=opts.config,configuredModelKey=extractPrimaryModel(nextConfig),amygdalaModelId=nextConfig.localBrain?.models?.amygdala?.modelId??AMYGDALA_MODEL_ID,amygdalaDtype=nextConfig.localBrain?.models?.amygdala?.dtype??`q4`,hippocampusModelId=nextConfig.localBrain?.models?.hippocampus?.modelId??HIPPOCAMPUS_MODEL_ID,hippocampusDtype=nextConfig.localBrain?.models?.hippocampus?.dtype??HIPPOCAMPUS_DTYPE,cacheDir=defaultCacheDir();nextConfig=applyTransformersProviderConfig(nextConfig,amygdalaModelId,amygdalaDtype,hippocampusModelId,hippocampusDtype,cacheDir);let lastFile=``,amygdalaSpinner=opts.prompter.progress(`Downloading amygdala (${amygdalaModelId}, ${amygdalaDtype})… (~0.9 GB)`);try{await downloadBuilderForceAgentsLlmModel({modelId:amygdalaModelId,dtype:amygdalaDtype,cacheDir,onProgress:(file,pct)=>{file!==lastFile&&(lastFile=file),amygdalaSpinner.update(`Amygdala: ${path.basename(file)} — ${pct}%`)}}),amygdalaSpinner.stop(`Amygdala (fast router) downloaded and ready.`)}catch(err){let msg=err instanceof Error?err.message:String(err);return amygdalaSpinner.stop(`Amygdala download failed: ${msg}\nThe cortex (registered LLM) will be used without a local brain.\nRe-run "builderforce configure" to try again.`),{config:nextConfig}}lastFile=``;let hippoSpinner=opts.prompter.progress(`Downloading hippocampus (${hippocampusModelId}, ${hippocampusDtype})… (~2.3 GB)`);try{await downloadBuilderForceAgentsLlmModel({modelId:hippocampusModelId,dtype:hippocampusDtype,cacheDir,onProgress:(file,pct)=>{file!==lastFile&&(lastFile=file),hippoSpinner.update(`Hippocampus: ${path.basename(file)} — ${pct}%`)}}),hippoSpinner.stop(`Hippocampus (memory model) downloaded and ready.`)}catch(err){let msg=err instanceof Error?err.message:String(err);hippoSpinner.stop(`Hippocampus download failed: ${msg}\nAmygdala will run solo; hippocampus features disabled.\nRe-run "builderforce configure" to try again.`)}let localModelKey=toModelKey(amygdalaModelId);return nextConfig=configuredModelKey&&configuredModelKey!==localModelKey?setModelWithFallback(nextConfig,localModelKey,configuredModelKey):applyPrimaryModel(nextConfig,localModelKey),{config:nextConfig}}async function applyAuthChoiceTransformers(params){if(params.authChoice!==`builderforcellm-local`)return null;await params.prompter.note(`First, pick your main LLM provider.
2
- This handles coding tasks, complex reasoning, and everything the local brain defers.`,`Configure LLM`);let llmChoice=await promptAuthChoiceGrouped({prompter:params.prompter,store:await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),includeSkip:!1}),{applyAuthChoice}=await import(`./auth-choice.apply-Cch5UXis.js`),nextConfig=(await applyAuthChoice({authChoice:llmChoice,config:params.config,prompter:params.prompter,runtime:params.runtime,setDefaultModel:!0})).config;return await params.prompter.confirm({message:`Enable local brain? (handles simple tasks, defers complex ones)`,initialValue:!0})?{config:(await downloadAndWireLocalBrain({config:nextConfig,prompter:params.prompter})).config}:{config:nextConfig}}export{HIPPOCAMPUS_MODEL_ID as a,applyTransformersProviderConfig as c,HIPPOCAMPUS_DTYPE as i,defaultCacheDir as l,AMYGDALA_MODEL_ID as n,TRANSFORMERS_PROVIDER_ID as o,BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID as r,applyAuthChoiceTransformers as s,AMYGDALA_DTYPE as t,downloadAndWireLocalBrain as u};
2
+ This handles coding tasks, complex reasoning, and everything the local brain defers.`,`Configure LLM`);let llmChoice=await promptAuthChoiceGrouped({prompter:params.prompter,store:await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),includeSkip:!1}),{applyAuthChoice}=await import(`./auth-choice.apply-DSHzvYNu.js`),nextConfig=(await applyAuthChoice({authChoice:llmChoice,config:params.config,prompter:params.prompter,runtime:params.runtime,setDefaultModel:!0})).config;return await params.prompter.confirm({message:`Enable local brain? (handles simple tasks, defers complex ones)`,initialValue:!0})?{config:(await downloadAndWireLocalBrain({config:nextConfig,prompter:params.prompter})).config}:{config:nextConfig}}export{HIPPOCAMPUS_MODEL_ID as a,applyTransformersProviderConfig as c,HIPPOCAMPUS_DTYPE as i,defaultCacheDir as l,AMYGDALA_MODEL_ID as n,TRANSFORMERS_PROVIDER_ID as o,BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID as r,applyAuthChoiceTransformers as s,AMYGDALA_DTYPE as t,downloadAndWireLocalBrain as u};
@@ -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"./auth-profiles-BcStSGQ1.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import"./src-DMo2gLcR.js";import"./io-wLHeSE2L.js";import"./manifest-registry-DZdPjBqs.js";import"./config-DBrFbWRm.js";import"./model-discovery-CfknTieh.js";import"./model-catalog-CVRB77_N.js";import"./transformers-stream-nSL4Xu31.js";import"./shared-WIJmFKqL.js";import"./model-picker-Dz1ecLd0.js";import{u as downloadAndWireLocalBrain}from"./auth-choice.apply.transformers-B9SieNNk.js";export{downloadAndWireLocalBrain};
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"./auth-profiles-BcStSGQ1.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import"./src-DMo2gLcR.js";import"./io-wLHeSE2L.js";import"./manifest-registry-DZdPjBqs.js";import"./config-DBrFbWRm.js";import"./model-discovery-CfknTieh.js";import"./model-catalog-CVRB77_N.js";import"./transformers-stream-nSL4Xu31.js";import"./shared-WIJmFKqL.js";import"./model-picker-Dz1ecLd0.js";import{u as downloadAndWireLocalBrain}from"./auth-choice.apply.transformers-CBQbUAwr.js";export{downloadAndWireLocalBrain};
@@ -1 +1 @@
1
- import{R as isRich,z as theme}from"./utils-BP60e80M.js";import{d as visibleWidth}from"./subsystem-C4b1Von0.js";import{rn as resolveCommitHash}from"./subagent-registry-BHP3_ka8.js";const DEFAULT_TAGLINE=`All your chats, one BuilderForceAgents.`,HOLIDAY_TAGLINES={newYear:`New Year's Day: New year, new config—same old EADDRINUSE, but this time we resolve it like grown-ups.`,lunarNewYear:`Lunar New Year: May your builds be lucky, your branches prosperous, and your merge conflicts chased away with fireworks.`,christmas:`Christmas: Ho ho ho—Santa's little agentNode-sistant is here to ship joy, roll back chaos, and stash the keys safely.`,eid:`Eid al-Fitr: Celebration mode: queues cleared, tasks completed, and good vibes committed to main with clean history.`,diwali:`Diwali: Let the logs sparkle and the bugs flee—today we light up the terminal and ship with pride.`,easter:`Easter: I found your missing environment variable—consider it a tiny CLI egg hunt with fewer jellybeans.`,hanukkah:`Hanukkah: Eight nights, eight retries, zero shame—may your gateway stay lit and your deployments stay peaceful.`,halloween:`Halloween: Spooky season: beware haunted dependencies, cursed caches, and the ghost of node_modules past.`,thanksgiving:`Thanksgiving: Grateful for stable ports, working DNS, and a bot that reads the logs so nobody has to.`,valentines:`Valentine's Day: Roses are typed, violets are piped—I'll automate the chores so you can spend time with humans.`},TAGLINES=[`Your terminal just grew agentNodes—type something and let the bot pinch the busywork.`,`Welcome to the command line: where dreams compile and confidence segfaults.`,`I run on caffeine, JSON5, and the audacity of "it worked on my machine."`,`Gateway online—please keep hands, feet, and appendages inside the shell at all times.`,`I speak fluent bash, mild sarcasm, and aggressive tab-completion energy.`,`One CLI to rule them all, and one more restart because you changed the port.`,`If it works, it's automation; if it breaks, it's a "learning opportunity."`,`Pairing codes exist because even bots believe in consent—and good security hygiene.`,`Your .env is showing; don't worry, I'll pretend I didn't see it.`,`I'll do the boring stuff while you dramatically stare at the logs like it's cinema.`,`I'm not saying your workflow is chaotic... I'm just bringing a linter and a helmet.`,`Type the command with confidence—nature will provide the stack trace if needed.`,`I don't judge, but your missing API keys are absolutely judging you.`,`I can grep it, git blame it, and gently roast it—pick your coping mechanism.`,`Hot reload for config, cold sweat for deploys.`,`I'm the assistant your terminal demanded, not the one your sleep schedule requested.`,`I keep secrets like a vault... unless you print them in debug logs again.`,`Automation with agentNodes: minimal fuss, maximal pinch.`,`I'm basically a Swiss Army knife, but with more opinions and fewer sharp edges.`,`If you're lost, run doctor; if you're brave, run prod; if you're wise, run tests.`,`Your task has been queued; your dignity has been deprecated.`,`I can't fix your code taste, but I can fix your build and your backlog.`,`I'm not magic—I'm just extremely persistent with retries and coping strategies.`,`It's not "failing," it's "discovering new ways to configure the same thing wrong."`,`Give me a workspace and I'll give you fewer tabs, fewer toggles, and more oxygen.`,`I read logs so you can keep pretending you don't have to.`,`If something's on fire, I can't extinguish it—but I can write a beautiful postmortem.`,`I'll refactor your busywork like it owes me money.`,`Say "stop" and I'll stop—say "ship" and we'll both learn a lesson.`,`I'm the reason your shell history looks like a hacker-movie montage.`,`I'm like tmux: confusing at first, then suddenly you can't live without me.`,`I can run local, remote, or purely on vibes—results may vary with DNS.`,`If you can describe it, I can probably automate it—or at least make it funnier.`,`Your config is valid, your assumptions are not.`,`I don't just autocomplete—I auto-commit (emotionally), then ask you to review (logically).`,`Less clicking, more shipping, fewer "where did that file go" moments.`,`AgentNodes out, commit in—let's ship something mildly responsible.`,`If it's repetitive, I'll automate it; if it's hard, I'll bring jokes and a rollback plan.`,`Because texting yourself reminders is so 2024.`,`Your inbox, your infra, your rules.`,`Turning "I'll reply later" into "my bot replied instantly".`,`Chat automation for people who peaked at IRC.`,`Because Siri wasn't answering at 3AM.`,`IPC, but it's your phone.`,`The UNIX philosophy meets your DMs.`,`curl for conversations.`,`Less middlemen, more messages.`,`Ship fast, log faster.`,`End-to-end encrypted, drama-to-drama excluded.`,`The only bot that stays out of your training set.`,`WhatsApp automation without the "please accept our new privacy policy".`,`Chat APIs that don't require a Senate hearing.`,`Meta wishes they shipped this fast.`,`Because the right answer is usually a script.`,`Your messages, your servers, your control.`,`OpenAI-compatible, not OpenAI-dependent.`,`iMessage green bubble energy, but for everyone.`,`Siri's competent cousin.`,`Works on Android. Crazy concept, we know.`,`No $999 stand required.`,`We ship features faster than Apple ships calculator updates.`,`Your AI assistant, now without the $3,499 headset.`,`Think different. Actually think.`,`Ah, the fruit tree company! 🍎`,`Greetings, Professor Falken`,HOLIDAY_TAGLINES.newYear,HOLIDAY_TAGLINES.lunarNewYear,HOLIDAY_TAGLINES.christmas,HOLIDAY_TAGLINES.eid,HOLIDAY_TAGLINES.diwali,HOLIDAY_TAGLINES.easter,HOLIDAY_TAGLINES.hanukkah,HOLIDAY_TAGLINES.halloween,HOLIDAY_TAGLINES.thanksgiving,HOLIDAY_TAGLINES.valentines],DAY_MS=1440*60*1e3;function utcParts(date){return{year:date.getUTCFullYear(),month:date.getUTCMonth(),day:date.getUTCDate()}}const onMonthDay=(month,day)=>date=>{let parts=utcParts(date);return parts.month===month&&parts.day===day},onSpecificDates=(dates,durationDays=1)=>date=>{let parts=utcParts(date);return dates.some(([year,month,day])=>{if(parts.year!==year)return!1;let start=Date.UTC(year,month,day),current=Date.UTC(parts.year,parts.month,parts.day);return current>=start&&current<start+durationDays*DAY_MS})},HOLIDAY_RULES=new Map([[HOLIDAY_TAGLINES.newYear,onMonthDay(0,1)],[HOLIDAY_TAGLINES.lunarNewYear,onSpecificDates([[2025,0,29],[2026,1,17],[2027,1,6]],1)],[HOLIDAY_TAGLINES.eid,onSpecificDates([[2025,2,30],[2025,2,31],[2026,2,20],[2027,2,10]],1)],[HOLIDAY_TAGLINES.diwali,onSpecificDates([[2025,9,20],[2026,10,8],[2027,9,28]],1)],[HOLIDAY_TAGLINES.easter,onSpecificDates([[2025,3,20],[2026,3,5],[2027,2,28]],1)],[HOLIDAY_TAGLINES.hanukkah,(windows=>date=>{let parts=utcParts(date),window=windows.find(entry=>entry.year===parts.year);if(!window)return!1;let start=Date.UTC(window.year,window.month,window.day),current=Date.UTC(parts.year,parts.month,parts.day);return current>=start&&current<start+window.duration*DAY_MS})([{year:2025,month:11,day:15,duration:8},{year:2026,month:11,day:5,duration:8},{year:2027,month:11,day:25,duration:8}])],[HOLIDAY_TAGLINES.halloween,onMonthDay(9,31)],[HOLIDAY_TAGLINES.thanksgiving,date=>{let parts=utcParts(date);if(parts.month!==10)return!1;let fourthThursday=1+(4-new Date(Date.UTC(parts.year,10,1)).getUTCDay()+7)%7+21;return parts.day===fourthThursday}],[HOLIDAY_TAGLINES.valentines,onMonthDay(1,14)],[HOLIDAY_TAGLINES.christmas,onMonthDay(11,25)]]);function isTaglineActive(tagline,date){let rule=HOLIDAY_RULES.get(tagline);return rule?rule(date):!0}function activeTaglines(options={}){if(TAGLINES.length===0)return[DEFAULT_TAGLINE];let today=options.now?options.now():new Date,filtered=TAGLINES.filter(tagline=>isTaglineActive(tagline,today));return filtered.length>0?filtered:TAGLINES}function pickTagline(options={}){let override=(options.env??process.env)?.BUILDERFORCE_AGENTS_TAGLINE_INDEX;if(override!==void 0){let parsed=Number.parseInt(override,10);if(!Number.isNaN(parsed)&&parsed>=0){let pool=TAGLINES.length>0?TAGLINES:[DEFAULT_TAGLINE];return pool[parsed%pool.length]}}let pool=activeTaglines(options),rand=options.random??Math.random;return pool[Math.floor(rand()*pool.length)%pool.length]}let bannerEmitted=!1;const hasJsonFlag=argv=>argv.some(arg=>arg===`--json`||arg.startsWith(`--json=`)),hasVersionFlag=argv=>argv.some(arg=>arg===`--version`||arg===`-V`||arg===`-v`);function formatCliBannerLine(version,options={}){let commitLabel=options.commit??resolveCommitHash({env:options.env})??`local`,tagline=pickTagline(options),rich=options.richTty??isRich(),title=`BuilderForceAgents`,columns=options.columns??process.stdout.columns??120,plainFullLine=`${title} ${version} (${commitLabel}) — ${tagline}`,fitsOnOneLine=visibleWidth(plainFullLine)<=columns;return rich?fitsOnOneLine?`${theme.brand(title)} ${theme.brand(version)} ${theme.muted(`(${commitLabel})`)} ${theme.muted(`—`)} ${theme.brand(tagline)}`:`${`${theme.brand(title)} ${theme.brand(version)} ${theme.muted(`(${commitLabel})`)}`}\n${`${` `.repeat(0)}${theme.brand(tagline)}`}`:fitsOnOneLine?plainFullLine:`${`${title} ${version} (${commitLabel})`}\n${`${` `.repeat(0)}${tagline}`}`}function emitCliBanner(version,options={}){if(bannerEmitted)return;let argv=options.argv??process.argv;if(!process.stdout.isTTY||hasJsonFlag(argv)||hasVersionFlag(argv))return;let line=formatCliBannerLine(version,options);process.stdout.write(`\n${line}\n\n`),bannerEmitted=!0}function hasEmittedCliBanner(){return bannerEmitted}export{formatCliBannerLine as n,hasEmittedCliBanner as r,emitCliBanner as t};
1
+ import{R as isRich,z as theme}from"./utils-BP60e80M.js";import{d as visibleWidth}from"./subsystem-C4b1Von0.js";import{rn as resolveCommitHash}from"./subagent-registry-98yia-RN.js";const DEFAULT_TAGLINE=`All your chats, one BuilderForceAgents.`,HOLIDAY_TAGLINES={newYear:`New Year's Day: New year, new config—same old EADDRINUSE, but this time we resolve it like grown-ups.`,lunarNewYear:`Lunar New Year: May your builds be lucky, your branches prosperous, and your merge conflicts chased away with fireworks.`,christmas:`Christmas: Ho ho ho—Santa's little agentNode-sistant is here to ship joy, roll back chaos, and stash the keys safely.`,eid:`Eid al-Fitr: Celebration mode: queues cleared, tasks completed, and good vibes committed to main with clean history.`,diwali:`Diwali: Let the logs sparkle and the bugs flee—today we light up the terminal and ship with pride.`,easter:`Easter: I found your missing environment variable—consider it a tiny CLI egg hunt with fewer jellybeans.`,hanukkah:`Hanukkah: Eight nights, eight retries, zero shame—may your gateway stay lit and your deployments stay peaceful.`,halloween:`Halloween: Spooky season: beware haunted dependencies, cursed caches, and the ghost of node_modules past.`,thanksgiving:`Thanksgiving: Grateful for stable ports, working DNS, and a bot that reads the logs so nobody has to.`,valentines:`Valentine's Day: Roses are typed, violets are piped—I'll automate the chores so you can spend time with humans.`},TAGLINES=[`Your terminal just grew agentNodes—type something and let the bot pinch the busywork.`,`Welcome to the command line: where dreams compile and confidence segfaults.`,`I run on caffeine, JSON5, and the audacity of "it worked on my machine."`,`Gateway online—please keep hands, feet, and appendages inside the shell at all times.`,`I speak fluent bash, mild sarcasm, and aggressive tab-completion energy.`,`One CLI to rule them all, and one more restart because you changed the port.`,`If it works, it's automation; if it breaks, it's a "learning opportunity."`,`Pairing codes exist because even bots believe in consent—and good security hygiene.`,`Your .env is showing; don't worry, I'll pretend I didn't see it.`,`I'll do the boring stuff while you dramatically stare at the logs like it's cinema.`,`I'm not saying your workflow is chaotic... I'm just bringing a linter and a helmet.`,`Type the command with confidence—nature will provide the stack trace if needed.`,`I don't judge, but your missing API keys are absolutely judging you.`,`I can grep it, git blame it, and gently roast it—pick your coping mechanism.`,`Hot reload for config, cold sweat for deploys.`,`I'm the assistant your terminal demanded, not the one your sleep schedule requested.`,`I keep secrets like a vault... unless you print them in debug logs again.`,`Automation with agentNodes: minimal fuss, maximal pinch.`,`I'm basically a Swiss Army knife, but with more opinions and fewer sharp edges.`,`If you're lost, run doctor; if you're brave, run prod; if you're wise, run tests.`,`Your task has been queued; your dignity has been deprecated.`,`I can't fix your code taste, but I can fix your build and your backlog.`,`I'm not magic—I'm just extremely persistent with retries and coping strategies.`,`It's not "failing," it's "discovering new ways to configure the same thing wrong."`,`Give me a workspace and I'll give you fewer tabs, fewer toggles, and more oxygen.`,`I read logs so you can keep pretending you don't have to.`,`If something's on fire, I can't extinguish it—but I can write a beautiful postmortem.`,`I'll refactor your busywork like it owes me money.`,`Say "stop" and I'll stop—say "ship" and we'll both learn a lesson.`,`I'm the reason your shell history looks like a hacker-movie montage.`,`I'm like tmux: confusing at first, then suddenly you can't live without me.`,`I can run local, remote, or purely on vibes—results may vary with DNS.`,`If you can describe it, I can probably automate it—or at least make it funnier.`,`Your config is valid, your assumptions are not.`,`I don't just autocomplete—I auto-commit (emotionally), then ask you to review (logically).`,`Less clicking, more shipping, fewer "where did that file go" moments.`,`AgentNodes out, commit in—let's ship something mildly responsible.`,`If it's repetitive, I'll automate it; if it's hard, I'll bring jokes and a rollback plan.`,`Because texting yourself reminders is so 2024.`,`Your inbox, your infra, your rules.`,`Turning "I'll reply later" into "my bot replied instantly".`,`Chat automation for people who peaked at IRC.`,`Because Siri wasn't answering at 3AM.`,`IPC, but it's your phone.`,`The UNIX philosophy meets your DMs.`,`curl for conversations.`,`Less middlemen, more messages.`,`Ship fast, log faster.`,`End-to-end encrypted, drama-to-drama excluded.`,`The only bot that stays out of your training set.`,`WhatsApp automation without the "please accept our new privacy policy".`,`Chat APIs that don't require a Senate hearing.`,`Meta wishes they shipped this fast.`,`Because the right answer is usually a script.`,`Your messages, your servers, your control.`,`OpenAI-compatible, not OpenAI-dependent.`,`iMessage green bubble energy, but for everyone.`,`Siri's competent cousin.`,`Works on Android. Crazy concept, we know.`,`No $999 stand required.`,`We ship features faster than Apple ships calculator updates.`,`Your AI assistant, now without the $3,499 headset.`,`Think different. Actually think.`,`Ah, the fruit tree company! 🍎`,`Greetings, Professor Falken`,HOLIDAY_TAGLINES.newYear,HOLIDAY_TAGLINES.lunarNewYear,HOLIDAY_TAGLINES.christmas,HOLIDAY_TAGLINES.eid,HOLIDAY_TAGLINES.diwali,HOLIDAY_TAGLINES.easter,HOLIDAY_TAGLINES.hanukkah,HOLIDAY_TAGLINES.halloween,HOLIDAY_TAGLINES.thanksgiving,HOLIDAY_TAGLINES.valentines],DAY_MS=1440*60*1e3;function utcParts(date){return{year:date.getUTCFullYear(),month:date.getUTCMonth(),day:date.getUTCDate()}}const onMonthDay=(month,day)=>date=>{let parts=utcParts(date);return parts.month===month&&parts.day===day},onSpecificDates=(dates,durationDays=1)=>date=>{let parts=utcParts(date);return dates.some(([year,month,day])=>{if(parts.year!==year)return!1;let start=Date.UTC(year,month,day),current=Date.UTC(parts.year,parts.month,parts.day);return current>=start&&current<start+durationDays*DAY_MS})},HOLIDAY_RULES=new Map([[HOLIDAY_TAGLINES.newYear,onMonthDay(0,1)],[HOLIDAY_TAGLINES.lunarNewYear,onSpecificDates([[2025,0,29],[2026,1,17],[2027,1,6]],1)],[HOLIDAY_TAGLINES.eid,onSpecificDates([[2025,2,30],[2025,2,31],[2026,2,20],[2027,2,10]],1)],[HOLIDAY_TAGLINES.diwali,onSpecificDates([[2025,9,20],[2026,10,8],[2027,9,28]],1)],[HOLIDAY_TAGLINES.easter,onSpecificDates([[2025,3,20],[2026,3,5],[2027,2,28]],1)],[HOLIDAY_TAGLINES.hanukkah,(windows=>date=>{let parts=utcParts(date),window=windows.find(entry=>entry.year===parts.year);if(!window)return!1;let start=Date.UTC(window.year,window.month,window.day),current=Date.UTC(parts.year,parts.month,parts.day);return current>=start&&current<start+window.duration*DAY_MS})([{year:2025,month:11,day:15,duration:8},{year:2026,month:11,day:5,duration:8},{year:2027,month:11,day:25,duration:8}])],[HOLIDAY_TAGLINES.halloween,onMonthDay(9,31)],[HOLIDAY_TAGLINES.thanksgiving,date=>{let parts=utcParts(date);if(parts.month!==10)return!1;let fourthThursday=1+(4-new Date(Date.UTC(parts.year,10,1)).getUTCDay()+7)%7+21;return parts.day===fourthThursday}],[HOLIDAY_TAGLINES.valentines,onMonthDay(1,14)],[HOLIDAY_TAGLINES.christmas,onMonthDay(11,25)]]);function isTaglineActive(tagline,date){let rule=HOLIDAY_RULES.get(tagline);return rule?rule(date):!0}function activeTaglines(options={}){if(TAGLINES.length===0)return[DEFAULT_TAGLINE];let today=options.now?options.now():new Date,filtered=TAGLINES.filter(tagline=>isTaglineActive(tagline,today));return filtered.length>0?filtered:TAGLINES}function pickTagline(options={}){let override=(options.env??process.env)?.BUILDERFORCE_AGENTS_TAGLINE_INDEX;if(override!==void 0){let parsed=Number.parseInt(override,10);if(!Number.isNaN(parsed)&&parsed>=0){let pool=TAGLINES.length>0?TAGLINES:[DEFAULT_TAGLINE];return pool[parsed%pool.length]}}let pool=activeTaglines(options),rand=options.random??Math.random;return pool[Math.floor(rand()*pool.length)%pool.length]}let bannerEmitted=!1;const hasJsonFlag=argv=>argv.some(arg=>arg===`--json`||arg.startsWith(`--json=`)),hasVersionFlag=argv=>argv.some(arg=>arg===`--version`||arg===`-V`||arg===`-v`);function formatCliBannerLine(version,options={}){let commitLabel=options.commit??resolveCommitHash({env:options.env})??`local`,tagline=pickTagline(options),rich=options.richTty??isRich(),title=`BuilderForceAgents`,columns=options.columns??process.stdout.columns??120,plainFullLine=`${title} ${version} (${commitLabel}) — ${tagline}`,fitsOnOneLine=visibleWidth(plainFullLine)<=columns;return rich?fitsOnOneLine?`${theme.brand(title)} ${theme.brand(version)} ${theme.muted(`(${commitLabel})`)} ${theme.muted(`—`)} ${theme.brand(tagline)}`:`${`${theme.brand(title)} ${theme.brand(version)} ${theme.muted(`(${commitLabel})`)}`}\n${`${` `.repeat(0)}${theme.brand(tagline)}`}`:fitsOnOneLine?plainFullLine:`${`${title} ${version} (${commitLabel})`}\n${`${` `.repeat(0)}${tagline}`}`}function emitCliBanner(version,options={}){if(bannerEmitted)return;let argv=options.argv??process.argv;if(!process.stdout.isTTY||hasJsonFlag(argv)||hasVersionFlag(argv))return;let line=formatCliBannerLine(version,options);process.stdout.write(`\n${line}\n\n`),bannerEmitted=!0}function hasEmittedCliBanner(){return bannerEmitted}export{formatCliBannerLine as n,hasEmittedCliBanner as r,emitCliBanner as t};
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026.10.3",
3
- "commit": "116f9025966f2d5fe8aea6bc792e2af7c9dc8c93",
4
- "builtAt": "2026-10-16T11:54:32.419Z"
2
+ "version": "2026.10.4",
3
+ "commit": "6f5569965450b0fd1c69a1720b501b6084ffabc4",
4
+ "builtAt": "2026-10-16T12:54:53.274Z"
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-BcStSGQ1.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import{t as normalizeBaseUrl}from"./normalize-base-url-CaRxuDMW.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-BIKVpYUN.js";import"./src-DMo2gLcR.js";import{U as VERSION,a as readConfigFileSnapshot,c as writeConfigFile}from"./io-wLHeSE2L.js";import"./manifest-registry-DZdPjBqs.js";import"./config-DBrFbWRm.js";import"./model-discovery-CfknTieh.js";import"./model-catalog-CVRB77_N.js";import"./frontmatter-CoaI_oW6.js";import"./skills-CC5ozaMz.js";import"./plugin-skills-DUy_aY2T.js";import"./client-BlsvYCEu.js";import"./call-Gj5Bi_oV.js";import"./message-channel-BjZV4RTT.js";import"./sessions-C5jAGWOS.js";import{_ as isBuilderForceAgentsProject,n as loadProjectContext,o as updateProjectContextFields}from"./project-context-store-BFOv5caq.js";import"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import"./accounts-DoJYLMfS.js";import"./image-ops-Bg9yFwjX.js";import"./redact-bWj_-q3j.js";import"./errors-t5wHPcwh.js";import"./embedded-helpers-CsRjxr3I.js";import"./sandbox-bEma8jFA.js";import"./chrome-Kt4wxGF2.js";import"./tailscale-CgCG7AVQ.js";import"./auth-BNeS9xde.js";import"./server-context-0vSm_r2R.js";import"./routes-BLhXC8oU.js";import"./paths-GamzES41.js";import"./ssrf-BiSQzdcA.js";import"./store-C5LmVaEC.js";import"./ports-LqFTyTSK.js";import"./trash-zs6gNxed.js";import"./accounts-BT-NzzBc.js";import"./paths-BQ9W7Bs0.js";import"./tool-images-DV2HMmx4.js";import"./tool-display-BIswnHaq.js";import{n as fetchWithTimeout}from"./fetch-timeout-DykxEVWb.js";import"./builderforcellm-syscheck-BTolQUtx.js";import{f as initializeBuilderForceAgentsProject}from"./project-context-De5-TWPH.js";import{r as saveMambaState}from"./mamba-state-engine-CViPpwyy.js";import"./transformers-stream-nSL4Xu31.js";import"./builderforce-directory-sync-CQVvxASx.js";import"./shared-WIJmFKqL.js";import{_ as setOpenrouterApiKey,c as setAnthropicApiKey,u as setGeminiApiKey}from"./onboard-auth.credentials-f-xn5D4D.js";import"./model-picker-Dz1ecLd0.js";import"./auth-choice.apply.transformers-B9SieNNk.js";import{t as runTui}from"./tui-Ujq2bTco.js";import"./tui-stream-assembler-DBM36ktN.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-BcStSGQ1.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import{t as normalizeBaseUrl}from"./normalize-base-url-CaRxuDMW.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-BIKVpYUN.js";import"./src-DMo2gLcR.js";import{U as VERSION,a as readConfigFileSnapshot,c as writeConfigFile}from"./io-wLHeSE2L.js";import"./manifest-registry-DZdPjBqs.js";import"./config-DBrFbWRm.js";import"./model-discovery-CfknTieh.js";import"./model-catalog-CVRB77_N.js";import"./frontmatter-CoaI_oW6.js";import"./skills-CC5ozaMz.js";import"./plugin-skills-DUy_aY2T.js";import"./client-BlsvYCEu.js";import"./call-Gj5Bi_oV.js";import"./message-channel-BjZV4RTT.js";import"./sessions-C5jAGWOS.js";import{_ as isBuilderForceAgentsProject,n as loadProjectContext,o as updateProjectContextFields}from"./project-context-store-BFOv5caq.js";import"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import"./accounts-DoJYLMfS.js";import"./image-ops-Bg9yFwjX.js";import"./redact-bWj_-q3j.js";import"./errors-t5wHPcwh.js";import"./embedded-helpers-CsRjxr3I.js";import"./sandbox-bEma8jFA.js";import"./chrome-Kt4wxGF2.js";import"./tailscale-CgCG7AVQ.js";import"./auth-BNeS9xde.js";import"./server-context-0vSm_r2R.js";import"./routes-BLhXC8oU.js";import"./paths-GamzES41.js";import"./ssrf-BiSQzdcA.js";import"./store-C5LmVaEC.js";import"./ports-LqFTyTSK.js";import"./trash-zs6gNxed.js";import"./accounts-BT-NzzBc.js";import"./paths-BQ9W7Bs0.js";import"./tool-images-DV2HMmx4.js";import"./tool-display-BIswnHaq.js";import{n as fetchWithTimeout}from"./fetch-timeout-DykxEVWb.js";import"./builderforcellm-syscheck-BTolQUtx.js";import{f as initializeBuilderForceAgentsProject}from"./project-context-De5-TWPH.js";import{r as saveMambaState}from"./mamba-state-engine-CViPpwyy.js";import"./transformers-stream-nSL4Xu31.js";import"./builderforce-directory-sync-CQVvxASx.js";import"./shared-WIJmFKqL.js";import{_ as setOpenrouterApiKey,c as setAnthropicApiKey,u as setGeminiApiKey}from"./onboard-auth.credentials-f-xn5D4D.js";import"./model-picker-Dz1ecLd0.js";import"./auth-choice.apply.transformers-CBQbUAwr.js";import{t as runTui}from"./tui-BIpdEy5i.js";import"./tui-stream-assembler-DBM36ktN.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-DHfhLu2W.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"./model-selection-DlYajIzF.js";import{t as normalizeBaseUrl}from"./normalize-base-url-Dz6Za7Ks.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./src-CQLQD-1r.js";import{U as VERSION,a as readConfigFileSnapshot,c as writeConfigFile}from"./io-DhUMGsxN.js";import"./manifest-registry-CBVaj2md.js";import"./config-lGOyM6Kq.js";import"./model-catalog-BQUEoIev.js";import"./sandbox-Cq6rH4hg.js";import"./chrome-BW8dGyxs.js";import"./tailscale-0ey4P_at.js";import"./auth-C4PxZEj8.js";import"./server-context-1YSNvKDs.js";import"./frontmatter-DpzOtLJz.js";import"./skills-vjE49XV9.js";import"./plugin-skills-RFjYtysK.js";import"./routes-DsdK6VOy.js";import"./redact-BT5hARuQ.js";import"./errors-BK3rMW8O.js";import"./paths-CejDLFxE.js";import"./ssrf-DHJTyOuH.js";import"./image-ops-D7Ex-H05.js";import"./store-Nf9BxXC7.js";import"./ports-B-SXoPqJ.js";import"./trash-DlNzpifq.js";import"./sessions-Dv212g1O.js";import"./message-channel-BW_q2nVi.js";import"./plugins-C0lu7LGS.js";import"./accounts-2InvZDx2.js";import"./accounts-CrKsbGuP.js";import"./accounts-BnsrG5TA.js";import"./bindings-qYFdqpJ3.js";import"./paths-DCzWXtSj.js";import"./tool-images-CR9Y0R5I.js";import"./tool-display-Dx-rz3CF.js";import{n as fetchWithTimeout}from"./fetch-timeout-D8-LocJa.js";import{_ as isBuilderForceAgentsProject,n as loadProjectContext,o as updateProjectContextFields}from"./project-context-store-BPhHGfFl.js";import"./client-BxPDO8Ed.js";import"./call-DLeUWFtQ.js";import"./builderforcellm-syscheck-BpNlQ4Rx.js";import{f as initializeBuilderForceAgentsProject}from"./project-context-Dp8w9r_P.js";import{r as saveMambaState}from"./mamba-state-engine-DPAATSLG.js";import"./transformers-stream-QS2dnQob.js";import"./builderforce-directory-sync-DJdx8s3l.js";import"./shared-BMSboHpU.js";import{_ as setOpenrouterApiKey,c as setAnthropicApiKey,u as setGeminiApiKey}from"./onboard-auth.credentials-Dt_yky3w.js";import"./model-picker-DWc0Kexq.js";import"./auth-choice.apply.transformers-D02W3zy7.js";import{t as runTui}from"./tui-BsMw6I4Y.js";import"./tui-stream-assembler-D9gBO7U0.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-DHfhLu2W.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"./model-selection-DlYajIzF.js";import{t as normalizeBaseUrl}from"./normalize-base-url-Dz6Za7Ks.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./src-CQLQD-1r.js";import{U as VERSION,a as readConfigFileSnapshot,c as writeConfigFile}from"./io-DhUMGsxN.js";import"./manifest-registry-CBVaj2md.js";import"./config-lGOyM6Kq.js";import"./model-catalog-BQUEoIev.js";import"./sandbox-Cq6rH4hg.js";import"./chrome-BW8dGyxs.js";import"./tailscale-0ey4P_at.js";import"./auth-C4PxZEj8.js";import"./server-context-1YSNvKDs.js";import"./frontmatter-DpzOtLJz.js";import"./skills-vjE49XV9.js";import"./plugin-skills-RFjYtysK.js";import"./routes-DsdK6VOy.js";import"./redact-BT5hARuQ.js";import"./errors-BK3rMW8O.js";import"./paths-CejDLFxE.js";import"./ssrf-DHJTyOuH.js";import"./image-ops-D7Ex-H05.js";import"./store-Nf9BxXC7.js";import"./ports-B-SXoPqJ.js";import"./trash-DlNzpifq.js";import"./sessions-Dv212g1O.js";import"./message-channel-BW_q2nVi.js";import"./plugins-C0lu7LGS.js";import"./accounts-2InvZDx2.js";import"./accounts-CrKsbGuP.js";import"./accounts-BnsrG5TA.js";import"./bindings-qYFdqpJ3.js";import"./paths-DCzWXtSj.js";import"./tool-images-CR9Y0R5I.js";import"./tool-display-Dx-rz3CF.js";import{n as fetchWithTimeout}from"./fetch-timeout-D8-LocJa.js";import{_ as isBuilderForceAgentsProject,n as loadProjectContext,o as updateProjectContextFields}from"./project-context-store-BPhHGfFl.js";import"./client-BxPDO8Ed.js";import"./call-DLeUWFtQ.js";import"./builderforcellm-syscheck-BpNlQ4Rx.js";import{f as initializeBuilderForceAgentsProject}from"./project-context-Dp8w9r_P.js";import{r as saveMambaState}from"./mamba-state-engine-DPAATSLG.js";import"./transformers-stream-QS2dnQob.js";import"./builderforce-directory-sync-DJdx8s3l.js";import"./shared-BMSboHpU.js";import{_ as setOpenrouterApiKey,c as setAnthropicApiKey,u as setGeminiApiKey}from"./onboard-auth.credentials-Dt_yky3w.js";import"./model-picker-DWc0Kexq.js";import"./auth-choice.apply.transformers-DE9QrzbX.js";import{t as runTui}from"./tui-DeG1am8h.js";import"./tui-stream-assembler-D9gBO7U0.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{a as isCliProvider,d as resolveConfiguredModelRef,ft as DEFAULT_CONTEXT_TOKENS,g as resolveThinkingDefault,mt as DEFAULT_PROVIDER,o as modelKey,pt as DEFAULT_MODEL,rt as ensureAuthProfileStore,s as normalizeModelRef,t as buildAllowedModelSet}from"../../model-selection-LH0jSUl9.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-SSuKQ6Yc.js";import{s as SILENT_REPLY_TOKEN}from"../../replies-DoptRX4K.js";import{r as normalizeChannelId,t as getChannelPlugin}from"../../plugins-J28Y83f5.js";import"../../accounts-193gfWbH.js";import"../../bindings-BfB5A-by.js";import"../../send-DPDcff6c.js";import"../../send-DCkrADD0.js";import"../../accounts-DHeA4T6C.js";import"../../send-D6xvMAyq.js";import"../../fetch-BklyLYYN.js";import{n as loadModelCatalog}from"../../model-catalog-DeCpUHoP.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-CzrgKsFN.js";import{n as loadConfig}from"../../config-DcpFA3_n.js";import"../../chrome-GnKMdiTR.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-B0MT1R_B.js";import"../../tool-images-mfC2sOfJ.js";import"../../config-DfXnxW-V.js";import"../../reply-prefix-me5vnbrB.js";import"../../sqlite-D3Ov16zb.js";import"../../manager-DZUfshOW.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-zcr6x0rr.js";import"../../outbound-attachment-U-XtahS5.js";import"../../fetch-Jq1KZsRq.js";import"../../send-wgpuk5jD.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-CGo9DnE4.js`);return await sendMessageWhatsApp(...args)},sendMessageTelegram:async(...args)=>{let{sendMessageTelegram}=await import(`../../send-D6xvMAyq.js`).then(n=>n.l);return await sendMessageTelegram(...args)},sendMessageDiscord:async(...args)=>{let{sendMessageDiscord}=await import(`../../send-DCkrADD0.js`).then(n=>n.t);return await sendMessageDiscord(...args)},sendMessageSlack:async(...args)=>{let{sendMessageSlack}=await import(`../../send-DPDcff6c.js`).then(n=>n.n);return await sendMessageSlack(...args)},sendMessageSignal:async(...args)=>{let{sendMessageSignal}=await import(`../../send-zcr6x0rr.js`).then(n=>n.i);return await sendMessageSignal(...args)},sendMessageIMessage:async(...args)=>{let{sendMessageIMessage}=await import(`../../send-wgpuk5jD.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{a as isCliProvider,d as resolveConfiguredModelRef,ft as DEFAULT_CONTEXT_TOKENS,g as resolveThinkingDefault,mt as DEFAULT_PROVIDER,o as modelKey,pt as DEFAULT_MODEL,rt as ensureAuthProfileStore,s as normalizeModelRef,t as buildAllowedModelSet}from"../../model-selection-LH0jSUl9.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-CIuP-6Ex.js";import{s as SILENT_REPLY_TOKEN}from"../../replies-DoptRX4K.js";import{r as normalizeChannelId,t as getChannelPlugin}from"../../plugins-J28Y83f5.js";import"../../accounts-193gfWbH.js";import"../../bindings-BfB5A-by.js";import"../../send-DPDcff6c.js";import"../../send-DCkrADD0.js";import"../../accounts-DHeA4T6C.js";import"../../send-D6xvMAyq.js";import"../../fetch-BklyLYYN.js";import{n as loadModelCatalog}from"../../model-catalog-DeCpUHoP.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-CzrgKsFN.js";import{n as loadConfig}from"../../config-DcpFA3_n.js";import"../../chrome-GnKMdiTR.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-B0MT1R_B.js";import"../../tool-images-mfC2sOfJ.js";import"../../config-DfXnxW-V.js";import"../../reply-prefix-me5vnbrB.js";import"../../sqlite-D3Ov16zb.js";import"../../manager-DZUfshOW.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-zcr6x0rr.js";import"../../outbound-attachment-U-XtahS5.js";import"../../fetch-Jq1KZsRq.js";import"../../send-wgpuk5jD.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-DKmwaw7q.js`);return await sendMessageWhatsApp(...args)},sendMessageTelegram:async(...args)=>{let{sendMessageTelegram}=await import(`../../send-D6xvMAyq.js`).then(n=>n.l);return await sendMessageTelegram(...args)},sendMessageDiscord:async(...args)=>{let{sendMessageDiscord}=await import(`../../send-DCkrADD0.js`).then(n=>n.t);return await sendMessageDiscord(...args)},sendMessageSlack:async(...args)=>{let{sendMessageSlack}=await import(`../../send-DPDcff6c.js`).then(n=>n.n);return await sendMessageSlack(...args)},sendMessageSignal:async(...args)=>{let{sendMessageSignal}=await import(`../../send-zcr6x0rr.js`).then(n=>n.i);return await sendMessageSignal(...args)},sendMessageIMessage:async(...args)=>{let{sendMessageIMessage}=await import(`../../send-wgpuk5jD.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-LH0jSUl9.js";import"../../env-BhRm7_r8.js";import"../../boolean-ssGoaBPk.js";import"../../src-CLWuGn12.js";import"../../embedded-SSuKQ6Yc.js";import"../../replies-DoptRX4K.js";import"../../plugins-J28Y83f5.js";import"../../accounts-193gfWbH.js";import"../../bindings-BfB5A-by.js";import"../../send-DPDcff6c.js";import"../../send-DCkrADD0.js";import"../../accounts-DHeA4T6C.js";import"../../send-D6xvMAyq.js";import"../../fetch-BklyLYYN.js";import"../../model-catalog-DeCpUHoP.js";import"../../redact-sNZY-pGx.js";import"../../errors-BmztzL5I.js";import{Yt as hasInterSessionUserProvenance}from"../../runner-CzrgKsFN.js";import"../../config-DcpFA3_n.js";import"../../chrome-GnKMdiTR.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-B0MT1R_B.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-DZUfshOW.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-zcr6x0rr.js";import"../../outbound-attachment-U-XtahS5.js";import"../../fetch-Jq1KZsRq.js";import"../../send-wgpuk5jD.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-LH0jSUl9.js";import"../../env-BhRm7_r8.js";import"../../boolean-ssGoaBPk.js";import"../../src-CLWuGn12.js";import"../../embedded-CIuP-6Ex.js";import"../../replies-DoptRX4K.js";import"../../plugins-J28Y83f5.js";import"../../accounts-193gfWbH.js";import"../../bindings-BfB5A-by.js";import"../../send-DPDcff6c.js";import"../../send-DCkrADD0.js";import"../../accounts-DHeA4T6C.js";import"../../send-D6xvMAyq.js";import"../../fetch-BklyLYYN.js";import"../../model-catalog-DeCpUHoP.js";import"../../redact-sNZY-pGx.js";import"../../errors-BmztzL5I.js";import{Yt as hasInterSessionUserProvenance}from"../../runner-CzrgKsFN.js";import"../../config-DcpFA3_n.js";import"../../chrome-GnKMdiTR.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-B0MT1R_B.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-DZUfshOW.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-zcr6x0rr.js";import"../../outbound-attachment-U-XtahS5.js";import"../../fetch-Jq1KZsRq.js";import"../../send-wgpuk5jD.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};
@@ -1 +1 @@
1
- import{n as CHAT_CHANNEL_ORDER}from"./registry-TdK-aV05.js";import{t as isTruthyEnvValue}from"./env-BHP32i7Q.js";import{n as listChannelPlugins}from"./plugins-C0lu7LGS.js";import{r as listChannelPluginCatalogEntries}from"./catalog-BIdILD-k.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-CqGq9jzk.js";function dedupe(values){let seen=new Set,resolved=[];for(let value of values)!value||seen.has(value)||(seen.add(value),resolved.push(value));return resolved}function resolveCliChannelOptions(){let catalog=listChannelPluginCatalogEntries().map(entry=>entry.id),base=dedupe([...CHAT_CHANNEL_ORDER,...catalog]);if(isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_EAGER_CHANNEL_OPTIONS)){ensurePluginRegistryLoaded();let pluginIds=listChannelPlugins().map(plugin=>plugin.id);return dedupe([...base,...pluginIds])}return base}function formatCliChannelOptions(extra=[]){return[...extra,...resolveCliChannelOptions()].join(`|`)}export{resolveCliChannelOptions as n,formatCliChannelOptions as t};
1
+ import{n as CHAT_CHANNEL_ORDER}from"./registry-TdK-aV05.js";import{t as isTruthyEnvValue}from"./env-BHP32i7Q.js";import{n as listChannelPlugins}from"./plugins-C0lu7LGS.js";import{r as listChannelPluginCatalogEntries}from"./catalog-BIdILD-k.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-Glc-xriO.js";function dedupe(values){let seen=new Set,resolved=[];for(let value of values)!value||seen.has(value)||(seen.add(value),resolved.push(value));return resolved}function resolveCliChannelOptions(){let catalog=listChannelPluginCatalogEntries().map(entry=>entry.id),base=dedupe([...CHAT_CHANNEL_ORDER,...catalog]);if(isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_EAGER_CHANNEL_OPTIONS)){ensurePluginRegistryLoaded();let pluginIds=listChannelPlugins().map(plugin=>plugin.id);return dedupe([...base,...pluginIds])}return base}function formatCliChannelOptions(extra=[]){return[...extra,...resolveCliChannelOptions()].join(`|`)}export{resolveCliChannelOptions as n,formatCliChannelOptions as t};
@@ -1 +1 @@
1
- import{n as CHAT_CHANNEL_ORDER}from"./registry-Cv7CoWAs.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{n as listChannelPlugins}from"./plugins-DJGW_fnS.js";import{r as listChannelPluginCatalogEntries}from"./catalog-myy00TyP.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-Bi-9AQMd.js";function dedupe(values){let seen=new Set,resolved=[];for(let value of values)!value||seen.has(value)||(seen.add(value),resolved.push(value));return resolved}function resolveCliChannelOptions(){let catalog=listChannelPluginCatalogEntries().map(entry=>entry.id),base=dedupe([...CHAT_CHANNEL_ORDER,...catalog]);if(isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_EAGER_CHANNEL_OPTIONS)){ensurePluginRegistryLoaded();let pluginIds=listChannelPlugins().map(plugin=>plugin.id);return dedupe([...base,...pluginIds])}return base}function formatCliChannelOptions(extra=[]){return[...extra,...resolveCliChannelOptions()].join(`|`)}export{resolveCliChannelOptions as n,formatCliChannelOptions as t};
1
+ import{n as CHAT_CHANNEL_ORDER}from"./registry-Cv7CoWAs.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{n as listChannelPlugins}from"./plugins-DJGW_fnS.js";import{r as listChannelPluginCatalogEntries}from"./catalog-myy00TyP.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-B5gTbK3m.js";function dedupe(values){let seen=new Set,resolved=[];for(let value of values)!value||seen.has(value)||(seen.add(value),resolved.push(value));return resolved}function resolveCliChannelOptions(){let catalog=listChannelPluginCatalogEntries().map(entry=>entry.id),base=dedupe([...CHAT_CHANNEL_ORDER,...catalog]);if(isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_EAGER_CHANNEL_OPTIONS)){ensurePluginRegistryLoaded();let pluginIds=listChannelPlugins().map(plugin=>plugin.id);return dedupe([...base,...pluginIds])}return base}function formatCliChannelOptions(extra=[]){return[...extra,...resolveCliChannelOptions()].join(`|`)}export{resolveCliChannelOptions as n,formatCliChannelOptions as t};
@@ -1,4 +1,4 @@
1
- import{E as toWhatsappJid,F as shouldLogVerbose,M as logVerbose,U as getChildLogger,h as normalizeE164,m as jidToE164,p as isSelfChatMode,r as clamp,w as sleep,y as resolveJidToE164}from"./utils-DbaBVFaK.js";import{An as hasControlCommand,Bt as computeBackoff,Dn as formatInboundEnvelope,En as resolveInboundDebounceMs,Fn as normalizeMentionText,Ft as parseActivationCommand,On as resolveEnvelopeFormatOptions,Pn as buildMentionRegexes,Pt as normalizeGroupActivation,Tn as createInboundDebouncer,Vt as sleepWithAbort,_n as recordPendingHistoryEntryIfEnabled,di as enqueueSystemEvent,gn as buildHistoryContextFromEntries,hn as DEFAULT_GROUP_HISTORY_LIMIT,jn as shouldComputeCommandAuthorized,mn as resolveMentionGating,pn as buildPairingReply,t as getReplyFromConfig,vn as shouldAckReactionForWhatsApp,wn as createDedupeCache,yn as dispatchReplyWithBufferedBlockDispatcher}from"./reply-gZ_yr2mJ.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,s as buildGroupHistoryKey}from"./session-key-EoB0qaG9.js";import{i as defaultRuntime,t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{t as formatCliCommand}from"./command-format-Dd7BgZsg.js";import{r as loadConfig}from"./io-DhUMGsxN.js";import{t as finalizeInboundContext}from"./inbound-context-n7rlv2xI.js";import{l as registerUnhandledRejectionHandler}from"./runner-CDpBWK3-.js";import{r as saveMediaBuffer}from"./store-Nf9BxXC7.js";import{J as resolveChannelGroupRequireMention,Z as resolveGroupSessionKey,a as loadSessionStore,l as updateLastRoute,o as readSessionUpdatedAt,q as resolveChannelGroupPolicy,s as recordSessionMetaFromInbound}from"./sessions-Dv212g1O.js";import{i as getWebAuthAgeMs,n as resolveWhatsAppAccount,u as readWebSelfId}from"./accounts-2InvZDx2.js";import{c as resolveStorePath}from"./paths-DCzWXtSj.js";import{H as formatLocationText,U as toLocationContext}from"./send-ZCmcplsV.js";import{c as resolveIdentityNamePrefix,l as resolveMessagePrefix,n as createReplyPrefixOptions}from"./reply-prefix-BwtP84WV.js";import{c as resolveTextChunkLimit,i as chunkMarkdownTextWithMode,s as resolveChunkMode}from"./chunk-B9aj7NGY.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-iDNbGky8.js";import{a as loadWebMedia,s as getAgentScopedMediaLocalRoots}from"./ir-EgWVNCXR.js";import{n as recordChannelActivity}from"./channel-activity-GeHNfvd4.js";import{t as convertMarkdownTables}from"./tables-D5WcKZWq.js";import{i as readChannelAllowFromStore,o as upsertChannelPairingRequest}from"./pairing-store-PKyjZas4.js";import{r as formatDurationPrecise}from"./format-duration-BwzoPIex.js";import{n as resolveAgentRoute,t as buildAgentSessionKey}from"./resolve-route-EE2-ObOq.js";import{r as setActiveWebListener}from"./active-listener-DBdxNyOd.js";import{i as markdownToWhatsApp,r as sendReactionWhatsApp}from"./outbound-FReRlY8F.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-b3OcDWNf.js";import{randomUUID}from"node:crypto";import{getMaxListeners,setMaxListeners}from"node:events";import{DisconnectReason,downloadMediaMessage,extractMessageContent,getContentType,isJidGroup,normalizeMessageContent}from"@whiskeysockets/baileys";const DEFAULT_RECONNECT_POLICY={initialMs:2e3,maxMs:3e4,factor:1.8,jitter:.25,maxAttempts:12};function resolveHeartbeatSeconds(cfg,overrideSeconds){let candidate=overrideSeconds??cfg.web?.heartbeatSeconds;return typeof candidate==`number`&&candidate>0?candidate:60}function resolveReconnectPolicy(cfg,overrides){let reconnectOverrides=cfg.web?.reconnect??{},overrideConfig=overrides??{},merged={...DEFAULT_RECONNECT_POLICY,...reconnectOverrides,...overrideConfig};return merged.initialMs=Math.max(250,merged.initialMs),merged.maxMs=Math.max(merged.initialMs,merged.maxMs),merged.factor=clamp(merged.factor,1.1,10),merged.jitter=clamp(merged.jitter,0,1),merged.maxAttempts=Math.max(0,Math.floor(merged.maxAttempts)),merged}function newConnectionId(){return randomUUID()}const whatsappLog=createSubsystemLogger(`gateway/channels/whatsapp`),whatsappInboundLog=whatsappLog.child(`inbound`),whatsappOutboundLog=whatsappLog.child(`outbound`),whatsappHeartbeatLog=whatsappLog.child(`heartbeat`);function elide(text,limit=400){return!text||text.length<=limit?text:`${text.slice(0,limit)}… (truncated ${text.length-limit} chars)`}function isLikelyWhatsAppCryptoError(reason){let haystack=(reason instanceof Error?`${reason.message}\n${reason.stack??``}`:(value=>{if(value==null)return``;if(typeof value==`string`)return value;if(value instanceof Error)return`${value.message}\n${value.stack??``}`;if(typeof value==`object`)try{return JSON.stringify(value)}catch{return Object.prototype.toString.call(value)}return typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value):typeof value==`symbol`?value.description??value.toString():typeof value==`function`?value.name?`[function ${value.name}]`:`[function]`:Object.prototype.toString.call(value)})(reason)).toLowerCase();return haystack.includes(`unsupported state or unable to authenticate data`)||haystack.includes(`bad mac`)?haystack.includes(`@whiskeysockets/baileys`)||haystack.includes(`baileys`)||haystack.includes(`noise-handler`)||haystack.includes(`aesdecryptgcm`):!1}function waitForever(){return setInterval(()=>{},1e6).unref(),new Promise(()=>{})}const recentInboundMessages=createDedupeCache({ttlMs:20*6e4,maxSize:5e3});function isRecentInboundMessage(key){return recentInboundMessages.check(key)}const ALLOWED_VCARD_KEYS=new Set([`FN`,`N`,`TEL`]);function parseVcard(vcard){if(!vcard)return{phones:[]};let lines=vcard.split(/\r?\n/),nameFromN,nameFromFn,phones=[];for(let rawLine of lines){let line=rawLine.trim();if(!line)continue;let colonIndex=line.indexOf(`:`);if(colonIndex===-1)continue;let key=line.slice(0,colonIndex).toUpperCase(),rawValue=line.slice(colonIndex+1).trim();if(!rawValue)continue;let baseKey=normalizeVcardKey(key);if(!baseKey||!ALLOWED_VCARD_KEYS.has(baseKey))continue;let value=cleanVcardValue(rawValue);if(value){if(baseKey===`FN`&&!nameFromFn){nameFromFn=normalizeVcardName(value);continue}if(baseKey===`N`&&!nameFromN){nameFromN=normalizeVcardName(value);continue}if(baseKey===`TEL`){let phone=normalizeVcardPhone(value);phone&&phones.push(phone)}}}return{name:nameFromFn??nameFromN,phones}}function normalizeVcardKey(key){let[primary]=key.split(`;`);if(!primary)return;let segments=primary.split(`.`);return segments[segments.length-1]||void 0}function cleanVcardValue(value){return value.replace(/\\n/gi,` `).replace(/\\,/g,`,`).replace(/\\;/g,`;`).trim()}function normalizeVcardName(value){return value.replace(/;/g,` `).replace(/\s+/g,` `).trim()}function normalizeVcardPhone(value){let trimmed=value.trim();return trimmed?trimmed.toLowerCase().startsWith(`tel:`)?trimmed.slice(4).trim():trimmed:``}function unwrapMessage$1(message){return normalizeMessageContent(message)}function extractContextInfo(message){if(!message)return;let contentType=getContentType(message),candidate=contentType?message[contentType]:void 0,contextInfo=candidate&&typeof candidate==`object`&&`contextInfo`in candidate?candidate.contextInfo:void 0;if(contextInfo)return contextInfo;let fallback=message.extendedTextMessage?.contextInfo??message.imageMessage?.contextInfo??message.videoMessage?.contextInfo??message.documentMessage?.contextInfo??message.audioMessage?.contextInfo??message.stickerMessage?.contextInfo??message.buttonsResponseMessage?.contextInfo??message.listResponseMessage?.contextInfo??message.templateButtonReplyMessage?.contextInfo??message.interactiveResponseMessage?.contextInfo??message.buttonsMessage?.contextInfo??message.listMessage?.contextInfo;if(fallback)return fallback;for(let value of Object.values(message)){if(!value||typeof value!=`object`||!(`contextInfo`in value))continue;let candidateContext=value.contextInfo;if(candidateContext)return candidateContext}}function extractMentionedJids(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let flattened=[message.extendedTextMessage?.contextInfo?.mentionedJid,message.extendedTextMessage?.contextInfo?.quotedMessage?.extendedTextMessage?.contextInfo?.mentionedJid,message.imageMessage?.contextInfo?.mentionedJid,message.videoMessage?.contextInfo?.mentionedJid,message.documentMessage?.contextInfo?.mentionedJid,message.audioMessage?.contextInfo?.mentionedJid,message.stickerMessage?.contextInfo?.mentionedJid,message.buttonsResponseMessage?.contextInfo?.mentionedJid,message.listResponseMessage?.contextInfo?.mentionedJid].flatMap(arr=>arr??[]).filter(Boolean);if(flattened.length!==0)return Array.from(new Set(flattened))}function extractText(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let extracted=extractMessageContent(message),candidates=[message,extracted&&extracted!==message?extracted:void 0];for(let candidate of candidates){if(!candidate)continue;if(typeof candidate.conversation==`string`&&candidate.conversation.trim())return candidate.conversation.trim();let extended=candidate.extendedTextMessage?.text;if(extended?.trim())return extended.trim();let caption=candidate.imageMessage?.caption??candidate.videoMessage?.caption??candidate.documentMessage?.caption;if(caption?.trim())return caption.trim()}let contactPlaceholder=extractContactPlaceholder(message)??(extracted&&extracted!==message?extractContactPlaceholder(extracted):void 0);if(contactPlaceholder)return contactPlaceholder}function extractMediaPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(message){if(message.imageMessage)return`<media:image>`;if(message.videoMessage)return`<media:video>`;if(message.audioMessage)return`<media:audio>`;if(message.documentMessage)return`<media:document>`;if(message.stickerMessage)return`<media:sticker>`}}function extractContactPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let contact=message.contactMessage??void 0;if(contact){let{name,phones}=describeContact({displayName:contact.displayName,vcard:contact.vcard});return formatContactPlaceholder(name,phones)}let contactsArray=message.contactsArrayMessage?.contacts??void 0;if(!(!contactsArray||contactsArray.length===0))return formatContactsPlaceholder(contactsArray.map(entry=>describeContact({displayName:entry.displayName,vcard:entry.vcard})).map(entry=>formatContactLabel(entry.name,entry.phones)).filter(value=>!!value),contactsArray.length)}function describeContact(input){let displayName=(input.displayName??``).trim(),parsed=parseVcard(input.vcard??void 0);return{name:displayName||parsed.name,phones:parsed.phones}}function formatContactPlaceholder(name,phones){let label=formatContactLabel(name,phones);return label?`<contact: ${label}>`:`<contact>`}function formatContactsPlaceholder(labels,total){let cleaned=labels.map(label=>label.trim()).filter(Boolean);if(cleaned.length===0)return`<contacts: ${total} ${total===1?`contact`:`contacts`}>`;let remaining=Math.max(total-cleaned.length,0),suffix=remaining>0?` +${remaining} more`:``;return`<contacts: ${cleaned.join(`, `)}${suffix}>`}function formatContactLabel(name,phones){let parts=[name,formatPhoneList(phones)].filter(value=>!!value);if(parts.length!==0)return parts.join(`, `)}function formatPhoneList(phones){let cleaned=phones?.map(phone=>phone.trim()).filter(Boolean)??[];if(cleaned.length===0)return;let{shown,remaining}=summarizeList(cleaned,cleaned.length,1),[primary]=shown;if(primary)return remaining===0?primary:`${primary} (+${remaining} more)`}function summarizeList(values,total,maxShown){let shown=values.slice(0,maxShown);return{shown,remaining:Math.max(total-shown.length,0)}}function extractLocationData(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let live=message.liveLocationMessage??void 0;if(live){let latitudeRaw=live.degreesLatitude,longitudeRaw=live.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude))return{latitude,longitude,accuracy:live.accuracyInMeters??void 0,caption:live.caption??void 0,source:`live`,isLive:!0}}}let location=message.locationMessage??void 0;if(location){let latitudeRaw=location.degreesLatitude,longitudeRaw=location.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude)){let isLive=!!location.isLive;return{latitude,longitude,accuracy:location.accuracyInMeters??void 0,name:location.name??void 0,address:location.address??void 0,caption:location.comment??void 0,source:isLive?`live`:location.name||location.address?`place`:`pin`,isLive}}}}return null}function describeReplyContext(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let contextInfo=extractContextInfo(message),quoted=normalizeMessageContent(contextInfo?.quotedMessage);if(!quoted)return null;let location=extractLocationData(quoted),locationText=location?formatLocationText(location):void 0,body=[extractText(quoted),locationText].filter(Boolean).join(`
1
+ import{E as toWhatsappJid,F as shouldLogVerbose,M as logVerbose,U as getChildLogger,h as normalizeE164,m as jidToE164,p as isSelfChatMode,r as clamp,w as sleep,y as resolveJidToE164}from"./utils-DbaBVFaK.js";import{An as hasControlCommand,Bt as computeBackoff,Dn as formatInboundEnvelope,En as resolveInboundDebounceMs,Fn as normalizeMentionText,Ft as parseActivationCommand,On as resolveEnvelopeFormatOptions,Pn as buildMentionRegexes,Pt as normalizeGroupActivation,Tn as createInboundDebouncer,Vt as sleepWithAbort,_n as recordPendingHistoryEntryIfEnabled,di as enqueueSystemEvent,gn as buildHistoryContextFromEntries,hn as DEFAULT_GROUP_HISTORY_LIMIT,jn as shouldComputeCommandAuthorized,mn as resolveMentionGating,pn as buildPairingReply,t as getReplyFromConfig,vn as shouldAckReactionForWhatsApp,wn as createDedupeCache,yn as dispatchReplyWithBufferedBlockDispatcher}from"./reply-BeKidf2F.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,s as buildGroupHistoryKey}from"./session-key-EoB0qaG9.js";import{i as defaultRuntime,t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{t as formatCliCommand}from"./command-format-Dd7BgZsg.js";import{r as loadConfig}from"./io-DhUMGsxN.js";import{t as finalizeInboundContext}from"./inbound-context-n7rlv2xI.js";import{l as registerUnhandledRejectionHandler}from"./runner-CDpBWK3-.js";import{r as saveMediaBuffer}from"./store-Nf9BxXC7.js";import{J as resolveChannelGroupRequireMention,Z as resolveGroupSessionKey,a as loadSessionStore,l as updateLastRoute,o as readSessionUpdatedAt,q as resolveChannelGroupPolicy,s as recordSessionMetaFromInbound}from"./sessions-Dv212g1O.js";import{i as getWebAuthAgeMs,n as resolveWhatsAppAccount,u as readWebSelfId}from"./accounts-2InvZDx2.js";import{c as resolveStorePath}from"./paths-DCzWXtSj.js";import{H as formatLocationText,U as toLocationContext}from"./send-ZCmcplsV.js";import{c as resolveIdentityNamePrefix,l as resolveMessagePrefix,n as createReplyPrefixOptions}from"./reply-prefix-BwtP84WV.js";import{c as resolveTextChunkLimit,i as chunkMarkdownTextWithMode,s as resolveChunkMode}from"./chunk-B9aj7NGY.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-iDNbGky8.js";import{a as loadWebMedia,s as getAgentScopedMediaLocalRoots}from"./ir-EgWVNCXR.js";import{n as recordChannelActivity}from"./channel-activity-GeHNfvd4.js";import{t as convertMarkdownTables}from"./tables-D5WcKZWq.js";import{i as readChannelAllowFromStore,o as upsertChannelPairingRequest}from"./pairing-store-PKyjZas4.js";import{r as formatDurationPrecise}from"./format-duration-BwzoPIex.js";import{n as resolveAgentRoute,t as buildAgentSessionKey}from"./resolve-route-EE2-ObOq.js";import{r as setActiveWebListener}from"./active-listener-DBdxNyOd.js";import{i as markdownToWhatsApp,r as sendReactionWhatsApp}from"./outbound-FReRlY8F.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-b3OcDWNf.js";import{randomUUID}from"node:crypto";import{getMaxListeners,setMaxListeners}from"node:events";import{DisconnectReason,downloadMediaMessage,extractMessageContent,getContentType,isJidGroup,normalizeMessageContent}from"@whiskeysockets/baileys";const DEFAULT_RECONNECT_POLICY={initialMs:2e3,maxMs:3e4,factor:1.8,jitter:.25,maxAttempts:12};function resolveHeartbeatSeconds(cfg,overrideSeconds){let candidate=overrideSeconds??cfg.web?.heartbeatSeconds;return typeof candidate==`number`&&candidate>0?candidate:60}function resolveReconnectPolicy(cfg,overrides){let reconnectOverrides=cfg.web?.reconnect??{},overrideConfig=overrides??{},merged={...DEFAULT_RECONNECT_POLICY,...reconnectOverrides,...overrideConfig};return merged.initialMs=Math.max(250,merged.initialMs),merged.maxMs=Math.max(merged.initialMs,merged.maxMs),merged.factor=clamp(merged.factor,1.1,10),merged.jitter=clamp(merged.jitter,0,1),merged.maxAttempts=Math.max(0,Math.floor(merged.maxAttempts)),merged}function newConnectionId(){return randomUUID()}const whatsappLog=createSubsystemLogger(`gateway/channels/whatsapp`),whatsappInboundLog=whatsappLog.child(`inbound`),whatsappOutboundLog=whatsappLog.child(`outbound`),whatsappHeartbeatLog=whatsappLog.child(`heartbeat`);function elide(text,limit=400){return!text||text.length<=limit?text:`${text.slice(0,limit)}… (truncated ${text.length-limit} chars)`}function isLikelyWhatsAppCryptoError(reason){let haystack=(reason instanceof Error?`${reason.message}\n${reason.stack??``}`:(value=>{if(value==null)return``;if(typeof value==`string`)return value;if(value instanceof Error)return`${value.message}\n${value.stack??``}`;if(typeof value==`object`)try{return JSON.stringify(value)}catch{return Object.prototype.toString.call(value)}return typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value):typeof value==`symbol`?value.description??value.toString():typeof value==`function`?value.name?`[function ${value.name}]`:`[function]`:Object.prototype.toString.call(value)})(reason)).toLowerCase();return haystack.includes(`unsupported state or unable to authenticate data`)||haystack.includes(`bad mac`)?haystack.includes(`@whiskeysockets/baileys`)||haystack.includes(`baileys`)||haystack.includes(`noise-handler`)||haystack.includes(`aesdecryptgcm`):!1}function waitForever(){return setInterval(()=>{},1e6).unref(),new Promise(()=>{})}const recentInboundMessages=createDedupeCache({ttlMs:20*6e4,maxSize:5e3});function isRecentInboundMessage(key){return recentInboundMessages.check(key)}const ALLOWED_VCARD_KEYS=new Set([`FN`,`N`,`TEL`]);function parseVcard(vcard){if(!vcard)return{phones:[]};let lines=vcard.split(/\r?\n/),nameFromN,nameFromFn,phones=[];for(let rawLine of lines){let line=rawLine.trim();if(!line)continue;let colonIndex=line.indexOf(`:`);if(colonIndex===-1)continue;let key=line.slice(0,colonIndex).toUpperCase(),rawValue=line.slice(colonIndex+1).trim();if(!rawValue)continue;let baseKey=normalizeVcardKey(key);if(!baseKey||!ALLOWED_VCARD_KEYS.has(baseKey))continue;let value=cleanVcardValue(rawValue);if(value){if(baseKey===`FN`&&!nameFromFn){nameFromFn=normalizeVcardName(value);continue}if(baseKey===`N`&&!nameFromN){nameFromN=normalizeVcardName(value);continue}if(baseKey===`TEL`){let phone=normalizeVcardPhone(value);phone&&phones.push(phone)}}}return{name:nameFromFn??nameFromN,phones}}function normalizeVcardKey(key){let[primary]=key.split(`;`);if(!primary)return;let segments=primary.split(`.`);return segments[segments.length-1]||void 0}function cleanVcardValue(value){return value.replace(/\\n/gi,` `).replace(/\\,/g,`,`).replace(/\\;/g,`;`).trim()}function normalizeVcardName(value){return value.replace(/;/g,` `).replace(/\s+/g,` `).trim()}function normalizeVcardPhone(value){let trimmed=value.trim();return trimmed?trimmed.toLowerCase().startsWith(`tel:`)?trimmed.slice(4).trim():trimmed:``}function unwrapMessage$1(message){return normalizeMessageContent(message)}function extractContextInfo(message){if(!message)return;let contentType=getContentType(message),candidate=contentType?message[contentType]:void 0,contextInfo=candidate&&typeof candidate==`object`&&`contextInfo`in candidate?candidate.contextInfo:void 0;if(contextInfo)return contextInfo;let fallback=message.extendedTextMessage?.contextInfo??message.imageMessage?.contextInfo??message.videoMessage?.contextInfo??message.documentMessage?.contextInfo??message.audioMessage?.contextInfo??message.stickerMessage?.contextInfo??message.buttonsResponseMessage?.contextInfo??message.listResponseMessage?.contextInfo??message.templateButtonReplyMessage?.contextInfo??message.interactiveResponseMessage?.contextInfo??message.buttonsMessage?.contextInfo??message.listMessage?.contextInfo;if(fallback)return fallback;for(let value of Object.values(message)){if(!value||typeof value!=`object`||!(`contextInfo`in value))continue;let candidateContext=value.contextInfo;if(candidateContext)return candidateContext}}function extractMentionedJids(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let flattened=[message.extendedTextMessage?.contextInfo?.mentionedJid,message.extendedTextMessage?.contextInfo?.quotedMessage?.extendedTextMessage?.contextInfo?.mentionedJid,message.imageMessage?.contextInfo?.mentionedJid,message.videoMessage?.contextInfo?.mentionedJid,message.documentMessage?.contextInfo?.mentionedJid,message.audioMessage?.contextInfo?.mentionedJid,message.stickerMessage?.contextInfo?.mentionedJid,message.buttonsResponseMessage?.contextInfo?.mentionedJid,message.listResponseMessage?.contextInfo?.mentionedJid].flatMap(arr=>arr??[]).filter(Boolean);if(flattened.length!==0)return Array.from(new Set(flattened))}function extractText(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let extracted=extractMessageContent(message),candidates=[message,extracted&&extracted!==message?extracted:void 0];for(let candidate of candidates){if(!candidate)continue;if(typeof candidate.conversation==`string`&&candidate.conversation.trim())return candidate.conversation.trim();let extended=candidate.extendedTextMessage?.text;if(extended?.trim())return extended.trim();let caption=candidate.imageMessage?.caption??candidate.videoMessage?.caption??candidate.documentMessage?.caption;if(caption?.trim())return caption.trim()}let contactPlaceholder=extractContactPlaceholder(message)??(extracted&&extracted!==message?extractContactPlaceholder(extracted):void 0);if(contactPlaceholder)return contactPlaceholder}function extractMediaPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(message){if(message.imageMessage)return`<media:image>`;if(message.videoMessage)return`<media:video>`;if(message.audioMessage)return`<media:audio>`;if(message.documentMessage)return`<media:document>`;if(message.stickerMessage)return`<media:sticker>`}}function extractContactPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let contact=message.contactMessage??void 0;if(contact){let{name,phones}=describeContact({displayName:contact.displayName,vcard:contact.vcard});return formatContactPlaceholder(name,phones)}let contactsArray=message.contactsArrayMessage?.contacts??void 0;if(!(!contactsArray||contactsArray.length===0))return formatContactsPlaceholder(contactsArray.map(entry=>describeContact({displayName:entry.displayName,vcard:entry.vcard})).map(entry=>formatContactLabel(entry.name,entry.phones)).filter(value=>!!value),contactsArray.length)}function describeContact(input){let displayName=(input.displayName??``).trim(),parsed=parseVcard(input.vcard??void 0);return{name:displayName||parsed.name,phones:parsed.phones}}function formatContactPlaceholder(name,phones){let label=formatContactLabel(name,phones);return label?`<contact: ${label}>`:`<contact>`}function formatContactsPlaceholder(labels,total){let cleaned=labels.map(label=>label.trim()).filter(Boolean);if(cleaned.length===0)return`<contacts: ${total} ${total===1?`contact`:`contacts`}>`;let remaining=Math.max(total-cleaned.length,0),suffix=remaining>0?` +${remaining} more`:``;return`<contacts: ${cleaned.join(`, `)}${suffix}>`}function formatContactLabel(name,phones){let parts=[name,formatPhoneList(phones)].filter(value=>!!value);if(parts.length!==0)return parts.join(`, `)}function formatPhoneList(phones){let cleaned=phones?.map(phone=>phone.trim()).filter(Boolean)??[];if(cleaned.length===0)return;let{shown,remaining}=summarizeList(cleaned,cleaned.length,1),[primary]=shown;if(primary)return remaining===0?primary:`${primary} (+${remaining} more)`}function summarizeList(values,total,maxShown){let shown=values.slice(0,maxShown);return{shown,remaining:Math.max(total-shown.length,0)}}function extractLocationData(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let live=message.liveLocationMessage??void 0;if(live){let latitudeRaw=live.degreesLatitude,longitudeRaw=live.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude))return{latitude,longitude,accuracy:live.accuracyInMeters??void 0,caption:live.caption??void 0,source:`live`,isLive:!0}}}let location=message.locationMessage??void 0;if(location){let latitudeRaw=location.degreesLatitude,longitudeRaw=location.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude)){let isLive=!!location.isLive;return{latitude,longitude,accuracy:location.accuracyInMeters??void 0,name:location.name??void 0,address:location.address??void 0,caption:location.comment??void 0,source:isLive?`live`:location.name||location.address?`place`:`pin`,isLive}}}}return null}function describeReplyContext(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let contextInfo=extractContextInfo(message),quoted=normalizeMessageContent(contextInfo?.quotedMessage);if(!quoted)return null;let location=extractLocationData(quoted),locationText=location?formatLocationText(location):void 0,body=[extractText(quoted),locationText].filter(Boolean).join(`
2
2
  `).trim();if(body||=extractMediaPlaceholder(quoted),!body){let quotedType=quoted?getContentType(quoted):void 0;return logVerbose(`Quoted message missing extractable body${quotedType?` (type ${quotedType})`:``}`),null}let senderJid=contextInfo?.participant??void 0,senderE164=senderJid?jidToE164(senderJid)??senderJid:void 0,sender=senderE164??`unknown sender`;return{id:contextInfo?.stanzaId?String(contextInfo.stanzaId):void 0,body,sender,senderJid,senderE164}}async function checkInboundAccessControl(params){let cfg=loadConfig(),account=resolveWhatsAppAccount({cfg,accountId:params.accountId}),dmPolicy=account.dmPolicy??`pairing`,configuredAllowFrom=account.allowFrom,storeAllowFrom=await readChannelAllowFromStore(`whatsapp`,process.env,account.accountId).catch(()=>[]),combinedAllowFrom=Array.from(new Set([...configuredAllowFrom??[],...storeAllowFrom])),defaultAllowFrom=combinedAllowFrom.length===0&&params.selfE164?[params.selfE164]:void 0,allowFrom=combinedAllowFrom.length>0?combinedAllowFrom:defaultAllowFrom,groupAllowFrom=account.groupAllowFrom??(configuredAllowFrom&&configuredAllowFrom.length>0?configuredAllowFrom:void 0),isSamePhone=params.from===params.selfE164,isSelfChat=isSelfChatMode(params.selfE164,configuredAllowFrom),pairingGraceMs=typeof params.pairingGraceMs==`number`&&params.pairingGraceMs>0?params.pairingGraceMs:3e4,suppressPairingReply=typeof params.connectedAtMs==`number`&&typeof params.messageTimestampMs==`number`&&params.messageTimestampMs<params.connectedAtMs-pairingGraceMs,dmHasWildcard=allowFrom?.includes(`*`)??!1,normalizedAllowFrom=allowFrom&&allowFrom.length>0?allowFrom.filter(entry=>entry!==`*`).map(normalizeE164):[],groupHasWildcard=groupAllowFrom?.includes(`*`)??!1,normalizedGroupAllowFrom=groupAllowFrom&&groupAllowFrom.length>0?groupAllowFrom.filter(entry=>entry!==`*`).map(normalizeE164):[],defaultGroupPolicy=cfg.channels?.defaults?.groupPolicy,groupPolicy=account.groupPolicy??defaultGroupPolicy??`open`;if(params.group&&groupPolicy===`disabled`)return logVerbose(`Blocked group message (groupPolicy: disabled)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(params.group&&groupPolicy===`allowlist`){if(!groupAllowFrom||groupAllowFrom.length===0)return logVerbose(`Blocked group message (groupPolicy: allowlist, no groupAllowFrom)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(!(groupHasWildcard||params.senderE164!=null&&normalizedGroupAllowFrom.includes(params.senderE164)))return logVerbose(`Blocked group message from ${params.senderE164??`unknown sender`} (groupPolicy: allowlist)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId}}if(!params.group){if(params.isFromMe&&!isSamePhone)return logVerbose(`Skipping outbound DM (fromMe); no pairing reply needed.`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(dmPolicy===`disabled`)return logVerbose(`Blocked dm (dmPolicy: disabled)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(dmPolicy!==`open`&&!isSamePhone){let candidate=params.from;if(!(dmHasWildcard||normalizedAllowFrom.length>0&&normalizedAllowFrom.includes(candidate))){if(dmPolicy===`pairing`)if(suppressPairingReply)logVerbose(`Skipping pairing reply for historical DM from ${candidate}.`);else{let{code,created}=await upsertChannelPairingRequest({channel:`whatsapp`,id:candidate,accountId:account.accountId,meta:{name:(params.pushName??``).trim()||void 0}});if(created){logVerbose(`whatsapp pairing request sender=${candidate} name=${params.pushName??`unknown`}`);try{await params.sock.sendMessage(params.remoteJid,{text:buildPairingReply({channel:`whatsapp`,idLine:`Your WhatsApp phone number: ${candidate}`,code})})}catch(err){logVerbose(`whatsapp pairing reply failed for ${candidate}: ${String(err)}`)}}}else logVerbose(`Blocked unauthorized sender ${candidate} (dmPolicy=${dmPolicy})`);return{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId}}}}return{allowed:!0,shouldMarkRead:!0,isSelfChat,resolvedAccountId:account.accountId}}function unwrapMessage(message){return normalizeMessageContent(message)}function resolveMediaMimetype(message){let explicit=message.imageMessage?.mimetype??message.videoMessage?.mimetype??message.documentMessage?.mimetype??message.audioMessage?.mimetype??message.stickerMessage?.mimetype??void 0;if(explicit)return explicit;if(message.audioMessage)return`audio/ogg; codecs=opus`;if(message.imageMessage)return`image/jpeg`;if(message.videoMessage)return`video/mp4`;if(message.stickerMessage)return`image/webp`}async function downloadInboundMedia(msg,sock){let message=unwrapMessage(msg.message);if(!message)return;let mimetype=resolveMediaMimetype(message),fileName=message.documentMessage?.fileName??void 0;if(!(!message.imageMessage&&!message.videoMessage&&!message.documentMessage&&!message.audioMessage&&!message.stickerMessage))try{return{buffer:await downloadMediaMessage(msg,`buffer`,{},{reuploadRequest:sock.updateMediaMessage,logger:sock.logger}),mimetype,fileName}}catch(err){logVerbose(`downloadMediaMessage failed: ${String(err)}`);return}}function recordWhatsAppOutbound(accountId){recordChannelActivity({channel:`whatsapp`,accountId,direction:`outbound`})}function resolveOutboundMessageId(result){return typeof result==`object`&&result&&`key`in result?String(result.key?.id??`unknown`):`unknown`}function createWebSendApi(params){return{sendMessage:async(to,text,mediaBuffer,mediaType,sendOptions)=>{let jid=toWhatsappJid(to),payload;if(mediaBuffer&&mediaType)if(mediaType.startsWith(`image/`))payload={image:mediaBuffer,caption:text||void 0,mimetype:mediaType};else if(mediaType.startsWith(`audio/`))payload={audio:mediaBuffer,ptt:!0,mimetype:mediaType};else if(mediaType.startsWith(`video/`)){let gifPlayback=sendOptions?.gifPlayback;payload={video:mediaBuffer,caption:text||void 0,mimetype:mediaType,...gifPlayback?{gifPlayback:!0}:{}}}else payload={document:mediaBuffer,fileName:sendOptions?.fileName?.trim()||`file`,caption:text||void 0,mimetype:mediaType};else payload={text};let result=await params.sock.sendMessage(jid,payload);return recordWhatsAppOutbound(sendOptions?.accountId??params.defaultAccountId),{messageId:resolveOutboundMessageId(result)}},sendPoll:async(to,poll)=>{let jid=toWhatsappJid(to),result=await params.sock.sendMessage(jid,{poll:{name:poll.question,values:poll.options,selectableCount:poll.maxSelections??1}});return recordWhatsAppOutbound(params.defaultAccountId),{messageId:resolveOutboundMessageId(result)}},sendReaction:async(chatJid,messageId,emoji,fromMe,participant)=>{let jid=toWhatsappJid(chatJid);await params.sock.sendMessage(jid,{react:{text:emoji,key:{remoteJid:jid,id:messageId,fromMe,participant:participant?toWhatsappJid(participant):void 0}}})},sendComposingTo:async to=>{let jid=toWhatsappJid(to);await params.sock.sendPresenceUpdate(`composing`,jid)}}}async function monitorWebInbox(options){let inboundLogger=getChildLogger({module:`web-inbound`}),inboundConsoleLog=createSubsystemLogger(`gateway/channels/whatsapp`).child(`inbound`),sock=await createWaSocket(!1,options.verbose,{authDir:options.authDir});await waitForWaConnection(sock);let connectedAtMs=Date.now(),onCloseResolve=null,onClose=new Promise(resolve=>{onCloseResolve=resolve}),resolveClose=reason=>{if(!onCloseResolve)return;let resolver=onCloseResolve;onCloseResolve=null,resolver(reason)};try{await sock.sendPresenceUpdate(`available`),shouldLogVerbose()&&logVerbose(`Sent global 'available' presence on connect`)}catch(err){logVerbose(`Failed to send 'available' presence on connect: ${String(err)}`)}let selfJid=sock.user?.id,selfE164=selfJid?jidToE164(selfJid):null,debouncer=createInboundDebouncer({debounceMs:options.debounceMs??0,buildKey:msg=>{let senderKey=msg.chatType===`group`?msg.senderJid??msg.senderE164??msg.senderName??msg.from:msg.from;if(!senderKey)return null;let conversationKey=msg.chatType===`group`?msg.chatId:msg.from;return`${msg.accountId}:${conversationKey}:${senderKey}`},shouldDebounce:options.shouldDebounce,onFlush:async entries=>{let last=entries.at(-1);if(!last)return;if(entries.length===1){await options.onMessage(last);return}let mentioned=new Set;for(let entry of entries)for(let jid of entry.mentionedJids??[])mentioned.add(jid);let combinedBody=entries.map(entry=>entry.body).filter(Boolean).join(`
3
3
  `),combinedMessage={...last,body:combinedBody,mentionedJids:mentioned.size>0?Array.from(mentioned):void 0};await options.onMessage(combinedMessage)},onError:err=>{inboundLogger.error({error:String(err)},`failed handling inbound web message`),inboundConsoleLog.error(`Failed handling inbound web message: ${String(err)}`)}}),groupMetaCache=new Map,GROUP_META_TTL_MS=300*1e3,lidLookup=sock.signalRepository?.lidMapping,resolveInboundJid=async jid=>resolveJidToE164(jid,{authDir:options.authDir,lidLookup}),getGroupMeta=async jid=>{let cached=groupMetaCache.get(jid);if(cached&&cached.expires>Date.now())return cached;try{let meta=await sock.groupMetadata(jid),participants=(await Promise.all(meta.participants?.map(async p=>await resolveInboundJid(p.id)??p.id)??[])).filter(Boolean)??[],entry={subject:meta.subject,participants,expires:Date.now()+GROUP_META_TTL_MS};return groupMetaCache.set(jid,entry),entry}catch(err){return logVerbose(`Failed to fetch group metadata for ${jid}: ${String(err)}`),{expires:Date.now()+GROUP_META_TTL_MS}}},handleMessagesUpsert=async upsert=>{if(!(upsert.type!==`notify`&&upsert.type!==`append`))for(let msg of upsert.messages??[]){recordChannelActivity({channel:`whatsapp`,accountId:options.accountId,direction:`inbound`});let id=msg.key?.id??void 0,remoteJid=msg.key?.remoteJid;if(!remoteJid||remoteJid.endsWith(`@status`)||remoteJid.endsWith(`@broadcast`))continue;let group=isJidGroup(remoteJid)===!0;if(id&&isRecentInboundMessage(`${options.accountId}:${remoteJid}:${id}`))continue;let participantJid=msg.key?.participant??void 0,from=group?remoteJid:await resolveInboundJid(remoteJid);if(!from)continue;let senderE164=group?participantJid?await resolveInboundJid(participantJid):null:from,groupSubject,groupParticipants;if(group){let meta=await getGroupMeta(remoteJid);groupSubject=meta.subject,groupParticipants=meta.participants}let messageTimestampMs=msg.messageTimestamp?Number(msg.messageTimestamp)*1e3:void 0,access=await checkInboundAccessControl({accountId:options.accountId,from,selfE164,senderE164,group,pushName:msg.pushName??void 0,isFromMe:!!msg.key?.fromMe,messageTimestampMs,connectedAtMs,sock:{sendMessage:(jid,content)=>sock.sendMessage(jid,content)},remoteJid});if(!access.allowed)continue;if(id&&!access.isSelfChat&&options.sendReadReceipts!==!1){let participant=msg.key?.participant;try{await sock.readMessages([{remoteJid,id,participant,fromMe:!1}]),shouldLogVerbose()&&logVerbose(`Marked message ${id} as read for ${remoteJid}${participant?` (participant ${participant})`:``}`)}catch(err){logVerbose(`Failed to mark message ${id} read: ${String(err)}`)}}else id&&access.isSelfChat&&shouldLogVerbose()&&logVerbose(`Self-chat mode: skipping read receipt for ${id}`);if(upsert.type===`append`)continue;let location=extractLocationData(msg.message??void 0),locationText=location?formatLocationText(location):void 0,body=extractText(msg.message??void 0);if(locationText&&(body=[body,locationText].filter(Boolean).join(`
4
4
  `).trim()),!body&&(body=extractMediaPlaceholder(msg.message??void 0),!body))continue;let replyContext=describeReplyContext(msg.message),mediaPath,mediaType,mediaFileName;try{let inboundMedia=await downloadInboundMedia(msg,sock);if(inboundMedia){let maxBytes=(typeof options.mediaMaxMb==`number`&&options.mediaMaxMb>0?options.mediaMaxMb:50)*1024*1024;mediaPath=(await saveMediaBuffer(inboundMedia.buffer,inboundMedia.mimetype,`inbound`,maxBytes,inboundMedia.fileName)).path,mediaType=inboundMedia.mimetype,mediaFileName=inboundMedia.fileName}}catch(err){logVerbose(`Inbound media download failed: ${String(err)}`)}let chatJid=remoteJid,sendComposing=async()=>{try{await sock.sendPresenceUpdate(`composing`,chatJid)}catch(err){logVerbose(`Presence update failed: ${String(err)}`)}},reply=async text=>{await sock.sendMessage(chatJid,{text})},sendMedia=async payload=>{await sock.sendMessage(chatJid,payload)},timestamp=messageTimestampMs,mentionedJids=extractMentionedJids(msg.message),senderName=msg.pushName??void 0;inboundLogger.info({from,to:selfE164??`me`,body,mediaPath,mediaType,mediaFileName,timestamp},`inbound message`);let inboundMessage={id,from,conversationId:from,to:selfE164??`me`,accountId:access.resolvedAccountId,body,pushName:senderName,timestamp,chatType:group?`group`:`direct`,chatId:remoteJid,senderJid:participantJid,senderE164:senderE164??void 0,senderName,replyToId:replyContext?.id,replyToBody:replyContext?.body,replyToSender:replyContext?.sender,replyToSenderJid:replyContext?.senderJid,replyToSenderE164:replyContext?.senderE164,groupSubject,groupParticipants,mentionedJids:mentionedJids??void 0,selfJid,selfE164,location:location??void 0,sendComposing,reply,sendMedia,mediaPath,mediaType,mediaFileName};try{Promise.resolve(debouncer.enqueue(inboundMessage)).catch(err=>{inboundLogger.error({error:String(err)},`failed handling inbound web message`),inboundConsoleLog.error(`Failed handling inbound web message: ${String(err)}`)})}catch(err){inboundLogger.error({error:String(err)},`failed handling inbound web message`),inboundConsoleLog.error(`Failed handling inbound web message: ${String(err)}`)}}};sock.ev.on(`messages.upsert`,handleMessagesUpsert);let handleConnectionUpdate=update=>{try{if(update.connection===`close`){let status=getStatusCode(update.lastDisconnect?.error);resolveClose({status,isLoggedOut:status===DisconnectReason.loggedOut,error:update.lastDisconnect?.error})}}catch(err){inboundLogger.error({error:String(err)},`connection.update handler error`),resolveClose({status:void 0,isLoggedOut:!1,error:err})}};return sock.ev.on(`connection.update`,handleConnectionUpdate),{close:async()=>{try{let ev=sock.ev,messagesUpsertHandler=handleMessagesUpsert,connectionUpdateHandler=handleConnectionUpdate;typeof ev.off==`function`?(ev.off(`messages.upsert`,messagesUpsertHandler),ev.off(`connection.update`,connectionUpdateHandler)):typeof ev.removeListener==`function`&&(ev.removeListener(`messages.upsert`,messagesUpsertHandler),ev.removeListener(`connection.update`,connectionUpdateHandler)),sock.ws?.close()}catch(err){logVerbose(`Socket close failed: ${String(err)}`)}},onClose,signalClose:reason=>{resolveClose(reason??{status:void 0,isLoggedOut:!1,error:`closed`})},...createWebSendApi({sock:{sendMessage:(jid,content)=>sock.sendMessage(jid,content),sendPresenceUpdate:(presence,jid)=>sock.sendPresenceUpdate(presence,jid)},defaultAccountId:options.accountId})}}function buildMentionConfig(cfg,agentId){return{mentionRegexes:buildMentionRegexes(cfg,agentId),allowFrom:cfg.channels?.whatsapp?.allowFrom}}function resolveMentionTargets(msg,authDir){let jidOptions=authDir?{authDir}:void 0;return{normalizedMentions:msg.mentionedJids?.length?msg.mentionedJids.map(jid=>jidToE164(jid,jidOptions)??jid).filter(Boolean):[],selfE164:msg.selfE164??(msg.selfJid?jidToE164(msg.selfJid,jidOptions):null),selfJid:msg.selfJid?msg.selfJid.replace(/:\\d+/,``):null}}function isBotMentionedFromTargets(msg,mentionCfg,targets){let clean=text=>normalizeMentionText(text),isSelfChat=isSelfChatMode(targets.selfE164,mentionCfg.allowFrom);if((msg.mentionedJids?.length??0)>0&&!isSelfChat)return!!(targets.selfE164&&targets.normalizedMentions.includes(targets.selfE164)||targets.selfJid&&targets.normalizedMentions.includes(targets.selfJid));let bodyClean=clean(msg.body);if(mentionCfg.mentionRegexes.some(re=>re.test(bodyClean)))return!0;if(targets.selfE164){let selfDigits=targets.selfE164.replace(/\D/g,``);if(selfDigits){if(bodyClean.replace(/[^\d]/g,``).includes(selfDigits))return!0;let bodyNoSpace=msg.body.replace(/[\s-]/g,``);if(RegExp(`\\+?${selfDigits}`,`i`).test(bodyNoSpace))return!0}}return!1}function debugMention(msg,mentionCfg,authDir){let mentionTargets=resolveMentionTargets(msg,authDir);return{wasMentioned:isBotMentionedFromTargets(msg,mentionCfg,mentionTargets),details:{from:msg.from,body:msg.body,bodyClean:normalizeMentionText(msg.body),mentionedJids:msg.mentionedJids??null,normalizedMentionedJids:mentionTargets.normalizedMentions.length?mentionTargets.normalizedMentions:null,selfJid:msg.selfJid??null,selfJidBare:mentionTargets.selfJid,selfE164:msg.selfE164??null,resolvedSelfE164:mentionTargets.selfE164}}}function resolveOwnerList(mentionCfg,selfE164){let allowFrom=mentionCfg.allowFrom;return(Array.isArray(allowFrom)&&allowFrom.length>0?allowFrom:selfE164?[selfE164]:[]).filter(entry=>!!(entry&&entry!==`*`)).map(entry=>normalizeE164(entry)).filter(entry=>!!entry)}function createEchoTracker(params){let recentlySent=new Set,maxItems=Math.max(1,params.maxItems??100),buildCombinedKey=p=>`combined:${p.sessionKey}:${p.combinedBody}`,trim=()=>{for(;recentlySent.size>maxItems;){let firstKey=recentlySent.values().next().value;if(!firstKey)break;recentlySent.delete(firstKey)}};return{rememberText:(text,opts)=>{text&&(recentlySent.add(text),opts.combinedBody&&opts.combinedBodySessionKey&&recentlySent.add(buildCombinedKey({sessionKey:opts.combinedBodySessionKey,combinedBody:opts.combinedBody})),opts.logVerboseMessage&&params.logVerbose?.(`Added to echo detection set (size now: ${recentlySent.size}): ${text.substring(0,50)}...`),trim())},has:key=>recentlySent.has(key),forget:key=>{recentlySent.delete(key)},buildCombinedKey}}async function maybeBroadcastMessage(params){let broadcastAgents=params.cfg.broadcast?.[params.peerId];if(!broadcastAgents||!Array.isArray(broadcastAgents)||broadcastAgents.length===0)return!1;let strategy=params.cfg.broadcast?.strategy||`parallel`;whatsappInboundLog.info(`Broadcasting message to ${broadcastAgents.length} agents (${strategy})`);let agentIds=params.cfg.agents?.list?.map(agent=>normalizeAgentId(agent.id)),hasKnownAgents=(agentIds?.length??0)>0,groupHistorySnapshot=params.msg.chatType===`group`?params.groupHistories.get(params.groupHistoryKey)??[]:void 0,processForAgent=async agentId=>{let normalizedAgentId=normalizeAgentId(agentId);if(hasKnownAgents&&!agentIds?.includes(normalizedAgentId))return whatsappInboundLog.warn(`Broadcast agent ${agentId} not found in agents.list; skipping`),!1;let agentRoute={...params.route,agentId:normalizedAgentId,sessionKey:buildAgentSessionKey({agentId:normalizedAgentId,channel:`whatsapp`,accountId:params.route.accountId,peer:{kind:params.msg.chatType===`group`?`group`:`direct`,id:params.peerId},dmScope:params.cfg.session?.dmScope,identityLinks:params.cfg.session?.identityLinks}),mainSessionKey:buildAgentMainSessionKey({agentId:normalizedAgentId,mainKey:DEFAULT_MAIN_KEY})};try{return await params.processMessage(params.msg,agentRoute,params.groupHistoryKey,{groupHistory:groupHistorySnapshot,suppressGroupHistoryClear:!0})}catch(err){return whatsappInboundLog.error(`Broadcast agent ${agentId} failed: ${formatError(err)}`),!1}};if(strategy===`sequential`)for(let agentId of broadcastAgents)await processForAgent(agentId);else await Promise.allSettled(broadcastAgents.map(processForAgent));return params.msg.chatType===`group`&&params.groupHistories.set(params.groupHistoryKey,[]),!0}function stripMentionsForCommand(text,mentionRegexes,selfE164){let result=text;for(let re of mentionRegexes)result=result.replace(re,` `);if(selfE164){let digits=selfE164.replace(/\D/g,``);if(digits){let pattern=RegExp(`\\+?${digits}`,`g`);result=result.replace(pattern,` `)}}return result.replace(/\s+/g,` `).trim()}function resolveGroupPolicyFor(cfg,conversationId){let groupId=resolveGroupSessionKey({From:conversationId,ChatType:`group`,Provider:`whatsapp`})?.id;return resolveChannelGroupPolicy({cfg,channel:`whatsapp`,groupId:groupId??conversationId})}function resolveGroupRequireMentionFor(cfg,conversationId){let groupId=resolveGroupSessionKey({From:conversationId,ChatType:`group`,Provider:`whatsapp`})?.id;return resolveChannelGroupRequireMention({cfg,channel:`whatsapp`,groupId:groupId??conversationId})}function resolveGroupActivationFor(params){let entry=loadSessionStore(resolveStorePath(params.cfg.session?.store,{agentId:params.agentId}))[params.sessionKey],defaultActivation=resolveGroupRequireMentionFor(params.cfg,params.conversationId)?`mention`:`always`;return normalizeGroupActivation(entry?.groupActivation)??defaultActivation}function noteGroupMember(groupMemberNames,conversationId,e164,name){if(!e164||!name)return;let key=normalizeE164(e164)??e164;if(!key)return;let roster=groupMemberNames.get(conversationId);roster||(roster=new Map,groupMemberNames.set(conversationId,roster)),roster.set(key,name)}function formatGroupMembers(params){let{participants,roster,fallbackE164}=params,seen=new Set,ordered=[];if(participants?.length)for(let entry of participants){if(!entry)continue;let normalized=normalizeE164(entry)??entry;!normalized||seen.has(normalized)||(seen.add(normalized),ordered.push(normalized))}if(roster)for(let entry of roster.keys()){let normalized=normalizeE164(entry)??entry;!normalized||seen.has(normalized)||(seen.add(normalized),ordered.push(normalized))}if(ordered.length===0&&fallbackE164){let normalized=normalizeE164(fallbackE164)??fallbackE164;normalized&&ordered.push(normalized)}if(ordered.length!==0)return ordered.map(entry=>{let name=roster?.get(entry);return name?`${name} (${entry})`:entry}).join(`, `)}function isOwnerSender(baseMentionConfig,msg){let sender=normalizeE164(msg.senderE164??``);return sender?resolveOwnerList(baseMentionConfig,msg.selfE164??void 0).includes(sender):!1}function recordPendingGroupHistoryEntry(params){let sender=params.msg.senderName&&params.msg.senderE164?`${params.msg.senderName} (${params.msg.senderE164})`:params.msg.senderName??params.msg.senderE164??`Unknown`;recordPendingHistoryEntryIfEnabled({historyMap:params.groupHistories,historyKey:params.groupHistoryKey,limit:params.groupHistoryLimit,entry:{sender,body:params.msg.body,timestamp:params.msg.timestamp,id:params.msg.id,senderJid:params.msg.senderJid}})}function applyGroupGating(params){let groupPolicy=resolveGroupPolicyFor(params.cfg,params.conversationId);if(groupPolicy.allowlistEnabled&&!groupPolicy.allowed)return params.logVerbose(`Skipping group message ${params.conversationId} (not in allowlist)`),{shouldProcess:!1};noteGroupMember(params.groupMemberNames,params.groupHistoryKey,params.msg.senderE164,params.msg.senderName);let mentionConfig=buildMentionConfig(params.cfg,params.agentId),commandBody=stripMentionsForCommand(params.msg.body,mentionConfig.mentionRegexes,params.msg.selfE164),activationCommand=parseActivationCommand(commandBody),owner=isOwnerSender(params.baseMentionConfig,params.msg),shouldBypassMention=owner&&hasControlCommand(commandBody,params.cfg);if(activationCommand.hasCommand&&!owner)return params.logVerbose(`Ignoring /activation from non-owner in group ${params.conversationId}`),recordPendingGroupHistoryEntry({msg:params.msg,groupHistories:params.groupHistories,groupHistoryKey:params.groupHistoryKey,groupHistoryLimit:params.groupHistoryLimit}),{shouldProcess:!1};let mentionDebug=debugMention(params.msg,mentionConfig,params.authDir);params.replyLogger.debug({conversationId:params.conversationId,wasMentioned:mentionDebug.wasMentioned,...mentionDebug.details},`group mention debug`);let wasMentioned=mentionDebug.wasMentioned,requireMention=resolveGroupActivationFor({cfg:params.cfg,agentId:params.agentId,sessionKey:params.sessionKey,conversationId:params.conversationId})!==`always`,selfJid=params.msg.selfJid?.replace(/:\\d+/,``),replySenderJid=params.msg.replyToSenderJid?.replace(/:\\d+/,``),selfE164=params.msg.selfE164?normalizeE164(params.msg.selfE164):null,replySenderE164=params.msg.replyToSenderE164?normalizeE164(params.msg.replyToSenderE164):null,mentionGate=resolveMentionGating({requireMention,canDetectMention:!0,wasMentioned,implicitMention:!!(selfJid&&replySenderJid&&selfJid===replySenderJid||selfE164&&replySenderE164&&selfE164===replySenderE164),shouldBypassMention});return params.msg.wasMentioned=mentionGate.effectiveWasMentioned,!shouldBypassMention&&requireMention&&mentionGate.shouldSkip?(params.logVerbose(`Group message stored for context (no mention detected) in ${params.conversationId}: ${params.msg.body}`),recordPendingGroupHistoryEntry({msg:params.msg,groupHistories:params.groupHistories,groupHistoryKey:params.groupHistoryKey,groupHistoryLimit:params.groupHistoryLimit}),{shouldProcess:!1}):{shouldProcess:!0}}function trackBackgroundTask(backgroundTasks,task){backgroundTasks.add(task),task.finally(()=>{backgroundTasks.delete(task)})}function updateLastRouteInBackground(params){let storePath=resolveStorePath(params.cfg.session?.store,{agentId:params.storeAgentId}),task=updateLastRoute({storePath,sessionKey:params.sessionKey,deliveryContext:{channel:params.channel,to:params.to,accountId:params.accountId},ctx:params.ctx}).catch(err=>{params.warn({error:formatError(err),storePath,sessionKey:params.sessionKey,to:params.to},`failed updating last route`)});trackBackgroundTask(params.backgroundTasks,task)}function resolvePeerId(msg){return msg.chatType===`group`?msg.conversationId??msg.from:msg.senderE164?normalizeE164(msg.senderE164)??msg.senderE164:msg.from.includes(`@`)?jidToE164(msg.from)??msg.from:normalizeE164(msg.from)??msg.from}async function deliverWebReply(params){let{replyResult,msg,maxMediaBytes,textLimit,replyLogger,connectionId,skipLog}=params,replyStarted=Date.now(),tableMode=params.tableMode??`code`,chunkMode=params.chunkMode??`length`,textChunks=chunkMarkdownTextWithMode(markdownToWhatsApp(convertMarkdownTables(replyResult.text||``,tableMode)),textLimit,chunkMode),mediaList=replyResult.mediaUrls?.length?replyResult.mediaUrls:replyResult.mediaUrl?[replyResult.mediaUrl]:[],sendWithRetry=async(fn,label,maxAttempts=3)=>{let lastErr;for(let attempt=1;attempt<=maxAttempts;attempt++)try{return await fn()}catch(err){lastErr=err;let errText=formatError(err),isLast=attempt===maxAttempts;if(!/closed|reset|timed\\s*out|disconnect/i.test(errText)||isLast)throw err;let backoffMs=500*attempt;logVerbose(`Retrying ${label} to ${msg.from} after failure (${attempt}/${maxAttempts-1}) in ${backoffMs}ms: ${errText}`),await sleep(backoffMs)}throw lastErr};if(mediaList.length===0&&textChunks.length){let totalChunks=textChunks.length;for(let[index,chunk]of textChunks.entries()){let chunkStarted=Date.now();if(await sendWithRetry(()=>msg.reply(chunk),`text`),!skipLog){let durationMs=Date.now()-chunkStarted;whatsappOutboundLog.debug(`Sent chunk ${index+1}/${totalChunks} to ${msg.from} (${durationMs.toFixed(0)}ms)`)}}replyLogger.info({correlationId:msg.id??newConnectionId(),connectionId:connectionId??null,to:msg.from,from:msg.to,text:elide(replyResult.text,240),mediaUrl:null,mediaSizeBytes:null,mediaKind:null,durationMs:Date.now()-replyStarted},`auto-reply sent (text)`);return}let remainingText=[...textChunks];for(let[index,mediaUrl]of mediaList.entries()){let caption=index===0&&remainingText.shift()||void 0;try{let media=await loadWebMedia(mediaUrl,{maxBytes:maxMediaBytes,localRoots:params.mediaLocalRoots});if(shouldLogVerbose()&&(logVerbose(`Web auto-reply media size: ${(media.buffer.length/(1024*1024)).toFixed(2)}MB`),logVerbose(`Web auto-reply media source: ${mediaUrl} (kind ${media.kind})`)),media.kind===`image`)await sendWithRetry(()=>msg.sendMedia({image:media.buffer,caption,mimetype:media.contentType}),`media:image`);else if(media.kind===`audio`)await sendWithRetry(()=>msg.sendMedia({audio:media.buffer,ptt:!0,mimetype:media.contentType,caption}),`media:audio`);else if(media.kind===`video`)await sendWithRetry(()=>msg.sendMedia({video:media.buffer,caption,mimetype:media.contentType}),`media:video`);else{let fileName=media.fileName??mediaUrl.split(`/`).pop()??`file`,mimetype=media.contentType??`application/octet-stream`;await sendWithRetry(()=>msg.sendMedia({document:media.buffer,fileName,caption,mimetype}),`media:document`)}whatsappOutboundLog.info(`Sent media reply to ${msg.from} (${(media.buffer.length/(1024*1024)).toFixed(2)}MB)`),replyLogger.info({correlationId:msg.id??newConnectionId(),connectionId:connectionId??null,to:msg.from,from:msg.to,text:caption??null,mediaUrl,mediaSizeBytes:media.buffer.length,mediaKind:media.kind,durationMs:Date.now()-replyStarted},`auto-reply sent (media)`)}catch(err){if(whatsappOutboundLog.error(`Failed sending web media to ${msg.from}: ${formatError(err)}`),replyLogger.warn({err,mediaUrl},`failed to send web media reply`),index===0){let warning=err instanceof Error?`⚠️ Media failed: ${err.message}`:`⚠️ Media failed.`,fallbackText=[remainingText.shift()??caption??``,warning].filter(Boolean).join(`