@seanhogg/builderforce-agents 2026.9.5 → 2026.9.6

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 (205) hide show
  1. package/dist/{agent-CBRDuLO-.js → agent-59_cdTZl.js} +1 -1
  2. package/dist/{agent-CCY1r5YW.js → agent-CvMM49lm.js} +1 -1
  3. package/dist/{agents-DW3hte-y.js → agents-2d7A-Uwz.js} +1 -1
  4. package/dist/{agents-Ce4bN10e.js → agents-BdOgv61S.js} +1 -1
  5. package/dist/{audio-preflight-BvzGdNYy.js → audio-preflight-CmX2XJ3N.js} +1 -1
  6. package/dist/{audio-preflight-BYMboYmW.js → audio-preflight-Dnw3oDJr.js} +1 -1
  7. package/dist/{audio-preflight-CEOxJosQ.js → audio-preflight-HcRdB0oH.js} +1 -1
  8. package/dist/{audio-preflight-CswNxppe.js → audio-preflight-Sh649dxR.js} +1 -1
  9. package/dist/{auth-choice-DSLN0TLU.js → auth-choice-D06_TWBf.js} +1 -1
  10. package/dist/{auth-choice-BTrUlYmE.js → auth-choice-DyxxR025.js} +1 -1
  11. package/dist/{auth-choice.apply-BZ7E08Yb.js → auth-choice.apply-CUuLdlQd.js} +1 -1
  12. package/dist/{auth-choice.apply-D3EY1pZ3.js → auth-choice.apply-CfFhu_Vk.js} +1 -1
  13. package/dist/{auth-choice.apply-5dpCNO0l.js → auth-choice.apply-D57XA_d9.js} +1 -1
  14. package/dist/{auth-choice.apply-3tPFL-eH.js → auth-choice.apply-s_rOXFVz.js} +1 -1
  15. package/dist/{auth-choice.apply.transformers-B_Q6e8Yk.js → auth-choice.apply.transformers-CqQSUnsx.js} +1 -1
  16. package/dist/{auth-choice.apply.transformers-D1EzC906.js → auth-choice.apply.transformers-DXBWOilg.js} +1 -1
  17. package/dist/{auth-choice.apply.transformers-BJbpyCWs.js → auth-choice.apply.transformers-DizfkAmz.js} +1 -1
  18. package/dist/{auth-choice.apply.transformers-vLzCo5ew.js → auth-choice.apply.transformers-vyvtAxcX.js} +1 -1
  19. package/dist/{banner-DVNoUX5I.js → banner-BXpp_pEd.js} +1 -1
  20. package/dist/build-info.json +3 -3
  21. package/dist/{builderforce-Bs_G8kBN.js → builderforce-BdJAOfvE.js} +2 -2
  22. package/dist/{builderforce-BN_So1di.js → builderforce-BrFUSx35.js} +2 -2
  23. package/dist/{builderforce-directory-sync-BCZK4FYJ.js → builderforce-directory-sync-CFiQew6N.js} +1 -1
  24. package/dist/{builderforce-directory-sync-DHfiUf2g.js → builderforce-directory-sync-DIQQT09l.js} +1 -1
  25. package/dist/{builderforce-onboarding-Bbjz8F-r.js → builderforce-onboarding-CoGJY95Q.js} +1 -1
  26. package/dist/{builderforce-onboarding-8lL2bgtL.js → builderforce-onboarding-DyYM_cib.js} +1 -1
  27. package/dist/{builderforcellm-syscheck-CyZiwcdF.js → builderforcellm-syscheck-CfFrfeV2.js} +1 -1
  28. package/dist/{builderforcellm-syscheck-DMjMJNFI.js → builderforcellm-syscheck-DGZKIwPC.js} +1 -1
  29. package/dist/bundled/boot-md/handler.js +1 -1
  30. package/dist/bundled/session-memory/handler.js +1 -1
  31. package/dist/{channel-options-Zk5QnNPR.js → channel-options--DZ4jYy9.js} +1 -1
  32. package/dist/{channel-options-Cbz6vcgo.js → channel-options-xVK4amr4.js} +1 -1
  33. package/dist/{channel-web-1xD-Ad2T.js → channel-web-9vO41fn2.js} +1 -1
  34. package/dist/{channels-cli-CiVlP8_q.js → channels-cli-Ch1sZ58k.js} +1 -1
  35. package/dist/{channels-cli-BOcpgY_W.js → channels-cli-YMSOJUmp.js} +1 -1
  36. package/dist/chrome-Bi-3xZj-.js +4 -0
  37. package/dist/chrome-C6oWWmHX.js +4 -0
  38. package/dist/{cli-6znoaKr2.js → cli-gsxv7DrZ.js} +1 -1
  39. package/dist/{cli-BPwpRE1j.js → cli-zC5qoRAp.js} +1 -1
  40. package/dist/{command-registry-BTxAGdlS.js → command-registry-BXLjR3kb.js} +1 -1
  41. package/dist/{command-registry-BZINHmI9.js → command-registry-I83E6HLw.js} +1 -1
  42. package/dist/{completion-cli-BwCfUaHz.js → completion-cli-BQCxFDqY.js} +1 -1
  43. package/dist/{completion-cli-vR4Sx9zB.js → completion-cli-CDy8f_Fg.js} +1 -1
  44. package/dist/{completion-cli-C8kMJ401.js → completion-cli-DbIxXK1B.js} +1 -1
  45. package/dist/{completion-cli-D8WkqtSU.js → completion-cli-ydxyAE7J.js} +1 -1
  46. package/dist/{config-cli-BYFA4Nin.js → config-cli-5ZSrACPR.js} +1 -1
  47. package/dist/{config-cli-DVpEv0oj.js → config-cli-BvJso6op.js} +1 -1
  48. package/dist/{configure-COeSbyyP.js → configure-1e4C38zp.js} +1 -1
  49. package/dist/{configure-CW2bJ91q.js → configure-B_oI_bg-.js} +1 -1
  50. package/dist/{configure-B_juJzVi.js → configure-Dp71zeJI.js} +1 -1
  51. package/dist/{configure-CgkUUUpM.js → configure-NxmuXXEd.js} +1 -1
  52. package/dist/{deliver-qM1Zkf4i.js → deliver-C6HTqnzY.js} +1 -1
  53. package/dist/{deliver-BNMupwo6.js → deliver-CdwCHH01.js} +1 -1
  54. package/dist/{deliver-Bs-FVPQ4.js → deliver-DFhj1d_t.js} +1 -1
  55. package/dist/{deliver-C5lVQcrs.js → deliver-XGIFv80r.js} +1 -1
  56. package/dist/{deps-DWFMK9Xg.js → deps-C4YVdrEi.js} +1 -1
  57. package/dist/{doctor-completion-s5vcMc-C.js → doctor-completion-DhIR9uqB.js} +1 -1
  58. package/dist/{doctor-completion-BdMxCat-.js → doctor-completion-Dpy-8HV9.js} +1 -1
  59. package/dist/{embedded-CRoX1qTh.js → embedded-Cw4g0mzl.js} +7 -7
  60. package/dist/{embedded-DpSS2q2a.js → embedded-DG3sEMyg.js} +7 -7
  61. package/dist/{embedded-helpers-BrfnCpCe.js → embedded-helpers-3FEGD_4b.js} +1 -1
  62. package/dist/{embedded-helpers-Q5h1lA6D.js → embedded-helpers-DGDYymYx.js} +1 -1
  63. package/dist/entry.js +1 -1
  64. package/dist/extensionAPI.js +1 -1
  65. package/dist/{gateway-cli-oSSOT67p.js → gateway-cli-BBu6KI7r.js} +4 -4
  66. package/dist/{gateway-cli-DzxNTkvL.js → gateway-cli-CSmbpS6n.js} +4 -4
  67. package/dist/{health-_L8Avf4v.js → health-AOM42u9C.js} +1 -1
  68. package/dist/{health-hXlukqbf.js → health-CRIXA8je.js} +1 -1
  69. package/dist/{health-B_qWRpsT.js → health-Cuh0tZl2.js} +1 -1
  70. package/dist/{hooks-cli-C-vbyL2y.js → hooks-cli-BeqvyPiX.js} +1 -1
  71. package/dist/{hooks-cli-7gBXRQ81.js → hooks-cli-CYI9ZvNI.js} +1 -1
  72. package/dist/index.js +2 -2
  73. package/dist/{ink-session-DpO3VOYc.js → ink-session-MNcfJzij.js} +1 -1
  74. package/dist/{ink-session-CZj35xTR.js → ink-session-VqYNJYzq.js} +1 -1
  75. package/dist/llm-slug-generator.js +1 -1
  76. package/dist/{mamba-state-engine-CFwb8DcP.js → mamba-state-engine-BYmUnYwn.js} +1 -1
  77. package/dist/{mamba-state-engine-Ck2JCfL6.js → mamba-state-engine-BloJzrxU.js} +1 -1
  78. package/dist/{models-PPv9KRbb.js → models-B6kkCBLd.js} +1 -1
  79. package/dist/{models-cli-btaamH96.js → models-cli-C7u8eLls.js} +1 -1
  80. package/dist/{models-cli-BUDSwmIY.js → models-cli-DpbpZwjy.js} +1 -1
  81. package/dist/{models-DMrs_Zsc.js → models-hEa3avo7.js} +1 -1
  82. package/dist/{onboard-4JByma4r.js → onboard-BHlI_UVY.js} +2 -2
  83. package/dist/{onboard-Dq_XQQXY.js → onboard-BW5J0Ym8.js} +2 -2
  84. package/dist/{onboard-channels-Dzyeem1L.js → onboard-channels-BkrhZ79I.js} +1 -1
  85. package/dist/{onboard-channels-D4g6xuSC.js → onboard-channels-DXIqdoto.js} +1 -1
  86. package/dist/{onboard-channels-Dir2EguP.js → onboard-channels-V51s9X-h.js} +1 -1
  87. package/dist/{onboard-channels-UZOCuxN7.js → onboard-channels-fyGQ1v4S.js} +1 -1
  88. package/dist/{onboard-interactive-DvNhkCNr.js → onboard-interactive-ClPMlCIl.js} +1 -1
  89. package/dist/{onboard-interactive-DyyEDd9a.js → onboard-interactive-D6IBBU8m.js} +1 -1
  90. package/dist/{onboard-interactive-CwNfYxGe.js → onboard-interactive-DEeqmoeW.js} +1 -1
  91. package/dist/{onboard-interactive-Co2bcd7g.js → onboard-interactive-DSZak3YX.js} +1 -1
  92. package/dist/{onboarding-DBL-H1Qu.js → onboarding-CYOfGpd5.js} +3 -3
  93. package/dist/{onboarding-CIxLpuFP.js → onboarding-DIxm_q7P.js} +3 -3
  94. package/dist/{onboarding.finalize-CGGbkAOL.js → onboarding.finalize-Co5L0rNp.js} +1 -1
  95. package/dist/{onboarding.finalize-R3TfibWY.js → onboarding.finalize-DAwpQa7n.js} +1 -1
  96. package/dist/{outbound-send-deps-CsJgGsii.js → outbound-send-deps-Cys_MtmC.js} +1 -1
  97. package/dist/{plugin-registry-Ty9w94Rd.js → plugin-registry-BM1-sG-e.js} +1 -1
  98. package/dist/{plugin-registry-BkGhcUDV.js → plugin-registry-CAy3I1K1.js} +1 -1
  99. package/dist/{plugin-registry-BenvgIsJ.js → plugin-registry-DjmzOS3n.js} +1 -1
  100. package/dist/{plugin-registry-DZirturB.js → plugin-registry-l2iN7_1l.js} +1 -1
  101. package/dist/plugin-sdk/agent-runtime/src/builderforce/ports.d.ts +1 -1
  102. package/dist/plugin-sdk/agent-runtime/src/infra/limbic-system-service.d.ts +2 -3
  103. package/dist/plugin-sdk/{audio-preflight-lhP946UF.js → audio-preflight-BbtfbLzo.js} +1 -1
  104. package/dist/plugin-sdk/{channel-web-CzXHQXgb.js → channel-web-BHose9yJ.js} +1 -1
  105. package/dist/plugin-sdk/index.js +1 -1
  106. package/dist/plugin-sdk/packages/agent-tools/src/index.d.ts +0 -1
  107. package/dist/plugin-sdk/packages/agent-tools/src/psychometric-dims.d.ts +2 -2
  108. package/dist/plugin-sdk/packages/agent-tools/src/psychometrics.d.ts +38 -5
  109. package/dist/plugin-sdk/packages/agent-tools/src/spec.d.ts +3 -1
  110. package/dist/plugin-sdk/{reply-DkmZ32IH.js → reply-V98uAjNN.js} +5 -5
  111. package/dist/plugin-sdk/{runner-DeqVi2ay.js → runner-BpFNG45j.js} +1 -1
  112. package/dist/plugin-sdk/{src-yVjde9hC.js → src-pvdIxmTY.js} +2 -2
  113. package/dist/plugin-sdk/{tool-loop-detection-AO2R09bJ.js → tool-loop-detection-Bjiit8CZ.js} +1 -1
  114. package/dist/plugin-sdk/{web-D-h3WpSq.js → web-Bq6nGRsB.js} +1 -1
  115. package/dist/{plugins-r-hGfiMK.js → plugins-BbovMu2g.js} +1 -1
  116. package/dist/{plugins-ChYVZuHy.js → plugins-DrkC1ANW.js} +1 -1
  117. package/dist/{plugins-cli-CKQ2X7tA.js → plugins-cli-CqtTn-Gv.js} +1 -1
  118. package/dist/{plugins-cli-CB7e9eCK.js → plugins-cli-DWlQnRpV.js} +1 -1
  119. package/dist/{program-D71K23KC.js → program-DOGUG9Uz.js} +2 -2
  120. package/dist/{program-context-B9V62ZJg.js → program-context-DBtTOKkf.js} +1 -1
  121. package/dist/{project-context-Cnqfr64Z.js → project-context-C5KLsMTc.js} +1 -1
  122. package/dist/{project-context-DXP12xhk.js → project-context-Cg0S9eFT.js} +1 -1
  123. package/dist/project-context-DbBD_r4v.js +1 -0
  124. package/dist/project-context-nIzFswHk.js +1 -0
  125. package/dist/project-context-store-B96x1Lfk.js +1 -0
  126. package/dist/{project-context-store-C8TROXjr.js → project-context-store-BS994lZX.js} +1 -1
  127. package/dist/{project-context-store-ClFt-YDL.js → project-context-store-BSIWJD6S.js} +1 -1
  128. package/dist/project-context-store-BzX1YdMP.js +1 -0
  129. package/dist/{prompt-select-styled-Cect8vJu.js → prompt-select-styled-2q_0LOx1.js} +1 -1
  130. package/dist/{prompt-select-styled-CJBJZiX_.js → prompt-select-styled-D31D9EIl.js} +1 -1
  131. package/dist/{provider-auth-helpers-DItSj71N.js → provider-auth-helpers-9Ut-MHV9.js} +1 -1
  132. package/dist/{provider-auth-helpers-ByvJdQT3.js → provider-auth-helpers-u1GAP4Bi.js} +1 -1
  133. package/dist/{provider-dispatcher-E-RjX6WG.js → provider-dispatcher-4KsB_bCw.js} +1 -1
  134. package/dist/{provider-dispatcher-D6-kUWf8.js → provider-dispatcher-CG7kSp65.js} +1 -1
  135. package/dist/{push-apns-B6YfFR5s.js → push-apns-CEzi4ars.js} +1 -1
  136. package/dist/{push-apns-n8P3oclR.js → push-apns-oUAHr48A.js} +1 -1
  137. package/dist/{pw-ai-BpY-eMJT.js → pw-ai-CfV_5FWo.js} +1 -1
  138. package/dist/{pw-ai-Bu1w-1rC.js → pw-ai-Dx8XRyPq.js} +1 -1
  139. package/dist/{register.agent-CAsV5dRf.js → register.agent-C84ud-cS.js} +1 -1
  140. package/dist/{register.agent-DQ4zQymV.js → register.agent-Db9SzkZg.js} +1 -1
  141. package/dist/{register.configure-HcPL-Na2.js → register.configure-BfPiEcFk.js} +1 -1
  142. package/dist/{register.configure-B-xRsB-s.js → register.configure-WYMz_fwM.js} +1 -1
  143. package/dist/{register.connect-BcZeAJ1s.js → register.connect-CMN7lqC5.js} +1 -1
  144. package/dist/{register.connect-ChZQOiYF.js → register.connect-Dqhd81kK.js} +1 -1
  145. package/dist/{register.maintenance-C-7Arpam.js → register.maintenance-BpQE-3eC.js} +1 -1
  146. package/dist/{register.maintenance-Jdfg2LKA.js → register.maintenance-DjKxt-jl.js} +1 -1
  147. package/dist/{register.message-D1IU3K0a.js → register.message-C4Gf388m.js} +1 -1
  148. package/dist/{register.message-C3cFBIXY.js → register.message-D5A7-_wN.js} +1 -1
  149. package/dist/{register.onboard-DJ2QNnOi.js → register.onboard-BF5tXr7K.js} +1 -1
  150. package/dist/{register.onboard-DjrhC3jh.js → register.onboard-BO_OtYg9.js} +1 -1
  151. package/dist/{register.setup-BNUqkiVa.js → register.setup-BzDbYjEw.js} +1 -1
  152. package/dist/{register.setup-C8XgG5Zt.js → register.setup-CaWt1bhf.js} +1 -1
  153. package/dist/{register.status-health-sessions-DcqlqAhs.js → register.status-health-sessions-BbYzFw1X.js} +1 -1
  154. package/dist/{register.status-health-sessions-CBTZZ0Rh.js → register.status-health-sessions-CDD6Eoxf.js} +1 -1
  155. package/dist/{register.subclis-CqVl0uO4.js → register.subclis-Cfb5FUTI.js} +1 -1
  156. package/dist/{register.subclis-Meewq2dj.js → register.subclis-yYbEKj9a.js} +1 -1
  157. package/dist/{reply-BsRbeUhd.js → reply-CpGH-3If.js} +8 -8
  158. package/dist/{run-main-CFVoPcgN.js → run-main-B82VAQTQ.js} +1 -1
  159. package/dist/{runner-68-X3KHf.js → runner-BLCTET8O.js} +2 -2
  160. package/dist/{runner-CfNJMPWu.js → runner-C651oVfk.js} +2 -2
  161. package/dist/{runner-BgUG2-RV.js → runner-DCn9sBTn.js} +3 -3
  162. package/dist/{runner-BKHYCYMH.js → runner-xF3_-mDL.js} +3 -3
  163. package/dist/{server-node-events-DusCxrVm.js → server-node-events-Bam08x5E.js} +1 -1
  164. package/dist/{server-node-events-BahizW3Z.js → server-node-events-kbTUUaAA.js} +1 -1
  165. package/dist/{session-dirs-RIA98OsG.js → session-dirs-BBGuanHN.js} +1 -1
  166. package/dist/{session-dirs-Cutn9srI.js → session-dirs-DV-c-o7M.js} +1 -1
  167. package/dist/{src-BRo9ywDM.js → src-BM8G-tIl.js} +3 -3
  168. package/dist/{src-DxNC0IHE.js → src-D2-7sOAX.js} +3 -3
  169. package/dist/{src-NJhXretA.js → src-D5vOHX9i.js} +2 -2
  170. package/dist/{src-Enbbh3hH.js → src-Dptpvd0V.js} +2 -2
  171. package/dist/{status-DPza6sZ1.js → status-BcT4AI8l.js} +1 -1
  172. package/dist/{status-CMdPdaSM.js → status-C9D1ex2G.js} +1 -1
  173. package/dist/{status-CFDh5snF.js → status-D_YsiWpP.js} +1 -1
  174. package/dist/{status-SyaizSN6.js → status-V8zvPBOv.js} +1 -1
  175. package/dist/{status-C1toWVvJ.js → status-i_sJ6Ikx.js} +1 -1
  176. package/dist/{subagent-registry-oB_F2U2W.js → subagent-registry-BUKplZi1.js} +8 -8
  177. package/dist/{subagent-registry-DFzwOGge.js → subagent-registry-BgUoQjBB.js} +1 -1
  178. package/dist/{subagent-registry-C1opJIrJ.js → subagent-registry-DrrF3JoH.js} +1 -1
  179. package/dist/{tool-loop-detection-DxqiqYam.js → tool-loop-detection-Bv0aRyd6.js} +1 -1
  180. package/dist/{tool-loop-detection-3W6bLEza.js → tool-loop-detection-CgUkrbCZ.js} +1 -1
  181. package/dist/{tool-loop-detection-C3z1wqgV.js → tool-loop-detection-CshVZIOE.js} +1 -1
  182. package/dist/{tool-loop-detection-DNM8YCNW.js → tool-loop-detection-bpZ-S3A1.js} +1 -1
  183. package/dist/{tui-Dy1FnApe.js → tui-CdYI5f3k.js} +2 -2
  184. package/dist/{tui-lng2vIp3.js → tui-DgBGTw2s.js} +2 -2
  185. package/dist/{tui-cli-BTFEL897.js → tui-cli-BNeRzoEe.js} +1 -1
  186. package/dist/{tui-cli-D-cDh9DV.js → tui-cli-BZ--mp9s.js} +1 -1
  187. package/dist/{tui-stream-assembler-B_AQD4Kg.js → tui-stream-assembler-BNJE9PoS.js} +1 -1
  188. package/dist/{tui-stream-assembler-Bn1WXUGG.js → tui-stream-assembler-xFcJqFJ9.js} +1 -1
  189. package/dist/{update-cli-BdT4-P_D.js → update-cli-BATUCF7p.js} +1 -1
  190. package/dist/{update-cli-DMMSWPXh.js → update-cli-BRBoX_97.js} +1 -1
  191. package/dist/{web-BiSkmACr.js → web-BdYyXjsX.js} +1 -1
  192. package/dist/{web-CXrAweDC.js → web-C5hfXVCy.js} +1 -1
  193. package/dist/{web-BS6WUf7c.js → web-CsWqmV_E.js} +1 -1
  194. package/dist/{web-CfYUd-lX.js → web-fg3nA4Qq.js} +1 -1
  195. package/dist/{workflow-cli-Du4IfE1A.js → workflow-cli-D-o_-jfU.js} +1 -1
  196. package/dist/{workflow-cli-BuEKJ4ut.js → workflow-cli-DDWSXyi0.js} +1 -1
  197. package/package.json +6 -5
  198. package/dist/chrome-C6fODzE5.js +0 -4
  199. package/dist/chrome-Cm-kVyuA.js +0 -4
  200. package/dist/plugin-sdk/agent-runtime/src/builderforce/limbic.d.ts +0 -14
  201. package/dist/plugin-sdk/packages/agent-tools/src/limbic.d.ts +0 -104
  202. package/dist/project-context-DS52UwJZ.js +0 -1
  203. package/dist/project-context-PiiAmwVd.js +0 -1
  204. package/dist/project-context-store-B2GYSwld.js +0 -1
  205. package/dist/project-context-store-DNx9ScQ_.js +0 -1
