@seanhogg/builderforce-agents 2026.10.12 → 2026.10.13

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 (186) hide show
  1. package/dist/{agent-DvDtjczG.js → agent-CeWx2EpQ.js} +1 -1
  2. package/dist/{agent-DiLX8OzY.js → agent-DrcnpqOF.js} +1 -1
  3. package/dist/{agents-BawpdEjP.js → agents-CRJM6qhK.js} +1 -1
  4. package/dist/{agents-COWLUJqm.js → agents-hATFRfwk.js} +1 -1
  5. package/dist/{audio-preflight-CYQiI74L.js → audio-preflight-B9CfGDD2.js} +1 -1
  6. package/dist/{audio-preflight-BN1u9Tpc.js → audio-preflight-DHHeocUj.js} +1 -1
  7. package/dist/{auth-choice-D9VN-WjA.js → auth-choice-CWbPLRN0.js} +1 -1
  8. package/dist/{auth-choice-3cdcHeim.js → auth-choice-CzhKgWJy.js} +1 -1
  9. package/dist/{auth-choice.apply-Cd0RR0Z-.js → auth-choice.apply-C0RTYtRN.js} +1 -1
  10. package/dist/{auth-choice.apply-CMDgoDNN.js → auth-choice.apply-ChrTTHkK.js} +1 -1
  11. package/dist/{auth-choice.apply-BAeGyEKW.js → auth-choice.apply-D4LYzI8l.js} +1 -1
  12. package/dist/{auth-choice.apply-CSXvPCea.js → auth-choice.apply-Dy4rVG6K.js} +1 -1
  13. package/dist/{auth-choice.apply.transformers-DkX2-OZa.js → auth-choice.apply.transformers-9v6HFzNs.js} +1 -1
  14. package/dist/{auth-choice.apply.transformers-CEVxl3ul.js → auth-choice.apply.transformers-Be8599JD.js} +1 -1
  15. package/dist/{auth-choice.apply.transformers-B2Nr9M7m.js → auth-choice.apply.transformers-CgfGlqy1.js} +1 -1
  16. package/dist/{auth-choice.apply.transformers-Dpy9gODo.js → auth-choice.apply.transformers-D9a8-sLS.js} +1 -1
  17. package/dist/{banner-C93QSUTe.js → banner-8F7-gU1V.js} +1 -1
  18. package/dist/build-info.json +3 -3
  19. package/dist/{builderforce-Dl4bZ63C.js → builderforce-CCfM1c79.js} +1 -1
  20. package/dist/{builderforce-C_tuO46t.js → builderforce-CImLd8Zo.js} +1 -1
  21. package/dist/bundled/boot-md/handler.js +1 -1
  22. package/dist/bundled/session-memory/handler.js +1 -1
  23. package/dist/{channel-options-CiYpNR-1.js → channel-options-CRng-5hZ.js} +1 -1
  24. package/dist/{channel-options-Cziy0WDc.js → channel-options-D5kOIN7b.js} +1 -1
  25. package/dist/{channel-web-Ae15MleJ.js → channel-web-B5HSpL4k.js} +1 -1
  26. package/dist/{channels-cli-CZM033Me.js → channels-cli-COl9TDHT.js} +1 -1
  27. package/dist/{channels-cli-yi1vxpvO.js → channels-cli-bR8QwOv3.js} +1 -1
  28. package/dist/chrome-ChzFLAeJ.js +4 -0
  29. package/dist/chrome-CrqJ4Ijz.js +4 -0
  30. package/dist/{cli-Bwv_-VuS.js → cli-BqJMHFNK.js} +1 -1
  31. package/dist/{cli-D8fndSEi.js → cli-DBn0qbHS.js} +1 -1
  32. package/dist/{command-registry-Cjom5ab0.js → command-registry-BqhtXJa7.js} +1 -1
  33. package/dist/{command-registry-8uEx2JjY.js → command-registry-DVH79C3B.js} +1 -1
  34. package/dist/{completion-cli-PTFpWp8Q.js → completion-cli-BFR0u1Uh.js} +1 -1
  35. package/dist/{completion-cli-LUuqgvVQ.js → completion-cli-BuUAEqQw.js} +1 -1
  36. package/dist/{completion-cli-DRsz70D2.js → completion-cli-CwaIh4zw.js} +1 -1
  37. package/dist/{completion-cli-BsXDz7T2.js → completion-cli-Da3-oE7r.js} +1 -1
  38. package/dist/{config-cli-BIx0enD5.js → config-cli-Bhrj7H1i.js} +1 -1
  39. package/dist/{config-cli-BFhOXrua.js → config-cli-DOHKZ1lO.js} +1 -1
  40. package/dist/{configure-D96xLIb6.js → configure-B-Yta1X3.js} +1 -1
  41. package/dist/{configure-S7YE6hn1.js → configure-BHVk4Ax9.js} +1 -1
  42. package/dist/{configure-dDKfCq_g.js → configure-D9YZEK_D.js} +1 -1
  43. package/dist/{configure-C7xdw9Kq.js → configure-DPE2hDzY.js} +1 -1
  44. package/dist/{deps-CGiO_NDu.js → deps-CrAVOWsA.js} +1 -1
  45. package/dist/{doctor-completion-ChhIrLd3.js → doctor-completion-CkjrUmbI.js} +1 -1
  46. package/dist/{doctor-completion-BUZwWoWB.js → doctor-completion-Dh9ah5lH.js} +1 -1
  47. package/dist/{embedded-DJYMy81Q.js → embedded-BrqzM5oT.js} +12 -12
  48. package/dist/{embedded-DjDnQMNx.js → embedded-wYxo-ADm.js} +12 -12
  49. package/dist/entry.js +1 -1
  50. package/dist/extensionAPI.js +1 -1
  51. package/dist/{gateway-cli-CN114d5j.js → gateway-cli-C2nh9UyY.js} +2 -2
  52. package/dist/{gateway-cli-Dzl70YBF.js → gateway-cli-CGkTLhet.js} +2 -2
  53. package/dist/{health-Cf1YoTRN.js → health-CEz2-7et.js} +1 -1
  54. package/dist/{health-AlkF1nUa.js → health-CFVx21sO.js} +1 -1
  55. package/dist/{health-ySVOGGNu.js → health-aKuq4xwa.js} +1 -1
  56. package/dist/{hooks-cli-6jeFEGg3.js → hooks-cli-DPSrycwI.js} +1 -1
  57. package/dist/{hooks-cli-DVPMCXUq.js → hooks-cli-uPHs7qnC.js} +1 -1
  58. package/dist/index.js +2 -2
  59. package/dist/llm-slug-generator.js +1 -1
  60. package/dist/{models-CGUxphfN.js → models--TwKHn8b.js} +1 -1
  61. package/dist/{models-CIMM_Z3u.js → models-BXJebxTU.js} +1 -1
  62. package/dist/{models-cli-Cijh2uON.js → models-cli-O1zCgeoA.js} +1 -1
  63. package/dist/{models-cli-Oys3e_I3.js → models-cli-iKu1IVeH.js} +1 -1
  64. package/dist/{onboard-DAEXNhNd.js → onboard--0I8pdee.js} +1 -1
  65. package/dist/{onboard-b2fWbf0Q.js → onboard-C40OvMZO.js} +1 -1
  66. package/dist/{onboard-channels-elaccQRE.js → onboard-channels-BbpyejX4.js} +1 -1
  67. package/dist/{onboard-channels-Bsd11scA.js → onboard-channels-CoJnsCfd.js} +1 -1
  68. package/dist/{onboard-channels-C_Q7OUow.js → onboard-channels-ZI4QC9WU.js} +1 -1
  69. package/dist/{onboard-channels-Tl1X4Pl_.js → onboard-channels-uvIeLPXK.js} +1 -1
  70. package/dist/{onboard-interactive-DyGNiYRI.js → onboard-interactive-B3Z0XLT6.js} +1 -1
  71. package/dist/{onboard-interactive-C0qmgHsH.js → onboard-interactive-CJdxqQ1b.js} +1 -1
  72. package/dist/{onboard-interactive-86s992_v.js → onboard-interactive-COnCCTTW.js} +1 -1
  73. package/dist/{onboard-interactive-CvMSTjPK.js → onboard-interactive-jss8R9r9.js} +1 -1
  74. package/dist/{onboarding-DzvbhsaR.js → onboarding-B1BmYWrs.js} +2 -2
  75. package/dist/{onboarding-B0tbaqZ7.js → onboarding-CdRbvLgp.js} +2 -2
  76. package/dist/{onboarding.finalize-D-Pi9Blv.js → onboarding.finalize-B0AjF6qZ.js} +1 -1
  77. package/dist/{onboarding.finalize-CERLBlRF.js → onboarding.finalize-WsL-ijTc.js} +1 -1
  78. package/dist/{outbound-send-deps-CzhBrVa7.js → outbound-send-deps-DuML6h7r.js} +1 -1
  79. package/dist/{plugin-registry-DtrHn5NR.js → plugin-registry-BjWNyeVY.js} +1 -1
  80. package/dist/{plugin-registry-Avx51RIY.js → plugin-registry-Cf_sv-ny.js} +1 -1
  81. package/dist/{plugin-registry-CFkQDTOt.js → plugin-registry-DdFb5usc.js} +1 -1
  82. package/dist/{plugin-registry-BEmyRfmb.js → plugin-registry-DrEpL5ac.js} +1 -1
  83. package/dist/plugin-sdk/{accounts-BwreSNAR.js → accounts-Cy3WCbWg.js} +1 -1
  84. package/dist/plugin-sdk/{active-listener-DpQ7aGYd.js → active-listener-DVWVNlT9.js} +1 -1
  85. package/dist/plugin-sdk/agent-runtime/src/agents/tool-retry.d.ts +40 -32
  86. package/dist/plugin-sdk/agent-runtime/src/builderforce/model/agent-types.d.ts +6 -0
  87. package/dist/plugin-sdk/{agent-scope-BQByW0cD.js → agent-scope-DgKN27hJ.js} +1 -1
  88. package/dist/plugin-sdk/{api-key-rotation-yqTCeKjV.js → api-key-rotation-D37jV9ZW.js} +1 -1
  89. package/dist/plugin-sdk/{audio-preflight-B6uTvVfA.js → audio-preflight-D4xyO8Zq.js} +1 -1
  90. package/dist/plugin-sdk/{auth-json-Dw6ij9Pa.js → auth-json-nASe57Uw.js} +1 -1
  91. package/dist/plugin-sdk/{bindings-CDEzl4kl.js → bindings-CH-YLOLC.js} +1 -1
  92. package/dist/plugin-sdk/{channel-web-DKbpA9xC.js → channel-web-huZSNTX3.js} +1 -1
  93. package/dist/plugin-sdk/{chrome-DriEqJRH.js → chrome-CRUzg3kA.js} +1 -1
  94. package/dist/plugin-sdk/{chunk-cW0POl22.js → chunk-C94IAOuf.js} +1 -1
  95. package/dist/plugin-sdk/{command-format-CAX9XFjI.js → command-format-B3XMq_73.js} +1 -1
  96. package/dist/plugin-sdk/{common-BxEWhN2X.js → common-n0l_XN-S.js} +1 -1
  97. package/dist/plugin-sdk/{config-3vPn_hmp.js → config--Ci8Y91R.js} +2 -2
  98. package/dist/plugin-sdk/{fetch-DH0Y8iyO.js → fetch-B-GxSYRO.js} +1 -1
  99. package/dist/plugin-sdk/index.js +1 -1
  100. package/dist/plugin-sdk/{login-Dhdx0bVL.js → login-DZliYZg8.js} +1 -1
  101. package/dist/plugin-sdk/{login-qr-DAjOuijP.js → login-qr-DKcGvAjv.js} +1 -1
  102. package/dist/plugin-sdk/{manager-i8psl2Er.js → manager-DioOqJm_.js} +1 -1
  103. package/dist/plugin-sdk/{markdown-tables-Epim9b-0.js → markdown-tables-BUfhHgfs.js} +1 -1
  104. package/dist/plugin-sdk/{message-channel-sBPQc_-T.js → message-channel-CuZ2xOAM.js} +1 -1
  105. package/dist/plugin-sdk/{model-catalog-COVRezOQ.js → model-catalog-DIQ5a-o4.js} +1 -1
  106. package/dist/plugin-sdk/{model-selection-Crz-xYNU.js → model-selection-_H_U9jWH.js} +1 -1
  107. package/dist/plugin-sdk/{outbound-CPutSvae.js → outbound-Djibdmi7.js} +1 -1
  108. package/dist/plugin-sdk/{plugins-CaUOZBVb.js → plugins-BdkC9v5E.js} +1 -1
  109. package/dist/plugin-sdk/{pw-ai-jI9AWvKe.js → pw-ai-Bbi8Us-p.js} +1 -1
  110. package/dist/plugin-sdk/{qmd-manager-BRe5fGZw.js → qmd-manager-Dxn0jCpE.js} +1 -1
  111. package/dist/plugin-sdk/{registry-DJq2Cvo9.js → registry-CZHRcH-q.js} +1 -1
  112. package/dist/plugin-sdk/{render-BUCRXPIk.js → render-CuA_WRX5.js} +1 -1
  113. package/dist/plugin-sdk/{replies-CYjI7bye.js → replies-Cf69aZLA.js} +1 -1
  114. package/dist/plugin-sdk/{reply-B5o-SSYy.js → reply-BOVC-7UD.js} +13 -13
  115. package/dist/plugin-sdk/{reply-prefix-CCymsmsP.js → reply-prefix-w7kAvH11.js} +1 -1
  116. package/dist/plugin-sdk/{resolve-route-DN1J7Wyc.js → resolve-route-0sbvl4ZN.js} +1 -1
  117. package/dist/plugin-sdk/{runner-C2pDJlRw.js → runner-DKoKK09-.js} +4 -4
  118. package/dist/plugin-sdk/{session-BnleckVX.js → session-DGLuyt10.js} +1 -1
  119. package/dist/plugin-sdk/{sqlite-BlMLqMl8.js → sqlite-JjFgDV-H.js} +1 -1
  120. package/dist/plugin-sdk/{subsystem-COTa5Ly_.js → subsystem-D0Ril4rt.js} +1 -1
  121. package/dist/plugin-sdk/{tool-images-DSpchb4x.js → tool-images-WRTP95FT.js} +1 -1
  122. package/dist/plugin-sdk/{tool-loop-detection-16p7mJ8N.js → tool-loop-detection-g8gPTCgJ.js} +1 -1
  123. package/dist/plugin-sdk/web-Cdu8TkUy.js +1 -0
  124. package/dist/plugin-sdk/{whatsapp-actions-C2B3iw8n.js → whatsapp-actions-CsSzy7G0.js} +1 -1
  125. package/dist/{plugins-DAlgx58e.js → plugins-Dr1wmnAf.js} +1 -1
  126. package/dist/{plugins-De7aK3yK.js → plugins-JhEblShx.js} +1 -1
  127. package/dist/{plugins-cli-CwdUVWjG.js → plugins-cli-DW4hoeeV.js} +1 -1
  128. package/dist/{plugins-cli-CfVCrrhx.js → plugins-cli-GewV3E8e.js} +1 -1
  129. package/dist/{program-CFL6mW3l.js → program-bggmBKuL.js} +2 -2
  130. package/dist/{program-context-DP4Xq9zC.js → program-context-BCTE8zEF.js} +1 -1
  131. package/dist/{prompt-select-styled-NxrGT7OR.js → prompt-select-styled-BtjhlTEH.js} +1 -1
  132. package/dist/{prompt-select-styled-Csz9HlSx.js → prompt-select-styled-CaNl41mG.js} +1 -1
  133. package/dist/{provider-auth-helpers-BMBw21Tn.js → provider-auth-helpers-CWUfg9zf.js} +1 -1
  134. package/dist/{provider-auth-helpers-VWPvSXPH.js → provider-auth-helpers-y1X8xKVE.js} +1 -1
  135. package/dist/{provider-dispatcher-CSOHd9zJ.js → provider-dispatcher-CRsPmKhJ.js} +1 -1
  136. package/dist/{provider-dispatcher-Bg9orQPy.js → provider-dispatcher-D9GbE_Ce.js} +1 -1
  137. package/dist/{push-apns-rMu8MKXi.js → push-apns-Cb1sQEEa.js} +1 -1
  138. package/dist/{push-apns-ep5WkyGz.js → push-apns-Cr-6aD3y.js} +1 -1
  139. package/dist/{pw-ai-UXo3gDGy.js → pw-ai-CG-kY5NP.js} +1 -1
  140. package/dist/{pw-ai-CIN6tj0G.js → pw-ai-DcZPg2vm.js} +1 -1
  141. package/dist/{register.agent-BynXVz7v.js → register.agent-B33EZBoL.js} +1 -1
  142. package/dist/{register.agent-RNVNKBP3.js → register.agent-DfYqZls1.js} +1 -1
  143. package/dist/{register.configure-BdqREs1-.js → register.configure-CREcJhKA.js} +1 -1
  144. package/dist/{register.configure-DDrvpBnA.js → register.configure-D8an7wc5.js} +1 -1
  145. package/dist/{register.maintenance-DT6t7mD_.js → register.maintenance-D84M5XLR.js} +1 -1
  146. package/dist/{register.maintenance-BSKHOCTV.js → register.maintenance-Dnp_Ii2x.js} +1 -1
  147. package/dist/{register.message-7KIfSUxS.js → register.message-B6E0uAEu.js} +1 -1
  148. package/dist/{register.message-DDhEvcaX.js → register.message-WOWC4tyf.js} +1 -1
  149. package/dist/{register.onboard-CKhooa7L.js → register.onboard-AgVEhehS.js} +1 -1
  150. package/dist/{register.onboard-CswvuzLx.js → register.onboard-Cwozk0Tx.js} +1 -1
  151. package/dist/{register.setup-1BmR-qlh.js → register.setup-BKyCvo9_.js} +1 -1
  152. package/dist/{register.setup-CivwfXf_.js → register.setup-C9IeGiAd.js} +1 -1
  153. package/dist/{register.status-health-sessions-CLdHZiJm.js → register.status-health-sessions-CYZctjpx.js} +1 -1
  154. package/dist/{register.status-health-sessions-BXpljfv3.js → register.status-health-sessions-CcL6srRC.js} +1 -1
  155. package/dist/{register.subclis-D_fHb-Aj.js → register.subclis-AFsfDByV.js} +1 -1
  156. package/dist/{register.subclis-CTTxdHaJ.js → register.subclis-C0DxtuRO.js} +1 -1
  157. package/dist/{reply-D9wUWhMx.js → reply-BuUSdq2L.js} +9 -9
  158. package/dist/{run-main-DNyQhVQT.js → run-main-CgJMiKPV.js} +1 -1
  159. package/dist/{runner-BNnckkaT.js → runner-C8oNv-9y.js} +3 -3
  160. package/dist/{runner-EHybuAt7.js → runner-nDoIXX7n.js} +3 -3
  161. package/dist/{server-node-events-BGrnw4ZT.js → server-node-events-BMsKmU5S.js} +1 -1
  162. package/dist/{server-node-events-D4WVcVHy.js → server-node-events-fS8TluXq.js} +1 -1
  163. package/dist/{session-dirs-eNN7E3kA.js → session-dirs-Bkfs-7vN.js} +1 -1
  164. package/dist/{session-dirs-C-pVBwSV.js → session-dirs-rYDCA_mQ.js} +1 -1
  165. package/dist/{status-Demw1HZ7.js → status-Ad1eFPKR.js} +1 -1
  166. package/dist/{status-CBieo24v.js → status-BMzVz5KY.js} +1 -1
  167. package/dist/{status-rkFgCaBM.js → status-CXRyaGws.js} +1 -1
  168. package/dist/{status-wTMmjZ7M.js → status-DpEUFAMk.js} +1 -1
  169. package/dist/{status-BhJw9Htq.js → status-oaiZkYBt.js} +1 -1
  170. package/dist/{subagent-registry-Bje3RAgk.js → subagent-registry-gVTWLPpL.js} +1 -1
  171. package/dist/{subagent-registry-B0kpBIxD.js → subagent-registry-hM0OCDzv.js} +1 -1
  172. package/dist/{subagent-registry-Cj5yC7B4.js → subagent-registry-m_x-JRkR.js} +9 -9
  173. package/dist/{tui-BCtecmPL.js → tui-HTtOgZ_X.js} +2 -2
  174. package/dist/{tui-BqHLI73U.js → tui-LemSel3H.js} +2 -2
  175. package/dist/{tui-cli-2R0xjpqW.js → tui-cli-BpzicV5H.js} +1 -1
  176. package/dist/{tui-cli-Dvd8BwzD.js → tui-cli-CruoIP1K.js} +1 -1
  177. package/dist/{update-cli-DUObGvw1.js → update-cli-Wa-nZ_Lq.js} +1 -1
  178. package/dist/{update-cli-Bt7Vfi7c.js → update-cli-zv67YxK1.js} +1 -1
  179. package/dist/{web--KblE8ax.js → web-BrsbhB1i.js} +1 -1
  180. package/dist/{web-C-yTnRvS.js → web-BzkO4Pbe.js} +1 -1
  181. package/dist/{web-0VRcRcFj.js → web-D_QYY7Gt.js} +1 -1
  182. package/dist/{web-BcUIWAAJ.js → web-jPbmSTQm.js} +1 -1
  183. package/package.json +1 -1
  184. package/dist/chrome-CmCESKt9.js +0 -4
  185. package/dist/chrome-D6qk0wxW.js +0 -4
  186. package/dist/plugin-sdk/web-CzJYJZZs.js +0 -1
