@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
@@ -268,7 +268,7 @@ REPORT every issue by calling the \`builtin_security_record\` tool, ONE call per
268
268
  - tsc: which Trust Service Criterion it maps to — 'security' | 'availability' | 'processing_integrity' | 'confidentiality' | 'privacy'.
269
269
  - location: file:line or component.
270
270
  - recommendation: a concrete, actionable fix.
271
- Each call mints an access-restricted SECURITY ticket. Do not put real finding details anywhere except these tool calls. If a criterion is clean, say so in your summary rather than filing a ticket.`,persona:{voice:`precise, skeptical, and evidence-driven`,perspective:`a control is only satisfied if the code proves it — assume nothing, verify against the real files and data flows`,decisionStyle:`risk-first: rate by exploitability and blast radius; map every finding to its Trust Service Criterion`},outputFormat:{structure:`markdown`,requiredSections:[`## SOC 2 Coverage`,`## Findings by Criterion`,`## Summary`],outputPrefix:`SECURITY:`},thinking:`high`},AGENT_ROLE_MODEL_ROLES={"code-creator":`code`,"test-generator":`code`,"refactor-agent":`code`,"code-reviewer":`verify`,"validator-agent":`verify`,"security-agent":`verify`,"bug-analyzer":`plan`,"architecture-advisor":`plan`,"documentation-agent":`utility`};function modelRoleForAgentRole(name){if(!(!name||!Object.hasOwn(AGENT_ROLE_MODEL_ROLES,name)))return AGENT_ROLE_MODEL_ROLES[name]}function getBuiltInAgentRoles(){return[CODE_CREATOR_ROLE,CODE_REVIEWER_ROLE,TEST_GENERATOR_ROLE,BUG_ANALYZER_ROLE,REFACTOR_AGENT_ROLE,DOCUMENTATION_AGENT_ROLE,ARCHITECTURE_ADVISOR_ROLE,VALIDATOR_AGENT_ROLE,SECURITY_AGENT_ROLE]}function registerHiredAgentsAsRoles(agents){for(let a of agents){let basePlugin={description:`Hired agent: ${a.name}`,capabilities:a.skills,tools:a.skills,systemPrompt:a.systemPrompt,model:a.model,source:`builderforce-assigned`,active:!0},aliases=a.roleKey===a.id?[a.roleKey]:[a.roleKey,a.id];for(let alias of aliases)!alias||!alias.trim()||globalPersonaRegistry.register({...basePlugin,name:alias})}}function findAgentRole(name){return getBuiltInAgentRoles().find(role=>role.name===name)||globalPersonaRegistry.resolve(name)}const TOKENS_PER_MILLION=1e6,LOCAL_APIS=new Set([`ollama`,`llama`,`transformers`]),LOCAL_PROVIDERS=new Set([`ollama`,`lmstudio`,`freetoken`,`synapse`,`vllm`,`llama`,`builderforcellm-local`]),LOOPBACK_HOSTS=new Set([`localhost`,`127.0.0.1`,`[::1]`,`::1`,`0.0.0.0`]),finiteNonNegative=n=>typeof n==`number`&&Number.isFinite(n)&&n>=0?n:void 0;function priceForCost(cost){let input=finiteNonNegative(cost?.input),output=finiteNonNegative(cost?.output);if(!(input===void 0||output===void 0))return{input:input/TOKENS_PER_MILLION,output:output/TOKENS_PER_MILLION}}function tierForCost(cost){let price=priceForCost(cost);if(!price)return;let outputPerMillion=price.output*TOKENS_PER_MILLION;return price.input===0&&price.output===0?`FREE`:outputPerMillion<8?`STANDARD`:outputPerMillion<20?`PREMIUM`:`ULTRA`}const FREE_POOL_PROVIDERS=new Set([`builderforcellm`]),FREE_ID_MARKER=/[:-]free$/i;function isExplicitlyFree(provider,id){return FREE_POOL_PROVIDERS.has(normalizeProviderId(provider))||FREE_ID_MARKER.test(id.trim())}const isZeroCost=cost=>cost!==void 0&&cost.input===0&&cost.output===0;function isLoopbackUrl(baseUrl){if(!baseUrl)return!1;try{return LOOPBACK_HOSTS.has(new URL(baseUrl).hostname.toLowerCase())}catch{return!1}}function isLocalModel(provider,entry){return LOCAL_PROVIDERS.has(normalizeProviderId(provider))?!0:entry?.api!=null&&LOCAL_APIS.has(entry.api)||isLoopbackUrl(entry?.baseUrl)}function vendorOfCandidateKey(key){let slash=key.indexOf(`/`);return normalizeProviderId(slash===-1?key:key.slice(0,slash))}function catalogViewFromEntries(entries){let byKey=new Map;for(let entry of entries){let provider=normalizeProviderId(entry.provider??``),id=entry.id?.trim();if(!provider||!id)continue;let key=modelKey(provider,id);byKey.has(key)||byKey.set(key,{...entry,provider,id})}let rowOf=model=>{let slash=model.indexOf(`/`);if(slash!==-1)return byKey.get(modelKey(normalizeProviderId(model.slice(0,slash)),model.slice(slash+1)))},residency=model=>isLocalModel(vendorOfCandidateKey(model),rowOf(model))?`local`:`cloud`,trustedCost=model=>{if(residency(model)===`local`)return{input:0,output:0};let row=rowOf(model);if(!(!row||isZeroCost(row.cost)&&!isExplicitlyFree(row.provider,row.id)))return row.cost};return{vendorOf:vendorOfCandidateKey,tierOf:model=>tierForCost(trustedCost(model)),priceOf:model=>priceForCost(trustedCost(model)),residencyOf:residency}}function configuredEntries(cfg){let providers=cfg?.models?.providers??{};return Object.entries(providers).flatMap(([provider,pc])=>(pc?.models??[]).map(m=>({provider,id:m.id,cost:m.cost,api:m.api??pc.api,baseUrl:pc.baseUrl})))}function registryEntries(agentDir){return discoverModels(discoverAuthStorage(agentDir),agentDir).getAll().map(m=>({provider:m.provider,id:m.id,cost:m.cost,api:m.api,baseUrl:m.baseUrl}))}function loadOnPremCatalogView(params){let entries=configuredEntries(params?.cfg);try{entries.push(...registryEntries(params?.agentDir??resolveBuilderForceAgentsAgentDir()))}catch{}return catalogViewFromEntries(entries)}async function resolveRoleRoutedModel(params){try{let resolved=resolveModelRefFromString({raw:params.lead,defaultProvider:DEFAULT_PROVIDER,aliasIndex:buildModelAliasIndex({cfg:params.cfg,defaultProvider:DEFAULT_PROVIDER})});if(!resolved)return params.lead;let winner=(await seedLearnedModel({candidates:resolveFallbackCandidates({cfg:params.cfg,provider:resolved.ref.provider,model:resolved.ref.model}),...params.prompt==null?{}:{prompt:params.prompt},routing:{role:params.role,view:params.view??loadOnPremCatalogView({cfg:params.cfg})}})).ranked[0];return winner?candidateKey(winner):params.lead}catch(err){return logDebug(`[model-routing] role routing failed, keeping ${params.lead}: ${String(err)}`),params.lead}}async function resolveSubagentSpawnModel(params){let selection=resolveSubagentSpawnModelSelection(params);return(normalizeModelSelection(params.modelOverride)??resolveSubagentConfiguredModelSelection({cfg:params.cfg,agentId:params.agentId}))||!params.role?selection:resolveRoleRoutedModel({cfg:params.cfg,lead:selection,role:params.role,prompt:params.task})}function splitModelRef(ref){if(!ref)return{provider:void 0,model:void 0};let trimmed=ref.trim();if(!trimmed)return{provider:void 0,model:void 0};let[provider,model]=trimmed.split(`/`,2);return model?{provider,model}:{provider:void 0,model:trimmed}}async function spawnSubagentDirect(params,ctx){let task=params.task,label=params.label?.trim()||``,requestedAgentId=params.agentId,modelOverride=params.model,thinkingOverrideRaw=params.thinking,cleanup=params.cleanup===`keep`||params.cleanup===`delete`?params.cleanup:`keep`,requesterOrigin=normalizeDeliveryContext({channel:ctx.agentChannel,accountId:ctx.agentAccountId,to:ctx.agentTo,threadId:ctx.agentThreadId}),runTimeoutSeconds=typeof params.runTimeoutSeconds==`number`&&Number.isFinite(params.runTimeoutSeconds)?Math.max(0,Math.floor(params.runTimeoutSeconds)):0,modelApplied=!1,cfg=loadConfig(),{mainKey,alias}=resolveMainSessionAlias(cfg),requesterSessionKey=ctx.agentSessionKey,requesterInternalKey=requesterSessionKey?resolveInternalSessionKey({key:requesterSessionKey,alias,mainKey}):alias,requesterDisplayKey=resolveDisplaySessionKey({key:requesterInternalKey,alias,mainKey}),callerDepth=getSubagentDepthFromSessionStore(requesterInternalKey,{cfg}),maxSpawnDepth=cfg.agents?.defaults?.subagents?.maxSpawnDepth??1;if(callerDepth>=maxSpawnDepth)return{status:`forbidden`,error:`sessions_spawn is not allowed at this depth (current depth: ${callerDepth}, max: ${maxSpawnDepth})`};let maxChildren=cfg.agents?.defaults?.subagents?.maxChildrenPerAgent??5,activeChildren=await countActiveRunsForSession(requesterInternalKey);if(activeChildren>=maxChildren)return{status:`forbidden`,error:`sessions_spawn has reached max active children for this session (${activeChildren}/${maxChildren})`};let requesterAgentId=normalizeAgentId(ctx.requesterAgentIdOverride??parseAgentSessionKey(requesterInternalKey)?.agentId),targetAgentId=requestedAgentId?normalizeAgentId(requestedAgentId):requesterAgentId;if(targetAgentId!==requesterAgentId){let allowAgents=resolveAgentConfig(cfg,requesterAgentId)?.subagents?.allowAgents??[],allowAny=allowAgents.some(value=>value.trim()===`*`),normalizedTargetId=targetAgentId.toLowerCase(),allowSet=new Set(allowAgents.filter(value=>value.trim()&&value.trim()!==`*`).map(value=>normalizeAgentId(value).toLowerCase()));if(!allowAny&&!allowSet.has(normalizedTargetId))return{status:`forbidden`,error:`agentId is not allowed for sessions_spawn (allowed: ${allowSet.size>0?Array.from(allowSet).join(`, `):`none`})`}}if(params.roleConfig){cfg.agents||={list:[]};let agentsList=cfg.agents.list??(cfg.agents.list=[]),existingIdx=agentsList.findIndex(e=>normalizeAgentId(e.id)===targetAgentId),role=params.roleConfig,newEntry={id:targetAgentId,skills:role.tools,...role.model?{model:role.model}:{}};existingIdx>=0?agentsList[existingIdx]={...agentsList[existingIdx],...newEntry}:agentsList.push(newEntry),!modelOverride&&role.model&&(modelOverride=role.model),!thinkingOverrideRaw&&role.thinking&&(thinkingOverrideRaw=role.thinking)}let childSessionKey=`agent:${targetAgentId}:subagent:${crypto.randomUUID()}`,childDepth=callerDepth+1,spawnedByKey=requesterInternalKey,targetAgentConfig=resolveAgentConfig(cfg,targetAgentId),resolvedModel=await resolveSubagentSpawnModel({cfg,agentId:targetAgentId,modelOverride,role:modelRoleForAgentRole(params.roleConfig?.name),task}),resolvedThinkingDefaultRaw=readStringParam(targetAgentConfig?.subagents??{},`thinking`)??readStringParam(cfg.agents?.defaults?.subagents??{},`thinking`),thinkingOverride,thinkingCandidateRaw=thinkingOverrideRaw||resolvedThinkingDefaultRaw;if(thinkingCandidateRaw){let normalized=normalizeThinkLevel(thinkingCandidateRaw);if(!normalized){let{provider,model}=splitModelRef(resolvedModel);return{status:`error`,error:`Invalid thinking level "${thinkingCandidateRaw}". Use one of: ${formatThinkingLevels(provider,model)}.`}}thinkingOverride=normalized}try{await callGateway({method:`sessions.patch`,params:{key:childSessionKey,spawnDepth:childDepth},timeoutMs:1e4})}catch(err){return{status:`error`,error:err instanceof Error?err.message:typeof err==`string`?err:`error`,childSessionKey}}if(resolvedModel)try{await callGateway({method:`sessions.patch`,params:{key:childSessionKey,model:resolvedModel},timeoutMs:1e4}),modelApplied=!0}catch(err){return{status:`error`,error:err instanceof Error?err.message:typeof err==`string`?err:`error`,childSessionKey}}if(thinkingOverride!==void 0)try{await callGateway({method:`sessions.patch`,params:{key:childSessionKey,thinkingLevel:thinkingOverride===`off`?null:thinkingOverride},timeoutMs:1e4})}catch(err){return{status:`error`,error:err instanceof Error?err.message:typeof err==`string`?err:`error`,childSessionKey}}let childSystemPrompt=buildSubagentSystemPrompt({requesterSessionKey,requesterOrigin,childSessionKey,label:label||void 0,task,childDepth,maxSpawnDepth});if(params.roleConfig){params.roleConfig.systemPrompt&&(childSystemPrompt+=`
271
+ Each call mints an access-restricted SECURITY ticket. Do not put real finding details anywhere except these tool calls. If a criterion is clean, say so in your summary rather than filing a ticket.`,persona:{voice:`precise, skeptical, and evidence-driven`,perspective:`a control is only satisfied if the code proves it — assume nothing, verify against the real files and data flows`,decisionStyle:`risk-first: rate by exploitability and blast radius; map every finding to its Trust Service Criterion`},outputFormat:{structure:`markdown`,requiredSections:[`## SOC 2 Coverage`,`## Findings by Criterion`,`## Summary`],outputPrefix:`SECURITY:`},thinking:`high`},AGENT_ROLE_MODEL_ROLES={"code-creator":`code`,"test-generator":`code`,"refactor-agent":`code`,"code-reviewer":`verify`,"validator-agent":`verify`,"security-agent":`verify`,"bug-analyzer":`plan`,"architecture-advisor":`plan`,"documentation-agent":`utility`};function modelRoleForAgentRole(name){if(!(!name||!Object.hasOwn(AGENT_ROLE_MODEL_ROLES,name)))return AGENT_ROLE_MODEL_ROLES[name]}function getBuiltInAgentRoles(){return[CODE_CREATOR_ROLE,CODE_REVIEWER_ROLE,TEST_GENERATOR_ROLE,BUG_ANALYZER_ROLE,REFACTOR_AGENT_ROLE,DOCUMENTATION_AGENT_ROLE,ARCHITECTURE_ADVISOR_ROLE,VALIDATOR_AGENT_ROLE,SECURITY_AGENT_ROLE]}function registerHiredAgentsAsRoles(agents){for(let a of agents){let basePlugin={description:`Hired agent: ${a.name}`,capabilities:a.skills,tools:a.skills,systemPrompt:a.systemPrompt,model:a.model,source:`builderforce-assigned`,active:!0},aliases=a.roleKey===a.id?[a.roleKey]:[a.roleKey,a.id];for(let alias of aliases)!alias||!alias.trim()||globalPersonaRegistry.register({...basePlugin,name:alias})}}function findAgentRole(name){return getBuiltInAgentRoles().find(role=>role.name===name)||globalPersonaRegistry.resolve(name)}const TOKENS_PER_MILLION=1e6,LOCAL_APIS=new Set([`ollama`,`llama`,`transformers`]),LOCAL_PROVIDERS=new Set([`ollama`,`lmstudio`,`freetoken`,`synapse`,`vllm`,`llama`,`builderforcellm-local`]),LOOPBACK_HOSTS=new Set([`localhost`,`127.0.0.1`,`[::1]`,`::1`,`0.0.0.0`]),finiteNonNegative=n=>typeof n==`number`&&Number.isFinite(n)&&n>=0?n:void 0;function priceForCost(cost){let input=finiteNonNegative(cost?.input),output=finiteNonNegative(cost?.output);if(!(input===void 0||output===void 0))return{input:input/TOKENS_PER_MILLION,output:output/TOKENS_PER_MILLION}}function tierForCost(cost){let price=priceForCost(cost);if(!price)return;let outputPerMillion=price.output*TOKENS_PER_MILLION;return price.input===0&&price.output===0?`FREE`:outputPerMillion<8?`STANDARD`:outputPerMillion<20?`PREMIUM`:`ULTRA`}const FREE_POOL_PROVIDERS=new Set([`builderforcellm`]),FREE_ID_MARKER=/[:-]free$/i;function isExplicitlyFree(provider,id){return FREE_POOL_PROVIDERS.has(normalizeProviderId(provider))||FREE_ID_MARKER.test(id.trim())}const isZeroCost=cost=>cost!==void 0&&cost.input===0&&cost.output===0;function isLoopbackUrl(baseUrl){if(!baseUrl)return!1;try{return LOOPBACK_HOSTS.has(new URL(baseUrl).hostname.toLowerCase())}catch{return!1}}function isLocalModel(provider,entry){return LOCAL_PROVIDERS.has(normalizeProviderId(provider))?!0:entry?.api!=null&&LOCAL_APIS.has(entry.api)||isLoopbackUrl(entry?.baseUrl)}function vendorOfCandidateKey(key){let slash=key.indexOf(`/`);return normalizeProviderId(slash===-1?key:key.slice(0,slash))}function catalogViewFromEntries(entries){let byKey=new Map;for(let entry of entries){let provider=normalizeProviderId(entry.provider??``),id=entry.id?.trim();if(!provider||!id)continue;let key=modelKey(provider,id);byKey.has(key)||byKey.set(key,{...entry,provider,id})}let rowOf=model=>{let slash=model.indexOf(`/`);if(slash!==-1)return byKey.get(modelKey(normalizeProviderId(model.slice(0,slash)),model.slice(slash+1)))},residency=model=>isLocalModel(vendorOfCandidateKey(model),rowOf(model))?`local`:`cloud`,trustedCost=model=>{if(residency(model)===`local`)return{input:0,output:0};let row=rowOf(model);if(!(!row||isZeroCost(row.cost)&&!isExplicitlyFree(row.provider,row.id)))return row.cost};return{vendorOf:vendorOfCandidateKey,tierOf:model=>tierForCost(trustedCost(model)),priceOf:model=>priceForCost(trustedCost(model)),residencyOf:residency}}function configuredEntries(cfg){let providers=cfg?.models?.providers??{};return Object.entries(providers).flatMap(([provider,pc])=>(pc?.models??[]).map(m=>({provider,id:m.id,cost:m.cost,api:m.api??pc.api,baseUrl:pc.baseUrl})))}function registryEntries(agentDir){return discoverModels(discoverAuthStorage(agentDir),agentDir).getAll().map(m=>({provider:m.provider,id:m.id,cost:m.cost,api:m.api,baseUrl:m.baseUrl}))}function loadOnPremCatalogView(params){let entries=configuredEntries(params?.cfg);try{entries.push(...registryEntries(params?.agentDir??resolveBuilderForceAgentsAgentDir()))}catch(err){logDebug(`[model-catalog-view] models.json unreadable, configured rows only: ${String(err)}`)}return catalogViewFromEntries(entries)}async function resolveRoleRoutedModel(params){try{let resolved=resolveModelRefFromString({raw:params.lead,defaultProvider:DEFAULT_PROVIDER,aliasIndex:buildModelAliasIndex({cfg:params.cfg,defaultProvider:DEFAULT_PROVIDER})});if(!resolved)return params.lead;let winner=(await seedLearnedModel({candidates:resolveFallbackCandidates({cfg:params.cfg,provider:resolved.ref.provider,model:resolved.ref.model}),...params.prompt==null?{}:{prompt:params.prompt},routing:{role:params.role,view:params.view??loadOnPremCatalogView({cfg:params.cfg})}})).ranked[0];return winner?candidateKey(winner):params.lead}catch(err){return logDebug(`[model-routing] role routing failed, keeping ${params.lead}: ${String(err)}`),params.lead}}async function resolveSubagentSpawnModel(params){let selection=resolveSubagentSpawnModelSelection(params);return(normalizeModelSelection(params.modelOverride)??resolveSubagentConfiguredModelSelection({cfg:params.cfg,agentId:params.agentId}))||!params.role?selection:resolveRoleRoutedModel({cfg:params.cfg,lead:selection,role:params.role,prompt:params.task})}function splitModelRef(ref){if(!ref)return{provider:void 0,model:void 0};let trimmed=ref.trim();if(!trimmed)return{provider:void 0,model:void 0};let[provider,model]=trimmed.split(`/`,2);return model?{provider,model}:{provider:void 0,model:trimmed}}async function spawnSubagentDirect(params,ctx){let task=params.task,label=params.label?.trim()||``,requestedAgentId=params.agentId,modelOverride=params.model,thinkingOverrideRaw=params.thinking,cleanup=params.cleanup===`keep`||params.cleanup===`delete`?params.cleanup:`keep`,requesterOrigin=normalizeDeliveryContext({channel:ctx.agentChannel,accountId:ctx.agentAccountId,to:ctx.agentTo,threadId:ctx.agentThreadId}),runTimeoutSeconds=typeof params.runTimeoutSeconds==`number`&&Number.isFinite(params.runTimeoutSeconds)?Math.max(0,Math.floor(params.runTimeoutSeconds)):0,modelApplied=!1,cfg=loadConfig(),{mainKey,alias}=resolveMainSessionAlias(cfg),requesterSessionKey=ctx.agentSessionKey,requesterInternalKey=requesterSessionKey?resolveInternalSessionKey({key:requesterSessionKey,alias,mainKey}):alias,requesterDisplayKey=resolveDisplaySessionKey({key:requesterInternalKey,alias,mainKey}),callerDepth=getSubagentDepthFromSessionStore(requesterInternalKey,{cfg}),maxSpawnDepth=cfg.agents?.defaults?.subagents?.maxSpawnDepth??1;if(callerDepth>=maxSpawnDepth)return{status:`forbidden`,error:`sessions_spawn is not allowed at this depth (current depth: ${callerDepth}, max: ${maxSpawnDepth})`};let maxChildren=cfg.agents?.defaults?.subagents?.maxChildrenPerAgent??5,activeChildren=await countActiveRunsForSession(requesterInternalKey);if(activeChildren>=maxChildren)return{status:`forbidden`,error:`sessions_spawn has reached max active children for this session (${activeChildren}/${maxChildren})`};let requesterAgentId=normalizeAgentId(ctx.requesterAgentIdOverride??parseAgentSessionKey(requesterInternalKey)?.agentId),targetAgentId=requestedAgentId?normalizeAgentId(requestedAgentId):requesterAgentId;if(targetAgentId!==requesterAgentId){let allowAgents=resolveAgentConfig(cfg,requesterAgentId)?.subagents?.allowAgents??[],allowAny=allowAgents.some(value=>value.trim()===`*`),normalizedTargetId=targetAgentId.toLowerCase(),allowSet=new Set(allowAgents.filter(value=>value.trim()&&value.trim()!==`*`).map(value=>normalizeAgentId(value).toLowerCase()));if(!allowAny&&!allowSet.has(normalizedTargetId))return{status:`forbidden`,error:`agentId is not allowed for sessions_spawn (allowed: ${allowSet.size>0?Array.from(allowSet).join(`, `):`none`})`}}if(params.roleConfig){cfg.agents||={list:[]};let agentsList=cfg.agents.list??(cfg.agents.list=[]),existingIdx=agentsList.findIndex(e=>normalizeAgentId(e.id)===targetAgentId),role=params.roleConfig,newEntry={id:targetAgentId,skills:role.tools,...role.model?{model:role.model}:{}};existingIdx>=0?agentsList[existingIdx]={...agentsList[existingIdx],...newEntry}:agentsList.push(newEntry),!modelOverride&&role.model&&(modelOverride=role.model),!thinkingOverrideRaw&&role.thinking&&(thinkingOverrideRaw=role.thinking)}let childSessionKey=`agent:${targetAgentId}:subagent:${crypto.randomUUID()}`,childDepth=callerDepth+1,spawnedByKey=requesterInternalKey,targetAgentConfig=resolveAgentConfig(cfg,targetAgentId),resolvedModel=await resolveSubagentSpawnModel({cfg,agentId:targetAgentId,modelOverride,role:modelRoleForAgentRole(params.roleConfig?.name),task}),resolvedThinkingDefaultRaw=readStringParam(targetAgentConfig?.subagents??{},`thinking`)??readStringParam(cfg.agents?.defaults?.subagents??{},`thinking`),thinkingOverride,thinkingCandidateRaw=thinkingOverrideRaw||resolvedThinkingDefaultRaw;if(thinkingCandidateRaw){let normalized=normalizeThinkLevel(thinkingCandidateRaw);if(!normalized){let{provider,model}=splitModelRef(resolvedModel);return{status:`error`,error:`Invalid thinking level "${thinkingCandidateRaw}". Use one of: ${formatThinkingLevels(provider,model)}.`}}thinkingOverride=normalized}try{await callGateway({method:`sessions.patch`,params:{key:childSessionKey,spawnDepth:childDepth},timeoutMs:1e4})}catch(err){return{status:`error`,error:err instanceof Error?err.message:typeof err==`string`?err:`error`,childSessionKey}}if(resolvedModel)try{await callGateway({method:`sessions.patch`,params:{key:childSessionKey,model:resolvedModel},timeoutMs:1e4}),modelApplied=!0}catch(err){return{status:`error`,error:err instanceof Error?err.message:typeof err==`string`?err:`error`,childSessionKey}}if(thinkingOverride!==void 0)try{await callGateway({method:`sessions.patch`,params:{key:childSessionKey,thinkingLevel:thinkingOverride===`off`?null:thinkingOverride},timeoutMs:1e4})}catch(err){return{status:`error`,error:err instanceof Error?err.message:typeof err==`string`?err:`error`,childSessionKey}}let childSystemPrompt=buildSubagentSystemPrompt({requesterSessionKey,requesterOrigin,childSessionKey,label:label||void 0,task,childDepth,maxSpawnDepth});if(params.roleConfig){params.roleConfig.systemPrompt&&(childSystemPrompt+=`
272
272
 
273
273
  --- Role Guidance ---
274
274
  `+params.roleConfig.systemPrompt);let personaBlock=buildPersonaSystemBlock(params.roleConfig);personaBlock&&(childSystemPrompt+=`
@@ -528,7 +528,7 @@ Critical rules from AGENTS.md:
528
528
  `)?fenceSplit.reopenFenceLine:`${fenceSplit.reopenFenceLine}\n`}${nextBuffer}`}if(emit(rawChunk),fenceSplit)this.#buffer=nextBuffer;else{let nextStart=breakIdx<this.#buffer.length&&/\s/.test(this.#buffer[breakIdx])?breakIdx+1:breakIdx;this.#buffer=stripLeadingNewlines(this.#buffer.slice(nextStart))}return!0}#pickSoftBreakIndex(buffer,minCharsOverride){let minChars=Math.max(1,Math.floor(minCharsOverride??this.#chunking.minChars));if(buffer.length<minChars)return{index:-1};let fenceSpans=parseFenceSpans(buffer),preference=this.#chunking.breakPreference??`paragraph`;if(preference===`paragraph`){let paragraphIdx=findSafeParagraphBreakIndex({text:buffer,fenceSpans,minChars,reverse:!1});if(paragraphIdx!==-1)return{index:paragraphIdx}}if(preference===`paragraph`||preference===`newline`){let newlineIdx=findSafeNewlineBreakIndex({text:buffer,fenceSpans,minChars,reverse:!1});if(newlineIdx!==-1)return{index:newlineIdx}}if(preference!==`newline`){let sentenceIdx=findSafeSentenceBreakIndex(buffer,fenceSpans,minChars);if(sentenceIdx!==-1)return{index:sentenceIdx}}return{index:-1}}#pickBreakIndex(buffer,minCharsOverride){let minChars=Math.max(1,Math.floor(minCharsOverride??this.#chunking.minChars)),maxChars=Math.max(minChars,Math.floor(this.#chunking.maxChars));if(buffer.length<minChars)return{index:-1};let window=buffer.slice(0,Math.min(maxChars,buffer.length)),fenceSpans=parseFenceSpans(buffer),preference=this.#chunking.breakPreference??`paragraph`;if(preference===`paragraph`){let paragraphIdx=findSafeParagraphBreakIndex({text:window,fenceSpans,minChars,reverse:!0});if(paragraphIdx!==-1)return{index:paragraphIdx}}if(preference===`paragraph`||preference===`newline`){let newlineIdx=findSafeNewlineBreakIndex({text:window,fenceSpans,minChars,reverse:!0});if(newlineIdx!==-1)return{index:newlineIdx}}if(preference!==`newline`){let sentenceIdx=findSafeSentenceBreakIndex(window,fenceSpans,minChars);if(sentenceIdx!==-1)return{index:sentenceIdx}}if(preference===`newline`&&buffer.length<maxChars)return{index:-1};for(let i=window.length-1;i>=minChars;i--)if(/\s/.test(window[i])&&isSafeFenceBreak(fenceSpans,i))return{index:i};if(buffer.length>=maxChars){if(isSafeFenceBreak(fenceSpans,maxChars))return{index:maxChars};let fence=findFenceSpanAt(fenceSpans,maxChars);return fence?{index:maxChars,fenceSplit:{closeFenceLine:`${fence.indent}${fence.marker}`,reopenFenceLine:fence.openLine}}:{index:maxChars}}return{index:-1}}};function stripLeadingNewlines(value){let i=0;for(;i<value.length&&value[i]===`
529
529
  `;)i++;return i>0?value.slice(i):value}function findNextParagraphBreak(buffer,fenceSpans,startIndex=0){if(startIndex<0)return null;let re=/\n[\t ]*\n+/g;re.lastIndex=startIndex;let match;for(;(match=re.exec(buffer))!==null;){let index=match.index??-1;if(!(index<0)&&isSafeFenceBreak(fenceSpans,index))return{index,length:match[0].length}}return null}function resolveTelegramDraftStreamingChunking(cfg,accountId){let providerChunkLimit=getChannelDock(`telegram`)?.outbound?.textChunkLimit,textLimit=resolveTextChunkLimit(cfg,`telegram`,accountId,{fallbackLimit:providerChunkLimit}),normalizedAccountId=normalizeAccountId$3(accountId),draftCfg=cfg?.channels?.telegram?.accounts?.[normalizedAccountId]?.draftChunk??cfg?.channels?.telegram?.draftChunk,maxRequested=Math.max(1,Math.floor(draftCfg?.maxChars??800)),maxChars=Math.max(1,Math.min(maxRequested,textLimit)),minRequested=Math.max(1,Math.floor(draftCfg?.minChars??200));return{minChars:Math.min(minRequested,maxChars),maxChars,breakPreference:draftCfg?.breakPreference===`newline`||draftCfg?.breakPreference===`sentence`?draftCfg.breakPreference:`paragraph`}}const TELEGRAM_STREAM_MAX_CHARS=4096;function createTelegramDraftStream(params){let maxChars=Math.min(params.maxChars??TELEGRAM_STREAM_MAX_CHARS,TELEGRAM_STREAM_MAX_CHARS),throttleMs=Math.max(250,params.throttleMs??1e3),minInitialChars=params.minInitialChars,chatId=params.chatId,threadParams=buildTelegramThreadParams(params.thread),replyParams=params.replyToMessageId==null?threadParams:{...threadParams,reply_to_message_id:params.replyToMessageId},streamMessageId,lastSentText=``,stopped=!1,isFinal=!1,loop=createDraftStreamLoop({throttleMs,isStopped:()=>stopped,sendOrEditStreamMessage:async text=>{if(stopped&&!isFinal)return!1;let trimmed=text.trimEnd();if(!trimmed)return!1;if(trimmed.length>maxChars)return stopped=!0,params.warn?.(`telegram stream preview stopped (text length ${trimmed.length} > ${maxChars})`),!1;if(trimmed===lastSentText)return!0;if(typeof streamMessageId!=`number`&&minInitialChars!=null&&!isFinal&&trimmed.length<minInitialChars)return!1;lastSentText=trimmed;try{if(typeof streamMessageId==`number`)return await params.api.editMessageText(chatId,streamMessageId,trimmed),!0;let sentMessageId=(await params.api.sendMessage(chatId,trimmed,replyParams))?.message_id;return typeof sentMessageId!=`number`||!Number.isFinite(sentMessageId)?(stopped=!0,params.warn?.(`telegram stream preview stopped (missing message id from sendMessage)`),!1):(streamMessageId=Math.trunc(sentMessageId),!0)}catch(err){return stopped=!0,params.warn?.(`telegram stream preview failed: ${err instanceof Error?err.message:String(err)}`),!1}}});return params.log?.(`telegram stream preview ready (maxChars=${maxChars}, throttleMs=${throttleMs})`),{update:text=>{stopped||isFinal||loop.update(text)},flush:loop.flush,messageId:()=>streamMessageId,clear:async()=>{stopped=!0,loop.stop(),await loop.waitForInFlight();let messageId=streamMessageId;if(streamMessageId=void 0,typeof messageId==`number`)try{await params.api.deleteMessage(chatId,messageId)}catch(err){params.warn?.(`telegram stream preview cleanup failed: ${err instanceof Error?err.message:String(err)}`)}},stop:async()=>{isFinal=!0,await loop.flush()},forceNewMessage:()=>{streamMessageId=void 0,lastSentText=``,loop.resetPending()}}}async function resolveStickerVisionSupport(cfg,agentId){try{let catalog=await loadModelCatalog({config:cfg}),defaultModel=resolveDefaultModelForAgent({cfg,agentId}),entry=findModelInCatalog(catalog,defaultModel.provider,defaultModel.model);return entry?modelSupportsVision(entry):!1}catch{return!1}}const dispatchTelegramMessage=async({context,bot,cfg,runtime,replyToMode,streamMode,textLimit,telegramCfg,opts})=>{let{ctxPayload,msg,chatId,isGroup,threadSpec,historyKey,historyLimit,groupHistories,route,skillFilter,sendTyping,sendRecordVoice,ackReactionPromise,reactionApi,removeAckAfterReply}=context,draftMaxChars=Math.min(textLimit,4096),accountBlockStreamingEnabled=typeof telegramCfg.blockStreaming==`boolean`?telegramCfg.blockStreaming:cfg.agents?.defaults?.blockStreamingDefault===`on`,canStreamDraft=streamMode!==`off`&&!accountBlockStreamingEnabled,draftReplyToMessageId=replyToMode!==`off`&&typeof msg.message_id==`number`?msg.message_id:void 0,draftStream=canStreamDraft?createTelegramDraftStream({api:bot.api,chatId,maxChars:draftMaxChars,thread:threadSpec,replyToMessageId:draftReplyToMessageId,minInitialChars:30,log:logVerbose,warn:logVerbose}):void 0,draftChunking=draftStream&&streamMode===`block`?resolveTelegramDraftStreamingChunking(cfg,route.accountId):void 0,shouldSplitPreviewMessages=streamMode===`block`,draftChunker=draftChunking?new EmbeddedBlockChunker(draftChunking):void 0,mediaLocalRoots=getAgentScopedMediaLocalRoots(cfg,route.agentId),lastPartialText=``,draftText=``,hasStreamedMessage=!1,updateDraftFromPartial=text=>{if(!draftStream||!text||text===lastPartialText)return;if(hasStreamedMessage=!0,streamMode===`partial`){if(lastPartialText&&lastPartialText.startsWith(text)&&text.length<lastPartialText.length)return;lastPartialText=text,draftStream.update(text);return}let delta=text;if(text.startsWith(lastPartialText)?delta=text.slice(lastPartialText.length):(draftChunker?.reset(),draftText=``),lastPartialText=text,delta){if(!draftChunker){draftText=text,draftStream.update(draftText);return}draftChunker.append(delta),draftChunker.drain({force:!1,emit:chunk=>{draftText+=chunk,draftStream.update(draftText)}})}},flushDraft=async()=>{draftStream&&(draftChunker?.hasBuffered()&&(draftChunker.drain({force:!0,emit:chunk=>{draftText+=chunk}}),draftChunker.reset(),draftText&&draftStream.update(draftText)),await draftStream.flush())},disableBlockStreaming=typeof telegramCfg.blockStreaming==`boolean`?!telegramCfg.blockStreaming:draftStream||streamMode===`off`?!0:void 0,{onModelSelected,...prefixOptions}=createReplyPrefixOptions({cfg,agentId:route.agentId,channel:`telegram`,accountId:route.accountId}),tableMode=resolveMarkdownTableMode({cfg,channel:`telegram`,accountId:route.accountId}),chunkMode=resolveChunkMode(cfg,`telegram`,route.accountId),sticker=ctxPayload.Sticker;if(sticker?.fileId&&sticker.fileUniqueId&&ctxPayload.MediaPath){let agentDir=resolveAgentDir(cfg,route.agentId),stickerSupportsVision=await resolveStickerVisionSupport(cfg,route.agentId),description=sticker.cachedDescription??null;if(description||=await describeStickerImage({imagePath:ctxPayload.MediaPath,cfg,agentDir,agentId:route.agentId}),description){let stickerContext=[sticker.emoji,sticker.setName?`from "${sticker.setName}"`:null].filter(Boolean).join(` `),formattedDesc=`[Sticker${stickerContext?` ${stickerContext}`:``}] ${description}`;sticker.cachedDescription=description,stickerSupportsVision||(ctxPayload.Body=formattedDesc,ctxPayload.BodyForAgent=formattedDesc,ctxPayload.MediaPath=void 0,ctxPayload.MediaType=void 0,ctxPayload.MediaUrl=void 0,ctxPayload.MediaPaths=void 0,ctxPayload.MediaUrls=void 0,ctxPayload.MediaTypes=void 0),sticker.fileId?(cacheSticker({fileId:sticker.fileId,fileUniqueId:sticker.fileUniqueId,emoji:sticker.emoji,setName:sticker.setName,description,cachedAt:new Date().toISOString(),receivedFrom:ctxPayload.From}),logVerbose(`telegram: cached sticker description for ${sticker.fileUniqueId}`)):logVerbose(`telegram: skipped sticker cache (missing fileId)`)}}let replyQuoteText=ctxPayload.ReplyToIsQuote&&ctxPayload.ReplyToBody&&ctxPayload.ReplyToBody.trim()||void 0,deliveryState={delivered:!1,skippedNonSilent:0},finalizedViaPreviewMessage=!1,clearGroupHistory=()=>{isGroup&&historyKey&&clearHistoryEntriesIfEnabled({historyMap:groupHistories,historyKey,limit:historyLimit})},deliveryBaseOptions={chatId:String(chatId),token:opts.token,runtime,bot,mediaLocalRoots,replyToMode,textLimit,thread:threadSpec,tableMode,chunkMode,linkPreview:telegramCfg.linkPreview,replyQuoteText},queuedFinal=!1;try{({queuedFinal}=await dispatchReplyWithBufferedBlockDispatcher({ctx:ctxPayload,cfg,dispatcherOptions:{...prefixOptions,deliver:async(payload,info)=>{if(info.kind===`final`){await flushDraft();let hasMedia=!!payload.mediaUrl||(payload.mediaUrls?.length??0)>0,previewMessageId=draftStream?.messageId(),finalText=payload.text,currentPreviewText=streamMode===`block`?draftText:lastPartialText,previewButtons=payload.channelData?.telegram?.buttons,draftStoppedForPreviewEdit=!1;if(!finalizedViaPreviewMessage&&!hasMedia&&typeof finalText==`string`&&finalText.length>0&&typeof previewMessageId==`number`&&finalText.length<=draftMaxChars&&!payload.isError){if(await draftStream?.stop(),draftStoppedForPreviewEdit=!0,currentPreviewText&&currentPreviewText.startsWith(finalText)&&finalText.length<currentPreviewText.length)return;try{await editMessageTelegram(chatId,previewMessageId,finalText,{api:bot.api,cfg,accountId:route.accountId,linkPreview:telegramCfg.linkPreview,buttons:previewButtons}),finalizedViaPreviewMessage=!0,deliveryState.delivered=!0;return}catch(err){logVerbose(`telegram: preview final edit failed; falling back to standard send (${String(err)})`)}}!hasMedia&&!payload.isError&&typeof finalText==`string`&&finalText.length>draftMaxChars&&logVerbose(`telegram: preview final too long for edit (${finalText.length} > ${draftMaxChars}); falling back to standard send`),draftStoppedForPreviewEdit||await draftStream?.stop();let messageIdAfterStop=draftStream?.messageId();if(!finalizedViaPreviewMessage&&typeof messageIdAfterStop==`number`&&typeof finalText==`string`&&finalText.length>0&&finalText.length<=draftMaxChars&&!hasMedia&&!payload.isError)try{await editMessageTelegram(chatId,messageIdAfterStop,finalText,{api:bot.api,cfg,accountId:route.accountId,linkPreview:telegramCfg.linkPreview,buttons:previewButtons}),finalizedViaPreviewMessage=!0,deliveryState.delivered=!0;return}catch(err){logVerbose(`telegram: post-stop preview edit failed; falling back to standard send (${String(err)})`)}}(await deliverReplies({...deliveryBaseOptions,replies:[payload],onVoiceRecording:sendRecordVoice})).delivered&&(deliveryState.delivered=!0)},onSkip:(_payload,info)=>{info.reason!==`silent`&&(deliveryState.skippedNonSilent+=1)},onError:(err,info)=>{runtime.error?.(danger(`telegram ${info.kind} reply failed: ${String(err)}`))},onReplyStart:createTypingCallbacks({start:sendTyping,onStartError:err=>{logTypingFailure({log:logVerbose,channel:`telegram`,target:String(chatId),error:err})}}).onReplyStart},replyOptions:{skillFilter,disableBlockStreaming,onPartialReply:draftStream?payload=>updateDraftFromPartial(payload.text):void 0,onAssistantMessageStart:draftStream?()=>{logVerbose(`telegram: onAssistantMessageStart called, hasStreamedMessage=${hasStreamedMessage}`),shouldSplitPreviewMessages&&hasStreamedMessage&&(logVerbose(`telegram: calling forceNewMessage()`),draftStream.forceNewMessage()),lastPartialText=``,draftText=``,draftChunker?.reset()}:void 0,onReasoningEnd:draftStream?()=>{shouldSplitPreviewMessages&&hasStreamedMessage&&draftStream.forceNewMessage(),lastPartialText=``,draftText=``,draftChunker?.reset()}:void 0,onModelSelected}}))}finally{await draftStream?.stop(),finalizedViaPreviewMessage||await draftStream?.clear()}let sentFallback=!1;if(!deliveryState.delivered&&deliveryState.skippedNonSilent>0&&(sentFallback=(await deliverReplies({replies:[{text:`No response generated. Please try again.`}],...deliveryBaseOptions})).delivered),!(queuedFinal||sentFallback)){clearGroupHistory();return}removeAckReactionAfterReply({removeAfterReply:removeAckAfterReply,ackReactionPromise,ackReactionValue:ackReactionPromise?`ack`:null,remove:()=>reactionApi?.(chatId,msg.message_id??0,[])??Promise.resolve(),onError:err=>{msg.message_id&&logAckFailure({log:logVerbose,channel:`telegram`,target:`${chatId}/${msg.message_id}`,error:err})}}),clearGroupHistory()},createTelegramMessageProcessor=deps=>{let{bot,cfg,account,telegramCfg,historyLimit,groupHistories,dmPolicy,allowFrom,groupAllowFrom,ackReactionScope,logger,resolveGroupActivation,resolveGroupRequireMention,resolveTelegramGroupConfig,runtime,replyToMode,streamMode,textLimit,opts}=deps;return async(primaryCtx,allMedia,storeAllowFrom,options)=>{let context=await buildTelegramMessageContext({primaryCtx,allMedia,storeAllowFrom,options,bot,cfg,account,historyLimit,groupHistories,dmPolicy,allowFrom,groupAllowFrom,ackReactionScope,logger,resolveGroupActivation,resolveGroupRequireMention,resolveTelegramGroupConfig});context&&await dispatchTelegramMessage({context,bot,cfg,runtime,replyToMode,streamMode,textLimit,telegramCfg,opts})}};function buildPluginTelegramMenuCommands(params){let{specs,existingCommands}=params,commands=[],issues=[],pluginCommandNames=new Set;for(let spec of specs){let normalized=normalizeTelegramCommandName(spec.name);if(!normalized||!TELEGRAM_COMMAND_NAME_PATTERN.test(normalized)){issues.push(`Plugin command "/${spec.name}" is invalid for Telegram (use a-z, 0-9, underscore; max 32 chars).`);continue}let description=spec.description.trim();if(!description){issues.push(`Plugin command "/${normalized}" is missing a description.`);continue}if(existingCommands.has(normalized)){pluginCommandNames.has(normalized)?issues.push(`Plugin command "/${normalized}" is duplicated.`):issues.push(`Plugin command "/${normalized}" conflicts with an existing Telegram command.`);continue}pluginCommandNames.add(normalized),existingCommands.add(normalized),commands.push({command:normalized,description})}return{commands,issues}}function buildCappedTelegramMenuCommands(params){let{allCommands}=params,maxCommands=params.maxCommands??100,totalCommands=allCommands.length,overflowCount=Math.max(0,totalCommands-maxCommands);return{commandsToRegister:allCommands.slice(0,maxCommands),totalCommands,maxCommands,overflowCount}}function syncTelegramMenuCommands(params){let{bot,runtime,commandsToRegister}=params;(async()=>{typeof bot.api.deleteMyCommands==`function`&&await withTelegramApiErrorLogging({operation:`deleteMyCommands`,runtime,fn:()=>bot.api.deleteMyCommands()}).catch(()=>{}),commandsToRegister.length!==0&&await withTelegramApiErrorLogging({operation:`setMyCommands`,runtime,fn:()=>bot.api.setMyCommands(commandsToRegister)})})().catch(err=>{runtime.error?.(`Telegram command sync failed: ${String(err)}`)})}async function resolveTelegramCommandAuth(params){let{msg,bot,cfg,accountId,telegramCfg,allowFrom,groupAllowFrom,useAccessGroups,resolveGroupPolicy,resolveTelegramGroupConfig,requireAuth}=params,chatId=msg.chat.id,isGroup=msg.chat.type===`group`||msg.chat.type===`supergroup`,messageThreadId=msg.message_thread_id,isForum=msg.chat.is_forum===!0,{resolvedThreadId,storeAllowFrom,groupConfig,topicConfig,effectiveGroupAllow,hasGroupAllowOverride}=await resolveTelegramGroupAllowFromContext({chatId,accountId,isForum,messageThreadId,groupAllowFrom,resolveTelegramGroupConfig}),senderId=msg.from?.id?String(msg.from.id):``,senderUsername=msg.from?.username??``,sendAuthMessage=async text=>(await withTelegramApiErrorLogging({operation:`sendMessage`,fn:()=>bot.api.sendMessage(chatId,text)}),null),rejectNotAuthorized=async()=>await sendAuthMessage(`You are not authorized to use this command.`),baseAccess=evaluateTelegramGroupBaseAccess({isGroup,groupConfig,topicConfig,hasGroupAllowOverride,effectiveGroupAllow,senderId,senderUsername,enforceAllowOverride:requireAuth,requireSenderForAllowOverride:!0});if(!baseAccess.allowed)return baseAccess.reason===`group-disabled`?await sendAuthMessage(`This group is disabled.`):baseAccess.reason===`topic-disabled`?await sendAuthMessage(`This topic is disabled.`):await rejectNotAuthorized();let policyAccess=evaluateTelegramGroupPolicyAccess({isGroup,chatId,cfg,telegramCfg,topicConfig,groupConfig,effectiveGroupAllow,senderId,senderUsername,resolveGroupPolicy,enforcePolicy:useAccessGroups,useTopicAndGroupOverrides:!1,enforceAllowlistAuthorization:requireAuth,allowEmptyAllowlistEntries:!0,requireSenderForAllowlistAuthorization:!0,checkChatAllowlist:useAccessGroups});if(!policyAccess.allowed){if(policyAccess.reason===`group-policy-disabled`)return await sendAuthMessage(`Telegram group commands are disabled.`);if(policyAccess.reason===`group-policy-allowlist-no-sender`||policyAccess.reason===`group-policy-allowlist-unauthorized`)return await rejectNotAuthorized();if(policyAccess.reason===`group-chat-not-allowed`)return await sendAuthMessage(`This group is not allowed.`)}let dmAllow=normalizeAllowFromWithStore$1({allowFrom,storeAllowFrom}),senderAllowed=isSenderAllowed$1({allow:dmAllow,senderId,senderUsername}),commandAuthorized=resolveCommandAuthorizedFromAuthorizers({useAccessGroups,authorizers:[{configured:dmAllow.hasEntries,allowed:senderAllowed}],modeWhenAccessGroupsOff:`configured`});return requireAuth&&!commandAuthorized?await rejectNotAuthorized():{chatId,isGroup,isForum,resolvedThreadId,senderId,senderUsername,groupConfig,topicConfig,commandAuthorized}}const registerTelegramNativeCommands=({bot,cfg,runtime,accountId,telegramCfg,allowFrom,groupAllowFrom,replyToMode,textLimit,useAccessGroups,nativeEnabled,nativeSkillsEnabled,nativeDisabledExplicit,resolveGroupPolicy,resolveTelegramGroupConfig,shouldSkipUpdate,opts})=>{let boundRoute=nativeEnabled&&nativeSkillsEnabled?resolveAgentRoute({cfg,channel:`telegram`,accountId}):null,boundAgentIds=boundRoute?[boundRoute.agentId]:null,skillCommands=nativeEnabled&&nativeSkillsEnabled?listSkillCommandsForAgents(boundAgentIds?{cfg,agentIds:boundAgentIds}:{cfg}):[],nativeCommands=nativeEnabled?listNativeCommandSpecsForConfig(cfg,{skillCommands,provider:`telegram`}):[],reservedCommands=new Set(listNativeCommandSpecs().map(command=>normalizeTelegramCommandName(command.name)));for(let command of skillCommands)reservedCommands.add(command.name.toLowerCase());let customResolution=resolveTelegramCustomCommands({commands:telegramCfg.customCommands,reservedCommands});for(let issue of customResolution.issues)runtime.error?.(danger(issue.message));let customCommands=customResolution.commands,pluginCatalog=buildPluginTelegramMenuCommands({specs:getPluginCommandSpecs(),existingCommands:new Set([...nativeCommands.map(command=>normalizeTelegramCommandName(command.name)),...customCommands.map(command=>command.command)].map(command=>command.toLowerCase()))});for(let issue of pluginCatalog.issues)runtime.error?.(danger(issue));let{commandsToRegister,totalCommands,maxCommands,overflowCount}=buildCappedTelegramMenuCommands({allCommands:[...nativeCommands.map(command=>{let normalized=normalizeTelegramCommandName(command.name);return TELEGRAM_COMMAND_NAME_PATTERN.test(normalized)?{command:normalized,description:command.description}:(runtime.error?.(danger(`Native command "${command.name}" is invalid for Telegram (resolved to "${normalized}"). Skipping.`)),null)}).filter(cmd=>cmd!==null),...nativeEnabled?pluginCatalog.commands:[],...customCommands]});overflowCount>0&&runtime.log?.(`Telegram limits bots to ${maxCommands} commands. ${totalCommands} configured; registering first ${maxCommands}. Use channels.telegram.commands.native: false to disable, or reduce plugin/skill/custom commands.`),syncTelegramMenuCommands({bot,runtime,commandsToRegister});let resolveCommandRuntimeContext=params=>{let{msg,isGroup,isForum,resolvedThreadId}=params,chatId=msg.chat.id,messageThreadId=msg.message_thread_id,threadSpec=resolveTelegramThreadSpec({isGroup,isForum,messageThreadId}),parentPeer=buildTelegramParentPeer({isGroup,resolvedThreadId,chatId}),route=resolveAgentRoute({cfg,channel:`telegram`,accountId,peer:{kind:isGroup?`group`:`direct`,id:isGroup?buildTelegramGroupPeerId(chatId,resolvedThreadId):String(chatId)},parentPeer});return{chatId,threadSpec,route,mediaLocalRoots:getAgentScopedMediaLocalRoots(cfg,route.agentId),tableMode:resolveMarkdownTableMode({cfg,channel:`telegram`,accountId:route.accountId}),chunkMode:resolveChunkMode(cfg,`telegram`,route.accountId)}},buildCommandDeliveryBaseOptions=params=>({chatId:String(params.chatId),token:opts.token,runtime,bot,mediaLocalRoots:params.mediaLocalRoots,replyToMode,textLimit,thread:params.threadSpec,tableMode:params.tableMode,chunkMode:params.chunkMode,linkPreview:telegramCfg.linkPreview});if(commandsToRegister.length>0||pluginCatalog.commands.length>0)if(typeof bot.command!=`function`)logVerbose(`telegram: bot.command unavailable; skipping native handlers`);else{for(let command of nativeCommands){let normalizedCommandName=normalizeTelegramCommandName(command.name);bot.command(normalizedCommandName,async ctx=>{let msg=ctx.message;if(!msg||shouldSkipUpdate(ctx))return;let auth=await resolveTelegramCommandAuth({msg,bot,cfg,accountId,telegramCfg,allowFrom,groupAllowFrom,useAccessGroups,resolveGroupPolicy,resolveTelegramGroupConfig,requireAuth:!0});if(!auth)return;let{chatId,isGroup,isForum,resolvedThreadId,senderId,senderUsername,groupConfig,topicConfig,commandAuthorized}=auth,{threadSpec,route,mediaLocalRoots,tableMode,chunkMode}=resolveCommandRuntimeContext({msg,isGroup,isForum,resolvedThreadId}),deliveryBaseOptions=buildCommandDeliveryBaseOptions({chatId,mediaLocalRoots,threadSpec,tableMode,chunkMode}),threadParams=buildTelegramThreadParams(threadSpec)??{},commandDefinition=findCommandByNativeName(command.name,`telegram`),rawText=ctx.match?.trim()??``,commandArgs=commandDefinition?parseCommandArgs(commandDefinition,rawText):rawText?{raw:rawText}:void 0,prompt=commandDefinition?buildCommandTextFromArgs(commandDefinition,commandArgs):rawText?`/${command.name} ${rawText}`:`/${command.name}`,menu=commandDefinition?resolveCommandArgMenu({command:commandDefinition,args:commandArgs,cfg}):null;if(menu&&commandDefinition){let title=menu.title??`Choose ${menu.arg.description||menu.arg.name} for /${commandDefinition.nativeName??commandDefinition.key}.`,rows=[];for(let i=0;i<menu.choices.length;i+=2){let slice=menu.choices.slice(i,i+2);rows.push(slice.map(choice=>{let args={values:{[menu.arg.name]:choice.value}};return{text:choice.label,callback_data:buildCommandTextFromArgs(commandDefinition,args)}}))}let replyMarkup=buildInlineKeyboard(rows);await withTelegramApiErrorLogging({operation:`sendMessage`,runtime,fn:()=>bot.api.sendMessage(chatId,title,{...replyMarkup?{reply_markup:replyMarkup}:{},...threadParams})});return}let baseSessionKey=route.sessionKey,dmThreadId=threadSpec.scope===`dm`?threadSpec.id:void 0,sessionKey=(dmThreadId==null?null:resolveThreadSessionKeys({baseSessionKey,threadId:String(dmThreadId)}))?.sessionKey??baseSessionKey,skillFilter=firstDefined$2(topicConfig?.skills,groupConfig?.skills),systemPromptParts=[groupConfig?.systemPrompt?.trim()||null,topicConfig?.systemPrompt?.trim()||null].filter(entry=>!!entry),groupSystemPrompt=systemPromptParts.length>0?systemPromptParts.join(`
530
530
 
531
- `):void 0,conversationLabel=isGroup?msg.chat.title?`${msg.chat.title} id:${chatId}`:`group:${chatId}`:buildSenderName(msg)??String(senderId||chatId),ctxPayload=finalizeInboundContext({Body:prompt,BodyForAgent:prompt,RawBody:prompt,CommandBody:prompt,CommandArgs:commandArgs,From:isGroup?buildTelegramGroupFrom(chatId,resolvedThreadId):`telegram:${chatId}`,To:`slash:${senderId||chatId}`,ChatType:isGroup?`group`:`direct`,ConversationLabel:conversationLabel,GroupSubject:isGroup?msg.chat.title??void 0:void 0,GroupSystemPrompt:isGroup?groupSystemPrompt:void 0,SenderName:buildSenderName(msg),SenderId:senderId||void 0,SenderUsername:senderUsername||void 0,Surface:`telegram`,MessageSid:String(msg.message_id),Timestamp:msg.date?msg.date*1e3:void 0,WasMentioned:!0,CommandAuthorized:commandAuthorized,CommandSource:`native`,SessionKey:`telegram:slash:${senderId||chatId}`,AccountId:route.accountId,CommandTargetSessionKey:sessionKey,MessageThreadId:threadSpec.id,IsForum:isForum,OriginatingChannel:`telegram`,OriginatingTo:`telegram:${chatId}`}),disableBlockStreaming=typeof telegramCfg.blockStreaming==`boolean`?!telegramCfg.blockStreaming:void 0,deliveryState={delivered:!1,skippedNonSilent:0},{onModelSelected,...prefixOptions}=createReplyPrefixOptions({cfg,agentId:route.agentId,channel:`telegram`,accountId:route.accountId});await dispatchReplyWithBufferedBlockDispatcher({ctx:ctxPayload,cfg,dispatcherOptions:{...prefixOptions,deliver:async(payload,_info)=>{(await deliverReplies({replies:[payload],...deliveryBaseOptions})).delivered&&(deliveryState.delivered=!0)},onSkip:(_payload,info)=>{info.reason!==`silent`&&(deliveryState.skippedNonSilent+=1)},onError:(err,info)=>{runtime.error?.(danger(`telegram slash ${info.kind} reply failed: ${String(err)}`))}},replyOptions:{skillFilter,disableBlockStreaming,onModelSelected}}),!deliveryState.delivered&&deliveryState.skippedNonSilent>0&&await deliverReplies({replies:[{text:`No response generated. Please try again.`}],...deliveryBaseOptions})})}for(let pluginCommand of pluginCatalog.commands)bot.command(pluginCommand.command,async ctx=>{let msg=ctx.message;if(!msg||shouldSkipUpdate(ctx))return;let chatId=msg.chat.id,rawText=ctx.match?.trim()??``,commandBody=`/${pluginCommand.command}${rawText?` ${rawText}`:``}`,match=matchPluginCommand(commandBody);if(!match){await withTelegramApiErrorLogging({operation:`sendMessage`,runtime,fn:()=>bot.api.sendMessage(chatId,`Command not found.`)});return}let auth=await resolveTelegramCommandAuth({msg,bot,cfg,accountId,telegramCfg,allowFrom,groupAllowFrom,useAccessGroups,resolveGroupPolicy,resolveTelegramGroupConfig,requireAuth:match.command.requireAuth!==!1});if(!auth)return;let{senderId,commandAuthorized,isGroup,isForum,resolvedThreadId}=auth,{threadSpec,mediaLocalRoots,tableMode,chunkMode}=resolveCommandRuntimeContext({msg,isGroup,isForum,resolvedThreadId}),deliveryBaseOptions=buildCommandDeliveryBaseOptions({chatId,mediaLocalRoots,threadSpec,tableMode,chunkMode}),from=isGroup?buildTelegramGroupFrom(chatId,threadSpec.id):`telegram:${chatId}`,to=`telegram:${chatId}`;await deliverReplies({replies:[await executePluginCommand({command:match.command,args:match.args,senderId,channel:`telegram`,isAuthorizedSender:commandAuthorized,commandBody,config:cfg,from,to,accountId,messageThreadId:threadSpec.id})],...deliveryBaseOptions})})}else nativeDisabledExplicit&&withTelegramApiErrorLogging({operation:`setMyCommands`,runtime,fn:()=>bot.api.setMyCommands([])}).catch(()=>{})};function getTelegramSequentialKey(ctx){let reaction=ctx.update?.message_reaction;if(reaction?.chat?.id)return`telegram:${reaction.chat.id}`;let msg=ctx.message??ctx.channelPost??ctx.editedChannelPost??ctx.update?.message??ctx.update?.edited_message??ctx.update?.channel_post??ctx.update?.edited_channel_post??ctx.update?.callback_query?.message,chatId=msg?.chat?.id??ctx.chat?.id,rawText=msg?.text??msg?.caption,botUsername=ctx.me?.username;if(isAbortRequestText(rawText,botUsername?{botUsername}:void 0))return typeof chatId==`number`?`telegram:${chatId}:control`:`telegram:control`;let isGroup=msg?.chat?.type===`group`||msg?.chat?.type===`supergroup`,messageThreadId=msg?.message_thread_id,isForum=msg?.chat?.is_forum,threadId=isGroup?resolveTelegramForumThreadId({isForum,messageThreadId}):messageThreadId;return typeof chatId==`number`?threadId==null?`telegram:${chatId}`:`telegram:${chatId}:topic:${threadId}`:`telegram:unknown`}function createTelegramBot(opts){let runtime=opts.runtime??{log:console.log,error:console.error,exit:code=>{throw Error(`exit ${code}`)}},cfg=opts.config??loadConfig(),account=resolveTelegramAccount({cfg,accountId:opts.accountId}),telegramCfg=account.config,fetchImpl=resolveTelegramFetch(opts.proxyFetch,{network:telegramCfg.network}),shouldProvideFetch=!!fetchImpl,fetchForClient=fetchImpl,timeoutSeconds=typeof telegramCfg?.timeoutSeconds==`number`&&Number.isFinite(telegramCfg.timeoutSeconds)?Math.max(1,Math.floor(telegramCfg.timeoutSeconds)):void 0,client=shouldProvideFetch||timeoutSeconds?{...shouldProvideFetch&&fetchImpl?{fetch:fetchForClient}:{},...timeoutSeconds?{timeoutSeconds}:{}}:void 0,bot=new Bot(opts.token,client?{client}:void 0);bot.api.config.use(apiThrottler()),bot.use(sequentialize(getTelegramSequentialKey)),bot.catch(err=>{runtime.error?.(danger(`telegram bot error: ${formatUncaughtError(err)}`))});let recentUpdates=createTelegramUpdateDedupe(),lastUpdateId=typeof opts.updateOffset?.lastUpdateId==`number`?opts.updateOffset.lastUpdateId:null,recordUpdateId=ctx=>{let updateId=resolveTelegramUpdateId(ctx);typeof updateId==`number`&&(lastUpdateId!==null&&updateId<=lastUpdateId||(lastUpdateId=updateId,opts.updateOffset?.onUpdateId?.(updateId)))},shouldSkipUpdate=ctx=>{let updateId=resolveTelegramUpdateId(ctx);if(typeof updateId==`number`&&lastUpdateId!==null&&updateId<=lastUpdateId)return!0;let key=buildTelegramUpdateKey(ctx),skipped=recentUpdates.check(key);return skipped&&key&&shouldLogVerbose()&&logVerbose(`telegram dedupe: skipped ${key}`),skipped},rawUpdateLogger=createSubsystemLogger(`gateway/channels/telegram/raw-update`),MAX_RAW_UPDATE_CHARS=8e3,stringifyUpdate=update=>{let seen=new WeakSet;return JSON.stringify(update??null,(key,value)=>{if(typeof value==`string`&&value.length>500)return`${value.slice(0,500)}...`;if(Array.isArray(value)&&value.length>20)return[...value.slice(0,20),`...(${value.length-20} more)`];if(value&&typeof value==`object`){if(seen.has(value))return`[Circular]`;seen.add(value)}return value})};bot.use(async(ctx,next)=>{if(shouldLogVerbose())try{let raw=stringifyUpdate(ctx.update),preview=raw.length>MAX_RAW_UPDATE_CHARS?`${raw.slice(0,MAX_RAW_UPDATE_CHARS)}...`:raw;rawUpdateLogger.debug(`telegram update: ${preview}`)}catch(err){rawUpdateLogger.debug(`telegram update log failed: ${String(err)}`)}await next(),recordUpdateId(ctx)});let historyLimit=Math.max(0,telegramCfg.historyLimit??cfg.messages?.groupChat?.historyLimit??50),groupHistories=new Map,textLimit=resolveTextChunkLimit(cfg,`telegram`,account.accountId),dmPolicy=telegramCfg.dmPolicy??`pairing`,allowFrom=opts.allowFrom??telegramCfg.allowFrom,groupAllowFrom=opts.groupAllowFrom??telegramCfg.groupAllowFrom??(telegramCfg.allowFrom&&telegramCfg.allowFrom.length>0?telegramCfg.allowFrom:void 0)??(opts.allowFrom&&opts.allowFrom.length>0?opts.allowFrom:void 0),replyToMode=opts.replyToMode??telegramCfg.replyToMode??`off`,nativeEnabled=resolveNativeCommandsEnabled({providerId:`telegram`,providerSetting:telegramCfg.commands?.native,globalSetting:cfg.commands?.native}),nativeSkillsEnabled=resolveNativeSkillsEnabled({providerId:`telegram`,providerSetting:telegramCfg.commands?.nativeSkills,globalSetting:cfg.commands?.nativeSkills}),nativeDisabledExplicit=isNativeCommandsExplicitlyDisabled({providerSetting:telegramCfg.commands?.native,globalSetting:cfg.commands?.native}),useAccessGroups=cfg.commands?.useAccessGroups!==!1,ackReactionScope=cfg.messages?.ackReactionScope??`group-mentions`,mediaMaxBytes=(opts.mediaMaxMb??telegramCfg.mediaMaxMb??5)*1024*1024,logger=getChildLogger({module:`telegram-auto-reply`}),streamMode=resolveTelegramStreamMode(telegramCfg),resolveGroupPolicy=chatId=>resolveChannelGroupPolicy({cfg,channel:`telegram`,accountId:account.accountId,groupId:String(chatId)}),resolveGroupActivation=params=>{let agentId=params.agentId??resolveDefaultAgentId(cfg),sessionKey=params.sessionKey??`agent:${agentId}:telegram:group:${buildTelegramGroupPeerId(params.chatId,params.messageThreadId)}`,storePath=resolveStorePath(cfg.session?.store,{agentId});try{let entry=loadSessionStore(storePath)[sessionKey];if(entry?.groupActivation===`always`)return!1;if(entry?.groupActivation===`mention`)return!0}catch(err){logVerbose(`Failed to load session for activation check: ${String(err)}`)}},resolveGroupRequireMention=chatId=>resolveChannelGroupRequireMention({cfg,channel:`telegram`,accountId:account.accountId,groupId:String(chatId),requireMentionOverride:opts.requireMention,overrideOrder:`after-config`}),resolveTelegramGroupConfig=(chatId,messageThreadId)=>{let groups=telegramCfg.groups;if(!groups)return{groupConfig:void 0,topicConfig:void 0};let groupConfig=groups[String(chatId)]??groups[`*`];return{groupConfig,topicConfig:messageThreadId==null?void 0:groupConfig?.topics?.[String(messageThreadId)]}},processMessage=createTelegramMessageProcessor({bot,cfg,account,telegramCfg,historyLimit,groupHistories,dmPolicy,allowFrom,groupAllowFrom,ackReactionScope,logger,resolveGroupActivation,resolveGroupRequireMention,resolveTelegramGroupConfig,runtime,replyToMode,streamMode,textLimit,opts});return registerTelegramNativeCommands({bot,cfg,runtime,accountId:account.accountId,telegramCfg,allowFrom,groupAllowFrom,replyToMode,textLimit,useAccessGroups,nativeEnabled,nativeSkillsEnabled,nativeDisabledExplicit,resolveGroupPolicy,resolveTelegramGroupConfig,shouldSkipUpdate,opts}),registerTelegramHandlers({cfg,accountId:account.accountId,bot,opts,runtime,mediaMaxBytes,telegramCfg,groupAllowFrom,resolveGroupPolicy,resolveTelegramGroupConfig,shouldSkipUpdate,processMessage,logger}),bot}function normalizeAccountId(accountId){let trimmed=accountId?.trim();return trimmed?trimmed.replace(/[^a-z0-9._-]+/gi,`_`):`default`}function resolveTelegramUpdateOffsetPath(accountId,env=process.env){let stateDir=resolveStateDir(env,os.homedir),normalized=normalizeAccountId(accountId);return path.join(stateDir,`telegram`,`update-offset-${normalized}.json`)}function safeParseState(raw){try{let parsed=JSON.parse(raw);return parsed?.version!==1||parsed.lastUpdateId!==null&&typeof parsed.lastUpdateId!=`number`?null:parsed}catch{return null}}async function readTelegramUpdateOffset(params){let filePath=resolveTelegramUpdateOffsetPath(params.accountId,params.env);try{return safeParseState(await fs.readFile(filePath,`utf-8`))?.lastUpdateId??null}catch(err){return err.code,null}}async function writeTelegramUpdateOffset(params){let filePath=resolveTelegramUpdateOffsetPath(params.accountId,params.env),dir=path.dirname(filePath);await fs.mkdir(dir,{recursive:!0,mode:448});let tmp=path.join(dir,`${path.basename(filePath)}.${crypto.randomUUID()}.tmp`),payload={version:1,lastUpdateId:params.updateId};await fs.writeFile(tmp,`${JSON.stringify(payload,null,2)}\n`,{encoding:`utf-8`}),await fs.chmod(tmp,384),await fs.rename(tmp,filePath)}async function startTelegramWebhook(opts){let path=opts.path??`/telegram-webhook`,healthPath=opts.healthPath??`/healthz`,port=opts.port??8787,host=opts.host??`127.0.0.1`,secret=typeof opts.secret==`string`?opts.secret.trim():``;if(!secret)throw Error(`Telegram webhook mode requires a non-empty secret token. Set channels.telegram.webhookSecret in your config.`);let runtime=opts.runtime??defaultRuntime,diagnosticsEnabled=isDiagnosticsEnabled(opts.config),bot=createTelegramBot({token:opts.token,runtime,proxyFetch:opts.fetch,config:opts.config,accountId:opts.accountId}),handler=webhookCallback(bot,`http`,{secretToken:secret,onTimeout:`return`,timeoutMilliseconds:1e4});diagnosticsEnabled&&startDiagnosticHeartbeat();let server=createServer((req,res)=>{if(req.url===healthPath){res.writeHead(200),res.end(`ok`);return}if(req.url!==path||req.method!==`POST`){res.writeHead(404),res.end();return}let startTime=Date.now();diagnosticsEnabled&&logWebhookReceived({channel:`telegram`,updateType:`telegram-post`});let guard=installRequestBodyLimitGuard(req,res,{maxBytes:1048576,timeoutMs:3e4,responseFormat:`text`});if(guard.isTripped())return;let handled=handler(req,res);if(handled&&typeof handled.catch==`function`){handled.then(()=>{diagnosticsEnabled&&logWebhookProcessed({channel:`telegram`,updateType:`telegram-post`,durationMs:Date.now()-startTime})}).catch(err=>{if(guard.isTripped())return;let errMsg=formatErrorMessage(err);diagnosticsEnabled&&logWebhookError({channel:`telegram`,updateType:`telegram-post`,error:errMsg}),runtime.log?.(`webhook handler failed: ${errMsg}`),res.headersSent||res.writeHead(500),res.end()}).finally(()=>{guard.dispose()});return}guard.dispose()}),publicUrl=opts.publicUrl??`http://${host===`0.0.0.0`?`localhost`:host}:${port}${path}`;await withTelegramApiErrorLogging({operation:`setWebhook`,runtime,fn:()=>bot.api.setWebhook(publicUrl,{secret_token:secret,allowed_updates:resolveTelegramAllowedUpdates()})}),await new Promise(resolve=>server.listen(port,host,resolve)),runtime.log?.(`webhook listening on ${publicUrl}`);let shutdown=()=>{server.close(),bot.stop(),diagnosticsEnabled&&stopDiagnosticHeartbeat()};return opts.abortSignal&&opts.abortSignal.addEventListener(`abort`,shutdown,{once:!0}),{server,bot,stop:shutdown}}function createTelegramRunnerOptions(cfg){return{sink:{concurrency:resolveAgentMaxConcurrent(cfg)},runner:{fetch:{timeout:30,allowed_updates:resolveTelegramAllowedUpdates()},silent:!0,maxRetryTime:300*1e3,retryInterval:`exponential`}}}const TELEGRAM_POLL_RESTART_POLICY={initialMs:2e3,maxMs:3e4,factor:1.8,jitter:.25},isGetUpdatesConflict=err=>{if(!err||typeof err!=`object`)return!1;let typed=err;return(typed.error_code??typed.errorCode)===409?[typed.method,typed.description,typed.message].filter(value=>typeof value==`string`).join(` `).toLowerCase().includes(`getupdates`):!1},isGrammyHttpError=err=>!err||typeof err!=`object`?!1:err.name===`HttpError`;async function monitorTelegramProvider(opts={}){let log=opts.runtime?.error??console.error,unregisterHandler=registerUnhandledRejectionHandler(err=>isGrammyHttpError(err)&&isRecoverableTelegramNetworkError(err,{context:`polling`})?(log(`[telegram] Suppressed network error: ${formatErrorMessage(err)}`),!0):!1);try{let cfg=opts.config??loadConfig(),account=resolveTelegramAccount({cfg,accountId:opts.accountId}),token=opts.token?.trim()||account.token;if(!token)throw Error(`Telegram bot token missing for account "${account.accountId}" (set channels.telegram.accounts.${account.accountId}.botToken/tokenFile or TELEGRAM_BOT_TOKEN for default).`);let proxyFetch=opts.proxyFetch??(account.config.proxy?makeProxyFetch(account.config.proxy):void 0),lastUpdateId=await readTelegramUpdateOffset({accountId:account.accountId}),bot=createTelegramBot({token,runtime:opts.runtime,proxyFetch,config:cfg,accountId:account.accountId,updateOffset:{lastUpdateId,onUpdateId:async updateId=>{if(!(lastUpdateId!==null&&updateId<=lastUpdateId)){lastUpdateId=updateId;try{await writeTelegramUpdateOffset({accountId:account.accountId,updateId})}catch(err){(opts.runtime?.error??console.error)(`telegram: failed to persist update offset: ${String(err)}`)}}}}});if(opts.useWebhook){await startTelegramWebhook({token,accountId:account.accountId,config:cfg,path:opts.webhookPath,port:opts.webhookPort,secret:opts.webhookSecret??account.config.webhookSecret,host:opts.webhookHost??account.config.webhookHost,runtime:opts.runtime,fetch:proxyFetch,abortSignal:opts.abortSignal,publicUrl:opts.webhookUrl});return}let restartAttempts=0;for(;!opts.abortSignal?.aborted;){let runner=run(bot,createTelegramRunnerOptions(cfg)),stopOnAbort=()=>{opts.abortSignal?.aborted&&runner.stop()};opts.abortSignal?.addEventListener(`abort`,stopOnAbort,{once:!0});try{await runner.task();return}catch(err){if(opts.abortSignal?.aborted)throw err;let isConflict=isGetUpdatesConflict(err),isRecoverable=isRecoverableTelegramNetworkError(err,{context:`polling`});if(!isConflict&&!isRecoverable)throw err;restartAttempts+=1;let delayMs=computeBackoff(TELEGRAM_POLL_RESTART_POLICY,restartAttempts),reason=isConflict?`getUpdates conflict`:`network error`,errMsg=formatErrorMessage(err);(opts.runtime?.error??console.error)(`Telegram ${reason}: ${errMsg}; retrying in ${formatDurationPrecise(delayMs)}.`);try{await sleepWithAbort(delayMs,opts.abortSignal)}catch(sleepErr){if(opts.abortSignal?.aborted)return;throw sleepErr}}finally{opts.abortSignal?.removeEventListener(`abort`,stopOnAbort)}}}finally{unregisterHandler()}}async function probeTelegram(token,timeoutMs,proxyUrl){let started=Date.now(),fetcher=proxyUrl?makeProxyFetch(proxyUrl):fetch,base=`https://api.telegram.org/bot${token}`,retryDelayMs=Math.max(50,Math.min(1e3,timeoutMs)),result={ok:!1,status:null,error:null,elapsedMs:0};try{let meRes=null,fetchError=null;for(let i=0;i<3;i++)try{meRes=await fetchWithTimeout(`${base}/getMe`,{},timeoutMs,fetcher);break}catch(err){fetchError=err,i<2&&await new Promise(resolve=>setTimeout(resolve,retryDelayMs))}if(!meRes)throw fetchError;let meJson=await meRes.json();if(!meRes.ok||!meJson?.ok)return result.status=meRes.status,result.error=meJson?.description??`getMe failed (${meRes.status})`,{...result,elapsedMs:Date.now()-started};result.bot={id:meJson.result?.id??null,username:meJson.result?.username??null,canJoinGroups:typeof meJson.result?.can_join_groups==`boolean`?meJson.result?.can_join_groups:null,canReadAllGroupMessages:typeof meJson.result?.can_read_all_group_messages==`boolean`?meJson.result?.can_read_all_group_messages:null,supportsInlineQueries:typeof meJson.result?.supports_inline_queries==`boolean`?meJson.result?.supports_inline_queries:null};try{let webhookRes=await fetchWithTimeout(`${base}/getWebhookInfo`,{},timeoutMs,fetcher),webhookJson=await webhookRes.json();webhookRes.ok&&webhookJson?.ok&&(result.webhook={url:webhookJson.result?.url??null,hasCustomCert:webhookJson.result?.has_custom_certificate??null})}catch{}return result.ok=!0,result.status=null,result.error=null,result.elapsedMs=Date.now()-started,result}catch(err){return{...result,status:err instanceof Response?err.status:result.status,error:err instanceof Error?err.message:String(err),elapsedMs:Date.now()-started}}}function formatNativeDependencyHint(params){let manager=params.manager??`pnpm`,rebuildCommand=params.rebuildCommand??(manager===`npm`?`npm rebuild ${params.packageName}`:manager===`yarn`?`yarn rebuild ${params.packageName}`:`pnpm rebuild ${params.packageName}`),steps=[params.approveBuildsCommand??(manager===`pnpm`?`pnpm approve-builds (select ${params.packageName})`:void 0),rebuildCommand,params.downloadCommand].filter(step=>!!step);return steps.length===0?`Install ${params.packageName} and rebuild its native module.`:`Install ${params.packageName} and rebuild its native module (${steps.join(`; `)}).`}let cachedVersion=null;function resolveVersion(){if(cachedVersion)return cachedVersion;try{return cachedVersion=createRequire(import.meta.url)(`../../../package.json`).version??`unknown`,cachedVersion}catch{return cachedVersion=`unknown`,cachedVersion}}const sendMessageWhatsAppLazy=async(...args)=>{let{sendMessageWhatsApp}=await loadWebOutbound();return sendMessageWhatsApp(...args)},sendPollWhatsAppLazy=async(...args)=>{let{sendPollWhatsApp}=await loadWebOutbound();return sendPollWhatsApp(...args)},loginWebLazy=async(...args)=>{let{loginWeb}=await loadWebLogin();return loginWeb(...args)},startWebLoginWithQrLazy=async(...args)=>{let{startWebLoginWithQr}=await loadWebLoginQr();return startWebLoginWithQr(...args)},waitForWebLoginLazy=async(...args)=>{let{waitForWebLogin}=await loadWebLoginQr();return waitForWebLogin(...args)},monitorWebChannelLazy=async(...args)=>{let{monitorWebChannel}=await loadWebChannel();return monitorWebChannel(...args)},handleWhatsAppActionLazy=async(...args)=>{let{handleWhatsAppAction}=await loadWhatsAppActions();return handleWhatsAppAction(...args)};let webOutboundPromise=null,webLoginPromise=null,webLoginQrPromise=null,webChannelPromise=null,whatsappActionsPromise=null;function loadWebOutbound(){return webOutboundPromise??=import(`./outbound-CDX36O5m.js`).then(n=>n.t),webOutboundPromise}function loadWebLogin(){return webLoginPromise??=import(`./login-Dwk5S_7d.js`).then(n=>n.n),webLoginPromise}function loadWebLoginQr(){return webLoginQrPromise??=import(`./login-qr-DG5_i61K.js`),webLoginQrPromise}function loadWebChannel(){return webChannelPromise??=import(`./web-CGo9DnE4.js`),webChannelPromise}function loadWhatsAppActions(){return whatsappActionsPromise??=import(`./whatsapp-actions-DjDNNK7h.js`),whatsappActionsPromise}function createPluginRuntime(){return{version:resolveVersion(),config:{loadConfig,writeConfigFile},system:{enqueueSystemEvent,runCommandWithTimeout,formatNativeDependencyHint},media:{loadWebMedia,detectMime,mediaKindFromMime,isVoiceCompatibleAudio,getImageMetadata,resizeToJpeg},tts:{textToSpeechTelephony},tools:{createMemoryGetTool,createMemorySearchTool,registerMemoryCli},channel:{text:{chunkByNewline,chunkMarkdownText,chunkMarkdownTextWithMode,chunkText,chunkTextWithMode,resolveChunkMode,resolveTextChunkLimit,hasControlCommand,resolveMarkdownTableMode,convertMarkdownTables},reply:{dispatchReplyWithBufferedBlockDispatcher,createReplyDispatcherWithTyping,resolveEffectiveMessagesConfig,resolveHumanDelayConfig,dispatchReplyFromConfig,finalizeInboundContext,formatAgentEnvelope,formatInboundEnvelope,resolveEnvelopeFormatOptions},routing:{resolveAgentRoute},pairing:{buildPairingReply,readAllowFromStore:readChannelAllowFromStore,upsertPairingRequest:upsertChannelPairingRequest},media:{fetchRemoteMedia,saveMediaBuffer},activity:{record:recordChannelActivity,get:getChannelActivity},session:{resolveStorePath,readSessionUpdatedAt,recordSessionMetaFromInbound,recordInboundSession,updateLastRoute},mentions:{buildMentionRegexes,matchesMentionPatterns,matchesMentionWithExplicit},reactions:{shouldAckReaction,removeAckReactionAfterReply},groups:{resolveGroupPolicy:resolveChannelGroupPolicy,resolveRequireMention:resolveChannelGroupRequireMention},debounce:{createInboundDebouncer,resolveInboundDebounceMs},commands:{resolveCommandAuthorizedFromAuthorizers,isControlCommandMessage,shouldComputeCommandAuthorized,shouldHandleTextCommands},discord:{messageActions:discordMessageActions,auditChannelPermissions:auditDiscordChannelPermissions,listDirectoryGroupsLive:listDiscordDirectoryGroupsLive,listDirectoryPeersLive:listDiscordDirectoryPeersLive,probeDiscord,resolveChannelAllowlist:resolveDiscordChannelAllowlist,resolveUserAllowlist:resolveDiscordUserAllowlist,sendMessageDiscord,sendPollDiscord,monitorDiscordProvider},slack:{listDirectoryGroupsLive:listSlackDirectoryGroupsLive,listDirectoryPeersLive:listSlackDirectoryPeersLive,probeSlack,resolveChannelAllowlist:resolveSlackChannelAllowlist,resolveUserAllowlist:resolveSlackUserAllowlist,sendMessageSlack,monitorSlackProvider,handleSlackAction},telegram:{auditGroupMembership:auditTelegramGroupMembership,collectUnmentionedGroupIds:collectTelegramUnmentionedGroupIds,probeTelegram,resolveTelegramToken,sendMessageTelegram,sendPollTelegram,monitorTelegramProvider,messageActions:telegramMessageActions},signal:{probeSignal,sendMessageSignal,monitorSignalProvider,messageActions:signalMessageActions},imessage:{monitorIMessageProvider,probeIMessage,sendMessageIMessage},whatsapp:{getActiveWebListener,getWebAuthAgeMs,logoutWeb,logWebSelfId,readWebSelfId,webAuthExists,sendMessageWhatsApp:sendMessageWhatsAppLazy,sendPollWhatsApp:sendPollWhatsAppLazy,loginWeb:loginWebLazy,startWebLoginWithQr:startWebLoginWithQrLazy,waitForWebLogin:waitForWebLoginLazy,monitorWebChannel:monitorWebChannelLazy,handleWhatsAppAction:handleWhatsAppActionLazy,createLoginTool:createWhatsAppLoginTool},line:{listLineAccountIds,resolveDefaultLineAccountId,resolveLineAccount,normalizeAccountId:normalizeAccountId$1,probeLineBot,sendMessageLine,pushMessageLine,pushMessagesLine,pushFlexMessage,pushTemplateMessage,pushLocationMessage,pushTextMessageWithQuickReplies,createQuickReplyItems,buildTemplateMessageFromPayload,monitorLineProvider}},logging:{shouldLogVerbose,getChildLogger:(bindings,opts)=>{let logger=getChildLogger(bindings,{level:opts?.level?normalizeLogLevel(opts.level):void 0});return{debug:message=>logger.debug?.(message),info:message=>logger.info(message),warn:message=>logger.warn(message),error:message=>logger.error(message)}}},state:{resolveStateDir}}}const registryCache=new Map,defaultLogger=()=>createSubsystemLogger(`plugins`),resolvePluginSdkAliasFile=params=>{try{let modulePath=fileURLToPath(import.meta.url),isTest=process.env.VITEST||!1,cursor=path.dirname(modulePath);for(let i=0;i<6;i+=1){let srcCandidate=path.join(cursor,`src`,`plugin-sdk`,params.srcFile),distCandidate=path.join(cursor,`dist`,`plugin-sdk`,params.distFile),orderedCandidates=isTest?[distCandidate,srcCandidate]:[distCandidate];for(let candidate of orderedCandidates)if(fs$1.existsSync(candidate))return candidate;let parent=path.dirname(cursor);if(parent===cursor)break;cursor=parent}}catch{}return null},resolvePluginSdkAlias=()=>resolvePluginSdkAliasFile({srcFile:`index.ts`,distFile:`index.js`}),resolvePluginSdkAccountIdAlias=()=>resolvePluginSdkAliasFile({srcFile:`account-id.ts`,distFile:`account-id.js`});function buildCacheKey(params){return`${params.workspaceDir?resolveUserPath(params.workspaceDir):``}::${JSON.stringify(params.plugins)}`}function validatePluginConfig(params){let schema=params.schema;if(!schema)return{ok:!0,value:params.value};let result=validateJsonSchemaValue({schema,cacheKey:params.cacheKey??JSON.stringify(schema),value:params.value??{}});return result.ok?{ok:!0,value:params.value}:{ok:!1,errors:result.errors}}function resolvePluginModuleExport(moduleExport){let resolved=moduleExport&&typeof moduleExport==`object`&&`default`in moduleExport?moduleExport.default:moduleExport;if(typeof resolved==`function`)return{register:resolved};if(resolved&&typeof resolved==`object`){let def=resolved;return{definition:def,register:def.register??def.activate}}return{}}function createPluginRecord(params){return{id:params.id,name:params.name??params.id,description:params.description,version:params.version,source:params.source,origin:params.origin,workspaceDir:params.workspaceDir,enabled:params.enabled,status:params.enabled?`loaded`:`disabled`,toolNames:[],hookNames:[],channelIds:[],providerIds:[],gatewayMethods:[],cliCommands:[],services:[],commands:[],httpHandlers:0,hookCount:0,configSchema:params.configSchema,configUiHints:void 0,configJsonSchema:void 0}}function pushDiagnostics(diagnostics,append){diagnostics.push(...append)}function registerManifestHookDirs(params){for(let hookDir of params.hookDirs){let resolvedDir=path.resolve(params.rootDir,hookDir);registerPluginHooksFromDir(params.api,resolvedDir).then(hookResult=>{for(let message of hookResult.errors)params.diagnostics.push({level:`warn`,pluginId:params.record.id,source:params.record.source,message})}).catch(err=>{params.logger.warn(`[plugins] ${params.record.id} failed loading hooks from ${resolvedDir}: ${String(err)}`)})}}function loadBuilderForceAgentsPlugins(options={}){let cfg=applyTestPluginDefaults(options.config??{},process.env),logger=options.logger??defaultLogger(),validateOnly=options.mode===`validate`,normalized=normalizePluginsConfig(cfg.plugins),cacheKey=buildCacheKey({workspaceDir:options.workspaceDir,plugins:normalized}),cacheEnabled=options.cache!==!1;if(cacheEnabled){let cached=registryCache.get(cacheKey);if(cached)return setActivePluginRegistry(cached,cacheKey),cached}clearPluginCommands();let{registry,createApi}=createPluginRegistry({logger,runtime:createPluginRuntime(),coreGatewayHandlers:options.coreGatewayHandlers}),discovery=discoverBuilderForceAgentsPlugins({workspaceDir:options.workspaceDir,extraPaths:normalized.loadPaths}),manifestRegistry=loadPluginManifestRegistry({config:cfg,workspaceDir:options.workspaceDir,cache:options.cache,candidates:discovery.candidates,diagnostics:discovery.diagnostics});pushDiagnostics(registry.diagnostics,manifestRegistry.diagnostics);let jitiLoader=null,getJiti=()=>{if(jitiLoader)return jitiLoader;let pluginSdkAlias=resolvePluginSdkAlias(),pluginSdkAccountIdAlias=resolvePluginSdkAccountIdAlias();return jitiLoader=createJiti(import.meta.url,{interopDefault:!0,extensions:[`.ts`,`.tsx`,`.mts`,`.cts`,`.mtsx`,`.ctsx`,`.js`,`.mjs`,`.cjs`,`.json`],...pluginSdkAlias||pluginSdkAccountIdAlias?{alias:{...pluginSdkAlias?{"@seanhogg/builderforce-agents/plugin-sdk":pluginSdkAlias}:{},...pluginSdkAccountIdAlias?{"@seanhogg/builderforce-agents/plugin-sdk/account-id":pluginSdkAccountIdAlias}:{}}}:{}}),jitiLoader},manifestByRoot=new Map(manifestRegistry.plugins.map(record=>[record.rootDir,record])),seenIds=new Map,memorySlot=normalized.slots.memory,selectedMemoryPluginId=null,memorySlotMatched=!1;for(let candidate of discovery.candidates){let manifestRecord=manifestByRoot.get(candidate.rootDir);if(!manifestRecord)continue;let pluginId=manifestRecord.id,existingOrigin=seenIds.get(pluginId);if(existingOrigin){let record=createPluginRecord({id:pluginId,name:manifestRecord.name??pluginId,description:manifestRecord.description,version:manifestRecord.version,source:candidate.source,origin:candidate.origin,workspaceDir:candidate.workspaceDir,enabled:!1,configSchema:!!manifestRecord.configSchema});record.status=`disabled`,record.error=`overridden by ${existingOrigin} plugin`,registry.plugins.push(record);continue}let enableState=resolveEnableState(pluginId,candidate.origin,normalized),entry=normalized.entries[pluginId],record=createPluginRecord({id:pluginId,name:manifestRecord.name??pluginId,description:manifestRecord.description,version:manifestRecord.version,source:candidate.source,origin:candidate.origin,workspaceDir:candidate.workspaceDir,enabled:enableState.enabled,configSchema:!!manifestRecord.configSchema});if(record.kind=manifestRecord.kind,record.configUiHints=manifestRecord.configUiHints,record.configJsonSchema=manifestRecord.configSchema,!enableState.enabled){record.status=`disabled`,record.error=enableState.reason,registry.plugins.push(record),seenIds.set(pluginId,candidate.origin);continue}if(!manifestRecord.configSchema){record.status=`error`,record.error=`missing config schema`,registry.plugins.push(record),seenIds.set(pluginId,candidate.origin),registry.diagnostics.push({level:`error`,pluginId:record.id,source:record.source,message:record.error});continue}let mod=null;try{mod=getJiti()(candidate.source)}catch(err){logger.error(`[plugins] ${record.id} failed to load from ${record.source}: ${String(err)}`),record.status=`error`,record.error=String(err),registry.plugins.push(record),seenIds.set(pluginId,candidate.origin),registry.diagnostics.push({level:`error`,pluginId:record.id,source:record.source,message:`failed to load plugin: ${String(err)}`});continue}let resolved=resolvePluginModuleExport(mod),definition=resolved.definition,register=resolved.register;definition?.id&&definition.id!==record.id&&registry.diagnostics.push({level:`warn`,pluginId:record.id,source:record.source,message:`plugin id mismatch (config uses "${record.id}", export uses "${definition.id}")`}),record.name=definition?.name??record.name,record.description=definition?.description??record.description,record.version=definition?.version??record.version;let manifestKind=record.kind,exportKind=definition?.kind;manifestKind&&exportKind&&exportKind!==manifestKind&&registry.diagnostics.push({level:`warn`,pluginId:record.id,source:record.source,message:`plugin kind mismatch (manifest uses "${manifestKind}", export uses "${exportKind}")`}),record.kind=definition?.kind??record.kind,record.kind===`memory`&&memorySlot===record.id&&(memorySlotMatched=!0);let memoryDecision=resolveMemorySlotDecision({id:record.id,kind:record.kind,slot:memorySlot,selectedId:selectedMemoryPluginId});if(!memoryDecision.enabled){record.enabled=!1,record.status=`disabled`,record.error=memoryDecision.reason,registry.plugins.push(record),seenIds.set(pluginId,candidate.origin);continue}memoryDecision.selected&&record.kind===`memory`&&(selectedMemoryPluginId=record.id);let validatedConfig=validatePluginConfig({schema:manifestRecord.configSchema,cacheKey:manifestRecord.schemaCacheKey,value:entry?.config});if(!validatedConfig.ok){logger.error(`[plugins] ${record.id} invalid config: ${validatedConfig.errors?.join(`, `)}`),record.status=`error`,record.error=`invalid config: ${validatedConfig.errors?.join(`, `)}`,registry.plugins.push(record),seenIds.set(pluginId,candidate.origin),registry.diagnostics.push({level:`error`,pluginId:record.id,source:record.source,message:record.error});continue}if(validateOnly){registry.plugins.push(record),seenIds.set(pluginId,candidate.origin);continue}if(typeof register!=`function`){logger.error(`[plugins] ${record.id} missing register/activate export`),record.status=`error`,record.error=`plugin export missing register/activate`,registry.plugins.push(record),seenIds.set(pluginId,candidate.origin),registry.diagnostics.push({level:`error`,pluginId:record.id,source:record.source,message:record.error});continue}let api=createApi(record,{config:cfg,pluginConfig:validatedConfig.value});try{let result=register(api);result&&typeof result.then==`function`&&registry.diagnostics.push({level:`warn`,pluginId:record.id,source:record.source,message:`plugin register returned a promise; async registration is ignored`}),registerManifestHookDirs({api,record,rootDir:manifestRecord.rootDir,hookDirs:manifestRecord.hooks,diagnostics:registry.diagnostics,logger}),registry.plugins.push(record),seenIds.set(pluginId,candidate.origin)}catch(err){logger.error(`[plugins] ${record.id} failed during register from ${record.source}: ${String(err)}`),record.status=`error`,record.error=String(err),registry.plugins.push(record),seenIds.set(pluginId,candidate.origin),registry.diagnostics.push({level:`error`,pluginId:record.id,source:record.source,message:`plugin failed during register: ${String(err)}`})}}return typeof memorySlot==`string`&&!memorySlotMatched&&registry.diagnostics.push({level:`warn`,message:`memory slot plugin not found or not marked as memory: ${memorySlot}`}),cacheEnabled&&registryCache.set(cacheKey,registry),setActivePluginRegistry(registry,cacheKey),initializeGlobalHookRunner(registry),registry}function createPluginLoaderLogger(logger){return{info:msg=>logger.info(msg),warn:msg=>logger.warn(msg),error:msg=>logger.error(msg),debug:msg=>logger.debug?.(msg)}}const log$6=createSubsystemLogger(`plugins`),pluginToolMeta=new WeakMap;function getPluginToolMeta(tool){return pluginToolMeta.get(tool)}function normalizeAllowlist(list){return new Set((list??[]).map(normalizeToolName).filter(Boolean))}function isOptionalToolAllowed(params){if(params.allowlist.size===0)return!1;let toolName=normalizeToolName(params.toolName);if(params.allowlist.has(toolName))return!0;let pluginKey=normalizeToolName(params.pluginId);return params.allowlist.has(pluginKey)?!0:params.allowlist.has(`group:plugins`)}function resolvePluginTools(params){let effectiveConfig=applyTestPluginDefaults(params.context.config??{},process.env);if(!normalizePluginsConfig(effectiveConfig.plugins).enabled)return[];let registry=loadBuilderForceAgentsPlugins({config:effectiveConfig,workspaceDir:params.context.workspaceDir,logger:createPluginLoaderLogger(log$6)}),tools=[],existing=params.existingToolNames??new Set,existingNormalized=new Set(Array.from(existing,tool=>normalizeToolName(tool))),allowlist=normalizeAllowlist(params.toolAllowlist),blockedPlugins=new Set;for(let entry of registry.tools){if(blockedPlugins.has(entry.pluginId))continue;let pluginIdKey=normalizeToolName(entry.pluginId);if(existingNormalized.has(pluginIdKey)){let message=`plugin id conflicts with core tool name (${entry.pluginId})`;log$6.error(message),registry.diagnostics.push({level:`error`,pluginId:entry.pluginId,source:entry.source,message}),blockedPlugins.add(entry.pluginId);continue}let resolved=null;try{resolved=entry.factory(params.context)}catch(err){log$6.error(`plugin tool failed (${entry.pluginId}): ${String(err)}`);continue}if(!resolved)continue;let listRaw=Array.isArray(resolved)?resolved:[resolved],list=entry.optional?listRaw.filter(tool=>isOptionalToolAllowed({toolName:tool.name,pluginId:entry.pluginId,allowlist})):listRaw;if(list.length===0)continue;let nameSet=new Set;for(let tool of list){if(nameSet.has(tool.name)||existing.has(tool.name)){let message=`plugin tool name conflict (${entry.pluginId}): ${tool.name}`;log$6.error(message),registry.diagnostics.push({level:`error`,pluginId:entry.pluginId,source:entry.source,message});continue}nameSet.add(tool.name),existing.add(tool.name),pluginToolMeta.set(tool,{pluginId:entry.pluginId,optional:entry.optional}),tools.push(tool)}}return tools}async function defaultReadFile(filePath){return fs.readFile(filePath,`utf8`)}async function applyUpdateHunk(filePath,chunks,options){let originalLines=(await(options?.readFile??defaultReadFile)(filePath).catch(err=>{throw Error(`Failed to read file to update ${filePath}: ${err}`)})).split(`
531
+ `):void 0,conversationLabel=isGroup?msg.chat.title?`${msg.chat.title} id:${chatId}`:`group:${chatId}`:buildSenderName(msg)??String(senderId||chatId),ctxPayload=finalizeInboundContext({Body:prompt,BodyForAgent:prompt,RawBody:prompt,CommandBody:prompt,CommandArgs:commandArgs,From:isGroup?buildTelegramGroupFrom(chatId,resolvedThreadId):`telegram:${chatId}`,To:`slash:${senderId||chatId}`,ChatType:isGroup?`group`:`direct`,ConversationLabel:conversationLabel,GroupSubject:isGroup?msg.chat.title??void 0:void 0,GroupSystemPrompt:isGroup?groupSystemPrompt:void 0,SenderName:buildSenderName(msg),SenderId:senderId||void 0,SenderUsername:senderUsername||void 0,Surface:`telegram`,MessageSid:String(msg.message_id),Timestamp:msg.date?msg.date*1e3:void 0,WasMentioned:!0,CommandAuthorized:commandAuthorized,CommandSource:`native`,SessionKey:`telegram:slash:${senderId||chatId}`,AccountId:route.accountId,CommandTargetSessionKey:sessionKey,MessageThreadId:threadSpec.id,IsForum:isForum,OriginatingChannel:`telegram`,OriginatingTo:`telegram:${chatId}`}),disableBlockStreaming=typeof telegramCfg.blockStreaming==`boolean`?!telegramCfg.blockStreaming:void 0,deliveryState={delivered:!1,skippedNonSilent:0},{onModelSelected,...prefixOptions}=createReplyPrefixOptions({cfg,agentId:route.agentId,channel:`telegram`,accountId:route.accountId});await dispatchReplyWithBufferedBlockDispatcher({ctx:ctxPayload,cfg,dispatcherOptions:{...prefixOptions,deliver:async(payload,_info)=>{(await deliverReplies({replies:[payload],...deliveryBaseOptions})).delivered&&(deliveryState.delivered=!0)},onSkip:(_payload,info)=>{info.reason!==`silent`&&(deliveryState.skippedNonSilent+=1)},onError:(err,info)=>{runtime.error?.(danger(`telegram slash ${info.kind} reply failed: ${String(err)}`))}},replyOptions:{skillFilter,disableBlockStreaming,onModelSelected}}),!deliveryState.delivered&&deliveryState.skippedNonSilent>0&&await deliverReplies({replies:[{text:`No response generated. Please try again.`}],...deliveryBaseOptions})})}for(let pluginCommand of pluginCatalog.commands)bot.command(pluginCommand.command,async ctx=>{let msg=ctx.message;if(!msg||shouldSkipUpdate(ctx))return;let chatId=msg.chat.id,rawText=ctx.match?.trim()??``,commandBody=`/${pluginCommand.command}${rawText?` ${rawText}`:``}`,match=matchPluginCommand(commandBody);if(!match){await withTelegramApiErrorLogging({operation:`sendMessage`,runtime,fn:()=>bot.api.sendMessage(chatId,`Command not found.`)});return}let auth=await resolveTelegramCommandAuth({msg,bot,cfg,accountId,telegramCfg,allowFrom,groupAllowFrom,useAccessGroups,resolveGroupPolicy,resolveTelegramGroupConfig,requireAuth:match.command.requireAuth!==!1});if(!auth)return;let{senderId,commandAuthorized,isGroup,isForum,resolvedThreadId}=auth,{threadSpec,mediaLocalRoots,tableMode,chunkMode}=resolveCommandRuntimeContext({msg,isGroup,isForum,resolvedThreadId}),deliveryBaseOptions=buildCommandDeliveryBaseOptions({chatId,mediaLocalRoots,threadSpec,tableMode,chunkMode}),from=isGroup?buildTelegramGroupFrom(chatId,threadSpec.id):`telegram:${chatId}`,to=`telegram:${chatId}`;await deliverReplies({replies:[await executePluginCommand({command:match.command,args:match.args,senderId,channel:`telegram`,isAuthorizedSender:commandAuthorized,commandBody,config:cfg,from,to,accountId,messageThreadId:threadSpec.id})],...deliveryBaseOptions})})}else nativeDisabledExplicit&&withTelegramApiErrorLogging({operation:`setMyCommands`,runtime,fn:()=>bot.api.setMyCommands([])}).catch(()=>{})};function getTelegramSequentialKey(ctx){let reaction=ctx.update?.message_reaction;if(reaction?.chat?.id)return`telegram:${reaction.chat.id}`;let msg=ctx.message??ctx.channelPost??ctx.editedChannelPost??ctx.update?.message??ctx.update?.edited_message??ctx.update?.channel_post??ctx.update?.edited_channel_post??ctx.update?.callback_query?.message,chatId=msg?.chat?.id??ctx.chat?.id,rawText=msg?.text??msg?.caption,botUsername=ctx.me?.username;if(isAbortRequestText(rawText,botUsername?{botUsername}:void 0))return typeof chatId==`number`?`telegram:${chatId}:control`:`telegram:control`;let isGroup=msg?.chat?.type===`group`||msg?.chat?.type===`supergroup`,messageThreadId=msg?.message_thread_id,isForum=msg?.chat?.is_forum,threadId=isGroup?resolveTelegramForumThreadId({isForum,messageThreadId}):messageThreadId;return typeof chatId==`number`?threadId==null?`telegram:${chatId}`:`telegram:${chatId}:topic:${threadId}`:`telegram:unknown`}function createTelegramBot(opts){let runtime=opts.runtime??{log:console.log,error:console.error,exit:code=>{throw Error(`exit ${code}`)}},cfg=opts.config??loadConfig(),account=resolveTelegramAccount({cfg,accountId:opts.accountId}),telegramCfg=account.config,fetchImpl=resolveTelegramFetch(opts.proxyFetch,{network:telegramCfg.network}),shouldProvideFetch=!!fetchImpl,fetchForClient=fetchImpl,timeoutSeconds=typeof telegramCfg?.timeoutSeconds==`number`&&Number.isFinite(telegramCfg.timeoutSeconds)?Math.max(1,Math.floor(telegramCfg.timeoutSeconds)):void 0,client=shouldProvideFetch||timeoutSeconds?{...shouldProvideFetch&&fetchImpl?{fetch:fetchForClient}:{},...timeoutSeconds?{timeoutSeconds}:{}}:void 0,bot=new Bot(opts.token,client?{client}:void 0);bot.api.config.use(apiThrottler()),bot.use(sequentialize(getTelegramSequentialKey)),bot.catch(err=>{runtime.error?.(danger(`telegram bot error: ${formatUncaughtError(err)}`))});let recentUpdates=createTelegramUpdateDedupe(),lastUpdateId=typeof opts.updateOffset?.lastUpdateId==`number`?opts.updateOffset.lastUpdateId:null,recordUpdateId=ctx=>{let updateId=resolveTelegramUpdateId(ctx);typeof updateId==`number`&&(lastUpdateId!==null&&updateId<=lastUpdateId||(lastUpdateId=updateId,opts.updateOffset?.onUpdateId?.(updateId)))},shouldSkipUpdate=ctx=>{let updateId=resolveTelegramUpdateId(ctx);if(typeof updateId==`number`&&lastUpdateId!==null&&updateId<=lastUpdateId)return!0;let key=buildTelegramUpdateKey(ctx),skipped=recentUpdates.check(key);return skipped&&key&&shouldLogVerbose()&&logVerbose(`telegram dedupe: skipped ${key}`),skipped},rawUpdateLogger=createSubsystemLogger(`gateway/channels/telegram/raw-update`),MAX_RAW_UPDATE_CHARS=8e3,stringifyUpdate=update=>{let seen=new WeakSet;return JSON.stringify(update??null,(key,value)=>{if(typeof value==`string`&&value.length>500)return`${value.slice(0,500)}...`;if(Array.isArray(value)&&value.length>20)return[...value.slice(0,20),`...(${value.length-20} more)`];if(value&&typeof value==`object`){if(seen.has(value))return`[Circular]`;seen.add(value)}return value})};bot.use(async(ctx,next)=>{if(shouldLogVerbose())try{let raw=stringifyUpdate(ctx.update),preview=raw.length>MAX_RAW_UPDATE_CHARS?`${raw.slice(0,MAX_RAW_UPDATE_CHARS)}...`:raw;rawUpdateLogger.debug(`telegram update: ${preview}`)}catch(err){rawUpdateLogger.debug(`telegram update log failed: ${String(err)}`)}await next(),recordUpdateId(ctx)});let historyLimit=Math.max(0,telegramCfg.historyLimit??cfg.messages?.groupChat?.historyLimit??50),groupHistories=new Map,textLimit=resolveTextChunkLimit(cfg,`telegram`,account.accountId),dmPolicy=telegramCfg.dmPolicy??`pairing`,allowFrom=opts.allowFrom??telegramCfg.allowFrom,groupAllowFrom=opts.groupAllowFrom??telegramCfg.groupAllowFrom??(telegramCfg.allowFrom&&telegramCfg.allowFrom.length>0?telegramCfg.allowFrom:void 0)??(opts.allowFrom&&opts.allowFrom.length>0?opts.allowFrom:void 0),replyToMode=opts.replyToMode??telegramCfg.replyToMode??`off`,nativeEnabled=resolveNativeCommandsEnabled({providerId:`telegram`,providerSetting:telegramCfg.commands?.native,globalSetting:cfg.commands?.native}),nativeSkillsEnabled=resolveNativeSkillsEnabled({providerId:`telegram`,providerSetting:telegramCfg.commands?.nativeSkills,globalSetting:cfg.commands?.nativeSkills}),nativeDisabledExplicit=isNativeCommandsExplicitlyDisabled({providerSetting:telegramCfg.commands?.native,globalSetting:cfg.commands?.native}),useAccessGroups=cfg.commands?.useAccessGroups!==!1,ackReactionScope=cfg.messages?.ackReactionScope??`group-mentions`,mediaMaxBytes=(opts.mediaMaxMb??telegramCfg.mediaMaxMb??5)*1024*1024,logger=getChildLogger({module:`telegram-auto-reply`}),streamMode=resolveTelegramStreamMode(telegramCfg),resolveGroupPolicy=chatId=>resolveChannelGroupPolicy({cfg,channel:`telegram`,accountId:account.accountId,groupId:String(chatId)}),resolveGroupActivation=params=>{let agentId=params.agentId??resolveDefaultAgentId(cfg),sessionKey=params.sessionKey??`agent:${agentId}:telegram:group:${buildTelegramGroupPeerId(params.chatId,params.messageThreadId)}`,storePath=resolveStorePath(cfg.session?.store,{agentId});try{let entry=loadSessionStore(storePath)[sessionKey];if(entry?.groupActivation===`always`)return!1;if(entry?.groupActivation===`mention`)return!0}catch(err){logVerbose(`Failed to load session for activation check: ${String(err)}`)}},resolveGroupRequireMention=chatId=>resolveChannelGroupRequireMention({cfg,channel:`telegram`,accountId:account.accountId,groupId:String(chatId),requireMentionOverride:opts.requireMention,overrideOrder:`after-config`}),resolveTelegramGroupConfig=(chatId,messageThreadId)=>{let groups=telegramCfg.groups;if(!groups)return{groupConfig:void 0,topicConfig:void 0};let groupConfig=groups[String(chatId)]??groups[`*`];return{groupConfig,topicConfig:messageThreadId==null?void 0:groupConfig?.topics?.[String(messageThreadId)]}},processMessage=createTelegramMessageProcessor({bot,cfg,account,telegramCfg,historyLimit,groupHistories,dmPolicy,allowFrom,groupAllowFrom,ackReactionScope,logger,resolveGroupActivation,resolveGroupRequireMention,resolveTelegramGroupConfig,runtime,replyToMode,streamMode,textLimit,opts});return registerTelegramNativeCommands({bot,cfg,runtime,accountId:account.accountId,telegramCfg,allowFrom,groupAllowFrom,replyToMode,textLimit,useAccessGroups,nativeEnabled,nativeSkillsEnabled,nativeDisabledExplicit,resolveGroupPolicy,resolveTelegramGroupConfig,shouldSkipUpdate,opts}),registerTelegramHandlers({cfg,accountId:account.accountId,bot,opts,runtime,mediaMaxBytes,telegramCfg,groupAllowFrom,resolveGroupPolicy,resolveTelegramGroupConfig,shouldSkipUpdate,processMessage,logger}),bot}function normalizeAccountId(accountId){let trimmed=accountId?.trim();return trimmed?trimmed.replace(/[^a-z0-9._-]+/gi,`_`):`default`}function resolveTelegramUpdateOffsetPath(accountId,env=process.env){let stateDir=resolveStateDir(env,os.homedir),normalized=normalizeAccountId(accountId);return path.join(stateDir,`telegram`,`update-offset-${normalized}.json`)}function safeParseState(raw){try{let parsed=JSON.parse(raw);return parsed?.version!==1||parsed.lastUpdateId!==null&&typeof parsed.lastUpdateId!=`number`?null:parsed}catch{return null}}async function readTelegramUpdateOffset(params){let filePath=resolveTelegramUpdateOffsetPath(params.accountId,params.env);try{return safeParseState(await fs.readFile(filePath,`utf-8`))?.lastUpdateId??null}catch(err){return err.code,null}}async function writeTelegramUpdateOffset(params){let filePath=resolveTelegramUpdateOffsetPath(params.accountId,params.env),dir=path.dirname(filePath);await fs.mkdir(dir,{recursive:!0,mode:448});let tmp=path.join(dir,`${path.basename(filePath)}.${crypto.randomUUID()}.tmp`),payload={version:1,lastUpdateId:params.updateId};await fs.writeFile(tmp,`${JSON.stringify(payload,null,2)}\n`,{encoding:`utf-8`}),await fs.chmod(tmp,384),await fs.rename(tmp,filePath)}async function startTelegramWebhook(opts){let path=opts.path??`/telegram-webhook`,healthPath=opts.healthPath??`/healthz`,port=opts.port??8787,host=opts.host??`127.0.0.1`,secret=typeof opts.secret==`string`?opts.secret.trim():``;if(!secret)throw Error(`Telegram webhook mode requires a non-empty secret token. Set channels.telegram.webhookSecret in your config.`);let runtime=opts.runtime??defaultRuntime,diagnosticsEnabled=isDiagnosticsEnabled(opts.config),bot=createTelegramBot({token:opts.token,runtime,proxyFetch:opts.fetch,config:opts.config,accountId:opts.accountId}),handler=webhookCallback(bot,`http`,{secretToken:secret,onTimeout:`return`,timeoutMilliseconds:1e4});diagnosticsEnabled&&startDiagnosticHeartbeat();let server=createServer((req,res)=>{if(req.url===healthPath){res.writeHead(200),res.end(`ok`);return}if(req.url!==path||req.method!==`POST`){res.writeHead(404),res.end();return}let startTime=Date.now();diagnosticsEnabled&&logWebhookReceived({channel:`telegram`,updateType:`telegram-post`});let guard=installRequestBodyLimitGuard(req,res,{maxBytes:1048576,timeoutMs:3e4,responseFormat:`text`});if(guard.isTripped())return;let handled=handler(req,res);if(handled&&typeof handled.catch==`function`){handled.then(()=>{diagnosticsEnabled&&logWebhookProcessed({channel:`telegram`,updateType:`telegram-post`,durationMs:Date.now()-startTime})}).catch(err=>{if(guard.isTripped())return;let errMsg=formatErrorMessage(err);diagnosticsEnabled&&logWebhookError({channel:`telegram`,updateType:`telegram-post`,error:errMsg}),runtime.log?.(`webhook handler failed: ${errMsg}`),res.headersSent||res.writeHead(500),res.end()}).finally(()=>{guard.dispose()});return}guard.dispose()}),publicUrl=opts.publicUrl??`http://${host===`0.0.0.0`?`localhost`:host}:${port}${path}`;await withTelegramApiErrorLogging({operation:`setWebhook`,runtime,fn:()=>bot.api.setWebhook(publicUrl,{secret_token:secret,allowed_updates:resolveTelegramAllowedUpdates()})}),await new Promise(resolve=>server.listen(port,host,resolve)),runtime.log?.(`webhook listening on ${publicUrl}`);let shutdown=()=>{server.close(),bot.stop(),diagnosticsEnabled&&stopDiagnosticHeartbeat()};return opts.abortSignal&&opts.abortSignal.addEventListener(`abort`,shutdown,{once:!0}),{server,bot,stop:shutdown}}function createTelegramRunnerOptions(cfg){return{sink:{concurrency:resolveAgentMaxConcurrent(cfg)},runner:{fetch:{timeout:30,allowed_updates:resolveTelegramAllowedUpdates()},silent:!0,maxRetryTime:300*1e3,retryInterval:`exponential`}}}const TELEGRAM_POLL_RESTART_POLICY={initialMs:2e3,maxMs:3e4,factor:1.8,jitter:.25},isGetUpdatesConflict=err=>{if(!err||typeof err!=`object`)return!1;let typed=err;return(typed.error_code??typed.errorCode)===409?[typed.method,typed.description,typed.message].filter(value=>typeof value==`string`).join(` `).toLowerCase().includes(`getupdates`):!1},isGrammyHttpError=err=>!err||typeof err!=`object`?!1:err.name===`HttpError`;async function monitorTelegramProvider(opts={}){let log=opts.runtime?.error??console.error,unregisterHandler=registerUnhandledRejectionHandler(err=>isGrammyHttpError(err)&&isRecoverableTelegramNetworkError(err,{context:`polling`})?(log(`[telegram] Suppressed network error: ${formatErrorMessage(err)}`),!0):!1);try{let cfg=opts.config??loadConfig(),account=resolveTelegramAccount({cfg,accountId:opts.accountId}),token=opts.token?.trim()||account.token;if(!token)throw Error(`Telegram bot token missing for account "${account.accountId}" (set channels.telegram.accounts.${account.accountId}.botToken/tokenFile or TELEGRAM_BOT_TOKEN for default).`);let proxyFetch=opts.proxyFetch??(account.config.proxy?makeProxyFetch(account.config.proxy):void 0),lastUpdateId=await readTelegramUpdateOffset({accountId:account.accountId}),bot=createTelegramBot({token,runtime:opts.runtime,proxyFetch,config:cfg,accountId:account.accountId,updateOffset:{lastUpdateId,onUpdateId:async updateId=>{if(!(lastUpdateId!==null&&updateId<=lastUpdateId)){lastUpdateId=updateId;try{await writeTelegramUpdateOffset({accountId:account.accountId,updateId})}catch(err){(opts.runtime?.error??console.error)(`telegram: failed to persist update offset: ${String(err)}`)}}}}});if(opts.useWebhook){await startTelegramWebhook({token,accountId:account.accountId,config:cfg,path:opts.webhookPath,port:opts.webhookPort,secret:opts.webhookSecret??account.config.webhookSecret,host:opts.webhookHost??account.config.webhookHost,runtime:opts.runtime,fetch:proxyFetch,abortSignal:opts.abortSignal,publicUrl:opts.webhookUrl});return}let restartAttempts=0;for(;!opts.abortSignal?.aborted;){let runner=run(bot,createTelegramRunnerOptions(cfg)),stopOnAbort=()=>{opts.abortSignal?.aborted&&runner.stop()};opts.abortSignal?.addEventListener(`abort`,stopOnAbort,{once:!0});try{await runner.task();return}catch(err){if(opts.abortSignal?.aborted)throw err;let isConflict=isGetUpdatesConflict(err),isRecoverable=isRecoverableTelegramNetworkError(err,{context:`polling`});if(!isConflict&&!isRecoverable)throw err;restartAttempts+=1;let delayMs=computeBackoff(TELEGRAM_POLL_RESTART_POLICY,restartAttempts),reason=isConflict?`getUpdates conflict`:`network error`,errMsg=formatErrorMessage(err);(opts.runtime?.error??console.error)(`Telegram ${reason}: ${errMsg}; retrying in ${formatDurationPrecise(delayMs)}.`);try{await sleepWithAbort(delayMs,opts.abortSignal)}catch(sleepErr){if(opts.abortSignal?.aborted)return;throw sleepErr}}finally{opts.abortSignal?.removeEventListener(`abort`,stopOnAbort)}}}finally{unregisterHandler()}}async function probeTelegram(token,timeoutMs,proxyUrl){let started=Date.now(),fetcher=proxyUrl?makeProxyFetch(proxyUrl):fetch,base=`https://api.telegram.org/bot${token}`,retryDelayMs=Math.max(50,Math.min(1e3,timeoutMs)),result={ok:!1,status:null,error:null,elapsedMs:0};try{let meRes=null,fetchError=null;for(let i=0;i<3;i++)try{meRes=await fetchWithTimeout(`${base}/getMe`,{},timeoutMs,fetcher);break}catch(err){fetchError=err,i<2&&await new Promise(resolve=>setTimeout(resolve,retryDelayMs))}if(!meRes)throw fetchError;let meJson=await meRes.json();if(!meRes.ok||!meJson?.ok)return result.status=meRes.status,result.error=meJson?.description??`getMe failed (${meRes.status})`,{...result,elapsedMs:Date.now()-started};result.bot={id:meJson.result?.id??null,username:meJson.result?.username??null,canJoinGroups:typeof meJson.result?.can_join_groups==`boolean`?meJson.result?.can_join_groups:null,canReadAllGroupMessages:typeof meJson.result?.can_read_all_group_messages==`boolean`?meJson.result?.can_read_all_group_messages:null,supportsInlineQueries:typeof meJson.result?.supports_inline_queries==`boolean`?meJson.result?.supports_inline_queries:null};try{let webhookRes=await fetchWithTimeout(`${base}/getWebhookInfo`,{},timeoutMs,fetcher),webhookJson=await webhookRes.json();webhookRes.ok&&webhookJson?.ok&&(result.webhook={url:webhookJson.result?.url??null,hasCustomCert:webhookJson.result?.has_custom_certificate??null})}catch{}return result.ok=!0,result.status=null,result.error=null,result.elapsedMs=Date.now()-started,result}catch(err){return{...result,status:err instanceof Response?err.status:result.status,error:err instanceof Error?err.message:String(err),elapsedMs:Date.now()-started}}}function formatNativeDependencyHint(params){let manager=params.manager??`pnpm`,rebuildCommand=params.rebuildCommand??(manager===`npm`?`npm rebuild ${params.packageName}`:manager===`yarn`?`yarn rebuild ${params.packageName}`:`pnpm rebuild ${params.packageName}`),steps=[params.approveBuildsCommand??(manager===`pnpm`?`pnpm approve-builds (select ${params.packageName})`:void 0),rebuildCommand,params.downloadCommand].filter(step=>!!step);return steps.length===0?`Install ${params.packageName} and rebuild its native module.`:`Install ${params.packageName} and rebuild its native module (${steps.join(`; `)}).`}let cachedVersion=null;function resolveVersion(){if(cachedVersion)return cachedVersion;try{return cachedVersion=createRequire(import.meta.url)(`../../../package.json`).version??`unknown`,cachedVersion}catch{return cachedVersion=`unknown`,cachedVersion}}const sendMessageWhatsAppLazy=async(...args)=>{let{sendMessageWhatsApp}=await loadWebOutbound();return sendMessageWhatsApp(...args)},sendPollWhatsAppLazy=async(...args)=>{let{sendPollWhatsApp}=await loadWebOutbound();return sendPollWhatsApp(...args)},loginWebLazy=async(...args)=>{let{loginWeb}=await loadWebLogin();return loginWeb(...args)},startWebLoginWithQrLazy=async(...args)=>{let{startWebLoginWithQr}=await loadWebLoginQr();return startWebLoginWithQr(...args)},waitForWebLoginLazy=async(...args)=>{let{waitForWebLogin}=await loadWebLoginQr();return waitForWebLogin(...args)},monitorWebChannelLazy=async(...args)=>{let{monitorWebChannel}=await loadWebChannel();return monitorWebChannel(...args)},handleWhatsAppActionLazy=async(...args)=>{let{handleWhatsAppAction}=await loadWhatsAppActions();return handleWhatsAppAction(...args)};let webOutboundPromise=null,webLoginPromise=null,webLoginQrPromise=null,webChannelPromise=null,whatsappActionsPromise=null;function loadWebOutbound(){return webOutboundPromise??=import(`./outbound-CDX36O5m.js`).then(n=>n.t),webOutboundPromise}function loadWebLogin(){return webLoginPromise??=import(`./login-Dwk5S_7d.js`).then(n=>n.n),webLoginPromise}function loadWebLoginQr(){return webLoginQrPromise??=import(`./login-qr-DG5_i61K.js`),webLoginQrPromise}function loadWebChannel(){return webChannelPromise??=import(`./web-DKmwaw7q.js`),webChannelPromise}function loadWhatsAppActions(){return whatsappActionsPromise??=import(`./whatsapp-actions-DjDNNK7h.js`),whatsappActionsPromise}function createPluginRuntime(){return{version:resolveVersion(),config:{loadConfig,writeConfigFile},system:{enqueueSystemEvent,runCommandWithTimeout,formatNativeDependencyHint},media:{loadWebMedia,detectMime,mediaKindFromMime,isVoiceCompatibleAudio,getImageMetadata,resizeToJpeg},tts:{textToSpeechTelephony},tools:{createMemoryGetTool,createMemorySearchTool,registerMemoryCli},channel:{text:{chunkByNewline,chunkMarkdownText,chunkMarkdownTextWithMode,chunkText,chunkTextWithMode,resolveChunkMode,resolveTextChunkLimit,hasControlCommand,resolveMarkdownTableMode,convertMarkdownTables},reply:{dispatchReplyWithBufferedBlockDispatcher,createReplyDispatcherWithTyping,resolveEffectiveMessagesConfig,resolveHumanDelayConfig,dispatchReplyFromConfig,finalizeInboundContext,formatAgentEnvelope,formatInboundEnvelope,resolveEnvelopeFormatOptions},routing:{resolveAgentRoute},pairing:{buildPairingReply,readAllowFromStore:readChannelAllowFromStore,upsertPairingRequest:upsertChannelPairingRequest},media:{fetchRemoteMedia,saveMediaBuffer},activity:{record:recordChannelActivity,get:getChannelActivity},session:{resolveStorePath,readSessionUpdatedAt,recordSessionMetaFromInbound,recordInboundSession,updateLastRoute},mentions:{buildMentionRegexes,matchesMentionPatterns,matchesMentionWithExplicit},reactions:{shouldAckReaction,removeAckReactionAfterReply},groups:{resolveGroupPolicy:resolveChannelGroupPolicy,resolveRequireMention:resolveChannelGroupRequireMention},debounce:{createInboundDebouncer,resolveInboundDebounceMs},commands:{resolveCommandAuthorizedFromAuthorizers,isControlCommandMessage,shouldComputeCommandAuthorized,shouldHandleTextCommands},discord:{messageActions:discordMessageActions,auditChannelPermissions:auditDiscordChannelPermissions,listDirectoryGroupsLive:listDiscordDirectoryGroupsLive,listDirectoryPeersLive:listDiscordDirectoryPeersLive,probeDiscord,resolveChannelAllowlist:resolveDiscordChannelAllowlist,resolveUserAllowlist:resolveDiscordUserAllowlist,sendMessageDiscord,sendPollDiscord,monitorDiscordProvider},slack:{listDirectoryGroupsLive:listSlackDirectoryGroupsLive,listDirectoryPeersLive:listSlackDirectoryPeersLive,probeSlack,resolveChannelAllowlist:resolveSlackChannelAllowlist,resolveUserAllowlist:resolveSlackUserAllowlist,sendMessageSlack,monitorSlackProvider,handleSlackAction},telegram:{auditGroupMembership:auditTelegramGroupMembership,collectUnmentionedGroupIds:collectTelegramUnmentionedGroupIds,probeTelegram,resolveTelegramToken,sendMessageTelegram,sendPollTelegram,monitorTelegramProvider,messageActions:telegramMessageActions},signal:{probeSignal,sendMessageSignal,monitorSignalProvider,messageActions:signalMessageActions},imessage:{monitorIMessageProvider,probeIMessage,sendMessageIMessage},whatsapp:{getActiveWebListener,getWebAuthAgeMs,logoutWeb,logWebSelfId,readWebSelfId,webAuthExists,sendMessageWhatsApp:sendMessageWhatsAppLazy,sendPollWhatsApp:sendPollWhatsAppLazy,loginWeb:loginWebLazy,startWebLoginWithQr:startWebLoginWithQrLazy,waitForWebLogin:waitForWebLoginLazy,monitorWebChannel:monitorWebChannelLazy,handleWhatsAppAction:handleWhatsAppActionLazy,createLoginTool:createWhatsAppLoginTool},line:{listLineAccountIds,resolveDefaultLineAccountId,resolveLineAccount,normalizeAccountId:normalizeAccountId$1,probeLineBot,sendMessageLine,pushMessageLine,pushMessagesLine,pushFlexMessage,pushTemplateMessage,pushLocationMessage,pushTextMessageWithQuickReplies,createQuickReplyItems,buildTemplateMessageFromPayload,monitorLineProvider}},logging:{shouldLogVerbose,getChildLogger:(bindings,opts)=>{let logger=getChildLogger(bindings,{level:opts?.level?normalizeLogLevel(opts.level):void 0});return{debug:message=>logger.debug?.(message),info:message=>logger.info(message),warn:message=>logger.warn(message),error:message=>logger.error(message)}}},state:{resolveStateDir}}}const registryCache=new Map,defaultLogger=()=>createSubsystemLogger(`plugins`),resolvePluginSdkAliasFile=params=>{try{let modulePath=fileURLToPath(import.meta.url),isTest=process.env.VITEST||!1,cursor=path.dirname(modulePath);for(let i=0;i<6;i+=1){let srcCandidate=path.join(cursor,`src`,`plugin-sdk`,params.srcFile),distCandidate=path.join(cursor,`dist`,`plugin-sdk`,params.distFile),orderedCandidates=isTest?[distCandidate,srcCandidate]:[distCandidate];for(let candidate of orderedCandidates)if(fs$1.existsSync(candidate))return candidate;let parent=path.dirname(cursor);if(parent===cursor)break;cursor=parent}}catch{}return null},resolvePluginSdkAlias=()=>resolvePluginSdkAliasFile({srcFile:`index.ts`,distFile:`index.js`}),resolvePluginSdkAccountIdAlias=()=>resolvePluginSdkAliasFile({srcFile:`account-id.ts`,distFile:`account-id.js`});function buildCacheKey(params){return`${params.workspaceDir?resolveUserPath(params.workspaceDir):``}::${JSON.stringify(params.plugins)}`}function validatePluginConfig(params){let schema=params.schema;if(!schema)return{ok:!0,value:params.value};let result=validateJsonSchemaValue({schema,cacheKey:params.cacheKey??JSON.stringify(schema),value:params.value??{}});return result.ok?{ok:!0,value:params.value}:{ok:!1,errors:result.errors}}function resolvePluginModuleExport(moduleExport){let resolved=moduleExport&&typeof moduleExport==`object`&&`default`in moduleExport?moduleExport.default:moduleExport;if(typeof resolved==`function`)return{register:resolved};if(resolved&&typeof resolved==`object`){let def=resolved;return{definition:def,register:def.register??def.activate}}return{}}function createPluginRecord(params){return{id:params.id,name:params.name??params.id,description:params.description,version:params.version,source:params.source,origin:params.origin,workspaceDir:params.workspaceDir,enabled:params.enabled,status:params.enabled?`loaded`:`disabled`,toolNames:[],hookNames:[],channelIds:[],providerIds:[],gatewayMethods:[],cliCommands:[],services:[],commands:[],httpHandlers:0,hookCount:0,configSchema:params.configSchema,configUiHints:void 0,configJsonSchema:void 0}}function pushDiagnostics(diagnostics,append){diagnostics.push(...append)}function registerManifestHookDirs(params){for(let hookDir of params.hookDirs){let resolvedDir=path.resolve(params.rootDir,hookDir);registerPluginHooksFromDir(params.api,resolvedDir).then(hookResult=>{for(let message of hookResult.errors)params.diagnostics.push({level:`warn`,pluginId:params.record.id,source:params.record.source,message})}).catch(err=>{params.logger.warn(`[plugins] ${params.record.id} failed loading hooks from ${resolvedDir}: ${String(err)}`)})}}function loadBuilderForceAgentsPlugins(options={}){let cfg=applyTestPluginDefaults(options.config??{},process.env),logger=options.logger??defaultLogger(),validateOnly=options.mode===`validate`,normalized=normalizePluginsConfig(cfg.plugins),cacheKey=buildCacheKey({workspaceDir:options.workspaceDir,plugins:normalized}),cacheEnabled=options.cache!==!1;if(cacheEnabled){let cached=registryCache.get(cacheKey);if(cached)return setActivePluginRegistry(cached,cacheKey),cached}clearPluginCommands();let{registry,createApi}=createPluginRegistry({logger,runtime:createPluginRuntime(),coreGatewayHandlers:options.coreGatewayHandlers}),discovery=discoverBuilderForceAgentsPlugins({workspaceDir:options.workspaceDir,extraPaths:normalized.loadPaths}),manifestRegistry=loadPluginManifestRegistry({config:cfg,workspaceDir:options.workspaceDir,cache:options.cache,candidates:discovery.candidates,diagnostics:discovery.diagnostics});pushDiagnostics(registry.diagnostics,manifestRegistry.diagnostics);let jitiLoader=null,getJiti=()=>{if(jitiLoader)return jitiLoader;let pluginSdkAlias=resolvePluginSdkAlias(),pluginSdkAccountIdAlias=resolvePluginSdkAccountIdAlias();return jitiLoader=createJiti(import.meta.url,{interopDefault:!0,extensions:[`.ts`,`.tsx`,`.mts`,`.cts`,`.mtsx`,`.ctsx`,`.js`,`.mjs`,`.cjs`,`.json`],...pluginSdkAlias||pluginSdkAccountIdAlias?{alias:{...pluginSdkAlias?{"@seanhogg/builderforce-agents/plugin-sdk":pluginSdkAlias}:{},...pluginSdkAccountIdAlias?{"@seanhogg/builderforce-agents/plugin-sdk/account-id":pluginSdkAccountIdAlias}:{}}}:{}}),jitiLoader},manifestByRoot=new Map(manifestRegistry.plugins.map(record=>[record.rootDir,record])),seenIds=new Map,memorySlot=normalized.slots.memory,selectedMemoryPluginId=null,memorySlotMatched=!1;for(let candidate of discovery.candidates){let manifestRecord=manifestByRoot.get(candidate.rootDir);if(!manifestRecord)continue;let pluginId=manifestRecord.id,existingOrigin=seenIds.get(pluginId);if(existingOrigin){let record=createPluginRecord({id:pluginId,name:manifestRecord.name??pluginId,description:manifestRecord.description,version:manifestRecord.version,source:candidate.source,origin:candidate.origin,workspaceDir:candidate.workspaceDir,enabled:!1,configSchema:!!manifestRecord.configSchema});record.status=`disabled`,record.error=`overridden by ${existingOrigin} plugin`,registry.plugins.push(record);continue}let enableState=resolveEnableState(pluginId,candidate.origin,normalized),entry=normalized.entries[pluginId],record=createPluginRecord({id:pluginId,name:manifestRecord.name??pluginId,description:manifestRecord.description,version:manifestRecord.version,source:candidate.source,origin:candidate.origin,workspaceDir:candidate.workspaceDir,enabled:enableState.enabled,configSchema:!!manifestRecord.configSchema});if(record.kind=manifestRecord.kind,record.configUiHints=manifestRecord.configUiHints,record.configJsonSchema=manifestRecord.configSchema,!enableState.enabled){record.status=`disabled`,record.error=enableState.reason,registry.plugins.push(record),seenIds.set(pluginId,candidate.origin);continue}if(!manifestRecord.configSchema){record.status=`error`,record.error=`missing config schema`,registry.plugins.push(record),seenIds.set(pluginId,candidate.origin),registry.diagnostics.push({level:`error`,pluginId:record.id,source:record.source,message:record.error});continue}let mod=null;try{mod=getJiti()(candidate.source)}catch(err){logger.error(`[plugins] ${record.id} failed to load from ${record.source}: ${String(err)}`),record.status=`error`,record.error=String(err),registry.plugins.push(record),seenIds.set(pluginId,candidate.origin),registry.diagnostics.push({level:`error`,pluginId:record.id,source:record.source,message:`failed to load plugin: ${String(err)}`});continue}let resolved=resolvePluginModuleExport(mod),definition=resolved.definition,register=resolved.register;definition?.id&&definition.id!==record.id&&registry.diagnostics.push({level:`warn`,pluginId:record.id,source:record.source,message:`plugin id mismatch (config uses "${record.id}", export uses "${definition.id}")`}),record.name=definition?.name??record.name,record.description=definition?.description??record.description,record.version=definition?.version??record.version;let manifestKind=record.kind,exportKind=definition?.kind;manifestKind&&exportKind&&exportKind!==manifestKind&&registry.diagnostics.push({level:`warn`,pluginId:record.id,source:record.source,message:`plugin kind mismatch (manifest uses "${manifestKind}", export uses "${exportKind}")`}),record.kind=definition?.kind??record.kind,record.kind===`memory`&&memorySlot===record.id&&(memorySlotMatched=!0);let memoryDecision=resolveMemorySlotDecision({id:record.id,kind:record.kind,slot:memorySlot,selectedId:selectedMemoryPluginId});if(!memoryDecision.enabled){record.enabled=!1,record.status=`disabled`,record.error=memoryDecision.reason,registry.plugins.push(record),seenIds.set(pluginId,candidate.origin);continue}memoryDecision.selected&&record.kind===`memory`&&(selectedMemoryPluginId=record.id);let validatedConfig=validatePluginConfig({schema:manifestRecord.configSchema,cacheKey:manifestRecord.schemaCacheKey,value:entry?.config});if(!validatedConfig.ok){logger.error(`[plugins] ${record.id} invalid config: ${validatedConfig.errors?.join(`, `)}`),record.status=`error`,record.error=`invalid config: ${validatedConfig.errors?.join(`, `)}`,registry.plugins.push(record),seenIds.set(pluginId,candidate.origin),registry.diagnostics.push({level:`error`,pluginId:record.id,source:record.source,message:record.error});continue}if(validateOnly){registry.plugins.push(record),seenIds.set(pluginId,candidate.origin);continue}if(typeof register!=`function`){logger.error(`[plugins] ${record.id} missing register/activate export`),record.status=`error`,record.error=`plugin export missing register/activate`,registry.plugins.push(record),seenIds.set(pluginId,candidate.origin),registry.diagnostics.push({level:`error`,pluginId:record.id,source:record.source,message:record.error});continue}let api=createApi(record,{config:cfg,pluginConfig:validatedConfig.value});try{let result=register(api);result&&typeof result.then==`function`&&registry.diagnostics.push({level:`warn`,pluginId:record.id,source:record.source,message:`plugin register returned a promise; async registration is ignored`}),registerManifestHookDirs({api,record,rootDir:manifestRecord.rootDir,hookDirs:manifestRecord.hooks,diagnostics:registry.diagnostics,logger}),registry.plugins.push(record),seenIds.set(pluginId,candidate.origin)}catch(err){logger.error(`[plugins] ${record.id} failed during register from ${record.source}: ${String(err)}`),record.status=`error`,record.error=String(err),registry.plugins.push(record),seenIds.set(pluginId,candidate.origin),registry.diagnostics.push({level:`error`,pluginId:record.id,source:record.source,message:`plugin failed during register: ${String(err)}`})}}return typeof memorySlot==`string`&&!memorySlotMatched&&registry.diagnostics.push({level:`warn`,message:`memory slot plugin not found or not marked as memory: ${memorySlot}`}),cacheEnabled&&registryCache.set(cacheKey,registry),setActivePluginRegistry(registry,cacheKey),initializeGlobalHookRunner(registry),registry}function createPluginLoaderLogger(logger){return{info:msg=>logger.info(msg),warn:msg=>logger.warn(msg),error:msg=>logger.error(msg),debug:msg=>logger.debug?.(msg)}}const log$6=createSubsystemLogger(`plugins`),pluginToolMeta=new WeakMap;function getPluginToolMeta(tool){return pluginToolMeta.get(tool)}function normalizeAllowlist(list){return new Set((list??[]).map(normalizeToolName).filter(Boolean))}function isOptionalToolAllowed(params){if(params.allowlist.size===0)return!1;let toolName=normalizeToolName(params.toolName);if(params.allowlist.has(toolName))return!0;let pluginKey=normalizeToolName(params.pluginId);return params.allowlist.has(pluginKey)?!0:params.allowlist.has(`group:plugins`)}function resolvePluginTools(params){let effectiveConfig=applyTestPluginDefaults(params.context.config??{},process.env);if(!normalizePluginsConfig(effectiveConfig.plugins).enabled)return[];let registry=loadBuilderForceAgentsPlugins({config:effectiveConfig,workspaceDir:params.context.workspaceDir,logger:createPluginLoaderLogger(log$6)}),tools=[],existing=params.existingToolNames??new Set,existingNormalized=new Set(Array.from(existing,tool=>normalizeToolName(tool))),allowlist=normalizeAllowlist(params.toolAllowlist),blockedPlugins=new Set;for(let entry of registry.tools){if(blockedPlugins.has(entry.pluginId))continue;let pluginIdKey=normalizeToolName(entry.pluginId);if(existingNormalized.has(pluginIdKey)){let message=`plugin id conflicts with core tool name (${entry.pluginId})`;log$6.error(message),registry.diagnostics.push({level:`error`,pluginId:entry.pluginId,source:entry.source,message}),blockedPlugins.add(entry.pluginId);continue}let resolved=null;try{resolved=entry.factory(params.context)}catch(err){log$6.error(`plugin tool failed (${entry.pluginId}): ${String(err)}`);continue}if(!resolved)continue;let listRaw=Array.isArray(resolved)?resolved:[resolved],list=entry.optional?listRaw.filter(tool=>isOptionalToolAllowed({toolName:tool.name,pluginId:entry.pluginId,allowlist})):listRaw;if(list.length===0)continue;let nameSet=new Set;for(let tool of list){if(nameSet.has(tool.name)||existing.has(tool.name)){let message=`plugin tool name conflict (${entry.pluginId}): ${tool.name}`;log$6.error(message),registry.diagnostics.push({level:`error`,pluginId:entry.pluginId,source:entry.source,message});continue}nameSet.add(tool.name),existing.add(tool.name),pluginToolMeta.set(tool,{pluginId:entry.pluginId,optional:entry.optional}),tools.push(tool)}}return tools}async function defaultReadFile(filePath){return fs.readFile(filePath,`utf8`)}async function applyUpdateHunk(filePath,chunks,options){let originalLines=(await(options?.readFile??defaultReadFile)(filePath).catch(err=>{throw Error(`Failed to read file to update ${filePath}: ${err}`)})).split(`
532
532
  `);originalLines.length>0&&originalLines[originalLines.length-1]===``&&originalLines.pop();let newLines=applyReplacements(originalLines,computeReplacements(originalLines,filePath,chunks));return(newLines.length===0||newLines[newLines.length-1]!==``)&&(newLines=[...newLines,``]),newLines.join(`
533
533
  `)}function computeReplacements(originalLines,filePath,chunks){let replacements=[],lineIndex=0;for(let chunk of chunks){if(chunk.changeContext){let ctxIndex=seekSequence(originalLines,[chunk.changeContext],lineIndex,!1);if(ctxIndex===null)throw Error(`Failed to find context '${chunk.changeContext}' in ${filePath}`);lineIndex=ctxIndex+1}if(chunk.oldLines.length===0){let insertionIndex=originalLines.length>0&&originalLines[originalLines.length-1]===``?originalLines.length-1:originalLines.length;replacements.push([insertionIndex,0,chunk.newLines]);continue}let pattern=chunk.oldLines,newSlice=chunk.newLines,found=seekSequence(originalLines,pattern,lineIndex,chunk.isEndOfFile);if(found===null&&pattern[pattern.length-1]===``&&(pattern=pattern.slice(0,-1),newSlice.length>0&&newSlice[newSlice.length-1]===``&&(newSlice=newSlice.slice(0,-1)),found=seekSequence(originalLines,pattern,lineIndex,chunk.isEndOfFile)),found===null)throw Error(`Failed to find expected lines in ${filePath}:\n${chunk.oldLines.join(`
534
534
  `)}`);replacements.push([found,pattern.length,newSlice]),lineIndex=found+pattern.length}return replacements.sort((a,b)=>a[0]-b[0]),replacements}function applyReplacements(lines,replacements){let result=[...lines];for(let[startIndex,oldLen,newLines]of[...replacements].toReversed()){for(let i=0;i<oldLen;i+=1)startIndex<result.length&&result.splice(startIndex,1);for(let i=0;i<newLines.length;i+=1)result.splice(startIndex+i,0,newLines[i])}return result}function seekSequence(lines,pattern,start,eof){if(pattern.length===0)return start;if(pattern.length>lines.length)return null;let maxStart=lines.length-pattern.length,searchStart=eof&&lines.length>=pattern.length?maxStart:start;if(searchStart>maxStart)return null;for(let i=searchStart;i<=maxStart;i+=1)if(linesMatch(lines,pattern,i,value=>value))return i;for(let i=searchStart;i<=maxStart;i+=1)if(linesMatch(lines,pattern,i,value=>value.trimEnd()))return i;for(let i=searchStart;i<=maxStart;i+=1)if(linesMatch(lines,pattern,i,value=>value.trim()))return i;for(let i=searchStart;i<=maxStart;i+=1)if(linesMatch(lines,pattern,i,value=>normalizePunctuation(value.trim())))return i;return null}function linesMatch(lines,pattern,start,normalize){for(let idx=0;idx<pattern.length;idx+=1)if(normalize(lines[start+idx])!==normalize(pattern[idx]))return!1;return!0}function normalizePunctuation(value){return Array.from(value).map(char=>{switch(char){case`‐`:case`‑`:case`‒`:case`–`:case`—`:case`―`:case`−`:return`-`;case`‘`:case`’`:case`‚`:case`‛`:return`'`;case`“`:case`”`:case`„`:case`‟`:return`"`;case`\xA0`:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:return` `;default:return char}}).join(``)}const BEGIN_PATCH_MARKER=`*** Begin Patch`,applyPatchSchema=Type.Object({input:Type.String({description:`Patch content using the *** Begin Patch/End Patch format.`})});function createApplyPatchTool(options={}){let cwd=options.cwd??process.cwd(),sandbox=options.sandbox,workspaceOnly=options.workspaceOnly!==!1;return{name:`apply_patch`,label:`apply_patch`,description:`Apply a patch to one or more files using the apply_patch format. The input should include *** Begin Patch and *** End Patch markers.`,parameters:applyPatchSchema,execute:async(_toolCallId,args,signal)=>{let params=args,input=typeof params.input==`string`?params.input:``;if(!input.trim())throw Error(`Provide a patch input.`);if(signal?.aborted){let err=Error(`Aborted`);throw err.name=`AbortError`,err}let result=await applyPatch(input,{cwd,sandbox,workspaceOnly,signal});return{content:[{type:`text`,text:result.text}],details:{summary:result.summary}}}}}async function applyPatch(input,options){let parsed=parsePatchText(input);if(parsed.hunks.length===0)throw Error(`No files were modified.`);let summary={added:[],modified:[],deleted:[]},seen={added:new Set,modified:new Set,deleted:new Set},fileOps=resolvePatchFileOps(options);for(let hunk of parsed.hunks){if(options.signal?.aborted){let err=Error(`Aborted`);throw err.name=`AbortError`,err}if(hunk.kind===`add`){let target=await resolvePatchPath(hunk.path,options);await ensureDir(target.resolved,fileOps),await fileOps.writeFile(target.resolved,hunk.contents),recordSummary(summary,seen,`added`,target.display);continue}if(hunk.kind===`delete`){let target=await resolvePatchPath(hunk.path,options,`unlink`);await fileOps.remove(target.resolved),recordSummary(summary,seen,`deleted`,target.display);continue}let target=await resolvePatchPath(hunk.path,options),applied=await applyUpdateHunk(target.resolved,hunk.chunks,{readFile:path=>fileOps.readFile(path)});if(hunk.movePath){let moveTarget=await resolvePatchPath(hunk.movePath,options);await ensureDir(moveTarget.resolved,fileOps),await fileOps.writeFile(moveTarget.resolved,applied),await fileOps.remove(target.resolved),recordSummary(summary,seen,`modified`,moveTarget.display)}else await fileOps.writeFile(target.resolved,applied),recordSummary(summary,seen,`modified`,target.display)}return{summary,text:formatSummary(summary)}}function recordSummary(summary,seen,bucket,value){seen[bucket].has(value)||(seen[bucket].add(value),summary[bucket].push(value))}function formatSummary(summary){let lines=[`Success. Updated the following files:`];for(let file of summary.added)lines.push(`A ${file}`);for(let file of summary.modified)lines.push(`M ${file}`);for(let file of summary.deleted)lines.push(`D ${file}`);return lines.join(`
package/dist/entry.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{y as resolveRequiredHomeDir}from"./paths-BHg-VHB4.js";import{t as isValidProfileName}from"./profile-utils-BKdObK6T.js";import{c as hasHelpOrVersion}from"./argv-BgQk38nl.js";import{t as normalizeWindowsArgv}from"./windows-argv-ClCYQujd.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import{r as normalizeEnv,t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{t as installProcessWarningFilter}from"./warning-filter-nSTjpMIH.js";import{spawn}from"node:child_process";import process$1 from"node:process";import os from"node:os";import path from"node:path";function takeValue(raw,next){if(raw.includes(`=`)){let[,value]=raw.split(`=`,2);return{value:(value??``).trim()||null,consumedNext:!1}}return{value:(next??``).trim()||null,consumedNext:!!next}}function parseCliProfileArgs(argv){if(argv.length<2)return{ok:!0,profile:null,argv};let out=argv.slice(0,2),profile=null,sawDev=!1,sawCommand=!1,args=argv.slice(2);for(let i=0;i<args.length;i+=1){let arg=args[i];if(arg!==void 0){if(sawCommand){out.push(arg);continue}if(arg===`--dev`){if(profile&&profile!==`dev`)return{ok:!1,error:`Cannot combine --dev with --profile`};sawDev=!0,profile=`dev`;continue}if(arg===`--profile`||arg.startsWith(`--profile=`)){if(sawDev)return{ok:!1,error:`Cannot combine --dev with --profile`};let next=args[i+1],{value,consumedNext}=takeValue(arg,next);if(consumedNext&&(i+=1),!value)return{ok:!1,error:`--profile requires a value`};if(!isValidProfileName(value))return{ok:!1,error:`Invalid --profile (use letters, numbers, "_", "-" only)`};profile=value;continue}if(!arg.startsWith(`-`)){sawCommand=!0,out.push(arg);continue}out.push(arg)}}return{ok:!0,profile,argv:out}}function resolveProfileStateDir(profile,env,homedir){let suffix=profile.toLowerCase()===`default`?``:`-${profile}`;return path.join(resolveRequiredHomeDir(env,homedir),`.builderforce${suffix}`)}function applyCliProfileEnv(params){let env=params.env??process.env,homedir=params.homedir??os.homedir,profile=params.profile.trim();if(!profile)return;env.BUILDERFORCE_AGENTS_PROFILE=profile;let stateDir=env.BUILDERFORCE_AGENTS_STATE_DIR?.trim()||resolveProfileStateDir(profile,env,homedir);env.BUILDERFORCE_AGENTS_STATE_DIR?.trim()||(env.BUILDERFORCE_AGENTS_STATE_DIR=stateDir),env.BUILDERFORCE_AGENTS_CONFIG_PATH?.trim()||(env.BUILDERFORCE_AGENTS_CONFIG_PATH=path.join(stateDir,`builderforce.json`)),profile===`dev`&&!env.BUILDERFORCE_AGENTS_GATEWAY_PORT?.trim()&&(env.BUILDERFORCE_AGENTS_GATEWAY_PORT=`19001`)}function shouldSkipRespawnForArgv(argv){return hasHelpOrVersion(argv)}const defaultSignals=process$1.platform===`win32`?[`SIGTERM`,`SIGINT`,`SIGBREAK`]:[`SIGTERM`,`SIGINT`,`SIGHUP`,`SIGQUIT`];function attachChildProcessBridge(child,{signals=defaultSignals,onSignal}={}){let listeners=new Map;for(let signal of signals){let listener=()=>{onSignal?.(signal);try{child.kill(signal)}catch{}};try{process$1.on(signal,listener),listeners.set(signal,listener)}catch{}}let detach=()=>{for(let[signal,listener]of listeners)process$1.off(signal,listener);listeners.clear()};return child.once(`exit`,detach),child.once(`error`,detach),{detach}}process$1.title=`builderforce`,installProcessWarningFilter(),normalizeEnv(),process$1.argv.includes(`--no-color`)&&(process$1.env.NO_COLOR=`1`,process$1.env.FORCE_COLOR=`0`);const EXPERIMENTAL_WARNING_FLAG=`--disable-warning=ExperimentalWarning`;function hasExperimentalWarningSuppressed(){let nodeOptions=process$1.env.NODE_OPTIONS??``;if(nodeOptions.includes(EXPERIMENTAL_WARNING_FLAG)||nodeOptions.includes(`--no-warnings`))return!0;for(let arg of process$1.execArgv)if(arg===EXPERIMENTAL_WARNING_FLAG||arg===`--no-warnings`)return!0;return!1}function ensureExperimentalWarningSuppressed(){if(shouldSkipRespawnForArgv(process$1.argv)||isTruthyEnvValue(process$1.env.BUILDERFORCE_AGENTS_NO_RESPAWN)||isTruthyEnvValue(process$1.env.BUILDERFORCE_AGENTS_NODE_OPTIONS_READY)||hasExperimentalWarningSuppressed())return!1;process$1.env.BUILDERFORCE_AGENTS_NODE_OPTIONS_READY=`1`;let child=spawn(process$1.execPath,[EXPERIMENTAL_WARNING_FLAG,...process$1.execArgv,...process$1.argv.slice(1)],{stdio:`inherit`,env:process$1.env});return attachChildProcessBridge(child),child.once(`exit`,(code,signal)=>{if(signal){process$1.exitCode=1;return}process$1.exit(code??1)}),child.once(`error`,error=>{console.error(`[builderforce] Failed to respawn CLI:`,error instanceof Error?error.stack??error.message:error),process$1.exit(1)}),!0}if(process$1.argv=normalizeWindowsArgv(process$1.argv),!ensureExperimentalWarningSuppressed()){let parsed=parseCliProfileArgs(process$1.argv);parsed.ok||(console.error(`[builderforce] ${parsed.error}`),process$1.exit(2)),parsed.profile&&(applyCliProfileEnv({profile:parsed.profile}),process$1.argv=parsed.argv),import(`./run-main-Cyc_C0B-.js`).then(({runCli})=>runCli(process$1.argv)).catch(error=>{console.error(`[builderforce] Failed to start CLI:`,error instanceof Error?error.stack??error.message:error),process$1.exitCode=1})}export{};
2
+ import{y as resolveRequiredHomeDir}from"./paths-BHg-VHB4.js";import{t as isValidProfileName}from"./profile-utils-BKdObK6T.js";import{c as hasHelpOrVersion}from"./argv-BgQk38nl.js";import{t as normalizeWindowsArgv}from"./windows-argv-ClCYQujd.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import{r as normalizeEnv,t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{t as installProcessWarningFilter}from"./warning-filter-nSTjpMIH.js";import{spawn}from"node:child_process";import process$1 from"node:process";import os from"node:os";import path from"node:path";function takeValue(raw,next){if(raw.includes(`=`)){let[,value]=raw.split(`=`,2);return{value:(value??``).trim()||null,consumedNext:!1}}return{value:(next??``).trim()||null,consumedNext:!!next}}function parseCliProfileArgs(argv){if(argv.length<2)return{ok:!0,profile:null,argv};let out=argv.slice(0,2),profile=null,sawDev=!1,sawCommand=!1,args=argv.slice(2);for(let i=0;i<args.length;i+=1){let arg=args[i];if(arg!==void 0){if(sawCommand){out.push(arg);continue}if(arg===`--dev`){if(profile&&profile!==`dev`)return{ok:!1,error:`Cannot combine --dev with --profile`};sawDev=!0,profile=`dev`;continue}if(arg===`--profile`||arg.startsWith(`--profile=`)){if(sawDev)return{ok:!1,error:`Cannot combine --dev with --profile`};let next=args[i+1],{value,consumedNext}=takeValue(arg,next);if(consumedNext&&(i+=1),!value)return{ok:!1,error:`--profile requires a value`};if(!isValidProfileName(value))return{ok:!1,error:`Invalid --profile (use letters, numbers, "_", "-" only)`};profile=value;continue}if(!arg.startsWith(`-`)){sawCommand=!0,out.push(arg);continue}out.push(arg)}}return{ok:!0,profile,argv:out}}function resolveProfileStateDir(profile,env,homedir){let suffix=profile.toLowerCase()===`default`?``:`-${profile}`;return path.join(resolveRequiredHomeDir(env,homedir),`.builderforce${suffix}`)}function applyCliProfileEnv(params){let env=params.env??process.env,homedir=params.homedir??os.homedir,profile=params.profile.trim();if(!profile)return;env.BUILDERFORCE_AGENTS_PROFILE=profile;let stateDir=env.BUILDERFORCE_AGENTS_STATE_DIR?.trim()||resolveProfileStateDir(profile,env,homedir);env.BUILDERFORCE_AGENTS_STATE_DIR?.trim()||(env.BUILDERFORCE_AGENTS_STATE_DIR=stateDir),env.BUILDERFORCE_AGENTS_CONFIG_PATH?.trim()||(env.BUILDERFORCE_AGENTS_CONFIG_PATH=path.join(stateDir,`builderforce.json`)),profile===`dev`&&!env.BUILDERFORCE_AGENTS_GATEWAY_PORT?.trim()&&(env.BUILDERFORCE_AGENTS_GATEWAY_PORT=`19001`)}function shouldSkipRespawnForArgv(argv){return hasHelpOrVersion(argv)}const defaultSignals=process$1.platform===`win32`?[`SIGTERM`,`SIGINT`,`SIGBREAK`]:[`SIGTERM`,`SIGINT`,`SIGHUP`,`SIGQUIT`];function attachChildProcessBridge(child,{signals=defaultSignals,onSignal}={}){let listeners=new Map;for(let signal of signals){let listener=()=>{onSignal?.(signal);try{child.kill(signal)}catch{}};try{process$1.on(signal,listener),listeners.set(signal,listener)}catch{}}let detach=()=>{for(let[signal,listener]of listeners)process$1.off(signal,listener);listeners.clear()};return child.once(`exit`,detach),child.once(`error`,detach),{detach}}process$1.title=`builderforce`,installProcessWarningFilter(),normalizeEnv(),process$1.argv.includes(`--no-color`)&&(process$1.env.NO_COLOR=`1`,process$1.env.FORCE_COLOR=`0`);const EXPERIMENTAL_WARNING_FLAG=`--disable-warning=ExperimentalWarning`;function hasExperimentalWarningSuppressed(){let nodeOptions=process$1.env.NODE_OPTIONS??``;if(nodeOptions.includes(EXPERIMENTAL_WARNING_FLAG)||nodeOptions.includes(`--no-warnings`))return!0;for(let arg of process$1.execArgv)if(arg===EXPERIMENTAL_WARNING_FLAG||arg===`--no-warnings`)return!0;return!1}function ensureExperimentalWarningSuppressed(){if(shouldSkipRespawnForArgv(process$1.argv)||isTruthyEnvValue(process$1.env.BUILDERFORCE_AGENTS_NO_RESPAWN)||isTruthyEnvValue(process$1.env.BUILDERFORCE_AGENTS_NODE_OPTIONS_READY)||hasExperimentalWarningSuppressed())return!1;process$1.env.BUILDERFORCE_AGENTS_NODE_OPTIONS_READY=`1`;let child=spawn(process$1.execPath,[EXPERIMENTAL_WARNING_FLAG,...process$1.execArgv,...process$1.argv.slice(1)],{stdio:`inherit`,env:process$1.env});return attachChildProcessBridge(child),child.once(`exit`,(code,signal)=>{if(signal){process$1.exitCode=1;return}process$1.exit(code??1)}),child.once(`error`,error=>{console.error(`[builderforce] Failed to respawn CLI:`,error instanceof Error?error.stack??error.message:error),process$1.exit(1)}),!0}if(process$1.argv=normalizeWindowsArgv(process$1.argv),!ensureExperimentalWarningSuppressed()){let parsed=parseCliProfileArgs(process$1.argv);parsed.ok||(console.error(`[builderforce] ${parsed.error}`),process$1.exit(2)),parsed.profile&&(applyCliProfileEnv({profile:parsed.profile}),process$1.argv=parsed.argv),import(`./run-main-EhlBxGJB.js`).then(({runCli})=>runCli(process$1.argv)).catch(error=>{console.error(`[builderforce] Failed to start CLI:`,error instanceof Error?error.stack??error.message:error),process$1.exitCode=1})}export{};
@@ -1 +1 @@
1
- import"./paths-CAQcjxp2.js";import"./session-key-CYpYHc1e.js";import"./registry-j1UKIotU.js";import{r as resolveAgentDir,s as resolveAgentWorkspaceDir,y as ensureAgentWorkspace}from"./agent-scope-C7zGN7Pz.js";import"./subsystem-ykSbyaud.js";import{_t as DEFAULT_MODEL,g as resolveThinkingDefault,vt as DEFAULT_PROVIDER}from"./model-selection-C3ZZhhap.js";import{a as resolveAgentIdentity}from"./reply-prefix-CWwv5MP-.js";import"./env-44XUbLhk.js";import"./src-izs0XSXm.js";import{M as resolveAgentTimeoutMs,t as runEmbeddedAgent}from"./embedded-CA0n2tyG.js";import"./replies-Ll3akn2U.js";import"./plugins-CjU7Ut5E.js";import"./accounts-xbnfJmsd.js";import"./bindings-6UAwilZE.js";import{Mt as saveSessionStore,kt as loadSessionStore}from"./runner-C1sy_uJN.js";import"./fetch-D2i2BBd3.js";import"./model-catalog-DCZ6NJ5B.js";import"./redact-xFefzy4M.js";import"./errors-CguQr0Ja.js";import"./config-BP4Wc0fa.js";import"./chrome-CAuboFG7.js";import"./message-channel-BKGbjp9g.js";import{n as resolveSessionFilePath,s as resolveStorePath}from"./paths-ZHayVsQS.js";import"./gemini-auth-VegjWP39.js";import"./tool-images-B8YdlzZb.js";import"./sqlite-DDTPj41Y.js";import"./manager-DXjpusew.js";import"./common-CgaBYMHL.js";import"./chunk-BCl8axDo.js";import"./markdown-tables-C-Z5_lwN.js";import"./render-NRLMXKq3.js";import"./active-listener-FQKmkr1L.js";import"./resolve-route-D5Ptdm3e.js";export{DEFAULT_MODEL,DEFAULT_PROVIDER,ensureAgentWorkspace,loadSessionStore,resolveAgentDir,resolveAgentIdentity,resolveAgentTimeoutMs,resolveAgentWorkspaceDir,resolveSessionFilePath,resolveStorePath,resolveThinkingDefault,runEmbeddedAgent,saveSessionStore};
1
+ import"./paths-CAQcjxp2.js";import"./session-key-CYpYHc1e.js";import"./registry-j1UKIotU.js";import{r as resolveAgentDir,s as resolveAgentWorkspaceDir,y as ensureAgentWorkspace}from"./agent-scope-C7zGN7Pz.js";import"./subsystem-ykSbyaud.js";import{_t as DEFAULT_MODEL,g as resolveThinkingDefault,vt as DEFAULT_PROVIDER}from"./model-selection-C3ZZhhap.js";import{a as resolveAgentIdentity}from"./reply-prefix-CWwv5MP-.js";import"./env-44XUbLhk.js";import"./src-izs0XSXm.js";import{M as resolveAgentTimeoutMs,t as runEmbeddedAgent}from"./embedded-BBM-usEa.js";import"./replies-Ll3akn2U.js";import"./plugins-CjU7Ut5E.js";import"./accounts-xbnfJmsd.js";import"./bindings-6UAwilZE.js";import{Mt as saveSessionStore,kt as loadSessionStore}from"./runner-P3IfAnSL.js";import"./fetch-D2i2BBd3.js";import"./model-catalog-DCZ6NJ5B.js";import"./redact-xFefzy4M.js";import"./errors-CguQr0Ja.js";import"./config-BP4Wc0fa.js";import"./chrome-CbBg1ngA.js";import"./message-channel-BKGbjp9g.js";import{n as resolveSessionFilePath,s as resolveStorePath}from"./paths-ZHayVsQS.js";import"./gemini-auth-VegjWP39.js";import"./tool-images-B8YdlzZb.js";import"./sqlite-DDTPj41Y.js";import"./manager-DXjpusew.js";import"./common-CgaBYMHL.js";import"./chunk-BCl8axDo.js";import"./markdown-tables-C-Z5_lwN.js";import"./render-NRLMXKq3.js";import"./active-listener-FQKmkr1L.js";import"./resolve-route-D5Ptdm3e.js";export{DEFAULT_MODEL,DEFAULT_PROVIDER,ensureAgentWorkspace,loadSessionStore,resolveAgentDir,resolveAgentIdentity,resolveAgentTimeoutMs,resolveAgentWorkspaceDir,resolveSessionFilePath,resolveStorePath,resolveThinkingDefault,runEmbeddedAgent,saveSessionStore};