@@ -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-BARnVAUE.js";import"./logger-AbH8mdkv.js";import{f as normalizeMainKey}from"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import{d as resolveSessionAgentId}from"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import{r as loadConfig}from"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./model-discovery-DxpimsRF.js";import"./model-catalog-wcISK04b.js";import"./frontmatter-DgRc5y_l.js";import"./skills-W00EPvKR.js";import"./plugin-skills-BSUncenp.js";import"./refresh-bgGvF0aF.js";import"./client-DeQ0LbP9.js";import"./call-CjC3SRPv.js";import"./message-channel-C-yw5fZm.js";import{Fn as enqueueSystemEvent,at as resolveOutboundTarget,nn as requestHeartbeatNow}from"./subagent-registry-oB_F2U2W.js";import{u as updateSessionStore}from"./sessions-ko0LxxGk.js";import"./src-BRo9ywDM.js";import"./project-context-store-ClFt-YDL.js";import"./tokens-BNwTTeJb.js";import{r as normalizeChannelId}from"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import"./send-gG3CFJwv.js";import"./send-DqJCViFb.js";import"./with-timeout-By0c7Ur9.js";import{t as deliverOutboundPayloads}from"./deliver-Bs-FVPQ4.js";import"./accounts-DoJYLMfS.js";import"./send-mCN63Hkn.js";import"./image-ops-Bg9yFwjX.js";import"./redact-bWj_-q3j.js";import"./errors-t5wHPcwh.js";import"./embedded-helpers-Q5h1lA6D.js";import"./sandbox-BcH7kS1y.js";import"./chrome-IJYO1tSE.js";import"./tailscale-CgCG7AVQ.js";import"./auth-B4Kn3eee.js";import"./server-context-D3iiIzvV.js";import"./routes-7QTsp3sA.js";import"./paths-GamzES41.js";import"./ssrf-BiSQzdcA.js";import"./store-C5LmVaEC.js";import"./ports-LqFTyTSK.js";import"./trash-zs6gNxed.js";import"./accounts-BT-NzzBc.js";import"./paths-BQ9W7Bs0.js";import"./tool-images-DV2HMmx4.js";import"./workspace-Cz9mCy0P.js";import"./reply-prefix-9hmbzubX.js";import"./sqlite-BEgCClMz.js";import"./memory-cli-COgt0ROi.js";import"./manager-Cob4Ofzr.js";import"./gemini-auth-BZgBIY0M.js";import"./retry-Cc6xusE8.js";import"./common-BRdxH-uH.js";import"./runner-68-X3KHf.js";import"./tool-display-BIswnHaq.js";import"./chunk-UPhdkZNp.js";import"./markdown-tables-CpqWBduK.js";import"./fetch-guard-CoGEds8D.js";import"./fetch-CUsKv8oj.js";import"./ir-6L-eU4id.js";import"./render-1ABBE2Y6.js";import"./builderforcellm-syscheck-CyZiwcdF.js";import{c as resolveGatewaySessionStoreTarget,o as loadSessionEntry,s as pruneLegacyStoreKeys}from"./session-utils-VCGKYbgW.js";import"./coding-tools.policy-DIeVRurg.js";import"./pairing-store-tegvJa08.js";import"./fetch-CrbOFvsL.js";import"./exec-approvals-Cn0K-HtJ.js";import"./nodes-screen-OI7tHqlU.js";import"./session-cost-usage-BgZfN_WR.js";import"./provider-usage-BLkm6ojE.js";import"./send-BIR1Jhc5.js";import"./outbound-attachment-3GZbMqo1.js";import"./delivery-queue-DQXq7KUU.js";import"./project-context-DXP12xhk.js";import"./control-service-Cml__v8i.js";import"./stagger-CUH5rlmS.js";import"./channel-selection-DFf_nAm7.js";import"./send-9rUcCK7O.js";import"./resolve-route-D3X-bXU-.js";import"./channel-activity-By7lsk7N.js";import"./tables-DZSV6me6.js";import"./links-B6LU5cXN.js";import"./cli-utils-ByV85M53.js";import"./help-format-DIDk_7gh.js";import"./progress-BQMO_-7I.js";import"./replies-CL0uQgU7.js";import"./onboard-helpers-Di5OXlap.js";import"./prompt-style-CZOeG0sw.js";import"./pairing-labels-DofkNLS2.js";import"./active-listener-BC31MA4v.js";import"./mamba-state-engine-CFwb8DcP.js";import"./transformers-stream-nSL4Xu31.js";import{t as createOutboundSendDeps}from"./outbound-send-deps-CsJgGsii.js";import{c as parseMessageWithAttachments,l as formatForLog,r as registerApnsToken,s as normalizeRpcAttachmentsToChatAttachments}from"./push-apns-B6YfFR5s.js";import{t as agentCommand}from"./agent-CBRDuLO-.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-BARnVAUE.js";import"./logger-AbH8mdkv.js";import{f as normalizeMainKey}from"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import{d as resolveSessionAgentId}from"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import{r as loadConfig}from"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./model-discovery-DxpimsRF.js";import"./model-catalog-wcISK04b.js";import"./frontmatter-DgRc5y_l.js";import"./skills-W00EPvKR.js";import"./plugin-skills-BSUncenp.js";import"./refresh-bgGvF0aF.js";import"./client-DeQ0LbP9.js";import"./call-CjC3SRPv.js";import"./message-channel-C-yw5fZm.js";import{Fn as enqueueSystemEvent,at as resolveOutboundTarget,nn as requestHeartbeatNow}from"./subagent-registry-BUKplZi1.js";import{u as updateSessionStore}from"./sessions-ko0LxxGk.js";import"./src-BM8G-tIl.js";import"./project-context-store-BSIWJD6S.js";import"./tokens-BNwTTeJb.js";import{r as normalizeChannelId}from"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import"./send-gG3CFJwv.js";import"./send-DqJCViFb.js";import"./with-timeout-By0c7Ur9.js";import{t as deliverOutboundPayloads}from"./deliver-DFhj1d_t.js";import"./accounts-DoJYLMfS.js";import"./send-mCN63Hkn.js";import"./image-ops-Bg9yFwjX.js";import"./redact-bWj_-q3j.js";import"./errors-t5wHPcwh.js";import"./embedded-helpers-DGDYymYx.js";import"./sandbox-BcH7kS1y.js";import"./chrome-IJYO1tSE.js";import"./tailscale-CgCG7AVQ.js";import"./auth-B4Kn3eee.js";import"./server-context-D3iiIzvV.js";import"./routes-7QTsp3sA.js";import"./paths-GamzES41.js";import"./ssrf-BiSQzdcA.js";import"./store-C5LmVaEC.js";import"./ports-LqFTyTSK.js";import"./trash-zs6gNxed.js";import"./accounts-BT-NzzBc.js";import"./paths-BQ9W7Bs0.js";import"./tool-images-DV2HMmx4.js";import"./workspace-Cz9mCy0P.js";import"./reply-prefix-9hmbzubX.js";import"./sqlite-BEgCClMz.js";import"./memory-cli-COgt0ROi.js";import"./manager-Cob4Ofzr.js";import"./gemini-auth-BZgBIY0M.js";import"./retry-Cc6xusE8.js";import"./common-BRdxH-uH.js";import"./runner-BLCTET8O.js";import"./tool-display-BIswnHaq.js";import"./chunk-UPhdkZNp.js";import"./markdown-tables-CpqWBduK.js";import"./fetch-guard-CoGEds8D.js";import"./fetch-CUsKv8oj.js";import"./ir-6L-eU4id.js";import"./render-1ABBE2Y6.js";import"./builderforcellm-syscheck-CfFrfeV2.js";import{c as resolveGatewaySessionStoreTarget,o as loadSessionEntry,s as pruneLegacyStoreKeys}from"./session-utils-VCGKYbgW.js";import"./coding-tools.policy-DIeVRurg.js";import"./pairing-store-tegvJa08.js";import"./fetch-CrbOFvsL.js";import"./exec-approvals-Cn0K-HtJ.js";import"./nodes-screen-OI7tHqlU.js";import"./session-cost-usage-BgZfN_WR.js";import"./provider-usage-BLkm6ojE.js";import"./send-BIR1Jhc5.js";import"./outbound-attachment-3GZbMqo1.js";import"./delivery-queue-DQXq7KUU.js";import"./project-context-C5KLsMTc.js";import"./control-service-Cml__v8i.js";import"./stagger-CUH5rlmS.js";import"./channel-selection-DFf_nAm7.js";import"./send-9rUcCK7O.js";import"./resolve-route-D3X-bXU-.js";import"./channel-activity-By7lsk7N.js";import"./tables-DZSV6me6.js";import"./links-B6LU5cXN.js";import"./cli-utils-ByV85M53.js";import"./help-format-DIDk_7gh.js";import"./progress-BQMO_-7I.js";import"./replies-CL0uQgU7.js";import"./onboard-helpers-Di5OXlap.js";import"./prompt-style-CZOeG0sw.js";import"./pairing-labels-DofkNLS2.js";import"./active-listener-BC31MA4v.js";import"./mamba-state-engine-BYmUnYwn.js";import"./transformers-stream-nSL4Xu31.js";import{t as createOutboundSendDeps}from"./outbound-send-deps-Cys_MtmC.js";import{c as parseMessageWithAttachments,l as formatForLog,r as registerApnsToken,s as normalizeRpcAttachmentsToChatAttachments}from"./push-apns-CEzi4ars.js";import{t as agentCommand}from"./agent-59_cdTZl.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-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-BrfnCpCe.js";import{Et as requestHeartbeatNow,F as resolveGatewaySessionStoreTarget,H as resolveOutboundTarget,N as loadSessionEntry,P as pruneLegacyStoreKeys,li as enqueueSystemEvent}from"./reply-BsRbeUhd.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"./model-selection-DX_WOc2P.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import{r as loadConfig}from"./io-YzT_09GD.js";import"./manifest-registry-BVDm_CP0.js";import"./config-8x9ZIdfF.js";import"./runner-CfNJMPWu.js";import"./model-catalog-C7PdRY6w.js";import"./sandbox-DzuXOMNa.js";import"./chrome-Dk-WNIhp.js";import"./tailscale-B-VKIlWm.js";import"./auth-CDcrUXYB.js";import"./server-context-DsuST81W.js";import"./frontmatter-DyJ2unbL.js";import"./skills-B4r9m770.js";import"./plugin-skills-C39wi4uD.js";import"./routes-DoGqdgOP.js";import"./redact-C3oo7_aY.js";import"./errors-CjmtpPBP.js";import"./paths-C1QKdGJX.js";import"./ssrf-4MnoQ7Sz.js";import"./image-ops-CONrkLJK.js";import"./store-BoTKCB2d.js";import"./ports-BNC_iRpw.js";import"./trash-Czxs8cUf.js";import{u as updateSessionStore}from"./sessions-OZNhnSwZ.js";import"./message-channel-DrfCCUg4.js";import{r as normalizeChannelId}from"./plugins-COtQnUML.js";import"./accounts-CTKk3xPO.js";import"./accounts-DFqpWzeU.js";import"./accounts-CbQihLRU.js";import"./bindings-DMDv84HS.js";import"./send-Dmzp1gNF.js";import"./send-DEgD1Cfd.js";import"./paths-CkcK939O.js";import"./src-DxNC0IHE.js";import"./tool-images-DsKy1uNN.js";import"./tool-display-TRKLY-yH.js";import"./fetch-guard-BQuCLA1C.js";import"./api-key-rotation-ChHXb1Pq.js";import"./fetch-CDeJQlzN.js";import"./sqlite-DEiKj1vi.js";import"./tokens-Ct4DyfhX.js";import"./project-context-store-C8TROXjr.js";import"./with-timeout-YbYylXgf.js";import{t as deliverOutboundPayloads}from"./deliver-C5lVQcrs.js";import"./send-DlPwTVpG.js";import"./workspace-ChbaDWgp.js";import"./reply-prefix-BwtP84WV.js";import"./memory-cli-DWEtZrJ5.js";import"./manager-VPNjVm0W.js";import"./retry-Jis-ZZfm.js";import"./client-DhlZRznX.js";import"./call-DwWslKWv.js";import"./common-NHQnma5l.js";import"./chunk-h7FZEwW2.js";import"./markdown-tables-DOq8FfUr.js";import"./ir-AM9J0QtO.js";import"./render-CSLaFZoy.js";import"./builderforcellm-syscheck-DMjMJNFI.js";import"./send-DglIOKdS.js";import"./outbound-attachment-TWzrIR9Q.js";import"./fetch-B6_hd7w9.js";import"./delivery-queue-BZWZDdpJ.js";import"./channel-activity-qRD5c3VV.js";import"./tables-DirB1oU7.js";import"./pairing-store-DIpKOfDK.js";import"./links-CYRGsVCu.js";import"./cli-utils-BLNnV_WG.js";import"./help-format-NhTn4dWd.js";import"./progress-OKwbfa23.js";import"./resolve-route-BvfmiLqC.js";import"./replies-BoxyKuBS.js";import"./refresh-DgTiir08.js";import"./coding-tools.policy-BJQuylwM.js";import"./send-BgdpJymE.js";import"./onboard-helpers-CPmBeDvt.js";import"./prompt-style-BwwmGo3-.js";import"./pairing-labels-CELZqNBC.js";import"./session-cost-usage-pgxrRRW4.js";import"./provider-usage-CbH7sm73.js";import"./active-listener-DBdxNyOd.js";import"./exec-approvals-kmxxyvIe.js";import"./nodes-screen-BWDONgPE.js";import"./project-context-Cnqfr64Z.js";import"./control-service-BhSaBRxC.js";import"./stagger-NaB6u1z1.js";import"./channel-selection-CQ5MM7Hi.js";import"./mamba-state-engine-Ck2JCfL6.js";import"./transformers-stream-QS2dnQob.js";import"./deps-DWFMK9Xg.js";import{c as parseMessageWithAttachments,l as formatForLog,r as registerApnsToken,s as normalizeRpcAttachmentsToChatAttachments}from"./push-apns-n8P3oclR.js";import{t as createOutboundSendDeps}from"./outbound-send-deps-DS_1j6Dm.js";import{t as agentCommand}from"./agent-CCY1r5YW.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-3FEGD_4b.js";import{Et as requestHeartbeatNow,F as resolveGatewaySessionStoreTarget,H as resolveOutboundTarget,N as loadSessionEntry,P as pruneLegacyStoreKeys,li as enqueueSystemEvent}from"./reply-CpGH-3If.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"./model-selection-DX_WOc2P.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import{r as loadConfig}from"./io-YzT_09GD.js";import"./manifest-registry-BVDm_CP0.js";import"./config-8x9ZIdfF.js";import"./runner-C651oVfk.js";import"./model-catalog-C7PdRY6w.js";import"./sandbox-DzuXOMNa.js";import"./chrome-Dk-WNIhp.js";import"./tailscale-B-VKIlWm.js";import"./auth-CDcrUXYB.js";import"./server-context-DsuST81W.js";import"./frontmatter-DyJ2unbL.js";import"./skills-B4r9m770.js";import"./plugin-skills-C39wi4uD.js";import"./routes-DoGqdgOP.js";import"./redact-C3oo7_aY.js";import"./errors-CjmtpPBP.js";import"./paths-C1QKdGJX.js";import"./ssrf-4MnoQ7Sz.js";import"./image-ops-CONrkLJK.js";import"./store-BoTKCB2d.js";import"./ports-BNC_iRpw.js";import"./trash-Czxs8cUf.js";import{u as updateSessionStore}from"./sessions-OZNhnSwZ.js";import"./message-channel-DrfCCUg4.js";import{r as normalizeChannelId}from"./plugins-COtQnUML.js";import"./accounts-CTKk3xPO.js";import"./accounts-DFqpWzeU.js";import"./accounts-CbQihLRU.js";import"./bindings-DMDv84HS.js";import"./send-Dmzp1gNF.js";import"./send-DEgD1Cfd.js";import"./paths-CkcK939O.js";import"./src-D2-7sOAX.js";import"./tool-images-DsKy1uNN.js";import"./tool-display-TRKLY-yH.js";import"./fetch-guard-BQuCLA1C.js";import"./api-key-rotation-ChHXb1Pq.js";import"./fetch-CDeJQlzN.js";import"./sqlite-DEiKj1vi.js";import"./tokens-Ct4DyfhX.js";import"./project-context-store-BS994lZX.js";import"./with-timeout-YbYylXgf.js";import{t as deliverOutboundPayloads}from"./deliver-XGIFv80r.js";import"./send-DlPwTVpG.js";import"./workspace-ChbaDWgp.js";import"./reply-prefix-BwtP84WV.js";import"./memory-cli-DWEtZrJ5.js";import"./manager-VPNjVm0W.js";import"./retry-Jis-ZZfm.js";import"./client-DhlZRznX.js";import"./call-DwWslKWv.js";import"./common-NHQnma5l.js";import"./chunk-h7FZEwW2.js";import"./markdown-tables-DOq8FfUr.js";import"./ir-AM9J0QtO.js";import"./render-CSLaFZoy.js";import"./builderforcellm-syscheck-DGZKIwPC.js";import"./send-DglIOKdS.js";import"./outbound-attachment-TWzrIR9Q.js";import"./fetch-B6_hd7w9.js";import"./delivery-queue-BZWZDdpJ.js";import"./channel-activity-qRD5c3VV.js";import"./tables-DirB1oU7.js";import"./pairing-store-DIpKOfDK.js";import"./links-CYRGsVCu.js";import"./cli-utils-BLNnV_WG.js";import"./help-format-NhTn4dWd.js";import"./progress-OKwbfa23.js";import"./resolve-route-BvfmiLqC.js";import"./replies-BoxyKuBS.js";import"./refresh-DgTiir08.js";import"./coding-tools.policy-BJQuylwM.js";import"./send-BgdpJymE.js";import"./onboard-helpers-CPmBeDvt.js";import"./prompt-style-BwwmGo3-.js";import"./pairing-labels-CELZqNBC.js";import"./session-cost-usage-pgxrRRW4.js";import"./provider-usage-CbH7sm73.js";import"./active-listener-DBdxNyOd.js";import"./exec-approvals-kmxxyvIe.js";import"./nodes-screen-BWDONgPE.js";import"./project-context-Cg0S9eFT.js";import"./control-service-BhSaBRxC.js";import"./stagger-NaB6u1z1.js";import"./channel-selection-CQ5MM7Hi.js";import"./mamba-state-engine-BloJzrxU.js";import"./transformers-stream-QS2dnQob.js";import"./deps-C4YVdrEi.js";import{c as parseMessageWithAttachments,l as formatForLog,r as registerApnsToken,s as normalizeRpcAttachmentsToChatAttachments}from"./push-apns-oUAHr48A.js";import{t as createOutboundSendDeps}from"./outbound-send-deps-DS_1j6Dm.js";import{t as agentCommand}from"./agent-CvMM49lm.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-D3-p8W2n.js";import{t as runCommandWithTimeout}from"./exec-CGuYALEs.js";import{yr as trimLogTail}from"./subagent-registry-oB_F2U2W.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-BweA3rDY.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-Co1T5sBs.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-D3-p8W2n.js";import{t as runCommandWithTimeout}from"./exec-CGuYALEs.js";import{yr as trimLogTail}from"./subagent-registry-BUKplZi1.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-BweA3rDY.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-Co1T5sBs.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{or as trimLogTail}from"./reply-BsRbeUhd.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-CAmSpVpE.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-CwmSkavG.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{or as trimLogTail}from"./reply-CpGH-3If.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-CAmSpVpE.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-CwmSkavG.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};