@seanhogg/builderforce-agents 2026.10.9 → 2026.10.11

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 (437) hide show
  1. package/dist/{acp-cli-DcKpPsJa.js → acp-cli-C23mmrQt.js} +1 -1
  2. package/dist/{acp-cli-BxH-eUDl.js → acp-cli-D6F-D5JB.js} +1 -1
  3. package/dist/{agent-cXF-aL0g.js → agent-B-2r1Lr_.js} +1 -1
  4. package/dist/{agent-wJmvciTM.js → agent-BI9qSnSp.js} +1 -1
  5. package/dist/{agentbot-cli-Cub3Abbt.js → agentbot-cli-Cyrhr5jX.js} +1 -1
  6. package/dist/{agentbot-cli-CTRvEfBp.js → agentbot-cli-sC55m-XS.js} +1 -1
  7. package/dist/{agents-Cr7WO73I.js → agents-CMThT_Bj.js} +1 -1
  8. package/dist/agents-Chz9nfm2.js +1 -0
  9. package/dist/{api-key-rotation-CHBjUwUJ.js → api-key-rotation-CyCi-UqR.js} +1 -1
  10. package/dist/{audio-preflight-CWFuqbao.js → audio-preflight-B411b2-y.js} +1 -1
  11. package/dist/{audio-preflight-F2e3Y4CW.js → audio-preflight-Cs4eUjQk.js} +1 -1
  12. package/dist/{audit-DGnEhZYe.js → audit-B-USV03V.js} +1 -1
  13. package/dist/{audit-DBjjjW93.js → audit-SKNPS-K2.js} +1 -1
  14. package/dist/auth-choice-CChsMy-F.js +1 -0
  15. package/dist/{auth-choice-9gZuOvPS.js → auth-choice-CCib_yVL.js} +1 -1
  16. package/dist/auth-choice-DSnpkrMc.js +1 -0
  17. package/dist/{auth-choice-BoZFVmEa.js → auth-choice-DzBqqq7i.js} +1 -1
  18. package/dist/auth-choice.apply-6f3Jb_lS.js +1 -0
  19. package/dist/{auth-choice.apply-CcatXiNo.js → auth-choice.apply-BgOXoS8X.js} +1 -1
  20. package/dist/{auth-choice.apply-BHLQeym9.js → auth-choice.apply-DBuvopiF.js} +1 -1
  21. package/dist/auth-choice.apply-DeXnLwVS.js +1 -0
  22. package/dist/auth-choice.apply.transformers-CZDuBaOr.js +1 -0
  23. package/dist/{auth-choice.apply.transformers-CIn3fs7K.js → auth-choice.apply.transformers-Df9l_jRz.js} +2 -2
  24. package/dist/{auth-choice.apply.transformers-1plI0MUg.js → auth-choice.apply.transformers-DmdxpHGz.js} +2 -2
  25. package/dist/{auth-choice.apply.transformers-D5OrjEHo.js → auth-choice.apply.transformers-dn7l6XyJ.js} +1 -1
  26. package/dist/{auth-json-D1ite-pW.js → auth-json-BB-VBn5E.js} +1 -1
  27. package/dist/{auth-json-CN3MWw57.js → auth-json-BVyos95N.js} +1 -1
  28. package/dist/{auth-json-HGu227VM.js → auth-json-CoOe4tEg.js} +1 -1
  29. package/dist/{auth-json-DZ7E50Y1.js → auth-json-wrKixZxh.js} +1 -1
  30. package/dist/{auth-profiles-C1VbcUOm.js → auth-profiles-pt7Tr4HA.js} +1 -1
  31. package/dist/{auth-token-CyVfNEQb.js → auth-token-BE67qxLw.js} +1 -1
  32. package/dist/{auth-token-CoQ5ePPl.js → auth-token-BPHeoBAW.js} +1 -1
  33. package/dist/{banner-DY-L7_eI.js → banner-ErBINvbk.js} +1 -1
  34. package/dist/{browser-cli-D2O94twn.js → browser-cli-BZc64-Xx.js} +1 -1
  35. package/dist/{browser-cli-CoRx_4iM.js → browser-cli-CoxVKdon.js} +1 -1
  36. package/dist/build-info.json +3 -3
  37. package/dist/{builderforce-BmrsVdFw.js → builderforce-B9187Tm9.js} +4 -4
  38. package/dist/{builderforce-Bwyw0GJ6.js → builderforce-BLqHwgeu.js} +4 -4
  39. package/dist/builderforce-api-DKgXl8BH.js +1 -0
  40. package/dist/builderforce-api-DcPAGsla.js +1 -0
  41. package/dist/builderforce-onboarding-CaPJZSvw.js +24 -0
  42. package/dist/builderforce-onboarding-RXFb0gct.js +24 -0
  43. package/dist/{builderforcellm-syscheck-CprBhARf.js → builderforcellm-syscheck-9ksvqHYX.js} +1 -1
  44. package/dist/{builderforcellm-syscheck-DrFJ638L.js → builderforcellm-syscheck-F5JMAr3p.js} +1 -1
  45. package/dist/{call-DxPWzV-k.js → call-BnAs_SER.js} +1 -1
  46. package/dist/{call-DFjBq0H2.js → call-D1Opj5ev.js} +1 -1
  47. package/dist/{call-DmAU4cRX.js → call-Du2LiaX6.js} +1 -1
  48. package/dist/{call-BbRf8gFM.js → call-T8ciwMTA.js} +1 -1
  49. package/dist/{channel-options-d4EwVQD0.js → channel-options-B7sRMp2v.js} +1 -1
  50. package/dist/{channel-options-CDixz6dT.js → channel-options-rhDBCtlp.js} +1 -1
  51. package/dist/{channel-web-DJa8JC9W.js → channel-web-CcCqUQrJ.js} +1 -1
  52. package/dist/{channels-cli-BgKy0MbE.js → channels-cli-BjnLW14T.js} +1 -1
  53. package/dist/{channels-cli-nNW0ezPM.js → channels-cli-DVWUBsmc.js} +1 -1
  54. package/dist/{chrome-BnEbJV3D.js → chrome-CFmcixaE.js} +1 -1
  55. package/dist/{chrome-a3X9_-nf.js → chrome-DXt86tmV.js} +1 -1
  56. package/dist/cli/daemon-cli.js +1 -1
  57. package/dist/{cli-DkWt7p2x.js → cli-BUqtALJK.js} +1 -1
  58. package/dist/{cli-C5MbcECQ.js → cli-K4reS6IS.js} +1 -1
  59. package/dist/{coding-tools.policy-NEPm7Mz1.js → coding-tools.policy-D9Ba8eDh.js} +1 -1
  60. package/dist/{coding-tools.policy-6qh9acJy.js → coding-tools.policy-ZhOdlcEI.js} +1 -1
  61. package/dist/{command-registry-COUcUWby.js → command-registry-B7uAoROP.js} +1 -1
  62. package/dist/{command-registry-4_K-lfW5.js → command-registry-CW16Mk2Y.js} +1 -1
  63. package/dist/{completion-cli-DlvHqL86.js → completion-cli-ZvXrCQqk.js} +1 -1
  64. package/dist/{completion-cli-B2qcVd6q.js → completion-cli-gyvx5ZXu.js} +1 -1
  65. package/dist/{completion-cli-DpFvU4Qn.js → completion-cli-n8UsdT91.js} +1 -1
  66. package/dist/{completion-cli-SdcQ-kQj.js → completion-cli-sKReGv3d.js} +1 -1
  67. package/dist/{config-_1Ca6jGb.js → config-BgV_FYSq.js} +1 -1
  68. package/dist/{config-toczWD3q.js → config-BpChMIJ6.js} +1 -1
  69. package/dist/{config-BTWlKwtB.js → config-D01EgOky.js} +1 -1
  70. package/dist/{config-27_FNba3.js → config-Dsnbi-a3.js} +1 -1
  71. package/dist/{config-cli-DeiQz5sY.js → config-cli-Bpo74mE5.js} +1 -1
  72. package/dist/{config-cli-CfczShaZ.js → config-cli-CF31O_5s.js} +1 -1
  73. package/dist/{config-guard-CD-Wq8kk.js → config-guard-BRUOk5YL.js} +1 -1
  74. package/dist/{config-guard-ClVl2FvD.js → config-guard-BUpQiSTW.js} +1 -1
  75. package/dist/{config-guard-B4in8l8I.js → config-guard-USCN-dq0.js} +1 -1
  76. package/dist/{config-validation-jpeXzoU3.js → config-validation-BGpSeNbh.js} +1 -1
  77. package/dist/{config-validation-C6u-z9bJ.js → config-validation-CdBJ-tZq.js} +1 -1
  78. package/dist/{configure-3W9C5LiT.js → configure-CWr61Ph2.js} +1 -1
  79. package/dist/configure-DhazB2qh.js +1 -0
  80. package/dist/{configure-BtXQW7ue.js → configure-DlcO1tWx.js} +1 -1
  81. package/dist/configure-MXheujvX.js +1 -0
  82. package/dist/{control-service-CJuuqNOE.js → control-service-2PkCt256.js} +1 -1
  83. package/dist/{control-service-qKfWP7VD.js → control-service-CcsbseZS.js} +1 -1
  84. package/dist/{control-service-izGyCWQs.js → control-service-qK1oboMo.js} +1 -1
  85. package/dist/{control-service-BbsswoMy.js → control-service-y3GYvIBg.js} +1 -1
  86. package/dist/{cron-cli-BrOM4s6N.js → cron-cli-BYu_lA8i.js} +1 -1
  87. package/dist/{cron-cli-CwtTX6pg.js → cron-cli-D_Og20iB.js} +1 -1
  88. package/dist/{daemon-cli-DyVsMf8p.js → daemon-cli-BNzthScZ.js} +1 -1
  89. package/dist/{daemon-cli-DlwOVDbt.js → daemon-cli-Bh3p0hui.js} +1 -1
  90. package/dist/{daemon-cli-Br0wu9xQ.js → daemon-cli-DxxKiKVN.js} +1 -1
  91. package/dist/{daemon-cli-DmicpZED.js → daemon-cli-emNxLkIw.js} +1 -1
  92. package/dist/{daemon-runtime-CtOr1ncS.js → daemon-runtime-9XitJmIL.js} +1 -1
  93. package/dist/{daemon-runtime-B4UjqdyJ.js → daemon-runtime-Dx800VUt.js} +1 -1
  94. package/dist/{deliver-BpLm3ktn.js → deliver--6OBF3LL.js} +1 -1
  95. package/dist/{deliver-9o_SE4ZK.js → deliver-ADpnRGRf.js} +1 -1
  96. package/dist/{deliver-D2VAVelb.js → deliver-BM6-damm.js} +1 -1
  97. package/dist/{deliver-BuZu68tp.js → deliver-CsG0cHbZ.js} +1 -1
  98. package/dist/{deps-CkJiJ6wc.js → deps-Dg_9rfXK.js} +1 -1
  99. package/dist/{devices-cli-BfXeDnbx.js → devices-cli-B8DXzcRP.js} +1 -1
  100. package/dist/{devices-cli-B9G6YOsS.js → devices-cli-BZkdWSx-.js} +1 -1
  101. package/dist/{directory-cli-BRCaiGOn.js → directory-cli-B78pAVI_.js} +1 -1
  102. package/dist/{directory-cli-D5ciZ5fY.js → directory-cli-CSaRkkL8.js} +1 -1
  103. package/dist/{dm-policy-shared-CRZpjRv0.js → dm-policy-shared-B9lW-AsK.js} +1 -1
  104. package/dist/{dm-policy-shared-Dhw9_6mi.js → dm-policy-shared-DYZ_T-az.js} +1 -1
  105. package/dist/{dns-cli-CgZ7oMcT.js → dns-cli-CLPGOFA1.js} +1 -1
  106. package/dist/{dns-cli-C4f4Tyij.js → dns-cli-dr5dHzfI.js} +1 -1
  107. package/dist/{doctor-completion-BSotFS6p.js → doctor-completion-94zme499.js} +1 -1
  108. package/dist/{doctor-completion-DVxbs-74.js → doctor-completion-CbF34DIH.js} +1 -1
  109. package/dist/{embedded-helpers-CEsr3aQ0.js → embedded-helpers-C9jpiwlw.js} +1 -1
  110. package/dist/{embedded-helpers-DK8_apW0.js → embedded-helpers-DdU30lmt.js} +1 -1
  111. package/dist/entry.js +1 -1
  112. package/dist/{exec-approvals-cli-YuOu7mVg.js → exec-approvals-cli-CS_uabo7.js} +1 -1
  113. package/dist/{exec-approvals-cli-BPFi82B0.js → exec-approvals-cli-ktB7M7WE.js} +1 -1
  114. package/dist/{gateway-cli-D2Bg1Um6.js → gateway-cli-CKcoLVMA.js} +5 -5
  115. package/dist/{gateway-cli-DFEo8C0z.js → gateway-cli-CuXBDBWe.js} +5 -5
  116. package/dist/{gateway-rpc-BXR_lVIx.js → gateway-rpc-B02y0PnE.js} +1 -1
  117. package/dist/{gateway-rpc-ByUcnQ7W.js → gateway-rpc-ff1RVb0_.js} +1 -1
  118. package/dist/{gemini-auth-CkD5jCPh.js → gemini-auth-DDR12zst.js} +1 -1
  119. package/dist/health-D0DZmCmh.js +1 -0
  120. package/dist/{health-yS3NRKvY.js → health-FO8MG5Ur.js} +1 -1
  121. package/dist/{health-DVo8a9yg.js → health-zrsgFZmR.js} +1 -1
  122. package/dist/{hooks-cli-B0lVee-j.js → hooks-cli-5Y4hnSX9.js} +1 -1
  123. package/dist/{hooks-cli-DsVmrQAG.js → hooks-cli-DpHZzRo2.js} +1 -1
  124. package/dist/index.js +2 -2
  125. package/dist/{ink-session-BitZ1wcY.js → ink-session-Dt9Q4iH-.js} +2 -2
  126. package/dist/{ink-session-CyAqXDla.js → ink-session-N8wCBzwk.js} +2 -2
  127. package/dist/{installs-CWd54ARy.js → installs-B_t2YXgq.js} +1 -1
  128. package/dist/{installs-C9A8QFiF.js → installs-DFiF4lGy.js} +1 -1
  129. package/dist/{io-3R_ZyUxB.js → io-BLBq4T2o.js} +1 -1
  130. package/dist/{io-DSIGyPrT.js → io-CXN4uLS2.js} +1 -1
  131. package/dist/{io-6jLoKffb.js → io-Ckd4NlvH.js} +1 -1
  132. package/dist/{io-CohJffHG.js → io-D9hC2aG0.js} +1 -1
  133. package/dist/{lifecycle-core-BpMvDXy1.js → lifecycle-core-D9Dg5Qps.js} +1 -1
  134. package/dist/{lifecycle-core-Dwb4gHjZ.js → lifecycle-core-uxjxTzFv.js} +1 -1
  135. package/dist/login-B3sDAgHb.js +1 -0
  136. package/dist/{login-C_ZdMOvv.js → login-CwwuaXtb.js} +1 -1
  137. package/dist/{login-DtDUyFO3.js → login-D1bVUPlv.js} +1 -1
  138. package/dist/{login-CEnjUo5c.js → login-GLDax56V.js} +1 -1
  139. package/dist/{login-qr-B9lyIZVD.js → login-qr-CbiUcBLy.js} +1 -1
  140. package/dist/{login-qr-BCBsxwhT.js → login-qr-Cp0YqK4e.js} +1 -1
  141. package/dist/{logs-cli-CdM5W3HE.js → logs-cli-Cy11HfSG.js} +1 -1
  142. package/dist/{logs-cli-jh5Xn3TD.js → logs-cli-nD36c-Y1.js} +1 -1
  143. package/dist/{manager-CRba8roB.js → manager-BeohB4-8.js} +1 -1
  144. package/dist/{manager-B3IJ_IKf.js → manager-CTTXDBt3.js} +1 -1
  145. package/dist/{manager-TGVy_fAb.js → manager-CoQMlcrf.js} +1 -1
  146. package/dist/{manager-DwywI_5-.js → manager-DSz61dXv.js} +1 -1
  147. package/dist/{memory-cli-BlayFTAM.js → memory-cli-BpAiRntI.js} +1 -1
  148. package/dist/{memory-cli-DRz4wtHk.js → memory-cli-CbkWGjRn.js} +1 -1
  149. package/dist/{memory-cli-PdyTQ84w.js → memory-cli-CrBMLM2P.js} +1 -1
  150. package/dist/{memory-cli-ivAs7q7v.js → memory-cli-CveeVOWH.js} +1 -1
  151. package/dist/{model-catalog-CQOdhMUY.js → model-catalog-B29yeBYS.js} +1 -1
  152. package/dist/{model-catalog-CiiFJX77.js → model-catalog-BeBXvbFm.js} +1 -1
  153. package/dist/model-catalog-CMKHKuBL.js +1 -0
  154. package/dist/{model-catalog-C6UrZ0uG.js → model-catalog-DjNiebr7.js} +1 -1
  155. package/dist/{model-discovery-C9Xm95uL.js → model-discovery-D0i1JpiL.js} +1 -1
  156. package/dist/{model-picker-swoSwauV.js → model-picker-CGDNPRPc.js} +1 -1
  157. package/dist/model-picker-CGEF8yhc.js +1 -0
  158. package/dist/model-picker-DeUNOC78.js +1 -0
  159. package/dist/{model-picker-BUePD7Zg.js → model-picker-EIhpfOZa.js} +1 -1
  160. package/dist/{model-selection-9bRFKBI_.js → model-selection-DG9J_VTz.js} +1 -1
  161. package/dist/{models-BNivsd2o.js → models-BjIzVQYX.js} +2 -2
  162. package/dist/{models-DQeSIY6M.js → models-JoqOgEF5.js} +1 -1
  163. package/dist/{models-cli-KokGgWeP.js → models-cli-B2zbchgs.js} +1 -1
  164. package/dist/{models-cli-BcNxU4P_.js → models-cli-CkFdc8NN.js} +2 -2
  165. package/dist/{node-cli-DIMh3X2F.js → node-cli-CXnuxiBq.js} +1 -1
  166. package/dist/{node-cli-EmTU-Gh0.js → node-cli-oVyjVnb7.js} +1 -1
  167. package/dist/{nodes-cli-BX8TznFK.js → nodes-cli-BBVotxNt.js} +1 -1
  168. package/dist/{nodes-cli-DyHovdAc.js → nodes-cli-DVMBSUhK.js} +1 -1
  169. package/dist/{onboard-DfMVh1bM.js → onboard-BItclJp0.js} +1 -1
  170. package/dist/{onboard-BVmZ4jMw.js → onboard-CqvHIvKj.js} +1 -1
  171. package/dist/{onboard-auth.credentials-yagR-VMG.js → onboard-auth.credentials-DneFSdYg.js} +1 -1
  172. package/dist/{onboard-auth.credentials-BuT-etnE.js → onboard-auth.credentials-DpitLlzw.js} +1 -1
  173. package/dist/onboard-channels-B91m5S3w.js +1 -0
  174. package/dist/onboard-channels-BOoPtYbF.js +1 -0
  175. package/dist/{onboard-channels-B6QDFkkK.js → onboard-channels-Dn0u5C-C.js} +1 -1
  176. package/dist/{onboard-channels-C8FCFn29.js → onboard-channels-vhtccaIV.js} +1 -1
  177. package/dist/onboard-custom-BN0uzSq_.js +1 -0
  178. package/dist/{onboard-custom-D1nd8Hlu.js → onboard-custom-BYIza2e7.js} +1 -1
  179. package/dist/onboard-custom-CCFthqto.js +1 -0
  180. package/dist/{onboard-custom-C_BI0ZXn.js → onboard-custom-Ckf0xKXY.js} +1 -1
  181. package/dist/{onboard-helpers-CGlLpagb.js → onboard-helpers-B8I5AVyb.js} +1 -1
  182. package/dist/{onboard-helpers-CckrS8_K.js → onboard-helpers-Ce_c4Raj.js} +1 -1
  183. package/dist/{onboard-helpers-Cf5dNq7-.js → onboard-helpers-CiHzTaFX.js} +1 -1
  184. package/dist/{onboard-helpers-BvIZ4-R5.js → onboard-helpers-DC-nMl-V.js} +1 -1
  185. package/dist/{onboard-interactive-DYJttZ2w.js → onboard-interactive-Cl2K3EYn.js} +1 -1
  186. package/dist/{onboard-interactive-zgjmwJz-.js → onboard-interactive-JNux9zfA.js} +1 -1
  187. package/dist/{onboard-interactive-B3-KBZbZ.js → onboard-interactive-J_ObFzeW.js} +1 -1
  188. package/dist/{onboard-interactive-Dc_7URYb.js → onboard-interactive-OUNsvlh0.js} +1 -1
  189. package/dist/{onboard-remote-D5lR2lVm.js → onboard-remote-0-q7MG9t.js} +1 -1
  190. package/dist/{onboard-remote-BmSyHww1.js → onboard-remote-CgAAEZpq.js} +1 -1
  191. package/dist/{onboard-remote-CzzQMZ3X.js → onboard-remote-DKXHDdBD.js} +1 -1
  192. package/dist/{onboard-remote-DcuX8b2g.js → onboard-remote-cB8j9RG-.js} +1 -1
  193. package/dist/{onboard-skills-ILHIeg1R.js → onboard-skills-47upVdA2.js} +1 -1
  194. package/dist/{onboard-skills-BPlNN_-T.js → onboard-skills-9Um4TL2x.js} +1 -1
  195. package/dist/{onboard-skills-DIhjDMom.js → onboard-skills-DhCmvhJY.js} +1 -1
  196. package/dist/{onboard-skills-CI1OtWsE.js → onboard-skills-mI2kfvdT.js} +1 -1
  197. package/dist/{onboarding-D4-HDbmU.js → onboarding-BSENgR9C.js} +5 -5
  198. package/dist/{onboarding-CP9rrz8y.js → onboarding-CIaZLNc1.js} +5 -5
  199. package/dist/{onboarding.finalize-C2kZi7F0.js → onboarding.finalize-BwOpvoPE.js} +1 -1
  200. package/dist/{onboarding.finalize-BfWXPgX7.js → onboarding.finalize-yMK-g7Uy.js} +1 -1
  201. package/dist/{onboarding.gateway-config-Cd7_bXVs.js → onboarding.gateway-config-Kn1O-QFl.js} +1 -1
  202. package/dist/{onboarding.gateway-config-Bd8HJkso.js → onboarding.gateway-config-huOjFf8D.js} +1 -1
  203. package/dist/{openai-model-default-Cp3nf21W.js → openai-model-default-CH2-2Hvk.js} +1 -1
  204. package/dist/{openai-model-default-BMRrqTmH.js → openai-model-default-pfoEzWYJ.js} +1 -1
  205. package/dist/{outbound-BRInCJD9.js → outbound-BdeHcMAo.js} +1 -1
  206. package/dist/{outbound-CAtBpFoD.js → outbound-BylJYD7n.js} +1 -1
  207. package/dist/{outbound-OI-t5zZ0.js → outbound-CAirtWr1.js} +1 -1
  208. package/dist/{outbound-CnIvOJlU.js → outbound-VNcvF2MG.js} +1 -1
  209. package/dist/{outbound-send-deps-m6DqOma_.js → outbound-send-deps-B3Lg-uqF.js} +1 -1
  210. package/dist/{pairing-cli-CEr0yEsc.js → pairing-cli-5RtPvz2i.js} +1 -1
  211. package/dist/{pairing-cli-Dxfoni-F.js → pairing-cli-C_Mj6Dy4.js} +1 -1
  212. package/dist/{pairing-labels-3j_iRYOO.js → pairing-labels-BJPrScRl.js} +1 -1
  213. package/dist/{pairing-labels-BW5jQZlr.js → pairing-labels-oA-nKTaW.js} +1 -1
  214. package/dist/{pairing-store-QDb6lhIU.js → pairing-store-YRy7EBgI.js} +1 -1
  215. package/dist/{pairing-store-CbvMJhD3.js → pairing-store-ti3FEkmr.js} +1 -1
  216. package/dist/{plugin-auto-enable-BV9K9Vhr.js → plugin-auto-enable-Cupr4wbt.js} +1 -1
  217. package/dist/{plugin-auto-enable-DDry2fA6.js → plugin-auto-enable-D8gKiE3F.js} +1 -1
  218. package/dist/plugin-registry-BEfyc2f_.js +1 -0
  219. package/dist/{plugin-registry-C-_GA65s.js → plugin-registry-BoPaef5I.js} +1 -1
  220. package/dist/{plugin-registry-SAdxNUwm.js → plugin-registry-CxnuHO_n.js} +1 -1
  221. package/dist/plugin-registry-D0tIqo8L.js +1 -0
  222. package/dist/plugin-sdk/{accounts-Cy3WCbWg.js → accounts-BwreSNAR.js} +1 -1
  223. package/dist/plugin-sdk/{active-listener-DVWVNlT9.js → active-listener-DpQ7aGYd.js} +1 -1
  224. package/dist/plugin-sdk/agent-runtime/src/infra/workflow-telemetry.d.ts +12 -1
  225. package/dist/plugin-sdk/{agent-scope-DgKN27hJ.js → agent-scope-BQByW0cD.js} +1 -1
  226. package/dist/plugin-sdk/{api-key-rotation-ftXf7mBZ.js → api-key-rotation-7YdImWrh.js} +1 -1
  227. package/dist/plugin-sdk/{audio-preflight-CfTmmeS-.js → audio-preflight-EbkaATDO.js} +1 -1
  228. package/dist/plugin-sdk/{auth-json-BrNBg87n.js → auth-json-DK6qod1_.js} +1 -1
  229. package/dist/plugin-sdk/{bindings-CH-YLOLC.js → bindings-CDEzl4kl.js} +1 -1
  230. package/dist/plugin-sdk/{channel-web-B6rg0Rbf.js → channel-web-D2KuONp0.js} +1 -1
  231. package/dist/plugin-sdk/{chrome-CuXP-hes.js → chrome-SOXFIkUM.js} +1 -1
  232. package/dist/plugin-sdk/{chunk-C94IAOuf.js → chunk-cW0POl22.js} +1 -1
  233. package/dist/plugin-sdk/{command-format-B3XMq_73.js → command-format-CAX9XFjI.js} +1 -1
  234. package/dist/plugin-sdk/{common-n0l_XN-S.js → common-BxEWhN2X.js} +1 -1
  235. package/dist/plugin-sdk/{config-DsXZsCkJ.js → config-v1EU9Ll8.js} +2 -2
  236. package/dist/plugin-sdk/{fetch-B-GxSYRO.js → fetch-DH0Y8iyO.js} +1 -1
  237. package/dist/plugin-sdk/index.js +1 -1
  238. package/dist/plugin-sdk/{login-_my8QwPP.js → login-d1zBgykF.js} +1 -1
  239. package/dist/plugin-sdk/{login-qr-BaePtXuG.js → login-qr-B6exvQnN.js} +1 -1
  240. package/dist/plugin-sdk/{manager-BsC-4ymy.js → manager-BH_bmGds.js} +1 -1
  241. package/dist/plugin-sdk/{markdown-tables-BUfhHgfs.js → markdown-tables-Epim9b-0.js} +1 -1
  242. package/dist/plugin-sdk/{message-channel-CuZ2xOAM.js → message-channel-sBPQc_-T.js} +1 -1
  243. package/dist/plugin-sdk/{model-catalog-yuiXVcmw.js → model-catalog-cXsza5GU.js} +1 -1
  244. package/dist/plugin-sdk/{model-selection-BtgvnqB5.js → model-selection-K82MAGlL.js} +1 -1
  245. package/dist/plugin-sdk/{outbound-D_attiyO.js → outbound-Chn_H1O7.js} +1 -1
  246. package/dist/plugin-sdk/{plugins-BdkC9v5E.js → plugins-CaUOZBVb.js} +1 -1
  247. package/dist/plugin-sdk/{pw-ai-A7Rathx6.js → pw-ai-BIiJF7ZD.js} +1 -1
  248. package/dist/plugin-sdk/{qmd-manager-Dxn0jCpE.js → qmd-manager-BRe5fGZw.js} +1 -1
  249. package/dist/plugin-sdk/{registry-CZHRcH-q.js → registry-DJq2Cvo9.js} +1 -1
  250. package/dist/plugin-sdk/{render-CuA_WRX5.js → render-BUCRXPIk.js} +1 -1
  251. package/dist/plugin-sdk/{replies-DmLfO-pg.js → replies-Cz5OD3qN.js} +1 -1
  252. package/dist/plugin-sdk/{reply-3-ne-N_7.js → reply-D5Uk7pUv.js} +9 -9
  253. package/dist/plugin-sdk/{reply-prefix-w7kAvH11.js → reply-prefix-CCymsmsP.js} +1 -1
  254. package/dist/plugin-sdk/{resolve-route-0sbvl4ZN.js → resolve-route-DN1J7Wyc.js} +1 -1
  255. package/dist/plugin-sdk/{runner-4UfrAQnx.js → runner-CYkuO7Fh.js} +4 -4
  256. package/dist/plugin-sdk/{session-BB-yfDWx.js → session-D5jHDo78.js} +1 -1
  257. package/dist/plugin-sdk/{sqlite-JjFgDV-H.js → sqlite-BlMLqMl8.js} +1 -1
  258. package/dist/plugin-sdk/{subsystem-D0Ril4rt.js → subsystem-COTa5Ly_.js} +1 -1
  259. package/dist/plugin-sdk/{tool-images-WRTP95FT.js → tool-images-DSpchb4x.js} +1 -1
  260. package/dist/plugin-sdk/{tool-loop-detection-sC_rhJfb.js → tool-loop-detection-BP6u-mbh.js} +1 -1
  261. package/dist/plugin-sdk/web-BbganhKi.js +1 -0
  262. package/dist/plugin-sdk/{whatsapp-actions-ThxQ5niy.js → whatsapp-actions-CZUqxmP1.js} +1 -1
  263. package/dist/{plugins-BIG8NDB9.js → plugins-Cx29kkDj.js} +1 -1
  264. package/dist/{plugins-iAq-Gr8l.js → plugins-DJqou2hi.js} +1 -1
  265. package/dist/{plugins-cli-CpaVUv_r.js → plugins-cli-Bu-A8aGy.js} +1 -1
  266. package/dist/{plugins-cli-CPkSgvdL.js → plugins-cli-CGFsQDVW.js} +1 -1
  267. package/dist/{program-context-BCwL3wlM.js → program-context-ClBa4lUj.js} +1 -1
  268. package/dist/{program-2w7Ue902.js → program-vVCzU0cH.js} +2 -2
  269. package/dist/{prompt-select-styled-hB_nLOn1.js → prompt-select-styled-BJPGccTJ.js} +1 -1
  270. package/dist/{prompt-select-styled-Dd5swW2b.js → prompt-select-styled-BK74z6FF.js} +1 -1
  271. package/dist/{provider-auth-helpers-BpTnp2Yr.js → provider-auth-helpers-B84m5VMc.js} +1 -1
  272. package/dist/{provider-auth-helpers-CJTG_tVx.js → provider-auth-helpers-hNwpK_hl.js} +1 -1
  273. package/dist/{provider-dispatcher-TWwBT2aH.js → provider-dispatcher-BjR5DE3O.js} +1 -1
  274. package/dist/provider-dispatcher-DgOeVjcL.js +1 -0
  275. package/dist/{provider-usage-BdrU4cIE.js → provider-usage-B-wPVN_j.js} +1 -1
  276. package/dist/{provider-usage-Bn4ZrnU7.js → provider-usage-B8lFHp0K.js} +1 -1
  277. package/dist/{push-apns-C4sJnHbO.js → push-apns-BTPPvY81.js} +1 -1
  278. package/dist/{push-apns-CiD3rrVv.js → push-apns-CscYUS0D.js} +1 -1
  279. package/dist/{pw-ai-DSEj1QrV.js → pw-ai-CLS_VZ8p.js} +1 -1
  280. package/dist/{pw-ai-dNZY-qBs.js → pw-ai-D5og_rIf.js} +1 -1
  281. package/dist/{qr-cli-qr-SFLZW.js → qr-cli-CAquM1Zk.js} +1 -1
  282. package/dist/{qr-cli-B45dCV0o.js → qr-cli-GsR8n1cm.js} +1 -1
  283. package/dist/{qr-cli-CMlAIzrD.js → qr-cli-kAKgaL-T.js} +1 -1
  284. package/dist/{qr-cli-CySNSEFj.js → qr-cli-uyxNf-cQ.js} +1 -1
  285. package/dist/{register.agent-BA6LIJSb.js → register.agent-BwTCfyeJ.js} +1 -1
  286. package/dist/{register.agent-D2uCH8jZ.js → register.agent-Dhdo3_7k.js} +1 -1
  287. package/dist/register.configure-B0m0G3ot.js +1 -0
  288. package/dist/register.configure-D3cbjmTz.js +1 -0
  289. package/dist/{register.maintenance-BELfCO_C.js → register.maintenance-C6ocMld2.js} +1 -1
  290. package/dist/{register.maintenance-DukWFS_D.js → register.maintenance-CbE2zSyc.js} +1 -1
  291. package/dist/{register.message-DiZRRAE5.js → register.message-Jn4u533_.js} +1 -1
  292. package/dist/{register.message-8iGDhO8h.js → register.message-Tu1hlM0m.js} +1 -1
  293. package/dist/{register.onboard-B9DMNfHE.js → register.onboard-B34211N6.js} +1 -1
  294. package/dist/{register.onboard-Dt7rzAq-.js → register.onboard-S1d2WAE4.js} +1 -1
  295. package/dist/{register.setup-CSF-2ImP.js → register.setup-CJPyAwCQ.js} +1 -1
  296. package/dist/{register.setup-BRRVPrx7.js → register.setup-Sg8f3nsH.js} +1 -1
  297. package/dist/{register.status-health-sessions-D6wdwPwV.js → register.status-health-sessions-BlgVxoZ4.js} +1 -1
  298. package/dist/{register.status-health-sessions-ZSufYw5j.js → register.status-health-sessions-DwADQJ74.js} +1 -1
  299. package/dist/{register.subclis-4eDV9jKH.js → register.subclis-C9V_M-Lk.js} +1 -1
  300. package/dist/{register.subclis-Cr9DoYcv.js → register.subclis-pWn9XObB.js} +1 -1
  301. package/dist/{replies-DbkT_5BV.js → replies-BOGMDhSN.js} +1 -1
  302. package/dist/{replies-CzV-RFUG.js → replies-BXbV02ik.js} +1 -1
  303. package/dist/{replies-DIBQzxGp.js → replies-CUv671JF.js} +1 -1
  304. package/dist/{replies-Bd2RPZwQ.js → replies-DokbEfJD.js} +1 -1
  305. package/dist/{reply-Cd3vVnD7.js → reply-GY1C8tcv.js} +10 -10
  306. package/dist/{routes-BzfLvF8W.js → routes-DZntyPY6.js} +1 -1
  307. package/dist/{routes-lclJHOYY.js → routes-_iZdG1Fo.js} +1 -1
  308. package/dist/{rpc-BLqXRn5R.js → rpc-CbUnwStf.js} +1 -1
  309. package/dist/{rpc-DcQNGQlj.js → rpc-Cwm4gchc.js} +1 -1
  310. package/dist/{run-main-DLcDEJgv.js → run-main-DQMbgbcF.js} +1 -1
  311. package/dist/{runner-DwWmciCt.js → runner-Cu9NJouV.js} +1 -1
  312. package/dist/{runner-SxCr9kXD.js → runner-eTTUbLAK.js} +1 -1
  313. package/dist/{sandbox-BZibn6PX.js → sandbox-C4AKi2EX.js} +1 -1
  314. package/dist/{sandbox-z9t_PRf9.js → sandbox-DvKMuAXL.js} +1 -1
  315. package/dist/{sandbox-cli-BtGs0dBR.js → sandbox-cli-C0LhzYq_.js} +1 -1
  316. package/dist/{sandbox-cli-B8FpLgyY.js → sandbox-cli-De0iaoHB.js} +1 -1
  317. package/dist/{security-cli-D8Q8I7fn.js → security-cli-BvEfiO8m.js} +1 -1
  318. package/dist/{security-cli-IIMR7Pb4.js → security-cli-BzsQ0XQh.js} +1 -1
  319. package/dist/{send-DnMzjS7L.js → send-2dRKMWtl.js} +1 -1
  320. package/dist/{send-DerUBvXW.js → send-Aw8wK3vK.js} +1 -1
  321. package/dist/{send-BvroeIQ6.js → send-B7H8Ae5j.js} +1 -1
  322. package/dist/{send-4d9NswaD.js → send-BP5osGBo.js} +1 -1
  323. package/dist/{send-BU_-BGmf.js → send-BVal50Bi.js} +1 -1
  324. package/dist/{send-CxG2suVM.js → send-Bbo7TXLx.js} +1 -1
  325. package/dist/{send-CBBziNqM.js → send-BxoVLIy1.js} +1 -1
  326. package/dist/{send-dDpSBSBo.js → send-COKUbcqs.js} +1 -1
  327. package/dist/{send--12DIueA.js → send-CTw3PqN4.js} +1 -1
  328. package/dist/{send-UFtylOiq.js → send-CYGOPcKq.js} +1 -1
  329. package/dist/{send-DyF1Xy9K.js → send-ChGpVO3O.js} +1 -1
  330. package/dist/{send-Q-uTkSFE.js → send-Cqea2UFo.js} +1 -1
  331. package/dist/{send-j15662lv.js → send-CrFWgJKx.js} +1 -1
  332. package/dist/{send-gDb60Hk-.js → send-CwK8QBR3.js} +1 -1
  333. package/dist/{send-CceNWtYE.js → send-DqR7Rxzm.js} +1 -1
  334. package/dist/{send-CJHXQvVl.js → send-DxwfUIN-.js} +1 -1
  335. package/dist/{send-ByCVQQVz.js → send-KgN1P41U.js} +1 -1
  336. package/dist/{send-B1rJLLpr.js → send-bNp87SIq.js} +1 -1
  337. package/dist/{send-B_1BtyfA.js → send-kkm_zrHQ.js} +1 -1
  338. package/dist/{send-BJDzwYJN.js → send-l3ge4wkC.js} +1 -1
  339. package/dist/{server-context-DJZT7Upf.js → server-context-CQ2v4BAx.js} +1 -1
  340. package/dist/{server-context-owOmmyUM.js → server-context-CttALzrW.js} +1 -1
  341. package/dist/{server-node-events-54d8Rmjl.js → server-node-events-CIMO6Vae.js} +1 -1
  342. package/dist/{server-node-events-CSFVqgxX.js → server-node-events-iCF2ngcN.js} +1 -1
  343. package/dist/{session-BzQdcCqN.js → session-BJHsjD3z.js} +1 -1
  344. package/dist/{session-4FpEJvkE.js → session-C_b1ttHJ.js} +1 -1
  345. package/dist/{session-dirs-OxQuIvJW.js → session-dirs-Bvbgw0GC.js} +1 -1
  346. package/dist/{session-dirs-D_ARkyw0.js → session-dirs-DHaoq7zc.js} +1 -1
  347. package/dist/{session-utils-GMvum00v.js → session-utils-Dxou8SbO.js} +1 -1
  348. package/dist/{sessions-Bl1wwotX.js → sessions-BA8Se_bT.js} +1 -1
  349. package/dist/{sessions-CdanN_ZI.js → sessions-BuZVmOWt.js} +1 -1
  350. package/dist/{sessions-B5dwRhUC.js → sessions-DvbW0FNJ.js} +1 -1
  351. package/dist/{sessions-B1t7qeEn.js → sessions-DvqsIg0M.js} +1 -1
  352. package/dist/{shared-xj-xaKFi.js → shared-BBOiNdjf.js} +1 -1
  353. package/dist/{shared-BPN3qd7G.js → shared-C2orjbTD.js} +1 -1
  354. package/dist/{skill-scanner-U3AJgjqc.js → skill-scanner-BEvov9QH.js} +1 -1
  355. package/dist/{skill-scanner-DEmbPsRh.js → skill-scanner-OTLeRZ_p.js} +1 -1
  356. package/dist/{skills-cli-CIdnXa3B.js → skills-cli-C1BOgB3y.js} +1 -1
  357. package/dist/{skills-cli-BXbGr7vl.js → skills-cli-CFT2Aq5R.js} +1 -1
  358. package/dist/{skills-install-Btw_GHbI.js → skills-install-LlKntDHa.js} +1 -1
  359. package/dist/{skills-install-DMHQRpIl.js → skills-install-tx5Mahav.js} +1 -1
  360. package/dist/{status-DXaDS_0w.js → status-Bh8V7kjv.js} +1 -1
  361. package/dist/{status-BxeKmkVr.js → status-BtBHmhQh.js} +1 -1
  362. package/dist/{status-BkcmeZg6.js → status-CpwD4y9B.js} +1 -1
  363. package/dist/status-CqaTmyih.js +1 -0
  364. package/dist/{status-DouJcFzf.js → status-yXz8PUbL.js} +1 -1
  365. package/dist/{status.update-C9iy31xr.js → status.update-CdgsLBPg.js} +1 -1
  366. package/dist/{status.update-KYyRSDZY.js → status.update-hzMro-BT.js} +1 -1
  367. package/dist/{subagent-registry-Dr20nzwk.js → subagent-registry-CaRUNwCj.js} +1 -1
  368. package/dist/{subagent-registry-CyGxu3kP.js → subagent-registry-DDEN4oJi.js} +10 -10
  369. package/dist/{subagent-registry-BiXkIDeh.js → subagent-registry-DYYfeIc3.js} +1 -1
  370. package/dist/{system-cli-b4YgXPHv.js → system-cli-4aii1JYf.js} +1 -1
  371. package/dist/{system-cli-C7YzJeP4.js → system-cli-CfkDD3FV.js} +1 -1
  372. package/dist/{tui-DylWbrDx.js → tui-DnVRxfI8.js} +2 -2
  373. package/dist/{tui-BwWMByVp.js → tui-JfWoLGIV.js} +2 -2
  374. package/dist/{tui-cli-C_TTgabr.js → tui-cli-CGjg2Eb5.js} +1 -1
  375. package/dist/{tui-cli-Bh1V8-w9.js → tui-cli-cd7Efw5u.js} +1 -1
  376. package/dist/{tui-setup-check-DJZCJokQ.js → tui-setup-check-BEHm9wwo.js} +1 -1
  377. package/dist/{tui-setup-check-BABAyl-e.js → tui-setup-check-DK8vdhLI.js} +1 -1
  378. package/dist/{tui-stream-assembler-ign_cPkv.js → tui-stream-assembler-8ud9oyMK.js} +1 -1
  379. package/dist/{tui-stream-assembler-q9GANTDr.js → tui-stream-assembler-Br15rhRH.js} +1 -1
  380. package/dist/{update-BUzcmoDf.js → update-B5yKFeGO.js} +1 -1
  381. package/dist/{update-D6U-V8Au.js → update-DodoQDCk.js} +1 -1
  382. package/dist/{update-cli-DUrUIrYQ.js → update-cli-CfJJcSUS.js} +1 -1
  383. package/dist/{update-cli-CA3LuuJ7.js → update-cli-x8Ocbf-0.js} +1 -1
  384. package/dist/{usage-cli-CfEg1_NZ.js → usage-cli-CN7L1YRG.js} +1 -1
  385. package/dist/{usage-cli-CpbYMXxS.js → usage-cli-CQmokGkG.js} +1 -1
  386. package/dist/{web-D-NSyF6b.js → web-BXLk9UT2.js} +1 -1
  387. package/dist/web-Btgs8oWv.js +1 -0
  388. package/dist/{webhooks-cli-B_f61rq7.js → webhooks-cli-DIo8p3lk.js} +1 -1
  389. package/dist/{webhooks-cli-Bi0t3w6P.js → webhooks-cli-DhxEtiFt.js} +1 -1
  390. package/dist/{whatsapp-actions-JbF2MrTV.js → whatsapp-actions-B7r9AyZN.js} +1 -1
  391. package/dist/{whatsapp-actions-BkCMhD9X.js → whatsapp-actions-DX2QU6Gs.js} +1 -1
  392. package/dist/{with-timeout-T07SJo4N.js → with-timeout-B_p5pWDv.js} +1 -1
  393. package/dist/{with-timeout-Bwq-GyUQ.js → with-timeout-GDLpcjW7.js} +1 -1
  394. package/dist/workflow-telemetry-BMTg5lPd.js +1 -0
  395. package/dist/workflow-telemetry-Bg8MVUr_.js +2 -0
  396. package/dist/workflow-telemetry-Do1UsYwM.js +1 -0
  397. package/dist/workflow-telemetry-DqBPhVL4.js +2 -0
  398. package/package.json +1 -1
  399. package/dist/agents-DsZ5vLKE.js +0 -1
  400. package/dist/auth-choice-Btd2Rxxd.js +0 -1
  401. package/dist/auth-choice-CVV9wRFN.js +0 -1
  402. package/dist/auth-choice.apply-BOK9XRCQ.js +0 -1
  403. package/dist/auth-choice.apply-Cv-BiV5Q.js +0 -1
  404. package/dist/auth-choice.apply.transformers-CXywS3GZ.js +0 -1
  405. package/dist/builderforce-onboarding-Dq6VUSKZ.js +0 -24
  406. package/dist/builderforce-onboarding-DuUfZ6oL.js +0 -24
  407. package/dist/configure-CWBBFk3F.js +0 -1
  408. package/dist/configure-fHVOAucW.js +0 -1
  409. package/dist/health-GLcAfqDz.js +0 -1
  410. package/dist/login-CPyEf5h6.js +0 -1
  411. package/dist/model-catalog-J7R-tJDu.js +0 -1
  412. package/dist/model-picker-D2bcWrtu.js +0 -1
  413. package/dist/model-picker-DO1HtEEm.js +0 -1
  414. package/dist/onboard-channels-CmqKsAoW.js +0 -1
  415. package/dist/onboard-channels-Db0P4iWl.js +0 -1
  416. package/dist/onboard-custom-BABqIYa4.js +0 -1
  417. package/dist/onboard-custom-VpW3UC8u.js +0 -1
  418. package/dist/plugin-registry-B-UOeWqM.js +0 -1
  419. package/dist/plugin-registry-BjMr3yXM.js +0 -1
  420. package/dist/plugin-sdk/web-CThgoHQp.js +0 -1
  421. package/dist/provider-dispatcher-C4nHaNqn.js +0 -1
  422. package/dist/register.configure-DAL38e7r.js +0 -1
  423. package/dist/register.configure-DZG7-WVi.js +0 -1
  424. package/dist/status-BTYqHVha.js +0 -1
  425. package/dist/web-P6QsgmSD.js +0 -1
  426. package/dist/workflow-telemetry-B8Im0mPk.js +0 -1
  427. package/dist/workflow-telemetry-DLEnm5TI.js +0 -2
  428. package/dist/workflow-telemetry-Dc_oseV7.js +0 -2
  429. package/dist/workflow-telemetry-Dkm3mofI.js +0 -1
  430. /package/dist/{devtools-CI7JyCXv.js → devtools-Cg4F-l9O.js} +0 -0
  431. /package/dist/{devtools-eMFaIsAT.js → devtools-Dl2DACSO.js} +0 -0
  432. /package/dist/{github-copilot-token-D3gHtNUu.js → github-copilot-token-BlyiXyTy.js} +0 -0
  433. /package/dist/{github-copilot-token-DHP2kAiN.js → github-copilot-token-D5sB2AUI.js} +0 -0
  434. /package/dist/{onboard-hooks-Cenav0eW.js → onboard-hooks-BaOSgxs9.js} +0 -0
  435. /package/dist/{onboard-hooks-Ce20rwpW.js → onboard-hooks-fO5eeDe_.js} +0 -0
  436. /package/dist/{qmd-manager-DVd_aWEV.js → qmd-manager-BgplOjHN.js} +0 -0
  437. /package/dist/{qmd-manager-keHvLmvP.js → qmd-manager-COUi_Fqb.js} +0 -0