@@ -1 +1 @@
1
- import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-2fP2Yq8h.js";import{F as pruneLegacyStoreKeys,I as resolveGatewaySessionStoreTarget,Ot as requestHeartbeatNow,P as loadSessionEntry,U as resolveOutboundTarget,di as enqueueSystemEvent}from"./reply-D9wUWhMx.js";import{f as normalizeMainKey}from"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import{d as resolveSessionAgentId}from"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-Doyvd4lU.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-BifagO7i.js";import{r as loadConfig}from"./io-BNtgT4VB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BD801bpx.js";import"./runner-C3k1sKdu.js";import"./model-catalog-BoiWqBTw.js";import"./sandbox-1jtP0nhr.js";import"./chrome-Bfprrnm1.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DKdrUePN.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-CRrqIFJR.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import{u as updateSessionStore}from"./sessions-BPr0-lkT.js";import"./message-channel-D_jXxXQj.js";import{r as normalizeChannelId}from"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-l9WWK31e.js";import"./send-CVgJk5kN.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-Yn3MpU4F.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-Dbbjk8CQ.js";import"./with-timeout-CPd4-suw.js";import{t as deliverOutboundPayloads}from"./deliver-BiGCWHvZ.js";import"./send-CRSlal5z.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import"./memory-cli-D-Khe5Ij.js";import"./manager-DNIg84rj.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-CJq3iGqu.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-Cp4LMft_.js";import"./send-D_6wd5Y3.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-C8gtsUDG.js";import"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import"./resolve-route-D49haUnv.js";import"./replies-DAwcEPGb.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-COe2xa9K.js";import"./send-BIMaIwQV.js";import"./onboard-helpers-BmYUjl4j.js";import"./prompt-style-BpVK43GK.js";import"./pairing-labels-CD0lPAfY.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-QGVVADJa.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-BLpMH93w.js";import"./control-service-DKBAemtq.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-BQuRdgMU.js";import"./transformers-stream-D7nRu4Qu.js";import"./deps-CGiO_NDu.js";import{c as parseMessageWithAttachments,l as formatForLog,r as registerApnsToken,s as normalizeRpcAttachmentsToChatAttachments}from"./push-apns-ep5WkyGz.js";import{t as createOutboundSendDeps}from"./outbound-send-deps-CmJnMKI7.js";import{t as agentCommand}from"./agent-DiLX8OzY.js";import{randomUUID}from"node:crypto";const VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS=1500,recentVoiceTranscripts=new Map;function normalizeNonEmptyString(value){if(typeof value!=`string`)return null;let trimmed=value.trim();return trimmed.length>0?trimmed:null}function normalizeFiniteInteger(value){return typeof value==`number`&&Number.isFinite(value)?Math.trunc(value):null}function resolveVoiceTranscriptFingerprint(obj,text){let eventId=normalizeNonEmptyString(obj.eventId)??normalizeNonEmptyString(obj.providerEventId)??normalizeNonEmptyString(obj.transcriptId);if(eventId)return`event:${eventId}`;let callId=normalizeNonEmptyString(obj.providerCallId)??normalizeNonEmptyString(obj.callId),sequence=normalizeFiniteInteger(obj.sequence)??normalizeFiniteInteger(obj.seq);if(callId&&sequence!==null)return`call-seq:${callId}:${sequence}`;let eventTimestamp=normalizeFiniteInteger(obj.timestamp)??normalizeFiniteInteger(obj.ts)??normalizeFiniteInteger(obj.eventTimestamp);return callId&&eventTimestamp!==null?`call-ts:${callId}:${eventTimestamp}`:eventTimestamp===null?`text:${text}`:`timestamp:${eventTimestamp}|text:${text}`}function shouldDropDuplicateVoiceTranscript(params){let previous=recentVoiceTranscripts.get(params.sessionKey);if(previous&&previous.fingerprint===params.fingerprint&&params.now-previous.ts<=VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS)return!0;if(recentVoiceTranscripts.set(params.sessionKey,{fingerprint:params.fingerprint,ts:params.now}),recentVoiceTranscripts.size>200){let cutoff=params.now-VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS*2;for(let[key,value]of recentVoiceTranscripts)if(value.ts<cutoff&&recentVoiceTranscripts.delete(key),recentVoiceTranscripts.size<=200)break;for(;recentVoiceTranscripts.size>200;){let oldestKey=recentVoiceTranscripts.keys().next().value;if(oldestKey===void 0)break;recentVoiceTranscripts.delete(oldestKey)}}return!1}function compactExecEventOutput(raw){let normalized=raw.replace(/\s+/g,` `).trim();return normalized?normalized.length<=180?normalized:`${normalized.slice(0,179)}…`:``}async function touchSessionStore(params){let{storePath}=params;storePath&&await updateSessionStore(storePath,store=>{let target=resolveGatewaySessionStoreTarget({cfg:params.cfg,key:params.sessionKey,store});pruneLegacyStoreKeys({store,canonicalKey:target.canonicalKey,candidates:target.storeKeys}),store[params.canonicalKey]={sessionId:params.sessionId,updatedAt:params.now,thinkingLevel:params.entry?.thinkingLevel,verboseLevel:params.entry?.verboseLevel,reasoningLevel:params.entry?.reasoningLevel,systemSent:params.entry?.systemSent,sendPolicy:params.entry?.sendPolicy,lastChannel:params.entry?.lastChannel,lastTo:params.entry?.lastTo}})}function queueSessionStoreTouch(params){touchSessionStore({cfg:params.cfg,sessionKey:params.sessionKey,storePath:params.storePath,canonicalKey:params.canonicalKey,entry:params.entry,sessionId:params.sessionId,now:params.now}).catch(err=>{params.ctx.logGateway.warn(`voice session-store update failed: `+formatForLog(err))})}function parseSessionKeyFromPayloadJSON(payloadJSON){let payload;try{payload=JSON.parse(payloadJSON)}catch{return null}if(typeof payload!=`object`||!payload)return null;let obj=payload,sessionKey=typeof obj.sessionKey==`string`?obj.sessionKey.trim():``;return sessionKey.length>0?sessionKey:null}async function sendReceiptAck(params){let resolved=resolveOutboundTarget({channel:params.channel,to:params.to,cfg:params.cfg,mode:`explicit`});if(!resolved.ok)throw Error(String(resolved.error));let agentId=resolveSessionAgentId({sessionKey:params.sessionKey,config:params.cfg});await deliverOutboundPayloads({cfg:params.cfg,channel:params.channel,to:resolved.to,payloads:[{text:params.text}],agentId,bestEffort:!0,deps:createOutboundSendDeps(params.deps)})}const handleNodeEvent=async(ctx,nodeId,evt)=>{switch(evt.event){case`voice.transcript`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},text=typeof obj.text==`string`?obj.text.trim():``;if(!text||text.length>2e4)return;let sessionKeyRaw=typeof obj.sessionKey==`string`?obj.sessionKey.trim():``,cfg=loadConfig(),rawMainKey=normalizeMainKey(cfg.session?.mainKey),sessionKey=sessionKeyRaw.length>0?sessionKeyRaw:rawMainKey,{storePath,entry,canonicalKey}=loadSessionEntry(sessionKey),now=Date.now();if(shouldDropDuplicateVoiceTranscript({sessionKey:canonicalKey,fingerprint:resolveVoiceTranscriptFingerprint(obj,text),now}))return;let sessionId=entry?.sessionId??randomUUID();queueSessionStoreTouch({ctx,cfg,sessionKey,storePath,canonicalKey,entry,sessionId,now}),ctx.addChatRun(sessionId,{sessionKey:canonicalKey,clientRunId:`voice-${randomUUID()}`}),agentCommand({message:text,sessionId,sessionKey:canonicalKey,thinking:`low`,deliver:!1,messageChannel:`node`,inputProvenance:{kind:`external_user`,sourceChannel:`voice`,sourceTool:`gateway.voice.transcript`}},defaultRuntime,ctx.deps).catch(err=>{ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`)});return}case`agent.request`:{if(!evt.payloadJSON)return;let link=null;try{link=JSON.parse(evt.payloadJSON)}catch{return}let message=(link?.message??``).trim(),normalizedAttachments=normalizeRpcAttachmentsToChatAttachments(link?.attachments??void 0),images=[];if(normalizedAttachments.length>0)try{let parsed=await parseMessageWithAttachments(message,normalizedAttachments,{maxBytes:5e6,log:ctx.logGateway});message=parsed.message.trim(),images=parsed.images}catch{return}if(!message||message.length>2e4)return;let channel=normalizeChannelId(typeof link?.channel==`string`?link.channel.trim():``)??void 0,to=typeof link?.to==`string`&&link.to.trim()?link.to.trim():void 0,deliverRequested=!!link?.deliver,wantsReceipt=!!link?.receipt,receiptText=(typeof link?.receiptText==`string`?link.receiptText.trim():``)||`Just received your iOS share + request, working on it.`,sessionKeyRaw=(link?.sessionKey??``).trim(),sessionKey=sessionKeyRaw.length>0?sessionKeyRaw:`node-${nodeId}`,cfg=loadConfig(),{storePath,entry,canonicalKey}=loadSessionEntry(sessionKey),now=Date.now(),sessionId=entry?.sessionId??randomUUID();if(await touchSessionStore({cfg,sessionKey,storePath,canonicalKey,entry,sessionId,now}),deliverRequested&&(!channel||!to)){let entryChannel=typeof entry?.lastChannel==`string`?normalizeChannelId(entry.lastChannel):void 0,entryTo=typeof entry?.lastTo==`string`?entry.lastTo.trim():``;!channel&&entryChannel&&(channel=entryChannel),!to&&entryTo&&(to=entryTo)}let deliver=deliverRequested&&!!(channel&&to),deliveryChannel=deliver?channel:void 0,deliveryTo=deliver?to:void 0;deliverRequested&&!deliver&&ctx.logGateway.warn(`agent delivery disabled node=${nodeId}: missing session delivery route (channel=${channel??`-`} to=${to??`-`})`),wantsReceipt&&deliveryChannel&&deliveryTo?sendReceiptAck({cfg,deps:ctx.deps,sessionKey:canonicalKey,channel:deliveryChannel,to:deliveryTo,text:receiptText}).catch(err=>{ctx.logGateway.warn(`agent receipt failed node=${nodeId}: ${formatForLog(err)}`)}):wantsReceipt&&ctx.logGateway.warn(`agent receipt skipped node=${nodeId}: missing delivery route (channel=${deliveryChannel??`-`} to=${deliveryTo??`-`})`),agentCommand({message,images,sessionId,sessionKey:canonicalKey,thinking:link?.thinking??void 0,deliver,to:deliveryTo,channel:deliveryChannel,timeout:typeof link?.timeoutSeconds==`number`?link.timeoutSeconds.toString():void 0,messageChannel:`node`},defaultRuntime,ctx.deps).catch(err=>{ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`)});return}case`chat.subscribe`:{if(!evt.payloadJSON)return;let sessionKey=parseSessionKeyFromPayloadJSON(evt.payloadJSON);if(!sessionKey)return;ctx.nodeSubscribe(nodeId,sessionKey);return}case`chat.unsubscribe`:{if(!evt.payloadJSON)return;let sessionKey=parseSessionKeyFromPayloadJSON(evt.payloadJSON);if(!sessionKey)return;ctx.nodeUnsubscribe(nodeId,sessionKey);return}case`exec.started`:case`exec.finished`:case`exec.denied`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},sessionKey=typeof obj.sessionKey==`string`?obj.sessionKey.trim():`node-${nodeId}`;if(!sessionKey)return;let runId=typeof obj.runId==`string`?obj.runId.trim():``,command=typeof obj.command==`string`?obj.command.trim():``,exitCode=typeof obj.exitCode==`number`&&Number.isFinite(obj.exitCode)?obj.exitCode:void 0,timedOut=obj.timedOut===!0,output=typeof obj.output==`string`?obj.output.trim():``,reason=typeof obj.reason==`string`?obj.reason.trim():``,text=``;if(evt.event===`exec.started`)text=`Exec started (node=${nodeId}${runId?` id=${runId}`:``})`,command&&(text+=`: ${command}`);else if(evt.event===`exec.finished`){let exitLabel=timedOut?`timeout`:`code ${exitCode??`?`}`,compactOutput=compactExecEventOutput(output);if(!(timedOut||exitCode!==0||compactOutput.length>0))return;text=`Exec finished (node=${nodeId}${runId?` id=${runId}`:``}, ${exitLabel})`,compactOutput&&(text+=`\n${compactOutput}`)}else text=`Exec denied (node=${nodeId}${runId?` id=${runId}`:``}${reason?`, ${reason}`:``})`,command&&(text+=`: ${command}`);enqueueSystemEvent(text,{sessionKey,contextKey:runId?`exec:${runId}`:`exec`}),requestHeartbeatNow({reason:`exec-event`});return}case`push.apns.register`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},token=typeof obj.token==`string`?obj.token:``,topic=typeof obj.topic==`string`?obj.topic:``,environment=obj.environment;try{await registerApnsToken({nodeId,token,topic,environment})}catch(err){ctx.logGateway.warn(`push apns register failed node=${nodeId}: ${formatForLog(err)}`)}return}default:return}};export{handleNodeEvent};
1
+ import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-2fP2Yq8h.js";import{F as pruneLegacyStoreKeys,I as resolveGatewaySessionStoreTarget,Ot as requestHeartbeatNow,P as loadSessionEntry,U as resolveOutboundTarget,di as enqueueSystemEvent}from"./reply-BuUSdq2L.js";import{f as normalizeMainKey}from"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import{d as resolveSessionAgentId}from"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-Doyvd4lU.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-BifagO7i.js";import{r as loadConfig}from"./io-BNtgT4VB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BD801bpx.js";import"./runner-C3k1sKdu.js";import"./model-catalog-BoiWqBTw.js";import"./sandbox-1jtP0nhr.js";import"./chrome-Bfprrnm1.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DKdrUePN.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-CRrqIFJR.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import{u as updateSessionStore}from"./sessions-BPr0-lkT.js";import"./message-channel-D_jXxXQj.js";import{r as normalizeChannelId}from"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-l9WWK31e.js";import"./send-CVgJk5kN.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-Yn3MpU4F.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-Dbbjk8CQ.js";import"./with-timeout-CPd4-suw.js";import{t as deliverOutboundPayloads}from"./deliver-BiGCWHvZ.js";import"./send-CRSlal5z.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import"./memory-cli-D-Khe5Ij.js";import"./manager-DNIg84rj.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-CJq3iGqu.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-Cp4LMft_.js";import"./send-D_6wd5Y3.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-C8gtsUDG.js";import"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import"./resolve-route-D49haUnv.js";import"./replies-DAwcEPGb.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-COe2xa9K.js";import"./send-BIMaIwQV.js";import"./onboard-helpers-BmYUjl4j.js";import"./prompt-style-BpVK43GK.js";import"./pairing-labels-CD0lPAfY.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-QGVVADJa.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-BLpMH93w.js";import"./control-service-DKBAemtq.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-BQuRdgMU.js";import"./transformers-stream-D7nRu4Qu.js";import"./deps-CrAVOWsA.js";import{c as parseMessageWithAttachments,l as formatForLog,r as registerApnsToken,s as normalizeRpcAttachmentsToChatAttachments}from"./push-apns-Cr-6aD3y.js";import{t as createOutboundSendDeps}from"./outbound-send-deps-CmJnMKI7.js";import{t as agentCommand}from"./agent-DrcnpqOF.js";import{randomUUID}from"node:crypto";const VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS=1500,recentVoiceTranscripts=new Map;function normalizeNonEmptyString(value){if(typeof value!=`string`)return null;let trimmed=value.trim();return trimmed.length>0?trimmed:null}function normalizeFiniteInteger(value){return typeof value==`number`&&Number.isFinite(value)?Math.trunc(value):null}function resolveVoiceTranscriptFingerprint(obj,text){let eventId=normalizeNonEmptyString(obj.eventId)??normalizeNonEmptyString(obj.providerEventId)??normalizeNonEmptyString(obj.transcriptId);if(eventId)return`event:${eventId}`;let callId=normalizeNonEmptyString(obj.providerCallId)??normalizeNonEmptyString(obj.callId),sequence=normalizeFiniteInteger(obj.sequence)??normalizeFiniteInteger(obj.seq);if(callId&&sequence!==null)return`call-seq:${callId}:${sequence}`;let eventTimestamp=normalizeFiniteInteger(obj.timestamp)??normalizeFiniteInteger(obj.ts)??normalizeFiniteInteger(obj.eventTimestamp);return callId&&eventTimestamp!==null?`call-ts:${callId}:${eventTimestamp}`:eventTimestamp===null?`text:${text}`:`timestamp:${eventTimestamp}|text:${text}`}function shouldDropDuplicateVoiceTranscript(params){let previous=recentVoiceTranscripts.get(params.sessionKey);if(previous&&previous.fingerprint===params.fingerprint&&params.now-previous.ts<=VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS)return!0;if(recentVoiceTranscripts.set(params.sessionKey,{fingerprint:params.fingerprint,ts:params.now}),recentVoiceTranscripts.size>200){let cutoff=params.now-VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS*2;for(let[key,value]of recentVoiceTranscripts)if(value.ts<cutoff&&recentVoiceTranscripts.delete(key),recentVoiceTranscripts.size<=200)break;for(;recentVoiceTranscripts.size>200;){let oldestKey=recentVoiceTranscripts.keys().next().value;if(oldestKey===void 0)break;recentVoiceTranscripts.delete(oldestKey)}}return!1}function compactExecEventOutput(raw){let normalized=raw.replace(/\s+/g,` `).trim();return normalized?normalized.length<=180?normalized:`${normalized.slice(0,179)}…`:``}async function touchSessionStore(params){let{storePath}=params;storePath&&await updateSessionStore(storePath,store=>{let target=resolveGatewaySessionStoreTarget({cfg:params.cfg,key:params.sessionKey,store});pruneLegacyStoreKeys({store,canonicalKey:target.canonicalKey,candidates:target.storeKeys}),store[params.canonicalKey]={sessionId:params.sessionId,updatedAt:params.now,thinkingLevel:params.entry?.thinkingLevel,verboseLevel:params.entry?.verboseLevel,reasoningLevel:params.entry?.reasoningLevel,systemSent:params.entry?.systemSent,sendPolicy:params.entry?.sendPolicy,lastChannel:params.entry?.lastChannel,lastTo:params.entry?.lastTo}})}function queueSessionStoreTouch(params){touchSessionStore({cfg:params.cfg,sessionKey:params.sessionKey,storePath:params.storePath,canonicalKey:params.canonicalKey,entry:params.entry,sessionId:params.sessionId,now:params.now}).catch(err=>{params.ctx.logGateway.warn(`voice session-store update failed: `+formatForLog(err))})}function parseSessionKeyFromPayloadJSON(payloadJSON){let payload;try{payload=JSON.parse(payloadJSON)}catch{return null}if(typeof payload!=`object`||!payload)return null;let obj=payload,sessionKey=typeof obj.sessionKey==`string`?obj.sessionKey.trim():``;return sessionKey.length>0?sessionKey:null}async function sendReceiptAck(params){let resolved=resolveOutboundTarget({channel:params.channel,to:params.to,cfg:params.cfg,mode:`explicit`});if(!resolved.ok)throw Error(String(resolved.error));let agentId=resolveSessionAgentId({sessionKey:params.sessionKey,config:params.cfg});await deliverOutboundPayloads({cfg:params.cfg,channel:params.channel,to:resolved.to,payloads:[{text:params.text}],agentId,bestEffort:!0,deps:createOutboundSendDeps(params.deps)})}const handleNodeEvent=async(ctx,nodeId,evt)=>{switch(evt.event){case`voice.transcript`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},text=typeof obj.text==`string`?obj.text.trim():``;if(!text||text.length>2e4)return;let sessionKeyRaw=typeof obj.sessionKey==`string`?obj.sessionKey.trim():``,cfg=loadConfig(),rawMainKey=normalizeMainKey(cfg.session?.mainKey),sessionKey=sessionKeyRaw.length>0?sessionKeyRaw:rawMainKey,{storePath,entry,canonicalKey}=loadSessionEntry(sessionKey),now=Date.now();if(shouldDropDuplicateVoiceTranscript({sessionKey:canonicalKey,fingerprint:resolveVoiceTranscriptFingerprint(obj,text),now}))return;let sessionId=entry?.sessionId??randomUUID();queueSessionStoreTouch({ctx,cfg,sessionKey,storePath,canonicalKey,entry,sessionId,now}),ctx.addChatRun(sessionId,{sessionKey:canonicalKey,clientRunId:`voice-${randomUUID()}`}),agentCommand({message:text,sessionId,sessionKey:canonicalKey,thinking:`low`,deliver:!1,messageChannel:`node`,inputProvenance:{kind:`external_user`,sourceChannel:`voice`,sourceTool:`gateway.voice.transcript`}},defaultRuntime,ctx.deps).catch(err=>{ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`)});return}case`agent.request`:{if(!evt.payloadJSON)return;let link=null;try{link=JSON.parse(evt.payloadJSON)}catch{return}let message=(link?.message??``).trim(),normalizedAttachments=normalizeRpcAttachmentsToChatAttachments(link?.attachments??void 0),images=[];if(normalizedAttachments.length>0)try{let parsed=await parseMessageWithAttachments(message,normalizedAttachments,{maxBytes:5e6,log:ctx.logGateway});message=parsed.message.trim(),images=parsed.images}catch{return}if(!message||message.length>2e4)return;let channel=normalizeChannelId(typeof link?.channel==`string`?link.channel.trim():``)??void 0,to=typeof link?.to==`string`&&link.to.trim()?link.to.trim():void 0,deliverRequested=!!link?.deliver,wantsReceipt=!!link?.receipt,receiptText=(typeof link?.receiptText==`string`?link.receiptText.trim():``)||`Just received your iOS share + request, working on it.`,sessionKeyRaw=(link?.sessionKey??``).trim(),sessionKey=sessionKeyRaw.length>0?sessionKeyRaw:`node-${nodeId}`,cfg=loadConfig(),{storePath,entry,canonicalKey}=loadSessionEntry(sessionKey),now=Date.now(),sessionId=entry?.sessionId??randomUUID();if(await touchSessionStore({cfg,sessionKey,storePath,canonicalKey,entry,sessionId,now}),deliverRequested&&(!channel||!to)){let entryChannel=typeof entry?.lastChannel==`string`?normalizeChannelId(entry.lastChannel):void 0,entryTo=typeof entry?.lastTo==`string`?entry.lastTo.trim():``;!channel&&entryChannel&&(channel=entryChannel),!to&&entryTo&&(to=entryTo)}let deliver=deliverRequested&&!!(channel&&to),deliveryChannel=deliver?channel:void 0,deliveryTo=deliver?to:void 0;deliverRequested&&!deliver&&ctx.logGateway.warn(`agent delivery disabled node=${nodeId}: missing session delivery route (channel=${channel??`-`} to=${to??`-`})`),wantsReceipt&&deliveryChannel&&deliveryTo?sendReceiptAck({cfg,deps:ctx.deps,sessionKey:canonicalKey,channel:deliveryChannel,to:deliveryTo,text:receiptText}).catch(err=>{ctx.logGateway.warn(`agent receipt failed node=${nodeId}: ${formatForLog(err)}`)}):wantsReceipt&&ctx.logGateway.warn(`agent receipt skipped node=${nodeId}: missing delivery route (channel=${deliveryChannel??`-`} to=${deliveryTo??`-`})`),agentCommand({message,images,sessionId,sessionKey:canonicalKey,thinking:link?.thinking??void 0,deliver,to:deliveryTo,channel:deliveryChannel,timeout:typeof link?.timeoutSeconds==`number`?link.timeoutSeconds.toString():void 0,messageChannel:`node`},defaultRuntime,ctx.deps).catch(err=>{ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`)});return}case`chat.subscribe`:{if(!evt.payloadJSON)return;let sessionKey=parseSessionKeyFromPayloadJSON(evt.payloadJSON);if(!sessionKey)return;ctx.nodeSubscribe(nodeId,sessionKey);return}case`chat.unsubscribe`:{if(!evt.payloadJSON)return;let sessionKey=parseSessionKeyFromPayloadJSON(evt.payloadJSON);if(!sessionKey)return;ctx.nodeUnsubscribe(nodeId,sessionKey);return}case`exec.started`:case`exec.finished`:case`exec.denied`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},sessionKey=typeof obj.sessionKey==`string`?obj.sessionKey.trim():`node-${nodeId}`;if(!sessionKey)return;let runId=typeof obj.runId==`string`?obj.runId.trim():``,command=typeof obj.command==`string`?obj.command.trim():``,exitCode=typeof obj.exitCode==`number`&&Number.isFinite(obj.exitCode)?obj.exitCode:void 0,timedOut=obj.timedOut===!0,output=typeof obj.output==`string`?obj.output.trim():``,reason=typeof obj.reason==`string`?obj.reason.trim():``,text=``;if(evt.event===`exec.started`)text=`Exec started (node=${nodeId}${runId?` id=${runId}`:``})`,command&&(text+=`: ${command}`);else if(evt.event===`exec.finished`){let exitLabel=timedOut?`timeout`:`code ${exitCode??`?`}`,compactOutput=compactExecEventOutput(output);if(!(timedOut||exitCode!==0||compactOutput.length>0))return;text=`Exec finished (node=${nodeId}${runId?` id=${runId}`:``}, ${exitLabel})`,compactOutput&&(text+=`\n${compactOutput}`)}else text=`Exec denied (node=${nodeId}${runId?` id=${runId}`:``}${reason?`, ${reason}`:``})`,command&&(text+=`: ${command}`);enqueueSystemEvent(text,{sessionKey,contextKey:runId?`exec:${runId}`:`exec`}),requestHeartbeatNow({reason:`exec-event`});return}case`push.apns.register`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},token=typeof obj.token==`string`?obj.token:``,topic=typeof obj.topic==`string`?obj.topic:``,environment=obj.environment;try{await registerApnsToken({nodeId,token,topic,environment})}catch(err){ctx.logGateway.warn(`push apns register failed node=${nodeId}: ${formatForLog(err)}`)}return}default:return}};export{handleNodeEvent};
@@ -1 +1 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-CuAFgjuQ.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import{f as normalizeMainKey}from"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import{d as resolveSessionAgentId}from"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-C8c9naq-.js";import{r as loadConfig}from"./io-CsCa3_1Z.js";import"./manifest-registry-009gLJ4l.js";import"./config-DmxNxDRW.js";import"./model-discovery-RTHjxEvZ.js";import"./model-catalog-D8OQ7p7I.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-O-iC_P5t.js";import"./message-channel-z5YRpR2d.js";import{Ln as enqueueSystemEvent,at as resolveOutboundTarget,in as requestHeartbeatNow}from"./subagent-registry-Cj5yC7B4.js";import{u as updateSessionStore}from"./sessions-CmJXMlLP.js";import"./project-context-store-BNXYrLJz.js";import"./tokens-CFKkpUIu.js";import{r as normalizeChannelId}from"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-CGcNbbV7.js";import"./send-DPRTlcZh.js";import"./with-timeout-CBXVw0An.js";import{t as deliverOutboundPayloads}from"./deliver--eLCRJc2.js";import"./accounts-Cx82nj4E.js";import"./send-DfHAMPcD.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-BZGiFZlP.js";import"./sandbox-C-Owvt1-.js";import"./chrome-BfwLDcFc.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-BjYYSEVE.js";import"./routes-Dnfsevhw.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./workspace-waBqRxiy.js";import"./reply-prefix-Cg7AqaK0.js";import"./sqlite-CIGM1WKg.js";import"./memory-cli-CiwWAhp5.js";import"./manager-Bjb9ptCz.js";import"./gemini-auth-KBXMhaRQ.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import"./runner-DwPaM8kz.js";import"./tool-display-Cs4hDP1f.js";import"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-tquUDu_7.js";import{c as resolveGatewaySessionStoreTarget,o as loadSessionEntry,s as pruneLegacyStoreKeys}from"./session-utils-D2_j4c6U.js";import"./coding-tools.policy-BwdtwuXY.js";import"./pairing-store-BCsvhT6-.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-DsI3qJRy.js";import"./send-BOSlm5fG.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-BdK18hVI.js";import"./control-service-Ca0CBlhO.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-BOBan2eG.js";import"./resolve-route-DEIW5uKy.js";import"./channel-activity-DX36RadH.js";import"./tables-CojSfTth.js";import"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DATdLu15.js";import"./onboard-helpers-D2vxAtv8.js";import"./prompt-style-BMWmaqSC.js";import"./pairing-labels-BUXpRejW.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-DJt_RpLC.js";import"./transformers-stream-Buj40qHl.js";import{t as createOutboundSendDeps}from"./outbound-send-deps-CzhBrVa7.js";import{c as parseMessageWithAttachments,l as formatForLog,r as registerApnsToken,s as normalizeRpcAttachmentsToChatAttachments}from"./push-apns-rMu8MKXi.js";import{t as agentCommand}from"./agent-DvDtjczG.js";import{randomUUID}from"node:crypto";const VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS=1500,recentVoiceTranscripts=new Map;function normalizeNonEmptyString(value){if(typeof value!=`string`)return null;let trimmed=value.trim();return trimmed.length>0?trimmed:null}function normalizeFiniteInteger(value){return typeof value==`number`&&Number.isFinite(value)?Math.trunc(value):null}function resolveVoiceTranscriptFingerprint(obj,text){let eventId=normalizeNonEmptyString(obj.eventId)??normalizeNonEmptyString(obj.providerEventId)??normalizeNonEmptyString(obj.transcriptId);if(eventId)return`event:${eventId}`;let callId=normalizeNonEmptyString(obj.providerCallId)??normalizeNonEmptyString(obj.callId),sequence=normalizeFiniteInteger(obj.sequence)??normalizeFiniteInteger(obj.seq);if(callId&&sequence!==null)return`call-seq:${callId}:${sequence}`;let eventTimestamp=normalizeFiniteInteger(obj.timestamp)??normalizeFiniteInteger(obj.ts)??normalizeFiniteInteger(obj.eventTimestamp);return callId&&eventTimestamp!==null?`call-ts:${callId}:${eventTimestamp}`:eventTimestamp===null?`text:${text}`:`timestamp:${eventTimestamp}|text:${text}`}function shouldDropDuplicateVoiceTranscript(params){let previous=recentVoiceTranscripts.get(params.sessionKey);if(previous&&previous.fingerprint===params.fingerprint&&params.now-previous.ts<=VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS)return!0;if(recentVoiceTranscripts.set(params.sessionKey,{fingerprint:params.fingerprint,ts:params.now}),recentVoiceTranscripts.size>200){let cutoff=params.now-VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS*2;for(let[key,value]of recentVoiceTranscripts)if(value.ts<cutoff&&recentVoiceTranscripts.delete(key),recentVoiceTranscripts.size<=200)break;for(;recentVoiceTranscripts.size>200;){let oldestKey=recentVoiceTranscripts.keys().next().value;if(oldestKey===void 0)break;recentVoiceTranscripts.delete(oldestKey)}}return!1}function compactExecEventOutput(raw){let normalized=raw.replace(/\s+/g,` `).trim();return normalized?normalized.length<=180?normalized:`${normalized.slice(0,179)}…`:``}async function touchSessionStore(params){let{storePath}=params;storePath&&await updateSessionStore(storePath,store=>{let target=resolveGatewaySessionStoreTarget({cfg:params.cfg,key:params.sessionKey,store});pruneLegacyStoreKeys({store,canonicalKey:target.canonicalKey,candidates:target.storeKeys}),store[params.canonicalKey]={sessionId:params.sessionId,updatedAt:params.now,thinkingLevel:params.entry?.thinkingLevel,verboseLevel:params.entry?.verboseLevel,reasoningLevel:params.entry?.reasoningLevel,systemSent:params.entry?.systemSent,sendPolicy:params.entry?.sendPolicy,lastChannel:params.entry?.lastChannel,lastTo:params.entry?.lastTo}})}function queueSessionStoreTouch(params){touchSessionStore({cfg:params.cfg,sessionKey:params.sessionKey,storePath:params.storePath,canonicalKey:params.canonicalKey,entry:params.entry,sessionId:params.sessionId,now:params.now}).catch(err=>{params.ctx.logGateway.warn(`voice session-store update failed: `+formatForLog(err))})}function parseSessionKeyFromPayloadJSON(payloadJSON){let payload;try{payload=JSON.parse(payloadJSON)}catch{return null}if(typeof payload!=`object`||!payload)return null;let obj=payload,sessionKey=typeof obj.sessionKey==`string`?obj.sessionKey.trim():``;return sessionKey.length>0?sessionKey:null}async function sendReceiptAck(params){let resolved=resolveOutboundTarget({channel:params.channel,to:params.to,cfg:params.cfg,mode:`explicit`});if(!resolved.ok)throw Error(String(resolved.error));let agentId=resolveSessionAgentId({sessionKey:params.sessionKey,config:params.cfg});await deliverOutboundPayloads({cfg:params.cfg,channel:params.channel,to:resolved.to,payloads:[{text:params.text}],agentId,bestEffort:!0,deps:createOutboundSendDeps(params.deps)})}const handleNodeEvent=async(ctx,nodeId,evt)=>{switch(evt.event){case`voice.transcript`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},text=typeof obj.text==`string`?obj.text.trim():``;if(!text||text.length>2e4)return;let sessionKeyRaw=typeof obj.sessionKey==`string`?obj.sessionKey.trim():``,cfg=loadConfig(),rawMainKey=normalizeMainKey(cfg.session?.mainKey),sessionKey=sessionKeyRaw.length>0?sessionKeyRaw:rawMainKey,{storePath,entry,canonicalKey}=loadSessionEntry(sessionKey),now=Date.now();if(shouldDropDuplicateVoiceTranscript({sessionKey:canonicalKey,fingerprint:resolveVoiceTranscriptFingerprint(obj,text),now}))return;let sessionId=entry?.sessionId??randomUUID();queueSessionStoreTouch({ctx,cfg,sessionKey,storePath,canonicalKey,entry,sessionId,now}),ctx.addChatRun(sessionId,{sessionKey:canonicalKey,clientRunId:`voice-${randomUUID()}`}),agentCommand({message:text,sessionId,sessionKey:canonicalKey,thinking:`low`,deliver:!1,messageChannel:`node`,inputProvenance:{kind:`external_user`,sourceChannel:`voice`,sourceTool:`gateway.voice.transcript`}},defaultRuntime,ctx.deps).catch(err=>{ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`)});return}case`agent.request`:{if(!evt.payloadJSON)return;let link=null;try{link=JSON.parse(evt.payloadJSON)}catch{return}let message=(link?.message??``).trim(),normalizedAttachments=normalizeRpcAttachmentsToChatAttachments(link?.attachments??void 0),images=[];if(normalizedAttachments.length>0)try{let parsed=await parseMessageWithAttachments(message,normalizedAttachments,{maxBytes:5e6,log:ctx.logGateway});message=parsed.message.trim(),images=parsed.images}catch{return}if(!message||message.length>2e4)return;let channel=normalizeChannelId(typeof link?.channel==`string`?link.channel.trim():``)??void 0,to=typeof link?.to==`string`&&link.to.trim()?link.to.trim():void 0,deliverRequested=!!link?.deliver,wantsReceipt=!!link?.receipt,receiptText=(typeof link?.receiptText==`string`?link.receiptText.trim():``)||`Just received your iOS share + request, working on it.`,sessionKeyRaw=(link?.sessionKey??``).trim(),sessionKey=sessionKeyRaw.length>0?sessionKeyRaw:`node-${nodeId}`,cfg=loadConfig(),{storePath,entry,canonicalKey}=loadSessionEntry(sessionKey),now=Date.now(),sessionId=entry?.sessionId??randomUUID();if(await touchSessionStore({cfg,sessionKey,storePath,canonicalKey,entry,sessionId,now}),deliverRequested&&(!channel||!to)){let entryChannel=typeof entry?.lastChannel==`string`?normalizeChannelId(entry.lastChannel):void 0,entryTo=typeof entry?.lastTo==`string`?entry.lastTo.trim():``;!channel&&entryChannel&&(channel=entryChannel),!to&&entryTo&&(to=entryTo)}let deliver=deliverRequested&&!!(channel&&to),deliveryChannel=deliver?channel:void 0,deliveryTo=deliver?to:void 0;deliverRequested&&!deliver&&ctx.logGateway.warn(`agent delivery disabled node=${nodeId}: missing session delivery route (channel=${channel??`-`} to=${to??`-`})`),wantsReceipt&&deliveryChannel&&deliveryTo?sendReceiptAck({cfg,deps:ctx.deps,sessionKey:canonicalKey,channel:deliveryChannel,to:deliveryTo,text:receiptText}).catch(err=>{ctx.logGateway.warn(`agent receipt failed node=${nodeId}: ${formatForLog(err)}`)}):wantsReceipt&&ctx.logGateway.warn(`agent receipt skipped node=${nodeId}: missing delivery route (channel=${deliveryChannel??`-`} to=${deliveryTo??`-`})`),agentCommand({message,images,sessionId,sessionKey:canonicalKey,thinking:link?.thinking??void 0,deliver,to:deliveryTo,channel:deliveryChannel,timeout:typeof link?.timeoutSeconds==`number`?link.timeoutSeconds.toString():void 0,messageChannel:`node`},defaultRuntime,ctx.deps).catch(err=>{ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`)});return}case`chat.subscribe`:{if(!evt.payloadJSON)return;let sessionKey=parseSessionKeyFromPayloadJSON(evt.payloadJSON);if(!sessionKey)return;ctx.nodeSubscribe(nodeId,sessionKey);return}case`chat.unsubscribe`:{if(!evt.payloadJSON)return;let sessionKey=parseSessionKeyFromPayloadJSON(evt.payloadJSON);if(!sessionKey)return;ctx.nodeUnsubscribe(nodeId,sessionKey);return}case`exec.started`:case`exec.finished`:case`exec.denied`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},sessionKey=typeof obj.sessionKey==`string`?obj.sessionKey.trim():`node-${nodeId}`;if(!sessionKey)return;let runId=typeof obj.runId==`string`?obj.runId.trim():``,command=typeof obj.command==`string`?obj.command.trim():``,exitCode=typeof obj.exitCode==`number`&&Number.isFinite(obj.exitCode)?obj.exitCode:void 0,timedOut=obj.timedOut===!0,output=typeof obj.output==`string`?obj.output.trim():``,reason=typeof obj.reason==`string`?obj.reason.trim():``,text=``;if(evt.event===`exec.started`)text=`Exec started (node=${nodeId}${runId?` id=${runId}`:``})`,command&&(text+=`: ${command}`);else if(evt.event===`exec.finished`){let exitLabel=timedOut?`timeout`:`code ${exitCode??`?`}`,compactOutput=compactExecEventOutput(output);if(!(timedOut||exitCode!==0||compactOutput.length>0))return;text=`Exec finished (node=${nodeId}${runId?` id=${runId}`:``}, ${exitLabel})`,compactOutput&&(text+=`\n${compactOutput}`)}else text=`Exec denied (node=${nodeId}${runId?` id=${runId}`:``}${reason?`, ${reason}`:``})`,command&&(text+=`: ${command}`);enqueueSystemEvent(text,{sessionKey,contextKey:runId?`exec:${runId}`:`exec`}),requestHeartbeatNow({reason:`exec-event`});return}case`push.apns.register`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},token=typeof obj.token==`string`?obj.token:``,topic=typeof obj.topic==`string`?obj.topic:``,environment=obj.environment;try{await registerApnsToken({nodeId,token,topic,environment})}catch(err){ctx.logGateway.warn(`push apns register failed node=${nodeId}: ${formatForLog(err)}`)}return}default:return}};export{handleNodeEvent};
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-CuAFgjuQ.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import{f as normalizeMainKey}from"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import{d as resolveSessionAgentId}from"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-C8c9naq-.js";import{r as loadConfig}from"./io-CsCa3_1Z.js";import"./manifest-registry-009gLJ4l.js";import"./config-DmxNxDRW.js";import"./model-discovery-RTHjxEvZ.js";import"./model-catalog-D8OQ7p7I.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-O-iC_P5t.js";import"./message-channel-z5YRpR2d.js";import{Ln as enqueueSystemEvent,at as resolveOutboundTarget,in as requestHeartbeatNow}from"./subagent-registry-m_x-JRkR.js";import{u as updateSessionStore}from"./sessions-CmJXMlLP.js";import"./project-context-store-BNXYrLJz.js";import"./tokens-CFKkpUIu.js";import{r as normalizeChannelId}from"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-CGcNbbV7.js";import"./send-DPRTlcZh.js";import"./with-timeout-CBXVw0An.js";import{t as deliverOutboundPayloads}from"./deliver--eLCRJc2.js";import"./accounts-Cx82nj4E.js";import"./send-DfHAMPcD.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-BZGiFZlP.js";import"./sandbox-C-Owvt1-.js";import"./chrome-BfwLDcFc.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-BjYYSEVE.js";import"./routes-Dnfsevhw.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./workspace-waBqRxiy.js";import"./reply-prefix-Cg7AqaK0.js";import"./sqlite-CIGM1WKg.js";import"./memory-cli-CiwWAhp5.js";import"./manager-Bjb9ptCz.js";import"./gemini-auth-KBXMhaRQ.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import"./runner-DwPaM8kz.js";import"./tool-display-Cs4hDP1f.js";import"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-tquUDu_7.js";import{c as resolveGatewaySessionStoreTarget,o as loadSessionEntry,s as pruneLegacyStoreKeys}from"./session-utils-D2_j4c6U.js";import"./coding-tools.policy-BwdtwuXY.js";import"./pairing-store-BCsvhT6-.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-DsI3qJRy.js";import"./send-BOSlm5fG.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-BdK18hVI.js";import"./control-service-Ca0CBlhO.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-BOBan2eG.js";import"./resolve-route-DEIW5uKy.js";import"./channel-activity-DX36RadH.js";import"./tables-CojSfTth.js";import"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DATdLu15.js";import"./onboard-helpers-D2vxAtv8.js";import"./prompt-style-BMWmaqSC.js";import"./pairing-labels-BUXpRejW.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-DJt_RpLC.js";import"./transformers-stream-Buj40qHl.js";import{t as createOutboundSendDeps}from"./outbound-send-deps-DuML6h7r.js";import{c as parseMessageWithAttachments,l as formatForLog,r as registerApnsToken,s as normalizeRpcAttachmentsToChatAttachments}from"./push-apns-Cb1sQEEa.js";import{t as agentCommand}from"./agent-CeWx2EpQ.js";import{randomUUID}from"node:crypto";const VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS=1500,recentVoiceTranscripts=new Map;function normalizeNonEmptyString(value){if(typeof value!=`string`)return null;let trimmed=value.trim();return trimmed.length>0?trimmed:null}function normalizeFiniteInteger(value){return typeof value==`number`&&Number.isFinite(value)?Math.trunc(value):null}function resolveVoiceTranscriptFingerprint(obj,text){let eventId=normalizeNonEmptyString(obj.eventId)??normalizeNonEmptyString(obj.providerEventId)??normalizeNonEmptyString(obj.transcriptId);if(eventId)return`event:${eventId}`;let callId=normalizeNonEmptyString(obj.providerCallId)??normalizeNonEmptyString(obj.callId),sequence=normalizeFiniteInteger(obj.sequence)??normalizeFiniteInteger(obj.seq);if(callId&&sequence!==null)return`call-seq:${callId}:${sequence}`;let eventTimestamp=normalizeFiniteInteger(obj.timestamp)??normalizeFiniteInteger(obj.ts)??normalizeFiniteInteger(obj.eventTimestamp);return callId&&eventTimestamp!==null?`call-ts:${callId}:${eventTimestamp}`:eventTimestamp===null?`text:${text}`:`timestamp:${eventTimestamp}|text:${text}`}function shouldDropDuplicateVoiceTranscript(params){let previous=recentVoiceTranscripts.get(params.sessionKey);if(previous&&previous.fingerprint===params.fingerprint&&params.now-previous.ts<=VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS)return!0;if(recentVoiceTranscripts.set(params.sessionKey,{fingerprint:params.fingerprint,ts:params.now}),recentVoiceTranscripts.size>200){let cutoff=params.now-VOICE_TRANSCRIPT_DEDUPE_WINDOW_MS*2;for(let[key,value]of recentVoiceTranscripts)if(value.ts<cutoff&&recentVoiceTranscripts.delete(key),recentVoiceTranscripts.size<=200)break;for(;recentVoiceTranscripts.size>200;){let oldestKey=recentVoiceTranscripts.keys().next().value;if(oldestKey===void 0)break;recentVoiceTranscripts.delete(oldestKey)}}return!1}function compactExecEventOutput(raw){let normalized=raw.replace(/\s+/g,` `).trim();return normalized?normalized.length<=180?normalized:`${normalized.slice(0,179)}…`:``}async function touchSessionStore(params){let{storePath}=params;storePath&&await updateSessionStore(storePath,store=>{let target=resolveGatewaySessionStoreTarget({cfg:params.cfg,key:params.sessionKey,store});pruneLegacyStoreKeys({store,canonicalKey:target.canonicalKey,candidates:target.storeKeys}),store[params.canonicalKey]={sessionId:params.sessionId,updatedAt:params.now,thinkingLevel:params.entry?.thinkingLevel,verboseLevel:params.entry?.verboseLevel,reasoningLevel:params.entry?.reasoningLevel,systemSent:params.entry?.systemSent,sendPolicy:params.entry?.sendPolicy,lastChannel:params.entry?.lastChannel,lastTo:params.entry?.lastTo}})}function queueSessionStoreTouch(params){touchSessionStore({cfg:params.cfg,sessionKey:params.sessionKey,storePath:params.storePath,canonicalKey:params.canonicalKey,entry:params.entry,sessionId:params.sessionId,now:params.now}).catch(err=>{params.ctx.logGateway.warn(`voice session-store update failed: `+formatForLog(err))})}function parseSessionKeyFromPayloadJSON(payloadJSON){let payload;try{payload=JSON.parse(payloadJSON)}catch{return null}if(typeof payload!=`object`||!payload)return null;let obj=payload,sessionKey=typeof obj.sessionKey==`string`?obj.sessionKey.trim():``;return sessionKey.length>0?sessionKey:null}async function sendReceiptAck(params){let resolved=resolveOutboundTarget({channel:params.channel,to:params.to,cfg:params.cfg,mode:`explicit`});if(!resolved.ok)throw Error(String(resolved.error));let agentId=resolveSessionAgentId({sessionKey:params.sessionKey,config:params.cfg});await deliverOutboundPayloads({cfg:params.cfg,channel:params.channel,to:resolved.to,payloads:[{text:params.text}],agentId,bestEffort:!0,deps:createOutboundSendDeps(params.deps)})}const handleNodeEvent=async(ctx,nodeId,evt)=>{switch(evt.event){case`voice.transcript`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},text=typeof obj.text==`string`?obj.text.trim():``;if(!text||text.length>2e4)return;let sessionKeyRaw=typeof obj.sessionKey==`string`?obj.sessionKey.trim():``,cfg=loadConfig(),rawMainKey=normalizeMainKey(cfg.session?.mainKey),sessionKey=sessionKeyRaw.length>0?sessionKeyRaw:rawMainKey,{storePath,entry,canonicalKey}=loadSessionEntry(sessionKey),now=Date.now();if(shouldDropDuplicateVoiceTranscript({sessionKey:canonicalKey,fingerprint:resolveVoiceTranscriptFingerprint(obj,text),now}))return;let sessionId=entry?.sessionId??randomUUID();queueSessionStoreTouch({ctx,cfg,sessionKey,storePath,canonicalKey,entry,sessionId,now}),ctx.addChatRun(sessionId,{sessionKey:canonicalKey,clientRunId:`voice-${randomUUID()}`}),agentCommand({message:text,sessionId,sessionKey:canonicalKey,thinking:`low`,deliver:!1,messageChannel:`node`,inputProvenance:{kind:`external_user`,sourceChannel:`voice`,sourceTool:`gateway.voice.transcript`}},defaultRuntime,ctx.deps).catch(err=>{ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`)});return}case`agent.request`:{if(!evt.payloadJSON)return;let link=null;try{link=JSON.parse(evt.payloadJSON)}catch{return}let message=(link?.message??``).trim(),normalizedAttachments=normalizeRpcAttachmentsToChatAttachments(link?.attachments??void 0),images=[];if(normalizedAttachments.length>0)try{let parsed=await parseMessageWithAttachments(message,normalizedAttachments,{maxBytes:5e6,log:ctx.logGateway});message=parsed.message.trim(),images=parsed.images}catch{return}if(!message||message.length>2e4)return;let channel=normalizeChannelId(typeof link?.channel==`string`?link.channel.trim():``)??void 0,to=typeof link?.to==`string`&&link.to.trim()?link.to.trim():void 0,deliverRequested=!!link?.deliver,wantsReceipt=!!link?.receipt,receiptText=(typeof link?.receiptText==`string`?link.receiptText.trim():``)||`Just received your iOS share + request, working on it.`,sessionKeyRaw=(link?.sessionKey??``).trim(),sessionKey=sessionKeyRaw.length>0?sessionKeyRaw:`node-${nodeId}`,cfg=loadConfig(),{storePath,entry,canonicalKey}=loadSessionEntry(sessionKey),now=Date.now(),sessionId=entry?.sessionId??randomUUID();if(await touchSessionStore({cfg,sessionKey,storePath,canonicalKey,entry,sessionId,now}),deliverRequested&&(!channel||!to)){let entryChannel=typeof entry?.lastChannel==`string`?normalizeChannelId(entry.lastChannel):void 0,entryTo=typeof entry?.lastTo==`string`?entry.lastTo.trim():``;!channel&&entryChannel&&(channel=entryChannel),!to&&entryTo&&(to=entryTo)}let deliver=deliverRequested&&!!(channel&&to),deliveryChannel=deliver?channel:void 0,deliveryTo=deliver?to:void 0;deliverRequested&&!deliver&&ctx.logGateway.warn(`agent delivery disabled node=${nodeId}: missing session delivery route (channel=${channel??`-`} to=${to??`-`})`),wantsReceipt&&deliveryChannel&&deliveryTo?sendReceiptAck({cfg,deps:ctx.deps,sessionKey:canonicalKey,channel:deliveryChannel,to:deliveryTo,text:receiptText}).catch(err=>{ctx.logGateway.warn(`agent receipt failed node=${nodeId}: ${formatForLog(err)}`)}):wantsReceipt&&ctx.logGateway.warn(`agent receipt skipped node=${nodeId}: missing delivery route (channel=${deliveryChannel??`-`} to=${deliveryTo??`-`})`),agentCommand({message,images,sessionId,sessionKey:canonicalKey,thinking:link?.thinking??void 0,deliver,to:deliveryTo,channel:deliveryChannel,timeout:typeof link?.timeoutSeconds==`number`?link.timeoutSeconds.toString():void 0,messageChannel:`node`},defaultRuntime,ctx.deps).catch(err=>{ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`)});return}case`chat.subscribe`:{if(!evt.payloadJSON)return;let sessionKey=parseSessionKeyFromPayloadJSON(evt.payloadJSON);if(!sessionKey)return;ctx.nodeSubscribe(nodeId,sessionKey);return}case`chat.unsubscribe`:{if(!evt.payloadJSON)return;let sessionKey=parseSessionKeyFromPayloadJSON(evt.payloadJSON);if(!sessionKey)return;ctx.nodeUnsubscribe(nodeId,sessionKey);return}case`exec.started`:case`exec.finished`:case`exec.denied`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},sessionKey=typeof obj.sessionKey==`string`?obj.sessionKey.trim():`node-${nodeId}`;if(!sessionKey)return;let runId=typeof obj.runId==`string`?obj.runId.trim():``,command=typeof obj.command==`string`?obj.command.trim():``,exitCode=typeof obj.exitCode==`number`&&Number.isFinite(obj.exitCode)?obj.exitCode:void 0,timedOut=obj.timedOut===!0,output=typeof obj.output==`string`?obj.output.trim():``,reason=typeof obj.reason==`string`?obj.reason.trim():``,text=``;if(evt.event===`exec.started`)text=`Exec started (node=${nodeId}${runId?` id=${runId}`:``})`,command&&(text+=`: ${command}`);else if(evt.event===`exec.finished`){let exitLabel=timedOut?`timeout`:`code ${exitCode??`?`}`,compactOutput=compactExecEventOutput(output);if(!(timedOut||exitCode!==0||compactOutput.length>0))return;text=`Exec finished (node=${nodeId}${runId?` id=${runId}`:``}, ${exitLabel})`,compactOutput&&(text+=`\n${compactOutput}`)}else text=`Exec denied (node=${nodeId}${runId?` id=${runId}`:``}${reason?`, ${reason}`:``})`,command&&(text+=`: ${command}`);enqueueSystemEvent(text,{sessionKey,contextKey:runId?`exec:${runId}`:`exec`}),requestHeartbeatNow({reason:`exec-event`});return}case`push.apns.register`:{if(!evt.payloadJSON)return;let payload;try{payload=JSON.parse(evt.payloadJSON)}catch{return}let obj=typeof payload==`object`&&payload?payload:{},token=typeof obj.token==`string`?obj.token:``,topic=typeof obj.topic==`string`?obj.topic:``,environment=obj.environment;try{await registerApnsToken({nodeId,token,topic,environment})}catch(err){ctx.logGateway.warn(`push apns register failed node=${nodeId}: ${formatForLog(err)}`)}return}default:return}};export{handleNodeEvent};
@@ -1,3 +1,3 @@
1
- import{h as pathExists}from"./utils-BP60e80M.js";import{a as isCorePackageName,i as CORE_PACKAGE_NAMES,o as stripPackagePrefix,r as CORE_PACKAGE_NAME}from"./builderforce-root-DY1qbWNX.js";import{t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import{xr as trimLogTail}from"./subagent-registry-Cj5yC7B4.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-BxgWcomx.js";import{a as gitWorkingTreeStatusArgs,d as channelToNpmTag,l as DEFAULT_PACKAGE_CHANNEL,m as isStableTag,n as compareSemverStrings,p as isBetaTag,s as detectPackageManager$1,u as DEV_BRANCH}from"./update-check-B0YqSZJr.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";async function readPackageVersion(root){try{let raw=await fs.readFile(path.join(root,`package.json`),`utf-8`),parsed=JSON.parse(raw);return typeof parsed?.version==`string`?parsed.version:null}catch{return null}}async function readPackageName(root){try{let raw=await fs.readFile(path.join(root,`package.json`),`utf-8`);return JSON.parse(raw)?.name?.trim()||null}catch{return null}}const PRIMARY_PACKAGE_NAME=CORE_PACKAGE_NAME,ALL_PACKAGE_NAMES=CORE_PACKAGE_NAMES;async function tryRealpath(targetPath){try{return await fs.realpath(targetPath)}catch{return path.resolve(targetPath)}}function resolveBunGlobalRoot(){let bunInstall=process.env.BUN_INSTALL?.trim()||path.join(os.homedir(),`.bun`);return path.join(bunInstall,`install`,`global`,`node_modules`)}async function resolveGlobalRoot(manager,runCommand,timeoutMs){if(manager===`bun`)return resolveBunGlobalRoot();let res=await runCommand(manager===`pnpm`?[`pnpm`,`root`,`-g`]:[`npm`,`root`,`-g`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?null:res.stdout.trim()||null}async function resolveGlobalPackageRoot(manager,runCommand,timeoutMs){let root=await resolveGlobalRoot(manager,runCommand,timeoutMs);if(!root)return null;for(let name of ALL_PACKAGE_NAMES){let candidate=path.join(root,name);if(await pathExists(candidate))return candidate}return path.join(root,PRIMARY_PACKAGE_NAME)}async function detectGlobalInstallManagerForRoot(runCommand,pkgRoot,timeoutMs){let pkgReal=await tryRealpath(pkgRoot);for(let{manager,argv}of[{manager:`npm`,argv:[`npm`,`root`,`-g`]},{manager:`pnpm`,argv:[`pnpm`,`root`,`-g`]}]){let res=await runCommand(argv,{timeoutMs}).catch(()=>null);if(!res||res.code!==0)continue;let globalRoot=res.stdout.trim();if(!globalRoot)continue;let globalReal=await tryRealpath(globalRoot);for(let name of ALL_PACKAGE_NAMES){let expected=path.join(globalReal,name);if(path.resolve(expected)===path.resolve(pkgReal))return manager}}let bunGlobalReal=await tryRealpath(resolveBunGlobalRoot());for(let name of ALL_PACKAGE_NAMES){let bunExpected=path.join(bunGlobalReal,name);if(path.resolve(bunExpected)===path.resolve(pkgReal))return`bun`}return null}async function detectGlobalInstallManagerByPresence(runCommand,timeoutMs){for(let manager of[`npm`,`pnpm`]){let root=await resolveGlobalRoot(manager,runCommand,timeoutMs);if(root){for(let name of ALL_PACKAGE_NAMES)if(await pathExists(path.join(root,name)))return manager}}let bunRoot=resolveBunGlobalRoot();for(let name of ALL_PACKAGE_NAMES)if(await pathExists(path.join(bunRoot,name)))return`bun`;return null}function globalInstallArgs(manager,spec){return manager===`pnpm`?[`pnpm`,`add`,`-g`,spec]:manager===`bun`?[`bun`,`add`,`-g`,spec]:[`npm`,`i`,`-g`,spec]}async function cleanupGlobalRenameDirs(params){let removed=[],root=params.globalRoot.trim(),name=params.packageName.trim().split(`/`).pop()??``;if(!root||!name)return{removed};let prefix=`.${name}-`,entries=[];try{entries=await fs.readdir(root)}catch{return{removed}}for(let entry of entries){if(!entry.startsWith(prefix))continue;let target=path.join(root,entry);try{if(!(await fs.lstat(target)).isDirectory())continue;await fs.rm(target,{recursive:!0,force:!0}),removed.push(entry)}catch{}}return{removed}}const MAX_LOG_CHARS=8e3,START_DIRS=[`cwd`,`argv1`,`process`];function normalizeDir(value){if(!value)return null;let trimmed=value.trim();return trimmed?path.resolve(trimmed):null}function resolveNodeModulesBinPackageRoot(argv1){let normalized=path.resolve(argv1),parts=normalized.split(path.sep),binIndex=parts.lastIndexOf(`.bin`);if(binIndex<=0||parts[binIndex-1]!==`node_modules`)return null;let binName=path.basename(normalized),nodeModulesDir=parts.slice(0,binIndex).join(path.sep);return path.join(nodeModulesDir,binName)}function buildStartDirs(opts){let dirs=[],cwd=normalizeDir(opts.cwd);cwd&&dirs.push(cwd);let argv1=normalizeDir(opts.argv1);if(argv1){dirs.push(path.dirname(argv1));let packageRoot=resolveNodeModulesBinPackageRoot(argv1);packageRoot&&dirs.push(packageRoot)}let proc=normalizeDir(process.cwd());return proc&&dirs.push(proc),Array.from(new Set(dirs))}async function readBranchName(runCommand,root,timeoutMs){let res=await runCommand([`git`,`-C`,root,`rev-parse`,`--abbrev-ref`,`HEAD`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?null:res.stdout.trim()||null}async function listGitTags(runCommand,root,timeoutMs,pattern=`v*`){let res=await runCommand([`git`,`-C`,root,`tag`,`--list`,pattern,`--sort=-v:refname`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?[]:res.stdout.split(`
1
+ import{h as pathExists}from"./utils-BP60e80M.js";import{a as isCorePackageName,i as CORE_PACKAGE_NAMES,o as stripPackagePrefix,r as CORE_PACKAGE_NAME}from"./builderforce-root-DY1qbWNX.js";import{t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import{xr as trimLogTail}from"./subagent-registry-m_x-JRkR.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-BxgWcomx.js";import{a as gitWorkingTreeStatusArgs,d as channelToNpmTag,l as DEFAULT_PACKAGE_CHANNEL,m as isStableTag,n as compareSemverStrings,p as isBetaTag,s as detectPackageManager$1,u as DEV_BRANCH}from"./update-check-B0YqSZJr.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";async function readPackageVersion(root){try{let raw=await fs.readFile(path.join(root,`package.json`),`utf-8`),parsed=JSON.parse(raw);return typeof parsed?.version==`string`?parsed.version:null}catch{return null}}async function readPackageName(root){try{let raw=await fs.readFile(path.join(root,`package.json`),`utf-8`);return JSON.parse(raw)?.name?.trim()||null}catch{return null}}const PRIMARY_PACKAGE_NAME=CORE_PACKAGE_NAME,ALL_PACKAGE_NAMES=CORE_PACKAGE_NAMES;async function tryRealpath(targetPath){try{return await fs.realpath(targetPath)}catch{return path.resolve(targetPath)}}function resolveBunGlobalRoot(){let bunInstall=process.env.BUN_INSTALL?.trim()||path.join(os.homedir(),`.bun`);return path.join(bunInstall,`install`,`global`,`node_modules`)}async function resolveGlobalRoot(manager,runCommand,timeoutMs){if(manager===`bun`)return resolveBunGlobalRoot();let res=await runCommand(manager===`pnpm`?[`pnpm`,`root`,`-g`]:[`npm`,`root`,`-g`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?null:res.stdout.trim()||null}async function resolveGlobalPackageRoot(manager,runCommand,timeoutMs){let root=await resolveGlobalRoot(manager,runCommand,timeoutMs);if(!root)return null;for(let name of ALL_PACKAGE_NAMES){let candidate=path.join(root,name);if(await pathExists(candidate))return candidate}return path.join(root,PRIMARY_PACKAGE_NAME)}async function detectGlobalInstallManagerForRoot(runCommand,pkgRoot,timeoutMs){let pkgReal=await tryRealpath(pkgRoot);for(let{manager,argv}of[{manager:`npm`,argv:[`npm`,`root`,`-g`]},{manager:`pnpm`,argv:[`pnpm`,`root`,`-g`]}]){let res=await runCommand(argv,{timeoutMs}).catch(()=>null);if(!res||res.code!==0)continue;let globalRoot=res.stdout.trim();if(!globalRoot)continue;let globalReal=await tryRealpath(globalRoot);for(let name of ALL_PACKAGE_NAMES){let expected=path.join(globalReal,name);if(path.resolve(expected)===path.resolve(pkgReal))return manager}}let bunGlobalReal=await tryRealpath(resolveBunGlobalRoot());for(let name of ALL_PACKAGE_NAMES){let bunExpected=path.join(bunGlobalReal,name);if(path.resolve(bunExpected)===path.resolve(pkgReal))return`bun`}return null}async function detectGlobalInstallManagerByPresence(runCommand,timeoutMs){for(let manager of[`npm`,`pnpm`]){let root=await resolveGlobalRoot(manager,runCommand,timeoutMs);if(root){for(let name of ALL_PACKAGE_NAMES)if(await pathExists(path.join(root,name)))return manager}}let bunRoot=resolveBunGlobalRoot();for(let name of ALL_PACKAGE_NAMES)if(await pathExists(path.join(bunRoot,name)))return`bun`;return null}function globalInstallArgs(manager,spec){return manager===`pnpm`?[`pnpm`,`add`,`-g`,spec]:manager===`bun`?[`bun`,`add`,`-g`,spec]:[`npm`,`i`,`-g`,spec]}async function cleanupGlobalRenameDirs(params){let removed=[],root=params.globalRoot.trim(),name=params.packageName.trim().split(`/`).pop()??``;if(!root||!name)return{removed};let prefix=`.${name}-`,entries=[];try{entries=await fs.readdir(root)}catch{return{removed}}for(let entry of entries){if(!entry.startsWith(prefix))continue;let target=path.join(root,entry);try{if(!(await fs.lstat(target)).isDirectory())continue;await fs.rm(target,{recursive:!0,force:!0}),removed.push(entry)}catch{}}return{removed}}const MAX_LOG_CHARS=8e3,START_DIRS=[`cwd`,`argv1`,`process`];function normalizeDir(value){if(!value)return null;let trimmed=value.trim();return trimmed?path.resolve(trimmed):null}function resolveNodeModulesBinPackageRoot(argv1){let normalized=path.resolve(argv1),parts=normalized.split(path.sep),binIndex=parts.lastIndexOf(`.bin`);if(binIndex<=0||parts[binIndex-1]!==`node_modules`)return null;let binName=path.basename(normalized),nodeModulesDir=parts.slice(0,binIndex).join(path.sep);return path.join(nodeModulesDir,binName)}function buildStartDirs(opts){let dirs=[],cwd=normalizeDir(opts.cwd);cwd&&dirs.push(cwd);let argv1=normalizeDir(opts.argv1);if(argv1){dirs.push(path.dirname(argv1));let packageRoot=resolveNodeModulesBinPackageRoot(argv1);packageRoot&&dirs.push(packageRoot)}let proc=normalizeDir(process.cwd());return proc&&dirs.push(proc),Array.from(new Set(dirs))}async function readBranchName(runCommand,root,timeoutMs){let res=await runCommand([`git`,`-C`,root,`rev-parse`,`--abbrev-ref`,`HEAD`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?null:res.stdout.trim()||null}async function listGitTags(runCommand,root,timeoutMs,pattern=`v*`){let res=await runCommand([`git`,`-C`,root,`tag`,`--list`,pattern,`--sort=-v:refname`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?[]:res.stdout.split(`
2
2
  `).map(line=>line.trim()).filter(Boolean)}async function resolveChannelTag(runCommand,root,timeoutMs,channel){let tags=await listGitTags(runCommand,root,timeoutMs);if(channel===`beta`){let betaTag=tags.find(tag=>isBetaTag(tag))??null,stableTag=tags.find(tag=>isStableTag(tag))??null;if(!betaTag)return stableTag;if(!stableTag)return betaTag;let cmp=compareSemverStrings(betaTag,stableTag);return cmp!=null&&cmp<0?stableTag:betaTag}return tags.find(tag=>isStableTag(tag))??null}async function resolveGitRoot(runCommand,candidates,timeoutMs){for(let dir of candidates){let res=await runCommand([`git`,`-C`,dir,`rev-parse`,`--show-toplevel`],{timeoutMs});if(res.code===0){let root=res.stdout.trim();if(root)return root}}return null}async function findPackageRoot(candidates){for(let dir of candidates){let current=dir;for(let i=0;i<12;i+=1){let pkgPath=path.join(current,`package.json`);try{let raw=await fs.readFile(pkgPath,`utf-8`),name=JSON.parse(raw)?.name?.trim();if(isCorePackageName(name))return current}catch{}let parent=path.dirname(current);if(parent===current)break;current=parent}}return null}async function detectPackageManager(root){return await detectPackageManager$1(root)??`npm`}async function runStep(opts){let{runCommand,name,argv,cwd,timeoutMs,env,progress,stepIndex,totalSteps}=opts,command=argv.join(` `),stepInfo={name,command,index:stepIndex,total:totalSteps};progress?.onStepStart?.(stepInfo);let started=Date.now(),result=await runCommand(argv,{cwd,timeoutMs,env}),durationMs=Date.now()-started,stderrTail=trimLogTail(result.stderr,MAX_LOG_CHARS);return progress?.onStepComplete?.({...stepInfo,durationMs,exitCode:result.code,stderrTail}),{name,command,cwd,durationMs,exitCode:result.code,stdoutTail:trimLogTail(result.stdout,MAX_LOG_CHARS),stderrTail:trimLogTail(result.stderr,MAX_LOG_CHARS)}}function managerScriptArgs(manager,script,args=[]){return manager===`pnpm`?[`pnpm`,script,...args]:manager===`bun`?[`bun`,`run`,script,...args]:args.length>0?[`npm`,`run`,script,`--`,...args]:[`npm`,`run`,script]}function managerInstallArgs(manager){return manager===`pnpm`?[`pnpm`,`install`]:manager===`bun`?[`bun`,`install`]:[`npm`,`install`]}function normalizeTag(tag){let trimmed=tag?.trim();return trimmed?stripPackagePrefix(trimmed):`latest`}async function runGatewayUpdate(opts={}){let startedAt=Date.now(),runCommand=opts.runCommand??(async(argv,options)=>{let res=await runCommandWithTimeout(argv,options);return{stdout:res.stdout,stderr:res.stderr,code:res.code}}),timeoutMs=opts.timeoutMs??12e5,progress=opts.progress,steps=[],candidates=buildStartDirs(opts),stepIndex=0,gitTotalSteps=0,step=(name,argv,cwd,env)=>{let currentIndex=stepIndex;return stepIndex+=1,{runCommand,name,argv,cwd,timeoutMs,env,progress,stepIndex:currentIndex,totalSteps:gitTotalSteps}},pkgRoot=await findPackageRoot(candidates),gitRoot=await resolveGitRoot(runCommand,candidates,timeoutMs);if(gitRoot&&pkgRoot&&path.resolve(gitRoot)!==path.resolve(pkgRoot)&&(gitRoot=null),gitRoot&&!pkgRoot)return{status:`error`,mode:`unknown`,root:gitRoot,reason:`not-builderforce-root`,steps:[],durationMs:Date.now()-startedAt};if(gitRoot&&pkgRoot&&path.resolve(gitRoot)===path.resolve(pkgRoot)){let beforeSha=(await runCommand([`git`,`-C`,gitRoot,`rev-parse`,`HEAD`],{cwd:gitRoot,timeoutMs})).stdout.trim()||null,beforeVersion=await readPackageVersion(gitRoot),channel=opts.channel??`dev`,branch=channel===`dev`?await readBranchName(runCommand,gitRoot,timeoutMs):null,needsCheckoutMain=channel===`dev`&&branch!==DEV_BRANCH;gitTotalSteps=channel===`dev`?needsCheckoutMain?11:10:9;let buildGitErrorResult=reason=>({status:`error`,mode:`git`,root:gitRoot,reason,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt}),runGitCheckoutOrFail=async(name,argv)=>{let checkoutStep=await runStep(step(name,argv,gitRoot));return steps.push(checkoutStep),checkoutStep.exitCode===0?null:buildGitErrorResult(`checkout-failed`)},statusCheck=await runStep(step(`clean check`,gitWorkingTreeStatusArgs(gitRoot),gitRoot));if(steps.push(statusCheck),statusCheck.stdoutTail&&statusCheck.stdoutTail.trim().length>0)return{status:`skipped`,mode:`git`,root:gitRoot,reason:`dirty`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};if(channel===`dev`){if(needsCheckoutMain){let failure=await runGitCheckoutOrFail(`git checkout ${DEV_BRANCH}`,[`git`,`-C`,gitRoot,`checkout`,DEV_BRANCH]);if(failure)return failure}let upstreamStep=await runStep(step(`upstream check`,[`git`,`-C`,gitRoot,`rev-parse`,`--abbrev-ref`,`--symbolic-full-name`,`@{upstream}`],gitRoot));if(steps.push(upstreamStep),upstreamStep.exitCode!==0)return{status:`skipped`,mode:`git`,root:gitRoot,reason:`no-upstream`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let fetchStep=await runStep(step(`git fetch`,[`git`,`-C`,gitRoot,`fetch`,`--all`,`--prune`,`--tags`],gitRoot));steps.push(fetchStep);let upstreamShaStep=await runStep(step(`git rev-parse @{upstream}`,[`git`,`-C`,gitRoot,`rev-parse`,`@{upstream}`],gitRoot));steps.push(upstreamShaStep);let upstreamSha=upstreamShaStep.stdoutTail?.trim();if(!upstreamShaStep.stdoutTail||!upstreamSha)return{status:`error`,mode:`git`,root:gitRoot,reason:`no-upstream-sha`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let revListStep=await runStep(step(`git rev-list`,[`git`,`-C`,gitRoot,`rev-list`,`--max-count=10`,upstreamSha],gitRoot));if(steps.push(revListStep),revListStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`preflight-revlist-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let candidates=(revListStep.stdoutTail??``).split(`
3
3
  `).map(line=>line.trim()).filter(Boolean);if(candidates.length===0)return{status:`error`,mode:`git`,root:gitRoot,reason:`preflight-no-candidates`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let manager=await detectPackageManager(gitRoot),preflightRoot=await fs.mkdtemp(path.join(os.tmpdir(),`builderforce-update-preflight-`)),worktreeDir=path.join(preflightRoot,`worktree`),worktreeStep=await runStep(step(`preflight worktree`,[`git`,`-C`,gitRoot,`worktree`,`add`,`--detach`,worktreeDir,upstreamSha],gitRoot));if(steps.push(worktreeStep),worktreeStep.exitCode!==0)return await fs.rm(preflightRoot,{recursive:!0,force:!0}).catch(()=>{}),{status:`error`,mode:`git`,root:gitRoot,reason:`preflight-worktree-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let selectedSha=null;try{for(let sha of candidates){let shortSha=sha.slice(0,8),checkoutStep=await runStep(step(`preflight checkout (${shortSha})`,[`git`,`-C`,worktreeDir,`checkout`,`--detach`,sha],worktreeDir));if(steps.push(checkoutStep),checkoutStep.exitCode!==0)continue;let depsStep=await runStep(step(`preflight deps install (${shortSha})`,managerInstallArgs(manager),worktreeDir));if(steps.push(depsStep),depsStep.exitCode!==0)continue;let buildStep=await runStep(step(`preflight build (${shortSha})`,managerScriptArgs(manager,`build`),worktreeDir));if(steps.push(buildStep),buildStep.exitCode!==0)continue;let lintStep=await runStep(step(`preflight lint (${shortSha})`,managerScriptArgs(manager,`lint`),worktreeDir));if(steps.push(lintStep),lintStep.exitCode===0){selectedSha=sha;break}}}finally{let removeStep=await runStep(step(`preflight cleanup`,[`git`,`-C`,gitRoot,`worktree`,`remove`,`--force`,worktreeDir],gitRoot));steps.push(removeStep),await runCommand([`git`,`-C`,gitRoot,`worktree`,`prune`],{cwd:gitRoot,timeoutMs}).catch(()=>null),await fs.rm(preflightRoot,{recursive:!0,force:!0}).catch(()=>{})}if(!selectedSha)return{status:`error`,mode:`git`,root:gitRoot,reason:`preflight-no-good-commit`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let rebaseStep=await runStep(step(`git rebase`,[`git`,`-C`,gitRoot,`rebase`,selectedSha],gitRoot));if(steps.push(rebaseStep),rebaseStep.exitCode!==0){let abortResult=await runCommand([`git`,`-C`,gitRoot,`rebase`,`--abort`],{cwd:gitRoot,timeoutMs});return steps.push({name:`git rebase --abort`,command:`git rebase --abort`,cwd:gitRoot,durationMs:0,exitCode:abortResult.code,stdoutTail:trimLogTail(abortResult.stdout,MAX_LOG_CHARS),stderrTail:trimLogTail(abortResult.stderr,MAX_LOG_CHARS)}),{status:`error`,mode:`git`,root:gitRoot,reason:`rebase-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt}}}else{let fetchStep=await runStep(step(`git fetch`,[`git`,`-C`,gitRoot,`fetch`,`--all`,`--prune`,`--tags`],gitRoot));if(steps.push(fetchStep),fetchStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`fetch-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let tag=await resolveChannelTag(runCommand,gitRoot,timeoutMs,channel);if(!tag)return{status:`error`,mode:`git`,root:gitRoot,reason:`no-release-tag`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let failure=await runGitCheckoutOrFail(`git checkout ${tag}`,[`git`,`-C`,gitRoot,`checkout`,`--detach`,tag]);if(failure)return failure}let manager=await detectPackageManager(gitRoot),depsStep=await runStep(step(`deps install`,managerInstallArgs(manager),gitRoot));if(steps.push(depsStep),depsStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`deps-install-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let buildStep=await runStep(step(`build`,managerScriptArgs(manager,`build`),gitRoot));if(steps.push(buildStep),buildStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`build-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let uiBuildStep=await runStep(step(`ui:build`,managerScriptArgs(manager,`ui:build`),gitRoot));if(steps.push(uiBuildStep),uiBuildStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`ui-build-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let doctorEntry=path.join(gitRoot,`builderforce.mjs`);if(!await fs.stat(doctorEntry).then(()=>!0).catch(()=>!1))return steps.push({name:`builderforce doctor entry`,command:`verify ${doctorEntry}`,cwd:gitRoot,durationMs:0,exitCode:1,stderrTail:`missing ${doctorEntry}`}),{status:`error`,mode:`git`,root:gitRoot,reason:`doctor-entry-missing`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let doctorStep=await runStep(step(`builderforce doctor`,[process.execPath,doctorEntry,`doctor`,`--non-interactive`,`--fix`],gitRoot,{BUILDERFORCE_AGENTS_UPDATE_IN_PROGRESS:`1`}));if(steps.push(doctorStep),!(await resolveControlUiDistIndexHealth({root:gitRoot})).exists){let repairArgv=managerScriptArgs(manager,`ui:build`),started=Date.now(),repairResult=await runCommand(repairArgv,{cwd:gitRoot,timeoutMs}),repairStep={name:`ui:build (post-doctor repair)`,command:repairArgv.join(` `),cwd:gitRoot,durationMs:Date.now()-started,exitCode:repairResult.code,stdoutTail:trimLogTail(repairResult.stdout,MAX_LOG_CHARS),stderrTail:trimLogTail(repairResult.stderr,MAX_LOG_CHARS)};if(steps.push(repairStep),repairResult.code!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:repairStep.name,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let repairedUiIndexHealth=await resolveControlUiDistIndexHealth({root:gitRoot});if(!repairedUiIndexHealth.exists){let uiIndexPath=repairedUiIndexHealth.indexPath??resolveControlUiDistIndexPathForRoot(gitRoot);return steps.push({name:`ui assets verify`,command:`verify ${uiIndexPath}`,cwd:gitRoot,durationMs:0,exitCode:1,stderrTail:`missing ${uiIndexPath}`}),{status:`error`,mode:`git`,root:gitRoot,reason:`ui-assets-missing`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt}}}let failedStep=steps.find(s=>s.exitCode!==0),afterShaStep=await runStep(step(`git rev-parse HEAD (after)`,[`git`,`-C`,gitRoot,`rev-parse`,`HEAD`],gitRoot));steps.push(afterShaStep);let afterVersion=await readPackageVersion(gitRoot);return{status:failedStep?`error`:`ok`,mode:`git`,root:gitRoot,reason:failedStep?failedStep.name:void 0,before:{sha:beforeSha,version:beforeVersion},after:{sha:afterShaStep.stdoutTail?.trim()??null,version:afterVersion},steps,durationMs:Date.now()-startedAt}}if(!pkgRoot)return{status:`error`,mode:`unknown`,reason:`no root (${START_DIRS.join(`,`)})`,steps:[],durationMs:Date.now()-startedAt};let beforeVersion=await readPackageVersion(pkgRoot),globalManager=await detectGlobalInstallManagerForRoot(runCommand,pkgRoot,timeoutMs);if(globalManager){let packageName=await readPackageName(pkgRoot)??CORE_PACKAGE_NAME;await cleanupGlobalRenameDirs({globalRoot:path.dirname(pkgRoot),packageName});let channel=opts.channel??DEFAULT_PACKAGE_CHANNEL,updateStep=await runStep({runCommand,name:`global update`,argv:globalInstallArgs(globalManager,`${packageName}@${normalizeTag(opts.tag??channelToNpmTag(channel))}`),cwd:pkgRoot,timeoutMs,progress,stepIndex:0,totalSteps:1}),steps=[updateStep],afterVersion=await readPackageVersion(pkgRoot);return{status:updateStep.exitCode===0?`ok`:`error`,mode:globalManager,root:pkgRoot,reason:updateStep.exitCode===0?void 0:updateStep.name,before:{version:beforeVersion},after:{version:afterVersion},steps,durationMs:Date.now()-startedAt}}return{status:`skipped`,mode:`unknown`,root:pkgRoot,reason:`not-git-install`,before:{version:beforeVersion},steps:[],durationMs:Date.now()-startedAt}}async function resolveAgentSessionDirs(stateDir){let agentsDir=path.join(stateDir,`agents`),entries=[];try{entries=await fs.readdir(agentsDir,{withFileTypes:!0})}catch(err){if(err.code===`ENOENT`)return[];throw err}return entries.filter(entry=>entry.isDirectory()).map(entry=>path.join(agentsDir,entry.name,`sessions`)).toSorted((a,b)=>a.localeCompare(b))}export{detectGlobalInstallManagerForRoot as a,readPackageName as c,detectGlobalInstallManagerByPresence as i,readPackageVersion as l,runGatewayUpdate as n,globalInstallArgs as o,cleanupGlobalRenameDirs as r,resolveGlobalPackageRoot as s,resolveAgentSessionDirs as t};
@@ -1,3 +1,3 @@
1
- import{g as pathExists}from"./utils-DbaBVFaK.js";import{cr as trimLogTail}from"./reply-D9wUWhMx.js";import{a as isCorePackageName,i as CORE_PACKAGE_NAMES,o as stripPackagePrefix,r as CORE_PACKAGE_NAME}from"./builderforce-root-D64_sXEi.js";import{t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-CWgH1Tda.js";import{a as gitWorkingTreeStatusArgs,d as channelToNpmTag,l as DEFAULT_PACKAGE_CHANNEL,m as isStableTag,n as compareSemverStrings,p as isBetaTag,s as detectPackageManager$1,u as DEV_BRANCH}from"./update-check-D6MvqVFE.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";async function readPackageVersion(root){try{let raw=await fs.readFile(path.join(root,`package.json`),`utf-8`),parsed=JSON.parse(raw);return typeof parsed?.version==`string`?parsed.version:null}catch{return null}}async function readPackageName(root){try{let raw=await fs.readFile(path.join(root,`package.json`),`utf-8`);return JSON.parse(raw)?.name?.trim()||null}catch{return null}}const PRIMARY_PACKAGE_NAME=CORE_PACKAGE_NAME,ALL_PACKAGE_NAMES=CORE_PACKAGE_NAMES;async function tryRealpath(targetPath){try{return await fs.realpath(targetPath)}catch{return path.resolve(targetPath)}}function resolveBunGlobalRoot(){let bunInstall=process.env.BUN_INSTALL?.trim()||path.join(os.homedir(),`.bun`);return path.join(bunInstall,`install`,`global`,`node_modules`)}async function resolveGlobalRoot(manager,runCommand,timeoutMs){if(manager===`bun`)return resolveBunGlobalRoot();let res=await runCommand(manager===`pnpm`?[`pnpm`,`root`,`-g`]:[`npm`,`root`,`-g`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?null:res.stdout.trim()||null}async function resolveGlobalPackageRoot(manager,runCommand,timeoutMs){let root=await resolveGlobalRoot(manager,runCommand,timeoutMs);if(!root)return null;for(let name of ALL_PACKAGE_NAMES){let candidate=path.join(root,name);if(await pathExists(candidate))return candidate}return path.join(root,PRIMARY_PACKAGE_NAME)}async function detectGlobalInstallManagerForRoot(runCommand,pkgRoot,timeoutMs){let pkgReal=await tryRealpath(pkgRoot);for(let{manager,argv}of[{manager:`npm`,argv:[`npm`,`root`,`-g`]},{manager:`pnpm`,argv:[`pnpm`,`root`,`-g`]}]){let res=await runCommand(argv,{timeoutMs}).catch(()=>null);if(!res||res.code!==0)continue;let globalRoot=res.stdout.trim();if(!globalRoot)continue;let globalReal=await tryRealpath(globalRoot);for(let name of ALL_PACKAGE_NAMES){let expected=path.join(globalReal,name);if(path.resolve(expected)===path.resolve(pkgReal))return manager}}let bunGlobalReal=await tryRealpath(resolveBunGlobalRoot());for(let name of ALL_PACKAGE_NAMES){let bunExpected=path.join(bunGlobalReal,name);if(path.resolve(bunExpected)===path.resolve(pkgReal))return`bun`}return null}async function detectGlobalInstallManagerByPresence(runCommand,timeoutMs){for(let manager of[`npm`,`pnpm`]){let root=await resolveGlobalRoot(manager,runCommand,timeoutMs);if(root){for(let name of ALL_PACKAGE_NAMES)if(await pathExists(path.join(root,name)))return manager}}let bunRoot=resolveBunGlobalRoot();for(let name of ALL_PACKAGE_NAMES)if(await pathExists(path.join(bunRoot,name)))return`bun`;return null}function globalInstallArgs(manager,spec){return manager===`pnpm`?[`pnpm`,`add`,`-g`,spec]:manager===`bun`?[`bun`,`add`,`-g`,spec]:[`npm`,`i`,`-g`,spec]}async function cleanupGlobalRenameDirs(params){let removed=[],root=params.globalRoot.trim(),name=params.packageName.trim().split(`/`).pop()??``;if(!root||!name)return{removed};let prefix=`.${name}-`,entries=[];try{entries=await fs.readdir(root)}catch{return{removed}}for(let entry of entries){if(!entry.startsWith(prefix))continue;let target=path.join(root,entry);try{if(!(await fs.lstat(target)).isDirectory())continue;await fs.rm(target,{recursive:!0,force:!0}),removed.push(entry)}catch{}}return{removed}}const MAX_LOG_CHARS=8e3,START_DIRS=[`cwd`,`argv1`,`process`];function normalizeDir(value){if(!value)return null;let trimmed=value.trim();return trimmed?path.resolve(trimmed):null}function resolveNodeModulesBinPackageRoot(argv1){let normalized=path.resolve(argv1),parts=normalized.split(path.sep),binIndex=parts.lastIndexOf(`.bin`);if(binIndex<=0||parts[binIndex-1]!==`node_modules`)return null;let binName=path.basename(normalized),nodeModulesDir=parts.slice(0,binIndex).join(path.sep);return path.join(nodeModulesDir,binName)}function buildStartDirs(opts){let dirs=[],cwd=normalizeDir(opts.cwd);cwd&&dirs.push(cwd);let argv1=normalizeDir(opts.argv1);if(argv1){dirs.push(path.dirname(argv1));let packageRoot=resolveNodeModulesBinPackageRoot(argv1);packageRoot&&dirs.push(packageRoot)}let proc=normalizeDir(process.cwd());return proc&&dirs.push(proc),Array.from(new Set(dirs))}async function readBranchName(runCommand,root,timeoutMs){let res=await runCommand([`git`,`-C`,root,`rev-parse`,`--abbrev-ref`,`HEAD`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?null:res.stdout.trim()||null}async function listGitTags(runCommand,root,timeoutMs,pattern=`v*`){let res=await runCommand([`git`,`-C`,root,`tag`,`--list`,pattern,`--sort=-v:refname`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?[]:res.stdout.split(`
1
+ import{g as pathExists}from"./utils-DbaBVFaK.js";import{cr as trimLogTail}from"./reply-BuUSdq2L.js";import{a as isCorePackageName,i as CORE_PACKAGE_NAMES,o as stripPackagePrefix,r as CORE_PACKAGE_NAME}from"./builderforce-root-D64_sXEi.js";import{t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-CWgH1Tda.js";import{a as gitWorkingTreeStatusArgs,d as channelToNpmTag,l as DEFAULT_PACKAGE_CHANNEL,m as isStableTag,n as compareSemverStrings,p as isBetaTag,s as detectPackageManager$1,u as DEV_BRANCH}from"./update-check-D6MvqVFE.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";async function readPackageVersion(root){try{let raw=await fs.readFile(path.join(root,`package.json`),`utf-8`),parsed=JSON.parse(raw);return typeof parsed?.version==`string`?parsed.version:null}catch{return null}}async function readPackageName(root){try{let raw=await fs.readFile(path.join(root,`package.json`),`utf-8`);return JSON.parse(raw)?.name?.trim()||null}catch{return null}}const PRIMARY_PACKAGE_NAME=CORE_PACKAGE_NAME,ALL_PACKAGE_NAMES=CORE_PACKAGE_NAMES;async function tryRealpath(targetPath){try{return await fs.realpath(targetPath)}catch{return path.resolve(targetPath)}}function resolveBunGlobalRoot(){let bunInstall=process.env.BUN_INSTALL?.trim()||path.join(os.homedir(),`.bun`);return path.join(bunInstall,`install`,`global`,`node_modules`)}async function resolveGlobalRoot(manager,runCommand,timeoutMs){if(manager===`bun`)return resolveBunGlobalRoot();let res=await runCommand(manager===`pnpm`?[`pnpm`,`root`,`-g`]:[`npm`,`root`,`-g`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?null:res.stdout.trim()||null}async function resolveGlobalPackageRoot(manager,runCommand,timeoutMs){let root=await resolveGlobalRoot(manager,runCommand,timeoutMs);if(!root)return null;for(let name of ALL_PACKAGE_NAMES){let candidate=path.join(root,name);if(await pathExists(candidate))return candidate}return path.join(root,PRIMARY_PACKAGE_NAME)}async function detectGlobalInstallManagerForRoot(runCommand,pkgRoot,timeoutMs){let pkgReal=await tryRealpath(pkgRoot);for(let{manager,argv}of[{manager:`npm`,argv:[`npm`,`root`,`-g`]},{manager:`pnpm`,argv:[`pnpm`,`root`,`-g`]}]){let res=await runCommand(argv,{timeoutMs}).catch(()=>null);if(!res||res.code!==0)continue;let globalRoot=res.stdout.trim();if(!globalRoot)continue;let globalReal=await tryRealpath(globalRoot);for(let name of ALL_PACKAGE_NAMES){let expected=path.join(globalReal,name);if(path.resolve(expected)===path.resolve(pkgReal))return manager}}let bunGlobalReal=await tryRealpath(resolveBunGlobalRoot());for(let name of ALL_PACKAGE_NAMES){let bunExpected=path.join(bunGlobalReal,name);if(path.resolve(bunExpected)===path.resolve(pkgReal))return`bun`}return null}async function detectGlobalInstallManagerByPresence(runCommand,timeoutMs){for(let manager of[`npm`,`pnpm`]){let root=await resolveGlobalRoot(manager,runCommand,timeoutMs);if(root){for(let name of ALL_PACKAGE_NAMES)if(await pathExists(path.join(root,name)))return manager}}let bunRoot=resolveBunGlobalRoot();for(let name of ALL_PACKAGE_NAMES)if(await pathExists(path.join(bunRoot,name)))return`bun`;return null}function globalInstallArgs(manager,spec){return manager===`pnpm`?[`pnpm`,`add`,`-g`,spec]:manager===`bun`?[`bun`,`add`,`-g`,spec]:[`npm`,`i`,`-g`,spec]}async function cleanupGlobalRenameDirs(params){let removed=[],root=params.globalRoot.trim(),name=params.packageName.trim().split(`/`).pop()??``;if(!root||!name)return{removed};let prefix=`.${name}-`,entries=[];try{entries=await fs.readdir(root)}catch{return{removed}}for(let entry of entries){if(!entry.startsWith(prefix))continue;let target=path.join(root,entry);try{if(!(await fs.lstat(target)).isDirectory())continue;await fs.rm(target,{recursive:!0,force:!0}),removed.push(entry)}catch{}}return{removed}}const MAX_LOG_CHARS=8e3,START_DIRS=[`cwd`,`argv1`,`process`];function normalizeDir(value){if(!value)return null;let trimmed=value.trim();return trimmed?path.resolve(trimmed):null}function resolveNodeModulesBinPackageRoot(argv1){let normalized=path.resolve(argv1),parts=normalized.split(path.sep),binIndex=parts.lastIndexOf(`.bin`);if(binIndex<=0||parts[binIndex-1]!==`node_modules`)return null;let binName=path.basename(normalized),nodeModulesDir=parts.slice(0,binIndex).join(path.sep);return path.join(nodeModulesDir,binName)}function buildStartDirs(opts){let dirs=[],cwd=normalizeDir(opts.cwd);cwd&&dirs.push(cwd);let argv1=normalizeDir(opts.argv1);if(argv1){dirs.push(path.dirname(argv1));let packageRoot=resolveNodeModulesBinPackageRoot(argv1);packageRoot&&dirs.push(packageRoot)}let proc=normalizeDir(process.cwd());return proc&&dirs.push(proc),Array.from(new Set(dirs))}async function readBranchName(runCommand,root,timeoutMs){let res=await runCommand([`git`,`-C`,root,`rev-parse`,`--abbrev-ref`,`HEAD`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?null:res.stdout.trim()||null}async function listGitTags(runCommand,root,timeoutMs,pattern=`v*`){let res=await runCommand([`git`,`-C`,root,`tag`,`--list`,pattern,`--sort=-v:refname`],{timeoutMs}).catch(()=>null);return!res||res.code!==0?[]:res.stdout.split(`
2
2
  `).map(line=>line.trim()).filter(Boolean)}async function resolveChannelTag(runCommand,root,timeoutMs,channel){let tags=await listGitTags(runCommand,root,timeoutMs);if(channel===`beta`){let betaTag=tags.find(tag=>isBetaTag(tag))??null,stableTag=tags.find(tag=>isStableTag(tag))??null;if(!betaTag)return stableTag;if(!stableTag)return betaTag;let cmp=compareSemverStrings(betaTag,stableTag);return cmp!=null&&cmp<0?stableTag:betaTag}return tags.find(tag=>isStableTag(tag))??null}async function resolveGitRoot(runCommand,candidates,timeoutMs){for(let dir of candidates){let res=await runCommand([`git`,`-C`,dir,`rev-parse`,`--show-toplevel`],{timeoutMs});if(res.code===0){let root=res.stdout.trim();if(root)return root}}return null}async function findPackageRoot(candidates){for(let dir of candidates){let current=dir;for(let i=0;i<12;i+=1){let pkgPath=path.join(current,`package.json`);try{let raw=await fs.readFile(pkgPath,`utf-8`),name=JSON.parse(raw)?.name?.trim();if(isCorePackageName(name))return current}catch{}let parent=path.dirname(current);if(parent===current)break;current=parent}}return null}async function detectPackageManager(root){return await detectPackageManager$1(root)??`npm`}async function runStep(opts){let{runCommand,name,argv,cwd,timeoutMs,env,progress,stepIndex,totalSteps}=opts,command=argv.join(` `),stepInfo={name,command,index:stepIndex,total:totalSteps};progress?.onStepStart?.(stepInfo);let started=Date.now(),result=await runCommand(argv,{cwd,timeoutMs,env}),durationMs=Date.now()-started,stderrTail=trimLogTail(result.stderr,MAX_LOG_CHARS);return progress?.onStepComplete?.({...stepInfo,durationMs,exitCode:result.code,stderrTail}),{name,command,cwd,durationMs,exitCode:result.code,stdoutTail:trimLogTail(result.stdout,MAX_LOG_CHARS),stderrTail:trimLogTail(result.stderr,MAX_LOG_CHARS)}}function managerScriptArgs(manager,script,args=[]){return manager===`pnpm`?[`pnpm`,script,...args]:manager===`bun`?[`bun`,`run`,script,...args]:args.length>0?[`npm`,`run`,script,`--`,...args]:[`npm`,`run`,script]}function managerInstallArgs(manager){return manager===`pnpm`?[`pnpm`,`install`]:manager===`bun`?[`bun`,`install`]:[`npm`,`install`]}function normalizeTag(tag){let trimmed=tag?.trim();return trimmed?stripPackagePrefix(trimmed):`latest`}async function runGatewayUpdate(opts={}){let startedAt=Date.now(),runCommand=opts.runCommand??(async(argv,options)=>{let res=await runCommandWithTimeout(argv,options);return{stdout:res.stdout,stderr:res.stderr,code:res.code}}),timeoutMs=opts.timeoutMs??12e5,progress=opts.progress,steps=[],candidates=buildStartDirs(opts),stepIndex=0,gitTotalSteps=0,step=(name,argv,cwd,env)=>{let currentIndex=stepIndex;return stepIndex+=1,{runCommand,name,argv,cwd,timeoutMs,env,progress,stepIndex:currentIndex,totalSteps:gitTotalSteps}},pkgRoot=await findPackageRoot(candidates),gitRoot=await resolveGitRoot(runCommand,candidates,timeoutMs);if(gitRoot&&pkgRoot&&path.resolve(gitRoot)!==path.resolve(pkgRoot)&&(gitRoot=null),gitRoot&&!pkgRoot)return{status:`error`,mode:`unknown`,root:gitRoot,reason:`not-builderforce-root`,steps:[],durationMs:Date.now()-startedAt};if(gitRoot&&pkgRoot&&path.resolve(gitRoot)===path.resolve(pkgRoot)){let beforeSha=(await runCommand([`git`,`-C`,gitRoot,`rev-parse`,`HEAD`],{cwd:gitRoot,timeoutMs})).stdout.trim()||null,beforeVersion=await readPackageVersion(gitRoot),channel=opts.channel??`dev`,branch=channel===`dev`?await readBranchName(runCommand,gitRoot,timeoutMs):null,needsCheckoutMain=channel===`dev`&&branch!==DEV_BRANCH;gitTotalSteps=channel===`dev`?needsCheckoutMain?11:10:9;let buildGitErrorResult=reason=>({status:`error`,mode:`git`,root:gitRoot,reason,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt}),runGitCheckoutOrFail=async(name,argv)=>{let checkoutStep=await runStep(step(name,argv,gitRoot));return steps.push(checkoutStep),checkoutStep.exitCode===0?null:buildGitErrorResult(`checkout-failed`)},statusCheck=await runStep(step(`clean check`,gitWorkingTreeStatusArgs(gitRoot),gitRoot));if(steps.push(statusCheck),statusCheck.stdoutTail&&statusCheck.stdoutTail.trim().length>0)return{status:`skipped`,mode:`git`,root:gitRoot,reason:`dirty`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};if(channel===`dev`){if(needsCheckoutMain){let failure=await runGitCheckoutOrFail(`git checkout ${DEV_BRANCH}`,[`git`,`-C`,gitRoot,`checkout`,DEV_BRANCH]);if(failure)return failure}let upstreamStep=await runStep(step(`upstream check`,[`git`,`-C`,gitRoot,`rev-parse`,`--abbrev-ref`,`--symbolic-full-name`,`@{upstream}`],gitRoot));if(steps.push(upstreamStep),upstreamStep.exitCode!==0)return{status:`skipped`,mode:`git`,root:gitRoot,reason:`no-upstream`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let fetchStep=await runStep(step(`git fetch`,[`git`,`-C`,gitRoot,`fetch`,`--all`,`--prune`,`--tags`],gitRoot));steps.push(fetchStep);let upstreamShaStep=await runStep(step(`git rev-parse @{upstream}`,[`git`,`-C`,gitRoot,`rev-parse`,`@{upstream}`],gitRoot));steps.push(upstreamShaStep);let upstreamSha=upstreamShaStep.stdoutTail?.trim();if(!upstreamShaStep.stdoutTail||!upstreamSha)return{status:`error`,mode:`git`,root:gitRoot,reason:`no-upstream-sha`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let revListStep=await runStep(step(`git rev-list`,[`git`,`-C`,gitRoot,`rev-list`,`--max-count=10`,upstreamSha],gitRoot));if(steps.push(revListStep),revListStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`preflight-revlist-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let candidates=(revListStep.stdoutTail??``).split(`
3
3
  `).map(line=>line.trim()).filter(Boolean);if(candidates.length===0)return{status:`error`,mode:`git`,root:gitRoot,reason:`preflight-no-candidates`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let manager=await detectPackageManager(gitRoot),preflightRoot=await fs.mkdtemp(path.join(os.tmpdir(),`builderforce-update-preflight-`)),worktreeDir=path.join(preflightRoot,`worktree`),worktreeStep=await runStep(step(`preflight worktree`,[`git`,`-C`,gitRoot,`worktree`,`add`,`--detach`,worktreeDir,upstreamSha],gitRoot));if(steps.push(worktreeStep),worktreeStep.exitCode!==0)return await fs.rm(preflightRoot,{recursive:!0,force:!0}).catch(()=>{}),{status:`error`,mode:`git`,root:gitRoot,reason:`preflight-worktree-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let selectedSha=null;try{for(let sha of candidates){let shortSha=sha.slice(0,8),checkoutStep=await runStep(step(`preflight checkout (${shortSha})`,[`git`,`-C`,worktreeDir,`checkout`,`--detach`,sha],worktreeDir));if(steps.push(checkoutStep),checkoutStep.exitCode!==0)continue;let depsStep=await runStep(step(`preflight deps install (${shortSha})`,managerInstallArgs(manager),worktreeDir));if(steps.push(depsStep),depsStep.exitCode!==0)continue;let buildStep=await runStep(step(`preflight build (${shortSha})`,managerScriptArgs(manager,`build`),worktreeDir));if(steps.push(buildStep),buildStep.exitCode!==0)continue;let lintStep=await runStep(step(`preflight lint (${shortSha})`,managerScriptArgs(manager,`lint`),worktreeDir));if(steps.push(lintStep),lintStep.exitCode===0){selectedSha=sha;break}}}finally{let removeStep=await runStep(step(`preflight cleanup`,[`git`,`-C`,gitRoot,`worktree`,`remove`,`--force`,worktreeDir],gitRoot));steps.push(removeStep),await runCommand([`git`,`-C`,gitRoot,`worktree`,`prune`],{cwd:gitRoot,timeoutMs}).catch(()=>null),await fs.rm(preflightRoot,{recursive:!0,force:!0}).catch(()=>{})}if(!selectedSha)return{status:`error`,mode:`git`,root:gitRoot,reason:`preflight-no-good-commit`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let rebaseStep=await runStep(step(`git rebase`,[`git`,`-C`,gitRoot,`rebase`,selectedSha],gitRoot));if(steps.push(rebaseStep),rebaseStep.exitCode!==0){let abortResult=await runCommand([`git`,`-C`,gitRoot,`rebase`,`--abort`],{cwd:gitRoot,timeoutMs});return steps.push({name:`git rebase --abort`,command:`git rebase --abort`,cwd:gitRoot,durationMs:0,exitCode:abortResult.code,stdoutTail:trimLogTail(abortResult.stdout,MAX_LOG_CHARS),stderrTail:trimLogTail(abortResult.stderr,MAX_LOG_CHARS)}),{status:`error`,mode:`git`,root:gitRoot,reason:`rebase-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt}}}else{let fetchStep=await runStep(step(`git fetch`,[`git`,`-C`,gitRoot,`fetch`,`--all`,`--prune`,`--tags`],gitRoot));if(steps.push(fetchStep),fetchStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`fetch-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let tag=await resolveChannelTag(runCommand,gitRoot,timeoutMs,channel);if(!tag)return{status:`error`,mode:`git`,root:gitRoot,reason:`no-release-tag`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let failure=await runGitCheckoutOrFail(`git checkout ${tag}`,[`git`,`-C`,gitRoot,`checkout`,`--detach`,tag]);if(failure)return failure}let manager=await detectPackageManager(gitRoot),depsStep=await runStep(step(`deps install`,managerInstallArgs(manager),gitRoot));if(steps.push(depsStep),depsStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`deps-install-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let buildStep=await runStep(step(`build`,managerScriptArgs(manager,`build`),gitRoot));if(steps.push(buildStep),buildStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`build-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let uiBuildStep=await runStep(step(`ui:build`,managerScriptArgs(manager,`ui:build`),gitRoot));if(steps.push(uiBuildStep),uiBuildStep.exitCode!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:`ui-build-failed`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let doctorEntry=path.join(gitRoot,`builderforce.mjs`);if(!await fs.stat(doctorEntry).then(()=>!0).catch(()=>!1))return steps.push({name:`builderforce doctor entry`,command:`verify ${doctorEntry}`,cwd:gitRoot,durationMs:0,exitCode:1,stderrTail:`missing ${doctorEntry}`}),{status:`error`,mode:`git`,root:gitRoot,reason:`doctor-entry-missing`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let doctorStep=await runStep(step(`builderforce doctor`,[process.execPath,doctorEntry,`doctor`,`--non-interactive`,`--fix`],gitRoot,{BUILDERFORCE_AGENTS_UPDATE_IN_PROGRESS:`1`}));if(steps.push(doctorStep),!(await resolveControlUiDistIndexHealth({root:gitRoot})).exists){let repairArgv=managerScriptArgs(manager,`ui:build`),started=Date.now(),repairResult=await runCommand(repairArgv,{cwd:gitRoot,timeoutMs}),repairStep={name:`ui:build (post-doctor repair)`,command:repairArgv.join(` `),cwd:gitRoot,durationMs:Date.now()-started,exitCode:repairResult.code,stdoutTail:trimLogTail(repairResult.stdout,MAX_LOG_CHARS),stderrTail:trimLogTail(repairResult.stderr,MAX_LOG_CHARS)};if(steps.push(repairStep),repairResult.code!==0)return{status:`error`,mode:`git`,root:gitRoot,reason:repairStep.name,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt};let repairedUiIndexHealth=await resolveControlUiDistIndexHealth({root:gitRoot});if(!repairedUiIndexHealth.exists){let uiIndexPath=repairedUiIndexHealth.indexPath??resolveControlUiDistIndexPathForRoot(gitRoot);return steps.push({name:`ui assets verify`,command:`verify ${uiIndexPath}`,cwd:gitRoot,durationMs:0,exitCode:1,stderrTail:`missing ${uiIndexPath}`}),{status:`error`,mode:`git`,root:gitRoot,reason:`ui-assets-missing`,before:{sha:beforeSha,version:beforeVersion},steps,durationMs:Date.now()-startedAt}}}let failedStep=steps.find(s=>s.exitCode!==0),afterShaStep=await runStep(step(`git rev-parse HEAD (after)`,[`git`,`-C`,gitRoot,`rev-parse`,`HEAD`],gitRoot));steps.push(afterShaStep);let afterVersion=await readPackageVersion(gitRoot);return{status:failedStep?`error`:`ok`,mode:`git`,root:gitRoot,reason:failedStep?failedStep.name:void 0,before:{sha:beforeSha,version:beforeVersion},after:{sha:afterShaStep.stdoutTail?.trim()??null,version:afterVersion},steps,durationMs:Date.now()-startedAt}}if(!pkgRoot)return{status:`error`,mode:`unknown`,reason:`no root (${START_DIRS.join(`,`)})`,steps:[],durationMs:Date.now()-startedAt};let beforeVersion=await readPackageVersion(pkgRoot),globalManager=await detectGlobalInstallManagerForRoot(runCommand,pkgRoot,timeoutMs);if(globalManager){let packageName=await readPackageName(pkgRoot)??CORE_PACKAGE_NAME;await cleanupGlobalRenameDirs({globalRoot:path.dirname(pkgRoot),packageName});let channel=opts.channel??DEFAULT_PACKAGE_CHANNEL,updateStep=await runStep({runCommand,name:`global update`,argv:globalInstallArgs(globalManager,`${packageName}@${normalizeTag(opts.tag??channelToNpmTag(channel))}`),cwd:pkgRoot,timeoutMs,progress,stepIndex:0,totalSteps:1}),steps=[updateStep],afterVersion=await readPackageVersion(pkgRoot);return{status:updateStep.exitCode===0?`ok`:`error`,mode:globalManager,root:pkgRoot,reason:updateStep.exitCode===0?void 0:updateStep.name,before:{version:beforeVersion},after:{version:afterVersion},steps,durationMs:Date.now()-startedAt}}return{status:`skipped`,mode:`unknown`,root:pkgRoot,reason:`not-git-install`,before:{version:beforeVersion},steps:[],durationMs:Date.now()-startedAt}}async function resolveAgentSessionDirs(stateDir){let agentsDir=path.join(stateDir,`agents`),entries=[];try{entries=await fs.readdir(agentsDir,{withFileTypes:!0})}catch(err){if(err.code===`ENOENT`)return[];throw err}return entries.filter(entry=>entry.isDirectory()).map(entry=>path.join(agentsDir,entry.name,`sessions`)).toSorted((a,b)=>a.localeCompare(b))}export{detectGlobalInstallManagerForRoot as a,readPackageName as c,detectGlobalInstallManagerByPresence as i,readPackageVersion as l,runGatewayUpdate as n,globalInstallArgs as o,cleanupGlobalRenameDirs as r,resolveGlobalPackageRoot as s,resolveAgentSessionDirs as t};
@@ -1 +1 @@
1
- import{Mt as loadBuilderForceAgentsPlugins,jt as createPluginLoaderLogger}from"./reply-D9wUWhMx.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{c as resolveAgentWorkspaceDir,k as resolveDefaultAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-DPtjOxzp.js";import{r as loadConfig}from"./io-BNtgT4VB.js";const log=createSubsystemLogger(`plugins`);function buildPluginStatusReport(params){let config=params?.config??loadConfig(),workspaceDir=params?.workspaceDir?params.workspaceDir:resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config))??resolveDefaultAgentWorkspaceDir();return{workspaceDir,...loadBuilderForceAgentsPlugins({config,workspaceDir,logger:createPluginLoaderLogger(log)})}}export{buildPluginStatusReport as t};
1
+ import{Mt as loadBuilderForceAgentsPlugins,jt as createPluginLoaderLogger}from"./reply-BuUSdq2L.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{c as resolveAgentWorkspaceDir,k as resolveDefaultAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-DPtjOxzp.js";import{r as loadConfig}from"./io-BNtgT4VB.js";const log=createSubsystemLogger(`plugins`);function buildPluginStatusReport(params){let config=params?.config??loadConfig(),workspaceDir=params?.workspaceDir?params.workspaceDir:resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config))??resolveDefaultAgentWorkspaceDir();return{workspaceDir,...loadBuilderForceAgentsPlugins({config,workspaceDir,logger:createPluginLoaderLogger(log)})}}export{buildPluginStatusReport as t};
@@ -1,4 +1,4 @@
1
- import{u as resolveGatewayPort}from"./paths-5FcIFMsj.js";import{B as theme,k as info,z as isRich}from"./utils-DbaBVFaK.js";import{A as classifySessionKey,Ht as getRemoteSkillEligibility,L as resolveSessionModelRef,c as buildChannelSummary,j as listAgentsForGateway,l as buildChannelAccountSnapshot,mi as peekSystemEvents,ni as lookupContextTokens,or as readRestartSentinel,sr as summarizeRestartSentinel,u as formatChannelAllowFrom,v as sha256HexPrefix}from"./reply-D9wUWhMx.js";import{C as parseAgentSessionKey}from"./session-key-EoB0qaG9.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{n as runExec}from"./exec-DdcIjeyn.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir}from"./agent-scope-DPtjOxzp.js";import{bn as DEFAULT_PROVIDER,m as resolveConfiguredModelRef,vn as DEFAULT_CONTEXT_TOKENS,yn as DEFAULT_MODEL}from"./model-selection-Doyvd4lU.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{U as VERSION,a as readConfigFileSnapshot,r as loadConfig}from"./io-BNtgT4VB.js";import{o as getTailnetHostname,s as readTailscaleStatusJson}from"./tailscale-DLkpGquM.js";import{a as inspectPortUsage,c as formatPortDiagnostics}from"./ports-DgmEDNOm.js";import{B as resolveMainSessionKey,I as resolveFreshSessionTotalTokens,a as loadSessionStore}from"./sessions-BPr0-lkT.js";import{n as listChannelPlugins}from"./plugins-D5zP6ENo.js";import{c as resolveStorePath}from"./paths-DJ6rztqJ.js";import{r as getMemorySearchManager}from"./memory-cli-D-Khe5Ij.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-CJq3iGqu.js";import{n as formatTimeAgo}from"./format-relative-niF9gXss.js";import{n as withProgress}from"./progress-BfOtdN6b.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import{C as normalizeControlUiBasePath,g as resolveControlUiLinks}from"./onboard-helpers-BmYUjl4j.js";import{n as formatUsageReportLines,t as loadProviderUsageSummary}from"./provider-usage-QGVVADJa.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-vWC0PU8J.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DTDCy17p.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-BlOu0Ul_.js";import{s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-D-NLDyK3.js";import{r as formatRuntimeStatusWithDetails,t as readLastGatewayErrorLine}from"./diagnostics-DCjg0nBH.js";import{t as renderTable}from"./table-BoCHYKoQ.js";import{a as resolveGatewayProbeAuth$1,c as probeGateway,t as runSecurityAudit}from"./audit-BVXqQAUR.js";import{a as resolveHeartbeatSummaryForAgent,t as formatHealthChannelLines}from"./health-AlkF1nUa.js";import{_ as resolveUpdateChannelDisplay,h as normalizeUpdateChannel,i as formatGitInstallLabel,t as checkUpdateStatus}from"./update-check-D6MvqVFE.js";import{t as resolveNodeService}from"./node-service-DZg9i98f.js";import{n as redactSecrets,t as formatGatewayAuthUsed}from"./format-DsPKebPn.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,r as getUpdateCheckResult,t as formatUpdateAvailableHint}from"./status.update-BAXc_gGe.js";import fs from"node:fs";import os from"node:os";import fs$1 from"node:fs/promises";import{spawnSync}from"node:child_process";function pickGatewaySelfPresence(presence){if(!Array.isArray(presence))return null;let entries=presence,self=entries.find(e=>e.mode===`gateway`&&e.reason===`self`)??entries.find(e=>typeof e.text==`string`&&String(e.text).startsWith(`Gateway:`))??null;return self?{host:typeof self.host==`string`?self.host:void 0,ip:typeof self.ip==`string`?self.ip:void 0,version:typeof self.version==`string`?self.version:void 0,platform:typeof self.platform==`string`?self.platform:void 0}:null}function resolveMemoryVectorState(vector){return vector.enabled?vector.available===!0?{tone:`ok`,state:`ready`}:vector.available===!1?{tone:`warn`,state:`unavailable`}:{tone:`muted`,state:`unknown`}:{tone:`muted`,state:`disabled`}}function resolveMemoryFtsState(fts){return fts.enabled?fts.available?{tone:`ok`,state:`ready`}:{tone:`warn`,state:`unavailable`}:{tone:`muted`,state:`disabled`}}function resolveMemoryCacheSummary(cache){return cache.enabled?{tone:`ok`,text:`cache on${typeof cache.entries==`number`?` (${cache.entries})`:``}`}:{tone:`muted`,text:`cache off`}}function safeTrim(value){return typeof value==`string`?value.trim():``}function macosVersion(){return safeTrim(spawnSync(`sw_vers`,[`-productVersion`],{encoding:`utf-8`}).stdout)||os.release()}function resolveOsSummary(){let platform=os.platform(),release=os.release(),arch=os.arch();return{platform,arch,release,label:platform===`darwin`?`macos ${macosVersion()} (${arch})`:platform===`win32`?`windows ${release} (${arch})`:`${platform} ${release} (${arch})`}}async function fileExists$1(p){try{return await fs$1.access(p),!0}catch{return!1}}async function getAgentLocalStatuses$1(cfg){let agentList=listAgentsForGateway(cfg),now=Date.now(),agents=await Promise.all(agentList.agents.map(async agent=>{let workspaceDir=(()=>{try{return resolveAgentWorkspaceDir(cfg,agent.id)}catch{return null}})(),bootstrapPending=workspaceDir==null?null:await fileExists$1(resolveWorkspaceFilePath(workspaceDir,`BOOTSTRAP.md`)),sessionsPath=resolveStorePath(cfg.session?.store,{agentId:agent.id}),store=(()=>{try{return loadSessionStore(sessionsPath)}catch{return{}}})(),updatedAt=Object.values(store).reduce((max,entry)=>Math.max(max,entry?.updatedAt??0),0),lastUpdatedAt=updatedAt>0?updatedAt:null,lastActiveAgeMs=lastUpdatedAt?now-lastUpdatedAt:null,sessionsCount=Object.keys(store).filter(k=>k!==`global`&&k!==`unknown`).length;return{id:agent.id,name:agent.name,workspaceDir,bootstrapPending,sessionsPath,sessionsCount,lastUpdatedAt,lastActiveAgeMs}})),totalSessions=agents.reduce((sum,a)=>sum+a.sessionsCount,0),bootstrapPendingCount=agents.reduce((sum,a)=>sum+(a.bootstrapPending?1:0),0);return{defaultId:agentList.defaultId,agents,totalSessions,bootstrapPendingCount}}const asRecord=value=>value&&typeof value==`object`?value:{};function summarizeSources(sources){let counts=new Map;for(let s of sources){let key=s?.trim()?s.trim():`unknown`;counts.set(key,(counts.get(key)??0)+1)}let parts=[...counts.entries()].toSorted((a,b)=>b[1]-a[1]).map(([key,n])=>`${key}${n>1?`×${n}`:``}`);return{label:parts.length>0?parts.join(`+`):`unknown`,parts}}function existsSyncMaybe(p){let path=p?.trim()||``;if(!path)return null;try{return fs.existsSync(path)}catch{return null}}function formatTokenHint(token,opts){let t=token.trim();if(!t)return`empty`;if(!opts.showSecrets)return`sha256:${sha256HexPrefix(t,8)} · len ${t.length}`;let head=t.slice(0,4),tail=t.slice(-4);return t.length<=10?`${t} · len ${t.length}`:`${head}…${tail} · len ${t.length}`}const formatAccountLabel=params=>{let base=params.accountId||`default`;return params.name?.trim()?`${base} (${params.name.trim()})`:base},resolveAccountEnabled=(plugin,account,cfg)=>plugin.config.isEnabled?plugin.config.isEnabled(account,cfg):asRecord(account).enabled!==!1,resolveAccountConfigured=async(plugin,account,cfg)=>plugin.config.isConfigured?await plugin.config.isConfigured(account,cfg):asRecord(account).configured!==!1,buildAccountNotes=params=>{let{plugin,cfg,entry}=params,notes=[],snapshot=entry.snapshot;snapshot.enabled===!1&&notes.push(`disabled`),snapshot.dmPolicy&&notes.push(`dm:${snapshot.dmPolicy}`),snapshot.tokenSource&&snapshot.tokenSource!==`none`&&notes.push(`token:${snapshot.tokenSource}`),snapshot.botTokenSource&&snapshot.botTokenSource!==`none`&&notes.push(`bot:${snapshot.botTokenSource}`),snapshot.appTokenSource&&snapshot.appTokenSource!==`none`&&notes.push(`app:${snapshot.appTokenSource}`),snapshot.baseUrl&&notes.push(snapshot.baseUrl),snapshot.port!=null&&notes.push(`port:${snapshot.port}`),snapshot.cliPath&&notes.push(`cli:${snapshot.cliPath}`),snapshot.dbPath&&notes.push(`db:${snapshot.dbPath}`);let allowFrom=plugin.config.resolveAllowFrom?.({cfg,accountId:snapshot.accountId})??snapshot.allowFrom;if(allowFrom?.length){let formatted=formatChannelAllowFrom({plugin,cfg,accountId:snapshot.accountId,allowFrom}).slice(0,3);formatted.length>0&&notes.push(`allow:${formatted.join(`,`)}`)}return notes};function resolveLinkFields(summary){let rec=asRecord(summary),linked=typeof rec.linked==`boolean`?rec.linked:null,authAgeMs=typeof rec.authAgeMs==`number`?rec.authAgeMs:null,self=asRecord(rec.self);return{linked,authAgeMs,selfE164:typeof self.e164==`string`&&self.e164.trim()?self.e164.trim():null}}function collectMissingPaths(accounts){let missing=[];for(let entry of accounts){let accountRec=asRecord(entry.account),snapshotRec=asRecord(entry.snapshot);for(let key of[`tokenFile`,`botTokenFile`,`appTokenFile`,`cliPath`,`dbPath`,`authDir`]){let raw=accountRec[key]??snapshotRec[key];existsSyncMaybe(raw)===!1&&missing.push(String(raw))}}return missing}function summarizeTokenConfig(params){let enabled=params.accounts.filter(a=>a.enabled);if(enabled.length===0)return{state:null,detail:null};let accountRecs=enabled.map(a=>asRecord(a.account)),hasBotTokenField=accountRecs.some(r=>`botToken`in r),hasAppTokenField=accountRecs.some(r=>`appToken`in r),hasTokenField=accountRecs.some(r=>`token`in r);if(!hasBotTokenField&&!hasAppTokenField&&!hasTokenField)return{state:null,detail:null};if(hasBotTokenField&&hasAppTokenField){let ready=enabled.filter(a=>{let rec=asRecord(a.account),bot=typeof rec.botToken==`string`?rec.botToken.trim():``,app=typeof rec.appToken==`string`?rec.appToken.trim():``;return!!bot&&!!app}),partial=enabled.filter(a=>{let rec=asRecord(a.account),bot=typeof rec.botToken==`string`?rec.botToken.trim():``,app=typeof rec.appToken==`string`?rec.appToken.trim():``,hasBot=!!bot,hasApp=!!app;return hasBot&&!hasApp||!hasBot&&hasApp});if(partial.length>0)return{state:`warn`,detail:`partial tokens (need bot+app) · accounts ${partial.length}`};if(ready.length===0)return{state:`setup`,detail:`no tokens (need bot+app)`};let botSources=summarizeSources(ready.map(a=>a.snapshot.botTokenSource??`none`)),appSources=summarizeSources(ready.map(a=>a.snapshot.appTokenSource??`none`)),sample=ready[0]?.account?asRecord(ready[0].account):{},botToken=typeof sample.botToken==`string`?sample.botToken:``,appToken=typeof sample.appToken==`string`?sample.appToken:``,botHint=botToken.trim()?formatTokenHint(botToken,{showSecrets:params.showSecrets}):``,appHint=appToken.trim()?formatTokenHint(appToken,{showSecrets:params.showSecrets}):``,hint=botHint||appHint?` (bot ${botHint||`?`}, app ${appHint||`?`})`:``;return{state:`ok`,detail:`tokens ok (bot ${botSources.label}, app ${appSources.label})${hint} · accounts ${ready.length}/${enabled.length||1}`}}if(hasBotTokenField){let ready=enabled.filter(a=>{let rec=asRecord(a.account);return!!(typeof rec.botToken==`string`&&rec.botToken.trim())});if(ready.length===0)return{state:`setup`,detail:`no bot token`};let sample=ready[0]?.account?asRecord(ready[0].account):{},botToken=typeof sample.botToken==`string`?sample.botToken:``,botHint=botToken.trim()?formatTokenHint(botToken,{showSecrets:params.showSecrets}):``;return{state:`ok`,detail:`bot token config${botHint?` (${botHint})`:``} · accounts ${ready.length}/${enabled.length||1}`}}let ready=enabled.filter(a=>{let rec=asRecord(a.account);return typeof rec.token==`string`?!!rec.token.trim():!1});if(ready.length===0)return{state:`setup`,detail:`no token`};let sources=summarizeSources(ready.map(a=>a.snapshot.tokenSource)),sample=ready[0]?.account?asRecord(ready[0].account):{},token=typeof sample.token==`string`?sample.token:``,hint=token.trim()?` (${formatTokenHint(token,{showSecrets:params.showSecrets})})`:``;return{state:`ok`,detail:`token ${sources.label}${hint} · accounts ${ready.length}/${enabled.length||1}`}}async function buildChannelsTable(cfg,opts){let showSecrets=opts?.showSecrets===!0,rows=[],details=[];for(let plugin of listChannelPlugins()){let accountIds=plugin.config.listAccountIds(cfg),defaultAccountId=resolveChannelDefaultAccountId({plugin,cfg,accountIds}),resolvedAccountIds=accountIds.length>0?accountIds:[defaultAccountId],accounts=[];for(let accountId of resolvedAccountIds){let account=plugin.config.resolveAccount(cfg,accountId),enabled=resolveAccountEnabled(plugin,account,cfg),configured=await resolveAccountConfigured(plugin,account,cfg),snapshot=buildChannelAccountSnapshot({plugin,cfg,accountId,account,enabled,configured});accounts.push({accountId,account,enabled,configured,snapshot})}let anyEnabled=accounts.some(a=>a.enabled),enabledAccounts=accounts.filter(a=>a.enabled),configuredAccounts=enabledAccounts.filter(a=>a.configured),defaultEntry=accounts.find(a=>a.accountId===defaultAccountId)??accounts[0],link=resolveLinkFields(plugin.status?.buildChannelSummary?await plugin.status.buildChannelSummary({account:defaultEntry?.account??{},cfg,defaultAccountId,snapshot:defaultEntry?.snapshot??{accountId:defaultAccountId}}):void 0),missingPaths=collectMissingPaths(enabledAccounts),tokenSummary=summarizeTokenConfig({plugin,cfg,accounts,showSecrets}),issues=plugin.status?.collectStatusIssues?plugin.status.collectStatusIssues(accounts.map(a=>a.snapshot)):[],label=plugin.meta.label??plugin.id,state=anyEnabled?missingPaths.length>0||issues.length>0?`warn`:link.linked===!1?`setup`:tokenSummary.state?tokenSummary.state:link.linked===!0||configuredAccounts.length>0?`ok`:`setup`:`off`,detail=(()=>{if(!anyEnabled)return defaultEntry?plugin.config.disabledReason?.(defaultEntry.account,cfg)??`disabled`:`disabled`;if(missingPaths.length>0)return`missing file (${missingPaths[0]})`;if(issues.length>0)return issues[0]?.message??`misconfigured`;if(link.linked!==null){let base=link.linked?`linked`:`not linked`,extra=[];return link.linked&&link.selfE164&&extra.push(link.selfE164),link.linked&&link.authAgeMs!=null&&link.authAgeMs>=0&&extra.push(`auth ${formatTimeAgo(link.authAgeMs)}`),(accounts.length>1||plugin.meta.forceAccountBinding)&&extra.push(`accounts ${accounts.length||1}`),extra.length>0?`${base} · ${extra.join(` · `)}`:base}if(tokenSummary.detail)return tokenSummary.detail;if(configuredAccounts.length>0){let head=`configured`;return accounts.length<=1&&!plugin.meta.forceAccountBinding?head:`${head} · accounts ${configuredAccounts.length}/${enabledAccounts.length||1}`}return(defaultEntry&&plugin.config.unconfiguredReason?plugin.config.unconfiguredReason(defaultEntry.account,cfg):null)??`not configured`})();rows.push({id:plugin.id,label,enabled:anyEnabled,state,detail}),configuredAccounts.length>0&&details.push({title:`${label} accounts`,columns:[`Account`,`Status`,`Notes`],rows:configuredAccounts.map(entry=>{let notes=buildAccountNotes({plugin,cfg,entry});return{Account:formatAccountLabel({accountId:entry.accountId,name:entry.snapshot.name}),Status:entry.enabled?`OK`:`WARN`,Notes:notes.join(` · `)}})})}return{rows,details}}async function readFileTailLines(filePath,maxLines){let raw=await fs$1.readFile(filePath,`utf8`).catch(()=>``);if(!raw.trim())return[];let lines=raw.replace(/\r/g,``).split(`
1
+ import{u as resolveGatewayPort}from"./paths-5FcIFMsj.js";import{B as theme,k as info,z as isRich}from"./utils-DbaBVFaK.js";import{A as classifySessionKey,Ht as getRemoteSkillEligibility,L as resolveSessionModelRef,c as buildChannelSummary,j as listAgentsForGateway,l as buildChannelAccountSnapshot,mi as peekSystemEvents,ni as lookupContextTokens,or as readRestartSentinel,sr as summarizeRestartSentinel,u as formatChannelAllowFrom,v as sha256HexPrefix}from"./reply-BuUSdq2L.js";import{C as parseAgentSessionKey}from"./session-key-EoB0qaG9.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{n as runExec}from"./exec-DdcIjeyn.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir}from"./agent-scope-DPtjOxzp.js";import{bn as DEFAULT_PROVIDER,m as resolveConfiguredModelRef,vn as DEFAULT_CONTEXT_TOKENS,yn as DEFAULT_MODEL}from"./model-selection-Doyvd4lU.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{U as VERSION,a as readConfigFileSnapshot,r as loadConfig}from"./io-BNtgT4VB.js";import{o as getTailnetHostname,s as readTailscaleStatusJson}from"./tailscale-DLkpGquM.js";import{a as inspectPortUsage,c as formatPortDiagnostics}from"./ports-DgmEDNOm.js";import{B as resolveMainSessionKey,I as resolveFreshSessionTotalTokens,a as loadSessionStore}from"./sessions-BPr0-lkT.js";import{n as listChannelPlugins}from"./plugins-D5zP6ENo.js";import{c as resolveStorePath}from"./paths-DJ6rztqJ.js";import{r as getMemorySearchManager}from"./memory-cli-D-Khe5Ij.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-CJq3iGqu.js";import{n as formatTimeAgo}from"./format-relative-niF9gXss.js";import{n as withProgress}from"./progress-BfOtdN6b.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import{C as normalizeControlUiBasePath,g as resolveControlUiLinks}from"./onboard-helpers-BmYUjl4j.js";import{n as formatUsageReportLines,t as loadProviderUsageSummary}from"./provider-usage-QGVVADJa.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-vWC0PU8J.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DTDCy17p.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-BlOu0Ul_.js";import{s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-D-NLDyK3.js";import{r as formatRuntimeStatusWithDetails,t as readLastGatewayErrorLine}from"./diagnostics-DCjg0nBH.js";import{t as renderTable}from"./table-BoCHYKoQ.js";import{a as resolveGatewayProbeAuth$1,c as probeGateway,t as runSecurityAudit}from"./audit-BVXqQAUR.js";import{a as resolveHeartbeatSummaryForAgent,t as formatHealthChannelLines}from"./health-CFVx21sO.js";import{_ as resolveUpdateChannelDisplay,h as normalizeUpdateChannel,i as formatGitInstallLabel,t as checkUpdateStatus}from"./update-check-D6MvqVFE.js";import{t as resolveNodeService}from"./node-service-DZg9i98f.js";import{n as redactSecrets,t as formatGatewayAuthUsed}from"./format-DsPKebPn.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,r as getUpdateCheckResult,t as formatUpdateAvailableHint}from"./status.update-BAXc_gGe.js";import fs from"node:fs";import os from"node:os";import fs$1 from"node:fs/promises";import{spawnSync}from"node:child_process";function pickGatewaySelfPresence(presence){if(!Array.isArray(presence))return null;let entries=presence,self=entries.find(e=>e.mode===`gateway`&&e.reason===`self`)??entries.find(e=>typeof e.text==`string`&&String(e.text).startsWith(`Gateway:`))??null;return self?{host:typeof self.host==`string`?self.host:void 0,ip:typeof self.ip==`string`?self.ip:void 0,version:typeof self.version==`string`?self.version:void 0,platform:typeof self.platform==`string`?self.platform:void 0}:null}function resolveMemoryVectorState(vector){return vector.enabled?vector.available===!0?{tone:`ok`,state:`ready`}:vector.available===!1?{tone:`warn`,state:`unavailable`}:{tone:`muted`,state:`unknown`}:{tone:`muted`,state:`disabled`}}function resolveMemoryFtsState(fts){return fts.enabled?fts.available?{tone:`ok`,state:`ready`}:{tone:`warn`,state:`unavailable`}:{tone:`muted`,state:`disabled`}}function resolveMemoryCacheSummary(cache){return cache.enabled?{tone:`ok`,text:`cache on${typeof cache.entries==`number`?` (${cache.entries})`:``}`}:{tone:`muted`,text:`cache off`}}function safeTrim(value){return typeof value==`string`?value.trim():``}function macosVersion(){return safeTrim(spawnSync(`sw_vers`,[`-productVersion`],{encoding:`utf-8`}).stdout)||os.release()}function resolveOsSummary(){let platform=os.platform(),release=os.release(),arch=os.arch();return{platform,arch,release,label:platform===`darwin`?`macos ${macosVersion()} (${arch})`:platform===`win32`?`windows ${release} (${arch})`:`${platform} ${release} (${arch})`}}async function fileExists$1(p){try{return await fs$1.access(p),!0}catch{return!1}}async function getAgentLocalStatuses$1(cfg){let agentList=listAgentsForGateway(cfg),now=Date.now(),agents=await Promise.all(agentList.agents.map(async agent=>{let workspaceDir=(()=>{try{return resolveAgentWorkspaceDir(cfg,agent.id)}catch{return null}})(),bootstrapPending=workspaceDir==null?null:await fileExists$1(resolveWorkspaceFilePath(workspaceDir,`BOOTSTRAP.md`)),sessionsPath=resolveStorePath(cfg.session?.store,{agentId:agent.id}),store=(()=>{try{return loadSessionStore(sessionsPath)}catch{return{}}})(),updatedAt=Object.values(store).reduce((max,entry)=>Math.max(max,entry?.updatedAt??0),0),lastUpdatedAt=updatedAt>0?updatedAt:null,lastActiveAgeMs=lastUpdatedAt?now-lastUpdatedAt:null,sessionsCount=Object.keys(store).filter(k=>k!==`global`&&k!==`unknown`).length;return{id:agent.id,name:agent.name,workspaceDir,bootstrapPending,sessionsPath,sessionsCount,lastUpdatedAt,lastActiveAgeMs}})),totalSessions=agents.reduce((sum,a)=>sum+a.sessionsCount,0),bootstrapPendingCount=agents.reduce((sum,a)=>sum+(a.bootstrapPending?1:0),0);return{defaultId:agentList.defaultId,agents,totalSessions,bootstrapPendingCount}}const asRecord=value=>value&&typeof value==`object`?value:{};function summarizeSources(sources){let counts=new Map;for(let s of sources){let key=s?.trim()?s.trim():`unknown`;counts.set(key,(counts.get(key)??0)+1)}let parts=[...counts.entries()].toSorted((a,b)=>b[1]-a[1]).map(([key,n])=>`${key}${n>1?`×${n}`:``}`);return{label:parts.length>0?parts.join(`+`):`unknown`,parts}}function existsSyncMaybe(p){let path=p?.trim()||``;if(!path)return null;try{return fs.existsSync(path)}catch{return null}}function formatTokenHint(token,opts){let t=token.trim();if(!t)return`empty`;if(!opts.showSecrets)return`sha256:${sha256HexPrefix(t,8)} · len ${t.length}`;let head=t.slice(0,4),tail=t.slice(-4);return t.length<=10?`${t} · len ${t.length}`:`${head}…${tail} · len ${t.length}`}const formatAccountLabel=params=>{let base=params.accountId||`default`;return params.name?.trim()?`${base} (${params.name.trim()})`:base},resolveAccountEnabled=(plugin,account,cfg)=>plugin.config.isEnabled?plugin.config.isEnabled(account,cfg):asRecord(account).enabled!==!1,resolveAccountConfigured=async(plugin,account,cfg)=>plugin.config.isConfigured?await plugin.config.isConfigured(account,cfg):asRecord(account).configured!==!1,buildAccountNotes=params=>{let{plugin,cfg,entry}=params,notes=[],snapshot=entry.snapshot;snapshot.enabled===!1&&notes.push(`disabled`),snapshot.dmPolicy&&notes.push(`dm:${snapshot.dmPolicy}`),snapshot.tokenSource&&snapshot.tokenSource!==`none`&&notes.push(`token:${snapshot.tokenSource}`),snapshot.botTokenSource&&snapshot.botTokenSource!==`none`&&notes.push(`bot:${snapshot.botTokenSource}`),snapshot.appTokenSource&&snapshot.appTokenSource!==`none`&&notes.push(`app:${snapshot.appTokenSource}`),snapshot.baseUrl&&notes.push(snapshot.baseUrl),snapshot.port!=null&&notes.push(`port:${snapshot.port}`),snapshot.cliPath&&notes.push(`cli:${snapshot.cliPath}`),snapshot.dbPath&&notes.push(`db:${snapshot.dbPath}`);let allowFrom=plugin.config.resolveAllowFrom?.({cfg,accountId:snapshot.accountId})??snapshot.allowFrom;if(allowFrom?.length){let formatted=formatChannelAllowFrom({plugin,cfg,accountId:snapshot.accountId,allowFrom}).slice(0,3);formatted.length>0&&notes.push(`allow:${formatted.join(`,`)}`)}return notes};function resolveLinkFields(summary){let rec=asRecord(summary),linked=typeof rec.linked==`boolean`?rec.linked:null,authAgeMs=typeof rec.authAgeMs==`number`?rec.authAgeMs:null,self=asRecord(rec.self);return{linked,authAgeMs,selfE164:typeof self.e164==`string`&&self.e164.trim()?self.e164.trim():null}}function collectMissingPaths(accounts){let missing=[];for(let entry of accounts){let accountRec=asRecord(entry.account),snapshotRec=asRecord(entry.snapshot);for(let key of[`tokenFile`,`botTokenFile`,`appTokenFile`,`cliPath`,`dbPath`,`authDir`]){let raw=accountRec[key]??snapshotRec[key];existsSyncMaybe(raw)===!1&&missing.push(String(raw))}}return missing}function summarizeTokenConfig(params){let enabled=params.accounts.filter(a=>a.enabled);if(enabled.length===0)return{state:null,detail:null};let accountRecs=enabled.map(a=>asRecord(a.account)),hasBotTokenField=accountRecs.some(r=>`botToken`in r),hasAppTokenField=accountRecs.some(r=>`appToken`in r),hasTokenField=accountRecs.some(r=>`token`in r);if(!hasBotTokenField&&!hasAppTokenField&&!hasTokenField)return{state:null,detail:null};if(hasBotTokenField&&hasAppTokenField){let ready=enabled.filter(a=>{let rec=asRecord(a.account),bot=typeof rec.botToken==`string`?rec.botToken.trim():``,app=typeof rec.appToken==`string`?rec.appToken.trim():``;return!!bot&&!!app}),partial=enabled.filter(a=>{let rec=asRecord(a.account),bot=typeof rec.botToken==`string`?rec.botToken.trim():``,app=typeof rec.appToken==`string`?rec.appToken.trim():``,hasBot=!!bot,hasApp=!!app;return hasBot&&!hasApp||!hasBot&&hasApp});if(partial.length>0)return{state:`warn`,detail:`partial tokens (need bot+app) · accounts ${partial.length}`};if(ready.length===0)return{state:`setup`,detail:`no tokens (need bot+app)`};let botSources=summarizeSources(ready.map(a=>a.snapshot.botTokenSource??`none`)),appSources=summarizeSources(ready.map(a=>a.snapshot.appTokenSource??`none`)),sample=ready[0]?.account?asRecord(ready[0].account):{},botToken=typeof sample.botToken==`string`?sample.botToken:``,appToken=typeof sample.appToken==`string`?sample.appToken:``,botHint=botToken.trim()?formatTokenHint(botToken,{showSecrets:params.showSecrets}):``,appHint=appToken.trim()?formatTokenHint(appToken,{showSecrets:params.showSecrets}):``,hint=botHint||appHint?` (bot ${botHint||`?`}, app ${appHint||`?`})`:``;return{state:`ok`,detail:`tokens ok (bot ${botSources.label}, app ${appSources.label})${hint} · accounts ${ready.length}/${enabled.length||1}`}}if(hasBotTokenField){let ready=enabled.filter(a=>{let rec=asRecord(a.account);return!!(typeof rec.botToken==`string`&&rec.botToken.trim())});if(ready.length===0)return{state:`setup`,detail:`no bot token`};let sample=ready[0]?.account?asRecord(ready[0].account):{},botToken=typeof sample.botToken==`string`?sample.botToken:``,botHint=botToken.trim()?formatTokenHint(botToken,{showSecrets:params.showSecrets}):``;return{state:`ok`,detail:`bot token config${botHint?` (${botHint})`:``} · accounts ${ready.length}/${enabled.length||1}`}}let ready=enabled.filter(a=>{let rec=asRecord(a.account);return typeof rec.token==`string`?!!rec.token.trim():!1});if(ready.length===0)return{state:`setup`,detail:`no token`};let sources=summarizeSources(ready.map(a=>a.snapshot.tokenSource)),sample=ready[0]?.account?asRecord(ready[0].account):{},token=typeof sample.token==`string`?sample.token:``,hint=token.trim()?` (${formatTokenHint(token,{showSecrets:params.showSecrets})})`:``;return{state:`ok`,detail:`token ${sources.label}${hint} · accounts ${ready.length}/${enabled.length||1}`}}async function buildChannelsTable(cfg,opts){let showSecrets=opts?.showSecrets===!0,rows=[],details=[];for(let plugin of listChannelPlugins()){let accountIds=plugin.config.listAccountIds(cfg),defaultAccountId=resolveChannelDefaultAccountId({plugin,cfg,accountIds}),resolvedAccountIds=accountIds.length>0?accountIds:[defaultAccountId],accounts=[];for(let accountId of resolvedAccountIds){let account=plugin.config.resolveAccount(cfg,accountId),enabled=resolveAccountEnabled(plugin,account,cfg),configured=await resolveAccountConfigured(plugin,account,cfg),snapshot=buildChannelAccountSnapshot({plugin,cfg,accountId,account,enabled,configured});accounts.push({accountId,account,enabled,configured,snapshot})}let anyEnabled=accounts.some(a=>a.enabled),enabledAccounts=accounts.filter(a=>a.enabled),configuredAccounts=enabledAccounts.filter(a=>a.configured),defaultEntry=accounts.find(a=>a.accountId===defaultAccountId)??accounts[0],link=resolveLinkFields(plugin.status?.buildChannelSummary?await plugin.status.buildChannelSummary({account:defaultEntry?.account??{},cfg,defaultAccountId,snapshot:defaultEntry?.snapshot??{accountId:defaultAccountId}}):void 0),missingPaths=collectMissingPaths(enabledAccounts),tokenSummary=summarizeTokenConfig({plugin,cfg,accounts,showSecrets}),issues=plugin.status?.collectStatusIssues?plugin.status.collectStatusIssues(accounts.map(a=>a.snapshot)):[],label=plugin.meta.label??plugin.id,state=anyEnabled?missingPaths.length>0||issues.length>0?`warn`:link.linked===!1?`setup`:tokenSummary.state?tokenSummary.state:link.linked===!0||configuredAccounts.length>0?`ok`:`setup`:`off`,detail=(()=>{if(!anyEnabled)return defaultEntry?plugin.config.disabledReason?.(defaultEntry.account,cfg)??`disabled`:`disabled`;if(missingPaths.length>0)return`missing file (${missingPaths[0]})`;if(issues.length>0)return issues[0]?.message??`misconfigured`;if(link.linked!==null){let base=link.linked?`linked`:`not linked`,extra=[];return link.linked&&link.selfE164&&extra.push(link.selfE164),link.linked&&link.authAgeMs!=null&&link.authAgeMs>=0&&extra.push(`auth ${formatTimeAgo(link.authAgeMs)}`),(accounts.length>1||plugin.meta.forceAccountBinding)&&extra.push(`accounts ${accounts.length||1}`),extra.length>0?`${base} · ${extra.join(` · `)}`:base}if(tokenSummary.detail)return tokenSummary.detail;if(configuredAccounts.length>0){let head=`configured`;return accounts.length<=1&&!plugin.meta.forceAccountBinding?head:`${head} · accounts ${configuredAccounts.length}/${enabledAccounts.length||1}`}return(defaultEntry&&plugin.config.unconfiguredReason?plugin.config.unconfiguredReason(defaultEntry.account,cfg):null)??`not configured`})();rows.push({id:plugin.id,label,enabled:anyEnabled,state,detail}),configuredAccounts.length>0&&details.push({title:`${label} accounts`,columns:[`Account`,`Status`,`Notes`],rows:configuredAccounts.map(entry=>{let notes=buildAccountNotes({plugin,cfg,entry});return{Account:formatAccountLabel({accountId:entry.accountId,name:entry.snapshot.name}),Status:entry.enabled?`OK`:`WARN`,Notes:notes.join(` · `)}})})}return{rows,details}}async function readFileTailLines(filePath,maxLines){let raw=await fs$1.readFile(filePath,`utf8`).catch(()=>``);if(!raw.trim())return[];let lines=raw.replace(/\r/g,``).split(`
2
2
  `);return lines.slice(Math.max(0,lines.length-maxLines)).map(line=>line.trimEnd()).filter(line=>line.trim().length>0)}function countMatches(haystack,needle){return!haystack||!needle?0:haystack.split(needle).length-1}function shorten(message,maxLen){let cleaned=message.replace(/\s+/g,` `).trim();return cleaned.length<=maxLen?cleaned:`${cleaned.slice(0,Math.max(0,maxLen-1))}…`}function normalizeGwsLine(line){return line.replace(/\s+runId=[^\s]+/g,``).replace(/\s+conn=[^\s]+/g,``).replace(/\s+id=[^\s]+/g,``).replace(/\s+error=Error:.*$/g,``).trim()}function consumeJsonBlock(lines,startIndex){let startLine=lines[startIndex]??``,braceAt=startLine.indexOf(`{`);if(braceAt<0)return null;let parts=[startLine.slice(braceAt)],depth=countMatches(parts[0]??``,`{`)-countMatches(parts[0]??``,`}`),i=startIndex;for(;depth>0&&i+1<lines.length;){i+=1;let next=lines[i]??``;parts.push(next),depth+=countMatches(next,`{`)-countMatches(next,`}`)}return{json:parts.join(`
3
3
  `),endIndex:i}}function summarizeLogTail(rawLines,opts){let maxLines=Math.max(6,opts?.maxLines??26),out=[],groups=new Map,addGroup=(key,base)=>{let existing=groups.get(key);if(existing){existing.count+=1;return}groups.set(key,{count:1,index:out.length,base}),out.push(base)},addLine=line=>{let trimmed=line.trimEnd();trimmed&&out.push(trimmed)},lines=rawLines.map(line=>line.trimEnd()).filter(Boolean);for(let i=0;i<lines.length;i+=1){let line=lines[i]??``,trimmedStart=line.trimStart();if((trimmedStart.startsWith(`"`)||trimmedStart===`}`||trimmedStart===`{`||trimmedStart.startsWith(`}`)||trimmedStart.startsWith(`{`))&&!trimmedStart.startsWith(`[`)&&!trimmedStart.startsWith(`#`))continue;let tokenRefresh=line.match(/^\[([^\]]+)\]\s+Token refresh failed:\s*(\d+)\s*(\{)?\s*$/);if(tokenRefresh){let tag=tokenRefresh[1]??`unknown`,status=tokenRefresh[2]??`unknown`,block=consumeJsonBlock(lines,i);if(block){i=block.endIndex;let parsed=(()=>{try{return JSON.parse(block.json)}catch{return null}})(),code=parsed?.error?.code?.trim()||null,msg=parsed?.error?.message?.trim()||null,msgShort=msg?msg.toLowerCase().includes(`signing in again`)?`re-auth required`:shorten(msg,52):null,base=`[${tag}] token refresh ${status}${code?` ${code}`:``}${msgShort?` · ${msgShort}`:``}`;addGroup(`token:${tag}:${status}:${code??``}:${msgShort??``}`,base);continue}}let embedded=line.match(/^Embedded agent failed before reply:\s+OAuth token refresh failed for ([^:]+):/);if(embedded){let provider=embedded[1]?.trim()||`unknown`;addGroup(`embedded:${provider}`,`Embedded agent: OAuth token refresh failed (${provider})`);continue}if(line.startsWith(`[gws]`)&&line.includes(`errorCode=UNAVAILABLE`)&&line.includes(`OAuth token refresh failed`)){let normalized=normalizeGwsLine(line);addGroup(`gws:${normalized}`,normalized);continue}addLine(line)}for(let g of groups.values())g.count<=1||(out[g.index]=`${g.base} ×${g.count}`);let deduped=[];for(let line of out)deduped[deduped.length-1]!==line&&deduped.push(line);if(deduped.length<=maxLines)return deduped;let head=Math.min(6,Math.floor(maxLines/3)),tail=Math.max(1,maxLines-head-1);return[...deduped.slice(0,head),`… ${deduped.length-head-tail} lines omitted …`,...deduped.slice(-tail)]}async function appendStatusAllDiagnosis(params){let{lines,muted,ok,warn,fail}=params,emitCheck=(label,status)=>{let icon=status===`ok`?ok(`✓`):status===`warn`?warn(`!`):fail(`✗`),colored=status===`ok`?ok(label):status===`warn`?warn(label):fail(label);lines.push(`${icon} ${colored}`)};lines.push(``),lines.push(muted(`Gateway connection details:`));for(let line of redactSecrets(params.connectionDetailsForReport).split(`
4
4
  `).map(l=>l.trimEnd()))lines.push(` ${muted(line)}`);if(lines.push(``),params.snap){let status=params.snap.exists?params.snap.valid?`ok`:`warn`:`fail`;emitCheck(`Config: ${params.snap.path??`(unknown)`}`,status);let issues=[...params.snap.legacyIssues??[],...params.snap.issues??[]],uniqueIssues=issues.filter((issue,index)=>issues.findIndex(x=>x.path===issue.path&&x.message===issue.message)===index);for(let issue of uniqueIssues.slice(0,12))lines.push(` - ${issue.path}: ${issue.message}`);uniqueIssues.length>12&&lines.push(` ${muted(`… +${uniqueIssues.length-12} more`)}`)}else emitCheck(`Config: read failed`,`warn`);params.remoteUrlMissing&&(lines.push(``),emitCheck(`Gateway remote mode misconfigured (gateway.remote.url missing)`,`warn`),lines.push(` ${muted(`Fix: set gateway.remote.url, or set gateway.mode=local.`)}`)),params.sentinel?.payload?(emitCheck(`Restart sentinel present`,`warn`),lines.push(` ${muted(`${summarizeRestartSentinel(params.sentinel.payload)} · ${formatTimeAgo(Date.now()-params.sentinel.payload.ts)}`)}`)):emitCheck(`Restart sentinel: none`,`ok`);let lastErrClean=params.lastErr?.trim()??``,isTrivialLastErr=lastErrClean.length<8||lastErrClean===`}`||lastErrClean===`{`;if(lastErrClean&&!isTrivialLastErr&&(lines.push(``),lines.push(muted(`Gateway last log line:`)),lines.push(` ${muted(redactSecrets(lastErrClean))}`)),params.portUsage){let portOk=params.portUsage.listeners.length===0;if(emitCheck(`Port ${params.port}`,portOk?`ok`:`warn`),!portOk)for(let line of formatPortDiagnostics(params.portUsage))lines.push(` ${muted(line)}`)}{let backend=params.tailscale.backendState??`unknown`,okBackend=backend===`Running`,hasDns=!!params.tailscale.dnsName;emitCheck(params.tailscaleMode===`off`?`Tailscale: off · ${backend}${params.tailscale.dnsName?` · ${params.tailscale.dnsName}`:``}`:`Tailscale: ${params.tailscaleMode} · ${backend}${params.tailscale.dnsName?` · ${params.tailscale.dnsName}`:``}`,okBackend&&(params.tailscaleMode===`off`||hasDns)?`ok`:`warn`),params.tailscale.error&&lines.push(` ${muted(`error: ${params.tailscale.error}`)}`),params.tailscale.ips.length>0&&lines.push(` ${muted(`ips: ${params.tailscale.ips.slice(0,3).join(`, `)}${params.tailscale.ips.length>3?`…`:``}`)}`),params.tailscaleHttpsUrl&&lines.push(` ${muted(`https: ${params.tailscaleHttpsUrl}`)}`)}if(params.skillStatus){let eligible=params.skillStatus.skills.filter(s=>s.eligible).length,missing=params.skillStatus.skills.filter(s=>s.eligible&&Object.values(s.missing).some(arr=>arr.length)).length;emitCheck(`Skills: ${eligible} eligible · ${missing} missing · ${params.skillStatus.workspaceDir}`,missing===0?`ok`:`warn`)}params.progress.setLabel(`Reading logs…`);let logPaths=(()=>{try{return resolveGatewayLogPaths(process.env)}catch{return null}})();if(logPaths){params.progress.setLabel(`Reading logs…`);let[stderrTail,stdoutTail]=await Promise.all([readFileTailLines(logPaths.stderrPath,40).catch(()=>[]),readFileTailLines(logPaths.stdoutPath,40).catch(()=>[])]);if(stderrTail.length>0||stdoutTail.length>0){lines.push(``),lines.push(muted(`Gateway logs (tail, summarized): ${logPaths.logDir}`)),lines.push(` ${muted(`# stderr: ${logPaths.stderrPath}`)}`);for(let line of summarizeLogTail(stderrTail,{maxLines:22}).map(redactSecrets))lines.push(` ${muted(line)}`);lines.push(` ${muted(`# stdout: ${logPaths.stdoutPath}`)}`);for(let line of summarizeLogTail(stdoutTail,{maxLines:22}).map(redactSecrets))lines.push(` ${muted(line)}`)}}if(params.progress.tick(),params.channelsStatus){emitCheck(`Channel issues (${params.channelIssues.length||`none`})`,params.channelIssues.length===0?`ok`:`warn`);for(let issue of params.channelIssues.slice(0,12)){let fixText=issue.fix?` · fix: ${issue.fix}`:``;lines.push(` - ${issue.channel}[${issue.accountId}] ${issue.kind}: ${issue.message}${fixText}`)}params.channelIssues.length>12&&lines.push(` ${muted(`… +${params.channelIssues.length-12} more`)}`)}else emitCheck(`Channel issues skipped (gateway ${params.gatewayReachable?`query failed`:`unreachable`})`,`warn`);let healthErr=(()=>{if(!params.health||typeof params.health!=`object`)return``;let record=params.health;if(!(`error`in record))return``;let value=record.error;if(!value)return``;if(typeof value==`string`)return value;try{return JSON.stringify(value,null,2)}catch{return`[unserializable error]`}})();healthErr&&(lines.push(``),lines.push(muted(`Gateway health:`)),lines.push(` ${muted(redactSecrets(healthErr))}`)),lines.push(``),lines.push(muted(`Pasteable debug report. Auth tokens redacted.`)),lines.push(`Troubleshooting: https://docs.builderforce.ai/troubleshooting`),lines.push(``)}async function buildStatusAllReportLines(params){let rich=isRich(),heading=text=>rich?theme.heading(text):text,ok=text=>rich?theme.success(text):text,warn=text=>rich?theme.warn(text):text,fail=text=>rich?theme.error(text):text,muted=text=>rich?theme.muted(text):text,tableWidth=Math.max(60,(process.stdout.columns??120)-1),overview=renderTable({width:tableWidth,columns:[{key:`Item`,header:`Item`,minWidth:10},{key:`Value`,header:`Value`,flex:!0,minWidth:24}],rows:params.overviewRows}),channelRows=params.channels.rows.map(row=>({channelId:row.id,Channel:row.label,Enabled:row.enabled?ok(`ON`):muted(`OFF`),State:row.state===`ok`?ok(`OK`):row.state===`warn`?warn(`WARN`):row.state===`off`?muted(`OFF`):theme.accentDim(`SETUP`),Detail:row.detail})),channelIssuesByChannel=(()=>{let map=new Map;for(let issue of params.channelIssues){let key=issue.channel,list=map.get(key);list?list.push(issue):map.set(key,[issue])}return map})(),channelsTable=renderTable({width:tableWidth,columns:[{key:`Channel`,header:`Channel`,minWidth:10},{key:`Enabled`,header:`Enabled`,minWidth:7},{key:`State`,header:`State`,minWidth:8},{key:`Detail`,header:`Detail`,flex:!0,minWidth:28}],rows:channelRows.map(row=>{let issues=channelIssuesByChannel.get(row.channelId)??[];if(issues.length===0)return row;let issue=issues[0],suffix=` · ${warn(`gateway: ${String(issue.message).slice(0,90)}`)}`;return{...row,State:warn(`WARN`),Detail:`${row.Detail}${suffix}`}})}),agentsTable=renderTable({width:tableWidth,columns:[{key:`Agent`,header:`Agent`,minWidth:12},{key:`Bootstrap`,header:`Bootstrap`,minWidth:10},{key:`Sessions`,header:`Sessions`,align:`right`,minWidth:8},{key:`Active`,header:`Active`,minWidth:10},{key:`Store`,header:`Store`,flex:!0,minWidth:34}],rows:params.agentStatus.agents.map(a=>({Agent:a.name?.trim()?`${a.id} (${a.name.trim()})`:a.id,Bootstrap:a.bootstrapPending===!0?warn(`PENDING`):a.bootstrapPending===!1?ok(`OK`):`unknown`,Sessions:String(a.sessionsCount),Active:a.lastActiveAgeMs==null?`unknown`:formatTimeAgo(a.lastActiveAgeMs),Store:a.sessionsPath}))}),lines=[];lines.push(heading(`BuilderForceAgents status --all`)),lines.push(``),lines.push(heading(`Overview`)),lines.push(overview.trimEnd()),lines.push(``),lines.push(heading(`Channels`)),lines.push(channelsTable.trimEnd());for(let detail of params.channels.details)lines.push(``),lines.push(heading(detail.title)),lines.push(renderTable({width:tableWidth,columns:detail.columns.map(c=>({key:c,header:c,flex:c===`Notes`,minWidth:c===`Notes`?28:10})),rows:detail.rows.map(r=>({...r,...r.Status===`OK`?{Status:ok(`OK`)}:r.Status===`WARN`?{Status:warn(`WARN`)}:{}}))}).trimEnd());return lines.push(``),lines.push(heading(`Agents`)),lines.push(agentsTable.trimEnd()),lines.push(``),lines.push(heading(`Diagnosis (read-only)`)),await appendStatusAllDiagnosis({lines,progress:params.progress,muted,ok,warn,fail,connectionDetailsForReport:params.connectionDetailsForReport,...params.diagnosis}),lines}async function statusAllCommand(runtime,opts){await withProgress({label:`Scanning status --all…`,total:11},async progress=>{progress.setLabel(`Loading config…`);let cfg=loadConfig(),osSummary=resolveOsSummary(),snap=await readConfigFileSnapshot().catch(()=>null);progress.tick(),progress.setLabel(`Checking Tailscale…`);let tailscaleMode=cfg.gateway?.tailscale?.mode??`off`,tailscale=await(async()=>{try{let parsed=await readTailscaleStatusJson(runExec,{timeoutMs:1200}),backendState=typeof parsed.BackendState==`string`?parsed.BackendState:null,self=typeof parsed.Self==`object`&&parsed.Self!==null?parsed.Self:null,dnsNameRaw=self&&typeof self.DNSName==`string`?self.DNSName:null;return{ok:!0,backendState,dnsName:dnsNameRaw?dnsNameRaw.replace(/\.$/,``):null,ips:self&&Array.isArray(self.TailscaleIPs)?self.TailscaleIPs.filter(v=>typeof v==`string`&&v.trim().length>0).map(v=>v.trim()):[],error:null}}catch(err){return{ok:!1,backendState:null,dnsName:null,ips:[],error:String(err)}}})(),tailscaleHttpsUrl=tailscaleMode!==`off`&&tailscale.dnsName?`https://${tailscale.dnsName}${normalizeControlUiBasePath(cfg.gateway?.controlUi?.basePath)}`:null;progress.tick(),progress.setLabel(`Checking for updates…`);let update=await checkUpdateStatus({root:await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()}),timeoutMs:6500,fetchGit:!0,includeRegistry:!0}),channelLabel=resolveUpdateChannelDisplay({configChannel:normalizeUpdateChannel(cfg.update?.channel),installKind:update.installKind,gitTag:update.git?.tag??null,gitBranch:update.git?.branch??null}).label,gitLabel=formatGitInstallLabel(update);progress.tick(),progress.setLabel(`Probing gateway…`);let connection=buildGatewayConnectionDetails({config:cfg}),isRemoteMode=cfg.gateway?.mode===`remote`,remoteUrlRaw=typeof cfg.gateway?.remote?.url==`string`?cfg.gateway.remote.url.trim():``,remoteUrlMissing=isRemoteMode&&!remoteUrlRaw,gatewayMode=isRemoteMode?`remote`:`local`,localFallbackAuth=resolveGatewayProbeAuth$1({cfg,mode:`local`}),remoteAuth=resolveGatewayProbeAuth$1({cfg,mode:`remote`}),probeAuth=isRemoteMode&&!remoteUrlMissing?remoteAuth:localFallbackAuth,gatewayProbe=await probeGateway({url:connection.url,auth:probeAuth,timeoutMs:Math.min(5e3,opts?.timeoutMs??1e4)}).catch(()=>null),gatewayReachable=gatewayProbe?.ok===!0,gatewaySelf=pickGatewaySelfPresence(gatewayProbe?.presence??null);progress.tick(),progress.setLabel(`Checking services…`);let readServiceSummary=async service=>{try{let[loaded,runtimeInfo,command]=await Promise.all([service.isLoaded({env:process.env}).catch(()=>!1),service.readRuntime(process.env).catch(()=>void 0),service.readCommand(process.env).catch(()=>null)]),installed=command!=null;return{label:service.label,installed,loaded,loadedText:loaded?service.loadedText:service.notLoadedText,runtime:runtimeInfo}}catch{return null}},daemon=await readServiceSummary(resolveGatewayService()),nodeService=await readServiceSummary(resolveNodeService());progress.tick(),progress.setLabel(`Scanning agents…`);let agentStatus=await getAgentLocalStatuses$1(cfg);progress.tick(),progress.setLabel(`Summarizing channels…`);let channels=await buildChannelsTable(cfg,{showSecrets:!1});progress.tick();let connectionDetailsForReport=(()=>{if(!remoteUrlMissing)return connection.message;let bindMode=cfg.gateway?.bind??`loopback`;return[`Gateway mode: remote`,`Gateway target: (missing gateway.remote.url)`,`Config: ${snap?.path?.trim()?snap.path.trim():`(unknown config path)`}`,`Bind: ${bindMode}`,`Local fallback (used for probes): ${connection.url}`,`Fix: set gateway.remote.url, or set gateway.mode=local.`].join(`
@@ -1 +1 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-CuAFgjuQ.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-C8c9naq-.js";import"./io-CsCa3_1Z.js";import"./manifest-registry-009gLJ4l.js";import"./config-DmxNxDRW.js";import"./model-discovery-RTHjxEvZ.js";import"./model-catalog-D8OQ7p7I.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./skills-status-CGlKz1D1.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-O-iC_P5t.js";import"./message-channel-z5YRpR2d.js";import"./subagent-registry-Cj5yC7B4.js";import"./sessions-CmJXMlLP.js";import"./project-context-store-BNXYrLJz.js";import"./tokens-CFKkpUIu.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-CGcNbbV7.js";import"./send-DPRTlcZh.js";import"./with-timeout-CBXVw0An.js";import"./deliver--eLCRJc2.js";import"./accounts-Cx82nj4E.js";import"./send-DfHAMPcD.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-BZGiFZlP.js";import"./sandbox-C-Owvt1-.js";import"./chrome-BfwLDcFc.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-BjYYSEVE.js";import"./routes-Dnfsevhw.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./workspace-waBqRxiy.js";import"./reply-prefix-Cg7AqaK0.js";import"./sqlite-CIGM1WKg.js";import"./memory-cli-CiwWAhp5.js";import"./manager-Bjb9ptCz.js";import"./gemini-auth-KBXMhaRQ.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import"./runner-DwPaM8kz.js";import"./tool-display-Cs4hDP1f.js";import"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-tquUDu_7.js";import"./session-utils-D2_j4c6U.js";import"./coding-tools.policy-BwdtwuXY.js";import"./pairing-store-BCsvhT6-.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-DsI3qJRy.js";import"./send-BOSlm5fG.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-BdK18hVI.js";import"./control-service-Ca0CBlhO.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-BOBan2eG.js";import"./resolve-route-DEIW5uKy.js";import"./channel-activity-DX36RadH.js";import"./tables-CojSfTth.js";import"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DATdLu15.js";import"./onboard-helpers-D2vxAtv8.js";import"./prompt-style-BMWmaqSC.js";import"./pairing-labels-BUXpRejW.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-DJt_RpLC.js";import"./transformers-stream-Buj40qHl.js";import"./dangerous-tools-C0tOMmbD.js";import"./helpers-DPPVplyk.js";import"./skill-scanner-C2gXLVti.js";import"./channels-status-issues-NLYb8w9i.js";import"./runtime-guard-Bi8k55v9.js";import"./systemd-DdVd5Yet.js";import"./service-EKJG69M3.js";import"./diagnostics-DamNPi4e.js";import"./table-BFCCZDsp.js";import"./audit-zevg85TO.js";import{t as statusCommand}from"./status-BhJw9Htq.js";import"./health-Cf1YoTRN.js";import"./update-check-B0YqSZJr.js";import"./dm-policy-shared-DT6DrqEe.js";import"./node-service-77UF0ACm.js";import"./status.update-DpTbmpkA.js";export{statusCommand};
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-CuAFgjuQ.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-C8c9naq-.js";import"./io-CsCa3_1Z.js";import"./manifest-registry-009gLJ4l.js";import"./config-DmxNxDRW.js";import"./model-discovery-RTHjxEvZ.js";import"./model-catalog-D8OQ7p7I.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./skills-status-CGlKz1D1.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-O-iC_P5t.js";import"./message-channel-z5YRpR2d.js";import"./subagent-registry-m_x-JRkR.js";import"./sessions-CmJXMlLP.js";import"./project-context-store-BNXYrLJz.js";import"./tokens-CFKkpUIu.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-CGcNbbV7.js";import"./send-DPRTlcZh.js";import"./with-timeout-CBXVw0An.js";import"./deliver--eLCRJc2.js";import"./accounts-Cx82nj4E.js";import"./send-DfHAMPcD.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-BZGiFZlP.js";import"./sandbox-C-Owvt1-.js";import"./chrome-BfwLDcFc.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-BjYYSEVE.js";import"./routes-Dnfsevhw.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./workspace-waBqRxiy.js";import"./reply-prefix-Cg7AqaK0.js";import"./sqlite-CIGM1WKg.js";import"./memory-cli-CiwWAhp5.js";import"./manager-Bjb9ptCz.js";import"./gemini-auth-KBXMhaRQ.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import"./runner-DwPaM8kz.js";import"./tool-display-Cs4hDP1f.js";import"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-tquUDu_7.js";import"./session-utils-D2_j4c6U.js";import"./coding-tools.policy-BwdtwuXY.js";import"./pairing-store-BCsvhT6-.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-DsI3qJRy.js";import"./send-BOSlm5fG.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-BdK18hVI.js";import"./control-service-Ca0CBlhO.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-BOBan2eG.js";import"./resolve-route-DEIW5uKy.js";import"./channel-activity-DX36RadH.js";import"./tables-CojSfTth.js";import"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DATdLu15.js";import"./onboard-helpers-D2vxAtv8.js";import"./prompt-style-BMWmaqSC.js";import"./pairing-labels-BUXpRejW.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-DJt_RpLC.js";import"./transformers-stream-Buj40qHl.js";import"./dangerous-tools-C0tOMmbD.js";import"./helpers-DPPVplyk.js";import"./skill-scanner-C2gXLVti.js";import"./channels-status-issues-NLYb8w9i.js";import"./runtime-guard-Bi8k55v9.js";import"./systemd-DdVd5Yet.js";import"./service-EKJG69M3.js";import"./diagnostics-DamNPi4e.js";import"./table-BFCCZDsp.js";import"./audit-zevg85TO.js";import{t as statusCommand}from"./status-oaiZkYBt.js";import"./health-CEz2-7et.js";import"./update-check-B0YqSZJr.js";import"./dm-policy-shared-DT6DrqEe.js";import"./node-service-77UF0ACm.js";import"./status.update-DpTbmpkA.js";export{statusCommand};
@@ -1 +1 @@
1
- import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{c as resolveAgentWorkspaceDir,k as resolveDefaultAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-CufEmNj_.js";import{r as loadConfig}from"./io-CsCa3_1Z.js";import{C as createPluginLoaderLogger,w as loadBuilderForceAgentsPlugins}from"./subagent-registry-Cj5yC7B4.js";const log=createSubsystemLogger(`plugins`);function buildPluginStatusReport(params){let config=params?.config??loadConfig(),workspaceDir=params?.workspaceDir?params.workspaceDir:resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config))??resolveDefaultAgentWorkspaceDir();return{workspaceDir,...loadBuilderForceAgentsPlugins({config,workspaceDir,logger:createPluginLoaderLogger(log)})}}export{buildPluginStatusReport as t};
1
+ import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{c as resolveAgentWorkspaceDir,k as resolveDefaultAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-CufEmNj_.js";import{r as loadConfig}from"./io-CsCa3_1Z.js";import{C as createPluginLoaderLogger,w as loadBuilderForceAgentsPlugins}from"./subagent-registry-m_x-JRkR.js";const log=createSubsystemLogger(`plugins`);function buildPluginStatusReport(params){let config=params?.config??loadConfig(),workspaceDir=params?.workspaceDir?params.workspaceDir:resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config))??resolveDefaultAgentWorkspaceDir();return{workspaceDir,...loadBuilderForceAgentsPlugins({config,workspaceDir,logger:createPluginLoaderLogger(log)})}}export{buildPluginStatusReport as t};
@@ -1,4 +1,4 @@
1
- import{u as resolveGatewayPort}from"./paths-BHg-VHB4.js";import{O as info,R as isRich,z as theme}from"./utils-BP60e80M.js";import{H as resolveConfiguredModelRef,_n as DEFAULT_PROVIDER,gn as DEFAULT_MODEL,hn as DEFAULT_CONTEXT_TOKENS}from"./auth-profiles-CuAFgjuQ.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{C as parseAgentSessionKey}from"./session-key-CksCYipj.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{n as runExec}from"./exec-COgsU9ql.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir}from"./agent-scope-CufEmNj_.js";import{U as VERSION,a as readConfigFileSnapshot,r as loadConfig}from"./io-CsCa3_1Z.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-CGlKz1D1.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-O-iC_P5t.js";import{Bn as peekSystemEvents,X as sha256HexPrefix,br as summarizeRestartSentinel,cn as getRemoteSkillEligibility,en as buildChannelSummary,nn as formatChannelAllowFrom,tn as buildChannelAccountSnapshot,yr as readRestartSentinel}from"./subagent-registry-Cj5yC7B4.js";import{N as resolveMainSessionKey,a as loadSessionStore,k as resolveFreshSessionTotalTokens}from"./sessions-CmJXMlLP.js";import{n as listChannelPlugins}from"./plugins-1Mn6RiNf.js";import{o as getTailnetHostname,s as readTailscaleStatusJson}from"./tailscale-DV-yOmYe.js";import{a as formatPortDiagnostics,n as inspectPortUsage}from"./ports-DTku9NSx.js";import{c as resolveStorePath}from"./paths-ClsbsPQP.js";import{r as getMemorySearchManager}from"./memory-cli-CiwWAhp5.js";import{n as formatTimeAgo}from"./format-relative-CruqE52s.js";import{l as resolveSessionModelRef,n as classifySessionKey,r as listAgentsForGateway,u as lookupContextTokens}from"./session-utils-D2_j4c6U.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import{n as formatUsageReportLines,t as loadProviderUsageSummary}from"./provider-usage-DsI3qJRy.js";import{n as withProgress}from"./progress-Cqb-jAjT.js";import{C as normalizeControlUiBasePath,g as resolveControlUiLinks}from"./onboard-helpers-D2vxAtv8.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DPPVplyk.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-NLYb8w9i.js";import{s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-EKJG69M3.js";import{r as formatRuntimeStatusWithDetails,t as readLastGatewayErrorLine}from"./diagnostics-DamNPi4e.js";import{t as renderTable}from"./table-BFCCZDsp.js";import{a as resolveGatewayProbeAuth$1,c as probeGateway,t as runSecurityAudit}from"./audit-zevg85TO.js";import{a as resolveHeartbeatSummaryForAgent,t as formatHealthChannelLines}from"./health-Cf1YoTRN.js";import{_ as resolveUpdateChannelDisplay,h as normalizeUpdateChannel,i as formatGitInstallLabel,t as checkUpdateStatus}from"./update-check-B0YqSZJr.js";import{t as resolveNodeService}from"./node-service-77UF0ACm.js";import{n as redactSecrets,t as formatGatewayAuthUsed}from"./format-BYLQK2kz.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,r as getUpdateCheckResult,t as formatUpdateAvailableHint}from"./status.update-DpTbmpkA.js";import{spawnSync}from"node:child_process";import os from"node:os";import fs from"node:fs";import fs$1 from"node:fs/promises";function pickGatewaySelfPresence(presence){if(!Array.isArray(presence))return null;let entries=presence,self=entries.find(e=>e.mode===`gateway`&&e.reason===`self`)??entries.find(e=>typeof e.text==`string`&&String(e.text).startsWith(`Gateway:`))??null;return self?{host:typeof self.host==`string`?self.host:void 0,ip:typeof self.ip==`string`?self.ip:void 0,version:typeof self.version==`string`?self.version:void 0,platform:typeof self.platform==`string`?self.platform:void 0}:null}function resolveMemoryVectorState(vector){return vector.enabled?vector.available===!0?{tone:`ok`,state:`ready`}:vector.available===!1?{tone:`warn`,state:`unavailable`}:{tone:`muted`,state:`unknown`}:{tone:`muted`,state:`disabled`}}function resolveMemoryFtsState(fts){return fts.enabled?fts.available?{tone:`ok`,state:`ready`}:{tone:`warn`,state:`unavailable`}:{tone:`muted`,state:`disabled`}}function resolveMemoryCacheSummary(cache){return cache.enabled?{tone:`ok`,text:`cache on${typeof cache.entries==`number`?` (${cache.entries})`:``}`}:{tone:`muted`,text:`cache off`}}function safeTrim(value){return typeof value==`string`?value.trim():``}function macosVersion(){return safeTrim(spawnSync(`sw_vers`,[`-productVersion`],{encoding:`utf-8`}).stdout)||os.release()}function resolveOsSummary(){let platform=os.platform(),release=os.release(),arch=os.arch();return{platform,arch,release,label:platform===`darwin`?`macos ${macosVersion()} (${arch})`:platform===`win32`?`windows ${release} (${arch})`:`${platform} ${release} (${arch})`}}async function fileExists$1(p){try{return await fs$1.access(p),!0}catch{return!1}}async function getAgentLocalStatuses$1(cfg){let agentList=listAgentsForGateway(cfg),now=Date.now(),agents=await Promise.all(agentList.agents.map(async agent=>{let workspaceDir=(()=>{try{return resolveAgentWorkspaceDir(cfg,agent.id)}catch{return null}})(),bootstrapPending=workspaceDir==null?null:await fileExists$1(resolveWorkspaceFilePath(workspaceDir,`BOOTSTRAP.md`)),sessionsPath=resolveStorePath(cfg.session?.store,{agentId:agent.id}),store=(()=>{try{return loadSessionStore(sessionsPath)}catch{return{}}})(),updatedAt=Object.values(store).reduce((max,entry)=>Math.max(max,entry?.updatedAt??0),0),lastUpdatedAt=updatedAt>0?updatedAt:null,lastActiveAgeMs=lastUpdatedAt?now-lastUpdatedAt:null,sessionsCount=Object.keys(store).filter(k=>k!==`global`&&k!==`unknown`).length;return{id:agent.id,name:agent.name,workspaceDir,bootstrapPending,sessionsPath,sessionsCount,lastUpdatedAt,lastActiveAgeMs}})),totalSessions=agents.reduce((sum,a)=>sum+a.sessionsCount,0),bootstrapPendingCount=agents.reduce((sum,a)=>sum+(a.bootstrapPending?1:0),0);return{defaultId:agentList.defaultId,agents,totalSessions,bootstrapPendingCount}}const asRecord=value=>value&&typeof value==`object`?value:{};function summarizeSources(sources){let counts=new Map;for(let s of sources){let key=s?.trim()?s.trim():`unknown`;counts.set(key,(counts.get(key)??0)+1)}let parts=[...counts.entries()].toSorted((a,b)=>b[1]-a[1]).map(([key,n])=>`${key}${n>1?`×${n}`:``}`);return{label:parts.length>0?parts.join(`+`):`unknown`,parts}}function existsSyncMaybe(p){let path=p?.trim()||``;if(!path)return null;try{return fs.existsSync(path)}catch{return null}}function formatTokenHint(token,opts){let t=token.trim();if(!t)return`empty`;if(!opts.showSecrets)return`sha256:${sha256HexPrefix(t,8)} · len ${t.length}`;let head=t.slice(0,4),tail=t.slice(-4);return t.length<=10?`${t} · len ${t.length}`:`${head}…${tail} · len ${t.length}`}const formatAccountLabel=params=>{let base=params.accountId||`default`;return params.name?.trim()?`${base} (${params.name.trim()})`:base},resolveAccountEnabled=(plugin,account,cfg)=>plugin.config.isEnabled?plugin.config.isEnabled(account,cfg):asRecord(account).enabled!==!1,resolveAccountConfigured=async(plugin,account,cfg)=>plugin.config.isConfigured?await plugin.config.isConfigured(account,cfg):asRecord(account).configured!==!1,buildAccountNotes=params=>{let{plugin,cfg,entry}=params,notes=[],snapshot=entry.snapshot;snapshot.enabled===!1&&notes.push(`disabled`),snapshot.dmPolicy&&notes.push(`dm:${snapshot.dmPolicy}`),snapshot.tokenSource&&snapshot.tokenSource!==`none`&&notes.push(`token:${snapshot.tokenSource}`),snapshot.botTokenSource&&snapshot.botTokenSource!==`none`&&notes.push(`bot:${snapshot.botTokenSource}`),snapshot.appTokenSource&&snapshot.appTokenSource!==`none`&&notes.push(`app:${snapshot.appTokenSource}`),snapshot.baseUrl&&notes.push(snapshot.baseUrl),snapshot.port!=null&&notes.push(`port:${snapshot.port}`),snapshot.cliPath&&notes.push(`cli:${snapshot.cliPath}`),snapshot.dbPath&&notes.push(`db:${snapshot.dbPath}`);let allowFrom=plugin.config.resolveAllowFrom?.({cfg,accountId:snapshot.accountId})??snapshot.allowFrom;if(allowFrom?.length){let formatted=formatChannelAllowFrom({plugin,cfg,accountId:snapshot.accountId,allowFrom}).slice(0,3);formatted.length>0&&notes.push(`allow:${formatted.join(`,`)}`)}return notes};function resolveLinkFields(summary){let rec=asRecord(summary),linked=typeof rec.linked==`boolean`?rec.linked:null,authAgeMs=typeof rec.authAgeMs==`number`?rec.authAgeMs:null,self=asRecord(rec.self);return{linked,authAgeMs,selfE164:typeof self.e164==`string`&&self.e164.trim()?self.e164.trim():null}}function collectMissingPaths(accounts){let missing=[];for(let entry of accounts){let accountRec=asRecord(entry.account),snapshotRec=asRecord(entry.snapshot);for(let key of[`tokenFile`,`botTokenFile`,`appTokenFile`,`cliPath`,`dbPath`,`authDir`]){let raw=accountRec[key]??snapshotRec[key];existsSyncMaybe(raw)===!1&&missing.push(String(raw))}}return missing}function summarizeTokenConfig(params){let enabled=params.accounts.filter(a=>a.enabled);if(enabled.length===0)return{state:null,detail:null};let accountRecs=enabled.map(a=>asRecord(a.account)),hasBotTokenField=accountRecs.some(r=>`botToken`in r),hasAppTokenField=accountRecs.some(r=>`appToken`in r),hasTokenField=accountRecs.some(r=>`token`in r);if(!hasBotTokenField&&!hasAppTokenField&&!hasTokenField)return{state:null,detail:null};if(hasBotTokenField&&hasAppTokenField){let ready=enabled.filter(a=>{let rec=asRecord(a.account),bot=typeof rec.botToken==`string`?rec.botToken.trim():``,app=typeof rec.appToken==`string`?rec.appToken.trim():``;return!!bot&&!!app}),partial=enabled.filter(a=>{let rec=asRecord(a.account),bot=typeof rec.botToken==`string`?rec.botToken.trim():``,app=typeof rec.appToken==`string`?rec.appToken.trim():``,hasBot=!!bot,hasApp=!!app;return hasBot&&!hasApp||!hasBot&&hasApp});if(partial.length>0)return{state:`warn`,detail:`partial tokens (need bot+app) · accounts ${partial.length}`};if(ready.length===0)return{state:`setup`,detail:`no tokens (need bot+app)`};let botSources=summarizeSources(ready.map(a=>a.snapshot.botTokenSource??`none`)),appSources=summarizeSources(ready.map(a=>a.snapshot.appTokenSource??`none`)),sample=ready[0]?.account?asRecord(ready[0].account):{},botToken=typeof sample.botToken==`string`?sample.botToken:``,appToken=typeof sample.appToken==`string`?sample.appToken:``,botHint=botToken.trim()?formatTokenHint(botToken,{showSecrets:params.showSecrets}):``,appHint=appToken.trim()?formatTokenHint(appToken,{showSecrets:params.showSecrets}):``,hint=botHint||appHint?` (bot ${botHint||`?`}, app ${appHint||`?`})`:``;return{state:`ok`,detail:`tokens ok (bot ${botSources.label}, app ${appSources.label})${hint} · accounts ${ready.length}/${enabled.length||1}`}}if(hasBotTokenField){let ready=enabled.filter(a=>{let rec=asRecord(a.account);return!!(typeof rec.botToken==`string`&&rec.botToken.trim())});if(ready.length===0)return{state:`setup`,detail:`no bot token`};let sample=ready[0]?.account?asRecord(ready[0].account):{},botToken=typeof sample.botToken==`string`?sample.botToken:``,botHint=botToken.trim()?formatTokenHint(botToken,{showSecrets:params.showSecrets}):``;return{state:`ok`,detail:`bot token config${botHint?` (${botHint})`:``} · accounts ${ready.length}/${enabled.length||1}`}}let ready=enabled.filter(a=>{let rec=asRecord(a.account);return typeof rec.token==`string`?!!rec.token.trim():!1});if(ready.length===0)return{state:`setup`,detail:`no token`};let sources=summarizeSources(ready.map(a=>a.snapshot.tokenSource)),sample=ready[0]?.account?asRecord(ready[0].account):{},token=typeof sample.token==`string`?sample.token:``,hint=token.trim()?` (${formatTokenHint(token,{showSecrets:params.showSecrets})})`:``;return{state:`ok`,detail:`token ${sources.label}${hint} · accounts ${ready.length}/${enabled.length||1}`}}async function buildChannelsTable(cfg,opts){let showSecrets=opts?.showSecrets===!0,rows=[],details=[];for(let plugin of listChannelPlugins()){let accountIds=plugin.config.listAccountIds(cfg),defaultAccountId=resolveChannelDefaultAccountId({plugin,cfg,accountIds}),resolvedAccountIds=accountIds.length>0?accountIds:[defaultAccountId],accounts=[];for(let accountId of resolvedAccountIds){let account=plugin.config.resolveAccount(cfg,accountId),enabled=resolveAccountEnabled(plugin,account,cfg),configured=await resolveAccountConfigured(plugin,account,cfg),snapshot=buildChannelAccountSnapshot({plugin,cfg,accountId,account,enabled,configured});accounts.push({accountId,account,enabled,configured,snapshot})}let anyEnabled=accounts.some(a=>a.enabled),enabledAccounts=accounts.filter(a=>a.enabled),configuredAccounts=enabledAccounts.filter(a=>a.configured),defaultEntry=accounts.find(a=>a.accountId===defaultAccountId)??accounts[0],link=resolveLinkFields(plugin.status?.buildChannelSummary?await plugin.status.buildChannelSummary({account:defaultEntry?.account??{},cfg,defaultAccountId,snapshot:defaultEntry?.snapshot??{accountId:defaultAccountId}}):void 0),missingPaths=collectMissingPaths(enabledAccounts),tokenSummary=summarizeTokenConfig({plugin,cfg,accounts,showSecrets}),issues=plugin.status?.collectStatusIssues?plugin.status.collectStatusIssues(accounts.map(a=>a.snapshot)):[],label=plugin.meta.label??plugin.id,state=anyEnabled?missingPaths.length>0||issues.length>0?`warn`:link.linked===!1?`setup`:tokenSummary.state?tokenSummary.state:link.linked===!0||configuredAccounts.length>0?`ok`:`setup`:`off`,detail=(()=>{if(!anyEnabled)return defaultEntry?plugin.config.disabledReason?.(defaultEntry.account,cfg)??`disabled`:`disabled`;if(missingPaths.length>0)return`missing file (${missingPaths[0]})`;if(issues.length>0)return issues[0]?.message??`misconfigured`;if(link.linked!==null){let base=link.linked?`linked`:`not linked`,extra=[];return link.linked&&link.selfE164&&extra.push(link.selfE164),link.linked&&link.authAgeMs!=null&&link.authAgeMs>=0&&extra.push(`auth ${formatTimeAgo(link.authAgeMs)}`),(accounts.length>1||plugin.meta.forceAccountBinding)&&extra.push(`accounts ${accounts.length||1}`),extra.length>0?`${base} · ${extra.join(` · `)}`:base}if(tokenSummary.detail)return tokenSummary.detail;if(configuredAccounts.length>0){let head=`configured`;return accounts.length<=1&&!plugin.meta.forceAccountBinding?head:`${head} · accounts ${configuredAccounts.length}/${enabledAccounts.length||1}`}return(defaultEntry&&plugin.config.unconfiguredReason?plugin.config.unconfiguredReason(defaultEntry.account,cfg):null)??`not configured`})();rows.push({id:plugin.id,label,enabled:anyEnabled,state,detail}),configuredAccounts.length>0&&details.push({title:`${label} accounts`,columns:[`Account`,`Status`,`Notes`],rows:configuredAccounts.map(entry=>{let notes=buildAccountNotes({plugin,cfg,entry});return{Account:formatAccountLabel({accountId:entry.accountId,name:entry.snapshot.name}),Status:entry.enabled?`OK`:`WARN`,Notes:notes.join(` · `)}})})}return{rows,details}}async function readFileTailLines(filePath,maxLines){let raw=await fs$1.readFile(filePath,`utf8`).catch(()=>``);if(!raw.trim())return[];let lines=raw.replace(/\r/g,``).split(`
1
+ import{u as resolveGatewayPort}from"./paths-BHg-VHB4.js";import{O as info,R as isRich,z as theme}from"./utils-BP60e80M.js";import{H as resolveConfiguredModelRef,_n as DEFAULT_PROVIDER,gn as DEFAULT_MODEL,hn as DEFAULT_CONTEXT_TOKENS}from"./auth-profiles-CuAFgjuQ.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{C as parseAgentSessionKey}from"./session-key-CksCYipj.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{n as runExec}from"./exec-COgsU9ql.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir}from"./agent-scope-CufEmNj_.js";import{U as VERSION,a as readConfigFileSnapshot,r as loadConfig}from"./io-CsCa3_1Z.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-CGlKz1D1.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-O-iC_P5t.js";import{Bn as peekSystemEvents,X as sha256HexPrefix,br as summarizeRestartSentinel,cn as getRemoteSkillEligibility,en as buildChannelSummary,nn as formatChannelAllowFrom,tn as buildChannelAccountSnapshot,yr as readRestartSentinel}from"./subagent-registry-m_x-JRkR.js";import{N as resolveMainSessionKey,a as loadSessionStore,k as resolveFreshSessionTotalTokens}from"./sessions-CmJXMlLP.js";import{n as listChannelPlugins}from"./plugins-1Mn6RiNf.js";import{o as getTailnetHostname,s as readTailscaleStatusJson}from"./tailscale-DV-yOmYe.js";import{a as formatPortDiagnostics,n as inspectPortUsage}from"./ports-DTku9NSx.js";import{c as resolveStorePath}from"./paths-ClsbsPQP.js";import{r as getMemorySearchManager}from"./memory-cli-CiwWAhp5.js";import{n as formatTimeAgo}from"./format-relative-CruqE52s.js";import{l as resolveSessionModelRef,n as classifySessionKey,r as listAgentsForGateway,u as lookupContextTokens}from"./session-utils-D2_j4c6U.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import{n as formatUsageReportLines,t as loadProviderUsageSummary}from"./provider-usage-DsI3qJRy.js";import{n as withProgress}from"./progress-Cqb-jAjT.js";import{C as normalizeControlUiBasePath,g as resolveControlUiLinks}from"./onboard-helpers-D2vxAtv8.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DPPVplyk.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-NLYb8w9i.js";import{s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-EKJG69M3.js";import{r as formatRuntimeStatusWithDetails,t as readLastGatewayErrorLine}from"./diagnostics-DamNPi4e.js";import{t as renderTable}from"./table-BFCCZDsp.js";import{a as resolveGatewayProbeAuth$1,c as probeGateway,t as runSecurityAudit}from"./audit-zevg85TO.js";import{a as resolveHeartbeatSummaryForAgent,t as formatHealthChannelLines}from"./health-CEz2-7et.js";import{_ as resolveUpdateChannelDisplay,h as normalizeUpdateChannel,i as formatGitInstallLabel,t as checkUpdateStatus}from"./update-check-B0YqSZJr.js";import{t as resolveNodeService}from"./node-service-77UF0ACm.js";import{n as redactSecrets,t as formatGatewayAuthUsed}from"./format-BYLQK2kz.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,r as getUpdateCheckResult,t as formatUpdateAvailableHint}from"./status.update-DpTbmpkA.js";import{spawnSync}from"node:child_process";import os from"node:os";import fs from"node:fs";import fs$1 from"node:fs/promises";function pickGatewaySelfPresence(presence){if(!Array.isArray(presence))return null;let entries=presence,self=entries.find(e=>e.mode===`gateway`&&e.reason===`self`)??entries.find(e=>typeof e.text==`string`&&String(e.text).startsWith(`Gateway:`))??null;return self?{host:typeof self.host==`string`?self.host:void 0,ip:typeof self.ip==`string`?self.ip:void 0,version:typeof self.version==`string`?self.version:void 0,platform:typeof self.platform==`string`?self.platform:void 0}:null}function resolveMemoryVectorState(vector){return vector.enabled?vector.available===!0?{tone:`ok`,state:`ready`}:vector.available===!1?{tone:`warn`,state:`unavailable`}:{tone:`muted`,state:`unknown`}:{tone:`muted`,state:`disabled`}}function resolveMemoryFtsState(fts){return fts.enabled?fts.available?{tone:`ok`,state:`ready`}:{tone:`warn`,state:`unavailable`}:{tone:`muted`,state:`disabled`}}function resolveMemoryCacheSummary(cache){return cache.enabled?{tone:`ok`,text:`cache on${typeof cache.entries==`number`?` (${cache.entries})`:``}`}:{tone:`muted`,text:`cache off`}}function safeTrim(value){return typeof value==`string`?value.trim():``}function macosVersion(){return safeTrim(spawnSync(`sw_vers`,[`-productVersion`],{encoding:`utf-8`}).stdout)||os.release()}function resolveOsSummary(){let platform=os.platform(),release=os.release(),arch=os.arch();return{platform,arch,release,label:platform===`darwin`?`macos ${macosVersion()} (${arch})`:platform===`win32`?`windows ${release} (${arch})`:`${platform} ${release} (${arch})`}}async function fileExists$1(p){try{return await fs$1.access(p),!0}catch{return!1}}async function getAgentLocalStatuses$1(cfg){let agentList=listAgentsForGateway(cfg),now=Date.now(),agents=await Promise.all(agentList.agents.map(async agent=>{let workspaceDir=(()=>{try{return resolveAgentWorkspaceDir(cfg,agent.id)}catch{return null}})(),bootstrapPending=workspaceDir==null?null:await fileExists$1(resolveWorkspaceFilePath(workspaceDir,`BOOTSTRAP.md`)),sessionsPath=resolveStorePath(cfg.session?.store,{agentId:agent.id}),store=(()=>{try{return loadSessionStore(sessionsPath)}catch{return{}}})(),updatedAt=Object.values(store).reduce((max,entry)=>Math.max(max,entry?.updatedAt??0),0),lastUpdatedAt=updatedAt>0?updatedAt:null,lastActiveAgeMs=lastUpdatedAt?now-lastUpdatedAt:null,sessionsCount=Object.keys(store).filter(k=>k!==`global`&&k!==`unknown`).length;return{id:agent.id,name:agent.name,workspaceDir,bootstrapPending,sessionsPath,sessionsCount,lastUpdatedAt,lastActiveAgeMs}})),totalSessions=agents.reduce((sum,a)=>sum+a.sessionsCount,0),bootstrapPendingCount=agents.reduce((sum,a)=>sum+(a.bootstrapPending?1:0),0);return{defaultId:agentList.defaultId,agents,totalSessions,bootstrapPendingCount}}const asRecord=value=>value&&typeof value==`object`?value:{};function summarizeSources(sources){let counts=new Map;for(let s of sources){let key=s?.trim()?s.trim():`unknown`;counts.set(key,(counts.get(key)??0)+1)}let parts=[...counts.entries()].toSorted((a,b)=>b[1]-a[1]).map(([key,n])=>`${key}${n>1?`×${n}`:``}`);return{label:parts.length>0?parts.join(`+`):`unknown`,parts}}function existsSyncMaybe(p){let path=p?.trim()||``;if(!path)return null;try{return fs.existsSync(path)}catch{return null}}function formatTokenHint(token,opts){let t=token.trim();if(!t)return`empty`;if(!opts.showSecrets)return`sha256:${sha256HexPrefix(t,8)} · len ${t.length}`;let head=t.slice(0,4),tail=t.slice(-4);return t.length<=10?`${t} · len ${t.length}`:`${head}…${tail} · len ${t.length}`}const formatAccountLabel=params=>{let base=params.accountId||`default`;return params.name?.trim()?`${base} (${params.name.trim()})`:base},resolveAccountEnabled=(plugin,account,cfg)=>plugin.config.isEnabled?plugin.config.isEnabled(account,cfg):asRecord(account).enabled!==!1,resolveAccountConfigured=async(plugin,account,cfg)=>plugin.config.isConfigured?await plugin.config.isConfigured(account,cfg):asRecord(account).configured!==!1,buildAccountNotes=params=>{let{plugin,cfg,entry}=params,notes=[],snapshot=entry.snapshot;snapshot.enabled===!1&&notes.push(`disabled`),snapshot.dmPolicy&&notes.push(`dm:${snapshot.dmPolicy}`),snapshot.tokenSource&&snapshot.tokenSource!==`none`&&notes.push(`token:${snapshot.tokenSource}`),snapshot.botTokenSource&&snapshot.botTokenSource!==`none`&&notes.push(`bot:${snapshot.botTokenSource}`),snapshot.appTokenSource&&snapshot.appTokenSource!==`none`&&notes.push(`app:${snapshot.appTokenSource}`),snapshot.baseUrl&&notes.push(snapshot.baseUrl),snapshot.port!=null&&notes.push(`port:${snapshot.port}`),snapshot.cliPath&&notes.push(`cli:${snapshot.cliPath}`),snapshot.dbPath&&notes.push(`db:${snapshot.dbPath}`);let allowFrom=plugin.config.resolveAllowFrom?.({cfg,accountId:snapshot.accountId})??snapshot.allowFrom;if(allowFrom?.length){let formatted=formatChannelAllowFrom({plugin,cfg,accountId:snapshot.accountId,allowFrom}).slice(0,3);formatted.length>0&&notes.push(`allow:${formatted.join(`,`)}`)}return notes};function resolveLinkFields(summary){let rec=asRecord(summary),linked=typeof rec.linked==`boolean`?rec.linked:null,authAgeMs=typeof rec.authAgeMs==`number`?rec.authAgeMs:null,self=asRecord(rec.self);return{linked,authAgeMs,selfE164:typeof self.e164==`string`&&self.e164.trim()?self.e164.trim():null}}function collectMissingPaths(accounts){let missing=[];for(let entry of accounts){let accountRec=asRecord(entry.account),snapshotRec=asRecord(entry.snapshot);for(let key of[`tokenFile`,`botTokenFile`,`appTokenFile`,`cliPath`,`dbPath`,`authDir`]){let raw=accountRec[key]??snapshotRec[key];existsSyncMaybe(raw)===!1&&missing.push(String(raw))}}return missing}function summarizeTokenConfig(params){let enabled=params.accounts.filter(a=>a.enabled);if(enabled.length===0)return{state:null,detail:null};let accountRecs=enabled.map(a=>asRecord(a.account)),hasBotTokenField=accountRecs.some(r=>`botToken`in r),hasAppTokenField=accountRecs.some(r=>`appToken`in r),hasTokenField=accountRecs.some(r=>`token`in r);if(!hasBotTokenField&&!hasAppTokenField&&!hasTokenField)return{state:null,detail:null};if(hasBotTokenField&&hasAppTokenField){let ready=enabled.filter(a=>{let rec=asRecord(a.account),bot=typeof rec.botToken==`string`?rec.botToken.trim():``,app=typeof rec.appToken==`string`?rec.appToken.trim():``;return!!bot&&!!app}),partial=enabled.filter(a=>{let rec=asRecord(a.account),bot=typeof rec.botToken==`string`?rec.botToken.trim():``,app=typeof rec.appToken==`string`?rec.appToken.trim():``,hasBot=!!bot,hasApp=!!app;return hasBot&&!hasApp||!hasBot&&hasApp});if(partial.length>0)return{state:`warn`,detail:`partial tokens (need bot+app) · accounts ${partial.length}`};if(ready.length===0)return{state:`setup`,detail:`no tokens (need bot+app)`};let botSources=summarizeSources(ready.map(a=>a.snapshot.botTokenSource??`none`)),appSources=summarizeSources(ready.map(a=>a.snapshot.appTokenSource??`none`)),sample=ready[0]?.account?asRecord(ready[0].account):{},botToken=typeof sample.botToken==`string`?sample.botToken:``,appToken=typeof sample.appToken==`string`?sample.appToken:``,botHint=botToken.trim()?formatTokenHint(botToken,{showSecrets:params.showSecrets}):``,appHint=appToken.trim()?formatTokenHint(appToken,{showSecrets:params.showSecrets}):``,hint=botHint||appHint?` (bot ${botHint||`?`}, app ${appHint||`?`})`:``;return{state:`ok`,detail:`tokens ok (bot ${botSources.label}, app ${appSources.label})${hint} · accounts ${ready.length}/${enabled.length||1}`}}if(hasBotTokenField){let ready=enabled.filter(a=>{let rec=asRecord(a.account);return!!(typeof rec.botToken==`string`&&rec.botToken.trim())});if(ready.length===0)return{state:`setup`,detail:`no bot token`};let sample=ready[0]?.account?asRecord(ready[0].account):{},botToken=typeof sample.botToken==`string`?sample.botToken:``,botHint=botToken.trim()?formatTokenHint(botToken,{showSecrets:params.showSecrets}):``;return{state:`ok`,detail:`bot token config${botHint?` (${botHint})`:``} · accounts ${ready.length}/${enabled.length||1}`}}let ready=enabled.filter(a=>{let rec=asRecord(a.account);return typeof rec.token==`string`?!!rec.token.trim():!1});if(ready.length===0)return{state:`setup`,detail:`no token`};let sources=summarizeSources(ready.map(a=>a.snapshot.tokenSource)),sample=ready[0]?.account?asRecord(ready[0].account):{},token=typeof sample.token==`string`?sample.token:``,hint=token.trim()?` (${formatTokenHint(token,{showSecrets:params.showSecrets})})`:``;return{state:`ok`,detail:`token ${sources.label}${hint} · accounts ${ready.length}/${enabled.length||1}`}}async function buildChannelsTable(cfg,opts){let showSecrets=opts?.showSecrets===!0,rows=[],details=[];for(let plugin of listChannelPlugins()){let accountIds=plugin.config.listAccountIds(cfg),defaultAccountId=resolveChannelDefaultAccountId({plugin,cfg,accountIds}),resolvedAccountIds=accountIds.length>0?accountIds:[defaultAccountId],accounts=[];for(let accountId of resolvedAccountIds){let account=plugin.config.resolveAccount(cfg,accountId),enabled=resolveAccountEnabled(plugin,account,cfg),configured=await resolveAccountConfigured(plugin,account,cfg),snapshot=buildChannelAccountSnapshot({plugin,cfg,accountId,account,enabled,configured});accounts.push({accountId,account,enabled,configured,snapshot})}let anyEnabled=accounts.some(a=>a.enabled),enabledAccounts=accounts.filter(a=>a.enabled),configuredAccounts=enabledAccounts.filter(a=>a.configured),defaultEntry=accounts.find(a=>a.accountId===defaultAccountId)??accounts[0],link=resolveLinkFields(plugin.status?.buildChannelSummary?await plugin.status.buildChannelSummary({account:defaultEntry?.account??{},cfg,defaultAccountId,snapshot:defaultEntry?.snapshot??{accountId:defaultAccountId}}):void 0),missingPaths=collectMissingPaths(enabledAccounts),tokenSummary=summarizeTokenConfig({plugin,cfg,accounts,showSecrets}),issues=plugin.status?.collectStatusIssues?plugin.status.collectStatusIssues(accounts.map(a=>a.snapshot)):[],label=plugin.meta.label??plugin.id,state=anyEnabled?missingPaths.length>0||issues.length>0?`warn`:link.linked===!1?`setup`:tokenSummary.state?tokenSummary.state:link.linked===!0||configuredAccounts.length>0?`ok`:`setup`:`off`,detail=(()=>{if(!anyEnabled)return defaultEntry?plugin.config.disabledReason?.(defaultEntry.account,cfg)??`disabled`:`disabled`;if(missingPaths.length>0)return`missing file (${missingPaths[0]})`;if(issues.length>0)return issues[0]?.message??`misconfigured`;if(link.linked!==null){let base=link.linked?`linked`:`not linked`,extra=[];return link.linked&&link.selfE164&&extra.push(link.selfE164),link.linked&&link.authAgeMs!=null&&link.authAgeMs>=0&&extra.push(`auth ${formatTimeAgo(link.authAgeMs)}`),(accounts.length>1||plugin.meta.forceAccountBinding)&&extra.push(`accounts ${accounts.length||1}`),extra.length>0?`${base} · ${extra.join(` · `)}`:base}if(tokenSummary.detail)return tokenSummary.detail;if(configuredAccounts.length>0){let head=`configured`;return accounts.length<=1&&!plugin.meta.forceAccountBinding?head:`${head} · accounts ${configuredAccounts.length}/${enabledAccounts.length||1}`}return(defaultEntry&&plugin.config.unconfiguredReason?plugin.config.unconfiguredReason(defaultEntry.account,cfg):null)??`not configured`})();rows.push({id:plugin.id,label,enabled:anyEnabled,state,detail}),configuredAccounts.length>0&&details.push({title:`${label} accounts`,columns:[`Account`,`Status`,`Notes`],rows:configuredAccounts.map(entry=>{let notes=buildAccountNotes({plugin,cfg,entry});return{Account:formatAccountLabel({accountId:entry.accountId,name:entry.snapshot.name}),Status:entry.enabled?`OK`:`WARN`,Notes:notes.join(` · `)}})})}return{rows,details}}async function readFileTailLines(filePath,maxLines){let raw=await fs$1.readFile(filePath,`utf8`).catch(()=>``);if(!raw.trim())return[];let lines=raw.replace(/\r/g,``).split(`
2
2
  `);return lines.slice(Math.max(0,lines.length-maxLines)).map(line=>line.trimEnd()).filter(line=>line.trim().length>0)}function countMatches(haystack,needle){return!haystack||!needle?0:haystack.split(needle).length-1}function shorten(message,maxLen){let cleaned=message.replace(/\s+/g,` `).trim();return cleaned.length<=maxLen?cleaned:`${cleaned.slice(0,Math.max(0,maxLen-1))}…`}function normalizeGwsLine(line){return line.replace(/\s+runId=[^\s]+/g,``).replace(/\s+conn=[^\s]+/g,``).replace(/\s+id=[^\s]+/g,``).replace(/\s+error=Error:.*$/g,``).trim()}function consumeJsonBlock(lines,startIndex){let startLine=lines[startIndex]??``,braceAt=startLine.indexOf(`{`);if(braceAt<0)return null;let parts=[startLine.slice(braceAt)],depth=countMatches(parts[0]??``,`{`)-countMatches(parts[0]??``,`}`),i=startIndex;for(;depth>0&&i+1<lines.length;){i+=1;let next=lines[i]??``;parts.push(next),depth+=countMatches(next,`{`)-countMatches(next,`}`)}return{json:parts.join(`
3
3
  `),endIndex:i}}function summarizeLogTail(rawLines,opts){let maxLines=Math.max(6,opts?.maxLines??26),out=[],groups=new Map,addGroup=(key,base)=>{let existing=groups.get(key);if(existing){existing.count+=1;return}groups.set(key,{count:1,index:out.length,base}),out.push(base)},addLine=line=>{let trimmed=line.trimEnd();trimmed&&out.push(trimmed)},lines=rawLines.map(line=>line.trimEnd()).filter(Boolean);for(let i=0;i<lines.length;i+=1){let line=lines[i]??``,trimmedStart=line.trimStart();if((trimmedStart.startsWith(`"`)||trimmedStart===`}`||trimmedStart===`{`||trimmedStart.startsWith(`}`)||trimmedStart.startsWith(`{`))&&!trimmedStart.startsWith(`[`)&&!trimmedStart.startsWith(`#`))continue;let tokenRefresh=line.match(/^\[([^\]]+)\]\s+Token refresh failed:\s*(\d+)\s*(\{)?\s*$/);if(tokenRefresh){let tag=tokenRefresh[1]??`unknown`,status=tokenRefresh[2]??`unknown`,block=consumeJsonBlock(lines,i);if(block){i=block.endIndex;let parsed=(()=>{try{return JSON.parse(block.json)}catch{return null}})(),code=parsed?.error?.code?.trim()||null,msg=parsed?.error?.message?.trim()||null,msgShort=msg?msg.toLowerCase().includes(`signing in again`)?`re-auth required`:shorten(msg,52):null,base=`[${tag}] token refresh ${status}${code?` ${code}`:``}${msgShort?` · ${msgShort}`:``}`;addGroup(`token:${tag}:${status}:${code??``}:${msgShort??``}`,base);continue}}let embedded=line.match(/^Embedded agent failed before reply:\s+OAuth token refresh failed for ([^:]+):/);if(embedded){let provider=embedded[1]?.trim()||`unknown`;addGroup(`embedded:${provider}`,`Embedded agent: OAuth token refresh failed (${provider})`);continue}if(line.startsWith(`[gws]`)&&line.includes(`errorCode=UNAVAILABLE`)&&line.includes(`OAuth token refresh failed`)){let normalized=normalizeGwsLine(line);addGroup(`gws:${normalized}`,normalized);continue}addLine(line)}for(let g of groups.values())g.count<=1||(out[g.index]=`${g.base} ×${g.count}`);let deduped=[];for(let line of out)deduped[deduped.length-1]!==line&&deduped.push(line);if(deduped.length<=maxLines)return deduped;let head=Math.min(6,Math.floor(maxLines/3)),tail=Math.max(1,maxLines-head-1);return[...deduped.slice(0,head),`… ${deduped.length-head-tail} lines omitted …`,...deduped.slice(-tail)]}async function appendStatusAllDiagnosis(params){let{lines,muted,ok,warn,fail}=params,emitCheck=(label,status)=>{let icon=status===`ok`?ok(`✓`):status===`warn`?warn(`!`):fail(`✗`),colored=status===`ok`?ok(label):status===`warn`?warn(label):fail(label);lines.push(`${icon} ${colored}`)};lines.push(``),lines.push(muted(`Gateway connection details:`));for(let line of redactSecrets(params.connectionDetailsForReport).split(`
4
4
  `).map(l=>l.trimEnd()))lines.push(` ${muted(line)}`);if(lines.push(``),params.snap){let status=params.snap.exists?params.snap.valid?`ok`:`warn`:`fail`;emitCheck(`Config: ${params.snap.path??`(unknown)`}`,status);let issues=[...params.snap.legacyIssues??[],...params.snap.issues??[]],uniqueIssues=issues.filter((issue,index)=>issues.findIndex(x=>x.path===issue.path&&x.message===issue.message)===index);for(let issue of uniqueIssues.slice(0,12))lines.push(` - ${issue.path}: ${issue.message}`);uniqueIssues.length>12&&lines.push(` ${muted(`… +${uniqueIssues.length-12} more`)}`)}else emitCheck(`Config: read failed`,`warn`);params.remoteUrlMissing&&(lines.push(``),emitCheck(`Gateway remote mode misconfigured (gateway.remote.url missing)`,`warn`),lines.push(` ${muted(`Fix: set gateway.remote.url, or set gateway.mode=local.`)}`)),params.sentinel?.payload?(emitCheck(`Restart sentinel present`,`warn`),lines.push(` ${muted(`${summarizeRestartSentinel(params.sentinel.payload)} · ${formatTimeAgo(Date.now()-params.sentinel.payload.ts)}`)}`)):emitCheck(`Restart sentinel: none`,`ok`);let lastErrClean=params.lastErr?.trim()??``,isTrivialLastErr=lastErrClean.length<8||lastErrClean===`}`||lastErrClean===`{`;if(lastErrClean&&!isTrivialLastErr&&(lines.push(``),lines.push(muted(`Gateway last log line:`)),lines.push(` ${muted(redactSecrets(lastErrClean))}`)),params.portUsage){let portOk=params.portUsage.listeners.length===0;if(emitCheck(`Port ${params.port}`,portOk?`ok`:`warn`),!portOk)for(let line of formatPortDiagnostics(params.portUsage))lines.push(` ${muted(line)}`)}{let backend=params.tailscale.backendState??`unknown`,okBackend=backend===`Running`,hasDns=!!params.tailscale.dnsName;emitCheck(params.tailscaleMode===`off`?`Tailscale: off · ${backend}${params.tailscale.dnsName?` · ${params.tailscale.dnsName}`:``}`:`Tailscale: ${params.tailscaleMode} · ${backend}${params.tailscale.dnsName?` · ${params.tailscale.dnsName}`:``}`,okBackend&&(params.tailscaleMode===`off`||hasDns)?`ok`:`warn`),params.tailscale.error&&lines.push(` ${muted(`error: ${params.tailscale.error}`)}`),params.tailscale.ips.length>0&&lines.push(` ${muted(`ips: ${params.tailscale.ips.slice(0,3).join(`, `)}${params.tailscale.ips.length>3?`…`:``}`)}`),params.tailscaleHttpsUrl&&lines.push(` ${muted(`https: ${params.tailscaleHttpsUrl}`)}`)}if(params.skillStatus){let eligible=params.skillStatus.skills.filter(s=>s.eligible).length,missing=params.skillStatus.skills.filter(s=>s.eligible&&Object.values(s.missing).some(arr=>arr.length)).length;emitCheck(`Skills: ${eligible} eligible · ${missing} missing · ${params.skillStatus.workspaceDir}`,missing===0?`ok`:`warn`)}params.progress.setLabel(`Reading logs…`);let logPaths=(()=>{try{return resolveGatewayLogPaths(process.env)}catch{return null}})();if(logPaths){params.progress.setLabel(`Reading logs…`);let[stderrTail,stdoutTail]=await Promise.all([readFileTailLines(logPaths.stderrPath,40).catch(()=>[]),readFileTailLines(logPaths.stdoutPath,40).catch(()=>[])]);if(stderrTail.length>0||stdoutTail.length>0){lines.push(``),lines.push(muted(`Gateway logs (tail, summarized): ${logPaths.logDir}`)),lines.push(` ${muted(`# stderr: ${logPaths.stderrPath}`)}`);for(let line of summarizeLogTail(stderrTail,{maxLines:22}).map(redactSecrets))lines.push(` ${muted(line)}`);lines.push(` ${muted(`# stdout: ${logPaths.stdoutPath}`)}`);for(let line of summarizeLogTail(stdoutTail,{maxLines:22}).map(redactSecrets))lines.push(` ${muted(line)}`)}}if(params.progress.tick(),params.channelsStatus){emitCheck(`Channel issues (${params.channelIssues.length||`none`})`,params.channelIssues.length===0?`ok`:`warn`);for(let issue of params.channelIssues.slice(0,12)){let fixText=issue.fix?` · fix: ${issue.fix}`:``;lines.push(` - ${issue.channel}[${issue.accountId}] ${issue.kind}: ${issue.message}${fixText}`)}params.channelIssues.length>12&&lines.push(` ${muted(`… +${params.channelIssues.length-12} more`)}`)}else emitCheck(`Channel issues skipped (gateway ${params.gatewayReachable?`query failed`:`unreachable`})`,`warn`);let healthErr=(()=>{if(!params.health||typeof params.health!=`object`)return``;let record=params.health;if(!(`error`in record))return``;let value=record.error;if(!value)return``;if(typeof value==`string`)return value;try{return JSON.stringify(value,null,2)}catch{return`[unserializable error]`}})();healthErr&&(lines.push(``),lines.push(muted(`Gateway health:`)),lines.push(` ${muted(redactSecrets(healthErr))}`)),lines.push(``),lines.push(muted(`Pasteable debug report. Auth tokens redacted.`)),lines.push(`Troubleshooting: https://docs.builderforce.ai/troubleshooting`),lines.push(``)}async function buildStatusAllReportLines(params){let rich=isRich(),heading=text=>rich?theme.heading(text):text,ok=text=>rich?theme.success(text):text,warn=text=>rich?theme.warn(text):text,fail=text=>rich?theme.error(text):text,muted=text=>rich?theme.muted(text):text,tableWidth=Math.max(60,(process.stdout.columns??120)-1),overview=renderTable({width:tableWidth,columns:[{key:`Item`,header:`Item`,minWidth:10},{key:`Value`,header:`Value`,flex:!0,minWidth:24}],rows:params.overviewRows}),channelRows=params.channels.rows.map(row=>({channelId:row.id,Channel:row.label,Enabled:row.enabled?ok(`ON`):muted(`OFF`),State:row.state===`ok`?ok(`OK`):row.state===`warn`?warn(`WARN`):row.state===`off`?muted(`OFF`):theme.accentDim(`SETUP`),Detail:row.detail})),channelIssuesByChannel=(()=>{let map=new Map;for(let issue of params.channelIssues){let key=issue.channel,list=map.get(key);list?list.push(issue):map.set(key,[issue])}return map})(),channelsTable=renderTable({width:tableWidth,columns:[{key:`Channel`,header:`Channel`,minWidth:10},{key:`Enabled`,header:`Enabled`,minWidth:7},{key:`State`,header:`State`,minWidth:8},{key:`Detail`,header:`Detail`,flex:!0,minWidth:28}],rows:channelRows.map(row=>{let issues=channelIssuesByChannel.get(row.channelId)??[];if(issues.length===0)return row;let issue=issues[0],suffix=` · ${warn(`gateway: ${String(issue.message).slice(0,90)}`)}`;return{...row,State:warn(`WARN`),Detail:`${row.Detail}${suffix}`}})}),agentsTable=renderTable({width:tableWidth,columns:[{key:`Agent`,header:`Agent`,minWidth:12},{key:`Bootstrap`,header:`Bootstrap`,minWidth:10},{key:`Sessions`,header:`Sessions`,align:`right`,minWidth:8},{key:`Active`,header:`Active`,minWidth:10},{key:`Store`,header:`Store`,flex:!0,minWidth:34}],rows:params.agentStatus.agents.map(a=>({Agent:a.name?.trim()?`${a.id} (${a.name.trim()})`:a.id,Bootstrap:a.bootstrapPending===!0?warn(`PENDING`):a.bootstrapPending===!1?ok(`OK`):`unknown`,Sessions:String(a.sessionsCount),Active:a.lastActiveAgeMs==null?`unknown`:formatTimeAgo(a.lastActiveAgeMs),Store:a.sessionsPath}))}),lines=[];lines.push(heading(`BuilderForceAgents status --all`)),lines.push(``),lines.push(heading(`Overview`)),lines.push(overview.trimEnd()),lines.push(``),lines.push(heading(`Channels`)),lines.push(channelsTable.trimEnd());for(let detail of params.channels.details)lines.push(``),lines.push(heading(detail.title)),lines.push(renderTable({width:tableWidth,columns:detail.columns.map(c=>({key:c,header:c,flex:c===`Notes`,minWidth:c===`Notes`?28:10})),rows:detail.rows.map(r=>({...r,...r.Status===`OK`?{Status:ok(`OK`)}:r.Status===`WARN`?{Status:warn(`WARN`)}:{}}))}).trimEnd());return lines.push(``),lines.push(heading(`Agents`)),lines.push(agentsTable.trimEnd()),lines.push(``),lines.push(heading(`Diagnosis (read-only)`)),await appendStatusAllDiagnosis({lines,progress:params.progress,muted,ok,warn,fail,connectionDetailsForReport:params.connectionDetailsForReport,...params.diagnosis}),lines}async function statusAllCommand(runtime,opts){await withProgress({label:`Scanning status --all…`,total:11},async progress=>{progress.setLabel(`Loading config…`);let cfg=loadConfig(),osSummary=resolveOsSummary(),snap=await readConfigFileSnapshot().catch(()=>null);progress.tick(),progress.setLabel(`Checking Tailscale…`);let tailscaleMode=cfg.gateway?.tailscale?.mode??`off`,tailscale=await(async()=>{try{let parsed=await readTailscaleStatusJson(runExec,{timeoutMs:1200}),backendState=typeof parsed.BackendState==`string`?parsed.BackendState:null,self=typeof parsed.Self==`object`&&parsed.Self!==null?parsed.Self:null,dnsNameRaw=self&&typeof self.DNSName==`string`?self.DNSName:null;return{ok:!0,backendState,dnsName:dnsNameRaw?dnsNameRaw.replace(/\.$/,``):null,ips:self&&Array.isArray(self.TailscaleIPs)?self.TailscaleIPs.filter(v=>typeof v==`string`&&v.trim().length>0).map(v=>v.trim()):[],error:null}}catch(err){return{ok:!1,backendState:null,dnsName:null,ips:[],error:String(err)}}})(),tailscaleHttpsUrl=tailscaleMode!==`off`&&tailscale.dnsName?`https://${tailscale.dnsName}${normalizeControlUiBasePath(cfg.gateway?.controlUi?.basePath)}`:null;progress.tick(),progress.setLabel(`Checking for updates…`);let update=await checkUpdateStatus({root:await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()}),timeoutMs:6500,fetchGit:!0,includeRegistry:!0}),channelLabel=resolveUpdateChannelDisplay({configChannel:normalizeUpdateChannel(cfg.update?.channel),installKind:update.installKind,gitTag:update.git?.tag??null,gitBranch:update.git?.branch??null}).label,gitLabel=formatGitInstallLabel(update);progress.tick(),progress.setLabel(`Probing gateway…`);let connection=buildGatewayConnectionDetails({config:cfg}),isRemoteMode=cfg.gateway?.mode===`remote`,remoteUrlRaw=typeof cfg.gateway?.remote?.url==`string`?cfg.gateway.remote.url.trim():``,remoteUrlMissing=isRemoteMode&&!remoteUrlRaw,gatewayMode=isRemoteMode?`remote`:`local`,localFallbackAuth=resolveGatewayProbeAuth$1({cfg,mode:`local`}),remoteAuth=resolveGatewayProbeAuth$1({cfg,mode:`remote`}),probeAuth=isRemoteMode&&!remoteUrlMissing?remoteAuth:localFallbackAuth,gatewayProbe=await probeGateway({url:connection.url,auth:probeAuth,timeoutMs:Math.min(5e3,opts?.timeoutMs??1e4)}).catch(()=>null),gatewayReachable=gatewayProbe?.ok===!0,gatewaySelf=pickGatewaySelfPresence(gatewayProbe?.presence??null);progress.tick(),progress.setLabel(`Checking services…`);let readServiceSummary=async service=>{try{let[loaded,runtimeInfo,command]=await Promise.all([service.isLoaded({env:process.env}).catch(()=>!1),service.readRuntime(process.env).catch(()=>void 0),service.readCommand(process.env).catch(()=>null)]),installed=command!=null;return{label:service.label,installed,loaded,loadedText:loaded?service.loadedText:service.notLoadedText,runtime:runtimeInfo}}catch{return null}},daemon=await readServiceSummary(resolveGatewayService()),nodeService=await readServiceSummary(resolveNodeService());progress.tick(),progress.setLabel(`Scanning agents…`);let agentStatus=await getAgentLocalStatuses$1(cfg);progress.tick(),progress.setLabel(`Summarizing channels…`);let channels=await buildChannelsTable(cfg,{showSecrets:!1});progress.tick();let connectionDetailsForReport=(()=>{if(!remoteUrlMissing)return connection.message;let bindMode=cfg.gateway?.bind??`loopback`;return[`Gateway mode: remote`,`Gateway target: (missing gateway.remote.url)`,`Config: ${snap?.path?.trim()?snap.path.trim():`(unknown config path)`}`,`Bind: ${bindMode}`,`Local fallback (used for probes): ${connection.url}`,`Fix: set gateway.remote.url, or set gateway.mode=local.`].join(`
@@ -1 +1 @@
1
- import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-2fP2Yq8h.js";import{Bn as isSubagentSessionRunActive,Ln as countActiveDescendantRuns,qn as resolveRequesterForChildSession}from"./reply-D9wUWhMx.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-Doyvd4lU.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-BifagO7i.js";import"./io-BNtgT4VB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BD801bpx.js";import"./runner-C3k1sKdu.js";import"./model-catalog-BoiWqBTw.js";import"./sandbox-1jtP0nhr.js";import"./chrome-Bfprrnm1.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DKdrUePN.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-CRrqIFJR.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-BPr0-lkT.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-l9WWK31e.js";import"./send-CVgJk5kN.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-Yn3MpU4F.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-Dbbjk8CQ.js";import"./with-timeout-CPd4-suw.js";import"./deliver-BiGCWHvZ.js";import"./send-CRSlal5z.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import"./memory-cli-D-Khe5Ij.js";import"./manager-DNIg84rj.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-CJq3iGqu.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-Cp4LMft_.js";import"./send-D_6wd5Y3.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-C8gtsUDG.js";import"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import"./resolve-route-D49haUnv.js";import"./replies-DAwcEPGb.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-COe2xa9K.js";import"./send-BIMaIwQV.js";import"./onboard-helpers-BmYUjl4j.js";import"./prompt-style-BpVK43GK.js";import"./pairing-labels-CD0lPAfY.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-QGVVADJa.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-BLpMH93w.js";import"./control-service-DKBAemtq.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-BQuRdgMU.js";import"./transformers-stream-D7nRu4Qu.js";export{countActiveDescendantRuns,isSubagentSessionRunActive,resolveRequesterForChildSession};
1
+ import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-2fP2Yq8h.js";import{Bn as isSubagentSessionRunActive,Ln as countActiveDescendantRuns,qn as resolveRequesterForChildSession}from"./reply-BuUSdq2L.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-Doyvd4lU.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-BifagO7i.js";import"./io-BNtgT4VB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BD801bpx.js";import"./runner-C3k1sKdu.js";import"./model-catalog-BoiWqBTw.js";import"./sandbox-1jtP0nhr.js";import"./chrome-Bfprrnm1.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DKdrUePN.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-CRrqIFJR.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-BPr0-lkT.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-l9WWK31e.js";import"./send-CVgJk5kN.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-Yn3MpU4F.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-Dbbjk8CQ.js";import"./with-timeout-CPd4-suw.js";import"./deliver-BiGCWHvZ.js";import"./send-CRSlal5z.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import"./memory-cli-D-Khe5Ij.js";import"./manager-DNIg84rj.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-CJq3iGqu.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-Cp4LMft_.js";import"./send-D_6wd5Y3.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-C8gtsUDG.js";import"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import"./resolve-route-D49haUnv.js";import"./replies-DAwcEPGb.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-COe2xa9K.js";import"./send-BIMaIwQV.js";import"./onboard-helpers-BmYUjl4j.js";import"./prompt-style-BpVK43GK.js";import"./pairing-labels-CD0lPAfY.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-QGVVADJa.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-BLpMH93w.js";import"./control-service-DKBAemtq.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-BQuRdgMU.js";import"./transformers-stream-D7nRu4Qu.js";export{countActiveDescendantRuns,isSubagentSessionRunActive,resolveRequesterForChildSession};