@@ -1 +1 @@
1
- import{O as info,R as isRich,z as theme}from"./utils-BP60e80M.js";import{H as resolveConfiguredModelRef,_n as DEFAULT_PROVIDER,gn as DEFAULT_MODEL,hn as DEFAULT_CONTEXT_TOKENS}from"./auth-profiles-C1VbcUOm.js";import{C as parseAgentSessionKey}from"./session-key-CksCYipj.js";import{r as loadConfig}from"./io-CohJffHG.js";import{a as loadSessionStore,k as resolveFreshSessionTotalTokens}from"./sessions-Bl1wwotX.js";import{c as resolveStorePath}from"./paths-ClsbsPQP.js";import{n as formatTimeAgo}from"./format-relative-CruqE52s.js";import{l as resolveSessionModelRef,n as classifySessionKey,u as lookupContextTokens}from"./session-utils-GMvum00v.js";const formatKTokens=value=>`${(value/1e3).toFixed(value>=1e4?0:1)}k`,truncateKey=key=>key.length<=26?key:`${key.slice(0,16)}...${key.slice(-6)}`,colorByPct=(label,pct,rich)=>!rich||pct===null?label:pct>=95?theme.error(label):pct>=80?theme.warn(label):pct>=60?theme.success(label):theme.muted(label),formatTokensCell=(total,contextTokens,rich)=>{if(total===void 0){let label=`unknown/${contextTokens?formatKTokens(contextTokens):`?`} (?%)`;return rich?theme.muted(label.padEnd(20)):label.padEnd(20)}let totalLabel=formatKTokens(total),ctxLabel=contextTokens?formatKTokens(contextTokens):`?`,pct=contextTokens?Math.min(999,Math.round(total/contextTokens*100)):null;return colorByPct(`${totalLabel}/${ctxLabel} (${pct??`?`}%)`.padEnd(20),pct,rich)},formatKindCell=(kind,rich)=>{let label=kind.padEnd(6);return rich?kind===`group`?theme.accentBright(label):kind===`global`?theme.warn(label):kind===`direct`?theme.accent(label):theme.muted(label):label},formatAgeCell=(updatedAt,rich)=>{let padded=(updatedAt?formatTimeAgo(Date.now()-updatedAt):`unknown`).padEnd(9);return rich?theme.muted(padded):padded},formatModelCell=(model,rich)=>{let label=(model??`unknown`).padEnd(14);return rich?theme.info(label):label},formatFlagsCell=(row,rich)=>{let label=[row.thinkingLevel?`think:${row.thinkingLevel}`:null,row.verboseLevel?`verbose:${row.verboseLevel}`:null,row.reasoningLevel?`reasoning:${row.reasoningLevel}`:null,row.elevatedLevel?`elev:${row.elevatedLevel}`:null,row.responseUsage?`usage:${row.responseUsage}`:null,row.groupActivation?`activation:${row.groupActivation}`:null,row.systemSent?`system`:null,row.abortedLastRun?`aborted`:null,row.sessionId?`id:${row.sessionId}`:null].filter(Boolean).join(` `);return label.length===0?``:rich?theme.muted(label):label};function toRows(store){return Object.entries(store).map(([key,entry])=>{let updatedAt=entry?.updatedAt??null;return{key,kind:classifySessionKey(key,entry),updatedAt,ageMs:updatedAt?Date.now()-updatedAt:null,sessionId:entry?.sessionId,systemSent:entry?.systemSent,abortedLastRun:entry?.abortedLastRun,thinkingLevel:entry?.thinkingLevel,verboseLevel:entry?.verboseLevel,reasoningLevel:entry?.reasoningLevel,elevatedLevel:entry?.elevatedLevel,responseUsage:entry?.responseUsage,groupActivation:entry?.groupActivation,inputTokens:entry?.inputTokens,outputTokens:entry?.outputTokens,totalTokens:entry?.totalTokens,totalTokensFresh:entry?.totalTokensFresh,model:entry?.model,modelProvider:entry?.modelProvider,providerOverride:entry?.providerOverride,modelOverride:entry?.modelOverride,contextTokens:entry?.contextTokens}}).toSorted((a,b)=>(b.updatedAt??0)-(a.updatedAt??0))}async function sessionsCommand(opts,runtime){let cfg=loadConfig(),resolved=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),configContextTokens=cfg.agents?.defaults?.contextTokens??lookupContextTokens(resolved.model)??DEFAULT_CONTEXT_TOKENS,configModel=resolved.model??DEFAULT_MODEL,storePath=resolveStorePath(opts.store??cfg.session?.store),store=loadSessionStore(storePath),activeMinutes;if(opts.active!==void 0){let parsed=Number.parseInt(String(opts.active),10);if(Number.isNaN(parsed)||parsed<=0){runtime.error(`--active must be a positive integer (minutes)`),runtime.exit(1);return}activeMinutes=parsed}let rows=toRows(store).filter(row=>activeMinutes===void 0?!0:row.updatedAt?Date.now()-row.updatedAt<=activeMinutes*6e4:!1);if(opts.json){runtime.log(JSON.stringify({path:storePath,count:rows.length,activeMinutes:activeMinutes??null,sessions:rows.map(r=>{let model=resolveSessionModelRef(cfg,r,parseAgentSessionKey(r.key)?.agentId).model??configModel;return{...r,totalTokens:resolveFreshSessionTotalTokens(r)??null,totalTokensFresh:typeof r.totalTokens==`number`?r.totalTokensFresh!==!1:!1,contextTokens:r.contextTokens??lookupContextTokens(model)??configContextTokens??null,model}})},null,2));return}if(runtime.log(info(`Session store: ${storePath}`)),runtime.log(info(`Sessions listed: ${rows.length}`)),activeMinutes&&runtime.log(info(`Filtered to last ${activeMinutes} minute(s)`)),rows.length===0){runtime.log(`No sessions found.`);return}let rich=isRich(),header=[`Kind`.padEnd(6),`Key`.padEnd(26),`Age`.padEnd(9),`Model`.padEnd(14),`Tokens (ctx %)`.padEnd(20),`Flags`].join(` `);runtime.log(rich?theme.heading(header):header);for(let row of rows){let model=resolveSessionModelRef(cfg,row,parseAgentSessionKey(row.key)?.agentId).model??configModel,contextTokens=row.contextTokens??lookupContextTokens(model)??configContextTokens,total=resolveFreshSessionTotalTokens(row),keyLabel=truncateKey(row.key).padEnd(26),keyCell=rich?theme.accent(keyLabel):keyLabel,line=[formatKindCell(row.kind,rich),keyCell,formatAgeCell(row.updatedAt,rich),formatModelCell(model,rich),formatTokensCell(total,contextTokens??null,rich),formatFlagsCell(row,rich)].join(` `);runtime.log(line.trimEnd())}}export{sessionsCommand as t};
1
+ import{O as info,R as isRich,z as theme}from"./utils-BP60e80M.js";import{H as resolveConfiguredModelRef,_n as DEFAULT_PROVIDER,gn as DEFAULT_MODEL,hn as DEFAULT_CONTEXT_TOKENS}from"./auth-profiles-pt7Tr4HA.js";import{C as parseAgentSessionKey}from"./session-key-CksCYipj.js";import{r as loadConfig}from"./io-D9hC2aG0.js";import{a as loadSessionStore,k as resolveFreshSessionTotalTokens}from"./sessions-BA8Se_bT.js";import{c as resolveStorePath}from"./paths-ClsbsPQP.js";import{n as formatTimeAgo}from"./format-relative-CruqE52s.js";import{l as resolveSessionModelRef,n as classifySessionKey,u as lookupContextTokens}from"./session-utils-Dxou8SbO.js";const formatKTokens=value=>`${(value/1e3).toFixed(value>=1e4?0:1)}k`,truncateKey=key=>key.length<=26?key:`${key.slice(0,16)}...${key.slice(-6)}`,colorByPct=(label,pct,rich)=>!rich||pct===null?label:pct>=95?theme.error(label):pct>=80?theme.warn(label):pct>=60?theme.success(label):theme.muted(label),formatTokensCell=(total,contextTokens,rich)=>{if(total===void 0){let label=`unknown/${contextTokens?formatKTokens(contextTokens):`?`} (?%)`;return rich?theme.muted(label.padEnd(20)):label.padEnd(20)}let totalLabel=formatKTokens(total),ctxLabel=contextTokens?formatKTokens(contextTokens):`?`,pct=contextTokens?Math.min(999,Math.round(total/contextTokens*100)):null;return colorByPct(`${totalLabel}/${ctxLabel} (${pct??`?`}%)`.padEnd(20),pct,rich)},formatKindCell=(kind,rich)=>{let label=kind.padEnd(6);return rich?kind===`group`?theme.accentBright(label):kind===`global`?theme.warn(label):kind===`direct`?theme.accent(label):theme.muted(label):label},formatAgeCell=(updatedAt,rich)=>{let padded=(updatedAt?formatTimeAgo(Date.now()-updatedAt):`unknown`).padEnd(9);return rich?theme.muted(padded):padded},formatModelCell=(model,rich)=>{let label=(model??`unknown`).padEnd(14);return rich?theme.info(label):label},formatFlagsCell=(row,rich)=>{let label=[row.thinkingLevel?`think:${row.thinkingLevel}`:null,row.verboseLevel?`verbose:${row.verboseLevel}`:null,row.reasoningLevel?`reasoning:${row.reasoningLevel}`:null,row.elevatedLevel?`elev:${row.elevatedLevel}`:null,row.responseUsage?`usage:${row.responseUsage}`:null,row.groupActivation?`activation:${row.groupActivation}`:null,row.systemSent?`system`:null,row.abortedLastRun?`aborted`:null,row.sessionId?`id:${row.sessionId}`:null].filter(Boolean).join(` `);return label.length===0?``:rich?theme.muted(label):label};function toRows(store){return Object.entries(store).map(([key,entry])=>{let updatedAt=entry?.updatedAt??null;return{key,kind:classifySessionKey(key,entry),updatedAt,ageMs:updatedAt?Date.now()-updatedAt:null,sessionId:entry?.sessionId,systemSent:entry?.systemSent,abortedLastRun:entry?.abortedLastRun,thinkingLevel:entry?.thinkingLevel,verboseLevel:entry?.verboseLevel,reasoningLevel:entry?.reasoningLevel,elevatedLevel:entry?.elevatedLevel,responseUsage:entry?.responseUsage,groupActivation:entry?.groupActivation,inputTokens:entry?.inputTokens,outputTokens:entry?.outputTokens,totalTokens:entry?.totalTokens,totalTokensFresh:entry?.totalTokensFresh,model:entry?.model,modelProvider:entry?.modelProvider,providerOverride:entry?.providerOverride,modelOverride:entry?.modelOverride,contextTokens:entry?.contextTokens}}).toSorted((a,b)=>(b.updatedAt??0)-(a.updatedAt??0))}async function sessionsCommand(opts,runtime){let cfg=loadConfig(),resolved=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),configContextTokens=cfg.agents?.defaults?.contextTokens??lookupContextTokens(resolved.model)??DEFAULT_CONTEXT_TOKENS,configModel=resolved.model??DEFAULT_MODEL,storePath=resolveStorePath(opts.store??cfg.session?.store),store=loadSessionStore(storePath),activeMinutes;if(opts.active!==void 0){let parsed=Number.parseInt(String(opts.active),10);if(Number.isNaN(parsed)||parsed<=0){runtime.error(`--active must be a positive integer (minutes)`),runtime.exit(1);return}activeMinutes=parsed}let rows=toRows(store).filter(row=>activeMinutes===void 0?!0:row.updatedAt?Date.now()-row.updatedAt<=activeMinutes*6e4:!1);if(opts.json){runtime.log(JSON.stringify({path:storePath,count:rows.length,activeMinutes:activeMinutes??null,sessions:rows.map(r=>{let model=resolveSessionModelRef(cfg,r,parseAgentSessionKey(r.key)?.agentId).model??configModel;return{...r,totalTokens:resolveFreshSessionTotalTokens(r)??null,totalTokensFresh:typeof r.totalTokens==`number`?r.totalTokensFresh!==!1:!1,contextTokens:r.contextTokens??lookupContextTokens(model)??configContextTokens??null,model}})},null,2));return}if(runtime.log(info(`Session store: ${storePath}`)),runtime.log(info(`Sessions listed: ${rows.length}`)),activeMinutes&&runtime.log(info(`Filtered to last ${activeMinutes} minute(s)`)),rows.length===0){runtime.log(`No sessions found.`);return}let rich=isRich(),header=[`Kind`.padEnd(6),`Key`.padEnd(26),`Age`.padEnd(9),`Model`.padEnd(14),`Tokens (ctx %)`.padEnd(20),`Flags`].join(` `);runtime.log(rich?theme.heading(header):header);for(let row of rows){let model=resolveSessionModelRef(cfg,row,parseAgentSessionKey(row.key)?.agentId).model??configModel,contextTokens=row.contextTokens??lookupContextTokens(model)??configContextTokens,total=resolveFreshSessionTotalTokens(row),keyLabel=truncateKey(row.key).padEnd(26),keyCell=rich?theme.accent(keyLabel):keyLabel,line=[formatKindCell(row.kind,rich),keyCell,formatAgeCell(row.updatedAt,rich),formatModelCell(model,rich),formatTokensCell(total,contextTokens??null,rich),formatFlagsCell(row,rich)].join(` `);runtime.log(line.trimEnd())}}export{sessionsCommand as t};
@@ -1,2 +1,2 @@
1
- import{F as modelKey,G as resolveModelRefFromString,_n as DEFAULT_PROVIDER,j as buildModelAliasIndex}from"./auth-profiles-C1VbcUOm.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{d as normalizeAgentId}from"./session-key-CksCYipj.js";import{n as listAgentIds}from"./agent-scope-CufEmNj_.js";import{a as readConfigFileSnapshot,c as writeConfigFile}from"./io-CohJffHG.js";const ensureFlagCompatibility=opts=>{if(opts.json&&opts.plain)throw Error(`Choose either --json or --plain, not both.`)},formatTokenK=value=>!value||!Number.isFinite(value)?`-`:value<1024?`${Math.round(value)}`:`${Math.round(value/1024)}k`,formatMs=value=>value==null||!Number.isFinite(value)?`-`:value<1e3?`${Math.round(value)}ms`:`${Math.round(value/100)/10}s`,isLocalBaseUrl=baseUrl=>{try{let host=new URL(baseUrl).hostname.toLowerCase();return host===`localhost`||host===`127.0.0.1`||host===`0.0.0.0`||host===`::1`||host.endsWith(`.local`)}catch{return!1}};async function loadValidConfigOrThrow(){let snapshot=await readConfigFileSnapshot();if(!snapshot.valid){let issues=snapshot.issues.map(issue=>`- ${issue.path}: ${issue.message}`).join(`
1
+ import{F as modelKey,G as resolveModelRefFromString,_n as DEFAULT_PROVIDER,j as buildModelAliasIndex}from"./auth-profiles-pt7Tr4HA.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{d as normalizeAgentId}from"./session-key-CksCYipj.js";import{n as listAgentIds}from"./agent-scope-CufEmNj_.js";import{a as readConfigFileSnapshot,c as writeConfigFile}from"./io-D9hC2aG0.js";const ensureFlagCompatibility=opts=>{if(opts.json&&opts.plain)throw Error(`Choose either --json or --plain, not both.`)},formatTokenK=value=>!value||!Number.isFinite(value)?`-`:value<1024?`${Math.round(value)}`:`${Math.round(value/1024)}k`,formatMs=value=>value==null||!Number.isFinite(value)?`-`:value<1e3?`${Math.round(value)}ms`:`${Math.round(value/100)/10}s`,isLocalBaseUrl=baseUrl=>{try{let host=new URL(baseUrl).hostname.toLowerCase();return host===`localhost`||host===`127.0.0.1`||host===`0.0.0.0`||host===`::1`||host.endsWith(`.local`)}catch{return!1}};async function loadValidConfigOrThrow(){let snapshot=await readConfigFileSnapshot();if(!snapshot.valid){let issues=snapshot.issues.map(issue=>`- ${issue.path}: ${issue.message}`).join(`
2
2
  `);throw Error(`Invalid config at ${snapshot.path}\n${issues}`)}return snapshot.config}async function updateConfig(mutator){let next=mutator(await loadValidConfigOrThrow());return await writeConfigFile(next),next}function resolveModelTarget(params){let aliasIndex=buildModelAliasIndex({cfg:params.cfg,defaultProvider:DEFAULT_PROVIDER}),resolved=resolveModelRefFromString({raw:params.raw,defaultProvider:DEFAULT_PROVIDER,aliasIndex});if(!resolved)throw Error(`Invalid model reference: ${params.raw}`);return resolved.ref}function resolveModelKeysFromEntries(params){let aliasIndex=buildModelAliasIndex({cfg:params.cfg,defaultProvider:DEFAULT_PROVIDER});return params.entries.map(entry=>resolveModelRefFromString({raw:entry,defaultProvider:DEFAULT_PROVIDER,aliasIndex})).filter(entry=>!!entry).map(entry=>modelKey(entry.ref.provider,entry.ref.model))}function normalizeAlias(alias){let trimmed=alias.trim();if(!trimmed)throw Error(`Alias cannot be empty.`);if(!/^[A-Za-z0-9_.:-]+$/.test(trimmed))throw Error(`Alias must use letters, numbers, dots, underscores, colons, or dashes.`);return trimmed}function resolveKnownAgentId(params){let raw=params.rawAgentId?.trim();if(!raw)return;let agentId=normalizeAgentId(raw);if(!listAgentIds(params.cfg).includes(agentId))throw Error(`Unknown agent id "${raw}". Use "${formatCliCommand(`builderforce agents list`)}" to see configured agents.`);return agentId}function mergePrimaryFallbackConfig(existing,patch){let next={...existing};return patch.primary!==void 0&&(next.primary=patch.primary),patch.fallbacks!==void 0&&(next.fallbacks=patch.fallbacks),next}function applyDefaultModelPrimaryUpdate(params){let resolved=resolveModelTarget({raw:params.modelRaw,cfg:params.cfg}),key=`${resolved.provider}/${resolved.model}`,nextModels={...params.cfg.agents?.defaults?.models};nextModels[key]||(nextModels[key]={});let defaults=params.cfg.agents?.defaults??{},existing=defaults[params.field];return{...params.cfg,agents:{...params.cfg.agents,defaults:{...defaults,[params.field]:mergePrimaryFallbackConfig(existing,{primary:key}),models:nextModels}}}}export{isLocalBaseUrl as a,normalizeAlias as c,resolveModelTarget as d,updateConfig as f,formatTokenK as i,resolveKnownAgentId as l,ensureFlagCompatibility as n,loadValidConfigOrThrow as o,formatMs as r,mergePrimaryFallbackConfig as s,applyDefaultModelPrimaryUpdate as t,resolveModelKeysFromEntries as u};
@@ -1,2 +1,2 @@
1
- import{d as normalizeAgentId}from"./session-key-EoB0qaG9.js";import{n as listAgentIds}from"./agent-scope-DPtjOxzp.js";import{_ as resolveModelRefFromString,bn as DEFAULT_PROVIDER,r as buildModelAliasIndex,s as modelKey}from"./model-selection-9bRFKBI_.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{a as readConfigFileSnapshot,c as writeConfigFile}from"./io-3R_ZyUxB.js";const ensureFlagCompatibility=opts=>{if(opts.json&&opts.plain)throw Error(`Choose either --json or --plain, not both.`)},formatTokenK=value=>!value||!Number.isFinite(value)?`-`:value<1024?`${Math.round(value)}`:`${Math.round(value/1024)}k`,formatMs=value=>value==null||!Number.isFinite(value)?`-`:value<1e3?`${Math.round(value)}ms`:`${Math.round(value/100)/10}s`,isLocalBaseUrl=baseUrl=>{try{let host=new URL(baseUrl).hostname.toLowerCase();return host===`localhost`||host===`127.0.0.1`||host===`0.0.0.0`||host===`::1`||host.endsWith(`.local`)}catch{return!1}};async function loadValidConfigOrThrow(){let snapshot=await readConfigFileSnapshot();if(!snapshot.valid){let issues=snapshot.issues.map(issue=>`- ${issue.path}: ${issue.message}`).join(`
1
+ import{d as normalizeAgentId}from"./session-key-EoB0qaG9.js";import{n as listAgentIds}from"./agent-scope-DPtjOxzp.js";import{_ as resolveModelRefFromString,bn as DEFAULT_PROVIDER,r as buildModelAliasIndex,s as modelKey}from"./model-selection-DG9J_VTz.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{a as readConfigFileSnapshot,c as writeConfigFile}from"./io-BLBq4T2o.js";const ensureFlagCompatibility=opts=>{if(opts.json&&opts.plain)throw Error(`Choose either --json or --plain, not both.`)},formatTokenK=value=>!value||!Number.isFinite(value)?`-`:value<1024?`${Math.round(value)}`:`${Math.round(value/1024)}k`,formatMs=value=>value==null||!Number.isFinite(value)?`-`:value<1e3?`${Math.round(value)}ms`:`${Math.round(value/100)/10}s`,isLocalBaseUrl=baseUrl=>{try{let host=new URL(baseUrl).hostname.toLowerCase();return host===`localhost`||host===`127.0.0.1`||host===`0.0.0.0`||host===`::1`||host.endsWith(`.local`)}catch{return!1}};async function loadValidConfigOrThrow(){let snapshot=await readConfigFileSnapshot();if(!snapshot.valid){let issues=snapshot.issues.map(issue=>`- ${issue.path}: ${issue.message}`).join(`
2
2
  `);throw Error(`Invalid config at ${snapshot.path}\n${issues}`)}return snapshot.config}async function updateConfig(mutator){let next=mutator(await loadValidConfigOrThrow());return await writeConfigFile(next),next}function resolveModelTarget(params){let aliasIndex=buildModelAliasIndex({cfg:params.cfg,defaultProvider:DEFAULT_PROVIDER}),resolved=resolveModelRefFromString({raw:params.raw,defaultProvider:DEFAULT_PROVIDER,aliasIndex});if(!resolved)throw Error(`Invalid model reference: ${params.raw}`);return resolved.ref}function resolveModelKeysFromEntries(params){let aliasIndex=buildModelAliasIndex({cfg:params.cfg,defaultProvider:DEFAULT_PROVIDER});return params.entries.map(entry=>resolveModelRefFromString({raw:entry,defaultProvider:DEFAULT_PROVIDER,aliasIndex})).filter(entry=>!!entry).map(entry=>modelKey(entry.ref.provider,entry.ref.model))}function normalizeAlias(alias){let trimmed=alias.trim();if(!trimmed)throw Error(`Alias cannot be empty.`);if(!/^[A-Za-z0-9_.:-]+$/.test(trimmed))throw Error(`Alias must use letters, numbers, dots, underscores, colons, or dashes.`);return trimmed}function resolveKnownAgentId(params){let raw=params.rawAgentId?.trim();if(!raw)return;let agentId=normalizeAgentId(raw);if(!listAgentIds(params.cfg).includes(agentId))throw Error(`Unknown agent id "${raw}". Use "${formatCliCommand(`builderforce agents list`)}" to see configured agents.`);return agentId}function mergePrimaryFallbackConfig(existing,patch){let next={...existing};return patch.primary!==void 0&&(next.primary=patch.primary),patch.fallbacks!==void 0&&(next.fallbacks=patch.fallbacks),next}function applyDefaultModelPrimaryUpdate(params){let resolved=resolveModelTarget({raw:params.modelRaw,cfg:params.cfg}),key=`${resolved.provider}/${resolved.model}`,nextModels={...params.cfg.agents?.defaults?.models};nextModels[key]||(nextModels[key]={});let defaults=params.cfg.agents?.defaults??{},existing=defaults[params.field];return{...params.cfg,agents:{...params.cfg.agents,defaults:{...defaults,[params.field]:mergePrimaryFallbackConfig(existing,{primary:key}),models:nextModels}}}}export{isLocalBaseUrl as a,normalizeAlias as c,resolveModelTarget as d,updateConfig as f,formatTokenK as i,resolveKnownAgentId as l,ensureFlagCompatibility as n,loadValidConfigOrThrow as o,formatMs as r,mergePrimaryFallbackConfig as s,applyDefaultModelPrimaryUpdate as t,resolveModelKeysFromEntries as u};
@@ -1,2 +1,2 @@
1
- import{R as isPathInside}from"./io-3R_ZyUxB.js";import{i as hasErrnoCode}from"./errors-B1MIg3g-.js";import path from"node:path";import fs from"node:fs/promises";const SCANNABLE_EXTENSIONS=new Set([`.js`,`.ts`,`.mjs`,`.cjs`,`.mts`,`.cts`,`.jsx`,`.tsx`]);function isScannable(filePath){return SCANNABLE_EXTENSIONS.has(path.extname(filePath).toLowerCase())}const LINE_RULES=[{ruleId:`dangerous-exec`,severity:`critical`,message:`Shell command execution detected (child_process)`,pattern:/\b(exec|execSync|spawn|spawnSync|execFile|execFileSync)\s*\(/,requiresContext:/child_process/},{ruleId:`dynamic-code-execution`,severity:`critical`,message:`Dynamic code execution detected`,pattern:/\beval\s*\(|new\s+Function\s*\(/},{ruleId:`crypto-mining`,severity:`critical`,message:`Possible crypto-mining reference detected`,pattern:/stratum\+tcp|stratum\+ssl|coinhive|cryptonight|xmrig/i},{ruleId:`suspicious-network`,severity:`warn`,message:`WebSocket connection to non-standard port`,pattern:/new\s+WebSocket\s*\(\s*["']wss?:\/\/[^"']*:(\d+)/}],STANDARD_PORTS=new Set([80,443,8080,8443,3e3]),SOURCE_RULES=[{ruleId:`potential-exfiltration`,severity:`warn`,message:`File read combined with network send — possible data exfiltration`,pattern:/readFileSync|readFile/,requiresContext:/\bfetch\b|\bpost\b|http\.request/i},{ruleId:`obfuscated-code`,severity:`warn`,message:`Hex-encoded string sequence detected (possible obfuscation)`,pattern:/(\\x[0-9a-fA-F]{2}){6,}/},{ruleId:`obfuscated-code`,severity:`warn`,message:`Large base64 payload with decode call detected (possible obfuscation)`,pattern:/(?:atob|Buffer\.from)\s*\(\s*["'][A-Za-z0-9+/=]{200,}["']/},{ruleId:`env-harvesting`,severity:`critical`,message:`Environment variable access combined with network send — possible credential harvesting`,pattern:/process\.env/,requiresContext:/\bfetch\b|\bpost\b|http\.request/i}];function truncateEvidence(evidence,maxLen=120){return evidence.length<=maxLen?evidence:`${evidence.slice(0,maxLen)}…`}function scanSource(source,filePath){let findings=[],lines=source.split(`
1
+ import{R as isPathInside}from"./io-BLBq4T2o.js";import{i as hasErrnoCode}from"./errors-B1MIg3g-.js";import path from"node:path";import fs from"node:fs/promises";const SCANNABLE_EXTENSIONS=new Set([`.js`,`.ts`,`.mjs`,`.cjs`,`.mts`,`.cts`,`.jsx`,`.tsx`]);function isScannable(filePath){return SCANNABLE_EXTENSIONS.has(path.extname(filePath).toLowerCase())}const LINE_RULES=[{ruleId:`dangerous-exec`,severity:`critical`,message:`Shell command execution detected (child_process)`,pattern:/\b(exec|execSync|spawn|spawnSync|execFile|execFileSync)\s*\(/,requiresContext:/child_process/},{ruleId:`dynamic-code-execution`,severity:`critical`,message:`Dynamic code execution detected`,pattern:/\beval\s*\(|new\s+Function\s*\(/},{ruleId:`crypto-mining`,severity:`critical`,message:`Possible crypto-mining reference detected`,pattern:/stratum\+tcp|stratum\+ssl|coinhive|cryptonight|xmrig/i},{ruleId:`suspicious-network`,severity:`warn`,message:`WebSocket connection to non-standard port`,pattern:/new\s+WebSocket\s*\(\s*["']wss?:\/\/[^"']*:(\d+)/}],STANDARD_PORTS=new Set([80,443,8080,8443,3e3]),SOURCE_RULES=[{ruleId:`potential-exfiltration`,severity:`warn`,message:`File read combined with network send — possible data exfiltration`,pattern:/readFileSync|readFile/,requiresContext:/\bfetch\b|\bpost\b|http\.request/i},{ruleId:`obfuscated-code`,severity:`warn`,message:`Hex-encoded string sequence detected (possible obfuscation)`,pattern:/(\\x[0-9a-fA-F]{2}){6,}/},{ruleId:`obfuscated-code`,severity:`warn`,message:`Large base64 payload with decode call detected (possible obfuscation)`,pattern:/(?:atob|Buffer\.from)\s*\(\s*["'][A-Za-z0-9+/=]{200,}["']/},{ruleId:`env-harvesting`,severity:`critical`,message:`Environment variable access combined with network send — possible credential harvesting`,pattern:/process\.env/,requiresContext:/\bfetch\b|\bpost\b|http\.request/i}];function truncateEvidence(evidence,maxLen=120){return evidence.length<=maxLen?evidence:`${evidence.slice(0,maxLen)}…`}function scanSource(source,filePath){let findings=[],lines=source.split(`
2
2
  `),matchedLineRules=new Set;for(let rule of LINE_RULES)if(!matchedLineRules.has(rule.ruleId)&&!(rule.requiresContext&&!rule.requiresContext.test(source)))for(let i=0;i<lines.length;i++){let line=lines[i],match=rule.pattern.exec(line);if(match){if(rule.ruleId===`suspicious-network`){let port=parseInt(match[1],10);if(STANDARD_PORTS.has(port))continue}findings.push({ruleId:rule.ruleId,severity:rule.severity,file:filePath,line:i+1,message:rule.message,evidence:truncateEvidence(line.trim())}),matchedLineRules.add(rule.ruleId);break}}let matchedSourceRules=new Set;for(let rule of SOURCE_RULES){let ruleKey=`${rule.ruleId}::${rule.message}`;if(matchedSourceRules.has(ruleKey)||!rule.pattern.test(source)||rule.requiresContext&&!rule.requiresContext.test(source))continue;let matchLine=0,matchEvidence=``;for(let i=0;i<lines.length;i++)if(rule.pattern.test(lines[i])){matchLine=i+1,matchEvidence=lines[i].trim();break}matchLine===0&&(matchLine=1,matchEvidence=source.slice(0,120)),findings.push({ruleId:rule.ruleId,severity:rule.severity,file:filePath,line:matchLine,message:rule.message,evidence:truncateEvidence(matchEvidence)}),matchedSourceRules.add(ruleKey)}return findings}function normalizeScanOptions(opts){return{includeFiles:opts?.includeFiles??[],maxFiles:Math.max(1,opts?.maxFiles??500),maxFileBytes:Math.max(1,opts?.maxFileBytes??1048576)}}async function walkDirWithLimit(dirPath,maxFiles){let files=[],stack=[dirPath];for(;stack.length>0&&files.length<maxFiles;){let currentDir=stack.pop();if(!currentDir)break;let entries=await fs.readdir(currentDir,{withFileTypes:!0});for(let entry of entries){if(files.length>=maxFiles)break;if(entry.name.startsWith(`.`)||entry.name===`node_modules`)continue;let fullPath=path.join(currentDir,entry.name);entry.isDirectory()?stack.push(fullPath):isScannable(entry.name)&&files.push(fullPath)}}return files}async function resolveForcedFiles(params){if(params.includeFiles.length===0)return[];let seen=new Set,out=[];for(let rawIncludePath of params.includeFiles){let includePath=path.resolve(params.rootDir,rawIncludePath);if(!isPathInside(params.rootDir,includePath)||!isScannable(includePath)||seen.has(includePath))continue;let st=null;try{st=await fs.stat(includePath)}catch(err){if(hasErrnoCode(err,`ENOENT`))continue;throw err}st?.isFile()&&(out.push(includePath),seen.add(includePath))}return out}async function collectScannableFiles(dirPath,opts){let forcedFiles=await resolveForcedFiles({rootDir:dirPath,includeFiles:opts.includeFiles});if(forcedFiles.length>=opts.maxFiles)return forcedFiles.slice(0,opts.maxFiles);let walkedFiles=await walkDirWithLimit(dirPath,opts.maxFiles),seen=new Set(forcedFiles.map(f=>path.resolve(f))),out=[...forcedFiles];for(let walkedFile of walkedFiles){if(out.length>=opts.maxFiles)break;let resolved=path.resolve(walkedFile);seen.has(resolved)||(out.push(walkedFile),seen.add(resolved))}return out}async function readScannableSource(filePath,maxFileBytes){let st=null;try{st=await fs.stat(filePath)}catch(err){if(hasErrnoCode(err,`ENOENT`))return null;throw err}if(!st?.isFile()||st.size>maxFileBytes)return null;try{return await fs.readFile(filePath,`utf-8`)}catch(err){if(hasErrnoCode(err,`ENOENT`))return null;throw err}}async function scanDirectoryWithSummary(dirPath,opts){let scanOptions=normalizeScanOptions(opts),files=await collectScannableFiles(dirPath,scanOptions),allFindings=[],scannedFiles=0;for(let file of files){let source=await readScannableSource(file,scanOptions.maxFileBytes);if(source==null)continue;scannedFiles+=1;let findings=scanSource(source,file);allFindings.push(...findings)}return{scannedFiles,critical:allFindings.filter(f=>f.severity===`critical`).length,warn:allFindings.filter(f=>f.severity===`warn`).length,info:allFindings.filter(f=>f.severity===`info`).length,findings:allFindings}}export{scanDirectoryWithSummary as t};
@@ -1,2 +1,2 @@
1
- import{R as isPathInside}from"./io-CohJffHG.js";import{i as hasErrnoCode}from"./errors-tAt19c1E.js";import path from"node:path";import fs from"node:fs/promises";const SCANNABLE_EXTENSIONS=new Set([`.js`,`.ts`,`.mjs`,`.cjs`,`.mts`,`.cts`,`.jsx`,`.tsx`]);function isScannable(filePath){return SCANNABLE_EXTENSIONS.has(path.extname(filePath).toLowerCase())}const LINE_RULES=[{ruleId:`dangerous-exec`,severity:`critical`,message:`Shell command execution detected (child_process)`,pattern:/\b(exec|execSync|spawn|spawnSync|execFile|execFileSync)\s*\(/,requiresContext:/child_process/},{ruleId:`dynamic-code-execution`,severity:`critical`,message:`Dynamic code execution detected`,pattern:/\beval\s*\(|new\s+Function\s*\(/},{ruleId:`crypto-mining`,severity:`critical`,message:`Possible crypto-mining reference detected`,pattern:/stratum\+tcp|stratum\+ssl|coinhive|cryptonight|xmrig/i},{ruleId:`suspicious-network`,severity:`warn`,message:`WebSocket connection to non-standard port`,pattern:/new\s+WebSocket\s*\(\s*["']wss?:\/\/[^"']*:(\d+)/}],STANDARD_PORTS=new Set([80,443,8080,8443,3e3]),SOURCE_RULES=[{ruleId:`potential-exfiltration`,severity:`warn`,message:`File read combined with network send — possible data exfiltration`,pattern:/readFileSync|readFile/,requiresContext:/\bfetch\b|\bpost\b|http\.request/i},{ruleId:`obfuscated-code`,severity:`warn`,message:`Hex-encoded string sequence detected (possible obfuscation)`,pattern:/(\\x[0-9a-fA-F]{2}){6,}/},{ruleId:`obfuscated-code`,severity:`warn`,message:`Large base64 payload with decode call detected (possible obfuscation)`,pattern:/(?:atob|Buffer\.from)\s*\(\s*["'][A-Za-z0-9+/=]{200,}["']/},{ruleId:`env-harvesting`,severity:`critical`,message:`Environment variable access combined with network send — possible credential harvesting`,pattern:/process\.env/,requiresContext:/\bfetch\b|\bpost\b|http\.request/i}];function truncateEvidence(evidence,maxLen=120){return evidence.length<=maxLen?evidence:`${evidence.slice(0,maxLen)}…`}function scanSource(source,filePath){let findings=[],lines=source.split(`
1
+ import{R as isPathInside}from"./io-D9hC2aG0.js";import{i as hasErrnoCode}from"./errors-tAt19c1E.js";import path from"node:path";import fs from"node:fs/promises";const SCANNABLE_EXTENSIONS=new Set([`.js`,`.ts`,`.mjs`,`.cjs`,`.mts`,`.cts`,`.jsx`,`.tsx`]);function isScannable(filePath){return SCANNABLE_EXTENSIONS.has(path.extname(filePath).toLowerCase())}const LINE_RULES=[{ruleId:`dangerous-exec`,severity:`critical`,message:`Shell command execution detected (child_process)`,pattern:/\b(exec|execSync|spawn|spawnSync|execFile|execFileSync)\s*\(/,requiresContext:/child_process/},{ruleId:`dynamic-code-execution`,severity:`critical`,message:`Dynamic code execution detected`,pattern:/\beval\s*\(|new\s+Function\s*\(/},{ruleId:`crypto-mining`,severity:`critical`,message:`Possible crypto-mining reference detected`,pattern:/stratum\+tcp|stratum\+ssl|coinhive|cryptonight|xmrig/i},{ruleId:`suspicious-network`,severity:`warn`,message:`WebSocket connection to non-standard port`,pattern:/new\s+WebSocket\s*\(\s*["']wss?:\/\/[^"']*:(\d+)/}],STANDARD_PORTS=new Set([80,443,8080,8443,3e3]),SOURCE_RULES=[{ruleId:`potential-exfiltration`,severity:`warn`,message:`File read combined with network send — possible data exfiltration`,pattern:/readFileSync|readFile/,requiresContext:/\bfetch\b|\bpost\b|http\.request/i},{ruleId:`obfuscated-code`,severity:`warn`,message:`Hex-encoded string sequence detected (possible obfuscation)`,pattern:/(\\x[0-9a-fA-F]{2}){6,}/},{ruleId:`obfuscated-code`,severity:`warn`,message:`Large base64 payload with decode call detected (possible obfuscation)`,pattern:/(?:atob|Buffer\.from)\s*\(\s*["'][A-Za-z0-9+/=]{200,}["']/},{ruleId:`env-harvesting`,severity:`critical`,message:`Environment variable access combined with network send — possible credential harvesting`,pattern:/process\.env/,requiresContext:/\bfetch\b|\bpost\b|http\.request/i}];function truncateEvidence(evidence,maxLen=120){return evidence.length<=maxLen?evidence:`${evidence.slice(0,maxLen)}…`}function scanSource(source,filePath){let findings=[],lines=source.split(`
2
2
  `),matchedLineRules=new Set;for(let rule of LINE_RULES)if(!matchedLineRules.has(rule.ruleId)&&!(rule.requiresContext&&!rule.requiresContext.test(source)))for(let i=0;i<lines.length;i++){let line=lines[i],match=rule.pattern.exec(line);if(match){if(rule.ruleId===`suspicious-network`){let port=parseInt(match[1],10);if(STANDARD_PORTS.has(port))continue}findings.push({ruleId:rule.ruleId,severity:rule.severity,file:filePath,line:i+1,message:rule.message,evidence:truncateEvidence(line.trim())}),matchedLineRules.add(rule.ruleId);break}}let matchedSourceRules=new Set;for(let rule of SOURCE_RULES){let ruleKey=`${rule.ruleId}::${rule.message}`;if(matchedSourceRules.has(ruleKey)||!rule.pattern.test(source)||rule.requiresContext&&!rule.requiresContext.test(source))continue;let matchLine=0,matchEvidence=``;for(let i=0;i<lines.length;i++)if(rule.pattern.test(lines[i])){matchLine=i+1,matchEvidence=lines[i].trim();break}matchLine===0&&(matchLine=1,matchEvidence=source.slice(0,120)),findings.push({ruleId:rule.ruleId,severity:rule.severity,file:filePath,line:matchLine,message:rule.message,evidence:truncateEvidence(matchEvidence)}),matchedSourceRules.add(ruleKey)}return findings}function normalizeScanOptions(opts){return{includeFiles:opts?.includeFiles??[],maxFiles:Math.max(1,opts?.maxFiles??500),maxFileBytes:Math.max(1,opts?.maxFileBytes??1048576)}}async function walkDirWithLimit(dirPath,maxFiles){let files=[],stack=[dirPath];for(;stack.length>0&&files.length<maxFiles;){let currentDir=stack.pop();if(!currentDir)break;let entries=await fs.readdir(currentDir,{withFileTypes:!0});for(let entry of entries){if(files.length>=maxFiles)break;if(entry.name.startsWith(`.`)||entry.name===`node_modules`)continue;let fullPath=path.join(currentDir,entry.name);entry.isDirectory()?stack.push(fullPath):isScannable(entry.name)&&files.push(fullPath)}}return files}async function resolveForcedFiles(params){if(params.includeFiles.length===0)return[];let seen=new Set,out=[];for(let rawIncludePath of params.includeFiles){let includePath=path.resolve(params.rootDir,rawIncludePath);if(!isPathInside(params.rootDir,includePath)||!isScannable(includePath)||seen.has(includePath))continue;let st=null;try{st=await fs.stat(includePath)}catch(err){if(hasErrnoCode(err,`ENOENT`))continue;throw err}st?.isFile()&&(out.push(includePath),seen.add(includePath))}return out}async function collectScannableFiles(dirPath,opts){let forcedFiles=await resolveForcedFiles({rootDir:dirPath,includeFiles:opts.includeFiles});if(forcedFiles.length>=opts.maxFiles)return forcedFiles.slice(0,opts.maxFiles);let walkedFiles=await walkDirWithLimit(dirPath,opts.maxFiles),seen=new Set(forcedFiles.map(f=>path.resolve(f))),out=[...forcedFiles];for(let walkedFile of walkedFiles){if(out.length>=opts.maxFiles)break;let resolved=path.resolve(walkedFile);seen.has(resolved)||(out.push(walkedFile),seen.add(resolved))}return out}async function readScannableSource(filePath,maxFileBytes){let st=null;try{st=await fs.stat(filePath)}catch(err){if(hasErrnoCode(err,`ENOENT`))return null;throw err}if(!st?.isFile()||st.size>maxFileBytes)return null;try{return await fs.readFile(filePath,`utf-8`)}catch(err){if(hasErrnoCode(err,`ENOENT`))return null;throw err}}async function scanDirectoryWithSummary(dirPath,opts){let scanOptions=normalizeScanOptions(opts),files=await collectScannableFiles(dirPath,scanOptions),allFindings=[],scannedFiles=0;for(let file of files){let source=await readScannableSource(file,scanOptions.maxFileBytes);if(source==null)continue;scannedFiles+=1;let findings=scanSource(source,file);allFindings.push(...findings)}return{scannedFiles,critical:allFindings.filter(f=>f.severity===`critical`).length,warn:allFindings.filter(f=>f.severity===`warn`).length,info:allFindings.filter(f=>f.severity===`info`).length,findings:allFindings}}export{scanDirectoryWithSummary as t};
@@ -1,4 +1,4 @@
1
- import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{S as shortenHomePath,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-C1VbcUOm.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{r as loadConfig}from"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import{t as renderTable}from"./table-BFCCZDsp.js";function getSkillsHint(config){let cli=config?.skills?.registry?.cli;return cli?`Tip: use \`${cli}\` to search, install, and sync skills.`:`Tip: visit builderforce.ai/marketplace to browse and install skills.`}function appendSkillsHint(output,json,config){return json?output:`${output}\n\n${getSkillsHint(config)}`}function formatSkillStatus(skill){return skill.eligible?theme.success(`✓ ready`):skill.disabled?theme.warn(`⏸ disabled`):skill.blockedByAllowlist?theme.warn(`🚫 blocked`):theme.error(`✗ missing`)}function formatSkillName(skill){return`${skill.emoji??`📦`} ${theme.command(skill.name)}`}function formatSkillMissingSummary(skill){let missing=[];return skill.missing.bins.length>0&&missing.push(`bins: ${skill.missing.bins.join(`, `)}`),skill.missing.anyBins.length>0&&missing.push(`anyBins: ${skill.missing.anyBins.join(`, `)}`),skill.missing.env.length>0&&missing.push(`env: ${skill.missing.env.join(`, `)}`),skill.missing.config.length>0&&missing.push(`config: ${skill.missing.config.join(`, `)}`),skill.missing.os.length>0&&missing.push(`os: ${skill.missing.os.join(`, `)}`),missing.join(`; `)}function formatSkillsList(report,opts){let skills=opts.eligible?report.skills.filter(s=>s.eligible):report.skills;if(opts.json){let jsonReport={workspaceDir:report.workspaceDir,managedSkillsDir:report.managedSkillsDir,skills:skills.map(s=>({name:s.name,description:s.description,emoji:s.emoji,eligible:s.eligible,disabled:s.disabled,blockedByAllowlist:s.blockedByAllowlist,source:s.source,bundled:s.bundled,primaryEnv:s.primaryEnv,homepage:s.homepage,missing:s.missing}))};return JSON.stringify(jsonReport,null,2)}if(skills.length===0)return appendSkillsHint(opts.eligible?`No eligible skills found. Run \`${formatCliCommand(`builderforce skills list`)}\` to see all skills.`:`No skills found.`,opts.json,opts.config);let eligible=skills.filter(s=>s.eligible),tableWidth=Math.max(60,(process.stdout.columns??120)-1),rows=skills.map(skill=>{let missing=formatSkillMissingSummary(skill);return{Status:formatSkillStatus(skill),Skill:formatSkillName(skill),Description:theme.muted(skill.description),Source:skill.source??``,Missing:missing?theme.warn(missing):``}}),columns=[{key:`Status`,header:`Status`,minWidth:10},{key:`Skill`,header:`Skill`,minWidth:18,flex:!0},{key:`Description`,header:`Description`,minWidth:24,flex:!0},{key:`Source`,header:`Source`,minWidth:10}];opts.verbose&&columns.push({key:`Missing`,header:`Missing`,minWidth:18,flex:!0});let lines=[];return lines.push(`${theme.heading(`Skills`)} ${theme.muted(`(${eligible.length}/${skills.length} ready)`)}`),lines.push(renderTable({width:tableWidth,columns,rows}).trimEnd()),appendSkillsHint(lines.join(`
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{S as shortenHomePath,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-pt7Tr4HA.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{r as loadConfig}from"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import{t as renderTable}from"./table-BFCCZDsp.js";function getSkillsHint(config){let cli=config?.skills?.registry?.cli;return cli?`Tip: use \`${cli}\` to search, install, and sync skills.`:`Tip: visit builderforce.ai/marketplace to browse and install skills.`}function appendSkillsHint(output,json,config){return json?output:`${output}\n\n${getSkillsHint(config)}`}function formatSkillStatus(skill){return skill.eligible?theme.success(`✓ ready`):skill.disabled?theme.warn(`⏸ disabled`):skill.blockedByAllowlist?theme.warn(`🚫 blocked`):theme.error(`✗ missing`)}function formatSkillName(skill){return`${skill.emoji??`📦`} ${theme.command(skill.name)}`}function formatSkillMissingSummary(skill){let missing=[];return skill.missing.bins.length>0&&missing.push(`bins: ${skill.missing.bins.join(`, `)}`),skill.missing.anyBins.length>0&&missing.push(`anyBins: ${skill.missing.anyBins.join(`, `)}`),skill.missing.env.length>0&&missing.push(`env: ${skill.missing.env.join(`, `)}`),skill.missing.config.length>0&&missing.push(`config: ${skill.missing.config.join(`, `)}`),skill.missing.os.length>0&&missing.push(`os: ${skill.missing.os.join(`, `)}`),missing.join(`; `)}function formatSkillsList(report,opts){let skills=opts.eligible?report.skills.filter(s=>s.eligible):report.skills;if(opts.json){let jsonReport={workspaceDir:report.workspaceDir,managedSkillsDir:report.managedSkillsDir,skills:skills.map(s=>({name:s.name,description:s.description,emoji:s.emoji,eligible:s.eligible,disabled:s.disabled,blockedByAllowlist:s.blockedByAllowlist,source:s.source,bundled:s.bundled,primaryEnv:s.primaryEnv,homepage:s.homepage,missing:s.missing}))};return JSON.stringify(jsonReport,null,2)}if(skills.length===0)return appendSkillsHint(opts.eligible?`No eligible skills found. Run \`${formatCliCommand(`builderforce skills list`)}\` to see all skills.`:`No skills found.`,opts.json,opts.config);let eligible=skills.filter(s=>s.eligible),tableWidth=Math.max(60,(process.stdout.columns??120)-1),rows=skills.map(skill=>{let missing=formatSkillMissingSummary(skill);return{Status:formatSkillStatus(skill),Skill:formatSkillName(skill),Description:theme.muted(skill.description),Source:skill.source??``,Missing:missing?theme.warn(missing):``}}),columns=[{key:`Status`,header:`Status`,minWidth:10},{key:`Skill`,header:`Skill`,minWidth:18,flex:!0},{key:`Description`,header:`Description`,minWidth:24,flex:!0},{key:`Source`,header:`Source`,minWidth:10}];opts.verbose&&columns.push({key:`Missing`,header:`Missing`,minWidth:18,flex:!0});let lines=[];return lines.push(`${theme.heading(`Skills`)} ${theme.muted(`(${eligible.length}/${skills.length} ready)`)}`),lines.push(renderTable({width:tableWidth,columns,rows}).trimEnd()),appendSkillsHint(lines.join(`
2
2
  `),opts.json,opts.config)}function formatSkillInfo(report,skillName,opts){let skill=report.skills.find(s=>s.name===skillName||s.skillKey===skillName);if(!skill)return opts.json?JSON.stringify({error:`not found`,skill:skillName},null,2):appendSkillsHint(`Skill "${skillName}" not found. Run \`${formatCliCommand(`builderforce skills list`)}\` to see available skills.`,opts.json,opts.config);if(opts.json)return JSON.stringify(skill,null,2);let lines=[],emoji=skill.emoji??`📦`,status=skill.eligible?theme.success(`✓ Ready`):skill.disabled?theme.warn(`⏸ Disabled`):skill.blockedByAllowlist?theme.warn(`🚫 Blocked by allowlist`):theme.error(`✗ Missing requirements`);if(lines.push(`${emoji} ${theme.heading(skill.name)} ${status}`),lines.push(``),lines.push(skill.description),lines.push(``),lines.push(theme.heading(`Details:`)),lines.push(`${theme.muted(` Source:`)} ${skill.source}`),lines.push(`${theme.muted(` Path:`)} ${shortenHomePath(skill.filePath)}`),skill.homepage&&lines.push(`${theme.muted(` Homepage:`)} ${skill.homepage}`),skill.primaryEnv&&lines.push(`${theme.muted(` Primary env:`)} ${skill.primaryEnv}`),skill.requirements.bins.length>0||skill.requirements.anyBins.length>0||skill.requirements.env.length>0||skill.requirements.config.length>0||skill.requirements.os.length>0){if(lines.push(``),lines.push(theme.heading(`Requirements:`)),skill.requirements.bins.length>0){let binsStatus=skill.requirements.bins.map(bin=>skill.missing.bins.includes(bin)?theme.error(`✗ ${bin}`):theme.success(`✓ ${bin}`));lines.push(`${theme.muted(` Binaries:`)} ${binsStatus.join(`, `)}`)}if(skill.requirements.anyBins.length>0){let anyBinsMissing=skill.missing.anyBins.length>0,anyBinsStatus=skill.requirements.anyBins.map(bin=>anyBinsMissing?theme.error(`✗ ${bin}`):theme.success(`✓ ${bin}`));lines.push(`${theme.muted(` Any binaries:`)} ${anyBinsStatus.join(`, `)}`)}if(skill.requirements.env.length>0){let envStatus=skill.requirements.env.map(env=>skill.missing.env.includes(env)?theme.error(`✗ ${env}`):theme.success(`✓ ${env}`));lines.push(`${theme.muted(` Environment:`)} ${envStatus.join(`, `)}`)}if(skill.requirements.config.length>0){let configStatus=skill.requirements.config.map(cfg=>skill.missing.config.includes(cfg)?theme.error(`✗ ${cfg}`):theme.success(`✓ ${cfg}`));lines.push(`${theme.muted(` Config:`)} ${configStatus.join(`, `)}`)}if(skill.requirements.os.length>0){let osStatus=skill.requirements.os.map(osName=>skill.missing.os.includes(osName)?theme.error(`✗ ${osName}`):theme.success(`✓ ${osName}`));lines.push(`${theme.muted(` OS:`)} ${osStatus.join(`, `)}`)}}if(skill.install.length>0&&!skill.eligible){lines.push(``),lines.push(theme.heading(`Install options:`));for(let inst of skill.install)lines.push(` ${theme.warn(`→`)} ${inst.label}`)}return appendSkillsHint(lines.join(`
3
3
  `),opts.json,opts.config)}function formatSkillsCheck(report,opts){let eligible=report.skills.filter(s=>s.eligible),disabled=report.skills.filter(s=>s.disabled),blocked=report.skills.filter(s=>s.blockedByAllowlist&&!s.disabled),missingReqs=report.skills.filter(s=>!s.eligible&&!s.disabled&&!s.blockedByAllowlist);if(opts.json)return JSON.stringify({summary:{total:report.skills.length,eligible:eligible.length,disabled:disabled.length,blocked:blocked.length,missingRequirements:missingReqs.length},eligible:eligible.map(s=>s.name),disabled:disabled.map(s=>s.name),blocked:blocked.map(s=>s.name),missingRequirements:missingReqs.map(s=>({name:s.name,missing:s.missing,install:s.install}))},null,2);let lines=[];if(lines.push(theme.heading(`Skills Status Check`)),lines.push(``),lines.push(`${theme.muted(`Total:`)} ${report.skills.length}`),lines.push(`${theme.success(`✓`)} ${theme.muted(`Eligible:`)} ${eligible.length}`),lines.push(`${theme.warn(`⏸`)} ${theme.muted(`Disabled:`)} ${disabled.length}`),lines.push(`${theme.warn(`🚫`)} ${theme.muted(`Blocked by allowlist:`)} ${blocked.length}`),lines.push(`${theme.error(`✗`)} ${theme.muted(`Missing requirements:`)} ${missingReqs.length}`),eligible.length>0){lines.push(``),lines.push(theme.heading(`Ready to use:`));for(let skill of eligible){let emoji=skill.emoji??`📦`;lines.push(` ${emoji} ${skill.name}`)}}if(missingReqs.length>0){lines.push(``),lines.push(theme.heading(`Missing requirements:`));for(let skill of missingReqs){let emoji=skill.emoji??`📦`,missing=formatSkillMissingSummary(skill);lines.push(` ${emoji} ${skill.name} ${theme.muted(`(${missing})`)}`)}}return appendSkillsHint(lines.join(`
4
4
  `),opts.json,opts.config)}function registerSkillsCli(program){let skills=program.command(`skills`).description(`List and inspect available skills`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/skills`,`docs.builderforce.ai/cli/skills`)}\n`);skills.command(`list`).description(`List all available skills`).option(`--json`,`Output as JSON`,!1).option(`--eligible`,`Show only eligible (ready to use) skills`,!1).option(`-v, --verbose`,`Show more details including missing requirements`,!1).action(async opts=>{try{let config=loadConfig(),workspaceDir=resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config)),{buildWorkspaceSkillStatus}=await import(`./skills-status-BgcPJThl.js`),report=buildWorkspaceSkillStatus(workspaceDir,{config});defaultRuntime.log(formatSkillsList(report,{...opts,config}))}catch(err){defaultRuntime.error(String(err)),defaultRuntime.exit(1)}}),skills.command(`info`).description(`Show detailed information about a skill`).argument(`<name>`,`Skill name`).option(`--json`,`Output as JSON`,!1).action(async(name,opts)=>{try{let config=loadConfig(),workspaceDir=resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config)),{buildWorkspaceSkillStatus}=await import(`./skills-status-BgcPJThl.js`),report=buildWorkspaceSkillStatus(workspaceDir,{config});defaultRuntime.log(formatSkillInfo(report,name,{...opts,config}))}catch(err){defaultRuntime.error(String(err)),defaultRuntime.exit(1)}}),skills.command(`check`).description(`Check which skills are ready vs missing requirements`).option(`--json`,`Output as JSON`,!1).action(async opts=>{try{let config=loadConfig(),workspaceDir=resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config)),{buildWorkspaceSkillStatus}=await import(`./skills-status-BgcPJThl.js`),report=buildWorkspaceSkillStatus(workspaceDir,{config});defaultRuntime.log(formatSkillsCheck(report,{...opts,config}))}catch(err){defaultRuntime.error(String(err)),defaultRuntime.exit(1)}}),skills.action(async()=>{try{let config=loadConfig(),workspaceDir=resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config)),{buildWorkspaceSkillStatus}=await import(`./skills-status-BgcPJThl.js`),report=buildWorkspaceSkillStatus(workspaceDir,{config});defaultRuntime.log(formatSkillsList(report,{config}))}catch(err){defaultRuntime.error(String(err)),defaultRuntime.exit(1)}})}export{registerSkillsCli};
@@ -1,4 +1,4 @@
1
- import"./paths-5FcIFMsj.js";import{B as theme,C as shortenHomePath}from"./utils-DbaBVFaK.js";import"./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{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import{r as loadConfig}from"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import{t as renderTable}from"./table-BoCHYKoQ.js";function getSkillsHint(config){let cli=config?.skills?.registry?.cli;return cli?`Tip: use \`${cli}\` to search, install, and sync skills.`:`Tip: visit builderforce.ai/marketplace to browse and install skills.`}function appendSkillsHint(output,json,config){return json?output:`${output}\n\n${getSkillsHint(config)}`}function formatSkillStatus(skill){return skill.eligible?theme.success(`✓ ready`):skill.disabled?theme.warn(`⏸ disabled`):skill.blockedByAllowlist?theme.warn(`🚫 blocked`):theme.error(`✗ missing`)}function formatSkillName(skill){return`${skill.emoji??`📦`} ${theme.command(skill.name)}`}function formatSkillMissingSummary(skill){let missing=[];return skill.missing.bins.length>0&&missing.push(`bins: ${skill.missing.bins.join(`, `)}`),skill.missing.anyBins.length>0&&missing.push(`anyBins: ${skill.missing.anyBins.join(`, `)}`),skill.missing.env.length>0&&missing.push(`env: ${skill.missing.env.join(`, `)}`),skill.missing.config.length>0&&missing.push(`config: ${skill.missing.config.join(`, `)}`),skill.missing.os.length>0&&missing.push(`os: ${skill.missing.os.join(`, `)}`),missing.join(`; `)}function formatSkillsList(report,opts){let skills=opts.eligible?report.skills.filter(s=>s.eligible):report.skills;if(opts.json){let jsonReport={workspaceDir:report.workspaceDir,managedSkillsDir:report.managedSkillsDir,skills:skills.map(s=>({name:s.name,description:s.description,emoji:s.emoji,eligible:s.eligible,disabled:s.disabled,blockedByAllowlist:s.blockedByAllowlist,source:s.source,bundled:s.bundled,primaryEnv:s.primaryEnv,homepage:s.homepage,missing:s.missing}))};return JSON.stringify(jsonReport,null,2)}if(skills.length===0)return appendSkillsHint(opts.eligible?`No eligible skills found. Run \`${formatCliCommand(`builderforce skills list`)}\` to see all skills.`:`No skills found.`,opts.json,opts.config);let eligible=skills.filter(s=>s.eligible),tableWidth=Math.max(60,(process.stdout.columns??120)-1),rows=skills.map(skill=>{let missing=formatSkillMissingSummary(skill);return{Status:formatSkillStatus(skill),Skill:formatSkillName(skill),Description:theme.muted(skill.description),Source:skill.source??``,Missing:missing?theme.warn(missing):``}}),columns=[{key:`Status`,header:`Status`,minWidth:10},{key:`Skill`,header:`Skill`,minWidth:18,flex:!0},{key:`Description`,header:`Description`,minWidth:24,flex:!0},{key:`Source`,header:`Source`,minWidth:10}];opts.verbose&&columns.push({key:`Missing`,header:`Missing`,minWidth:18,flex:!0});let lines=[];return lines.push(`${theme.heading(`Skills`)} ${theme.muted(`(${eligible.length}/${skills.length} ready)`)}`),lines.push(renderTable({width:tableWidth,columns,rows}).trimEnd()),appendSkillsHint(lines.join(`
1
+ import"./paths-5FcIFMsj.js";import{B as theme,C as shortenHomePath}from"./utils-DbaBVFaK.js";import"./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{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import{r as loadConfig}from"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import{t as renderTable}from"./table-BoCHYKoQ.js";function getSkillsHint(config){let cli=config?.skills?.registry?.cli;return cli?`Tip: use \`${cli}\` to search, install, and sync skills.`:`Tip: visit builderforce.ai/marketplace to browse and install skills.`}function appendSkillsHint(output,json,config){return json?output:`${output}\n\n${getSkillsHint(config)}`}function formatSkillStatus(skill){return skill.eligible?theme.success(`✓ ready`):skill.disabled?theme.warn(`⏸ disabled`):skill.blockedByAllowlist?theme.warn(`🚫 blocked`):theme.error(`✗ missing`)}function formatSkillName(skill){return`${skill.emoji??`📦`} ${theme.command(skill.name)}`}function formatSkillMissingSummary(skill){let missing=[];return skill.missing.bins.length>0&&missing.push(`bins: ${skill.missing.bins.join(`, `)}`),skill.missing.anyBins.length>0&&missing.push(`anyBins: ${skill.missing.anyBins.join(`, `)}`),skill.missing.env.length>0&&missing.push(`env: ${skill.missing.env.join(`, `)}`),skill.missing.config.length>0&&missing.push(`config: ${skill.missing.config.join(`, `)}`),skill.missing.os.length>0&&missing.push(`os: ${skill.missing.os.join(`, `)}`),missing.join(`; `)}function formatSkillsList(report,opts){let skills=opts.eligible?report.skills.filter(s=>s.eligible):report.skills;if(opts.json){let jsonReport={workspaceDir:report.workspaceDir,managedSkillsDir:report.managedSkillsDir,skills:skills.map(s=>({name:s.name,description:s.description,emoji:s.emoji,eligible:s.eligible,disabled:s.disabled,blockedByAllowlist:s.blockedByAllowlist,source:s.source,bundled:s.bundled,primaryEnv:s.primaryEnv,homepage:s.homepage,missing:s.missing}))};return JSON.stringify(jsonReport,null,2)}if(skills.length===0)return appendSkillsHint(opts.eligible?`No eligible skills found. Run \`${formatCliCommand(`builderforce skills list`)}\` to see all skills.`:`No skills found.`,opts.json,opts.config);let eligible=skills.filter(s=>s.eligible),tableWidth=Math.max(60,(process.stdout.columns??120)-1),rows=skills.map(skill=>{let missing=formatSkillMissingSummary(skill);return{Status:formatSkillStatus(skill),Skill:formatSkillName(skill),Description:theme.muted(skill.description),Source:skill.source??``,Missing:missing?theme.warn(missing):``}}),columns=[{key:`Status`,header:`Status`,minWidth:10},{key:`Skill`,header:`Skill`,minWidth:18,flex:!0},{key:`Description`,header:`Description`,minWidth:24,flex:!0},{key:`Source`,header:`Source`,minWidth:10}];opts.verbose&&columns.push({key:`Missing`,header:`Missing`,minWidth:18,flex:!0});let lines=[];return lines.push(`${theme.heading(`Skills`)} ${theme.muted(`(${eligible.length}/${skills.length} ready)`)}`),lines.push(renderTable({width:tableWidth,columns,rows}).trimEnd()),appendSkillsHint(lines.join(`
2
2
  `),opts.json,opts.config)}function formatSkillInfo(report,skillName,opts){let skill=report.skills.find(s=>s.name===skillName||s.skillKey===skillName);if(!skill)return opts.json?JSON.stringify({error:`not found`,skill:skillName},null,2):appendSkillsHint(`Skill "${skillName}" not found. Run \`${formatCliCommand(`builderforce skills list`)}\` to see available skills.`,opts.json,opts.config);if(opts.json)return JSON.stringify(skill,null,2);let lines=[],emoji=skill.emoji??`📦`,status=skill.eligible?theme.success(`✓ Ready`):skill.disabled?theme.warn(`⏸ Disabled`):skill.blockedByAllowlist?theme.warn(`🚫 Blocked by allowlist`):theme.error(`✗ Missing requirements`);if(lines.push(`${emoji} ${theme.heading(skill.name)} ${status}`),lines.push(``),lines.push(skill.description),lines.push(``),lines.push(theme.heading(`Details:`)),lines.push(`${theme.muted(` Source:`)} ${skill.source}`),lines.push(`${theme.muted(` Path:`)} ${shortenHomePath(skill.filePath)}`),skill.homepage&&lines.push(`${theme.muted(` Homepage:`)} ${skill.homepage}`),skill.primaryEnv&&lines.push(`${theme.muted(` Primary env:`)} ${skill.primaryEnv}`),skill.requirements.bins.length>0||skill.requirements.anyBins.length>0||skill.requirements.env.length>0||skill.requirements.config.length>0||skill.requirements.os.length>0){if(lines.push(``),lines.push(theme.heading(`Requirements:`)),skill.requirements.bins.length>0){let binsStatus=skill.requirements.bins.map(bin=>skill.missing.bins.includes(bin)?theme.error(`✗ ${bin}`):theme.success(`✓ ${bin}`));lines.push(`${theme.muted(` Binaries:`)} ${binsStatus.join(`, `)}`)}if(skill.requirements.anyBins.length>0){let anyBinsMissing=skill.missing.anyBins.length>0,anyBinsStatus=skill.requirements.anyBins.map(bin=>anyBinsMissing?theme.error(`✗ ${bin}`):theme.success(`✓ ${bin}`));lines.push(`${theme.muted(` Any binaries:`)} ${anyBinsStatus.join(`, `)}`)}if(skill.requirements.env.length>0){let envStatus=skill.requirements.env.map(env=>skill.missing.env.includes(env)?theme.error(`✗ ${env}`):theme.success(`✓ ${env}`));lines.push(`${theme.muted(` Environment:`)} ${envStatus.join(`, `)}`)}if(skill.requirements.config.length>0){let configStatus=skill.requirements.config.map(cfg=>skill.missing.config.includes(cfg)?theme.error(`✗ ${cfg}`):theme.success(`✓ ${cfg}`));lines.push(`${theme.muted(` Config:`)} ${configStatus.join(`, `)}`)}if(skill.requirements.os.length>0){let osStatus=skill.requirements.os.map(osName=>skill.missing.os.includes(osName)?theme.error(`✗ ${osName}`):theme.success(`✓ ${osName}`));lines.push(`${theme.muted(` OS:`)} ${osStatus.join(`, `)}`)}}if(skill.install.length>0&&!skill.eligible){lines.push(``),lines.push(theme.heading(`Install options:`));for(let inst of skill.install)lines.push(` ${theme.warn(`→`)} ${inst.label}`)}return appendSkillsHint(lines.join(`
3
3
  `),opts.json,opts.config)}function formatSkillsCheck(report,opts){let eligible=report.skills.filter(s=>s.eligible),disabled=report.skills.filter(s=>s.disabled),blocked=report.skills.filter(s=>s.blockedByAllowlist&&!s.disabled),missingReqs=report.skills.filter(s=>!s.eligible&&!s.disabled&&!s.blockedByAllowlist);if(opts.json)return JSON.stringify({summary:{total:report.skills.length,eligible:eligible.length,disabled:disabled.length,blocked:blocked.length,missingRequirements:missingReqs.length},eligible:eligible.map(s=>s.name),disabled:disabled.map(s=>s.name),blocked:blocked.map(s=>s.name),missingRequirements:missingReqs.map(s=>({name:s.name,missing:s.missing,install:s.install}))},null,2);let lines=[];if(lines.push(theme.heading(`Skills Status Check`)),lines.push(``),lines.push(`${theme.muted(`Total:`)} ${report.skills.length}`),lines.push(`${theme.success(`✓`)} ${theme.muted(`Eligible:`)} ${eligible.length}`),lines.push(`${theme.warn(`⏸`)} ${theme.muted(`Disabled:`)} ${disabled.length}`),lines.push(`${theme.warn(`🚫`)} ${theme.muted(`Blocked by allowlist:`)} ${blocked.length}`),lines.push(`${theme.error(`✗`)} ${theme.muted(`Missing requirements:`)} ${missingReqs.length}`),eligible.length>0){lines.push(``),lines.push(theme.heading(`Ready to use:`));for(let skill of eligible){let emoji=skill.emoji??`📦`;lines.push(` ${emoji} ${skill.name}`)}}if(missingReqs.length>0){lines.push(``),lines.push(theme.heading(`Missing requirements:`));for(let skill of missingReqs){let emoji=skill.emoji??`📦`,missing=formatSkillMissingSummary(skill);lines.push(` ${emoji} ${skill.name} ${theme.muted(`(${missing})`)}`)}}return appendSkillsHint(lines.join(`
4
4
  `),opts.json,opts.config)}function registerSkillsCli(program){let skills=program.command(`skills`).description(`List and inspect available skills`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/skills`,`docs.builderforce.ai/cli/skills`)}\n`);skills.command(`list`).description(`List all available skills`).option(`--json`,`Output as JSON`,!1).option(`--eligible`,`Show only eligible (ready to use) skills`,!1).option(`-v, --verbose`,`Show more details including missing requirements`,!1).action(async opts=>{try{let config=loadConfig(),workspaceDir=resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config)),{buildWorkspaceSkillStatus}=await import(`./skills-status-DwZhwdyd.js`),report=buildWorkspaceSkillStatus(workspaceDir,{config});defaultRuntime.log(formatSkillsList(report,{...opts,config}))}catch(err){defaultRuntime.error(String(err)),defaultRuntime.exit(1)}}),skills.command(`info`).description(`Show detailed information about a skill`).argument(`<name>`,`Skill name`).option(`--json`,`Output as JSON`,!1).action(async(name,opts)=>{try{let config=loadConfig(),workspaceDir=resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config)),{buildWorkspaceSkillStatus}=await import(`./skills-status-DwZhwdyd.js`),report=buildWorkspaceSkillStatus(workspaceDir,{config});defaultRuntime.log(formatSkillInfo(report,name,{...opts,config}))}catch(err){defaultRuntime.error(String(err)),defaultRuntime.exit(1)}}),skills.command(`check`).description(`Check which skills are ready vs missing requirements`).option(`--json`,`Output as JSON`,!1).action(async opts=>{try{let config=loadConfig(),workspaceDir=resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config)),{buildWorkspaceSkillStatus}=await import(`./skills-status-DwZhwdyd.js`),report=buildWorkspaceSkillStatus(workspaceDir,{config});defaultRuntime.log(formatSkillsCheck(report,{...opts,config}))}catch(err){defaultRuntime.error(String(err)),defaultRuntime.exit(1)}}),skills.action(async()=>{try{let config=loadConfig(),workspaceDir=resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config)),{buildWorkspaceSkillStatus}=await import(`./skills-status-DwZhwdyd.js`),report=buildWorkspaceSkillStatus(workspaceDir,{config});defaultRuntime.log(formatSkillsList(report,{config}))}catch(err){defaultRuntime.error(String(err)),defaultRuntime.exit(1)}})}export{registerSkillsCli};
@@ -1,4 +1,4 @@
1
- import{_ as resolveConfigDir,b as resolveUserPath,c as ensureDir}from"./utils-DbaBVFaK.js";import{t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import{d as hasBinary}from"./frontmatter-3D1EdC1L.js";import{b as resolveSkillKey,i as loadWorkspaceSkillEntries,t as resolveSkillsInstallPreferences}from"./skills-Ba4ftrB-.js";import{t as fetchWithSsrFGuard}from"./fetch-guard-8mwt3-hm.js";import{t as resolveBrewExecutable}from"./brew-D0IqDKHX.js";import{t as isWithinDir}from"./path-safety-CS-EmF4c.js";import{a as extractArchive$1,d as resolveArchiveOutputPath,f as stripArchivePath,p as validateArchiveEntryPath,r as safePathSegmentHashed,u as isWindowsDrivePath}from"./install-safe-path-DsLq2BUJ.js";import{t as scanDirectoryWithSummary}from"./skill-scanner-U3AJgjqc.js";import fs from"node:fs";import path from"node:path";import{pipeline}from"node:stream/promises";import{Readable}from"node:stream";function summarizeInstallOutput(text){let raw=text.trim();if(!raw)return;let lines=raw.split(`
1
+ import{_ as resolveConfigDir,b as resolveUserPath,c as ensureDir}from"./utils-DbaBVFaK.js";import{t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import{d as hasBinary}from"./frontmatter-3D1EdC1L.js";import{b as resolveSkillKey,i as loadWorkspaceSkillEntries,t as resolveSkillsInstallPreferences}from"./skills-Ba4ftrB-.js";import{t as fetchWithSsrFGuard}from"./fetch-guard-8mwt3-hm.js";import{t as resolveBrewExecutable}from"./brew-D0IqDKHX.js";import{t as isWithinDir}from"./path-safety-CS-EmF4c.js";import{a as extractArchive$1,d as resolveArchiveOutputPath,f as stripArchivePath,p as validateArchiveEntryPath,r as safePathSegmentHashed,u as isWindowsDrivePath}from"./install-safe-path-DsLq2BUJ.js";import{t as scanDirectoryWithSummary}from"./skill-scanner-BEvov9QH.js";import fs from"node:fs";import path from"node:path";import{pipeline}from"node:stream/promises";import{Readable}from"node:stream";function summarizeInstallOutput(text){let raw=text.trim();if(!raw)return;let lines=raw.split(`
2
2
  `).map(line=>line.trim()).filter(Boolean);if(lines.length===0)return;let preferred=lines.find(line=>/^error\b/i.test(line))??lines.find(line=>/\b(err!|error:|failed)\b/i.test(line))??lines.at(-1);if(!preferred)return;let normalized=preferred.replace(/\s+/g,` `).trim();return normalized.length>200?`${normalized.slice(0,199)}…`:normalized}function formatInstallFailureMessage(result){let code=typeof result.code==`number`?`exit ${result.code}`:`unknown exit`,summary=summarizeInstallOutput(result.stderr)??summarizeInstallOutput(result.stdout);return summary?`Install failed (${code}): ${summary}`:`Install failed (${code})`}function resolveSkillToolsRootDir(entry){let safeKey=safePathSegmentHashed(resolveSkillKey(entry.skill,entry));return path.join(resolveConfigDir(),`tools`,safeKey)}function isNodeReadableStream(value){return!!(value&&typeof value.pipe==`function`)}function resolveDownloadTargetDir(entry,spec){let safeRoot=resolveSkillToolsRootDir(entry),raw=spec.targetDir?.trim();if(!raw)return safeRoot;let resolved=raw.startsWith(`~`)||path.isAbsolute(raw)||isWindowsDrivePath(raw)?resolveUserPath(raw):path.resolve(safeRoot,raw);if(!isWithinDir(safeRoot,resolved))throw Error(`Refusing to install outside the skill tools directory. targetDir="${raw}" resolves to "${resolved}". Allowed root: "${safeRoot}".`);return resolved}function resolveArchiveType(spec,filename){let explicit=spec.archive?.trim().toLowerCase();if(explicit)return explicit;let lower=filename.toLowerCase();if(lower.endsWith(`.tar.gz`)||lower.endsWith(`.tgz`))return`tar.gz`;if(lower.endsWith(`.tar.bz2`)||lower.endsWith(`.tbz2`))return`tar.bz2`;if(lower.endsWith(`.zip`))return`zip`}async function downloadFile(url,destPath,timeoutMs){let{response,release}=await fetchWithSsrFGuard({url,timeoutMs:Math.max(1e3,timeoutMs)});try{if(!response.ok||!response.body)throw Error(`Download failed (${response.status} ${response.statusText})`);await ensureDir(path.dirname(destPath));let file=fs.createWriteStream(destPath),body=response.body;return await pipeline(isNodeReadableStream(body)?body:Readable.fromWeb(body),file),{bytes:(await fs.promises.stat(destPath)).size}}finally{await release()}}async function extractArchive(params){let{archivePath,archiveType,targetDir,stripComponents,timeoutMs}=params,strip=typeof stripComponents==`number`&&Number.isFinite(stripComponents)?Math.max(0,Math.floor(stripComponents)):0;try{if(archiveType===`zip`)return await extractArchive$1({archivePath,destDir:targetDir,timeoutMs,kind:`zip`,stripComponents:strip}),{stdout:``,stderr:``,code:0};if(archiveType===`tar.gz`)return await extractArchive$1({archivePath,destDir:targetDir,timeoutMs,kind:`tar`,stripComponents:strip,tarGzip:!0}),{stdout:``,stderr:``,code:0};if(archiveType===`tar.bz2`){if(!hasBinary(`tar`))return{stdout:``,stderr:`tar not found on PATH`,code:null};let listResult=await runCommandWithTimeout([`tar`,`tf`,archivePath],{timeoutMs});if(listResult.code!==0)return{stdout:listResult.stdout,stderr:listResult.stderr||`tar list failed`,code:listResult.code};let entries=listResult.stdout.split(`
3
3
  `).map(line=>line.trim()).filter(Boolean),verboseResult=await runCommandWithTimeout([`tar`,`tvf`,archivePath],{timeoutMs});if(verboseResult.code!==0)return{stdout:verboseResult.stdout,stderr:verboseResult.stderr||`tar verbose list failed`,code:verboseResult.code};for(let line of verboseResult.stdout.split(`
4
4
  `)){let trimmed=line.trim();if(!trimmed)continue;let typeChar=trimmed[0];if(typeChar===`l`||typeChar===`h`||trimmed.includes(` -> `))return{stdout:verboseResult.stdout,stderr:`tar archive contains link entries; refusing to extract for safety`,code:1}}for(let entry of entries){validateArchiveEntryPath(entry,{escapeLabel:`targetDir`});let relPath=stripArchivePath(entry,strip);relPath&&(validateArchiveEntryPath(relPath,{escapeLabel:`targetDir`}),resolveArchiveOutputPath({rootDir:targetDir,relPath,originalPath:entry,escapeLabel:`targetDir`}))}let argv=[`tar`,`xf`,archivePath,`-C`,targetDir];return strip>0&&argv.push(`--strip-components`,String(strip)),await runCommandWithTimeout(argv,{timeoutMs})}return{stdout:``,stderr:`unsupported archive type: ${archiveType}`,code:null}}catch(err){return{stdout:``,stderr:err instanceof Error?err.message:String(err),code:1}}}async function installDownloadSpec(params){let{entry,spec,timeoutMs}=params,url=spec.url?.trim();if(!url)return{ok:!1,message:`missing download url`,stdout:``,stderr:``,code:null};let filename=``;try{let parsed=new URL(url);filename=path.basename(parsed.pathname)}catch{filename=path.basename(url)}filename||=`download`;let targetDir=``;try{targetDir=resolveDownloadTargetDir(entry,spec),await ensureDir(targetDir);let stat=await fs.promises.lstat(targetDir);if(stat.isSymbolicLink())throw Error(`targetDir is a symlink: ${targetDir}`);if(!stat.isDirectory())throw Error(`targetDir is not a directory: ${targetDir}`)}catch(err){let message=err instanceof Error?err.message:String(err);return{ok:!1,message,stdout:``,stderr:message,code:null}}let archivePath=path.join(targetDir,filename),downloaded=0;try{downloaded=(await downloadFile(url,archivePath,timeoutMs)).bytes}catch(err){let message=err instanceof Error?err.message:String(err);return{ok:!1,message,stdout:``,stderr:message,code:null}}let archiveType=resolveArchiveType(spec,filename);if(!(spec.extract??!!archiveType))return{ok:!0,message:`Downloaded to ${archivePath}`,stdout:`downloaded=${downloaded}`,stderr:``,code:0};if(!archiveType)return{ok:!1,message:`extract requested but archive type could not be detected`,stdout:``,stderr:``,code:null};let extractResult=await extractArchive({archivePath,archiveType,targetDir,stripComponents:spec.stripComponents,timeoutMs}),success=extractResult.code===0;return{ok:success,message:success?`Downloaded and extracted to ${targetDir}`:formatInstallFailureMessage(extractResult),stdout:extractResult.stdout.trim(),stderr:extractResult.stderr.trim(),code:extractResult.code}}function withWarnings(result,warnings){return warnings.length===0?result:{...result,warnings:warnings.slice()}}function formatScanFindingDetail(rootDir,finding){let relativePath=path.relative(rootDir,finding.file),filePath=relativePath&&relativePath!==`.`&&!relativePath.startsWith(`..`)?relativePath:path.basename(finding.file);return`${finding.message} (${filePath}:${finding.line})`}async function collectSkillInstallScanWarnings(entry){let warnings=[],skillName=entry.skill.name,skillDir=path.resolve(entry.skill.baseDir);try{let summary=await scanDirectoryWithSummary(skillDir);if(summary.critical>0){let criticalDetails=summary.findings.filter(finding=>finding.severity===`critical`).map(finding=>formatScanFindingDetail(skillDir,finding)).join(`; `);warnings.push(`WARNING: Skill "${skillName}" contains dangerous code patterns: ${criticalDetails}`)}else summary.warn>0&&warnings.push(`Skill "${skillName}" has ${summary.warn} suspicious code pattern(s). Run "builderforce security audit --deep" for details.`)}catch(err){warnings.push(`Skill "${skillName}" code safety scan failed (${String(err)}). Installation continues; run "builderforce security audit --deep" after install.`)}return warnings}function resolveInstallId(spec,index){return(spec.id??`${spec.kind}-${index}`).trim()}function findInstallSpec(entry,installId){let specs=entry.metadata?.install??[];for(let[index,spec]of specs.entries())if(resolveInstallId(spec,index)===installId)return spec}function buildNodeInstallCommand(packageName,prefs){switch(prefs.nodeManager){case`pnpm`:return[`pnpm`,`add`,`-g`,`--ignore-scripts`,packageName];case`yarn`:return[`yarn`,`global`,`add`,`--ignore-scripts`,packageName];case`bun`:return[`bun`,`add`,`-g`,`--ignore-scripts`,packageName];default:return[`npm`,`install`,`-g`,`--ignore-scripts`,packageName]}}function buildInstallCommand(spec,prefs){switch(spec.kind){case`brew`:return spec.formula?{argv:[`brew`,`install`,spec.formula]}:{argv:null,error:`missing brew formula`};case`node`:return spec.package?{argv:buildNodeInstallCommand(spec.package,prefs)}:{argv:null,error:`missing node package`};case`go`:return spec.module?{argv:[`go`,`install`,spec.module]}:{argv:null,error:`missing go module`};case`uv`:return spec.package?{argv:[`uv`,`tool`,`install`,spec.package]}:{argv:null,error:`missing uv package`};case`download`:return{argv:null,error:`download install handled separately`};default:return{argv:null,error:`unsupported installer`}}}async function resolveBrewBinDir(timeoutMs,brewExe){let exe=brewExe??(hasBinary(`brew`)?`brew`:resolveBrewExecutable());if(!exe)return;let prefixResult=await runCommandWithTimeout([exe,`--prefix`],{timeoutMs:Math.min(timeoutMs,3e4)});if(prefixResult.code===0){let prefix=prefixResult.stdout.trim();if(prefix)return path.join(prefix,`bin`)}let envPrefix=process.env.HOMEBREW_PREFIX?.trim();if(envPrefix)return path.join(envPrefix,`bin`);for(let candidate of[`/opt/homebrew/bin`,`/usr/local/bin`])try{if(fs.existsSync(candidate))return candidate}catch{}}function createInstallFailure(params){return{ok:!1,message:params.message,stdout:params.stdout?.trim()??``,stderr:params.stderr?.trim()??``,code:params.code??null}}function createInstallSuccess(result){return{ok:!0,message:`Installed`,stdout:result.stdout.trim(),stderr:result.stderr.trim(),code:result.code}}async function runCommandSafely(argv,optionsOrTimeout){try{let result=await runCommandWithTimeout(argv,optionsOrTimeout);return{code:result.code,stdout:result.stdout,stderr:result.stderr}}catch(err){return{code:null,stdout:``,stderr:err instanceof Error?err.message:String(err)}}}async function runBestEffortCommand(argv,optionsOrTimeout){await runCommandSafely(argv,optionsOrTimeout)}function resolveBrewMissingFailure(spec){let formula=spec.formula??`this package`;return createInstallFailure({message:`brew not installed — ${process.platform===`linux`?`Homebrew is not installed. Install it from https://brew.sh or install "${formula}" manually using your system package manager (e.g. apt, dnf, pacman).`:`Homebrew is not installed. Install it from https://brew.sh`}`})}async function ensureUvInstalled(params){if(params.spec.kind!==`uv`||hasBinary(`uv`))return;if(!params.brewExe)return createInstallFailure({message:`uv not installed — install manually: https://docs.astral.sh/uv/getting-started/installation/`});let brewResult=await runCommandSafely([params.brewExe,`install`,`uv`],{timeoutMs:params.timeoutMs});if(brewResult.code!==0)return createInstallFailure({message:`Failed to install uv (brew)`,...brewResult})}async function installGoViaApt(timeoutMs){let aptInstallArgv=[`apt-get`,`install`,`-y`,`golang-go`],aptUpdateArgv=[`apt-get`,`update`,`-qq`],aptFailureMessage=`go not installed — automatic install via apt failed. Install manually: https://go.dev/doc/install`;if(typeof process.getuid==`function`&&process.getuid()===0){await runBestEffortCommand(aptUpdateArgv,{timeoutMs});let aptResult=await runCommandSafely(aptInstallArgv,{timeoutMs});return aptResult.code===0?void 0:createInstallFailure({message:aptFailureMessage,...aptResult})}if(!hasBinary(`sudo`))return createInstallFailure({message:`go not installed — apt-get is available but sudo is not installed. Install manually: https://go.dev/doc/install`});let sudoCheck=await runCommandSafely([`sudo`,`-n`,`true`],{timeoutMs:5e3});if(sudoCheck.code!==0)return createInstallFailure({message:`go not installed — apt-get is available but sudo is not usable (missing or requires a password). Install manually: https://go.dev/doc/install`,...sudoCheck});await runBestEffortCommand([`sudo`,...aptUpdateArgv],{timeoutMs});let aptResult=await runCommandSafely([`sudo`,...aptInstallArgv],{timeoutMs});if(aptResult.code!==0)return createInstallFailure({message:aptFailureMessage,...aptResult})}async function ensureGoInstalled(params){if(!(params.spec.kind!==`go`||hasBinary(`go`))){if(params.brewExe){let brewResult=await runCommandSafely([params.brewExe,`install`,`go`],{timeoutMs:params.timeoutMs});return brewResult.code===0?void 0:createInstallFailure({message:`Failed to install go (brew)`,...brewResult})}return hasBinary(`apt-get`)?installGoViaApt(params.timeoutMs):createInstallFailure({message:`go not installed — install manually: https://go.dev/doc/install`})}}async function executeInstallCommand(params){if(!params.argv||params.argv.length===0)return createInstallFailure({message:`invalid install command`});let result=await runCommandSafely(params.argv,{timeoutMs:params.timeoutMs,env:params.env});return result.code===0?createInstallSuccess(result):createInstallFailure({message:formatInstallFailureMessage(result),...result})}async function installSkill(params){let timeoutMs=Math.min(Math.max(params.timeoutMs??3e5,1e3),9e5),entry=loadWorkspaceSkillEntries(resolveUserPath(params.workspaceDir)).find(item=>item.skill.name===params.skillName);if(!entry)return{ok:!1,message:`Skill not found: ${params.skillName}`,stdout:``,stderr:``,code:null};let spec=findInstallSpec(entry,params.installId),warnings=await collectSkillInstallScanWarnings(entry);if(!spec)return withWarnings({ok:!1,message:`Installer not found: ${params.installId}`,stdout:``,stderr:``,code:null},warnings);if(spec.kind===`download`)return withWarnings(await installDownloadSpec({entry,spec,timeoutMs}),warnings);let command=buildInstallCommand(spec,resolveSkillsInstallPreferences(params.config));if(command.error)return withWarnings({ok:!1,message:command.error,stdout:``,stderr:``,code:null},warnings);let brewExe=hasBinary(`brew`)?`brew`:resolveBrewExecutable();if(spec.kind===`brew`&&!brewExe)return withWarnings(resolveBrewMissingFailure(spec),warnings);let uvInstallFailure=await ensureUvInstalled({spec,brewExe,timeoutMs});if(uvInstallFailure)return withWarnings(uvInstallFailure,warnings);let goInstallFailure=await ensureGoInstalled({spec,brewExe,timeoutMs});if(goInstallFailure)return withWarnings(goInstallFailure,warnings);let argv=command.argv?[...command.argv]:null;spec.kind===`brew`&&brewExe&&argv?.[0]===`brew`&&(argv[0]=brewExe);let env;if(spec.kind===`go`&&brewExe){let brewBin=await resolveBrewBinDir(timeoutMs,brewExe);brewBin&&(env={GOBIN:brewBin})}return withWarnings(await executeInstallCommand({argv,timeoutMs,env}),warnings)}export{installSkill as t};
@@ -1,4 +1,4 @@
1
- import{g as resolveConfigDir,s as ensureDir,y as resolveUserPath}from"./utils-BP60e80M.js";import{t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import{d as hasBinary}from"./frontmatter-CaY7feZm.js";import{b as resolveSkillKey,i as loadWorkspaceSkillEntries,t as resolveSkillsInstallPreferences}from"./skills-D3MwwPOH.js";import{t as fetchWithSsrFGuard}from"./fetch-guard-DnXqPKae.js";import{t as resolveBrewExecutable}from"./brew-DQZLihbS.js";import{t as isWithinDir}from"./path-safety-D04ClLIY.js";import{a as extractArchive$1,d as resolveArchiveOutputPath,f as stripArchivePath,p as validateArchiveEntryPath,r as safePathSegmentHashed,u as isWindowsDrivePath}from"./install-safe-path-ObPl6zIf.js";import{t as scanDirectoryWithSummary}from"./skill-scanner-DEmbPsRh.js";import path from"node:path";import fs from"node:fs";import{pipeline}from"node:stream/promises";import{Readable}from"node:stream";function summarizeInstallOutput(text){let raw=text.trim();if(!raw)return;let lines=raw.split(`
1
+ import{g as resolveConfigDir,s as ensureDir,y as resolveUserPath}from"./utils-BP60e80M.js";import{t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import{d as hasBinary}from"./frontmatter-CaY7feZm.js";import{b as resolveSkillKey,i as loadWorkspaceSkillEntries,t as resolveSkillsInstallPreferences}from"./skills-D3MwwPOH.js";import{t as fetchWithSsrFGuard}from"./fetch-guard-DnXqPKae.js";import{t as resolveBrewExecutable}from"./brew-DQZLihbS.js";import{t as isWithinDir}from"./path-safety-D04ClLIY.js";import{a as extractArchive$1,d as resolveArchiveOutputPath,f as stripArchivePath,p as validateArchiveEntryPath,r as safePathSegmentHashed,u as isWindowsDrivePath}from"./install-safe-path-ObPl6zIf.js";import{t as scanDirectoryWithSummary}from"./skill-scanner-OTLeRZ_p.js";import path from"node:path";import fs from"node:fs";import{pipeline}from"node:stream/promises";import{Readable}from"node:stream";function summarizeInstallOutput(text){let raw=text.trim();if(!raw)return;let lines=raw.split(`
2
2
  `).map(line=>line.trim()).filter(Boolean);if(lines.length===0)return;let preferred=lines.find(line=>/^error\b/i.test(line))??lines.find(line=>/\b(err!|error:|failed)\b/i.test(line))??lines.at(-1);if(!preferred)return;let normalized=preferred.replace(/\s+/g,` `).trim();return normalized.length>200?`${normalized.slice(0,199)}…`:normalized}function formatInstallFailureMessage(result){let code=typeof result.code==`number`?`exit ${result.code}`:`unknown exit`,summary=summarizeInstallOutput(result.stderr)??summarizeInstallOutput(result.stdout);return summary?`Install failed (${code}): ${summary}`:`Install failed (${code})`}function resolveSkillToolsRootDir(entry){let safeKey=safePathSegmentHashed(resolveSkillKey(entry.skill,entry));return path.join(resolveConfigDir(),`tools`,safeKey)}function isNodeReadableStream(value){return!!(value&&typeof value.pipe==`function`)}function resolveDownloadTargetDir(entry,spec){let safeRoot=resolveSkillToolsRootDir(entry),raw=spec.targetDir?.trim();if(!raw)return safeRoot;let resolved=raw.startsWith(`~`)||path.isAbsolute(raw)||isWindowsDrivePath(raw)?resolveUserPath(raw):path.resolve(safeRoot,raw);if(!isWithinDir(safeRoot,resolved))throw Error(`Refusing to install outside the skill tools directory. targetDir="${raw}" resolves to "${resolved}". Allowed root: "${safeRoot}".`);return resolved}function resolveArchiveType(spec,filename){let explicit=spec.archive?.trim().toLowerCase();if(explicit)return explicit;let lower=filename.toLowerCase();if(lower.endsWith(`.tar.gz`)||lower.endsWith(`.tgz`))return`tar.gz`;if(lower.endsWith(`.tar.bz2`)||lower.endsWith(`.tbz2`))return`tar.bz2`;if(lower.endsWith(`.zip`))return`zip`}async function downloadFile(url,destPath,timeoutMs){let{response,release}=await fetchWithSsrFGuard({url,timeoutMs:Math.max(1e3,timeoutMs)});try{if(!response.ok||!response.body)throw Error(`Download failed (${response.status} ${response.statusText})`);await ensureDir(path.dirname(destPath));let file=fs.createWriteStream(destPath),body=response.body;return await pipeline(isNodeReadableStream(body)?body:Readable.fromWeb(body),file),{bytes:(await fs.promises.stat(destPath)).size}}finally{await release()}}async function extractArchive(params){let{archivePath,archiveType,targetDir,stripComponents,timeoutMs}=params,strip=typeof stripComponents==`number`&&Number.isFinite(stripComponents)?Math.max(0,Math.floor(stripComponents)):0;try{if(archiveType===`zip`)return await extractArchive$1({archivePath,destDir:targetDir,timeoutMs,kind:`zip`,stripComponents:strip}),{stdout:``,stderr:``,code:0};if(archiveType===`tar.gz`)return await extractArchive$1({archivePath,destDir:targetDir,timeoutMs,kind:`tar`,stripComponents:strip,tarGzip:!0}),{stdout:``,stderr:``,code:0};if(archiveType===`tar.bz2`){if(!hasBinary(`tar`))return{stdout:``,stderr:`tar not found on PATH`,code:null};let listResult=await runCommandWithTimeout([`tar`,`tf`,archivePath],{timeoutMs});if(listResult.code!==0)return{stdout:listResult.stdout,stderr:listResult.stderr||`tar list failed`,code:listResult.code};let entries=listResult.stdout.split(`
3
3
  `).map(line=>line.trim()).filter(Boolean),verboseResult=await runCommandWithTimeout([`tar`,`tvf`,archivePath],{timeoutMs});if(verboseResult.code!==0)return{stdout:verboseResult.stdout,stderr:verboseResult.stderr||`tar verbose list failed`,code:verboseResult.code};for(let line of verboseResult.stdout.split(`
4
4
  `)){let trimmed=line.trim();if(!trimmed)continue;let typeChar=trimmed[0];if(typeChar===`l`||typeChar===`h`||trimmed.includes(` -> `))return{stdout:verboseResult.stdout,stderr:`tar archive contains link entries; refusing to extract for safety`,code:1}}for(let entry of entries){validateArchiveEntryPath(entry,{escapeLabel:`targetDir`});let relPath=stripArchivePath(entry,strip);relPath&&(validateArchiveEntryPath(relPath,{escapeLabel:`targetDir`}),resolveArchiveOutputPath({rootDir:targetDir,relPath,originalPath:entry,escapeLabel:`targetDir`}))}let argv=[`tar`,`xf`,archivePath,`-C`,targetDir];return strip>0&&argv.push(`--strip-components`,String(strip)),await runCommandWithTimeout(argv,{timeoutMs})}return{stdout:``,stderr:`unsupported archive type: ${archiveType}`,code:null}}catch(err){return{stdout:``,stderr:err instanceof Error?err.message:String(err),code:1}}}async function installDownloadSpec(params){let{entry,spec,timeoutMs}=params,url=spec.url?.trim();if(!url)return{ok:!1,message:`missing download url`,stdout:``,stderr:``,code:null};let filename=``;try{let parsed=new URL(url);filename=path.basename(parsed.pathname)}catch{filename=path.basename(url)}filename||=`download`;let targetDir=``;try{targetDir=resolveDownloadTargetDir(entry,spec),await ensureDir(targetDir);let stat=await fs.promises.lstat(targetDir);if(stat.isSymbolicLink())throw Error(`targetDir is a symlink: ${targetDir}`);if(!stat.isDirectory())throw Error(`targetDir is not a directory: ${targetDir}`)}catch(err){let message=err instanceof Error?err.message:String(err);return{ok:!1,message,stdout:``,stderr:message,code:null}}let archivePath=path.join(targetDir,filename),downloaded=0;try{downloaded=(await downloadFile(url,archivePath,timeoutMs)).bytes}catch(err){let message=err instanceof Error?err.message:String(err);return{ok:!1,message,stdout:``,stderr:message,code:null}}let archiveType=resolveArchiveType(spec,filename);if(!(spec.extract??!!archiveType))return{ok:!0,message:`Downloaded to ${archivePath}`,stdout:`downloaded=${downloaded}`,stderr:``,code:0};if(!archiveType)return{ok:!1,message:`extract requested but archive type could not be detected`,stdout:``,stderr:``,code:null};let extractResult=await extractArchive({archivePath,archiveType,targetDir,stripComponents:spec.stripComponents,timeoutMs}),success=extractResult.code===0;return{ok:success,message:success?`Downloaded and extracted to ${targetDir}`:formatInstallFailureMessage(extractResult),stdout:extractResult.stdout.trim(),stderr:extractResult.stderr.trim(),code:extractResult.code}}function withWarnings(result,warnings){return warnings.length===0?result:{...result,warnings:warnings.slice()}}function formatScanFindingDetail(rootDir,finding){let relativePath=path.relative(rootDir,finding.file),filePath=relativePath&&relativePath!==`.`&&!relativePath.startsWith(`..`)?relativePath:path.basename(finding.file);return`${finding.message} (${filePath}:${finding.line})`}async function collectSkillInstallScanWarnings(entry){let warnings=[],skillName=entry.skill.name,skillDir=path.resolve(entry.skill.baseDir);try{let summary=await scanDirectoryWithSummary(skillDir);if(summary.critical>0){let criticalDetails=summary.findings.filter(finding=>finding.severity===`critical`).map(finding=>formatScanFindingDetail(skillDir,finding)).join(`; `);warnings.push(`WARNING: Skill "${skillName}" contains dangerous code patterns: ${criticalDetails}`)}else summary.warn>0&&warnings.push(`Skill "${skillName}" has ${summary.warn} suspicious code pattern(s). Run "builderforce security audit --deep" for details.`)}catch(err){warnings.push(`Skill "${skillName}" code safety scan failed (${String(err)}). Installation continues; run "builderforce security audit --deep" after install.`)}return warnings}function resolveInstallId(spec,index){return(spec.id??`${spec.kind}-${index}`).trim()}function findInstallSpec(entry,installId){let specs=entry.metadata?.install??[];for(let[index,spec]of specs.entries())if(resolveInstallId(spec,index)===installId)return spec}function buildNodeInstallCommand(packageName,prefs){switch(prefs.nodeManager){case`pnpm`:return[`pnpm`,`add`,`-g`,`--ignore-scripts`,packageName];case`yarn`:return[`yarn`,`global`,`add`,`--ignore-scripts`,packageName];case`bun`:return[`bun`,`add`,`-g`,`--ignore-scripts`,packageName];default:return[`npm`,`install`,`-g`,`--ignore-scripts`,packageName]}}function buildInstallCommand(spec,prefs){switch(spec.kind){case`brew`:return spec.formula?{argv:[`brew`,`install`,spec.formula]}:{argv:null,error:`missing brew formula`};case`node`:return spec.package?{argv:buildNodeInstallCommand(spec.package,prefs)}:{argv:null,error:`missing node package`};case`go`:return spec.module?{argv:[`go`,`install`,spec.module]}:{argv:null,error:`missing go module`};case`uv`:return spec.package?{argv:[`uv`,`tool`,`install`,spec.package]}:{argv:null,error:`missing uv package`};case`download`:return{argv:null,error:`download install handled separately`};default:return{argv:null,error:`unsupported installer`}}}async function resolveBrewBinDir(timeoutMs,brewExe){let exe=brewExe??(hasBinary(`brew`)?`brew`:resolveBrewExecutable());if(!exe)return;let prefixResult=await runCommandWithTimeout([exe,`--prefix`],{timeoutMs:Math.min(timeoutMs,3e4)});if(prefixResult.code===0){let prefix=prefixResult.stdout.trim();if(prefix)return path.join(prefix,`bin`)}let envPrefix=process.env.HOMEBREW_PREFIX?.trim();if(envPrefix)return path.join(envPrefix,`bin`);for(let candidate of[`/opt/homebrew/bin`,`/usr/local/bin`])try{if(fs.existsSync(candidate))return candidate}catch{}}function createInstallFailure(params){return{ok:!1,message:params.message,stdout:params.stdout?.trim()??``,stderr:params.stderr?.trim()??``,code:params.code??null}}function createInstallSuccess(result){return{ok:!0,message:`Installed`,stdout:result.stdout.trim(),stderr:result.stderr.trim(),code:result.code}}async function runCommandSafely(argv,optionsOrTimeout){try{let result=await runCommandWithTimeout(argv,optionsOrTimeout);return{code:result.code,stdout:result.stdout,stderr:result.stderr}}catch(err){return{code:null,stdout:``,stderr:err instanceof Error?err.message:String(err)}}}async function runBestEffortCommand(argv,optionsOrTimeout){await runCommandSafely(argv,optionsOrTimeout)}function resolveBrewMissingFailure(spec){let formula=spec.formula??`this package`;return createInstallFailure({message:`brew not installed — ${process.platform===`linux`?`Homebrew is not installed. Install it from https://brew.sh or install "${formula}" manually using your system package manager (e.g. apt, dnf, pacman).`:`Homebrew is not installed. Install it from https://brew.sh`}`})}async function ensureUvInstalled(params){if(params.spec.kind!==`uv`||hasBinary(`uv`))return;if(!params.brewExe)return createInstallFailure({message:`uv not installed — install manually: https://docs.astral.sh/uv/getting-started/installation/`});let brewResult=await runCommandSafely([params.brewExe,`install`,`uv`],{timeoutMs:params.timeoutMs});if(brewResult.code!==0)return createInstallFailure({message:`Failed to install uv (brew)`,...brewResult})}async function installGoViaApt(timeoutMs){let aptInstallArgv=[`apt-get`,`install`,`-y`,`golang-go`],aptUpdateArgv=[`apt-get`,`update`,`-qq`],aptFailureMessage=`go not installed — automatic install via apt failed. Install manually: https://go.dev/doc/install`;if(typeof process.getuid==`function`&&process.getuid()===0){await runBestEffortCommand(aptUpdateArgv,{timeoutMs});let aptResult=await runCommandSafely(aptInstallArgv,{timeoutMs});return aptResult.code===0?void 0:createInstallFailure({message:aptFailureMessage,...aptResult})}if(!hasBinary(`sudo`))return createInstallFailure({message:`go not installed — apt-get is available but sudo is not installed. Install manually: https://go.dev/doc/install`});let sudoCheck=await runCommandSafely([`sudo`,`-n`,`true`],{timeoutMs:5e3});if(sudoCheck.code!==0)return createInstallFailure({message:`go not installed — apt-get is available but sudo is not usable (missing or requires a password). Install manually: https://go.dev/doc/install`,...sudoCheck});await runBestEffortCommand([`sudo`,...aptUpdateArgv],{timeoutMs});let aptResult=await runCommandSafely([`sudo`,...aptInstallArgv],{timeoutMs});if(aptResult.code!==0)return createInstallFailure({message:aptFailureMessage,...aptResult})}async function ensureGoInstalled(params){if(!(params.spec.kind!==`go`||hasBinary(`go`))){if(params.brewExe){let brewResult=await runCommandSafely([params.brewExe,`install`,`go`],{timeoutMs:params.timeoutMs});return brewResult.code===0?void 0:createInstallFailure({message:`Failed to install go (brew)`,...brewResult})}return hasBinary(`apt-get`)?installGoViaApt(params.timeoutMs):createInstallFailure({message:`go not installed — install manually: https://go.dev/doc/install`})}}async function executeInstallCommand(params){if(!params.argv||params.argv.length===0)return createInstallFailure({message:`invalid install command`});let result=await runCommandSafely(params.argv,{timeoutMs:params.timeoutMs,env:params.env});return result.code===0?createInstallSuccess(result):createInstallFailure({message:formatInstallFailureMessage(result),...result})}async function installSkill(params){let timeoutMs=Math.min(Math.max(params.timeoutMs??3e5,1e3),9e5),entry=loadWorkspaceSkillEntries(resolveUserPath(params.workspaceDir)).find(item=>item.skill.name===params.skillName);if(!entry)return{ok:!1,message:`Skill not found: ${params.skillName}`,stdout:``,stderr:``,code:null};let spec=findInstallSpec(entry,params.installId),warnings=await collectSkillInstallScanWarnings(entry);if(!spec)return withWarnings({ok:!1,message:`Installer not found: ${params.installId}`,stdout:``,stderr:``,code:null},warnings);if(spec.kind===`download`)return withWarnings(await installDownloadSpec({entry,spec,timeoutMs}),warnings);let command=buildInstallCommand(spec,resolveSkillsInstallPreferences(params.config));if(command.error)return withWarnings({ok:!1,message:command.error,stdout:``,stderr:``,code:null},warnings);let brewExe=hasBinary(`brew`)?`brew`:resolveBrewExecutable();if(spec.kind===`brew`&&!brewExe)return withWarnings(resolveBrewMissingFailure(spec),warnings);let uvInstallFailure=await ensureUvInstalled({spec,brewExe,timeoutMs});if(uvInstallFailure)return withWarnings(uvInstallFailure,warnings);let goInstallFailure=await ensureGoInstalled({spec,brewExe,timeoutMs});if(goInstallFailure)return withWarnings(goInstallFailure,warnings);let argv=command.argv?[...command.argv]:null;spec.kind===`brew`&&brewExe&&argv?.[0]===`brew`&&(argv[0]=brewExe);let env;if(spec.kind===`go`&&brewExe){let brewBin=await resolveBrewBinDir(timeoutMs,brewExe);brewBin&&(env={GOBIN:brewBin})}return withWarnings(await executeInstallCommand({argv,timeoutMs,env}),warnings)}export{installSkill as t};
@@ -1 +1 @@
1
- import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{c as resolveAgentWorkspaceDir,k as resolveDefaultAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-CufEmNj_.js";import{r as loadConfig}from"./io-CohJffHG.js";import{C as createPluginLoaderLogger,w as loadBuilderForceAgentsPlugins}from"./subagent-registry-CyGxu3kP.js";const log=createSubsystemLogger(`plugins`);function buildPluginStatusReport(params){let config=params?.config??loadConfig(),workspaceDir=params?.workspaceDir?params.workspaceDir:resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config))??resolveDefaultAgentWorkspaceDir();return{workspaceDir,...loadBuilderForceAgentsPlugins({config,workspaceDir,logger:createPluginLoaderLogger(log)})}}export{buildPluginStatusReport as t};
1
+ import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{c as resolveAgentWorkspaceDir,k as resolveDefaultAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-CufEmNj_.js";import{r as loadConfig}from"./io-D9hC2aG0.js";import{C as createPluginLoaderLogger,w as loadBuilderForceAgentsPlugins}from"./subagent-registry-DDEN4oJi.js";const log=createSubsystemLogger(`plugins`);function buildPluginStatusReport(params){let config=params?.config??loadConfig(),workspaceDir=params?.workspaceDir?params.workspaceDir:resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config))??resolveDefaultAgentWorkspaceDir();return{workspaceDir,...loadBuilderForceAgentsPlugins({config,workspaceDir,logger:createPluginLoaderLogger(log)})}}export{buildPluginStatusReport as t};
@@ -1,4 +1,4 @@
1
- import{u as resolveGatewayPort}from"./paths-BHg-VHB4.js";import{O as info,R as isRich,z as theme}from"./utils-BP60e80M.js";import{H as resolveConfiguredModelRef,_n as DEFAULT_PROVIDER,gn as DEFAULT_MODEL,hn as DEFAULT_CONTEXT_TOKENS}from"./auth-profiles-C1VbcUOm.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{C as parseAgentSessionKey}from"./session-key-CksCYipj.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{n as runExec}from"./exec-COgsU9ql.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir}from"./agent-scope-CufEmNj_.js";import{U as VERSION,a as readConfigFileSnapshot,r as loadConfig}from"./io-CohJffHG.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-CGlKz1D1.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-DmAU4cRX.js";import{Bn as peekSystemEvents,X as sha256HexPrefix,br as summarizeRestartSentinel,cn as getRemoteSkillEligibility,en as buildChannelSummary,nn as formatChannelAllowFrom,tn as buildChannelAccountSnapshot,yr as readRestartSentinel}from"./subagent-registry-CyGxu3kP.js";import{N as resolveMainSessionKey,a as loadSessionStore,k as resolveFreshSessionTotalTokens}from"./sessions-Bl1wwotX.js";import{n as listChannelPlugins}from"./plugins-1Mn6RiNf.js";import{o as getTailnetHostname,s as readTailscaleStatusJson}from"./tailscale-DV-yOmYe.js";import{a as formatPortDiagnostics,n as inspectPortUsage}from"./ports-DTku9NSx.js";import{c as resolveStorePath}from"./paths-ClsbsPQP.js";import{r as getMemorySearchManager}from"./memory-cli-ivAs7q7v.js";import{n as formatTimeAgo}from"./format-relative-CruqE52s.js";import{l as resolveSessionModelRef,n as classifySessionKey,r as listAgentsForGateway,u as lookupContextTokens}from"./session-utils-GMvum00v.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import{n as formatUsageReportLines,t as loadProviderUsageSummary}from"./provider-usage-Bn4ZrnU7.js";import{n as withProgress}from"./progress-Cqb-jAjT.js";import{C as normalizeControlUiBasePath,g as resolveControlUiLinks}from"./onboard-helpers-CckrS8_K.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DPPVplyk.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-NLYb8w9i.js";import{s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-EKJG69M3.js";import{r as formatRuntimeStatusWithDetails,t as readLastGatewayErrorLine}from"./diagnostics-DamNPi4e.js";import{t as renderTable}from"./table-BFCCZDsp.js";import{a as resolveGatewayProbeAuth$1,c as probeGateway,t as runSecurityAudit}from"./audit-DBjjjW93.js";import{a as resolveHeartbeatSummaryForAgent,t as formatHealthChannelLines}from"./health-DVo8a9yg.js";import{_ as resolveUpdateChannelDisplay,h as normalizeUpdateChannel,i as formatGitInstallLabel,t as checkUpdateStatus}from"./update-check-B0YqSZJr.js";import{t as resolveNodeService}from"./node-service-77UF0ACm.js";import{n as redactSecrets,t as formatGatewayAuthUsed}from"./format-BYLQK2kz.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,r as getUpdateCheckResult,t as formatUpdateAvailableHint}from"./status.update-KYyRSDZY.js";import{spawnSync}from"node:child_process";import os from"node:os";import fs from"node:fs";import fs$1 from"node:fs/promises";function pickGatewaySelfPresence(presence){if(!Array.isArray(presence))return null;let entries=presence,self=entries.find(e=>e.mode===`gateway`&&e.reason===`self`)??entries.find(e=>typeof e.text==`string`&&String(e.text).startsWith(`Gateway:`))??null;return self?{host:typeof self.host==`string`?self.host:void 0,ip:typeof self.ip==`string`?self.ip:void 0,version:typeof self.version==`string`?self.version:void 0,platform:typeof self.platform==`string`?self.platform:void 0}:null}function resolveMemoryVectorState(vector){return vector.enabled?vector.available===!0?{tone:`ok`,state:`ready`}:vector.available===!1?{tone:`warn`,state:`unavailable`}:{tone:`muted`,state:`unknown`}:{tone:`muted`,state:`disabled`}}function resolveMemoryFtsState(fts){return fts.enabled?fts.available?{tone:`ok`,state:`ready`}:{tone:`warn`,state:`unavailable`}:{tone:`muted`,state:`disabled`}}function resolveMemoryCacheSummary(cache){return cache.enabled?{tone:`ok`,text:`cache on${typeof cache.entries==`number`?` (${cache.entries})`:``}`}:{tone:`muted`,text:`cache off`}}function safeTrim(value){return typeof value==`string`?value.trim():``}function macosVersion(){return safeTrim(spawnSync(`sw_vers`,[`-productVersion`],{encoding:`utf-8`}).stdout)||os.release()}function resolveOsSummary(){let platform=os.platform(),release=os.release(),arch=os.arch();return{platform,arch,release,label:platform===`darwin`?`macos ${macosVersion()} (${arch})`:platform===`win32`?`windows ${release} (${arch})`:`${platform} ${release} (${arch})`}}async function fileExists$1(p){try{return await fs$1.access(p),!0}catch{return!1}}async function getAgentLocalStatuses$1(cfg){let agentList=listAgentsForGateway(cfg),now=Date.now(),agents=await Promise.all(agentList.agents.map(async agent=>{let workspaceDir=(()=>{try{return resolveAgentWorkspaceDir(cfg,agent.id)}catch{return null}})(),bootstrapPending=workspaceDir==null?null:await fileExists$1(resolveWorkspaceFilePath(workspaceDir,`BOOTSTRAP.md`)),sessionsPath=resolveStorePath(cfg.session?.store,{agentId:agent.id}),store=(()=>{try{return loadSessionStore(sessionsPath)}catch{return{}}})(),updatedAt=Object.values(store).reduce((max,entry)=>Math.max(max,entry?.updatedAt??0),0),lastUpdatedAt=updatedAt>0?updatedAt:null,lastActiveAgeMs=lastUpdatedAt?now-lastUpdatedAt:null,sessionsCount=Object.keys(store).filter(k=>k!==`global`&&k!==`unknown`).length;return{id:agent.id,name:agent.name,workspaceDir,bootstrapPending,sessionsPath,sessionsCount,lastUpdatedAt,lastActiveAgeMs}})),totalSessions=agents.reduce((sum,a)=>sum+a.sessionsCount,0),bootstrapPendingCount=agents.reduce((sum,a)=>sum+(a.bootstrapPending?1:0),0);return{defaultId:agentList.defaultId,agents,totalSessions,bootstrapPendingCount}}const asRecord=value=>value&&typeof value==`object`?value:{};function summarizeSources(sources){let counts=new Map;for(let s of sources){let key=s?.trim()?s.trim():`unknown`;counts.set(key,(counts.get(key)??0)+1)}let parts=[...counts.entries()].toSorted((a,b)=>b[1]-a[1]).map(([key,n])=>`${key}${n>1?`×${n}`:``}`);return{label:parts.length>0?parts.join(`+`):`unknown`,parts}}function existsSyncMaybe(p){let path=p?.trim()||``;if(!path)return null;try{return fs.existsSync(path)}catch{return null}}function formatTokenHint(token,opts){let t=token.trim();if(!t)return`empty`;if(!opts.showSecrets)return`sha256:${sha256HexPrefix(t,8)} · len ${t.length}`;let head=t.slice(0,4),tail=t.slice(-4);return t.length<=10?`${t} · len ${t.length}`:`${head}…${tail} · len ${t.length}`}const formatAccountLabel=params=>{let base=params.accountId||`default`;return params.name?.trim()?`${base} (${params.name.trim()})`:base},resolveAccountEnabled=(plugin,account,cfg)=>plugin.config.isEnabled?plugin.config.isEnabled(account,cfg):asRecord(account).enabled!==!1,resolveAccountConfigured=async(plugin,account,cfg)=>plugin.config.isConfigured?await plugin.config.isConfigured(account,cfg):asRecord(account).configured!==!1,buildAccountNotes=params=>{let{plugin,cfg,entry}=params,notes=[],snapshot=entry.snapshot;snapshot.enabled===!1&&notes.push(`disabled`),snapshot.dmPolicy&&notes.push(`dm:${snapshot.dmPolicy}`),snapshot.tokenSource&&snapshot.tokenSource!==`none`&&notes.push(`token:${snapshot.tokenSource}`),snapshot.botTokenSource&&snapshot.botTokenSource!==`none`&&notes.push(`bot:${snapshot.botTokenSource}`),snapshot.appTokenSource&&snapshot.appTokenSource!==`none`&&notes.push(`app:${snapshot.appTokenSource}`),snapshot.baseUrl&&notes.push(snapshot.baseUrl),snapshot.port!=null&&notes.push(`port:${snapshot.port}`),snapshot.cliPath&&notes.push(`cli:${snapshot.cliPath}`),snapshot.dbPath&&notes.push(`db:${snapshot.dbPath}`);let allowFrom=plugin.config.resolveAllowFrom?.({cfg,accountId:snapshot.accountId})??snapshot.allowFrom;if(allowFrom?.length){let formatted=formatChannelAllowFrom({plugin,cfg,accountId:snapshot.accountId,allowFrom}).slice(0,3);formatted.length>0&&notes.push(`allow:${formatted.join(`,`)}`)}return notes};function resolveLinkFields(summary){let rec=asRecord(summary),linked=typeof rec.linked==`boolean`?rec.linked:null,authAgeMs=typeof rec.authAgeMs==`number`?rec.authAgeMs:null,self=asRecord(rec.self);return{linked,authAgeMs,selfE164:typeof self.e164==`string`&&self.e164.trim()?self.e164.trim():null}}function collectMissingPaths(accounts){let missing=[];for(let entry of accounts){let accountRec=asRecord(entry.account),snapshotRec=asRecord(entry.snapshot);for(let key of[`tokenFile`,`botTokenFile`,`appTokenFile`,`cliPath`,`dbPath`,`authDir`]){let raw=accountRec[key]??snapshotRec[key];existsSyncMaybe(raw)===!1&&missing.push(String(raw))}}return missing}function summarizeTokenConfig(params){let enabled=params.accounts.filter(a=>a.enabled);if(enabled.length===0)return{state:null,detail:null};let accountRecs=enabled.map(a=>asRecord(a.account)),hasBotTokenField=accountRecs.some(r=>`botToken`in r),hasAppTokenField=accountRecs.some(r=>`appToken`in r),hasTokenField=accountRecs.some(r=>`token`in r);if(!hasBotTokenField&&!hasAppTokenField&&!hasTokenField)return{state:null,detail:null};if(hasBotTokenField&&hasAppTokenField){let ready=enabled.filter(a=>{let rec=asRecord(a.account),bot=typeof rec.botToken==`string`?rec.botToken.trim():``,app=typeof rec.appToken==`string`?rec.appToken.trim():``;return!!bot&&!!app}),partial=enabled.filter(a=>{let rec=asRecord(a.account),bot=typeof rec.botToken==`string`?rec.botToken.trim():``,app=typeof rec.appToken==`string`?rec.appToken.trim():``,hasBot=!!bot,hasApp=!!app;return hasBot&&!hasApp||!hasBot&&hasApp});if(partial.length>0)return{state:`warn`,detail:`partial tokens (need bot+app) · accounts ${partial.length}`};if(ready.length===0)return{state:`setup`,detail:`no tokens (need bot+app)`};let botSources=summarizeSources(ready.map(a=>a.snapshot.botTokenSource??`none`)),appSources=summarizeSources(ready.map(a=>a.snapshot.appTokenSource??`none`)),sample=ready[0]?.account?asRecord(ready[0].account):{},botToken=typeof sample.botToken==`string`?sample.botToken:``,appToken=typeof sample.appToken==`string`?sample.appToken:``,botHint=botToken.trim()?formatTokenHint(botToken,{showSecrets:params.showSecrets}):``,appHint=appToken.trim()?formatTokenHint(appToken,{showSecrets:params.showSecrets}):``,hint=botHint||appHint?` (bot ${botHint||`?`}, app ${appHint||`?`})`:``;return{state:`ok`,detail:`tokens ok (bot ${botSources.label}, app ${appSources.label})${hint} · accounts ${ready.length}/${enabled.length||1}`}}if(hasBotTokenField){let ready=enabled.filter(a=>{let rec=asRecord(a.account);return!!(typeof rec.botToken==`string`&&rec.botToken.trim())});if(ready.length===0)return{state:`setup`,detail:`no bot token`};let sample=ready[0]?.account?asRecord(ready[0].account):{},botToken=typeof sample.botToken==`string`?sample.botToken:``,botHint=botToken.trim()?formatTokenHint(botToken,{showSecrets:params.showSecrets}):``;return{state:`ok`,detail:`bot token config${botHint?` (${botHint})`:``} · accounts ${ready.length}/${enabled.length||1}`}}let ready=enabled.filter(a=>{let rec=asRecord(a.account);return typeof rec.token==`string`?!!rec.token.trim():!1});if(ready.length===0)return{state:`setup`,detail:`no token`};let sources=summarizeSources(ready.map(a=>a.snapshot.tokenSource)),sample=ready[0]?.account?asRecord(ready[0].account):{},token=typeof sample.token==`string`?sample.token:``,hint=token.trim()?` (${formatTokenHint(token,{showSecrets:params.showSecrets})})`:``;return{state:`ok`,detail:`token ${sources.label}${hint} · accounts ${ready.length}/${enabled.length||1}`}}async function buildChannelsTable(cfg,opts){let showSecrets=opts?.showSecrets===!0,rows=[],details=[];for(let plugin of listChannelPlugins()){let accountIds=plugin.config.listAccountIds(cfg),defaultAccountId=resolveChannelDefaultAccountId({plugin,cfg,accountIds}),resolvedAccountIds=accountIds.length>0?accountIds:[defaultAccountId],accounts=[];for(let accountId of resolvedAccountIds){let account=plugin.config.resolveAccount(cfg,accountId),enabled=resolveAccountEnabled(plugin,account,cfg),configured=await resolveAccountConfigured(plugin,account,cfg),snapshot=buildChannelAccountSnapshot({plugin,cfg,accountId,account,enabled,configured});accounts.push({accountId,account,enabled,configured,snapshot})}let anyEnabled=accounts.some(a=>a.enabled),enabledAccounts=accounts.filter(a=>a.enabled),configuredAccounts=enabledAccounts.filter(a=>a.configured),defaultEntry=accounts.find(a=>a.accountId===defaultAccountId)??accounts[0],link=resolveLinkFields(plugin.status?.buildChannelSummary?await plugin.status.buildChannelSummary({account:defaultEntry?.account??{},cfg,defaultAccountId,snapshot:defaultEntry?.snapshot??{accountId:defaultAccountId}}):void 0),missingPaths=collectMissingPaths(enabledAccounts),tokenSummary=summarizeTokenConfig({plugin,cfg,accounts,showSecrets}),issues=plugin.status?.collectStatusIssues?plugin.status.collectStatusIssues(accounts.map(a=>a.snapshot)):[],label=plugin.meta.label??plugin.id,state=anyEnabled?missingPaths.length>0||issues.length>0?`warn`:link.linked===!1?`setup`:tokenSummary.state?tokenSummary.state:link.linked===!0||configuredAccounts.length>0?`ok`:`setup`:`off`,detail=(()=>{if(!anyEnabled)return defaultEntry?plugin.config.disabledReason?.(defaultEntry.account,cfg)??`disabled`:`disabled`;if(missingPaths.length>0)return`missing file (${missingPaths[0]})`;if(issues.length>0)return issues[0]?.message??`misconfigured`;if(link.linked!==null){let base=link.linked?`linked`:`not linked`,extra=[];return link.linked&&link.selfE164&&extra.push(link.selfE164),link.linked&&link.authAgeMs!=null&&link.authAgeMs>=0&&extra.push(`auth ${formatTimeAgo(link.authAgeMs)}`),(accounts.length>1||plugin.meta.forceAccountBinding)&&extra.push(`accounts ${accounts.length||1}`),extra.length>0?`${base} · ${extra.join(` · `)}`:base}if(tokenSummary.detail)return tokenSummary.detail;if(configuredAccounts.length>0){let head=`configured`;return accounts.length<=1&&!plugin.meta.forceAccountBinding?head:`${head} · accounts ${configuredAccounts.length}/${enabledAccounts.length||1}`}return(defaultEntry&&plugin.config.unconfiguredReason?plugin.config.unconfiguredReason(defaultEntry.account,cfg):null)??`not configured`})();rows.push({id:plugin.id,label,enabled:anyEnabled,state,detail}),configuredAccounts.length>0&&details.push({title:`${label} accounts`,columns:[`Account`,`Status`,`Notes`],rows:configuredAccounts.map(entry=>{let notes=buildAccountNotes({plugin,cfg,entry});return{Account:formatAccountLabel({accountId:entry.accountId,name:entry.snapshot.name}),Status:entry.enabled?`OK`:`WARN`,Notes:notes.join(` · `)}})})}return{rows,details}}async function readFileTailLines(filePath,maxLines){let raw=await fs$1.readFile(filePath,`utf8`).catch(()=>``);if(!raw.trim())return[];let lines=raw.replace(/\r/g,``).split(`
1
+ import{u as resolveGatewayPort}from"./paths-BHg-VHB4.js";import{O as info,R as isRich,z as theme}from"./utils-BP60e80M.js";import{H as resolveConfiguredModelRef,_n as DEFAULT_PROVIDER,gn as DEFAULT_MODEL,hn as DEFAULT_CONTEXT_TOKENS}from"./auth-profiles-pt7Tr4HA.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{C as parseAgentSessionKey}from"./session-key-CksCYipj.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{n as runExec}from"./exec-COgsU9ql.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir}from"./agent-scope-CufEmNj_.js";import{U as VERSION,a as readConfigFileSnapshot,r as loadConfig}from"./io-D9hC2aG0.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-CGlKz1D1.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-Du2LiaX6.js";import{Bn as peekSystemEvents,X as sha256HexPrefix,br as summarizeRestartSentinel,cn as getRemoteSkillEligibility,en as buildChannelSummary,nn as formatChannelAllowFrom,tn as buildChannelAccountSnapshot,yr as readRestartSentinel}from"./subagent-registry-DDEN4oJi.js";import{N as resolveMainSessionKey,a as loadSessionStore,k as resolveFreshSessionTotalTokens}from"./sessions-BA8Se_bT.js";import{n as listChannelPlugins}from"./plugins-1Mn6RiNf.js";import{o as getTailnetHostname,s as readTailscaleStatusJson}from"./tailscale-DV-yOmYe.js";import{a as formatPortDiagnostics,n as inspectPortUsage}from"./ports-DTku9NSx.js";import{c as resolveStorePath}from"./paths-ClsbsPQP.js";import{r as getMemorySearchManager}from"./memory-cli-CveeVOWH.js";import{n as formatTimeAgo}from"./format-relative-CruqE52s.js";import{l as resolveSessionModelRef,n as classifySessionKey,r as listAgentsForGateway,u as lookupContextTokens}from"./session-utils-Dxou8SbO.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import{n as formatUsageReportLines,t as loadProviderUsageSummary}from"./provider-usage-B8lFHp0K.js";import{n as withProgress}from"./progress-Cqb-jAjT.js";import{C as normalizeControlUiBasePath,g as resolveControlUiLinks}from"./onboard-helpers-Ce_c4Raj.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DPPVplyk.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-NLYb8w9i.js";import{s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-EKJG69M3.js";import{r as formatRuntimeStatusWithDetails,t as readLastGatewayErrorLine}from"./diagnostics-DamNPi4e.js";import{t as renderTable}from"./table-BFCCZDsp.js";import{a as resolveGatewayProbeAuth$1,c as probeGateway,t as runSecurityAudit}from"./audit-SKNPS-K2.js";import{a as resolveHeartbeatSummaryForAgent,t as formatHealthChannelLines}from"./health-zrsgFZmR.js";import{_ as resolveUpdateChannelDisplay,h as normalizeUpdateChannel,i as formatGitInstallLabel,t as checkUpdateStatus}from"./update-check-B0YqSZJr.js";import{t as resolveNodeService}from"./node-service-77UF0ACm.js";import{n as redactSecrets,t as formatGatewayAuthUsed}from"./format-BYLQK2kz.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,r as getUpdateCheckResult,t as formatUpdateAvailableHint}from"./status.update-hzMro-BT.js";import{spawnSync}from"node:child_process";import os from"node:os";import fs from"node:fs";import fs$1 from"node:fs/promises";function pickGatewaySelfPresence(presence){if(!Array.isArray(presence))return null;let entries=presence,self=entries.find(e=>e.mode===`gateway`&&e.reason===`self`)??entries.find(e=>typeof e.text==`string`&&String(e.text).startsWith(`Gateway:`))??null;return self?{host:typeof self.host==`string`?self.host:void 0,ip:typeof self.ip==`string`?self.ip:void 0,version:typeof self.version==`string`?self.version:void 0,platform:typeof self.platform==`string`?self.platform:void 0}:null}function resolveMemoryVectorState(vector){return vector.enabled?vector.available===!0?{tone:`ok`,state:`ready`}:vector.available===!1?{tone:`warn`,state:`unavailable`}:{tone:`muted`,state:`unknown`}:{tone:`muted`,state:`disabled`}}function resolveMemoryFtsState(fts){return fts.enabled?fts.available?{tone:`ok`,state:`ready`}:{tone:`warn`,state:`unavailable`}:{tone:`muted`,state:`disabled`}}function resolveMemoryCacheSummary(cache){return cache.enabled?{tone:`ok`,text:`cache on${typeof cache.entries==`number`?` (${cache.entries})`:``}`}:{tone:`muted`,text:`cache off`}}function safeTrim(value){return typeof value==`string`?value.trim():``}function macosVersion(){return safeTrim(spawnSync(`sw_vers`,[`-productVersion`],{encoding:`utf-8`}).stdout)||os.release()}function resolveOsSummary(){let platform=os.platform(),release=os.release(),arch=os.arch();return{platform,arch,release,label:platform===`darwin`?`macos ${macosVersion()} (${arch})`:platform===`win32`?`windows ${release} (${arch})`:`${platform} ${release} (${arch})`}}async function fileExists$1(p){try{return await fs$1.access(p),!0}catch{return!1}}async function getAgentLocalStatuses$1(cfg){let agentList=listAgentsForGateway(cfg),now=Date.now(),agents=await Promise.all(agentList.agents.map(async agent=>{let workspaceDir=(()=>{try{return resolveAgentWorkspaceDir(cfg,agent.id)}catch{return null}})(),bootstrapPending=workspaceDir==null?null:await fileExists$1(resolveWorkspaceFilePath(workspaceDir,`BOOTSTRAP.md`)),sessionsPath=resolveStorePath(cfg.session?.store,{agentId:agent.id}),store=(()=>{try{return loadSessionStore(sessionsPath)}catch{return{}}})(),updatedAt=Object.values(store).reduce((max,entry)=>Math.max(max,entry?.updatedAt??0),0),lastUpdatedAt=updatedAt>0?updatedAt:null,lastActiveAgeMs=lastUpdatedAt?now-lastUpdatedAt:null,sessionsCount=Object.keys(store).filter(k=>k!==`global`&&k!==`unknown`).length;return{id:agent.id,name:agent.name,workspaceDir,bootstrapPending,sessionsPath,sessionsCount,lastUpdatedAt,lastActiveAgeMs}})),totalSessions=agents.reduce((sum,a)=>sum+a.sessionsCount,0),bootstrapPendingCount=agents.reduce((sum,a)=>sum+(a.bootstrapPending?1:0),0);return{defaultId:agentList.defaultId,agents,totalSessions,bootstrapPendingCount}}const asRecord=value=>value&&typeof value==`object`?value:{};function summarizeSources(sources){let counts=new Map;for(let s of sources){let key=s?.trim()?s.trim():`unknown`;counts.set(key,(counts.get(key)??0)+1)}let parts=[...counts.entries()].toSorted((a,b)=>b[1]-a[1]).map(([key,n])=>`${key}${n>1?`×${n}`:``}`);return{label:parts.length>0?parts.join(`+`):`unknown`,parts}}function existsSyncMaybe(p){let path=p?.trim()||``;if(!path)return null;try{return fs.existsSync(path)}catch{return null}}function formatTokenHint(token,opts){let t=token.trim();if(!t)return`empty`;if(!opts.showSecrets)return`sha256:${sha256HexPrefix(t,8)} · len ${t.length}`;let head=t.slice(0,4),tail=t.slice(-4);return t.length<=10?`${t} · len ${t.length}`:`${head}…${tail} · len ${t.length}`}const formatAccountLabel=params=>{let base=params.accountId||`default`;return params.name?.trim()?`${base} (${params.name.trim()})`:base},resolveAccountEnabled=(plugin,account,cfg)=>plugin.config.isEnabled?plugin.config.isEnabled(account,cfg):asRecord(account).enabled!==!1,resolveAccountConfigured=async(plugin,account,cfg)=>plugin.config.isConfigured?await plugin.config.isConfigured(account,cfg):asRecord(account).configured!==!1,buildAccountNotes=params=>{let{plugin,cfg,entry}=params,notes=[],snapshot=entry.snapshot;snapshot.enabled===!1&&notes.push(`disabled`),snapshot.dmPolicy&&notes.push(`dm:${snapshot.dmPolicy}`),snapshot.tokenSource&&snapshot.tokenSource!==`none`&&notes.push(`token:${snapshot.tokenSource}`),snapshot.botTokenSource&&snapshot.botTokenSource!==`none`&&notes.push(`bot:${snapshot.botTokenSource}`),snapshot.appTokenSource&&snapshot.appTokenSource!==`none`&&notes.push(`app:${snapshot.appTokenSource}`),snapshot.baseUrl&&notes.push(snapshot.baseUrl),snapshot.port!=null&&notes.push(`port:${snapshot.port}`),snapshot.cliPath&&notes.push(`cli:${snapshot.cliPath}`),snapshot.dbPath&&notes.push(`db:${snapshot.dbPath}`);let allowFrom=plugin.config.resolveAllowFrom?.({cfg,accountId:snapshot.accountId})??snapshot.allowFrom;if(allowFrom?.length){let formatted=formatChannelAllowFrom({plugin,cfg,accountId:snapshot.accountId,allowFrom}).slice(0,3);formatted.length>0&&notes.push(`allow:${formatted.join(`,`)}`)}return notes};function resolveLinkFields(summary){let rec=asRecord(summary),linked=typeof rec.linked==`boolean`?rec.linked:null,authAgeMs=typeof rec.authAgeMs==`number`?rec.authAgeMs:null,self=asRecord(rec.self);return{linked,authAgeMs,selfE164:typeof self.e164==`string`&&self.e164.trim()?self.e164.trim():null}}function collectMissingPaths(accounts){let missing=[];for(let entry of accounts){let accountRec=asRecord(entry.account),snapshotRec=asRecord(entry.snapshot);for(let key of[`tokenFile`,`botTokenFile`,`appTokenFile`,`cliPath`,`dbPath`,`authDir`]){let raw=accountRec[key]??snapshotRec[key];existsSyncMaybe(raw)===!1&&missing.push(String(raw))}}return missing}function summarizeTokenConfig(params){let enabled=params.accounts.filter(a=>a.enabled);if(enabled.length===0)return{state:null,detail:null};let accountRecs=enabled.map(a=>asRecord(a.account)),hasBotTokenField=accountRecs.some(r=>`botToken`in r),hasAppTokenField=accountRecs.some(r=>`appToken`in r),hasTokenField=accountRecs.some(r=>`token`in r);if(!hasBotTokenField&&!hasAppTokenField&&!hasTokenField)return{state:null,detail:null};if(hasBotTokenField&&hasAppTokenField){let ready=enabled.filter(a=>{let rec=asRecord(a.account),bot=typeof rec.botToken==`string`?rec.botToken.trim():``,app=typeof rec.appToken==`string`?rec.appToken.trim():``;return!!bot&&!!app}),partial=enabled.filter(a=>{let rec=asRecord(a.account),bot=typeof rec.botToken==`string`?rec.botToken.trim():``,app=typeof rec.appToken==`string`?rec.appToken.trim():``,hasBot=!!bot,hasApp=!!app;return hasBot&&!hasApp||!hasBot&&hasApp});if(partial.length>0)return{state:`warn`,detail:`partial tokens (need bot+app) · accounts ${partial.length}`};if(ready.length===0)return{state:`setup`,detail:`no tokens (need bot+app)`};let botSources=summarizeSources(ready.map(a=>a.snapshot.botTokenSource??`none`)),appSources=summarizeSources(ready.map(a=>a.snapshot.appTokenSource??`none`)),sample=ready[0]?.account?asRecord(ready[0].account):{},botToken=typeof sample.botToken==`string`?sample.botToken:``,appToken=typeof sample.appToken==`string`?sample.appToken:``,botHint=botToken.trim()?formatTokenHint(botToken,{showSecrets:params.showSecrets}):``,appHint=appToken.trim()?formatTokenHint(appToken,{showSecrets:params.showSecrets}):``,hint=botHint||appHint?` (bot ${botHint||`?`}, app ${appHint||`?`})`:``;return{state:`ok`,detail:`tokens ok (bot ${botSources.label}, app ${appSources.label})${hint} · accounts ${ready.length}/${enabled.length||1}`}}if(hasBotTokenField){let ready=enabled.filter(a=>{let rec=asRecord(a.account);return!!(typeof rec.botToken==`string`&&rec.botToken.trim())});if(ready.length===0)return{state:`setup`,detail:`no bot token`};let sample=ready[0]?.account?asRecord(ready[0].account):{},botToken=typeof sample.botToken==`string`?sample.botToken:``,botHint=botToken.trim()?formatTokenHint(botToken,{showSecrets:params.showSecrets}):``;return{state:`ok`,detail:`bot token config${botHint?` (${botHint})`:``} · accounts ${ready.length}/${enabled.length||1}`}}let ready=enabled.filter(a=>{let rec=asRecord(a.account);return typeof rec.token==`string`?!!rec.token.trim():!1});if(ready.length===0)return{state:`setup`,detail:`no token`};let sources=summarizeSources(ready.map(a=>a.snapshot.tokenSource)),sample=ready[0]?.account?asRecord(ready[0].account):{},token=typeof sample.token==`string`?sample.token:``,hint=token.trim()?` (${formatTokenHint(token,{showSecrets:params.showSecrets})})`:``;return{state:`ok`,detail:`token ${sources.label}${hint} · accounts ${ready.length}/${enabled.length||1}`}}async function buildChannelsTable(cfg,opts){let showSecrets=opts?.showSecrets===!0,rows=[],details=[];for(let plugin of listChannelPlugins()){let accountIds=plugin.config.listAccountIds(cfg),defaultAccountId=resolveChannelDefaultAccountId({plugin,cfg,accountIds}),resolvedAccountIds=accountIds.length>0?accountIds:[defaultAccountId],accounts=[];for(let accountId of resolvedAccountIds){let account=plugin.config.resolveAccount(cfg,accountId),enabled=resolveAccountEnabled(plugin,account,cfg),configured=await resolveAccountConfigured(plugin,account,cfg),snapshot=buildChannelAccountSnapshot({plugin,cfg,accountId,account,enabled,configured});accounts.push({accountId,account,enabled,configured,snapshot})}let anyEnabled=accounts.some(a=>a.enabled),enabledAccounts=accounts.filter(a=>a.enabled),configuredAccounts=enabledAccounts.filter(a=>a.configured),defaultEntry=accounts.find(a=>a.accountId===defaultAccountId)??accounts[0],link=resolveLinkFields(plugin.status?.buildChannelSummary?await plugin.status.buildChannelSummary({account:defaultEntry?.account??{},cfg,defaultAccountId,snapshot:defaultEntry?.snapshot??{accountId:defaultAccountId}}):void 0),missingPaths=collectMissingPaths(enabledAccounts),tokenSummary=summarizeTokenConfig({plugin,cfg,accounts,showSecrets}),issues=plugin.status?.collectStatusIssues?plugin.status.collectStatusIssues(accounts.map(a=>a.snapshot)):[],label=plugin.meta.label??plugin.id,state=anyEnabled?missingPaths.length>0||issues.length>0?`warn`:link.linked===!1?`setup`:tokenSummary.state?tokenSummary.state:link.linked===!0||configuredAccounts.length>0?`ok`:`setup`:`off`,detail=(()=>{if(!anyEnabled)return defaultEntry?plugin.config.disabledReason?.(defaultEntry.account,cfg)??`disabled`:`disabled`;if(missingPaths.length>0)return`missing file (${missingPaths[0]})`;if(issues.length>0)return issues[0]?.message??`misconfigured`;if(link.linked!==null){let base=link.linked?`linked`:`not linked`,extra=[];return link.linked&&link.selfE164&&extra.push(link.selfE164),link.linked&&link.authAgeMs!=null&&link.authAgeMs>=0&&extra.push(`auth ${formatTimeAgo(link.authAgeMs)}`),(accounts.length>1||plugin.meta.forceAccountBinding)&&extra.push(`accounts ${accounts.length||1}`),extra.length>0?`${base} · ${extra.join(` · `)}`:base}if(tokenSummary.detail)return tokenSummary.detail;if(configuredAccounts.length>0){let head=`configured`;return accounts.length<=1&&!plugin.meta.forceAccountBinding?head:`${head} · accounts ${configuredAccounts.length}/${enabledAccounts.length||1}`}return(defaultEntry&&plugin.config.unconfiguredReason?plugin.config.unconfiguredReason(defaultEntry.account,cfg):null)??`not configured`})();rows.push({id:plugin.id,label,enabled:anyEnabled,state,detail}),configuredAccounts.length>0&&details.push({title:`${label} accounts`,columns:[`Account`,`Status`,`Notes`],rows:configuredAccounts.map(entry=>{let notes=buildAccountNotes({plugin,cfg,entry});return{Account:formatAccountLabel({accountId:entry.accountId,name:entry.snapshot.name}),Status:entry.enabled?`OK`:`WARN`,Notes:notes.join(` · `)}})})}return{rows,details}}async function readFileTailLines(filePath,maxLines){let raw=await fs$1.readFile(filePath,`utf8`).catch(()=>``);if(!raw.trim())return[];let lines=raw.replace(/\r/g,``).split(`
2
2
  `);return lines.slice(Math.max(0,lines.length-maxLines)).map(line=>line.trimEnd()).filter(line=>line.trim().length>0)}function countMatches(haystack,needle){return!haystack||!needle?0:haystack.split(needle).length-1}function shorten(message,maxLen){let cleaned=message.replace(/\s+/g,` `).trim();return cleaned.length<=maxLen?cleaned:`${cleaned.slice(0,Math.max(0,maxLen-1))}…`}function normalizeGwsLine(line){return line.replace(/\s+runId=[^\s]+/g,``).replace(/\s+conn=[^\s]+/g,``).replace(/\s+id=[^\s]+/g,``).replace(/\s+error=Error:.*$/g,``).trim()}function consumeJsonBlock(lines,startIndex){let startLine=lines[startIndex]??``,braceAt=startLine.indexOf(`{`);if(braceAt<0)return null;let parts=[startLine.slice(braceAt)],depth=countMatches(parts[0]??``,`{`)-countMatches(parts[0]??``,`}`),i=startIndex;for(;depth>0&&i+1<lines.length;){i+=1;let next=lines[i]??``;parts.push(next),depth+=countMatches(next,`{`)-countMatches(next,`}`)}return{json:parts.join(`
3
3
  `),endIndex:i}}function summarizeLogTail(rawLines,opts){let maxLines=Math.max(6,opts?.maxLines??26),out=[],groups=new Map,addGroup=(key,base)=>{let existing=groups.get(key);if(existing){existing.count+=1;return}groups.set(key,{count:1,index:out.length,base}),out.push(base)},addLine=line=>{let trimmed=line.trimEnd();trimmed&&out.push(trimmed)},lines=rawLines.map(line=>line.trimEnd()).filter(Boolean);for(let i=0;i<lines.length;i+=1){let line=lines[i]??``,trimmedStart=line.trimStart();if((trimmedStart.startsWith(`"`)||trimmedStart===`}`||trimmedStart===`{`||trimmedStart.startsWith(`}`)||trimmedStart.startsWith(`{`))&&!trimmedStart.startsWith(`[`)&&!trimmedStart.startsWith(`#`))continue;let tokenRefresh=line.match(/^\[([^\]]+)\]\s+Token refresh failed:\s*(\d+)\s*(\{)?\s*$/);if(tokenRefresh){let tag=tokenRefresh[1]??`unknown`,status=tokenRefresh[2]??`unknown`,block=consumeJsonBlock(lines,i);if(block){i=block.endIndex;let parsed=(()=>{try{return JSON.parse(block.json)}catch{return null}})(),code=parsed?.error?.code?.trim()||null,msg=parsed?.error?.message?.trim()||null,msgShort=msg?msg.toLowerCase().includes(`signing in again`)?`re-auth required`:shorten(msg,52):null,base=`[${tag}] token refresh ${status}${code?` ${code}`:``}${msgShort?` · ${msgShort}`:``}`;addGroup(`token:${tag}:${status}:${code??``}:${msgShort??``}`,base);continue}}let embedded=line.match(/^Embedded agent failed before reply:\s+OAuth token refresh failed for ([^:]+):/);if(embedded){let provider=embedded[1]?.trim()||`unknown`;addGroup(`embedded:${provider}`,`Embedded agent: OAuth token refresh failed (${provider})`);continue}if(line.startsWith(`[gws]`)&&line.includes(`errorCode=UNAVAILABLE`)&&line.includes(`OAuth token refresh failed`)){let normalized=normalizeGwsLine(line);addGroup(`gws:${normalized}`,normalized);continue}addLine(line)}for(let g of groups.values())g.count<=1||(out[g.index]=`${g.base} ×${g.count}`);let deduped=[];for(let line of out)deduped[deduped.length-1]!==line&&deduped.push(line);if(deduped.length<=maxLines)return deduped;let head=Math.min(6,Math.floor(maxLines/3)),tail=Math.max(1,maxLines-head-1);return[...deduped.slice(0,head),`… ${deduped.length-head-tail} lines omitted …`,...deduped.slice(-tail)]}async function appendStatusAllDiagnosis(params){let{lines,muted,ok,warn,fail}=params,emitCheck=(label,status)=>{let icon=status===`ok`?ok(`✓`):status===`warn`?warn(`!`):fail(`✗`),colored=status===`ok`?ok(label):status===`warn`?warn(label):fail(label);lines.push(`${icon} ${colored}`)};lines.push(``),lines.push(muted(`Gateway connection details:`));for(let line of redactSecrets(params.connectionDetailsForReport).split(`
4
4
  `).map(l=>l.trimEnd()))lines.push(` ${muted(line)}`);if(lines.push(``),params.snap){let status=params.snap.exists?params.snap.valid?`ok`:`warn`:`fail`;emitCheck(`Config: ${params.snap.path??`(unknown)`}`,status);let issues=[...params.snap.legacyIssues??[],...params.snap.issues??[]],uniqueIssues=issues.filter((issue,index)=>issues.findIndex(x=>x.path===issue.path&&x.message===issue.message)===index);for(let issue of uniqueIssues.slice(0,12))lines.push(` - ${issue.path}: ${issue.message}`);uniqueIssues.length>12&&lines.push(` ${muted(`… +${uniqueIssues.length-12} more`)}`)}else emitCheck(`Config: read failed`,`warn`);params.remoteUrlMissing&&(lines.push(``),emitCheck(`Gateway remote mode misconfigured (gateway.remote.url missing)`,`warn`),lines.push(` ${muted(`Fix: set gateway.remote.url, or set gateway.mode=local.`)}`)),params.sentinel?.payload?(emitCheck(`Restart sentinel present`,`warn`),lines.push(` ${muted(`${summarizeRestartSentinel(params.sentinel.payload)} · ${formatTimeAgo(Date.now()-params.sentinel.payload.ts)}`)}`)):emitCheck(`Restart sentinel: none`,`ok`);let lastErrClean=params.lastErr?.trim()??``,isTrivialLastErr=lastErrClean.length<8||lastErrClean===`}`||lastErrClean===`{`;if(lastErrClean&&!isTrivialLastErr&&(lines.push(``),lines.push(muted(`Gateway last log line:`)),lines.push(` ${muted(redactSecrets(lastErrClean))}`)),params.portUsage){let portOk=params.portUsage.listeners.length===0;if(emitCheck(`Port ${params.port}`,portOk?`ok`:`warn`),!portOk)for(let line of formatPortDiagnostics(params.portUsage))lines.push(` ${muted(line)}`)}{let backend=params.tailscale.backendState??`unknown`,okBackend=backend===`Running`,hasDns=!!params.tailscale.dnsName;emitCheck(params.tailscaleMode===`off`?`Tailscale: off · ${backend}${params.tailscale.dnsName?` · ${params.tailscale.dnsName}`:``}`:`Tailscale: ${params.tailscaleMode} · ${backend}${params.tailscale.dnsName?` · ${params.tailscale.dnsName}`:``}`,okBackend&&(params.tailscaleMode===`off`||hasDns)?`ok`:`warn`),params.tailscale.error&&lines.push(` ${muted(`error: ${params.tailscale.error}`)}`),params.tailscale.ips.length>0&&lines.push(` ${muted(`ips: ${params.tailscale.ips.slice(0,3).join(`, `)}${params.tailscale.ips.length>3?`…`:``}`)}`),params.tailscaleHttpsUrl&&lines.push(` ${muted(`https: ${params.tailscaleHttpsUrl}`)}`)}if(params.skillStatus){let eligible=params.skillStatus.skills.filter(s=>s.eligible).length,missing=params.skillStatus.skills.filter(s=>s.eligible&&Object.values(s.missing).some(arr=>arr.length)).length;emitCheck(`Skills: ${eligible} eligible · ${missing} missing · ${params.skillStatus.workspaceDir}`,missing===0?`ok`:`warn`)}params.progress.setLabel(`Reading logs…`);let logPaths=(()=>{try{return resolveGatewayLogPaths(process.env)}catch{return null}})();if(logPaths){params.progress.setLabel(`Reading logs…`);let[stderrTail,stdoutTail]=await Promise.all([readFileTailLines(logPaths.stderrPath,40).catch(()=>[]),readFileTailLines(logPaths.stdoutPath,40).catch(()=>[])]);if(stderrTail.length>0||stdoutTail.length>0){lines.push(``),lines.push(muted(`Gateway logs (tail, summarized): ${logPaths.logDir}`)),lines.push(` ${muted(`# stderr: ${logPaths.stderrPath}`)}`);for(let line of summarizeLogTail(stderrTail,{maxLines:22}).map(redactSecrets))lines.push(` ${muted(line)}`);lines.push(` ${muted(`# stdout: ${logPaths.stdoutPath}`)}`);for(let line of summarizeLogTail(stdoutTail,{maxLines:22}).map(redactSecrets))lines.push(` ${muted(line)}`)}}if(params.progress.tick(),params.channelsStatus){emitCheck(`Channel issues (${params.channelIssues.length||`none`})`,params.channelIssues.length===0?`ok`:`warn`);for(let issue of params.channelIssues.slice(0,12)){let fixText=issue.fix?` · fix: ${issue.fix}`:``;lines.push(` - ${issue.channel}[${issue.accountId}] ${issue.kind}: ${issue.message}${fixText}`)}params.channelIssues.length>12&&lines.push(` ${muted(`… +${params.channelIssues.length-12} more`)}`)}else emitCheck(`Channel issues skipped (gateway ${params.gatewayReachable?`query failed`:`unreachable`})`,`warn`);let healthErr=(()=>{if(!params.health||typeof params.health!=`object`)return``;let record=params.health;if(!(`error`in record))return``;let value=record.error;if(!value)return``;if(typeof value==`string`)return value;try{return JSON.stringify(value,null,2)}catch{return`[unserializable error]`}})();healthErr&&(lines.push(``),lines.push(muted(`Gateway health:`)),lines.push(` ${muted(redactSecrets(healthErr))}`)),lines.push(``),lines.push(muted(`Pasteable debug report. Auth tokens redacted.`)),lines.push(`Troubleshooting: https://docs.builderforce.ai/troubleshooting`),lines.push(``)}async function buildStatusAllReportLines(params){let rich=isRich(),heading=text=>rich?theme.heading(text):text,ok=text=>rich?theme.success(text):text,warn=text=>rich?theme.warn(text):text,fail=text=>rich?theme.error(text):text,muted=text=>rich?theme.muted(text):text,tableWidth=Math.max(60,(process.stdout.columns??120)-1),overview=renderTable({width:tableWidth,columns:[{key:`Item`,header:`Item`,minWidth:10},{key:`Value`,header:`Value`,flex:!0,minWidth:24}],rows:params.overviewRows}),channelRows=params.channels.rows.map(row=>({channelId:row.id,Channel:row.label,Enabled:row.enabled?ok(`ON`):muted(`OFF`),State:row.state===`ok`?ok(`OK`):row.state===`warn`?warn(`WARN`):row.state===`off`?muted(`OFF`):theme.accentDim(`SETUP`),Detail:row.detail})),channelIssuesByChannel=(()=>{let map=new Map;for(let issue of params.channelIssues){let key=issue.channel,list=map.get(key);list?list.push(issue):map.set(key,[issue])}return map})(),channelsTable=renderTable({width:tableWidth,columns:[{key:`Channel`,header:`Channel`,minWidth:10},{key:`Enabled`,header:`Enabled`,minWidth:7},{key:`State`,header:`State`,minWidth:8},{key:`Detail`,header:`Detail`,flex:!0,minWidth:28}],rows:channelRows.map(row=>{let issues=channelIssuesByChannel.get(row.channelId)??[];if(issues.length===0)return row;let issue=issues[0],suffix=` · ${warn(`gateway: ${String(issue.message).slice(0,90)}`)}`;return{...row,State:warn(`WARN`),Detail:`${row.Detail}${suffix}`}})}),agentsTable=renderTable({width:tableWidth,columns:[{key:`Agent`,header:`Agent`,minWidth:12},{key:`Bootstrap`,header:`Bootstrap`,minWidth:10},{key:`Sessions`,header:`Sessions`,align:`right`,minWidth:8},{key:`Active`,header:`Active`,minWidth:10},{key:`Store`,header:`Store`,flex:!0,minWidth:34}],rows:params.agentStatus.agents.map(a=>({Agent:a.name?.trim()?`${a.id} (${a.name.trim()})`:a.id,Bootstrap:a.bootstrapPending===!0?warn(`PENDING`):a.bootstrapPending===!1?ok(`OK`):`unknown`,Sessions:String(a.sessionsCount),Active:a.lastActiveAgeMs==null?`unknown`:formatTimeAgo(a.lastActiveAgeMs),Store:a.sessionsPath}))}),lines=[];lines.push(heading(`BuilderForceAgents status --all`)),lines.push(``),lines.push(heading(`Overview`)),lines.push(overview.trimEnd()),lines.push(``),lines.push(heading(`Channels`)),lines.push(channelsTable.trimEnd());for(let detail of params.channels.details)lines.push(``),lines.push(heading(detail.title)),lines.push(renderTable({width:tableWidth,columns:detail.columns.map(c=>({key:c,header:c,flex:c===`Notes`,minWidth:c===`Notes`?28:10})),rows:detail.rows.map(r=>({...r,...r.Status===`OK`?{Status:ok(`OK`)}:r.Status===`WARN`?{Status:warn(`WARN`)}:{}}))}).trimEnd());return lines.push(``),lines.push(heading(`Agents`)),lines.push(agentsTable.trimEnd()),lines.push(``),lines.push(heading(`Diagnosis (read-only)`)),await appendStatusAllDiagnosis({lines,progress:params.progress,muted,ok,warn,fail,connectionDetailsForReport:params.connectionDetailsForReport,...params.diagnosis}),lines}async function statusAllCommand(runtime,opts){await withProgress({label:`Scanning status --all…`,total:11},async progress=>{progress.setLabel(`Loading config…`);let cfg=loadConfig(),osSummary=resolveOsSummary(),snap=await readConfigFileSnapshot().catch(()=>null);progress.tick(),progress.setLabel(`Checking Tailscale…`);let tailscaleMode=cfg.gateway?.tailscale?.mode??`off`,tailscale=await(async()=>{try{let parsed=await readTailscaleStatusJson(runExec,{timeoutMs:1200}),backendState=typeof parsed.BackendState==`string`?parsed.BackendState:null,self=typeof parsed.Self==`object`&&parsed.Self!==null?parsed.Self:null,dnsNameRaw=self&&typeof self.DNSName==`string`?self.DNSName:null;return{ok:!0,backendState,dnsName:dnsNameRaw?dnsNameRaw.replace(/\.$/,``):null,ips:self&&Array.isArray(self.TailscaleIPs)?self.TailscaleIPs.filter(v=>typeof v==`string`&&v.trim().length>0).map(v=>v.trim()):[],error:null}}catch(err){return{ok:!1,backendState:null,dnsName:null,ips:[],error:String(err)}}})(),tailscaleHttpsUrl=tailscaleMode!==`off`&&tailscale.dnsName?`https://${tailscale.dnsName}${normalizeControlUiBasePath(cfg.gateway?.controlUi?.basePath)}`:null;progress.tick(),progress.setLabel(`Checking for updates…`);let update=await checkUpdateStatus({root:await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()}),timeoutMs:6500,fetchGit:!0,includeRegistry:!0}),channelLabel=resolveUpdateChannelDisplay({configChannel:normalizeUpdateChannel(cfg.update?.channel),installKind:update.installKind,gitTag:update.git?.tag??null,gitBranch:update.git?.branch??null}).label,gitLabel=formatGitInstallLabel(update);progress.tick(),progress.setLabel(`Probing gateway…`);let connection=buildGatewayConnectionDetails({config:cfg}),isRemoteMode=cfg.gateway?.mode===`remote`,remoteUrlRaw=typeof cfg.gateway?.remote?.url==`string`?cfg.gateway.remote.url.trim():``,remoteUrlMissing=isRemoteMode&&!remoteUrlRaw,gatewayMode=isRemoteMode?`remote`:`local`,localFallbackAuth=resolveGatewayProbeAuth$1({cfg,mode:`local`}),remoteAuth=resolveGatewayProbeAuth$1({cfg,mode:`remote`}),probeAuth=isRemoteMode&&!remoteUrlMissing?remoteAuth:localFallbackAuth,gatewayProbe=await probeGateway({url:connection.url,auth:probeAuth,timeoutMs:Math.min(5e3,opts?.timeoutMs??1e4)}).catch(()=>null),gatewayReachable=gatewayProbe?.ok===!0,gatewaySelf=pickGatewaySelfPresence(gatewayProbe?.presence??null);progress.tick(),progress.setLabel(`Checking services…`);let readServiceSummary=async service=>{try{let[loaded,runtimeInfo,command]=await Promise.all([service.isLoaded({env:process.env}).catch(()=>!1),service.readRuntime(process.env).catch(()=>void 0),service.readCommand(process.env).catch(()=>null)]),installed=command!=null;return{label:service.label,installed,loaded,loadedText:loaded?service.loadedText:service.notLoadedText,runtime:runtimeInfo}}catch{return null}},daemon=await readServiceSummary(resolveGatewayService()),nodeService=await readServiceSummary(resolveNodeService());progress.tick(),progress.setLabel(`Scanning agents…`);let agentStatus=await getAgentLocalStatuses$1(cfg);progress.tick(),progress.setLabel(`Summarizing channels…`);let channels=await buildChannelsTable(cfg,{showSecrets:!1});progress.tick();let connectionDetailsForReport=(()=>{if(!remoteUrlMissing)return connection.message;let bindMode=cfg.gateway?.bind??`loopback`;return[`Gateway mode: remote`,`Gateway target: (missing gateway.remote.url)`,`Config: ${snap?.path?.trim()?snap.path.trim():`(unknown config path)`}`,`Bind: ${bindMode}`,`Local fallback (used for probes): ${connection.url}`,`Fix: set gateway.remote.url, or set gateway.mode=local.`].join(`
@@ -1 +1 @@
1
- import{Mt as loadBuilderForceAgentsPlugins,jt as createPluginLoaderLogger}from"./reply-Cd3vVnD7.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{c as resolveAgentWorkspaceDir,k as resolveDefaultAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-DPtjOxzp.js";import{r as loadConfig}from"./io-3R_ZyUxB.js";const log=createSubsystemLogger(`plugins`);function buildPluginStatusReport(params){let config=params?.config??loadConfig(),workspaceDir=params?.workspaceDir?params.workspaceDir:resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config))??resolveDefaultAgentWorkspaceDir();return{workspaceDir,...loadBuilderForceAgentsPlugins({config,workspaceDir,logger:createPluginLoaderLogger(log)})}}export{buildPluginStatusReport as t};
1
+ import{Mt as loadBuilderForceAgentsPlugins,jt as createPluginLoaderLogger}from"./reply-GY1C8tcv.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{c as resolveAgentWorkspaceDir,k as resolveDefaultAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-DPtjOxzp.js";import{r as loadConfig}from"./io-BLBq4T2o.js";const log=createSubsystemLogger(`plugins`);function buildPluginStatusReport(params){let config=params?.config??loadConfig(),workspaceDir=params?.workspaceDir?params.workspaceDir:resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config))??resolveDefaultAgentWorkspaceDir();return{workspaceDir,...loadBuilderForceAgentsPlugins({config,workspaceDir,logger:createPluginLoaderLogger(log)})}}export{buildPluginStatusReport as t};
@@ -0,0 +1 @@
1
+ import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-pt7Tr4HA.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import"./model-discovery-D0i1JpiL.js";import"./model-catalog-BeBXvbFm.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./skills-status-CGlKz1D1.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-Du2LiaX6.js";import"./message-channel-z5YRpR2d.js";import"./subagent-registry-DDEN4oJi.js";import"./sessions-BA8Se_bT.js";import"./project-context-store-CIUcwUP_.js";import"./tokens-CFKkpUIu.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-B7H8Ae5j.js";import"./send-DqR7Rxzm.js";import"./with-timeout-B_p5pWDv.js";import"./deliver-CsG0cHbZ.js";import"./accounts-Cx82nj4E.js";import"./send-KgN1P41U.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-DdU30lmt.js";import"./sandbox-DvKMuAXL.js";import"./chrome-CFmcixaE.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-CttALzrW.js";import"./routes-_iZdG1Fo.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./workspace-waBqRxiy.js";import"./reply-prefix-Cg7AqaK0.js";import"./sqlite-CIGM1WKg.js";import"./memory-cli-CveeVOWH.js";import"./manager-BeohB4-8.js";import"./gemini-auth-DDR12zst.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import"./runner-Cu9NJouV.js";import"./tool-display-Cs4hDP1f.js";import"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-9ksvqHYX.js";import"./session-utils-Dxou8SbO.js";import"./coding-tools.policy-D9Ba8eDh.js";import"./pairing-store-YRy7EBgI.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-B8lFHp0K.js";import"./send-kkm_zrHQ.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-D3Mx4maV.js";import"./control-service-2PkCt256.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-CYGOPcKq.js";import"./resolve-route-DEIW5uKy.js";import"./channel-activity-DX36RadH.js";import"./tables-CojSfTth.js";import"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-BOGMDhSN.js";import"./onboard-helpers-Ce_c4Raj.js";import"./prompt-style-BMWmaqSC.js";import"./pairing-labels-BJPrScRl.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-CV4nDcCk.js";import"./transformers-stream-Buj40qHl.js";import"./dangerous-tools-C0tOMmbD.js";import"./helpers-DPPVplyk.js";import"./skill-scanner-OTLeRZ_p.js";import"./channels-status-issues-NLYb8w9i.js";import"./runtime-guard-Bi8k55v9.js";import"./systemd-DdVd5Yet.js";import"./service-EKJG69M3.js";import"./diagnostics-DamNPi4e.js";import"./table-BFCCZDsp.js";import"./audit-SKNPS-K2.js";import{t as statusCommand}from"./status-BtBHmhQh.js";import"./health-zrsgFZmR.js";import"./update-check-B0YqSZJr.js";import"./dm-policy-shared-B9lW-AsK.js";import"./node-service-77UF0ACm.js";import"./status.update-hzMro-BT.js";export{statusCommand};
@@ -1,4 +1,4 @@
1
- import{u as resolveGatewayPort}from"./paths-5FcIFMsj.js";import{B as theme,k as info,z as isRich}from"./utils-DbaBVFaK.js";import{A as classifySessionKey,Ht as getRemoteSkillEligibility,L as resolveSessionModelRef,c as buildChannelSummary,j as listAgentsForGateway,l as buildChannelAccountSnapshot,mi as peekSystemEvents,ni as lookupContextTokens,or as readRestartSentinel,sr as summarizeRestartSentinel,u as formatChannelAllowFrom,v as sha256HexPrefix}from"./reply-Cd3vVnD7.js";import{C as parseAgentSessionKey}from"./session-key-EoB0qaG9.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{n as runExec}from"./exec-DdcIjeyn.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir}from"./agent-scope-DPtjOxzp.js";import{bn as DEFAULT_PROVIDER,m as resolveConfiguredModelRef,vn as DEFAULT_CONTEXT_TOKENS,yn as DEFAULT_MODEL}from"./model-selection-9bRFKBI_.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{U as VERSION,a as readConfigFileSnapshot,r as loadConfig}from"./io-3R_ZyUxB.js";import{o as getTailnetHostname,s as readTailscaleStatusJson}from"./tailscale-DLkpGquM.js";import{a as inspectPortUsage,c as formatPortDiagnostics}from"./ports-DgmEDNOm.js";import{B as resolveMainSessionKey,I as resolveFreshSessionTotalTokens,a as loadSessionStore}from"./sessions-CdanN_ZI.js";import{n as listChannelPlugins}from"./plugins-D5zP6ENo.js";import{c as resolveStorePath}from"./paths-DJ6rztqJ.js";import{r as getMemorySearchManager}from"./memory-cli-DRz4wtHk.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-BbRf8gFM.js";import{n as formatTimeAgo}from"./format-relative-niF9gXss.js";import{n as withProgress}from"./progress-BfOtdN6b.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import{C as normalizeControlUiBasePath,g as resolveControlUiLinks}from"./onboard-helpers-Cf5dNq7-.js";import{n as formatUsageReportLines,t as loadProviderUsageSummary}from"./provider-usage-BdrU4cIE.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-vWC0PU8J.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DTDCy17p.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-BlOu0Ul_.js";import{s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-D-NLDyK3.js";import{r as formatRuntimeStatusWithDetails,t as readLastGatewayErrorLine}from"./diagnostics-DCjg0nBH.js";import{t as renderTable}from"./table-BoCHYKoQ.js";import{a as resolveGatewayProbeAuth$1,c as probeGateway,t as runSecurityAudit}from"./audit-DGnEhZYe.js";import{a as resolveHeartbeatSummaryForAgent,t as formatHealthChannelLines}from"./health-yS3NRKvY.js";import{_ as resolveUpdateChannelDisplay,h as normalizeUpdateChannel,i as formatGitInstallLabel,t as checkUpdateStatus}from"./update-check-D6MvqVFE.js";import{t as resolveNodeService}from"./node-service-DZg9i98f.js";import{n as redactSecrets,t as formatGatewayAuthUsed}from"./format-DsPKebPn.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,r as getUpdateCheckResult,t as formatUpdateAvailableHint}from"./status.update-C9iy31xr.js";import fs from"node:fs";import os from"node:os";import fs$1 from"node:fs/promises";import{spawnSync}from"node:child_process";function pickGatewaySelfPresence(presence){if(!Array.isArray(presence))return null;let entries=presence,self=entries.find(e=>e.mode===`gateway`&&e.reason===`self`)??entries.find(e=>typeof e.text==`string`&&String(e.text).startsWith(`Gateway:`))??null;return self?{host:typeof self.host==`string`?self.host:void 0,ip:typeof self.ip==`string`?self.ip:void 0,version:typeof self.version==`string`?self.version:void 0,platform:typeof self.platform==`string`?self.platform:void 0}:null}function resolveMemoryVectorState(vector){return vector.enabled?vector.available===!0?{tone:`ok`,state:`ready`}:vector.available===!1?{tone:`warn`,state:`unavailable`}:{tone:`muted`,state:`unknown`}:{tone:`muted`,state:`disabled`}}function resolveMemoryFtsState(fts){return fts.enabled?fts.available?{tone:`ok`,state:`ready`}:{tone:`warn`,state:`unavailable`}:{tone:`muted`,state:`disabled`}}function resolveMemoryCacheSummary(cache){return cache.enabled?{tone:`ok`,text:`cache on${typeof cache.entries==`number`?` (${cache.entries})`:``}`}:{tone:`muted`,text:`cache off`}}function safeTrim(value){return typeof value==`string`?value.trim():``}function macosVersion(){return safeTrim(spawnSync(`sw_vers`,[`-productVersion`],{encoding:`utf-8`}).stdout)||os.release()}function resolveOsSummary(){let platform=os.platform(),release=os.release(),arch=os.arch();return{platform,arch,release,label:platform===`darwin`?`macos ${macosVersion()} (${arch})`:platform===`win32`?`windows ${release} (${arch})`:`${platform} ${release} (${arch})`}}async function fileExists$1(p){try{return await fs$1.access(p),!0}catch{return!1}}async function getAgentLocalStatuses$1(cfg){let agentList=listAgentsForGateway(cfg),now=Date.now(),agents=await Promise.all(agentList.agents.map(async agent=>{let workspaceDir=(()=>{try{return resolveAgentWorkspaceDir(cfg,agent.id)}catch{return null}})(),bootstrapPending=workspaceDir==null?null:await fileExists$1(resolveWorkspaceFilePath(workspaceDir,`BOOTSTRAP.md`)),sessionsPath=resolveStorePath(cfg.session?.store,{agentId:agent.id}),store=(()=>{try{return loadSessionStore(sessionsPath)}catch{return{}}})(),updatedAt=Object.values(store).reduce((max,entry)=>Math.max(max,entry?.updatedAt??0),0),lastUpdatedAt=updatedAt>0?updatedAt:null,lastActiveAgeMs=lastUpdatedAt?now-lastUpdatedAt:null,sessionsCount=Object.keys(store).filter(k=>k!==`global`&&k!==`unknown`).length;return{id:agent.id,name:agent.name,workspaceDir,bootstrapPending,sessionsPath,sessionsCount,lastUpdatedAt,lastActiveAgeMs}})),totalSessions=agents.reduce((sum,a)=>sum+a.sessionsCount,0),bootstrapPendingCount=agents.reduce((sum,a)=>sum+(a.bootstrapPending?1:0),0);return{defaultId:agentList.defaultId,agents,totalSessions,bootstrapPendingCount}}const asRecord=value=>value&&typeof value==`object`?value:{};function summarizeSources(sources){let counts=new Map;for(let s of sources){let key=s?.trim()?s.trim():`unknown`;counts.set(key,(counts.get(key)??0)+1)}let parts=[...counts.entries()].toSorted((a,b)=>b[1]-a[1]).map(([key,n])=>`${key}${n>1?`×${n}`:``}`);return{label:parts.length>0?parts.join(`+`):`unknown`,parts}}function existsSyncMaybe(p){let path=p?.trim()||``;if(!path)return null;try{return fs.existsSync(path)}catch{return null}}function formatTokenHint(token,opts){let t=token.trim();if(!t)return`empty`;if(!opts.showSecrets)return`sha256:${sha256HexPrefix(t,8)} · len ${t.length}`;let head=t.slice(0,4),tail=t.slice(-4);return t.length<=10?`${t} · len ${t.length}`:`${head}…${tail} · len ${t.length}`}const formatAccountLabel=params=>{let base=params.accountId||`default`;return params.name?.trim()?`${base} (${params.name.trim()})`:base},resolveAccountEnabled=(plugin,account,cfg)=>plugin.config.isEnabled?plugin.config.isEnabled(account,cfg):asRecord(account).enabled!==!1,resolveAccountConfigured=async(plugin,account,cfg)=>plugin.config.isConfigured?await plugin.config.isConfigured(account,cfg):asRecord(account).configured!==!1,buildAccountNotes=params=>{let{plugin,cfg,entry}=params,notes=[],snapshot=entry.snapshot;snapshot.enabled===!1&&notes.push(`disabled`),snapshot.dmPolicy&&notes.push(`dm:${snapshot.dmPolicy}`),snapshot.tokenSource&&snapshot.tokenSource!==`none`&&notes.push(`token:${snapshot.tokenSource}`),snapshot.botTokenSource&&snapshot.botTokenSource!==`none`&&notes.push(`bot:${snapshot.botTokenSource}`),snapshot.appTokenSource&&snapshot.appTokenSource!==`none`&&notes.push(`app:${snapshot.appTokenSource}`),snapshot.baseUrl&&notes.push(snapshot.baseUrl),snapshot.port!=null&&notes.push(`port:${snapshot.port}`),snapshot.cliPath&&notes.push(`cli:${snapshot.cliPath}`),snapshot.dbPath&&notes.push(`db:${snapshot.dbPath}`);let allowFrom=plugin.config.resolveAllowFrom?.({cfg,accountId:snapshot.accountId})??snapshot.allowFrom;if(allowFrom?.length){let formatted=formatChannelAllowFrom({plugin,cfg,accountId:snapshot.accountId,allowFrom}).slice(0,3);formatted.length>0&&notes.push(`allow:${formatted.join(`,`)}`)}return notes};function resolveLinkFields(summary){let rec=asRecord(summary),linked=typeof rec.linked==`boolean`?rec.linked:null,authAgeMs=typeof rec.authAgeMs==`number`?rec.authAgeMs:null,self=asRecord(rec.self);return{linked,authAgeMs,selfE164:typeof self.e164==`string`&&self.e164.trim()?self.e164.trim():null}}function collectMissingPaths(accounts){let missing=[];for(let entry of accounts){let accountRec=asRecord(entry.account),snapshotRec=asRecord(entry.snapshot);for(let key of[`tokenFile`,`botTokenFile`,`appTokenFile`,`cliPath`,`dbPath`,`authDir`]){let raw=accountRec[key]??snapshotRec[key];existsSyncMaybe(raw)===!1&&missing.push(String(raw))}}return missing}function summarizeTokenConfig(params){let enabled=params.accounts.filter(a=>a.enabled);if(enabled.length===0)return{state:null,detail:null};let accountRecs=enabled.map(a=>asRecord(a.account)),hasBotTokenField=accountRecs.some(r=>`botToken`in r),hasAppTokenField=accountRecs.some(r=>`appToken`in r),hasTokenField=accountRecs.some(r=>`token`in r);if(!hasBotTokenField&&!hasAppTokenField&&!hasTokenField)return{state:null,detail:null};if(hasBotTokenField&&hasAppTokenField){let ready=enabled.filter(a=>{let rec=asRecord(a.account),bot=typeof rec.botToken==`string`?rec.botToken.trim():``,app=typeof rec.appToken==`string`?rec.appToken.trim():``;return!!bot&&!!app}),partial=enabled.filter(a=>{let rec=asRecord(a.account),bot=typeof rec.botToken==`string`?rec.botToken.trim():``,app=typeof rec.appToken==`string`?rec.appToken.trim():``,hasBot=!!bot,hasApp=!!app;return hasBot&&!hasApp||!hasBot&&hasApp});if(partial.length>0)return{state:`warn`,detail:`partial tokens (need bot+app) · accounts ${partial.length}`};if(ready.length===0)return{state:`setup`,detail:`no tokens (need bot+app)`};let botSources=summarizeSources(ready.map(a=>a.snapshot.botTokenSource??`none`)),appSources=summarizeSources(ready.map(a=>a.snapshot.appTokenSource??`none`)),sample=ready[0]?.account?asRecord(ready[0].account):{},botToken=typeof sample.botToken==`string`?sample.botToken:``,appToken=typeof sample.appToken==`string`?sample.appToken:``,botHint=botToken.trim()?formatTokenHint(botToken,{showSecrets:params.showSecrets}):``,appHint=appToken.trim()?formatTokenHint(appToken,{showSecrets:params.showSecrets}):``,hint=botHint||appHint?` (bot ${botHint||`?`}, app ${appHint||`?`})`:``;return{state:`ok`,detail:`tokens ok (bot ${botSources.label}, app ${appSources.label})${hint} · accounts ${ready.length}/${enabled.length||1}`}}if(hasBotTokenField){let ready=enabled.filter(a=>{let rec=asRecord(a.account);return!!(typeof rec.botToken==`string`&&rec.botToken.trim())});if(ready.length===0)return{state:`setup`,detail:`no bot token`};let sample=ready[0]?.account?asRecord(ready[0].account):{},botToken=typeof sample.botToken==`string`?sample.botToken:``,botHint=botToken.trim()?formatTokenHint(botToken,{showSecrets:params.showSecrets}):``;return{state:`ok`,detail:`bot token config${botHint?` (${botHint})`:``} · accounts ${ready.length}/${enabled.length||1}`}}let ready=enabled.filter(a=>{let rec=asRecord(a.account);return typeof rec.token==`string`?!!rec.token.trim():!1});if(ready.length===0)return{state:`setup`,detail:`no token`};let sources=summarizeSources(ready.map(a=>a.snapshot.tokenSource)),sample=ready[0]?.account?asRecord(ready[0].account):{},token=typeof sample.token==`string`?sample.token:``,hint=token.trim()?` (${formatTokenHint(token,{showSecrets:params.showSecrets})})`:``;return{state:`ok`,detail:`token ${sources.label}${hint} · accounts ${ready.length}/${enabled.length||1}`}}async function buildChannelsTable(cfg,opts){let showSecrets=opts?.showSecrets===!0,rows=[],details=[];for(let plugin of listChannelPlugins()){let accountIds=plugin.config.listAccountIds(cfg),defaultAccountId=resolveChannelDefaultAccountId({plugin,cfg,accountIds}),resolvedAccountIds=accountIds.length>0?accountIds:[defaultAccountId],accounts=[];for(let accountId of resolvedAccountIds){let account=plugin.config.resolveAccount(cfg,accountId),enabled=resolveAccountEnabled(plugin,account,cfg),configured=await resolveAccountConfigured(plugin,account,cfg),snapshot=buildChannelAccountSnapshot({plugin,cfg,accountId,account,enabled,configured});accounts.push({accountId,account,enabled,configured,snapshot})}let anyEnabled=accounts.some(a=>a.enabled),enabledAccounts=accounts.filter(a=>a.enabled),configuredAccounts=enabledAccounts.filter(a=>a.configured),defaultEntry=accounts.find(a=>a.accountId===defaultAccountId)??accounts[0],link=resolveLinkFields(plugin.status?.buildChannelSummary?await plugin.status.buildChannelSummary({account:defaultEntry?.account??{},cfg,defaultAccountId,snapshot:defaultEntry?.snapshot??{accountId:defaultAccountId}}):void 0),missingPaths=collectMissingPaths(enabledAccounts),tokenSummary=summarizeTokenConfig({plugin,cfg,accounts,showSecrets}),issues=plugin.status?.collectStatusIssues?plugin.status.collectStatusIssues(accounts.map(a=>a.snapshot)):[],label=plugin.meta.label??plugin.id,state=anyEnabled?missingPaths.length>0||issues.length>0?`warn`:link.linked===!1?`setup`:tokenSummary.state?tokenSummary.state:link.linked===!0||configuredAccounts.length>0?`ok`:`setup`:`off`,detail=(()=>{if(!anyEnabled)return defaultEntry?plugin.config.disabledReason?.(defaultEntry.account,cfg)??`disabled`:`disabled`;if(missingPaths.length>0)return`missing file (${missingPaths[0]})`;if(issues.length>0)return issues[0]?.message??`misconfigured`;if(link.linked!==null){let base=link.linked?`linked`:`not linked`,extra=[];return link.linked&&link.selfE164&&extra.push(link.selfE164),link.linked&&link.authAgeMs!=null&&link.authAgeMs>=0&&extra.push(`auth ${formatTimeAgo(link.authAgeMs)}`),(accounts.length>1||plugin.meta.forceAccountBinding)&&extra.push(`accounts ${accounts.length||1}`),extra.length>0?`${base} · ${extra.join(` · `)}`:base}if(tokenSummary.detail)return tokenSummary.detail;if(configuredAccounts.length>0){let head=`configured`;return accounts.length<=1&&!plugin.meta.forceAccountBinding?head:`${head} · accounts ${configuredAccounts.length}/${enabledAccounts.length||1}`}return(defaultEntry&&plugin.config.unconfiguredReason?plugin.config.unconfiguredReason(defaultEntry.account,cfg):null)??`not configured`})();rows.push({id:plugin.id,label,enabled:anyEnabled,state,detail}),configuredAccounts.length>0&&details.push({title:`${label} accounts`,columns:[`Account`,`Status`,`Notes`],rows:configuredAccounts.map(entry=>{let notes=buildAccountNotes({plugin,cfg,entry});return{Account:formatAccountLabel({accountId:entry.accountId,name:entry.snapshot.name}),Status:entry.enabled?`OK`:`WARN`,Notes:notes.join(` · `)}})})}return{rows,details}}async function readFileTailLines(filePath,maxLines){let raw=await fs$1.readFile(filePath,`utf8`).catch(()=>``);if(!raw.trim())return[];let lines=raw.replace(/\r/g,``).split(`
1
+ import{u as resolveGatewayPort}from"./paths-5FcIFMsj.js";import{B as theme,k as info,z as isRich}from"./utils-DbaBVFaK.js";import{A as classifySessionKey,Ht as getRemoteSkillEligibility,L as resolveSessionModelRef,c as buildChannelSummary,j as listAgentsForGateway,l as buildChannelAccountSnapshot,mi as peekSystemEvents,ni as lookupContextTokens,or as readRestartSentinel,sr as summarizeRestartSentinel,u as formatChannelAllowFrom,v as sha256HexPrefix}from"./reply-GY1C8tcv.js";import{C as parseAgentSessionKey}from"./session-key-EoB0qaG9.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{n as runExec}from"./exec-DdcIjeyn.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir}from"./agent-scope-DPtjOxzp.js";import{bn as DEFAULT_PROVIDER,m as resolveConfiguredModelRef,vn as DEFAULT_CONTEXT_TOKENS,yn as DEFAULT_MODEL}from"./model-selection-DG9J_VTz.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{U as VERSION,a as readConfigFileSnapshot,r as loadConfig}from"./io-BLBq4T2o.js";import{o as getTailnetHostname,s as readTailscaleStatusJson}from"./tailscale-DLkpGquM.js";import{a as inspectPortUsage,c as formatPortDiagnostics}from"./ports-DgmEDNOm.js";import{B as resolveMainSessionKey,I as resolveFreshSessionTotalTokens,a as loadSessionStore}from"./sessions-BuZVmOWt.js";import{n as listChannelPlugins}from"./plugins-D5zP6ENo.js";import{c as resolveStorePath}from"./paths-DJ6rztqJ.js";import{r as getMemorySearchManager}from"./memory-cli-CbkWGjRn.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-T8ciwMTA.js";import{n as formatTimeAgo}from"./format-relative-niF9gXss.js";import{n as withProgress}from"./progress-BfOtdN6b.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import{C as normalizeControlUiBasePath,g as resolveControlUiLinks}from"./onboard-helpers-CiHzTaFX.js";import{n as formatUsageReportLines,t as loadProviderUsageSummary}from"./provider-usage-B-wPVN_j.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-vWC0PU8J.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DTDCy17p.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-BlOu0Ul_.js";import{s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-D-NLDyK3.js";import{r as formatRuntimeStatusWithDetails,t as readLastGatewayErrorLine}from"./diagnostics-DCjg0nBH.js";import{t as renderTable}from"./table-BoCHYKoQ.js";import{a as resolveGatewayProbeAuth$1,c as probeGateway,t as runSecurityAudit}from"./audit-B-USV03V.js";import{a as resolveHeartbeatSummaryForAgent,t as formatHealthChannelLines}from"./health-FO8MG5Ur.js";import{_ as resolveUpdateChannelDisplay,h as normalizeUpdateChannel,i as formatGitInstallLabel,t as checkUpdateStatus}from"./update-check-D6MvqVFE.js";import{t as resolveNodeService}from"./node-service-DZg9i98f.js";import{n as redactSecrets,t as formatGatewayAuthUsed}from"./format-DsPKebPn.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,r as getUpdateCheckResult,t as formatUpdateAvailableHint}from"./status.update-CdgsLBPg.js";import fs from"node:fs";import os from"node:os";import fs$1 from"node:fs/promises";import{spawnSync}from"node:child_process";function pickGatewaySelfPresence(presence){if(!Array.isArray(presence))return null;let entries=presence,self=entries.find(e=>e.mode===`gateway`&&e.reason===`self`)??entries.find(e=>typeof e.text==`string`&&String(e.text).startsWith(`Gateway:`))??null;return self?{host:typeof self.host==`string`?self.host:void 0,ip:typeof self.ip==`string`?self.ip:void 0,version:typeof self.version==`string`?self.version:void 0,platform:typeof self.platform==`string`?self.platform:void 0}:null}function resolveMemoryVectorState(vector){return vector.enabled?vector.available===!0?{tone:`ok`,state:`ready`}:vector.available===!1?{tone:`warn`,state:`unavailable`}:{tone:`muted`,state:`unknown`}:{tone:`muted`,state:`disabled`}}function resolveMemoryFtsState(fts){return fts.enabled?fts.available?{tone:`ok`,state:`ready`}:{tone:`warn`,state:`unavailable`}:{tone:`muted`,state:`disabled`}}function resolveMemoryCacheSummary(cache){return cache.enabled?{tone:`ok`,text:`cache on${typeof cache.entries==`number`?` (${cache.entries})`:``}`}:{tone:`muted`,text:`cache off`}}function safeTrim(value){return typeof value==`string`?value.trim():``}function macosVersion(){return safeTrim(spawnSync(`sw_vers`,[`-productVersion`],{encoding:`utf-8`}).stdout)||os.release()}function resolveOsSummary(){let platform=os.platform(),release=os.release(),arch=os.arch();return{platform,arch,release,label:platform===`darwin`?`macos ${macosVersion()} (${arch})`:platform===`win32`?`windows ${release} (${arch})`:`${platform} ${release} (${arch})`}}async function fileExists$1(p){try{return await fs$1.access(p),!0}catch{return!1}}async function getAgentLocalStatuses$1(cfg){let agentList=listAgentsForGateway(cfg),now=Date.now(),agents=await Promise.all(agentList.agents.map(async agent=>{let workspaceDir=(()=>{try{return resolveAgentWorkspaceDir(cfg,agent.id)}catch{return null}})(),bootstrapPending=workspaceDir==null?null:await fileExists$1(resolveWorkspaceFilePath(workspaceDir,`BOOTSTRAP.md`)),sessionsPath=resolveStorePath(cfg.session?.store,{agentId:agent.id}),store=(()=>{try{return loadSessionStore(sessionsPath)}catch{return{}}})(),updatedAt=Object.values(store).reduce((max,entry)=>Math.max(max,entry?.updatedAt??0),0),lastUpdatedAt=updatedAt>0?updatedAt:null,lastActiveAgeMs=lastUpdatedAt?now-lastUpdatedAt:null,sessionsCount=Object.keys(store).filter(k=>k!==`global`&&k!==`unknown`).length;return{id:agent.id,name:agent.name,workspaceDir,bootstrapPending,sessionsPath,sessionsCount,lastUpdatedAt,lastActiveAgeMs}})),totalSessions=agents.reduce((sum,a)=>sum+a.sessionsCount,0),bootstrapPendingCount=agents.reduce((sum,a)=>sum+(a.bootstrapPending?1:0),0);return{defaultId:agentList.defaultId,agents,totalSessions,bootstrapPendingCount}}const asRecord=value=>value&&typeof value==`object`?value:{};function summarizeSources(sources){let counts=new Map;for(let s of sources){let key=s?.trim()?s.trim():`unknown`;counts.set(key,(counts.get(key)??0)+1)}let parts=[...counts.entries()].toSorted((a,b)=>b[1]-a[1]).map(([key,n])=>`${key}${n>1?`×${n}`:``}`);return{label:parts.length>0?parts.join(`+`):`unknown`,parts}}function existsSyncMaybe(p){let path=p?.trim()||``;if(!path)return null;try{return fs.existsSync(path)}catch{return null}}function formatTokenHint(token,opts){let t=token.trim();if(!t)return`empty`;if(!opts.showSecrets)return`sha256:${sha256HexPrefix(t,8)} · len ${t.length}`;let head=t.slice(0,4),tail=t.slice(-4);return t.length<=10?`${t} · len ${t.length}`:`${head}…${tail} · len ${t.length}`}const formatAccountLabel=params=>{let base=params.accountId||`default`;return params.name?.trim()?`${base} (${params.name.trim()})`:base},resolveAccountEnabled=(plugin,account,cfg)=>plugin.config.isEnabled?plugin.config.isEnabled(account,cfg):asRecord(account).enabled!==!1,resolveAccountConfigured=async(plugin,account,cfg)=>plugin.config.isConfigured?await plugin.config.isConfigured(account,cfg):asRecord(account).configured!==!1,buildAccountNotes=params=>{let{plugin,cfg,entry}=params,notes=[],snapshot=entry.snapshot;snapshot.enabled===!1&&notes.push(`disabled`),snapshot.dmPolicy&&notes.push(`dm:${snapshot.dmPolicy}`),snapshot.tokenSource&&snapshot.tokenSource!==`none`&&notes.push(`token:${snapshot.tokenSource}`),snapshot.botTokenSource&&snapshot.botTokenSource!==`none`&&notes.push(`bot:${snapshot.botTokenSource}`),snapshot.appTokenSource&&snapshot.appTokenSource!==`none`&&notes.push(`app:${snapshot.appTokenSource}`),snapshot.baseUrl&&notes.push(snapshot.baseUrl),snapshot.port!=null&&notes.push(`port:${snapshot.port}`),snapshot.cliPath&&notes.push(`cli:${snapshot.cliPath}`),snapshot.dbPath&&notes.push(`db:${snapshot.dbPath}`);let allowFrom=plugin.config.resolveAllowFrom?.({cfg,accountId:snapshot.accountId})??snapshot.allowFrom;if(allowFrom?.length){let formatted=formatChannelAllowFrom({plugin,cfg,accountId:snapshot.accountId,allowFrom}).slice(0,3);formatted.length>0&&notes.push(`allow:${formatted.join(`,`)}`)}return notes};function resolveLinkFields(summary){let rec=asRecord(summary),linked=typeof rec.linked==`boolean`?rec.linked:null,authAgeMs=typeof rec.authAgeMs==`number`?rec.authAgeMs:null,self=asRecord(rec.self);return{linked,authAgeMs,selfE164:typeof self.e164==`string`&&self.e164.trim()?self.e164.trim():null}}function collectMissingPaths(accounts){let missing=[];for(let entry of accounts){let accountRec=asRecord(entry.account),snapshotRec=asRecord(entry.snapshot);for(let key of[`tokenFile`,`botTokenFile`,`appTokenFile`,`cliPath`,`dbPath`,`authDir`]){let raw=accountRec[key]??snapshotRec[key];existsSyncMaybe(raw)===!1&&missing.push(String(raw))}}return missing}function summarizeTokenConfig(params){let enabled=params.accounts.filter(a=>a.enabled);if(enabled.length===0)return{state:null,detail:null};let accountRecs=enabled.map(a=>asRecord(a.account)),hasBotTokenField=accountRecs.some(r=>`botToken`in r),hasAppTokenField=accountRecs.some(r=>`appToken`in r),hasTokenField=accountRecs.some(r=>`token`in r);if(!hasBotTokenField&&!hasAppTokenField&&!hasTokenField)return{state:null,detail:null};if(hasBotTokenField&&hasAppTokenField){let ready=enabled.filter(a=>{let rec=asRecord(a.account),bot=typeof rec.botToken==`string`?rec.botToken.trim():``,app=typeof rec.appToken==`string`?rec.appToken.trim():``;return!!bot&&!!app}),partial=enabled.filter(a=>{let rec=asRecord(a.account),bot=typeof rec.botToken==`string`?rec.botToken.trim():``,app=typeof rec.appToken==`string`?rec.appToken.trim():``,hasBot=!!bot,hasApp=!!app;return hasBot&&!hasApp||!hasBot&&hasApp});if(partial.length>0)return{state:`warn`,detail:`partial tokens (need bot+app) · accounts ${partial.length}`};if(ready.length===0)return{state:`setup`,detail:`no tokens (need bot+app)`};let botSources=summarizeSources(ready.map(a=>a.snapshot.botTokenSource??`none`)),appSources=summarizeSources(ready.map(a=>a.snapshot.appTokenSource??`none`)),sample=ready[0]?.account?asRecord(ready[0].account):{},botToken=typeof sample.botToken==`string`?sample.botToken:``,appToken=typeof sample.appToken==`string`?sample.appToken:``,botHint=botToken.trim()?formatTokenHint(botToken,{showSecrets:params.showSecrets}):``,appHint=appToken.trim()?formatTokenHint(appToken,{showSecrets:params.showSecrets}):``,hint=botHint||appHint?` (bot ${botHint||`?`}, app ${appHint||`?`})`:``;return{state:`ok`,detail:`tokens ok (bot ${botSources.label}, app ${appSources.label})${hint} · accounts ${ready.length}/${enabled.length||1}`}}if(hasBotTokenField){let ready=enabled.filter(a=>{let rec=asRecord(a.account);return!!(typeof rec.botToken==`string`&&rec.botToken.trim())});if(ready.length===0)return{state:`setup`,detail:`no bot token`};let sample=ready[0]?.account?asRecord(ready[0].account):{},botToken=typeof sample.botToken==`string`?sample.botToken:``,botHint=botToken.trim()?formatTokenHint(botToken,{showSecrets:params.showSecrets}):``;return{state:`ok`,detail:`bot token config${botHint?` (${botHint})`:``} · accounts ${ready.length}/${enabled.length||1}`}}let ready=enabled.filter(a=>{let rec=asRecord(a.account);return typeof rec.token==`string`?!!rec.token.trim():!1});if(ready.length===0)return{state:`setup`,detail:`no token`};let sources=summarizeSources(ready.map(a=>a.snapshot.tokenSource)),sample=ready[0]?.account?asRecord(ready[0].account):{},token=typeof sample.token==`string`?sample.token:``,hint=token.trim()?` (${formatTokenHint(token,{showSecrets:params.showSecrets})})`:``;return{state:`ok`,detail:`token ${sources.label}${hint} · accounts ${ready.length}/${enabled.length||1}`}}async function buildChannelsTable(cfg,opts){let showSecrets=opts?.showSecrets===!0,rows=[],details=[];for(let plugin of listChannelPlugins()){let accountIds=plugin.config.listAccountIds(cfg),defaultAccountId=resolveChannelDefaultAccountId({plugin,cfg,accountIds}),resolvedAccountIds=accountIds.length>0?accountIds:[defaultAccountId],accounts=[];for(let accountId of resolvedAccountIds){let account=plugin.config.resolveAccount(cfg,accountId),enabled=resolveAccountEnabled(plugin,account,cfg),configured=await resolveAccountConfigured(plugin,account,cfg),snapshot=buildChannelAccountSnapshot({plugin,cfg,accountId,account,enabled,configured});accounts.push({accountId,account,enabled,configured,snapshot})}let anyEnabled=accounts.some(a=>a.enabled),enabledAccounts=accounts.filter(a=>a.enabled),configuredAccounts=enabledAccounts.filter(a=>a.configured),defaultEntry=accounts.find(a=>a.accountId===defaultAccountId)??accounts[0],link=resolveLinkFields(plugin.status?.buildChannelSummary?await plugin.status.buildChannelSummary({account:defaultEntry?.account??{},cfg,defaultAccountId,snapshot:defaultEntry?.snapshot??{accountId:defaultAccountId}}):void 0),missingPaths=collectMissingPaths(enabledAccounts),tokenSummary=summarizeTokenConfig({plugin,cfg,accounts,showSecrets}),issues=plugin.status?.collectStatusIssues?plugin.status.collectStatusIssues(accounts.map(a=>a.snapshot)):[],label=plugin.meta.label??plugin.id,state=anyEnabled?missingPaths.length>0||issues.length>0?`warn`:link.linked===!1?`setup`:tokenSummary.state?tokenSummary.state:link.linked===!0||configuredAccounts.length>0?`ok`:`setup`:`off`,detail=(()=>{if(!anyEnabled)return defaultEntry?plugin.config.disabledReason?.(defaultEntry.account,cfg)??`disabled`:`disabled`;if(missingPaths.length>0)return`missing file (${missingPaths[0]})`;if(issues.length>0)return issues[0]?.message??`misconfigured`;if(link.linked!==null){let base=link.linked?`linked`:`not linked`,extra=[];return link.linked&&link.selfE164&&extra.push(link.selfE164),link.linked&&link.authAgeMs!=null&&link.authAgeMs>=0&&extra.push(`auth ${formatTimeAgo(link.authAgeMs)}`),(accounts.length>1||plugin.meta.forceAccountBinding)&&extra.push(`accounts ${accounts.length||1}`),extra.length>0?`${base} · ${extra.join(` · `)}`:base}if(tokenSummary.detail)return tokenSummary.detail;if(configuredAccounts.length>0){let head=`configured`;return accounts.length<=1&&!plugin.meta.forceAccountBinding?head:`${head} · accounts ${configuredAccounts.length}/${enabledAccounts.length||1}`}return(defaultEntry&&plugin.config.unconfiguredReason?plugin.config.unconfiguredReason(defaultEntry.account,cfg):null)??`not configured`})();rows.push({id:plugin.id,label,enabled:anyEnabled,state,detail}),configuredAccounts.length>0&&details.push({title:`${label} accounts`,columns:[`Account`,`Status`,`Notes`],rows:configuredAccounts.map(entry=>{let notes=buildAccountNotes({plugin,cfg,entry});return{Account:formatAccountLabel({accountId:entry.accountId,name:entry.snapshot.name}),Status:entry.enabled?`OK`:`WARN`,Notes:notes.join(` · `)}})})}return{rows,details}}async function readFileTailLines(filePath,maxLines){let raw=await fs$1.readFile(filePath,`utf8`).catch(()=>``);if(!raw.trim())return[];let lines=raw.replace(/\r/g,``).split(`
2
2
  `);return lines.slice(Math.max(0,lines.length-maxLines)).map(line=>line.trimEnd()).filter(line=>line.trim().length>0)}function countMatches(haystack,needle){return!haystack||!needle?0:haystack.split(needle).length-1}function shorten(message,maxLen){let cleaned=message.replace(/\s+/g,` `).trim();return cleaned.length<=maxLen?cleaned:`${cleaned.slice(0,Math.max(0,maxLen-1))}…`}function normalizeGwsLine(line){return line.replace(/\s+runId=[^\s]+/g,``).replace(/\s+conn=[^\s]+/g,``).replace(/\s+id=[^\s]+/g,``).replace(/\s+error=Error:.*$/g,``).trim()}function consumeJsonBlock(lines,startIndex){let startLine=lines[startIndex]??``,braceAt=startLine.indexOf(`{`);if(braceAt<0)return null;let parts=[startLine.slice(braceAt)],depth=countMatches(parts[0]??``,`{`)-countMatches(parts[0]??``,`}`),i=startIndex;for(;depth>0&&i+1<lines.length;){i+=1;let next=lines[i]??``;parts.push(next),depth+=countMatches(next,`{`)-countMatches(next,`}`)}return{json:parts.join(`
3
3
  `),endIndex:i}}function summarizeLogTail(rawLines,opts){let maxLines=Math.max(6,opts?.maxLines??26),out=[],groups=new Map,addGroup=(key,base)=>{let existing=groups.get(key);if(existing){existing.count+=1;return}groups.set(key,{count:1,index:out.length,base}),out.push(base)},addLine=line=>{let trimmed=line.trimEnd();trimmed&&out.push(trimmed)},lines=rawLines.map(line=>line.trimEnd()).filter(Boolean);for(let i=0;i<lines.length;i+=1){let line=lines[i]??``,trimmedStart=line.trimStart();if((trimmedStart.startsWith(`"`)||trimmedStart===`}`||trimmedStart===`{`||trimmedStart.startsWith(`}`)||trimmedStart.startsWith(`{`))&&!trimmedStart.startsWith(`[`)&&!trimmedStart.startsWith(`#`))continue;let tokenRefresh=line.match(/^\[([^\]]+)\]\s+Token refresh failed:\s*(\d+)\s*(\{)?\s*$/);if(tokenRefresh){let tag=tokenRefresh[1]??`unknown`,status=tokenRefresh[2]??`unknown`,block=consumeJsonBlock(lines,i);if(block){i=block.endIndex;let parsed=(()=>{try{return JSON.parse(block.json)}catch{return null}})(),code=parsed?.error?.code?.trim()||null,msg=parsed?.error?.message?.trim()||null,msgShort=msg?msg.toLowerCase().includes(`signing in again`)?`re-auth required`:shorten(msg,52):null,base=`[${tag}] token refresh ${status}${code?` ${code}`:``}${msgShort?` · ${msgShort}`:``}`;addGroup(`token:${tag}:${status}:${code??``}:${msgShort??``}`,base);continue}}let embedded=line.match(/^Embedded agent failed before reply:\s+OAuth token refresh failed for ([^:]+):/);if(embedded){let provider=embedded[1]?.trim()||`unknown`;addGroup(`embedded:${provider}`,`Embedded agent: OAuth token refresh failed (${provider})`);continue}if(line.startsWith(`[gws]`)&&line.includes(`errorCode=UNAVAILABLE`)&&line.includes(`OAuth token refresh failed`)){let normalized=normalizeGwsLine(line);addGroup(`gws:${normalized}`,normalized);continue}addLine(line)}for(let g of groups.values())g.count<=1||(out[g.index]=`${g.base} ×${g.count}`);let deduped=[];for(let line of out)deduped[deduped.length-1]!==line&&deduped.push(line);if(deduped.length<=maxLines)return deduped;let head=Math.min(6,Math.floor(maxLines/3)),tail=Math.max(1,maxLines-head-1);return[...deduped.slice(0,head),`… ${deduped.length-head-tail} lines omitted …`,...deduped.slice(-tail)]}async function appendStatusAllDiagnosis(params){let{lines,muted,ok,warn,fail}=params,emitCheck=(label,status)=>{let icon=status===`ok`?ok(`✓`):status===`warn`?warn(`!`):fail(`✗`),colored=status===`ok`?ok(label):status===`warn`?warn(label):fail(label);lines.push(`${icon} ${colored}`)};lines.push(``),lines.push(muted(`Gateway connection details:`));for(let line of redactSecrets(params.connectionDetailsForReport).split(`
4
4
  `).map(l=>l.trimEnd()))lines.push(` ${muted(line)}`);if(lines.push(``),params.snap){let status=params.snap.exists?params.snap.valid?`ok`:`warn`:`fail`;emitCheck(`Config: ${params.snap.path??`(unknown)`}`,status);let issues=[...params.snap.legacyIssues??[],...params.snap.issues??[]],uniqueIssues=issues.filter((issue,index)=>issues.findIndex(x=>x.path===issue.path&&x.message===issue.message)===index);for(let issue of uniqueIssues.slice(0,12))lines.push(` - ${issue.path}: ${issue.message}`);uniqueIssues.length>12&&lines.push(` ${muted(`… +${uniqueIssues.length-12} more`)}`)}else emitCheck(`Config: read failed`,`warn`);params.remoteUrlMissing&&(lines.push(``),emitCheck(`Gateway remote mode misconfigured (gateway.remote.url missing)`,`warn`),lines.push(` ${muted(`Fix: set gateway.remote.url, or set gateway.mode=local.`)}`)),params.sentinel?.payload?(emitCheck(`Restart sentinel present`,`warn`),lines.push(` ${muted(`${summarizeRestartSentinel(params.sentinel.payload)} · ${formatTimeAgo(Date.now()-params.sentinel.payload.ts)}`)}`)):emitCheck(`Restart sentinel: none`,`ok`);let lastErrClean=params.lastErr?.trim()??``,isTrivialLastErr=lastErrClean.length<8||lastErrClean===`}`||lastErrClean===`{`;if(lastErrClean&&!isTrivialLastErr&&(lines.push(``),lines.push(muted(`Gateway last log line:`)),lines.push(` ${muted(redactSecrets(lastErrClean))}`)),params.portUsage){let portOk=params.portUsage.listeners.length===0;if(emitCheck(`Port ${params.port}`,portOk?`ok`:`warn`),!portOk)for(let line of formatPortDiagnostics(params.portUsage))lines.push(` ${muted(line)}`)}{let backend=params.tailscale.backendState??`unknown`,okBackend=backend===`Running`,hasDns=!!params.tailscale.dnsName;emitCheck(params.tailscaleMode===`off`?`Tailscale: off · ${backend}${params.tailscale.dnsName?` · ${params.tailscale.dnsName}`:``}`:`Tailscale: ${params.tailscaleMode} · ${backend}${params.tailscale.dnsName?` · ${params.tailscale.dnsName}`:``}`,okBackend&&(params.tailscaleMode===`off`||hasDns)?`ok`:`warn`),params.tailscale.error&&lines.push(` ${muted(`error: ${params.tailscale.error}`)}`),params.tailscale.ips.length>0&&lines.push(` ${muted(`ips: ${params.tailscale.ips.slice(0,3).join(`, `)}${params.tailscale.ips.length>3?`…`:``}`)}`),params.tailscaleHttpsUrl&&lines.push(` ${muted(`https: ${params.tailscaleHttpsUrl}`)}`)}if(params.skillStatus){let eligible=params.skillStatus.skills.filter(s=>s.eligible).length,missing=params.skillStatus.skills.filter(s=>s.eligible&&Object.values(s.missing).some(arr=>arr.length)).length;emitCheck(`Skills: ${eligible} eligible · ${missing} missing · ${params.skillStatus.workspaceDir}`,missing===0?`ok`:`warn`)}params.progress.setLabel(`Reading logs…`);let logPaths=(()=>{try{return resolveGatewayLogPaths(process.env)}catch{return null}})();if(logPaths){params.progress.setLabel(`Reading logs…`);let[stderrTail,stdoutTail]=await Promise.all([readFileTailLines(logPaths.stderrPath,40).catch(()=>[]),readFileTailLines(logPaths.stdoutPath,40).catch(()=>[])]);if(stderrTail.length>0||stdoutTail.length>0){lines.push(``),lines.push(muted(`Gateway logs (tail, summarized): ${logPaths.logDir}`)),lines.push(` ${muted(`# stderr: ${logPaths.stderrPath}`)}`);for(let line of summarizeLogTail(stderrTail,{maxLines:22}).map(redactSecrets))lines.push(` ${muted(line)}`);lines.push(` ${muted(`# stdout: ${logPaths.stdoutPath}`)}`);for(let line of summarizeLogTail(stdoutTail,{maxLines:22}).map(redactSecrets))lines.push(` ${muted(line)}`)}}if(params.progress.tick(),params.channelsStatus){emitCheck(`Channel issues (${params.channelIssues.length||`none`})`,params.channelIssues.length===0?`ok`:`warn`);for(let issue of params.channelIssues.slice(0,12)){let fixText=issue.fix?` · fix: ${issue.fix}`:``;lines.push(` - ${issue.channel}[${issue.accountId}] ${issue.kind}: ${issue.message}${fixText}`)}params.channelIssues.length>12&&lines.push(` ${muted(`… +${params.channelIssues.length-12} more`)}`)}else emitCheck(`Channel issues skipped (gateway ${params.gatewayReachable?`query failed`:`unreachable`})`,`warn`);let healthErr=(()=>{if(!params.health||typeof params.health!=`object`)return``;let record=params.health;if(!(`error`in record))return``;let value=record.error;if(!value)return``;if(typeof value==`string`)return value;try{return JSON.stringify(value,null,2)}catch{return`[unserializable error]`}})();healthErr&&(lines.push(``),lines.push(muted(`Gateway health:`)),lines.push(` ${muted(redactSecrets(healthErr))}`)),lines.push(``),lines.push(muted(`Pasteable debug report. Auth tokens redacted.`)),lines.push(`Troubleshooting: https://docs.builderforce.ai/troubleshooting`),lines.push(``)}async function buildStatusAllReportLines(params){let rich=isRich(),heading=text=>rich?theme.heading(text):text,ok=text=>rich?theme.success(text):text,warn=text=>rich?theme.warn(text):text,fail=text=>rich?theme.error(text):text,muted=text=>rich?theme.muted(text):text,tableWidth=Math.max(60,(process.stdout.columns??120)-1),overview=renderTable({width:tableWidth,columns:[{key:`Item`,header:`Item`,minWidth:10},{key:`Value`,header:`Value`,flex:!0,minWidth:24}],rows:params.overviewRows}),channelRows=params.channels.rows.map(row=>({channelId:row.id,Channel:row.label,Enabled:row.enabled?ok(`ON`):muted(`OFF`),State:row.state===`ok`?ok(`OK`):row.state===`warn`?warn(`WARN`):row.state===`off`?muted(`OFF`):theme.accentDim(`SETUP`),Detail:row.detail})),channelIssuesByChannel=(()=>{let map=new Map;for(let issue of params.channelIssues){let key=issue.channel,list=map.get(key);list?list.push(issue):map.set(key,[issue])}return map})(),channelsTable=renderTable({width:tableWidth,columns:[{key:`Channel`,header:`Channel`,minWidth:10},{key:`Enabled`,header:`Enabled`,minWidth:7},{key:`State`,header:`State`,minWidth:8},{key:`Detail`,header:`Detail`,flex:!0,minWidth:28}],rows:channelRows.map(row=>{let issues=channelIssuesByChannel.get(row.channelId)??[];if(issues.length===0)return row;let issue=issues[0],suffix=` · ${warn(`gateway: ${String(issue.message).slice(0,90)}`)}`;return{...row,State:warn(`WARN`),Detail:`${row.Detail}${suffix}`}})}),agentsTable=renderTable({width:tableWidth,columns:[{key:`Agent`,header:`Agent`,minWidth:12},{key:`Bootstrap`,header:`Bootstrap`,minWidth:10},{key:`Sessions`,header:`Sessions`,align:`right`,minWidth:8},{key:`Active`,header:`Active`,minWidth:10},{key:`Store`,header:`Store`,flex:!0,minWidth:34}],rows:params.agentStatus.agents.map(a=>({Agent:a.name?.trim()?`${a.id} (${a.name.trim()})`:a.id,Bootstrap:a.bootstrapPending===!0?warn(`PENDING`):a.bootstrapPending===!1?ok(`OK`):`unknown`,Sessions:String(a.sessionsCount),Active:a.lastActiveAgeMs==null?`unknown`:formatTimeAgo(a.lastActiveAgeMs),Store:a.sessionsPath}))}),lines=[];lines.push(heading(`BuilderForceAgents status --all`)),lines.push(``),lines.push(heading(`Overview`)),lines.push(overview.trimEnd()),lines.push(``),lines.push(heading(`Channels`)),lines.push(channelsTable.trimEnd());for(let detail of params.channels.details)lines.push(``),lines.push(heading(detail.title)),lines.push(renderTable({width:tableWidth,columns:detail.columns.map(c=>({key:c,header:c,flex:c===`Notes`,minWidth:c===`Notes`?28:10})),rows:detail.rows.map(r=>({...r,...r.Status===`OK`?{Status:ok(`OK`)}:r.Status===`WARN`?{Status:warn(`WARN`)}:{}}))}).trimEnd());return lines.push(``),lines.push(heading(`Agents`)),lines.push(agentsTable.trimEnd()),lines.push(``),lines.push(heading(`Diagnosis (read-only)`)),await appendStatusAllDiagnosis({lines,progress:params.progress,muted,ok,warn,fail,connectionDetailsForReport:params.connectionDetailsForReport,...params.diagnosis}),lines}async function statusAllCommand(runtime,opts){await withProgress({label:`Scanning status --all…`,total:11},async progress=>{progress.setLabel(`Loading config…`);let cfg=loadConfig(),osSummary=resolveOsSummary(),snap=await readConfigFileSnapshot().catch(()=>null);progress.tick(),progress.setLabel(`Checking Tailscale…`);let tailscaleMode=cfg.gateway?.tailscale?.mode??`off`,tailscale=await(async()=>{try{let parsed=await readTailscaleStatusJson(runExec,{timeoutMs:1200}),backendState=typeof parsed.BackendState==`string`?parsed.BackendState:null,self=typeof parsed.Self==`object`&&parsed.Self!==null?parsed.Self:null,dnsNameRaw=self&&typeof self.DNSName==`string`?self.DNSName:null;return{ok:!0,backendState,dnsName:dnsNameRaw?dnsNameRaw.replace(/\.$/,``):null,ips:self&&Array.isArray(self.TailscaleIPs)?self.TailscaleIPs.filter(v=>typeof v==`string`&&v.trim().length>0).map(v=>v.trim()):[],error:null}}catch(err){return{ok:!1,backendState:null,dnsName:null,ips:[],error:String(err)}}})(),tailscaleHttpsUrl=tailscaleMode!==`off`&&tailscale.dnsName?`https://${tailscale.dnsName}${normalizeControlUiBasePath(cfg.gateway?.controlUi?.basePath)}`:null;progress.tick(),progress.setLabel(`Checking for updates…`);let update=await checkUpdateStatus({root:await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()}),timeoutMs:6500,fetchGit:!0,includeRegistry:!0}),channelLabel=resolveUpdateChannelDisplay({configChannel:normalizeUpdateChannel(cfg.update?.channel),installKind:update.installKind,gitTag:update.git?.tag??null,gitBranch:update.git?.branch??null}).label,gitLabel=formatGitInstallLabel(update);progress.tick(),progress.setLabel(`Probing gateway…`);let connection=buildGatewayConnectionDetails({config:cfg}),isRemoteMode=cfg.gateway?.mode===`remote`,remoteUrlRaw=typeof cfg.gateway?.remote?.url==`string`?cfg.gateway.remote.url.trim():``,remoteUrlMissing=isRemoteMode&&!remoteUrlRaw,gatewayMode=isRemoteMode?`remote`:`local`,localFallbackAuth=resolveGatewayProbeAuth$1({cfg,mode:`local`}),remoteAuth=resolveGatewayProbeAuth$1({cfg,mode:`remote`}),probeAuth=isRemoteMode&&!remoteUrlMissing?remoteAuth:localFallbackAuth,gatewayProbe=await probeGateway({url:connection.url,auth:probeAuth,timeoutMs:Math.min(5e3,opts?.timeoutMs??1e4)}).catch(()=>null),gatewayReachable=gatewayProbe?.ok===!0,gatewaySelf=pickGatewaySelfPresence(gatewayProbe?.presence??null);progress.tick(),progress.setLabel(`Checking services…`);let readServiceSummary=async service=>{try{let[loaded,runtimeInfo,command]=await Promise.all([service.isLoaded({env:process.env}).catch(()=>!1),service.readRuntime(process.env).catch(()=>void 0),service.readCommand(process.env).catch(()=>null)]),installed=command!=null;return{label:service.label,installed,loaded,loadedText:loaded?service.loadedText:service.notLoadedText,runtime:runtimeInfo}}catch{return null}},daemon=await readServiceSummary(resolveGatewayService()),nodeService=await readServiceSummary(resolveNodeService());progress.tick(),progress.setLabel(`Scanning agents…`);let agentStatus=await getAgentLocalStatuses$1(cfg);progress.tick(),progress.setLabel(`Summarizing channels…`);let channels=await buildChannelsTable(cfg,{showSecrets:!1});progress.tick();let connectionDetailsForReport=(()=>{if(!remoteUrlMissing)return connection.message;let bindMode=cfg.gateway?.bind??`loopback`;return[`Gateway mode: remote`,`Gateway target: (missing gateway.remote.url)`,`Config: ${snap?.path?.trim()?snap.path.trim():`(unknown config path)`}`,`Bind: ${bindMode}`,`Local fallback (used for probes): ${connection.url}`,`Fix: set gateway.remote.url, or set gateway.mode=local.`].join(`
@@ -1 +1 @@
1
- import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{U as VERSION}from"./io-3R_ZyUxB.js";import{n as compareSemverStrings,t as checkUpdateStatus}from"./update-check-D6MvqVFE.js";async function getUpdateCheckResult(params){return await checkUpdateStatus({root:await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()}),timeoutMs:params.timeoutMs,fetchGit:params.fetchGit,includeRegistry:params.includeRegistry})}function resolveUpdateAvailability(update){let latestVersion=update.registry?.latestVersion??null,registryCmp=latestVersion?compareSemverStrings(VERSION,latestVersion):null,hasRegistryUpdate=registryCmp!=null&&registryCmp<0,gitBehind=update.installKind===`git`&&typeof update.git?.behind==`number`?update.git.behind:null,hasGitUpdate=gitBehind!=null&&gitBehind>0;return{available:hasGitUpdate||hasRegistryUpdate,hasGitUpdate,hasRegistryUpdate,latestVersion:hasRegistryUpdate?latestVersion:null,gitBehind}}function formatUpdateAvailableHint(update){let availability=resolveUpdateAvailability(update);if(!availability.available)return null;let details=[];return availability.hasGitUpdate&&availability.gitBehind!=null&&details.push(`git behind ${availability.gitBehind}`),availability.hasRegistryUpdate&&availability.latestVersion&&details.push(`npm ${availability.latestVersion}`),`Update available${details.length>0?` (${details.join(` · `)})`:``}. Run: ${formatCliCommand(`builderforce update`)}`}function formatUpdateOneLiner(update){let parts=[],appendRegistryUpdateSummary=()=>{if(update.registry?.latestVersion){let cmp=compareSemverStrings(VERSION,update.registry.latestVersion);cmp===0?parts.push(`npm latest ${update.registry.latestVersion}`):cmp!=null&&cmp<0?parts.push(`npm update ${update.registry.latestVersion}`):parts.push(`npm latest ${update.registry.latestVersion} (local newer)`);return}update.registry?.error&&parts.push(`npm latest unknown`)};if(update.installKind===`git`&&update.git){let branch=update.git.branch?`git ${update.git.branch}`:`git`;parts.push(branch),update.git.upstream&&parts.push(`↔ ${update.git.upstream}`),update.git.dirty===!0&&parts.push(`dirty`),update.git.behind!=null&&update.git.ahead!=null&&(update.git.behind===0&&update.git.ahead===0?parts.push(`up to date`):update.git.behind>0&&update.git.ahead===0?parts.push(`behind ${update.git.behind}`):update.git.behind===0&&update.git.ahead>0?parts.push(`ahead ${update.git.ahead}`):update.git.behind>0&&update.git.ahead>0&&parts.push(`diverged (ahead ${update.git.ahead}, behind ${update.git.behind})`)),update.git.fetchOk===!1&&parts.push(`fetch failed`),appendRegistryUpdateSummary()}else parts.push(update.packageManager===`unknown`?`pkg`:update.packageManager),appendRegistryUpdateSummary();return update.deps&&(update.deps.status===`ok`&&parts.push(`deps ok`),update.deps.status===`missing`&&parts.push(`deps missing`),update.deps.status===`stale`&&parts.push(`deps stale`)),`Update: ${parts.join(` · `)}`}export{resolveUpdateAvailability as i,formatUpdateOneLiner as n,getUpdateCheckResult as r,formatUpdateAvailableHint as t};
1
+ import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{U as VERSION}from"./io-BLBq4T2o.js";import{n as compareSemverStrings,t as checkUpdateStatus}from"./update-check-D6MvqVFE.js";async function getUpdateCheckResult(params){return await checkUpdateStatus({root:await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()}),timeoutMs:params.timeoutMs,fetchGit:params.fetchGit,includeRegistry:params.includeRegistry})}function resolveUpdateAvailability(update){let latestVersion=update.registry?.latestVersion??null,registryCmp=latestVersion?compareSemverStrings(VERSION,latestVersion):null,hasRegistryUpdate=registryCmp!=null&&registryCmp<0,gitBehind=update.installKind===`git`&&typeof update.git?.behind==`number`?update.git.behind:null,hasGitUpdate=gitBehind!=null&&gitBehind>0;return{available:hasGitUpdate||hasRegistryUpdate,hasGitUpdate,hasRegistryUpdate,latestVersion:hasRegistryUpdate?latestVersion:null,gitBehind}}function formatUpdateAvailableHint(update){let availability=resolveUpdateAvailability(update);if(!availability.available)return null;let details=[];return availability.hasGitUpdate&&availability.gitBehind!=null&&details.push(`git behind ${availability.gitBehind}`),availability.hasRegistryUpdate&&availability.latestVersion&&details.push(`npm ${availability.latestVersion}`),`Update available${details.length>0?` (${details.join(` · `)})`:``}. Run: ${formatCliCommand(`builderforce update`)}`}function formatUpdateOneLiner(update){let parts=[],appendRegistryUpdateSummary=()=>{if(update.registry?.latestVersion){let cmp=compareSemverStrings(VERSION,update.registry.latestVersion);cmp===0?parts.push(`npm latest ${update.registry.latestVersion}`):cmp!=null&&cmp<0?parts.push(`npm update ${update.registry.latestVersion}`):parts.push(`npm latest ${update.registry.latestVersion} (local newer)`);return}update.registry?.error&&parts.push(`npm latest unknown`)};if(update.installKind===`git`&&update.git){let branch=update.git.branch?`git ${update.git.branch}`:`git`;parts.push(branch),update.git.upstream&&parts.push(`↔ ${update.git.upstream}`),update.git.dirty===!0&&parts.push(`dirty`),update.git.behind!=null&&update.git.ahead!=null&&(update.git.behind===0&&update.git.ahead===0?parts.push(`up to date`):update.git.behind>0&&update.git.ahead===0?parts.push(`behind ${update.git.behind}`):update.git.behind===0&&update.git.ahead>0?parts.push(`ahead ${update.git.ahead}`):update.git.behind>0&&update.git.ahead>0&&parts.push(`diverged (ahead ${update.git.ahead}, behind ${update.git.behind})`)),update.git.fetchOk===!1&&parts.push(`fetch failed`),appendRegistryUpdateSummary()}else parts.push(update.packageManager===`unknown`?`pkg`:update.packageManager),appendRegistryUpdateSummary();return update.deps&&(update.deps.status===`ok`&&parts.push(`deps ok`),update.deps.status===`missing`&&parts.push(`deps missing`),update.deps.status===`stale`&&parts.push(`deps stale`)),`Update: ${parts.join(` · `)}`}export{resolveUpdateAvailability as i,formatUpdateOneLiner as n,getUpdateCheckResult as r,formatUpdateAvailableHint as t};
@@ -1 +1 @@
1
- import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{U as VERSION}from"./io-CohJffHG.js";import{n as compareSemverStrings,t as checkUpdateStatus}from"./update-check-B0YqSZJr.js";async function getUpdateCheckResult(params){return await checkUpdateStatus({root:await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()}),timeoutMs:params.timeoutMs,fetchGit:params.fetchGit,includeRegistry:params.includeRegistry})}function resolveUpdateAvailability(update){let latestVersion=update.registry?.latestVersion??null,registryCmp=latestVersion?compareSemverStrings(VERSION,latestVersion):null,hasRegistryUpdate=registryCmp!=null&&registryCmp<0,gitBehind=update.installKind===`git`&&typeof update.git?.behind==`number`?update.git.behind:null,hasGitUpdate=gitBehind!=null&&gitBehind>0;return{available:hasGitUpdate||hasRegistryUpdate,hasGitUpdate,hasRegistryUpdate,latestVersion:hasRegistryUpdate?latestVersion:null,gitBehind}}function formatUpdateAvailableHint(update){let availability=resolveUpdateAvailability(update);if(!availability.available)return null;let details=[];return availability.hasGitUpdate&&availability.gitBehind!=null&&details.push(`git behind ${availability.gitBehind}`),availability.hasRegistryUpdate&&availability.latestVersion&&details.push(`npm ${availability.latestVersion}`),`Update available${details.length>0?` (${details.join(` · `)})`:``}. Run: ${formatCliCommand(`builderforce update`)}`}function formatUpdateOneLiner(update){let parts=[],appendRegistryUpdateSummary=()=>{if(update.registry?.latestVersion){let cmp=compareSemverStrings(VERSION,update.registry.latestVersion);cmp===0?parts.push(`npm latest ${update.registry.latestVersion}`):cmp!=null&&cmp<0?parts.push(`npm update ${update.registry.latestVersion}`):parts.push(`npm latest ${update.registry.latestVersion} (local newer)`);return}update.registry?.error&&parts.push(`npm latest unknown`)};if(update.installKind===`git`&&update.git){let branch=update.git.branch?`git ${update.git.branch}`:`git`;parts.push(branch),update.git.upstream&&parts.push(`↔ ${update.git.upstream}`),update.git.dirty===!0&&parts.push(`dirty`),update.git.behind!=null&&update.git.ahead!=null&&(update.git.behind===0&&update.git.ahead===0?parts.push(`up to date`):update.git.behind>0&&update.git.ahead===0?parts.push(`behind ${update.git.behind}`):update.git.behind===0&&update.git.ahead>0?parts.push(`ahead ${update.git.ahead}`):update.git.behind>0&&update.git.ahead>0&&parts.push(`diverged (ahead ${update.git.ahead}, behind ${update.git.behind})`)),update.git.fetchOk===!1&&parts.push(`fetch failed`),appendRegistryUpdateSummary()}else parts.push(update.packageManager===`unknown`?`pkg`:update.packageManager),appendRegistryUpdateSummary();return update.deps&&(update.deps.status===`ok`&&parts.push(`deps ok`),update.deps.status===`missing`&&parts.push(`deps missing`),update.deps.status===`stale`&&parts.push(`deps stale`)),`Update: ${parts.join(` · `)}`}export{resolveUpdateAvailability as i,formatUpdateOneLiner as n,getUpdateCheckResult as r,formatUpdateAvailableHint as t};
1
+ import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{U as VERSION}from"./io-D9hC2aG0.js";import{n as compareSemverStrings,t as checkUpdateStatus}from"./update-check-B0YqSZJr.js";async function getUpdateCheckResult(params){return await checkUpdateStatus({root:await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()}),timeoutMs:params.timeoutMs,fetchGit:params.fetchGit,includeRegistry:params.includeRegistry})}function resolveUpdateAvailability(update){let latestVersion=update.registry?.latestVersion??null,registryCmp=latestVersion?compareSemverStrings(VERSION,latestVersion):null,hasRegistryUpdate=registryCmp!=null&&registryCmp<0,gitBehind=update.installKind===`git`&&typeof update.git?.behind==`number`?update.git.behind:null,hasGitUpdate=gitBehind!=null&&gitBehind>0;return{available:hasGitUpdate||hasRegistryUpdate,hasGitUpdate,hasRegistryUpdate,latestVersion:hasRegistryUpdate?latestVersion:null,gitBehind}}function formatUpdateAvailableHint(update){let availability=resolveUpdateAvailability(update);if(!availability.available)return null;let details=[];return availability.hasGitUpdate&&availability.gitBehind!=null&&details.push(`git behind ${availability.gitBehind}`),availability.hasRegistryUpdate&&availability.latestVersion&&details.push(`npm ${availability.latestVersion}`),`Update available${details.length>0?` (${details.join(` · `)})`:``}. Run: ${formatCliCommand(`builderforce update`)}`}function formatUpdateOneLiner(update){let parts=[],appendRegistryUpdateSummary=()=>{if(update.registry?.latestVersion){let cmp=compareSemverStrings(VERSION,update.registry.latestVersion);cmp===0?parts.push(`npm latest ${update.registry.latestVersion}`):cmp!=null&&cmp<0?parts.push(`npm update ${update.registry.latestVersion}`):parts.push(`npm latest ${update.registry.latestVersion} (local newer)`);return}update.registry?.error&&parts.push(`npm latest unknown`)};if(update.installKind===`git`&&update.git){let branch=update.git.branch?`git ${update.git.branch}`:`git`;parts.push(branch),update.git.upstream&&parts.push(`↔ ${update.git.upstream}`),update.git.dirty===!0&&parts.push(`dirty`),update.git.behind!=null&&update.git.ahead!=null&&(update.git.behind===0&&update.git.ahead===0?parts.push(`up to date`):update.git.behind>0&&update.git.ahead===0?parts.push(`behind ${update.git.behind}`):update.git.behind===0&&update.git.ahead>0?parts.push(`ahead ${update.git.ahead}`):update.git.behind>0&&update.git.ahead>0&&parts.push(`diverged (ahead ${update.git.ahead}, behind ${update.git.behind})`)),update.git.fetchOk===!1&&parts.push(`fetch failed`),appendRegistryUpdateSummary()}else parts.push(update.packageManager===`unknown`?`pkg`:update.packageManager),appendRegistryUpdateSummary();return update.deps&&(update.deps.status===`ok`&&parts.push(`deps ok`),update.deps.status===`missing`&&parts.push(`deps missing`),update.deps.status===`stale`&&parts.push(`deps stale`)),`Update: ${parts.join(` · `)}`}export{resolveUpdateAvailability as i,formatUpdateOneLiner as n,getUpdateCheckResult as r,formatUpdateAvailableHint as t};