@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,4 +1,4 @@
1
- import{d as resolveIsNixMode,f as resolveLegacyStateDirs,g as resolveStateDir,m as resolveOAuthDir,p as resolveNewStateDir,t as CONFIG_PATH,u as resolveGatewayPort,y as resolveRequiredHomeDir}from"./paths-5FcIFMsj.js";import{C as shortenHomePath,G as getResolvedLoggerSettings,b as resolveUserPath,f as isRecord,v as resolveHomeDir$1,w as sleep}from"./utils-DbaBVFaK.js";import{Mt as loadBuilderForceAgentsPlugins,ai as DEFAULT_OAUTH_WARN_MS,oi as buildAuthHealthSummary,si as formatRemainingShort}from"./reply-Cd3vVnD7.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,n as DEFAULT_ACCOUNT_ID}from"./session-key-EoB0qaG9.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import{n as runExec,t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir,i as resolveAgentDir,l as resolveDefaultAgentId,p as DEFAULT_AGENTS_FILENAME}from"./agent-scope-DPtjOxzp.js";import{Gt as resolveApiKeyForProfile,Wt as resolveProfileUnusableUntilForDisplay,Zt as repairOAuthProfileIdMismatch,_n as CODEX_CLI_PROFILE_ID,a as getModelRefStatus,bn as DEFAULT_PROVIDER,g as resolveHooksGmailModel,gn as CLAUDE_CLI_PROFILE_ID,in as ensureAuthProfileStore,m as resolveConfiguredModelRef,on as updateAuthProfileStoreWithLock,yn as DEFAULT_MODEL,yt as resolveApiKeyForProvider}from"./model-selection-9bRFKBI_.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{t as isTruthyEnvValue}from"./env-BIdU5BAp.js";import{a as readConfigFileSnapshot,c as writeConfigFile,p as BuilderForceAgentsSchema}from"./io-3R_ZyUxB.js";import{t as migrateLegacyConfig}from"./config-_1Ca6jGb.js";import{r as loadModelCatalog}from"./model-catalog-C6UrZ0uG.js";import{D as DEFAULT_SANDBOX_IMAGE,E as DEFAULT_SANDBOX_COMMON_IMAGE,T as DEFAULT_SANDBOX_BROWSER_IMAGE,f as resolveSandboxScope}from"./sandbox-BZibn6PX.js";import{i as resolveGatewayAuth}from"./auth-lebUHrkd.js";import{r as isLoopbackHost,u as resolveGatewayBindHost}from"./ws-Bbu03j3h.js";import{a as inspectPortUsage,c as formatPortDiagnostics}from"./ports-DgmEDNOm.js";import{B as resolveMainSessionKey,L as canonicalizeMainSessionAlias,a as loadSessionStore,c as saveSessionStore,rt as cleanStaleLockFiles}from"./sessions-CdanN_ZI.js";import{c as listTelegramAccountIds,l as resolveTelegramAccount,n as listChannelPlugins}from"./plugins-D5zP6ENo.js";import{c as resolveStorePath,n as resolveSessionFilePath,s as resolveSessionTranscriptsDirForAgent}from"./paths-DJ6rztqJ.js";import{c as getDefaultMemoryDirs,l as getDefaultMemoryFilePaths}from"./sqlite-C39E12XS.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName,m as resolveNodeLaunchAgentLabel}from"./constants-BBbGeL3t.js";import{r as resolveMemorySearchConfig}from"./manager-DwywI_5-.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-BbRf8gFM.js";import{t as formatDurationCompact}from"./format-duration-HN2dpHE0.js";import{f as printWizardHeader,m as randomToken,n as applyWizardMetadata,s as guardCancel}from"./onboard-helpers-Cf5dNq7-.js";import{n as isWSLEnv,t as isWSL}from"./wsl-DkYsHmN5.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BpVK43GK.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-vWC0PU8J.js";import{t as note$1}from"./note-B6NtFdXt.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DTDCy17p.js";import{t as applyPluginAutoEnable}from"./plugin-auto-enable-DDry2fA6.js";import{t as isWithinDir}from"./path-safety-CS-EmF4c.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-BlOu0Ul_.js";import{a as gatewayInstallErrorHint,f as renderSystemNodeWarning,i as buildGatewayInstallPlan,m as resolveSystemNodeInfo,n as GATEWAY_DAEMON_RUNTIME_OPTIONS,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-CtOr1ncS.js";import{r as isSystemdUserServiceAvailable}from"./systemd-BG3_QT6W.js";import{a as launchAgentPlistExists,i as isLaunchAgentLoaded,o as repairLaunchAgentBootstrap,r as isLaunchAgentListed,s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-D-NLDyK3.js";import{a as isSystemdUnavailableDetail,c as auditGatewayServiceConfig,l as needsNodeRuntimeMigration,o as renderSystemdUnavailableHints,s as SERVICE_AUDIT_CODES,y as formatRuntimeStatus}from"./lifecycle-core-Dwb4gHjZ.js";import{t as readLastGatewayErrorLine}from"./diagnostics-DCjg0nBH.js";import{a as renderGatewayServiceCleanupHints,i as findExtraGatewayServices}from"./daemon-cli-DlwOVDbt.js";import{r as healthCommand}from"./health-yS3NRKvY.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-CWgH1Tda.js";import{n as isNumericTelegramUserId,r as normalizeTelegramAllowFromEntry,t as resolveDmAllowState}from"./dm-policy-shared-Dhw9_6mi.js";import{n as runGatewayUpdate,t as resolveAgentSessionDirs}from"./session-dirs-D_ARkyw0.js";import{n as logConfigUpdated}from"./logging-DHa3jQN3.js";import{t as ensureSystemdUserLingerInteractive}from"./systemd-linger-CT-VHPB3.js";import{t as formatHealthCheckFailure}from"./health-format-iE_KYEwP.js";import{n as doctorShellCompletion}from"./doctor-completion-DVxbs-74.js";import fs from"node:fs";import os from"node:os";import path from"node:path";import JSON5 from"json5";import fs$1 from"node:fs/promises";import{execFile}from"node:child_process";import{promisify}from"node:util";import{confirm,intro,outro,select}from"@clack/prompts";async function maybeRepairAnthropicOAuthProfileId(cfg,prompter){let repair=repairOAuthProfileIdMismatch({cfg,store:await ensureAuthProfileStore(),provider:`anthropic`,legacyProfileId:`anthropic:default`});return!repair.migrated||repair.changes.length===0||(note$1(repair.changes.map(c=>`- ${c}`).join(`
1
+ import{d as resolveIsNixMode,f as resolveLegacyStateDirs,g as resolveStateDir,m as resolveOAuthDir,p as resolveNewStateDir,t as CONFIG_PATH,u as resolveGatewayPort,y as resolveRequiredHomeDir}from"./paths-5FcIFMsj.js";import{C as shortenHomePath,G as getResolvedLoggerSettings,b as resolveUserPath,f as isRecord,v as resolveHomeDir$1,w as sleep}from"./utils-DbaBVFaK.js";import{Mt as loadBuilderForceAgentsPlugins,ai as DEFAULT_OAUTH_WARN_MS,oi as buildAuthHealthSummary,si as formatRemainingShort}from"./reply-GY1C8tcv.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,n as DEFAULT_ACCOUNT_ID}from"./session-key-EoB0qaG9.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import{n as runExec,t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir,i as resolveAgentDir,l as resolveDefaultAgentId,p as DEFAULT_AGENTS_FILENAME}from"./agent-scope-DPtjOxzp.js";import{Gt as resolveApiKeyForProfile,Wt as resolveProfileUnusableUntilForDisplay,Zt as repairOAuthProfileIdMismatch,_n as CODEX_CLI_PROFILE_ID,a as getModelRefStatus,bn as DEFAULT_PROVIDER,g as resolveHooksGmailModel,gn as CLAUDE_CLI_PROFILE_ID,in as ensureAuthProfileStore,m as resolveConfiguredModelRef,on as updateAuthProfileStoreWithLock,yn as DEFAULT_MODEL,yt as resolveApiKeyForProvider}from"./model-selection-DG9J_VTz.js";import{t as formatCliCommand}from"./command-format-D806O2pt.js";import{t as isTruthyEnvValue}from"./env-BIdU5BAp.js";import{a as readConfigFileSnapshot,c as writeConfigFile,p as BuilderForceAgentsSchema}from"./io-BLBq4T2o.js";import{t as migrateLegacyConfig}from"./config-BgV_FYSq.js";import{r as loadModelCatalog}from"./model-catalog-DjNiebr7.js";import{D as DEFAULT_SANDBOX_IMAGE,E as DEFAULT_SANDBOX_COMMON_IMAGE,T as DEFAULT_SANDBOX_BROWSER_IMAGE,f as resolveSandboxScope}from"./sandbox-C4AKi2EX.js";import{i as resolveGatewayAuth}from"./auth-lebUHrkd.js";import{r as isLoopbackHost,u as resolveGatewayBindHost}from"./ws-Bbu03j3h.js";import{a as inspectPortUsage,c as formatPortDiagnostics}from"./ports-DgmEDNOm.js";import{B as resolveMainSessionKey,L as canonicalizeMainSessionAlias,a as loadSessionStore,c as saveSessionStore,rt as cleanStaleLockFiles}from"./sessions-BuZVmOWt.js";import{c as listTelegramAccountIds,l as resolveTelegramAccount,n as listChannelPlugins}from"./plugins-D5zP6ENo.js";import{c as resolveStorePath,n as resolveSessionFilePath,s as resolveSessionTranscriptsDirForAgent}from"./paths-DJ6rztqJ.js";import{c as getDefaultMemoryDirs,l as getDefaultMemoryFilePaths}from"./sqlite-C39E12XS.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName,m as resolveNodeLaunchAgentLabel}from"./constants-BBbGeL3t.js";import{r as resolveMemorySearchConfig}from"./manager-DSz61dXv.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-T8ciwMTA.js";import{t as formatDurationCompact}from"./format-duration-HN2dpHE0.js";import{f as printWizardHeader,m as randomToken,n as applyWizardMetadata,s as guardCancel}from"./onboard-helpers-CiHzTaFX.js";import{n as isWSLEnv,t as isWSL}from"./wsl-DkYsHmN5.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BpVK43GK.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-vWC0PU8J.js";import{t as note$1}from"./note-B6NtFdXt.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DTDCy17p.js";import{t as applyPluginAutoEnable}from"./plugin-auto-enable-D8gKiE3F.js";import{t as isWithinDir}from"./path-safety-CS-EmF4c.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-BlOu0Ul_.js";import{a as gatewayInstallErrorHint,f as renderSystemNodeWarning,i as buildGatewayInstallPlan,m as resolveSystemNodeInfo,n as GATEWAY_DAEMON_RUNTIME_OPTIONS,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-9XitJmIL.js";import{r as isSystemdUserServiceAvailable}from"./systemd-BG3_QT6W.js";import{a as launchAgentPlistExists,i as isLaunchAgentLoaded,o as repairLaunchAgentBootstrap,r as isLaunchAgentListed,s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-D-NLDyK3.js";import{a as isSystemdUnavailableDetail,c as auditGatewayServiceConfig,l as needsNodeRuntimeMigration,o as renderSystemdUnavailableHints,s as SERVICE_AUDIT_CODES,y as formatRuntimeStatus}from"./lifecycle-core-uxjxTzFv.js";import{t as readLastGatewayErrorLine}from"./diagnostics-DCjg0nBH.js";import{a as renderGatewayServiceCleanupHints,i as findExtraGatewayServices}from"./daemon-cli-Bh3p0hui.js";import{r as healthCommand}from"./health-FO8MG5Ur.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-CWgH1Tda.js";import{n as isNumericTelegramUserId,r as normalizeTelegramAllowFromEntry,t as resolveDmAllowState}from"./dm-policy-shared-DYZ_T-az.js";import{n as runGatewayUpdate,t as resolveAgentSessionDirs}from"./session-dirs-DHaoq7zc.js";import{n as logConfigUpdated}from"./logging-DHa3jQN3.js";import{t as ensureSystemdUserLingerInteractive}from"./systemd-linger-CT-VHPB3.js";import{t as formatHealthCheckFailure}from"./health-format-iE_KYEwP.js";import{n as doctorShellCompletion}from"./doctor-completion-CbF34DIH.js";import fs from"node:fs";import os from"node:os";import path from"node:path";import JSON5 from"json5";import fs$1 from"node:fs/promises";import{execFile}from"node:child_process";import{promisify}from"node:util";import{confirm,intro,outro,select}from"@clack/prompts";async function maybeRepairAnthropicOAuthProfileId(cfg,prompter){let repair=repairOAuthProfileIdMismatch({cfg,store:await ensureAuthProfileStore(),provider:`anthropic`,legacyProfileId:`anthropic:default`});return!repair.migrated||repair.changes.length===0||(note$1(repair.changes.map(c=>`- ${c}`).join(`
2
2
  `),`Auth profiles`),!await prompter.confirm({message:`Update Anthropic OAuth profile id in config now?`,initialValue:!0}))?cfg:repair.config}function pruneAuthOrder(order,profileIds){if(!order)return{next:order,changed:!1};let changed=!1,next={};for(let[provider,list]of Object.entries(order)){let filtered=list.filter(id=>!profileIds.has(id));filtered.length!==list.length&&(changed=!0),filtered.length>0&&(next[provider]=filtered)}return{next:Object.keys(next).length>0?next:void 0,changed}}function pruneAuthProfiles(cfg,profileIds){let profiles=cfg.auth?.profiles,order=cfg.auth?.order,nextProfiles=profiles?{...profiles}:void 0,changed=!1;if(nextProfiles)for(let id of profileIds)id in nextProfiles&&(delete nextProfiles[id],changed=!0);let prunedOrder=pruneAuthOrder(order,profileIds);if(prunedOrder.changed&&(changed=!0),!changed)return{next:cfg,changed:!1};let nextAuth=nextProfiles||prunedOrder.next?{...cfg.auth,profiles:nextProfiles&&Object.keys(nextProfiles).length>0?nextProfiles:void 0,order:prunedOrder.next}:void 0;return{next:{...cfg,auth:nextAuth},changed:!0}}async function maybeRemoveDeprecatedCliAuthProfiles(cfg,prompter){let store=await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1}),deprecated=new Set;if((store.profiles[CLAUDE_CLI_PROFILE_ID]||cfg.auth?.profiles?.[CLAUDE_CLI_PROFILE_ID])&&deprecated.add(CLAUDE_CLI_PROFILE_ID),(store.profiles[CODEX_CLI_PROFILE_ID]||cfg.auth?.profiles?.[CODEX_CLI_PROFILE_ID])&&deprecated.add(CODEX_CLI_PROFILE_ID),deprecated.size===0)return cfg;let lines=[`Deprecated external CLI auth profiles detected (no longer supported):`];if(deprecated.has(CLAUDE_CLI_PROFILE_ID)&&lines.push(`- ${CLAUDE_CLI_PROFILE_ID} (Anthropic): use setup-token → ${formatCliCommand(`builderforce models auth setup-token`)}`),deprecated.has(CODEX_CLI_PROFILE_ID)&&lines.push(`- ${CODEX_CLI_PROFILE_ID} (OpenAI Codex): use OAuth → ${formatCliCommand(`builderforce models auth login --provider openai-codex`)}`),note$1(lines.join(`
3
3
  `),`Auth profiles`),!await prompter.confirmRepair({message:`Remove deprecated CLI auth profiles now?`,initialValue:!0}))return cfg;await updateAuthProfileStoreWithLock({updater:nextStore=>{let mutated=!1;for(let id of deprecated)nextStore.profiles[id]&&(delete nextStore.profiles[id],mutated=!0),nextStore.usageStats?.[id]&&(delete nextStore.usageStats[id],mutated=!0);if(nextStore.order)for(let[provider,list]of Object.entries(nextStore.order)){let filtered=list.filter(id=>!deprecated.has(id));filtered.length!==list.length&&(mutated=!0,filtered.length>0?nextStore.order[provider]=filtered:delete nextStore.order[provider])}if(nextStore.lastGood)for(let[provider,profileId]of Object.entries(nextStore.lastGood))deprecated.has(profileId)&&(delete nextStore.lastGood[provider],mutated=!0);return mutated}});let pruned=pruneAuthProfiles(cfg,deprecated);return pruned.changed&&note$1(Array.from(deprecated.values()).map(id=>`- removed ${id} from config`).join(`
4
4
  `),`Doctor changes`),pruned.next}function formatAuthIssueHint(issue){return issue.provider===`anthropic`&&issue.profileId===CLAUDE_CLI_PROFILE_ID?`Deprecated profile. Use ${formatCliCommand(`builderforce models auth setup-token`)} or ${formatCliCommand(`builderforce configure`)}.`:issue.provider===`openai-codex`&&issue.profileId===CODEX_CLI_PROFILE_ID?`Deprecated profile. Use ${formatCliCommand(`builderforce models auth login --provider openai-codex`)} or ${formatCliCommand(`builderforce configure`)}.`:`Re-auth via \`${formatCliCommand(`builderforce configure`)}\` or \`${formatCliCommand(`builderforce onboard`)}\`.`}function formatAuthIssueLine(issue){let remaining=issue.remainingMs===void 0?``:` (${formatRemainingShort(issue.remainingMs)})`,hint=formatAuthIssueHint(issue);return`- ${issue.profileId}: ${issue.status}${remaining}${hint?` — ${hint}`:``}`}async function noteAuthProfileHealth(params){let store=await ensureAuthProfileStore(void 0,{allowKeychainPrompt:params.allowKeychainPrompt}),unusable=(()=>{let now=Date.now(),out=[];for(let profileId of Object.keys(store.usageStats??{})){let until=resolveProfileUnusableUntilForDisplay(store,profileId);if(!until||now>=until)continue;let stats=store.usageStats?.[profileId],remaining=formatRemainingShort(until-now),kind=typeof stats?.disabledUntil==`number`&&now<stats.disabledUntil?`disabled${stats.disabledReason?`:${stats.disabledReason}`:``}`:`cooldown`,hint=kind.startsWith(`disabled:billing`)?`Top up credits (provider billing) or switch provider.`:`Wait for cooldown or switch provider.`;out.push(`- ${profileId}: ${kind} (${remaining})${hint?` — ${hint}`:``}`)}return out})();unusable.length>0&&note$1(unusable.join(`
@@ -1,4 +1,4 @@
1
- import{d as resolveIsNixMode,f as resolveLegacyStateDirs,g as resolveStateDir,m as resolveOAuthDir,p as resolveNewStateDir,t as CONFIG_PATH,u as resolveGatewayPort,y as resolveRequiredHomeDir}from"./paths-BHg-VHB4.js";import{C as sleep,S as shortenHomePath,W as getResolvedLoggerSettings,_ as resolveHomeDir$1,d as isRecord,y as resolveUserPath}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{H as resolveConfiguredModelRef,N as getModelRefStatus,S as updateAuthProfileStoreWithLock,W as resolveHooksGmailModel,_n as DEFAULT_PROVIDER,b as ensureAuthProfileStore,bn as CODEX_CLI_PROFILE_ID,gn as DEFAULT_MODEL,o as resolveProfileUnusableUntilForDisplay,p as repairOAuthProfileIdMismatch,qt as resolveApiKeyForProvider,s as resolveApiKeyForProfile,yn as CLAUDE_CLI_PROFILE_ID}from"./auth-profiles-C1VbcUOm.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,n as DEFAULT_ACCOUNT_ID}from"./session-key-CksCYipj.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{n as runExec,t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir,i as resolveAgentDir,l as resolveDefaultAgentId,p as DEFAULT_AGENTS_FILENAME}from"./agent-scope-CufEmNj_.js";import{a as readConfigFileSnapshot,c as writeConfigFile,p as BuilderForceAgentsSchema}from"./io-CohJffHG.js";import{t as migrateLegacyConfig}from"./config-toczWD3q.js";import{r as loadModelCatalog}from"./model-catalog-CiiFJX77.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-CGlKz1D1.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-DmAU4cRX.js";import{l as resolveGatewayBindHost,n as isLoopbackHost}from"./net-DtnXq2dW.js";import{Mn as buildAuthHealthSummary,Nn as formatRemainingShort,jn as DEFAULT_OAUTH_WARN_MS,w as loadBuilderForceAgentsPlugins}from"./subagent-registry-CyGxu3kP.js";import{A as canonicalizeMainSessionAlias,N as resolveMainSessionKey,X as cleanStaleLockFiles,a as loadSessionStore,c as saveSessionStore}from"./sessions-Bl1wwotX.js";import{c as listTelegramAccountIds,l as resolveTelegramAccount,n as listChannelPlugins}from"./plugins-1Mn6RiNf.js";import{D as DEFAULT_SANDBOX_IMAGE,E as DEFAULT_SANDBOX_COMMON_IMAGE,T as DEFAULT_SANDBOX_BROWSER_IMAGE,f as resolveSandboxScope}from"./sandbox-z9t_PRf9.js";import{i as resolveGatewayAuth}from"./auth-ChecwOXS.js";import{a as formatPortDiagnostics,n as inspectPortUsage}from"./ports-DTku9NSx.js";import{c as resolveStorePath,n as resolveSessionFilePath,s as resolveSessionTranscriptsDirForAgent}from"./paths-ClsbsPQP.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName,m as resolveNodeLaunchAgentLabel}from"./constants-D2th5NXV.js";import{c as getDefaultMemoryDirs,l as getDefaultMemoryFilePaths}from"./sqlite-CIGM1WKg.js";import{r as resolveMemorySearchConfig}from"./manager-CRba8roB.js";import{t as formatDurationCompact}from"./format-duration-HN2dpHE0.js";import{f as printWizardHeader,m as randomToken,n as applyWizardMetadata,s as guardCancel}from"./onboard-helpers-CckrS8_K.js";import{n as isWSLEnv,t as isWSL}from"./wsl-BO1sLIB6.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BMWmaqSC.js";import{t as note$1}from"./note-DgDXuE0F.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DPPVplyk.js";import{t as applyPluginAutoEnable}from"./plugin-auto-enable-BV9K9Vhr.js";import{t as isWithinDir}from"./path-safety-D04ClLIY.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-NLYb8w9i.js";import{a as gatewayInstallErrorHint,f as renderSystemNodeWarning,i as buildGatewayInstallPlan,m as resolveSystemNodeInfo,n as GATEWAY_DAEMON_RUNTIME_OPTIONS,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-B4UjqdyJ.js";import{r as isSystemdUserServiceAvailable}from"./systemd-DdVd5Yet.js";import{a as launchAgentPlistExists,i as isLaunchAgentLoaded,o as repairLaunchAgentBootstrap,r as isLaunchAgentListed,s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-EKJG69M3.js";import{a as isSystemdUnavailableDetail,c as auditGatewayServiceConfig,l as needsNodeRuntimeMigration,o as renderSystemdUnavailableHints,s as SERVICE_AUDIT_CODES,y as formatRuntimeStatus}from"./lifecycle-core-BpMvDXy1.js";import{t as readLastGatewayErrorLine}from"./diagnostics-DamNPi4e.js";import{a as renderGatewayServiceCleanupHints,i as findExtraGatewayServices}from"./daemon-cli-DyVsMf8p.js";import{r as healthCommand}from"./health-DVo8a9yg.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-BxgWcomx.js";import{n as isNumericTelegramUserId,r as normalizeTelegramAllowFromEntry,t as resolveDmAllowState}from"./dm-policy-shared-CRZpjRv0.js";import{n as runGatewayUpdate,t as resolveAgentSessionDirs}from"./session-dirs-OxQuIvJW.js";import{n as logConfigUpdated}from"./logging-ayt7F7vy.js";import{t as ensureSystemdUserLingerInteractive}from"./systemd-linger-CPKngdUf.js";import{t as formatHealthCheckFailure}from"./health-format-D4MaIjaG.js";import{n as doctorShellCompletion}from"./doctor-completion-BSotFS6p.js";import{execFile}from"node:child_process";import os from"node:os";import path from"node:path";import fs from"node:fs";import{promisify}from"node:util";import JSON5 from"json5";import fs$1 from"node:fs/promises";import{confirm,intro,outro,select}from"@clack/prompts";async function maybeRepairAnthropicOAuthProfileId(cfg,prompter){let repair=repairOAuthProfileIdMismatch({cfg,store:await ensureAuthProfileStore(),provider:`anthropic`,legacyProfileId:`anthropic:default`});return!repair.migrated||repair.changes.length===0||(note$1(repair.changes.map(c=>`- ${c}`).join(`
1
+ import{d as resolveIsNixMode,f as resolveLegacyStateDirs,g as resolveStateDir,m as resolveOAuthDir,p as resolveNewStateDir,t as CONFIG_PATH,u as resolveGatewayPort,y as resolveRequiredHomeDir}from"./paths-BHg-VHB4.js";import{C as sleep,S as shortenHomePath,W as getResolvedLoggerSettings,_ as resolveHomeDir$1,d as isRecord,y as resolveUserPath}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{H as resolveConfiguredModelRef,N as getModelRefStatus,S as updateAuthProfileStoreWithLock,W as resolveHooksGmailModel,_n as DEFAULT_PROVIDER,b as ensureAuthProfileStore,bn as CODEX_CLI_PROFILE_ID,gn as DEFAULT_MODEL,o as resolveProfileUnusableUntilForDisplay,p as repairOAuthProfileIdMismatch,qt as resolveApiKeyForProvider,s as resolveApiKeyForProfile,yn as CLAUDE_CLI_PROFILE_ID}from"./auth-profiles-pt7Tr4HA.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,n as DEFAULT_ACCOUNT_ID}from"./session-key-CksCYipj.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{n as runExec,t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import{A as resolveWorkspaceFilePath,c as resolveAgentWorkspaceDir,i as resolveAgentDir,l as resolveDefaultAgentId,p as DEFAULT_AGENTS_FILENAME}from"./agent-scope-CufEmNj_.js";import{a as readConfigFileSnapshot,c as writeConfigFile,p as BuilderForceAgentsSchema}from"./io-D9hC2aG0.js";import{t as migrateLegacyConfig}from"./config-BpChMIJ6.js";import{r as loadModelCatalog}from"./model-catalog-BeBXvbFm.js";import{t as buildWorkspaceSkillStatus}from"./skills-status-CGlKz1D1.js";import{n as callGateway,t as buildGatewayConnectionDetails}from"./call-Du2LiaX6.js";import{l as resolveGatewayBindHost,n as isLoopbackHost}from"./net-DtnXq2dW.js";import{Mn as buildAuthHealthSummary,Nn as formatRemainingShort,jn as DEFAULT_OAUTH_WARN_MS,w as loadBuilderForceAgentsPlugins}from"./subagent-registry-DDEN4oJi.js";import{A as canonicalizeMainSessionAlias,N as resolveMainSessionKey,X as cleanStaleLockFiles,a as loadSessionStore,c as saveSessionStore}from"./sessions-BA8Se_bT.js";import{c as listTelegramAccountIds,l as resolveTelegramAccount,n as listChannelPlugins}from"./plugins-1Mn6RiNf.js";import{D as DEFAULT_SANDBOX_IMAGE,E as DEFAULT_SANDBOX_COMMON_IMAGE,T as DEFAULT_SANDBOX_BROWSER_IMAGE,f as resolveSandboxScope}from"./sandbox-DvKMuAXL.js";import{i as resolveGatewayAuth}from"./auth-ChecwOXS.js";import{a as formatPortDiagnostics,n as inspectPortUsage}from"./ports-DTku9NSx.js";import{c as resolveStorePath,n as resolveSessionFilePath,s as resolveSessionTranscriptsDirForAgent}from"./paths-ClsbsPQP.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName,m as resolveNodeLaunchAgentLabel}from"./constants-D2th5NXV.js";import{c as getDefaultMemoryDirs,l as getDefaultMemoryFilePaths}from"./sqlite-CIGM1WKg.js";import{r as resolveMemorySearchConfig}from"./manager-BeohB4-8.js";import{t as formatDurationCompact}from"./format-duration-HN2dpHE0.js";import{f as printWizardHeader,m as randomToken,n as applyWizardMetadata,s as guardCancel}from"./onboard-helpers-Ce_c4Raj.js";import{n as isWSLEnv,t as isWSL}from"./wsl-BO1sLIB6.js";import{n as stylePromptMessage,r as stylePromptTitle,t as stylePromptHint}from"./prompt-style-BMWmaqSC.js";import{t as note$1}from"./note-DgDXuE0F.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DPPVplyk.js";import{t as applyPluginAutoEnable}from"./plugin-auto-enable-Cupr4wbt.js";import{t as isWithinDir}from"./path-safety-D04ClLIY.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-NLYb8w9i.js";import{a as gatewayInstallErrorHint,f as renderSystemNodeWarning,i as buildGatewayInstallPlan,m as resolveSystemNodeInfo,n as GATEWAY_DAEMON_RUNTIME_OPTIONS,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-Dx800VUt.js";import{r as isSystemdUserServiceAvailable}from"./systemd-DdVd5Yet.js";import{a as launchAgentPlistExists,i as isLaunchAgentLoaded,o as repairLaunchAgentBootstrap,r as isLaunchAgentListed,s as resolveGatewayLogPaths,t as resolveGatewayService}from"./service-EKJG69M3.js";import{a as isSystemdUnavailableDetail,c as auditGatewayServiceConfig,l as needsNodeRuntimeMigration,o as renderSystemdUnavailableHints,s as SERVICE_AUDIT_CODES,y as formatRuntimeStatus}from"./lifecycle-core-D9Dg5Qps.js";import{t as readLastGatewayErrorLine}from"./diagnostics-DamNPi4e.js";import{a as renderGatewayServiceCleanupHints,i as findExtraGatewayServices}from"./daemon-cli-BNzthScZ.js";import{r as healthCommand}from"./health-zrsgFZmR.js";import{n as resolveControlUiDistIndexHealth,r as resolveControlUiDistIndexPathForRoot}from"./control-ui-assets-BxgWcomx.js";import{n as isNumericTelegramUserId,r as normalizeTelegramAllowFromEntry,t as resolveDmAllowState}from"./dm-policy-shared-B9lW-AsK.js";import{n as runGatewayUpdate,t as resolveAgentSessionDirs}from"./session-dirs-Bvbgw0GC.js";import{n as logConfigUpdated}from"./logging-ayt7F7vy.js";import{t as ensureSystemdUserLingerInteractive}from"./systemd-linger-CPKngdUf.js";import{t as formatHealthCheckFailure}from"./health-format-D4MaIjaG.js";import{n as doctorShellCompletion}from"./doctor-completion-94zme499.js";import{execFile}from"node:child_process";import os from"node:os";import path from"node:path";import fs from"node:fs";import{promisify}from"node:util";import JSON5 from"json5";import fs$1 from"node:fs/promises";import{confirm,intro,outro,select}from"@clack/prompts";async function maybeRepairAnthropicOAuthProfileId(cfg,prompter){let repair=repairOAuthProfileIdMismatch({cfg,store:await ensureAuthProfileStore(),provider:`anthropic`,legacyProfileId:`anthropic:default`});return!repair.migrated||repair.changes.length===0||(note$1(repair.changes.map(c=>`- ${c}`).join(`
2
2
  `),`Auth profiles`),!await prompter.confirm({message:`Update Anthropic OAuth profile id in config now?`,initialValue:!0}))?cfg:repair.config}function pruneAuthOrder(order,profileIds){if(!order)return{next:order,changed:!1};let changed=!1,next={};for(let[provider,list]of Object.entries(order)){let filtered=list.filter(id=>!profileIds.has(id));filtered.length!==list.length&&(changed=!0),filtered.length>0&&(next[provider]=filtered)}return{next:Object.keys(next).length>0?next:void 0,changed}}function pruneAuthProfiles(cfg,profileIds){let profiles=cfg.auth?.profiles,order=cfg.auth?.order,nextProfiles=profiles?{...profiles}:void 0,changed=!1;if(nextProfiles)for(let id of profileIds)id in nextProfiles&&(delete nextProfiles[id],changed=!0);let prunedOrder=pruneAuthOrder(order,profileIds);if(prunedOrder.changed&&(changed=!0),!changed)return{next:cfg,changed:!1};let nextAuth=nextProfiles||prunedOrder.next?{...cfg.auth,profiles:nextProfiles&&Object.keys(nextProfiles).length>0?nextProfiles:void 0,order:prunedOrder.next}:void 0;return{next:{...cfg,auth:nextAuth},changed:!0}}async function maybeRemoveDeprecatedCliAuthProfiles(cfg,prompter){let store=await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1}),deprecated=new Set;if((store.profiles[CLAUDE_CLI_PROFILE_ID]||cfg.auth?.profiles?.[CLAUDE_CLI_PROFILE_ID])&&deprecated.add(CLAUDE_CLI_PROFILE_ID),(store.profiles[CODEX_CLI_PROFILE_ID]||cfg.auth?.profiles?.[CODEX_CLI_PROFILE_ID])&&deprecated.add(CODEX_CLI_PROFILE_ID),deprecated.size===0)return cfg;let lines=[`Deprecated external CLI auth profiles detected (no longer supported):`];if(deprecated.has(CLAUDE_CLI_PROFILE_ID)&&lines.push(`- ${CLAUDE_CLI_PROFILE_ID} (Anthropic): use setup-token → ${formatCliCommand(`builderforce models auth setup-token`)}`),deprecated.has(CODEX_CLI_PROFILE_ID)&&lines.push(`- ${CODEX_CLI_PROFILE_ID} (OpenAI Codex): use OAuth → ${formatCliCommand(`builderforce models auth login --provider openai-codex`)}`),note$1(lines.join(`
3
3
  `),`Auth profiles`),!await prompter.confirmRepair({message:`Remove deprecated CLI auth profiles now?`,initialValue:!0}))return cfg;await updateAuthProfileStoreWithLock({updater:nextStore=>{let mutated=!1;for(let id of deprecated)nextStore.profiles[id]&&(delete nextStore.profiles[id],mutated=!0),nextStore.usageStats?.[id]&&(delete nextStore.usageStats[id],mutated=!0);if(nextStore.order)for(let[provider,list]of Object.entries(nextStore.order)){let filtered=list.filter(id=>!deprecated.has(id));filtered.length!==list.length&&(mutated=!0,filtered.length>0?nextStore.order[provider]=filtered:delete nextStore.order[provider])}if(nextStore.lastGood)for(let[provider,profileId]of Object.entries(nextStore.lastGood))deprecated.has(profileId)&&(delete nextStore.lastGood[provider],mutated=!0);return mutated}});let pruned=pruneAuthProfiles(cfg,deprecated);return pruned.changed&&note$1(Array.from(deprecated.values()).map(id=>`- removed ${id} from config`).join(`
4
4
  `),`Doctor changes`),pruned.next}function formatAuthIssueHint(issue){return issue.provider===`anthropic`&&issue.profileId===CLAUDE_CLI_PROFILE_ID?`Deprecated profile. Use ${formatCliCommand(`builderforce models auth setup-token`)} or ${formatCliCommand(`builderforce configure`)}.`:issue.provider===`openai-codex`&&issue.profileId===CODEX_CLI_PROFILE_ID?`Deprecated profile. Use ${formatCliCommand(`builderforce models auth login --provider openai-codex`)} or ${formatCliCommand(`builderforce configure`)}.`:`Re-auth via \`${formatCliCommand(`builderforce configure`)}\` or \`${formatCliCommand(`builderforce onboard`)}\`.`}function formatAuthIssueLine(issue){let remaining=issue.remainingMs===void 0?``:` (${formatRemainingShort(issue.remainingMs)})`,hint=formatAuthIssueHint(issue);return`- ${issue.profileId}: ${issue.status}${remaining}${hint?` — ${hint}`:``}`}async function noteAuthProfileHealth(params){let store=await ensureAuthProfileStore(void 0,{allowKeychainPrompt:params.allowKeychainPrompt}),unusable=(()=>{let now=Date.now(),out=[];for(let profileId of Object.keys(store.usageStats??{})){let until=resolveProfileUnusableUntilForDisplay(store,profileId);if(!until||now>=until)continue;let stats=store.usageStats?.[profileId],remaining=formatRemainingShort(until-now),kind=typeof stats?.disabledUntil==`number`&&now<stats.disabledUntil?`disabled${stats.disabledReason?`:${stats.disabledReason}`:``}`:`cooldown`,hint=kind.startsWith(`disabled:billing`)?`Top up credits (provider billing) or switch provider.`:`Wait for cooldown or switch provider.`;out.push(`- ${profileId}: ${kind} (${remaining})${hint?` — ${hint}`:``}`)}return out})();unusable.length>0&&note$1(unusable.join(`
@@ -1,2 +1,2 @@
1
- import{Mt as loadBuilderForceAgentsPlugins,jt as createPluginLoaderLogger}from"./reply-Cd3vVnD7.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{in as ensureAuthProfileStore,nn as upsertAuthProfile,u as normalizeProviderId}from"./model-selection-9bRFKBI_.js";import{n as isWSLEnv}from"./wsl-DkYsHmN5.js";import{r as stylePromptTitle}from"./prompt-style-BpVK43GK.js";import{f as updateConfig}from"./shared-BPN3qd7G.js";import{d as applyAuthProfileConfig}from"./auth-token-CyVfNEQb.js";import{n as logConfigUpdated}from"./logging-DHa3jQN3.js";import{intro,note,outro,spinner}from"@clack/prompts";const CLIENT_ID=`Iv1.b507a08c87ecfe98`;function parseJsonResponse(value){if(!value||typeof value!=`object`)throw Error(`Unexpected response from GitHub`);return value}async function requestDeviceCode(params){let body=new URLSearchParams({client_id:CLIENT_ID,scope:params.scope}),res=await fetch(`https://github.com/login/device/code`,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`},body});if(!res.ok)throw Error(`GitHub device code failed: HTTP ${res.status}`);let json=parseJsonResponse(await res.json());if(!json.device_code||!json.user_code||!json.verification_uri)throw Error(`GitHub device code response missing fields`);return json}async function pollForAccessToken(params){let bodyBase=new URLSearchParams({client_id:CLIENT_ID,device_code:params.deviceCode,grant_type:`urn:ietf:params:oauth:grant-type:device_code`});for(;Date.now()<params.expiresAt;){let res=await fetch(`https://github.com/login/oauth/access_token`,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`},body:bodyBase});if(!res.ok)throw Error(`GitHub device token failed: HTTP ${res.status}`);let json=parseJsonResponse(await res.json());if(`access_token`in json&&typeof json.access_token==`string`)return json.access_token;let err=`error`in json?json.error:`unknown`;if(err===`authorization_pending`){await new Promise(r=>setTimeout(r,params.intervalMs));continue}if(err===`slow_down`){await new Promise(r=>setTimeout(r,params.intervalMs+2e3));continue}throw err===`expired_token`?Error(`GitHub device code expired; run login again`):err===`access_denied`?Error(`GitHub login cancelled`):Error(`GitHub device flow error: ${err}`)}throw Error(`GitHub device code expired; run login again`)}async function githubCopilotLoginCommand(opts,runtime){if(!process.stdin.isTTY)throw Error(`github-copilot login requires an interactive TTY.`);intro(stylePromptTitle(`GitHub Copilot login`));let profileId=opts.profileId?.trim()||`github-copilot:github`;(await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1})).profiles[profileId]&&!opts.yes&&note(`Auth profile already exists: ${profileId}\nRe-running will overwrite it.`,stylePromptTitle(`Existing credentials`));let spin=spinner();spin.start(`Requesting device code from GitHub...`);let device=await requestDeviceCode({scope:`read:user`});spin.stop(`Device code ready`),note([`Visit: ${device.verification_uri}`,`Code: ${device.user_code}`].join(`
1
+ import{Mt as loadBuilderForceAgentsPlugins,jt as createPluginLoaderLogger}from"./reply-GY1C8tcv.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{in as ensureAuthProfileStore,nn as upsertAuthProfile,u as normalizeProviderId}from"./model-selection-DG9J_VTz.js";import{n as isWSLEnv}from"./wsl-DkYsHmN5.js";import{r as stylePromptTitle}from"./prompt-style-BpVK43GK.js";import{f as updateConfig}from"./shared-C2orjbTD.js";import{d as applyAuthProfileConfig}from"./auth-token-BE67qxLw.js";import{n as logConfigUpdated}from"./logging-DHa3jQN3.js";import{intro,note,outro,spinner}from"@clack/prompts";const CLIENT_ID=`Iv1.b507a08c87ecfe98`;function parseJsonResponse(value){if(!value||typeof value!=`object`)throw Error(`Unexpected response from GitHub`);return value}async function requestDeviceCode(params){let body=new URLSearchParams({client_id:CLIENT_ID,scope:params.scope}),res=await fetch(`https://github.com/login/device/code`,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`},body});if(!res.ok)throw Error(`GitHub device code failed: HTTP ${res.status}`);let json=parseJsonResponse(await res.json());if(!json.device_code||!json.user_code||!json.verification_uri)throw Error(`GitHub device code response missing fields`);return json}async function pollForAccessToken(params){let bodyBase=new URLSearchParams({client_id:CLIENT_ID,device_code:params.deviceCode,grant_type:`urn:ietf:params:oauth:grant-type:device_code`});for(;Date.now()<params.expiresAt;){let res=await fetch(`https://github.com/login/oauth/access_token`,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`},body:bodyBase});if(!res.ok)throw Error(`GitHub device token failed: HTTP ${res.status}`);let json=parseJsonResponse(await res.json());if(`access_token`in json&&typeof json.access_token==`string`)return json.access_token;let err=`error`in json?json.error:`unknown`;if(err===`authorization_pending`){await new Promise(r=>setTimeout(r,params.intervalMs));continue}if(err===`slow_down`){await new Promise(r=>setTimeout(r,params.intervalMs+2e3));continue}throw err===`expired_token`?Error(`GitHub device code expired; run login again`):err===`access_denied`?Error(`GitHub login cancelled`):Error(`GitHub device flow error: ${err}`)}throw Error(`GitHub device code expired; run login again`)}async function githubCopilotLoginCommand(opts,runtime){if(!process.stdin.isTTY)throw Error(`github-copilot login requires an interactive TTY.`);intro(stylePromptTitle(`GitHub Copilot login`));let profileId=opts.profileId?.trim()||`github-copilot:github`;(await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1})).profiles[profileId]&&!opts.yes&&note(`Auth profile already exists: ${profileId}\nRe-running will overwrite it.`,stylePromptTitle(`Existing credentials`));let spin=spinner();spin.start(`Requesting device code from GitHub...`);let device=await requestDeviceCode({scope:`read:user`});spin.stop(`Device code ready`),note([`Visit: ${device.verification_uri}`,`Code: ${device.user_code}`].join(`
2
2
  `),stylePromptTitle(`Authorize`));let expiresAt=Date.now()+device.expires_in*1e3,intervalMs=Math.max(1e3,device.interval*1e3),polling=spinner();polling.start(`Waiting for GitHub authorization...`);let accessToken=await pollForAccessToken({deviceCode:device.device_code,intervalMs,expiresAt});polling.stop(`GitHub access token acquired`),await upsertAuthProfile({profileId,credential:{type:`token`,provider:`github-copilot`,token:accessToken}}),await updateConfig(cfg=>applyAuthProfileConfig(cfg,{provider:`github-copilot`,profileId,mode:`token`})),logConfigUpdated(runtime),runtime.log(`Auth profile: ${profileId} (github-copilot/token)`),outro(`Done`)}const log=createSubsystemLogger(`plugins`);function resolvePluginProviders(params){return loadBuilderForceAgentsPlugins({config:params.config,workspaceDir:params.workspaceDir,logger:createPluginLoaderLogger(log)}).providers.map(entry=>entry.provider)}function isRemoteEnvironment(){return!!(process.env.SSH_CLIENT||process.env.SSH_TTY||process.env.SSH_CONNECTION||process.env.REMOTE_CONTAINERS||process.env.CODESPACES||process.platform===`linux`&&!process.env.DISPLAY&&!process.env.WAYLAND_DISPLAY&&!isWSLEnv())}const validateRequiredInput=value=>value.trim().length>0?void 0:`Required`;function createVpsAwareOAuthHandlers(params){let manualPromptMessage=params.manualPromptMessage??`Paste the redirect URL`,manualCodePromise;return{onAuth:async({url})=>{if(params.isRemote){params.spin.stop(`OAuth URL ready`),params.runtime.log(`\nOpen this URL in your LOCAL browser:\n\n${url}\n`),manualCodePromise=params.prompter.text({message:manualPromptMessage,validate:validateRequiredInput}).then(value=>String(value));return}params.spin.update(params.localBrowserMessage),await params.openUrl(url),params.runtime.log(`Open: ${url}`)},onPrompt:async prompt=>{if(manualCodePromise)return manualCodePromise;let code=await params.prompter.text({message:prompt.message,placeholder:prompt.placeholder,validate:validateRequiredInput});return String(code)}}}function resolveProviderMatch(providers,rawProvider){let raw=rawProvider?.trim();if(!raw)return null;let normalized=normalizeProviderId(raw);return providers.find(provider=>normalizeProviderId(provider.id)===normalized)??providers.find(provider=>provider.aliases?.some(alias=>normalizeProviderId(alias)===normalized)??!1)??null}function pickAuthMethod(provider,rawMethod){let raw=rawMethod?.trim();if(!raw)return null;let normalized=raw.toLowerCase();return provider.auth.find(method=>method.id.toLowerCase()===normalized)??provider.auth.find(method=>method.label.toLowerCase()===normalized)??null}function isPlainRecord(value){return!!(value&&typeof value==`object`&&!Array.isArray(value))}function mergeConfigPatch(base,patch){if(!isPlainRecord(base)||!isPlainRecord(patch))return patch;let next={...base};for(let[key,value]of Object.entries(patch)){let existing=next[key];isPlainRecord(existing)&&isPlainRecord(value)?next[key]=mergeConfigPatch(existing,value):next[key]=value}return next}function applyDefaultModel(cfg,model){let models={...cfg.agents?.defaults?.models};models[model]=models[model]??{};let existingModel=cfg.agents?.defaults?.model;return{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,models,model:{...existingModel&&typeof existingModel==`object`&&`fallbacks`in existingModel?{fallbacks:existingModel.fallbacks}:void 0,primary:model}}}}}export{createVpsAwareOAuthHandlers as a,githubCopilotLoginCommand as c,resolveProviderMatch as i,mergeConfigPatch as n,isRemoteEnvironment as o,pickAuthMethod as r,resolvePluginProviders as s,applyDefaultModel as t};
@@ -1,2 +1,2 @@
1
- import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{R as normalizeProviderId,b as ensureAuthProfileStore,v as upsertAuthProfile}from"./auth-profiles-C1VbcUOm.js";import{C as createPluginLoaderLogger,w as loadBuilderForceAgentsPlugins}from"./subagent-registry-CyGxu3kP.js";import{n as isWSLEnv}from"./wsl-BO1sLIB6.js";import{r as stylePromptTitle}from"./prompt-style-BMWmaqSC.js";import{f as updateConfig}from"./shared-xj-xaKFi.js";import{d as applyAuthProfileConfig}from"./auth-token-CoQ5ePPl.js";import{n as logConfigUpdated}from"./logging-ayt7F7vy.js";import{intro,note,outro,spinner}from"@clack/prompts";const CLIENT_ID=`Iv1.b507a08c87ecfe98`;function parseJsonResponse(value){if(!value||typeof value!=`object`)throw Error(`Unexpected response from GitHub`);return value}async function requestDeviceCode(params){let body=new URLSearchParams({client_id:CLIENT_ID,scope:params.scope}),res=await fetch(`https://github.com/login/device/code`,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`},body});if(!res.ok)throw Error(`GitHub device code failed: HTTP ${res.status}`);let json=parseJsonResponse(await res.json());if(!json.device_code||!json.user_code||!json.verification_uri)throw Error(`GitHub device code response missing fields`);return json}async function pollForAccessToken(params){let bodyBase=new URLSearchParams({client_id:CLIENT_ID,device_code:params.deviceCode,grant_type:`urn:ietf:params:oauth:grant-type:device_code`});for(;Date.now()<params.expiresAt;){let res=await fetch(`https://github.com/login/oauth/access_token`,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`},body:bodyBase});if(!res.ok)throw Error(`GitHub device token failed: HTTP ${res.status}`);let json=parseJsonResponse(await res.json());if(`access_token`in json&&typeof json.access_token==`string`)return json.access_token;let err=`error`in json?json.error:`unknown`;if(err===`authorization_pending`){await new Promise(r=>setTimeout(r,params.intervalMs));continue}if(err===`slow_down`){await new Promise(r=>setTimeout(r,params.intervalMs+2e3));continue}throw err===`expired_token`?Error(`GitHub device code expired; run login again`):err===`access_denied`?Error(`GitHub login cancelled`):Error(`GitHub device flow error: ${err}`)}throw Error(`GitHub device code expired; run login again`)}async function githubCopilotLoginCommand(opts,runtime){if(!process.stdin.isTTY)throw Error(`github-copilot login requires an interactive TTY.`);intro(stylePromptTitle(`GitHub Copilot login`));let profileId=opts.profileId?.trim()||`github-copilot:github`;(await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1})).profiles[profileId]&&!opts.yes&&note(`Auth profile already exists: ${profileId}\nRe-running will overwrite it.`,stylePromptTitle(`Existing credentials`));let spin=spinner();spin.start(`Requesting device code from GitHub...`);let device=await requestDeviceCode({scope:`read:user`});spin.stop(`Device code ready`),note([`Visit: ${device.verification_uri}`,`Code: ${device.user_code}`].join(`
1
+ import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{R as normalizeProviderId,b as ensureAuthProfileStore,v as upsertAuthProfile}from"./auth-profiles-pt7Tr4HA.js";import{C as createPluginLoaderLogger,w as loadBuilderForceAgentsPlugins}from"./subagent-registry-DDEN4oJi.js";import{n as isWSLEnv}from"./wsl-BO1sLIB6.js";import{r as stylePromptTitle}from"./prompt-style-BMWmaqSC.js";import{f as updateConfig}from"./shared-BBOiNdjf.js";import{d as applyAuthProfileConfig}from"./auth-token-BPHeoBAW.js";import{n as logConfigUpdated}from"./logging-ayt7F7vy.js";import{intro,note,outro,spinner}from"@clack/prompts";const CLIENT_ID=`Iv1.b507a08c87ecfe98`;function parseJsonResponse(value){if(!value||typeof value!=`object`)throw Error(`Unexpected response from GitHub`);return value}async function requestDeviceCode(params){let body=new URLSearchParams({client_id:CLIENT_ID,scope:params.scope}),res=await fetch(`https://github.com/login/device/code`,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`},body});if(!res.ok)throw Error(`GitHub device code failed: HTTP ${res.status}`);let json=parseJsonResponse(await res.json());if(!json.device_code||!json.user_code||!json.verification_uri)throw Error(`GitHub device code response missing fields`);return json}async function pollForAccessToken(params){let bodyBase=new URLSearchParams({client_id:CLIENT_ID,device_code:params.deviceCode,grant_type:`urn:ietf:params:oauth:grant-type:device_code`});for(;Date.now()<params.expiresAt;){let res=await fetch(`https://github.com/login/oauth/access_token`,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`},body:bodyBase});if(!res.ok)throw Error(`GitHub device token failed: HTTP ${res.status}`);let json=parseJsonResponse(await res.json());if(`access_token`in json&&typeof json.access_token==`string`)return json.access_token;let err=`error`in json?json.error:`unknown`;if(err===`authorization_pending`){await new Promise(r=>setTimeout(r,params.intervalMs));continue}if(err===`slow_down`){await new Promise(r=>setTimeout(r,params.intervalMs+2e3));continue}throw err===`expired_token`?Error(`GitHub device code expired; run login again`):err===`access_denied`?Error(`GitHub login cancelled`):Error(`GitHub device flow error: ${err}`)}throw Error(`GitHub device code expired; run login again`)}async function githubCopilotLoginCommand(opts,runtime){if(!process.stdin.isTTY)throw Error(`github-copilot login requires an interactive TTY.`);intro(stylePromptTitle(`GitHub Copilot login`));let profileId=opts.profileId?.trim()||`github-copilot:github`;(await ensureAuthProfileStore(void 0,{allowKeychainPrompt:!1})).profiles[profileId]&&!opts.yes&&note(`Auth profile already exists: ${profileId}\nRe-running will overwrite it.`,stylePromptTitle(`Existing credentials`));let spin=spinner();spin.start(`Requesting device code from GitHub...`);let device=await requestDeviceCode({scope:`read:user`});spin.stop(`Device code ready`),note([`Visit: ${device.verification_uri}`,`Code: ${device.user_code}`].join(`
2
2
  `),stylePromptTitle(`Authorize`));let expiresAt=Date.now()+device.expires_in*1e3,intervalMs=Math.max(1e3,device.interval*1e3),polling=spinner();polling.start(`Waiting for GitHub authorization...`);let accessToken=await pollForAccessToken({deviceCode:device.device_code,intervalMs,expiresAt});polling.stop(`GitHub access token acquired`),await upsertAuthProfile({profileId,credential:{type:`token`,provider:`github-copilot`,token:accessToken}}),await updateConfig(cfg=>applyAuthProfileConfig(cfg,{provider:`github-copilot`,profileId,mode:`token`})),logConfigUpdated(runtime),runtime.log(`Auth profile: ${profileId} (github-copilot/token)`),outro(`Done`)}const log=createSubsystemLogger(`plugins`);function resolvePluginProviders(params){return loadBuilderForceAgentsPlugins({config:params.config,workspaceDir:params.workspaceDir,logger:createPluginLoaderLogger(log)}).providers.map(entry=>entry.provider)}function isRemoteEnvironment(){return!!(process.env.SSH_CLIENT||process.env.SSH_TTY||process.env.SSH_CONNECTION||process.env.REMOTE_CONTAINERS||process.env.CODESPACES||process.platform===`linux`&&!process.env.DISPLAY&&!process.env.WAYLAND_DISPLAY&&!isWSLEnv())}const validateRequiredInput=value=>value.trim().length>0?void 0:`Required`;function createVpsAwareOAuthHandlers(params){let manualPromptMessage=params.manualPromptMessage??`Paste the redirect URL`,manualCodePromise;return{onAuth:async({url})=>{if(params.isRemote){params.spin.stop(`OAuth URL ready`),params.runtime.log(`\nOpen this URL in your LOCAL browser:\n\n${url}\n`),manualCodePromise=params.prompter.text({message:manualPromptMessage,validate:validateRequiredInput}).then(value=>String(value));return}params.spin.update(params.localBrowserMessage),await params.openUrl(url),params.runtime.log(`Open: ${url}`)},onPrompt:async prompt=>{if(manualCodePromise)return manualCodePromise;let code=await params.prompter.text({message:prompt.message,placeholder:prompt.placeholder,validate:validateRequiredInput});return String(code)}}}function resolveProviderMatch(providers,rawProvider){let raw=rawProvider?.trim();if(!raw)return null;let normalized=normalizeProviderId(raw);return providers.find(provider=>normalizeProviderId(provider.id)===normalized)??providers.find(provider=>provider.aliases?.some(alias=>normalizeProviderId(alias)===normalized)??!1)??null}function pickAuthMethod(provider,rawMethod){let raw=rawMethod?.trim();if(!raw)return null;let normalized=raw.toLowerCase();return provider.auth.find(method=>method.id.toLowerCase()===normalized)??provider.auth.find(method=>method.label.toLowerCase()===normalized)??null}function isPlainRecord(value){return!!(value&&typeof value==`object`&&!Array.isArray(value))}function mergeConfigPatch(base,patch){if(!isPlainRecord(base)||!isPlainRecord(patch))return patch;let next={...base};for(let[key,value]of Object.entries(patch)){let existing=next[key];isPlainRecord(existing)&&isPlainRecord(value)?next[key]=mergeConfigPatch(existing,value):next[key]=value}return next}function applyDefaultModel(cfg,model){let models={...cfg.agents?.defaults?.models};models[model]=models[model]??{};let existingModel=cfg.agents?.defaults?.model;return{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,models,model:{...existingModel&&typeof existingModel==`object`&&`fallbacks`in existingModel?{fallbacks:existingModel.fallbacks}:void 0,primary:model}}}}}export{createVpsAwareOAuthHandlers as a,githubCopilotLoginCommand as c,resolveProviderMatch as i,mergeConfigPatch as n,isRemoteEnvironment as o,pickAuthMethod as r,resolvePluginProviders as s,applyDefaultModel as t};
@@ -1 +1 @@
1
- import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-CEsr3aQ0.js";import{bn as dispatchReplyWithDispatcher,yn as dispatchReplyWithBufferedBlockDispatcher}from"./reply-Cd3vVnD7.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./runner-SxCr9kXD.js";import"./model-catalog-C6UrZ0uG.js";import"./sandbox-BZibn6PX.js";import"./chrome-a3X9_-nf.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DJZT7Upf.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-BzfLvF8W.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-CdanN_ZI.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-DerUBvXW.js";import"./send-DyF1Xy9K.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-CHBjUwUJ.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-wcq7lXuI.js";import"./with-timeout-Bwq-GyUQ.js";import"./deliver-BpLm3ktn.js";import"./send-CBBziNqM.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import"./memory-cli-DRz4wtHk.js";import"./manager-DwywI_5-.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-BbRf8gFM.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-DrFJ638L.js";import"./send-4d9NswaD.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-CbvMJhD3.js";import"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import"./resolve-route-D49haUnv.js";import"./replies-Bd2RPZwQ.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-6qh9acJy.js";import"./send-BJDzwYJN.js";import"./onboard-helpers-Cf5dNq7-.js";import"./prompt-style-BpVK43GK.js";import"./pairing-labels-BW5jQZlr.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-BdrU4cIE.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-CJj0Inz-.js";import"./control-service-BbsswoMy.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-CoGqoBTH.js";import"./transformers-stream-D7nRu4Qu.js";export{dispatchReplyWithBufferedBlockDispatcher,dispatchReplyWithDispatcher};
1
+ import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-C9jpiwlw.js";import{bn as dispatchReplyWithDispatcher,yn as dispatchReplyWithBufferedBlockDispatcher}from"./reply-GY1C8tcv.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./runner-eTTUbLAK.js";import"./model-catalog-DjNiebr7.js";import"./sandbox-C4AKi2EX.js";import"./chrome-DXt86tmV.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-CQ2v4BAx.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-DZntyPY6.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-BuZVmOWt.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-Aw8wK3vK.js";import"./send-ChGpVO3O.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-CyCi-UqR.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-wcq7lXuI.js";import"./with-timeout-GDLpcjW7.js";import"./deliver--6OBF3LL.js";import"./send-BxoVLIy1.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import"./memory-cli-CbkWGjRn.js";import"./manager-DSz61dXv.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-T8ciwMTA.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-F5JMAr3p.js";import"./send-BP5osGBo.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-ti3FEkmr.js";import"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import"./resolve-route-D49haUnv.js";import"./replies-DokbEfJD.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-ZhOdlcEI.js";import"./send-l3ge4wkC.js";import"./onboard-helpers-CiHzTaFX.js";import"./prompt-style-BpVK43GK.js";import"./pairing-labels-oA-nKTaW.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-B-wPVN_j.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-CJj0Inz-.js";import"./control-service-y3GYvIBg.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-CoGqoBTH.js";import"./transformers-stream-D7nRu4Qu.js";export{dispatchReplyWithBufferedBlockDispatcher,dispatchReplyWithDispatcher};
@@ -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"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-Du2LiaX6.js";import"./message-channel-z5YRpR2d.js";import{L as dispatchReplyWithBufferedBlockDispatcher,R as dispatchReplyWithDispatcher}from"./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";export{dispatchReplyWithBufferedBlockDispatcher,dispatchReplyWithDispatcher};
@@ -1 +1 @@
1
- import{f as isRecord}from"./utils-DbaBVFaK.js";import{t as logDebug}from"./logger-Bch0bx9c.js";import{$t as listProfilesForProvider,Gt as resolveApiKeyForProfile,Qt as dedupeProfileIds,_t as getCustomProviderApiKey,in as ensureAuthProfileStore,mn as normalizeSecretInput,u as normalizeProviderId,xt as resolveEnvApiKey,zt as resolveAuthProfileOrder}from"./model-selection-9bRFKBI_.js";import{r as loadConfig}from"./io-3R_ZyUxB.js";import{t as resolveFetch}from"./fetch-DnVtDecb.js";import fs from"node:fs";import os from"node:os";import path from"node:path";const PROVIDER_LABELS={anthropic:`Claude`,"github-copilot":`Copilot`,"google-gemini-cli":`Gemini`,"google-antigravity":`Antigravity`,minimax:`MiniMax`,"openai-codex":`Codex`,xiaomi:`Xiaomi`,zai:`z.ai`},usageProviders=[`anthropic`,`github-copilot`,`google-gemini-cli`,`google-antigravity`,`minimax`,`openai-codex`,`xiaomi`,`zai`];function resolveUsageProviderId(provider){if(!provider)return;let normalized=normalizeProviderId(provider);return usageProviders.includes(normalized)?normalized:void 0}const ignoredErrors=new Set([`No credentials`,`No token`,`No API key`,`Not logged in`,`No auth`]),clampPercent=value=>Math.max(0,Math.min(100,Number.isFinite(value)?value:0)),withTimeout=async(work,ms,fallback)=>{let timeout;try{return await Promise.race([work,new Promise(resolve=>{timeout=setTimeout(()=>resolve(fallback),ms)})])}finally{timeout&&clearTimeout(timeout)}};function formatResetRemaining(targetMs,now){if(!targetMs)return null;let diffMs=targetMs-(now??Date.now());if(diffMs<=0)return`now`;let diffMins=Math.floor(diffMs/6e4);if(diffMins<60)return`${diffMins}m`;let hours=Math.floor(diffMins/60),mins=diffMins%60;if(hours<24)return mins>0?`${hours}h ${mins}m`:`${hours}h`;let days=Math.floor(hours/24);return days<7?`${days}d ${hours%24}h`:new Intl.DateTimeFormat(`en-US`,{month:`short`,day:`numeric`}).format(new Date(targetMs))}function formatUsageWindowSummary(snapshot,opts){if(snapshot.error||snapshot.windows.length===0)return null;let now=opts?.now??Date.now(),maxWindows=typeof opts?.maxWindows==`number`&&opts.maxWindows>0?Math.min(opts.maxWindows,snapshot.windows.length):snapshot.windows.length,includeResets=opts?.includeResets??!1;return snapshot.windows.slice(0,maxWindows).map(window=>{let remaining=clampPercent(100-window.usedPercent),reset=includeResets?formatResetRemaining(window.resetAt,now):null,resetSuffix=reset?` ⏱${reset}`:``;return`${window.label} ${remaining.toFixed(0)}% left${resetSuffix}`}).join(` · `)}function formatUsageReportLines(summary,opts){if(summary.providers.length===0)return[`Usage: no provider usage available.`];let lines=[`Usage:`];for(let entry of summary.providers){let planSuffix=entry.plan?` (${entry.plan})`:``;if(entry.error){lines.push(` ${entry.displayName}${planSuffix}: ${entry.error}`);continue}if(entry.windows.length===0){lines.push(` ${entry.displayName}${planSuffix}: no data`);continue}lines.push(` ${entry.displayName}${planSuffix}`);for(let window of entry.windows){let remaining=clampPercent(100-window.usedPercent),reset=formatResetRemaining(window.resetAt,opts?.now),resetSuffix=reset?` · resets ${reset}`:``;lines.push(` ${window.label}: ${remaining.toFixed(0)}% left${resetSuffix}`)}}return lines}function parseGoogleToken(apiKey){if(!apiKey)return null;try{let parsed=JSON.parse(apiKey);if(parsed&&typeof parsed.token==`string`)return{token:parsed.token}}catch{}return null}async function resolveZaiApiKey(){let envDirect=normalizeSecretInput(process.env.ZAI_API_KEY)||normalizeSecretInput(process.env.Z_AI_API_KEY);if(envDirect)return envDirect;let envResolved=resolveEnvApiKey(`zai`);if(envResolved?.apiKey)return envResolved.apiKey;let cfg=loadConfig(),key=getCustomProviderApiKey(cfg,`zai`)||getCustomProviderApiKey(cfg,`z-ai`);if(key)return key;let store=await ensureAuthProfileStore(),apiProfile=[...listProfilesForProvider(store,`zai`),...listProfilesForProvider(store,`z-ai`)].find(id=>store.profiles[id]?.type===`api_key`);if(apiProfile){let cred=store.profiles[apiProfile];if(cred?.type===`api_key`&&normalizeSecretInput(cred.key))return normalizeSecretInput(cred.key)}try{let authPath=path.join(os.homedir(),`.pi`,`agent`,`auth.json`);if(!fs.existsSync(authPath))return;let data=JSON.parse(fs.readFileSync(authPath,`utf-8`));return data[`z-ai`]?.access||data.zai?.access}catch{return}}async function resolveMinimaxApiKey(){return resolveProviderApiKeyFromConfigAndStore({providerId:`minimax`,envDirect:[process.env.MINIMAX_CODE_PLAN_KEY,process.env.MINIMAX_API_KEY]})}async function resolveXiaomiApiKey(){return resolveProviderApiKeyFromConfigAndStore({providerId:`xiaomi`,envDirect:[process.env.XIAOMI_API_KEY]})}async function resolveProviderApiKeyFromConfigAndStore(params){let envDirect=params.envDirect.map(normalizeSecretInput).find(Boolean);if(envDirect)return envDirect;let envResolved=resolveEnvApiKey(params.providerId);if(envResolved?.apiKey)return envResolved.apiKey;let key=getCustomProviderApiKey(loadConfig(),params.providerId);if(key)return key;let store=await ensureAuthProfileStore(),apiProfile=listProfilesForProvider(store,params.providerId).find(id=>{let cred=store.profiles[id];return cred?.type===`api_key`||cred?.type===`token`});if(!apiProfile)return;let cred=store.profiles[apiProfile];if(cred?.type===`api_key`)return normalizeSecretInput(cred.key);if(cred?.type===`token`)return normalizeSecretInput(cred.token)}async function resolveOAuthToken(params){let cfg=loadConfig(),store=await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),deduped=dedupeProfileIds(resolveAuthProfileOrder({cfg,store,provider:params.provider}));for(let profileId of deduped){let cred=store.profiles[profileId];if(!(!cred||cred.type!==`oauth`&&cred.type!==`token`))try{let resolved=await resolveApiKeyForProfile({cfg:void 0,store,profileId,agentDir:params.agentDir});if(!resolved?.apiKey)continue;let token=resolved.apiKey;return(params.provider===`google-gemini-cli`||params.provider===`google-antigravity`)&&(token=parseGoogleToken(resolved.apiKey)?.token??resolved.apiKey),{provider:params.provider,token,accountId:cred.type===`oauth`&&`accountId`in cred?cred.accountId:void 0}}catch{}}return null}async function resolveOAuthProviders(agentDir){let store=await ensureAuthProfileStore(agentDir,{allowKeychainPrompt:!1}),cfg=loadConfig(),providers=[`anthropic`,`github-copilot`,`google-gemini-cli`,`google-antigravity`,`openai-codex`],isOAuthLikeCredential=id=>{let cred=store.profiles[id];return cred?.type===`oauth`||cred?.type===`token`};return providers.filter(provider=>{if(listProfilesForProvider(store,provider).filter(isOAuthLikeCredential).length>0)return!0;let normalized=normalizeProviderId(provider);return Object.entries(cfg.auth?.profiles??{}).filter(([,profile])=>normalizeProviderId(profile.provider)===normalized).map(([id])=>id).filter(isOAuthLikeCredential).length>0})}async function resolveProviderAuths(params){if(params.auth)return params.auth;let oauthProviders=await resolveOAuthProviders(params.agentDir),auths=[];for(let provider of params.providers){if(provider===`zai`){let apiKey=await resolveZaiApiKey();apiKey&&auths.push({provider,token:apiKey});continue}if(provider===`minimax`){let apiKey=await resolveMinimaxApiKey();apiKey&&auths.push({provider,token:apiKey});continue}if(provider===`xiaomi`){let apiKey=await resolveXiaomiApiKey();apiKey&&auths.push({provider,token:apiKey});continue}if(!oauthProviders.includes(provider))continue;let auth=await resolveOAuthToken({provider,agentDir:params.agentDir});auth&&auths.push(auth)}return auths}async function fetchJson(url,init,timeoutMs,fetchFn){let controller=new AbortController,timer=setTimeout(controller.abort.bind(controller),timeoutMs);try{return await fetchFn(url,{...init,signal:controller.signal})}finally{clearTimeout(timer)}}const BASE_URL=`https://cloudcode-pa.googleapis.com`,METADATA={ideType:`ANTIGRAVITY`,platform:`PLATFORM_UNSPECIFIED`,pluginType:`GEMINI`};function parseNumber(value){if(typeof value==`number`&&Number.isFinite(value))return value;if(typeof value==`string`){let parsed=Number.parseFloat(value);if(Number.isFinite(parsed))return parsed}}function parseEpochMs(isoString){if(isoString?.trim())try{let ms=Date.parse(isoString);if(Number.isFinite(ms))return ms}catch{}}async function parseErrorMessage(res){try{let message=(await res.json())?.error?.message?.trim();if(message)return message}catch{}return`HTTP ${res.status}`}function extractCredits(data){let available=parseNumber(data.availablePromptCredits),monthly=parseNumber(data.planInfo?.monthlyPromptCredits);if(!(available===void 0||monthly===void 0||monthly<=0))return{available,monthly}}function extractPlanInfo(data){let tierName=data.currentTier?.name?.trim();if(tierName)return tierName;let planType=data.planType?.trim();if(planType)return planType}function extractProjectId(data){let project=data.cloudaicompanionProject;if(project)return typeof project==`string`?project.trim()?project:void 0:(typeof project.id==`string`?project.id.trim():void 0)||void 0}function extractModelQuotas(data){let result=new Map;if(!data.models||typeof data.models!=`object`)return result;for(let[modelId,modelInfo]of Object.entries(data.models)){let quotaInfo=modelInfo.quotaInfo;if(!quotaInfo)continue;let remainingFraction=parseNumber(quotaInfo.remainingFraction);if(remainingFraction===void 0)continue;let resetTime=parseEpochMs(quotaInfo.resetTime);result.set(modelId,{remainingFraction,resetTime})}return result}function buildUsageWindows(opts){let windows=[];if(opts.credits){let{available,monthly}=opts.credits,usedPercent=clampPercent((monthly-available)/monthly*100);windows.push({label:`Credits`,usedPercent})}if(opts.modelQuotas&&opts.modelQuotas.size>0){let modelWindows=[];for(let[modelId,quota]of opts.modelQuotas){let lowerModelId=modelId.toLowerCase();if(lowerModelId.includes(`chat_`)||lowerModelId.includes(`tab_`))continue;let window={label:modelId,usedPercent:clampPercent((1-quota.remainingFraction)*100)};quota.resetTime&&(window.resetAt=quota.resetTime),modelWindows.push(window)}modelWindows.sort((a,b)=>b.usedPercent-a.usedPercent);let topModels=modelWindows.slice(0,10);logDebug(`[antigravity] Built ${topModels.length} model windows from ${opts.modelQuotas.size} total models`);for(let w of topModels)logDebug(`[antigravity] ${w.label}: ${w.usedPercent.toFixed(1)}% used${w.resetAt?` (resets at ${new Date(w.resetAt).toISOString()})`:``}`);windows.push(...topModels)}return windows}async function fetchAntigravityUsage(token,timeoutMs,fetchFn){let headers={Authorization:`Bearer ${token}`,"Content-Type":`application/json`,"User-Agent":`antigravity`,"X-Goog-Api-Client":`google-cloud-sdk vscode_cloudshelleditor/0.1`},credits,modelQuotas,planInfo,lastError,projectId;try{let res=await fetchJson(`${BASE_URL}/v1internal:loadCodeAssist`,{method:`POST`,headers,body:JSON.stringify({metadata:METADATA})},timeoutMs,fetchFn);if(res.ok){let data=await res.json();projectId=extractProjectId(data),credits=extractCredits(data),planInfo=extractPlanInfo(data),logDebug(`[antigravity] Credits: ${credits?`${credits.available}/${credits.monthly}`:`none`}${planInfo?` (plan: ${planInfo})`:``}`)}else if(lastError=await parseErrorMessage(res),res.status===401)return{provider:`google-antigravity`,displayName:PROVIDER_LABELS[`google-antigravity`],windows:[],error:`Token expired`}}catch{lastError=`Network error`}projectId||logDebug(`[antigravity] Missing project id; requesting available models without project`);try{let body=JSON.stringify(projectId?{project:projectId}:{}),res=await fetchJson(`${BASE_URL}/v1internal:fetchAvailableModels`,{method:`POST`,headers,body},timeoutMs,fetchFn);if(res.ok){modelQuotas=extractModelQuotas(await res.json()),logDebug(`[antigravity] Extracted ${modelQuotas.size} model quotas from API`);for(let[modelId,quota]of modelQuotas)logDebug(`[antigravity] ${modelId}: ${(quota.remainingFraction*100).toFixed(1)}% remaining${quota.resetTime?` (resets ${new Date(quota.resetTime).toISOString()})`:``}`)}else{let err=await parseErrorMessage(res);res.status===401?lastError=`Token expired`:lastError||=err}}catch{lastError||=`Network error`}let windows=buildUsageWindows({credits,modelQuotas});if(windows.length===0&&lastError)return logDebug(`[antigravity] Returning error snapshot: ${lastError}`),{provider:`google-antigravity`,displayName:PROVIDER_LABELS[`google-antigravity`],windows:[],error:lastError};let snapshot={provider:`google-antigravity`,displayName:PROVIDER_LABELS[`google-antigravity`],windows,plan:planInfo};return logDebug(`[antigravity] Returning snapshot with ${windows.length} windows${planInfo?` (plan: ${planInfo})`:``}`),logDebug(`[antigravity] Snapshot: ${JSON.stringify(snapshot,null,2)}`),snapshot}function buildClaudeUsageWindows(data){let windows=[];data.five_hour?.utilization!==void 0&&windows.push({label:`5h`,usedPercent:clampPercent(data.five_hour.utilization),resetAt:data.five_hour.resets_at?new Date(data.five_hour.resets_at).getTime():void 0}),data.seven_day?.utilization!==void 0&&windows.push({label:`Week`,usedPercent:clampPercent(data.seven_day.utilization),resetAt:data.seven_day.resets_at?new Date(data.seven_day.resets_at).getTime():void 0});let modelWindow=data.seven_day_sonnet||data.seven_day_opus;return modelWindow?.utilization!==void 0&&windows.push({label:data.seven_day_sonnet?`Sonnet`:`Opus`,usedPercent:clampPercent(modelWindow.utilization)}),windows}function resolveClaudeWebSessionKey(){let direct=process.env.CLAUDE_AI_SESSION_KEY?.trim()??process.env.CLAUDE_WEB_SESSION_KEY?.trim();if(direct?.startsWith(`sk-ant-`))return direct;let cookieHeader=process.env.CLAUDE_WEB_COOKIE?.trim();if(!cookieHeader)return;let value=cookieHeader.replace(/^cookie:\\s*/i,``).match(/(?:^|;\\s*)sessionKey=([^;\\s]+)/i)?.[1]?.trim();return value?.startsWith(`sk-ant-`)?value:void 0}async function fetchClaudeWebUsage(sessionKey,timeoutMs,fetchFn){let headers={Cookie:`sessionKey=${sessionKey}`,Accept:`application/json`},orgRes=await fetchJson(`https://claude.ai/api/organizations`,{headers},timeoutMs,fetchFn);if(!orgRes.ok)return null;let orgId=(await orgRes.json())?.[0]?.uuid?.trim();if(!orgId)return null;let usageRes=await fetchJson(`https://claude.ai/api/organizations/${orgId}/usage`,{headers},timeoutMs,fetchFn);if(!usageRes.ok)return null;let windows=buildClaudeUsageWindows(await usageRes.json());return windows.length===0?null:{provider:`anthropic`,displayName:PROVIDER_LABELS.anthropic,windows}}async function fetchClaudeUsage(token,timeoutMs,fetchFn){let res=await fetchJson(`https://api.anthropic.com/api/oauth/usage`,{headers:{Authorization:`Bearer ${token}`,"User-Agent":`builderforce`,Accept:`application/json`,"anthropic-version":`2023-06-01`,"anthropic-beta":`oauth-2025-04-20`}},timeoutMs,fetchFn);if(!res.ok){let message;try{let raw=(await res.json())?.error?.message;typeof raw==`string`&&raw.trim()&&(message=raw.trim())}catch{}if(res.status===403&&message?.includes(`scope requirement user:profile`)){let sessionKey=resolveClaudeWebSessionKey();if(sessionKey){let web=await fetchClaudeWebUsage(sessionKey,timeoutMs,fetchFn);if(web)return web}}let suffix=message?`: ${message}`:``;return{provider:`anthropic`,displayName:PROVIDER_LABELS.anthropic,windows:[],error:`HTTP ${res.status}${suffix}`}}let windows=buildClaudeUsageWindows(await res.json());return{provider:`anthropic`,displayName:PROVIDER_LABELS.anthropic,windows}}async function fetchCodexUsage(token,accountId,timeoutMs,fetchFn){let headers={Authorization:`Bearer ${token}`,"User-Agent":`CodexBar`,Accept:`application/json`};accountId&&(headers[`ChatGPT-Account-Id`]=accountId);let res=await fetchJson(`https://chatgpt.com/backend-api/wham/usage`,{method:`GET`,headers},timeoutMs,fetchFn);if(res.status===401||res.status===403)return{provider:`openai-codex`,displayName:PROVIDER_LABELS[`openai-codex`],windows:[],error:`Token expired`};if(!res.ok)return{provider:`openai-codex`,displayName:PROVIDER_LABELS[`openai-codex`],windows:[],error:`HTTP ${res.status}`};let data=await res.json(),windows=[];if(data.rate_limit?.primary_window){let pw=data.rate_limit.primary_window,windowHours=Math.round((pw.limit_window_seconds||10800)/3600);windows.push({label:`${windowHours}h`,usedPercent:clampPercent(pw.used_percent||0),resetAt:pw.reset_at?pw.reset_at*1e3:void 0})}if(data.rate_limit?.secondary_window){let sw=data.rate_limit.secondary_window,windowHours=Math.round((sw.limit_window_seconds||86400)/3600),label=windowHours>=24?`Day`:`${windowHours}h`;windows.push({label,usedPercent:clampPercent(sw.used_percent||0),resetAt:sw.reset_at?sw.reset_at*1e3:void 0})}let plan=data.plan_type;if(data.credits?.balance!==void 0&&data.credits.balance!==null){let balance=typeof data.credits.balance==`number`?data.credits.balance:parseFloat(data.credits.balance)||0;plan=plan?`${plan} ($${balance.toFixed(2)})`:`$${balance.toFixed(2)}`}return{provider:`openai-codex`,displayName:PROVIDER_LABELS[`openai-codex`],windows,plan}}async function fetchCopilotUsage(token,timeoutMs,fetchFn){let res=await fetchJson(`https://api.github.com/copilot_internal/user`,{headers:{Authorization:`token ${token}`,"Editor-Version":`vscode/1.96.2`,"User-Agent":`GitHubCopilotChat/0.26.7`,"X-Github-Api-Version":`2025-04-01`}},timeoutMs,fetchFn);if(!res.ok)return{provider:`github-copilot`,displayName:PROVIDER_LABELS[`github-copilot`],windows:[],error:`HTTP ${res.status}`};let data=await res.json(),windows=[];if(data.quota_snapshots?.premium_interactions){let remaining=data.quota_snapshots.premium_interactions.percent_remaining;windows.push({label:`Premium`,usedPercent:clampPercent(100-(remaining??0))})}if(data.quota_snapshots?.chat){let remaining=data.quota_snapshots.chat.percent_remaining;windows.push({label:`Chat`,usedPercent:clampPercent(100-(remaining??0))})}return{provider:`github-copilot`,displayName:PROVIDER_LABELS[`github-copilot`],windows,plan:data.copilot_plan}}async function fetchGeminiUsage(token,timeoutMs,fetchFn,provider){let res=await fetchJson(`https://cloudcode-pa.googleapis.com/v1internal:retrieveUserQuota`,{method:`POST`,headers:{Authorization:`Bearer ${token}`,"Content-Type":`application/json`},body:`{}`},timeoutMs,fetchFn);if(!res.ok)return{provider,displayName:PROVIDER_LABELS[provider],windows:[],error:`HTTP ${res.status}`};let data=await res.json(),quotas={};for(let bucket of data.buckets||[]){let model=bucket.modelId||`unknown`,frac=bucket.remainingFraction??1;(!quotas[model]||frac<quotas[model])&&(quotas[model]=frac)}let windows=[],proMin=1,flashMin=1,hasPro=!1,hasFlash=!1;for(let[model,frac]of Object.entries(quotas)){let lower=model.toLowerCase();lower.includes(`pro`)&&(hasPro=!0,frac<proMin&&(proMin=frac)),lower.includes(`flash`)&&(hasFlash=!0,frac<flashMin&&(flashMin=frac))}return hasPro&&windows.push({label:`Pro`,usedPercent:clampPercent((1-proMin)*100)}),hasFlash&&windows.push({label:`Flash`,usedPercent:clampPercent((1-flashMin)*100)}),{provider,displayName:PROVIDER_LABELS[provider],windows}}const RESET_KEYS=[`reset_at`,`resetAt`,`reset_time`,`resetTime`,`next_reset_at`,`nextResetAt`,`next_reset_time`,`nextResetTime`,`expires_at`,`expiresAt`,`expire_at`,`expireAt`,`end_time`,`endTime`,`window_end`,`windowEnd`],PERCENT_KEYS=[`used_percent`,`usedPercent`,`usage_percent`,`usagePercent`,`used_rate`,`usage_rate`,`used_ratio`,`usage_ratio`,`usedRatio`,`usageRatio`],USED_KEYS=[`used`,`usage`,`used_amount`,`usedAmount`,`used_tokens`,`usedTokens`,`used_quota`,`usedQuota`,`used_times`,`usedTimes`,`prompt_used`,`promptUsed`,`used_prompt`,`usedPrompt`,`prompts_used`,`promptsUsed`,`current_interval_usage_count`,`currentIntervalUsageCount`,`consumed`],TOTAL_KEYS=`total.total_amount.totalAmount.total_tokens.totalTokens.total_quota.totalQuota.total_times.totalTimes.prompt_total.promptTotal.total_prompt.totalPrompt.prompt_limit.promptLimit.limit_prompt.limitPrompt.prompts_total.promptsTotal.total_prompts.totalPrompts.current_interval_total_count.currentIntervalTotalCount.limit.quota.quota_limit.quotaLimit.max`.split(`.`),REMAINING_KEYS=`remain.remaining.remain_amount.remainingAmount.remaining_amount.remain_tokens.remainingTokens.remaining_tokens.remain_quota.remainingQuota.remaining_quota.remain_times.remainingTimes.remaining_times.prompt_remain.promptRemain.remain_prompt.remainPrompt.prompt_remaining.promptRemaining.remaining_prompt.remainingPrompt.prompts_remaining.promptsRemaining.prompt_left.promptLeft.prompts_left.promptsLeft.left`.split(`.`),PLAN_KEYS=[`plan`,`plan_name`,`planName`,`product`,`tier`],WINDOW_HOUR_KEYS=[`window_hours`,`windowHours`,`duration_hours`,`durationHours`,`hours`],WINDOW_MINUTE_KEYS=[`window_minutes`,`windowMinutes`,`duration_minutes`,`durationMinutes`,`minutes`];function pickNumber(record,keys){for(let key of keys){let value=record[key];if(typeof value==`number`&&Number.isFinite(value))return value;if(typeof value==`string`){let parsed=Number.parseFloat(value);if(Number.isFinite(parsed))return parsed}}}function pickString(record,keys){for(let key of keys){let value=record[key];if(typeof value==`string`&&value.trim())return value.trim()}}function parseEpoch(value){if(typeof value==`number`&&Number.isFinite(value))return value<0xe8d4a51000?Math.floor(value*1e3):Math.floor(value);if(typeof value==`string`&&value.trim()){let parsed=Date.parse(value);if(Number.isFinite(parsed))return parsed}}function hasAny(record,keys){return keys.some(key=>key in record)}function scoreUsageRecord(record){let score=0;return hasAny(record,PERCENT_KEYS)&&(score+=4),hasAny(record,TOTAL_KEYS)&&(score+=3),(hasAny(record,USED_KEYS)||hasAny(record,REMAINING_KEYS))&&(score+=2),hasAny(record,RESET_KEYS)&&(score+=1),hasAny(record,PLAN_KEYS)&&(score+=1),score}function collectUsageCandidates(root){let queue=[{value:root,depth:0}],seen=new Set,candidates=[],scanned=0;for(;queue.length&&scanned<60;){let next=queue.shift();if(!next)break;scanned+=1;let{value,depth}=next;if(isRecord(value)){if(seen.has(value))continue;seen.add(value);let score=scoreUsageRecord(value);if(score>0&&candidates.push({record:value,score,depth}),depth<4)for(let nested of Object.values(value))(isRecord(nested)||Array.isArray(nested))&&queue.push({value:nested,depth:depth+1});continue}if(Array.isArray(value)&&depth<4)for(let nested of value)(isRecord(nested)||Array.isArray(nested))&&queue.push({value:nested,depth:depth+1})}return candidates.sort((a,b)=>b.score-a.score||a.depth-b.depth),candidates.map(candidate=>candidate.record)}function deriveWindowLabel(payload){let hours=pickNumber(payload,WINDOW_HOUR_KEYS);if(hours&&Number.isFinite(hours))return`${hours}h`;let minutes=pickNumber(payload,WINDOW_MINUTE_KEYS);return minutes&&Number.isFinite(minutes)?`${minutes}m`:`5h`}function deriveUsedPercent(payload){let total=pickNumber(payload,TOTAL_KEYS),used=pickNumber(payload,USED_KEYS),remaining=pickNumber(payload,REMAINING_KEYS);used===void 0&&remaining!==void 0&&total!==void 0&&(used=total-remaining);let fromCounts=total&&total>0&&used!==void 0&&Number.isFinite(used)?clampPercent(used/total*100):null,percentRaw=pickNumber(payload,PERCENT_KEYS);if(percentRaw!==void 0){let normalized=clampPercent(percentRaw<=1?percentRaw*100:percentRaw);if(fromCounts!==null){let inverted=clampPercent(100-normalized);return Math.abs(normalized-fromCounts)<=1||Math.abs(inverted-fromCounts),fromCounts}return normalized}return fromCounts}async function fetchMinimaxUsage(apiKey,timeoutMs,fetchFn){let res=await fetchJson(`https://api.minimaxi.com/v1/api/openplatform/coding_plan/remains`,{method:`GET`,headers:{Authorization:`Bearer ${apiKey}`,"Content-Type":`application/json`,"MM-API-Source":`BuilderForceAgents`}},timeoutMs,fetchFn);if(!res.ok)return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows:[],error:`HTTP ${res.status}`};let data=await res.json().catch(()=>null);if(!isRecord(data))return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows:[],error:`Invalid JSON`};let baseResp=isRecord(data.base_resp)?data.base_resp:void 0;if(baseResp&&typeof baseResp.status_code==`number`&&baseResp.status_code!==0)return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows:[],error:baseResp.status_msg?.trim()||`API error`};let payload=isRecord(data.data)?data.data:data,candidates=collectUsageCandidates(payload),usageRecord=payload,usedPercent=null;for(let candidate of candidates){let candidatePercent=deriveUsedPercent(candidate);if(candidatePercent!==null){usageRecord=candidate,usedPercent=candidatePercent;break}}if(usedPercent===null&&(usedPercent=deriveUsedPercent(payload)),usedPercent===null)return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows:[],error:`Unsupported response shape`};let resetAt=parseEpoch(pickString(usageRecord,RESET_KEYS))??parseEpoch(pickNumber(usageRecord,RESET_KEYS))??parseEpoch(pickString(payload,RESET_KEYS))??parseEpoch(pickNumber(payload,RESET_KEYS)),windows=[{label:deriveWindowLabel(usageRecord),usedPercent,resetAt}];return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows,plan:pickString(usageRecord,PLAN_KEYS)??pickString(payload,PLAN_KEYS)}}async function fetchZaiUsage(apiKey,timeoutMs,fetchFn){let res=await fetchJson(`https://api.z.ai/api/monitor/usage/quota/limit`,{method:`GET`,headers:{Authorization:`Bearer ${apiKey}`,Accept:`application/json`}},timeoutMs,fetchFn);if(!res.ok)return{provider:`zai`,displayName:PROVIDER_LABELS.zai,windows:[],error:`HTTP ${res.status}`};let data=await res.json();if(!data.success||data.code!==200)return{provider:`zai`,displayName:PROVIDER_LABELS.zai,windows:[],error:data.msg||`API error`};let windows=[],limits=data.data?.limits||[];for(let limit of limits){let percent=clampPercent(limit.percentage||0),nextReset=limit.nextResetTime?new Date(limit.nextResetTime).getTime():void 0,windowLabel=`Limit`;limit.unit===1?windowLabel=`${limit.number}d`:limit.unit===3?windowLabel=`${limit.number}h`:limit.unit===5&&(windowLabel=`${limit.number}m`),limit.type===`TOKENS_LIMIT`?windows.push({label:`Tokens (${windowLabel})`,usedPercent:percent,resetAt:nextReset}):limit.type===`TIME_LIMIT`&&windows.push({label:`Monthly`,usedPercent:percent,resetAt:nextReset})}let planName=data.data?.planName||data.data?.plan||void 0;return{provider:`zai`,displayName:PROVIDER_LABELS.zai,windows,plan:planName}}async function loadProviderUsageSummary(opts={}){let now=opts.now??Date.now(),timeoutMs=opts.timeoutMs??5e3,fetchFn=resolveFetch(opts.fetch);if(!fetchFn)throw Error(`fetch is not available`);let auths=await resolveProviderAuths({providers:opts.providers??usageProviders,auth:opts.auth,agentDir:opts.agentDir});if(auths.length===0)return{updatedAt:now,providers:[]};let tasks=auths.map(auth=>withTimeout((async()=>{switch(auth.provider){case`anthropic`:return await fetchClaudeUsage(auth.token,timeoutMs,fetchFn);case`github-copilot`:return await fetchCopilotUsage(auth.token,timeoutMs,fetchFn);case`google-antigravity`:return await fetchAntigravityUsage(auth.token,timeoutMs,fetchFn);case`google-gemini-cli`:return await fetchGeminiUsage(auth.token,timeoutMs,fetchFn,auth.provider);case`openai-codex`:return await fetchCodexUsage(auth.token,auth.accountId,timeoutMs,fetchFn);case`minimax`:return await fetchMinimaxUsage(auth.token,timeoutMs,fetchFn);case`xiaomi`:return{provider:`xiaomi`,displayName:PROVIDER_LABELS.xiaomi,windows:[]};case`zai`:return await fetchZaiUsage(auth.token,timeoutMs,fetchFn);default:return{provider:auth.provider,displayName:PROVIDER_LABELS[auth.provider],windows:[],error:`Unsupported provider`}}})(),timeoutMs+1e3,{provider:auth.provider,displayName:PROVIDER_LABELS[auth.provider],windows:[],error:`Timeout`}));return{updatedAt:now,providers:(await Promise.all(tasks)).filter(entry=>entry.windows.length>0||!entry.error?!0:!ignoredErrors.has(entry.error))}}export{resolveUsageProviderId as i,formatUsageReportLines as n,formatUsageWindowSummary as r,loadProviderUsageSummary as t};
1
+ import{f as isRecord}from"./utils-DbaBVFaK.js";import{t as logDebug}from"./logger-Bch0bx9c.js";import{$t as listProfilesForProvider,Gt as resolveApiKeyForProfile,Qt as dedupeProfileIds,_t as getCustomProviderApiKey,in as ensureAuthProfileStore,mn as normalizeSecretInput,u as normalizeProviderId,xt as resolveEnvApiKey,zt as resolveAuthProfileOrder}from"./model-selection-DG9J_VTz.js";import{r as loadConfig}from"./io-BLBq4T2o.js";import{t as resolveFetch}from"./fetch-DnVtDecb.js";import fs from"node:fs";import os from"node:os";import path from"node:path";const PROVIDER_LABELS={anthropic:`Claude`,"github-copilot":`Copilot`,"google-gemini-cli":`Gemini`,"google-antigravity":`Antigravity`,minimax:`MiniMax`,"openai-codex":`Codex`,xiaomi:`Xiaomi`,zai:`z.ai`},usageProviders=[`anthropic`,`github-copilot`,`google-gemini-cli`,`google-antigravity`,`minimax`,`openai-codex`,`xiaomi`,`zai`];function resolveUsageProviderId(provider){if(!provider)return;let normalized=normalizeProviderId(provider);return usageProviders.includes(normalized)?normalized:void 0}const ignoredErrors=new Set([`No credentials`,`No token`,`No API key`,`Not logged in`,`No auth`]),clampPercent=value=>Math.max(0,Math.min(100,Number.isFinite(value)?value:0)),withTimeout=async(work,ms,fallback)=>{let timeout;try{return await Promise.race([work,new Promise(resolve=>{timeout=setTimeout(()=>resolve(fallback),ms)})])}finally{timeout&&clearTimeout(timeout)}};function formatResetRemaining(targetMs,now){if(!targetMs)return null;let diffMs=targetMs-(now??Date.now());if(diffMs<=0)return`now`;let diffMins=Math.floor(diffMs/6e4);if(diffMins<60)return`${diffMins}m`;let hours=Math.floor(diffMins/60),mins=diffMins%60;if(hours<24)return mins>0?`${hours}h ${mins}m`:`${hours}h`;let days=Math.floor(hours/24);return days<7?`${days}d ${hours%24}h`:new Intl.DateTimeFormat(`en-US`,{month:`short`,day:`numeric`}).format(new Date(targetMs))}function formatUsageWindowSummary(snapshot,opts){if(snapshot.error||snapshot.windows.length===0)return null;let now=opts?.now??Date.now(),maxWindows=typeof opts?.maxWindows==`number`&&opts.maxWindows>0?Math.min(opts.maxWindows,snapshot.windows.length):snapshot.windows.length,includeResets=opts?.includeResets??!1;return snapshot.windows.slice(0,maxWindows).map(window=>{let remaining=clampPercent(100-window.usedPercent),reset=includeResets?formatResetRemaining(window.resetAt,now):null,resetSuffix=reset?` ⏱${reset}`:``;return`${window.label} ${remaining.toFixed(0)}% left${resetSuffix}`}).join(` · `)}function formatUsageReportLines(summary,opts){if(summary.providers.length===0)return[`Usage: no provider usage available.`];let lines=[`Usage:`];for(let entry of summary.providers){let planSuffix=entry.plan?` (${entry.plan})`:``;if(entry.error){lines.push(` ${entry.displayName}${planSuffix}: ${entry.error}`);continue}if(entry.windows.length===0){lines.push(` ${entry.displayName}${planSuffix}: no data`);continue}lines.push(` ${entry.displayName}${planSuffix}`);for(let window of entry.windows){let remaining=clampPercent(100-window.usedPercent),reset=formatResetRemaining(window.resetAt,opts?.now),resetSuffix=reset?` · resets ${reset}`:``;lines.push(` ${window.label}: ${remaining.toFixed(0)}% left${resetSuffix}`)}}return lines}function parseGoogleToken(apiKey){if(!apiKey)return null;try{let parsed=JSON.parse(apiKey);if(parsed&&typeof parsed.token==`string`)return{token:parsed.token}}catch{}return null}async function resolveZaiApiKey(){let envDirect=normalizeSecretInput(process.env.ZAI_API_KEY)||normalizeSecretInput(process.env.Z_AI_API_KEY);if(envDirect)return envDirect;let envResolved=resolveEnvApiKey(`zai`);if(envResolved?.apiKey)return envResolved.apiKey;let cfg=loadConfig(),key=getCustomProviderApiKey(cfg,`zai`)||getCustomProviderApiKey(cfg,`z-ai`);if(key)return key;let store=await ensureAuthProfileStore(),apiProfile=[...listProfilesForProvider(store,`zai`),...listProfilesForProvider(store,`z-ai`)].find(id=>store.profiles[id]?.type===`api_key`);if(apiProfile){let cred=store.profiles[apiProfile];if(cred?.type===`api_key`&&normalizeSecretInput(cred.key))return normalizeSecretInput(cred.key)}try{let authPath=path.join(os.homedir(),`.pi`,`agent`,`auth.json`);if(!fs.existsSync(authPath))return;let data=JSON.parse(fs.readFileSync(authPath,`utf-8`));return data[`z-ai`]?.access||data.zai?.access}catch{return}}async function resolveMinimaxApiKey(){return resolveProviderApiKeyFromConfigAndStore({providerId:`minimax`,envDirect:[process.env.MINIMAX_CODE_PLAN_KEY,process.env.MINIMAX_API_KEY]})}async function resolveXiaomiApiKey(){return resolveProviderApiKeyFromConfigAndStore({providerId:`xiaomi`,envDirect:[process.env.XIAOMI_API_KEY]})}async function resolveProviderApiKeyFromConfigAndStore(params){let envDirect=params.envDirect.map(normalizeSecretInput).find(Boolean);if(envDirect)return envDirect;let envResolved=resolveEnvApiKey(params.providerId);if(envResolved?.apiKey)return envResolved.apiKey;let key=getCustomProviderApiKey(loadConfig(),params.providerId);if(key)return key;let store=await ensureAuthProfileStore(),apiProfile=listProfilesForProvider(store,params.providerId).find(id=>{let cred=store.profiles[id];return cred?.type===`api_key`||cred?.type===`token`});if(!apiProfile)return;let cred=store.profiles[apiProfile];if(cred?.type===`api_key`)return normalizeSecretInput(cred.key);if(cred?.type===`token`)return normalizeSecretInput(cred.token)}async function resolveOAuthToken(params){let cfg=loadConfig(),store=await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),deduped=dedupeProfileIds(resolveAuthProfileOrder({cfg,store,provider:params.provider}));for(let profileId of deduped){let cred=store.profiles[profileId];if(!(!cred||cred.type!==`oauth`&&cred.type!==`token`))try{let resolved=await resolveApiKeyForProfile({cfg:void 0,store,profileId,agentDir:params.agentDir});if(!resolved?.apiKey)continue;let token=resolved.apiKey;return(params.provider===`google-gemini-cli`||params.provider===`google-antigravity`)&&(token=parseGoogleToken(resolved.apiKey)?.token??resolved.apiKey),{provider:params.provider,token,accountId:cred.type===`oauth`&&`accountId`in cred?cred.accountId:void 0}}catch{}}return null}async function resolveOAuthProviders(agentDir){let store=await ensureAuthProfileStore(agentDir,{allowKeychainPrompt:!1}),cfg=loadConfig(),providers=[`anthropic`,`github-copilot`,`google-gemini-cli`,`google-antigravity`,`openai-codex`],isOAuthLikeCredential=id=>{let cred=store.profiles[id];return cred?.type===`oauth`||cred?.type===`token`};return providers.filter(provider=>{if(listProfilesForProvider(store,provider).filter(isOAuthLikeCredential).length>0)return!0;let normalized=normalizeProviderId(provider);return Object.entries(cfg.auth?.profiles??{}).filter(([,profile])=>normalizeProviderId(profile.provider)===normalized).map(([id])=>id).filter(isOAuthLikeCredential).length>0})}async function resolveProviderAuths(params){if(params.auth)return params.auth;let oauthProviders=await resolveOAuthProviders(params.agentDir),auths=[];for(let provider of params.providers){if(provider===`zai`){let apiKey=await resolveZaiApiKey();apiKey&&auths.push({provider,token:apiKey});continue}if(provider===`minimax`){let apiKey=await resolveMinimaxApiKey();apiKey&&auths.push({provider,token:apiKey});continue}if(provider===`xiaomi`){let apiKey=await resolveXiaomiApiKey();apiKey&&auths.push({provider,token:apiKey});continue}if(!oauthProviders.includes(provider))continue;let auth=await resolveOAuthToken({provider,agentDir:params.agentDir});auth&&auths.push(auth)}return auths}async function fetchJson(url,init,timeoutMs,fetchFn){let controller=new AbortController,timer=setTimeout(controller.abort.bind(controller),timeoutMs);try{return await fetchFn(url,{...init,signal:controller.signal})}finally{clearTimeout(timer)}}const BASE_URL=`https://cloudcode-pa.googleapis.com`,METADATA={ideType:`ANTIGRAVITY`,platform:`PLATFORM_UNSPECIFIED`,pluginType:`GEMINI`};function parseNumber(value){if(typeof value==`number`&&Number.isFinite(value))return value;if(typeof value==`string`){let parsed=Number.parseFloat(value);if(Number.isFinite(parsed))return parsed}}function parseEpochMs(isoString){if(isoString?.trim())try{let ms=Date.parse(isoString);if(Number.isFinite(ms))return ms}catch{}}async function parseErrorMessage(res){try{let message=(await res.json())?.error?.message?.trim();if(message)return message}catch{}return`HTTP ${res.status}`}function extractCredits(data){let available=parseNumber(data.availablePromptCredits),monthly=parseNumber(data.planInfo?.monthlyPromptCredits);if(!(available===void 0||monthly===void 0||monthly<=0))return{available,monthly}}function extractPlanInfo(data){let tierName=data.currentTier?.name?.trim();if(tierName)return tierName;let planType=data.planType?.trim();if(planType)return planType}function extractProjectId(data){let project=data.cloudaicompanionProject;if(project)return typeof project==`string`?project.trim()?project:void 0:(typeof project.id==`string`?project.id.trim():void 0)||void 0}function extractModelQuotas(data){let result=new Map;if(!data.models||typeof data.models!=`object`)return result;for(let[modelId,modelInfo]of Object.entries(data.models)){let quotaInfo=modelInfo.quotaInfo;if(!quotaInfo)continue;let remainingFraction=parseNumber(quotaInfo.remainingFraction);if(remainingFraction===void 0)continue;let resetTime=parseEpochMs(quotaInfo.resetTime);result.set(modelId,{remainingFraction,resetTime})}return result}function buildUsageWindows(opts){let windows=[];if(opts.credits){let{available,monthly}=opts.credits,usedPercent=clampPercent((monthly-available)/monthly*100);windows.push({label:`Credits`,usedPercent})}if(opts.modelQuotas&&opts.modelQuotas.size>0){let modelWindows=[];for(let[modelId,quota]of opts.modelQuotas){let lowerModelId=modelId.toLowerCase();if(lowerModelId.includes(`chat_`)||lowerModelId.includes(`tab_`))continue;let window={label:modelId,usedPercent:clampPercent((1-quota.remainingFraction)*100)};quota.resetTime&&(window.resetAt=quota.resetTime),modelWindows.push(window)}modelWindows.sort((a,b)=>b.usedPercent-a.usedPercent);let topModels=modelWindows.slice(0,10);logDebug(`[antigravity] Built ${topModels.length} model windows from ${opts.modelQuotas.size} total models`);for(let w of topModels)logDebug(`[antigravity] ${w.label}: ${w.usedPercent.toFixed(1)}% used${w.resetAt?` (resets at ${new Date(w.resetAt).toISOString()})`:``}`);windows.push(...topModels)}return windows}async function fetchAntigravityUsage(token,timeoutMs,fetchFn){let headers={Authorization:`Bearer ${token}`,"Content-Type":`application/json`,"User-Agent":`antigravity`,"X-Goog-Api-Client":`google-cloud-sdk vscode_cloudshelleditor/0.1`},credits,modelQuotas,planInfo,lastError,projectId;try{let res=await fetchJson(`${BASE_URL}/v1internal:loadCodeAssist`,{method:`POST`,headers,body:JSON.stringify({metadata:METADATA})},timeoutMs,fetchFn);if(res.ok){let data=await res.json();projectId=extractProjectId(data),credits=extractCredits(data),planInfo=extractPlanInfo(data),logDebug(`[antigravity] Credits: ${credits?`${credits.available}/${credits.monthly}`:`none`}${planInfo?` (plan: ${planInfo})`:``}`)}else if(lastError=await parseErrorMessage(res),res.status===401)return{provider:`google-antigravity`,displayName:PROVIDER_LABELS[`google-antigravity`],windows:[],error:`Token expired`}}catch{lastError=`Network error`}projectId||logDebug(`[antigravity] Missing project id; requesting available models without project`);try{let body=JSON.stringify(projectId?{project:projectId}:{}),res=await fetchJson(`${BASE_URL}/v1internal:fetchAvailableModels`,{method:`POST`,headers,body},timeoutMs,fetchFn);if(res.ok){modelQuotas=extractModelQuotas(await res.json()),logDebug(`[antigravity] Extracted ${modelQuotas.size} model quotas from API`);for(let[modelId,quota]of modelQuotas)logDebug(`[antigravity] ${modelId}: ${(quota.remainingFraction*100).toFixed(1)}% remaining${quota.resetTime?` (resets ${new Date(quota.resetTime).toISOString()})`:``}`)}else{let err=await parseErrorMessage(res);res.status===401?lastError=`Token expired`:lastError||=err}}catch{lastError||=`Network error`}let windows=buildUsageWindows({credits,modelQuotas});if(windows.length===0&&lastError)return logDebug(`[antigravity] Returning error snapshot: ${lastError}`),{provider:`google-antigravity`,displayName:PROVIDER_LABELS[`google-antigravity`],windows:[],error:lastError};let snapshot={provider:`google-antigravity`,displayName:PROVIDER_LABELS[`google-antigravity`],windows,plan:planInfo};return logDebug(`[antigravity] Returning snapshot with ${windows.length} windows${planInfo?` (plan: ${planInfo})`:``}`),logDebug(`[antigravity] Snapshot: ${JSON.stringify(snapshot,null,2)}`),snapshot}function buildClaudeUsageWindows(data){let windows=[];data.five_hour?.utilization!==void 0&&windows.push({label:`5h`,usedPercent:clampPercent(data.five_hour.utilization),resetAt:data.five_hour.resets_at?new Date(data.five_hour.resets_at).getTime():void 0}),data.seven_day?.utilization!==void 0&&windows.push({label:`Week`,usedPercent:clampPercent(data.seven_day.utilization),resetAt:data.seven_day.resets_at?new Date(data.seven_day.resets_at).getTime():void 0});let modelWindow=data.seven_day_sonnet||data.seven_day_opus;return modelWindow?.utilization!==void 0&&windows.push({label:data.seven_day_sonnet?`Sonnet`:`Opus`,usedPercent:clampPercent(modelWindow.utilization)}),windows}function resolveClaudeWebSessionKey(){let direct=process.env.CLAUDE_AI_SESSION_KEY?.trim()??process.env.CLAUDE_WEB_SESSION_KEY?.trim();if(direct?.startsWith(`sk-ant-`))return direct;let cookieHeader=process.env.CLAUDE_WEB_COOKIE?.trim();if(!cookieHeader)return;let value=cookieHeader.replace(/^cookie:\\s*/i,``).match(/(?:^|;\\s*)sessionKey=([^;\\s]+)/i)?.[1]?.trim();return value?.startsWith(`sk-ant-`)?value:void 0}async function fetchClaudeWebUsage(sessionKey,timeoutMs,fetchFn){let headers={Cookie:`sessionKey=${sessionKey}`,Accept:`application/json`},orgRes=await fetchJson(`https://claude.ai/api/organizations`,{headers},timeoutMs,fetchFn);if(!orgRes.ok)return null;let orgId=(await orgRes.json())?.[0]?.uuid?.trim();if(!orgId)return null;let usageRes=await fetchJson(`https://claude.ai/api/organizations/${orgId}/usage`,{headers},timeoutMs,fetchFn);if(!usageRes.ok)return null;let windows=buildClaudeUsageWindows(await usageRes.json());return windows.length===0?null:{provider:`anthropic`,displayName:PROVIDER_LABELS.anthropic,windows}}async function fetchClaudeUsage(token,timeoutMs,fetchFn){let res=await fetchJson(`https://api.anthropic.com/api/oauth/usage`,{headers:{Authorization:`Bearer ${token}`,"User-Agent":`builderforce`,Accept:`application/json`,"anthropic-version":`2023-06-01`,"anthropic-beta":`oauth-2025-04-20`}},timeoutMs,fetchFn);if(!res.ok){let message;try{let raw=(await res.json())?.error?.message;typeof raw==`string`&&raw.trim()&&(message=raw.trim())}catch{}if(res.status===403&&message?.includes(`scope requirement user:profile`)){let sessionKey=resolveClaudeWebSessionKey();if(sessionKey){let web=await fetchClaudeWebUsage(sessionKey,timeoutMs,fetchFn);if(web)return web}}let suffix=message?`: ${message}`:``;return{provider:`anthropic`,displayName:PROVIDER_LABELS.anthropic,windows:[],error:`HTTP ${res.status}${suffix}`}}let windows=buildClaudeUsageWindows(await res.json());return{provider:`anthropic`,displayName:PROVIDER_LABELS.anthropic,windows}}async function fetchCodexUsage(token,accountId,timeoutMs,fetchFn){let headers={Authorization:`Bearer ${token}`,"User-Agent":`CodexBar`,Accept:`application/json`};accountId&&(headers[`ChatGPT-Account-Id`]=accountId);let res=await fetchJson(`https://chatgpt.com/backend-api/wham/usage`,{method:`GET`,headers},timeoutMs,fetchFn);if(res.status===401||res.status===403)return{provider:`openai-codex`,displayName:PROVIDER_LABELS[`openai-codex`],windows:[],error:`Token expired`};if(!res.ok)return{provider:`openai-codex`,displayName:PROVIDER_LABELS[`openai-codex`],windows:[],error:`HTTP ${res.status}`};let data=await res.json(),windows=[];if(data.rate_limit?.primary_window){let pw=data.rate_limit.primary_window,windowHours=Math.round((pw.limit_window_seconds||10800)/3600);windows.push({label:`${windowHours}h`,usedPercent:clampPercent(pw.used_percent||0),resetAt:pw.reset_at?pw.reset_at*1e3:void 0})}if(data.rate_limit?.secondary_window){let sw=data.rate_limit.secondary_window,windowHours=Math.round((sw.limit_window_seconds||86400)/3600),label=windowHours>=24?`Day`:`${windowHours}h`;windows.push({label,usedPercent:clampPercent(sw.used_percent||0),resetAt:sw.reset_at?sw.reset_at*1e3:void 0})}let plan=data.plan_type;if(data.credits?.balance!==void 0&&data.credits.balance!==null){let balance=typeof data.credits.balance==`number`?data.credits.balance:parseFloat(data.credits.balance)||0;plan=plan?`${plan} ($${balance.toFixed(2)})`:`$${balance.toFixed(2)}`}return{provider:`openai-codex`,displayName:PROVIDER_LABELS[`openai-codex`],windows,plan}}async function fetchCopilotUsage(token,timeoutMs,fetchFn){let res=await fetchJson(`https://api.github.com/copilot_internal/user`,{headers:{Authorization:`token ${token}`,"Editor-Version":`vscode/1.96.2`,"User-Agent":`GitHubCopilotChat/0.26.7`,"X-Github-Api-Version":`2025-04-01`}},timeoutMs,fetchFn);if(!res.ok)return{provider:`github-copilot`,displayName:PROVIDER_LABELS[`github-copilot`],windows:[],error:`HTTP ${res.status}`};let data=await res.json(),windows=[];if(data.quota_snapshots?.premium_interactions){let remaining=data.quota_snapshots.premium_interactions.percent_remaining;windows.push({label:`Premium`,usedPercent:clampPercent(100-(remaining??0))})}if(data.quota_snapshots?.chat){let remaining=data.quota_snapshots.chat.percent_remaining;windows.push({label:`Chat`,usedPercent:clampPercent(100-(remaining??0))})}return{provider:`github-copilot`,displayName:PROVIDER_LABELS[`github-copilot`],windows,plan:data.copilot_plan}}async function fetchGeminiUsage(token,timeoutMs,fetchFn,provider){let res=await fetchJson(`https://cloudcode-pa.googleapis.com/v1internal:retrieveUserQuota`,{method:`POST`,headers:{Authorization:`Bearer ${token}`,"Content-Type":`application/json`},body:`{}`},timeoutMs,fetchFn);if(!res.ok)return{provider,displayName:PROVIDER_LABELS[provider],windows:[],error:`HTTP ${res.status}`};let data=await res.json(),quotas={};for(let bucket of data.buckets||[]){let model=bucket.modelId||`unknown`,frac=bucket.remainingFraction??1;(!quotas[model]||frac<quotas[model])&&(quotas[model]=frac)}let windows=[],proMin=1,flashMin=1,hasPro=!1,hasFlash=!1;for(let[model,frac]of Object.entries(quotas)){let lower=model.toLowerCase();lower.includes(`pro`)&&(hasPro=!0,frac<proMin&&(proMin=frac)),lower.includes(`flash`)&&(hasFlash=!0,frac<flashMin&&(flashMin=frac))}return hasPro&&windows.push({label:`Pro`,usedPercent:clampPercent((1-proMin)*100)}),hasFlash&&windows.push({label:`Flash`,usedPercent:clampPercent((1-flashMin)*100)}),{provider,displayName:PROVIDER_LABELS[provider],windows}}const RESET_KEYS=[`reset_at`,`resetAt`,`reset_time`,`resetTime`,`next_reset_at`,`nextResetAt`,`next_reset_time`,`nextResetTime`,`expires_at`,`expiresAt`,`expire_at`,`expireAt`,`end_time`,`endTime`,`window_end`,`windowEnd`],PERCENT_KEYS=[`used_percent`,`usedPercent`,`usage_percent`,`usagePercent`,`used_rate`,`usage_rate`,`used_ratio`,`usage_ratio`,`usedRatio`,`usageRatio`],USED_KEYS=[`used`,`usage`,`used_amount`,`usedAmount`,`used_tokens`,`usedTokens`,`used_quota`,`usedQuota`,`used_times`,`usedTimes`,`prompt_used`,`promptUsed`,`used_prompt`,`usedPrompt`,`prompts_used`,`promptsUsed`,`current_interval_usage_count`,`currentIntervalUsageCount`,`consumed`],TOTAL_KEYS=`total.total_amount.totalAmount.total_tokens.totalTokens.total_quota.totalQuota.total_times.totalTimes.prompt_total.promptTotal.total_prompt.totalPrompt.prompt_limit.promptLimit.limit_prompt.limitPrompt.prompts_total.promptsTotal.total_prompts.totalPrompts.current_interval_total_count.currentIntervalTotalCount.limit.quota.quota_limit.quotaLimit.max`.split(`.`),REMAINING_KEYS=`remain.remaining.remain_amount.remainingAmount.remaining_amount.remain_tokens.remainingTokens.remaining_tokens.remain_quota.remainingQuota.remaining_quota.remain_times.remainingTimes.remaining_times.prompt_remain.promptRemain.remain_prompt.remainPrompt.prompt_remaining.promptRemaining.remaining_prompt.remainingPrompt.prompts_remaining.promptsRemaining.prompt_left.promptLeft.prompts_left.promptsLeft.left`.split(`.`),PLAN_KEYS=[`plan`,`plan_name`,`planName`,`product`,`tier`],WINDOW_HOUR_KEYS=[`window_hours`,`windowHours`,`duration_hours`,`durationHours`,`hours`],WINDOW_MINUTE_KEYS=[`window_minutes`,`windowMinutes`,`duration_minutes`,`durationMinutes`,`minutes`];function pickNumber(record,keys){for(let key of keys){let value=record[key];if(typeof value==`number`&&Number.isFinite(value))return value;if(typeof value==`string`){let parsed=Number.parseFloat(value);if(Number.isFinite(parsed))return parsed}}}function pickString(record,keys){for(let key of keys){let value=record[key];if(typeof value==`string`&&value.trim())return value.trim()}}function parseEpoch(value){if(typeof value==`number`&&Number.isFinite(value))return value<0xe8d4a51000?Math.floor(value*1e3):Math.floor(value);if(typeof value==`string`&&value.trim()){let parsed=Date.parse(value);if(Number.isFinite(parsed))return parsed}}function hasAny(record,keys){return keys.some(key=>key in record)}function scoreUsageRecord(record){let score=0;return hasAny(record,PERCENT_KEYS)&&(score+=4),hasAny(record,TOTAL_KEYS)&&(score+=3),(hasAny(record,USED_KEYS)||hasAny(record,REMAINING_KEYS))&&(score+=2),hasAny(record,RESET_KEYS)&&(score+=1),hasAny(record,PLAN_KEYS)&&(score+=1),score}function collectUsageCandidates(root){let queue=[{value:root,depth:0}],seen=new Set,candidates=[],scanned=0;for(;queue.length&&scanned<60;){let next=queue.shift();if(!next)break;scanned+=1;let{value,depth}=next;if(isRecord(value)){if(seen.has(value))continue;seen.add(value);let score=scoreUsageRecord(value);if(score>0&&candidates.push({record:value,score,depth}),depth<4)for(let nested of Object.values(value))(isRecord(nested)||Array.isArray(nested))&&queue.push({value:nested,depth:depth+1});continue}if(Array.isArray(value)&&depth<4)for(let nested of value)(isRecord(nested)||Array.isArray(nested))&&queue.push({value:nested,depth:depth+1})}return candidates.sort((a,b)=>b.score-a.score||a.depth-b.depth),candidates.map(candidate=>candidate.record)}function deriveWindowLabel(payload){let hours=pickNumber(payload,WINDOW_HOUR_KEYS);if(hours&&Number.isFinite(hours))return`${hours}h`;let minutes=pickNumber(payload,WINDOW_MINUTE_KEYS);return minutes&&Number.isFinite(minutes)?`${minutes}m`:`5h`}function deriveUsedPercent(payload){let total=pickNumber(payload,TOTAL_KEYS),used=pickNumber(payload,USED_KEYS),remaining=pickNumber(payload,REMAINING_KEYS);used===void 0&&remaining!==void 0&&total!==void 0&&(used=total-remaining);let fromCounts=total&&total>0&&used!==void 0&&Number.isFinite(used)?clampPercent(used/total*100):null,percentRaw=pickNumber(payload,PERCENT_KEYS);if(percentRaw!==void 0){let normalized=clampPercent(percentRaw<=1?percentRaw*100:percentRaw);if(fromCounts!==null){let inverted=clampPercent(100-normalized);return Math.abs(normalized-fromCounts)<=1||Math.abs(inverted-fromCounts),fromCounts}return normalized}return fromCounts}async function fetchMinimaxUsage(apiKey,timeoutMs,fetchFn){let res=await fetchJson(`https://api.minimaxi.com/v1/api/openplatform/coding_plan/remains`,{method:`GET`,headers:{Authorization:`Bearer ${apiKey}`,"Content-Type":`application/json`,"MM-API-Source":`BuilderForceAgents`}},timeoutMs,fetchFn);if(!res.ok)return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows:[],error:`HTTP ${res.status}`};let data=await res.json().catch(()=>null);if(!isRecord(data))return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows:[],error:`Invalid JSON`};let baseResp=isRecord(data.base_resp)?data.base_resp:void 0;if(baseResp&&typeof baseResp.status_code==`number`&&baseResp.status_code!==0)return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows:[],error:baseResp.status_msg?.trim()||`API error`};let payload=isRecord(data.data)?data.data:data,candidates=collectUsageCandidates(payload),usageRecord=payload,usedPercent=null;for(let candidate of candidates){let candidatePercent=deriveUsedPercent(candidate);if(candidatePercent!==null){usageRecord=candidate,usedPercent=candidatePercent;break}}if(usedPercent===null&&(usedPercent=deriveUsedPercent(payload)),usedPercent===null)return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows:[],error:`Unsupported response shape`};let resetAt=parseEpoch(pickString(usageRecord,RESET_KEYS))??parseEpoch(pickNumber(usageRecord,RESET_KEYS))??parseEpoch(pickString(payload,RESET_KEYS))??parseEpoch(pickNumber(payload,RESET_KEYS)),windows=[{label:deriveWindowLabel(usageRecord),usedPercent,resetAt}];return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows,plan:pickString(usageRecord,PLAN_KEYS)??pickString(payload,PLAN_KEYS)}}async function fetchZaiUsage(apiKey,timeoutMs,fetchFn){let res=await fetchJson(`https://api.z.ai/api/monitor/usage/quota/limit`,{method:`GET`,headers:{Authorization:`Bearer ${apiKey}`,Accept:`application/json`}},timeoutMs,fetchFn);if(!res.ok)return{provider:`zai`,displayName:PROVIDER_LABELS.zai,windows:[],error:`HTTP ${res.status}`};let data=await res.json();if(!data.success||data.code!==200)return{provider:`zai`,displayName:PROVIDER_LABELS.zai,windows:[],error:data.msg||`API error`};let windows=[],limits=data.data?.limits||[];for(let limit of limits){let percent=clampPercent(limit.percentage||0),nextReset=limit.nextResetTime?new Date(limit.nextResetTime).getTime():void 0,windowLabel=`Limit`;limit.unit===1?windowLabel=`${limit.number}d`:limit.unit===3?windowLabel=`${limit.number}h`:limit.unit===5&&(windowLabel=`${limit.number}m`),limit.type===`TOKENS_LIMIT`?windows.push({label:`Tokens (${windowLabel})`,usedPercent:percent,resetAt:nextReset}):limit.type===`TIME_LIMIT`&&windows.push({label:`Monthly`,usedPercent:percent,resetAt:nextReset})}let planName=data.data?.planName||data.data?.plan||void 0;return{provider:`zai`,displayName:PROVIDER_LABELS.zai,windows,plan:planName}}async function loadProviderUsageSummary(opts={}){let now=opts.now??Date.now(),timeoutMs=opts.timeoutMs??5e3,fetchFn=resolveFetch(opts.fetch);if(!fetchFn)throw Error(`fetch is not available`);let auths=await resolveProviderAuths({providers:opts.providers??usageProviders,auth:opts.auth,agentDir:opts.agentDir});if(auths.length===0)return{updatedAt:now,providers:[]};let tasks=auths.map(auth=>withTimeout((async()=>{switch(auth.provider){case`anthropic`:return await fetchClaudeUsage(auth.token,timeoutMs,fetchFn);case`github-copilot`:return await fetchCopilotUsage(auth.token,timeoutMs,fetchFn);case`google-antigravity`:return await fetchAntigravityUsage(auth.token,timeoutMs,fetchFn);case`google-gemini-cli`:return await fetchGeminiUsage(auth.token,timeoutMs,fetchFn,auth.provider);case`openai-codex`:return await fetchCodexUsage(auth.token,auth.accountId,timeoutMs,fetchFn);case`minimax`:return await fetchMinimaxUsage(auth.token,timeoutMs,fetchFn);case`xiaomi`:return{provider:`xiaomi`,displayName:PROVIDER_LABELS.xiaomi,windows:[]};case`zai`:return await fetchZaiUsage(auth.token,timeoutMs,fetchFn);default:return{provider:auth.provider,displayName:PROVIDER_LABELS[auth.provider],windows:[],error:`Unsupported provider`}}})(),timeoutMs+1e3,{provider:auth.provider,displayName:PROVIDER_LABELS[auth.provider],windows:[],error:`Timeout`}));return{updatedAt:now,providers:(await Promise.all(tasks)).filter(entry=>entry.windows.length>0||!entry.error?!0:!ignoredErrors.has(entry.error))}}export{resolveUsageProviderId as i,formatUsageReportLines as n,formatUsageWindowSummary as r,loadProviderUsageSummary as t};
@@ -1 +1 @@
1
- import{d as isRecord}from"./utils-BP60e80M.js";import{Gt as getCustomProviderApiKey,Qt as normalizeSecretInput,R as normalizeProviderId,Yt as resolveEnvApiKey,b as ensureAuthProfileStore,h as listProfilesForProvider,m as dedupeProfileIds,s as resolveApiKeyForProfile,t as resolveAuthProfileOrder}from"./auth-profiles-C1VbcUOm.js";import{t as logDebug}from"./logger-wuOr7HKl.js";import{r as loadConfig}from"./io-CohJffHG.js";import{t as resolveFetch}from"./fetch-DnWD6ydH.js";import os from"node:os";import path from"node:path";import fs from"node:fs";const PROVIDER_LABELS={anthropic:`Claude`,"github-copilot":`Copilot`,"google-gemini-cli":`Gemini`,"google-antigravity":`Antigravity`,minimax:`MiniMax`,"openai-codex":`Codex`,xiaomi:`Xiaomi`,zai:`z.ai`},usageProviders=[`anthropic`,`github-copilot`,`google-gemini-cli`,`google-antigravity`,`minimax`,`openai-codex`,`xiaomi`,`zai`];function resolveUsageProviderId(provider){if(!provider)return;let normalized=normalizeProviderId(provider);return usageProviders.includes(normalized)?normalized:void 0}const ignoredErrors=new Set([`No credentials`,`No token`,`No API key`,`Not logged in`,`No auth`]),clampPercent=value=>Math.max(0,Math.min(100,Number.isFinite(value)?value:0)),withTimeout=async(work,ms,fallback)=>{let timeout;try{return await Promise.race([work,new Promise(resolve=>{timeout=setTimeout(()=>resolve(fallback),ms)})])}finally{timeout&&clearTimeout(timeout)}};function formatResetRemaining(targetMs,now){if(!targetMs)return null;let diffMs=targetMs-(now??Date.now());if(diffMs<=0)return`now`;let diffMins=Math.floor(diffMs/6e4);if(diffMins<60)return`${diffMins}m`;let hours=Math.floor(diffMins/60),mins=diffMins%60;if(hours<24)return mins>0?`${hours}h ${mins}m`:`${hours}h`;let days=Math.floor(hours/24);return days<7?`${days}d ${hours%24}h`:new Intl.DateTimeFormat(`en-US`,{month:`short`,day:`numeric`}).format(new Date(targetMs))}function formatUsageWindowSummary(snapshot,opts){if(snapshot.error||snapshot.windows.length===0)return null;let now=opts?.now??Date.now(),maxWindows=typeof opts?.maxWindows==`number`&&opts.maxWindows>0?Math.min(opts.maxWindows,snapshot.windows.length):snapshot.windows.length,includeResets=opts?.includeResets??!1;return snapshot.windows.slice(0,maxWindows).map(window=>{let remaining=clampPercent(100-window.usedPercent),reset=includeResets?formatResetRemaining(window.resetAt,now):null,resetSuffix=reset?` ⏱${reset}`:``;return`${window.label} ${remaining.toFixed(0)}% left${resetSuffix}`}).join(` · `)}function formatUsageReportLines(summary,opts){if(summary.providers.length===0)return[`Usage: no provider usage available.`];let lines=[`Usage:`];for(let entry of summary.providers){let planSuffix=entry.plan?` (${entry.plan})`:``;if(entry.error){lines.push(` ${entry.displayName}${planSuffix}: ${entry.error}`);continue}if(entry.windows.length===0){lines.push(` ${entry.displayName}${planSuffix}: no data`);continue}lines.push(` ${entry.displayName}${planSuffix}`);for(let window of entry.windows){let remaining=clampPercent(100-window.usedPercent),reset=formatResetRemaining(window.resetAt,opts?.now),resetSuffix=reset?` · resets ${reset}`:``;lines.push(` ${window.label}: ${remaining.toFixed(0)}% left${resetSuffix}`)}}return lines}function parseGoogleToken(apiKey){if(!apiKey)return null;try{let parsed=JSON.parse(apiKey);if(parsed&&typeof parsed.token==`string`)return{token:parsed.token}}catch{}return null}async function resolveZaiApiKey(){let envDirect=normalizeSecretInput(process.env.ZAI_API_KEY)||normalizeSecretInput(process.env.Z_AI_API_KEY);if(envDirect)return envDirect;let envResolved=resolveEnvApiKey(`zai`);if(envResolved?.apiKey)return envResolved.apiKey;let cfg=loadConfig(),key=getCustomProviderApiKey(cfg,`zai`)||getCustomProviderApiKey(cfg,`z-ai`);if(key)return key;let store=await ensureAuthProfileStore(),apiProfile=[...listProfilesForProvider(store,`zai`),...listProfilesForProvider(store,`z-ai`)].find(id=>store.profiles[id]?.type===`api_key`);if(apiProfile){let cred=store.profiles[apiProfile];if(cred?.type===`api_key`&&normalizeSecretInput(cred.key))return normalizeSecretInput(cred.key)}try{let authPath=path.join(os.homedir(),`.pi`,`agent`,`auth.json`);if(!fs.existsSync(authPath))return;let data=JSON.parse(fs.readFileSync(authPath,`utf-8`));return data[`z-ai`]?.access||data.zai?.access}catch{return}}async function resolveMinimaxApiKey(){return resolveProviderApiKeyFromConfigAndStore({providerId:`minimax`,envDirect:[process.env.MINIMAX_CODE_PLAN_KEY,process.env.MINIMAX_API_KEY]})}async function resolveXiaomiApiKey(){return resolveProviderApiKeyFromConfigAndStore({providerId:`xiaomi`,envDirect:[process.env.XIAOMI_API_KEY]})}async function resolveProviderApiKeyFromConfigAndStore(params){let envDirect=params.envDirect.map(normalizeSecretInput).find(Boolean);if(envDirect)return envDirect;let envResolved=resolveEnvApiKey(params.providerId);if(envResolved?.apiKey)return envResolved.apiKey;let key=getCustomProviderApiKey(loadConfig(),params.providerId);if(key)return key;let store=await ensureAuthProfileStore(),apiProfile=listProfilesForProvider(store,params.providerId).find(id=>{let cred=store.profiles[id];return cred?.type===`api_key`||cred?.type===`token`});if(!apiProfile)return;let cred=store.profiles[apiProfile];if(cred?.type===`api_key`)return normalizeSecretInput(cred.key);if(cred?.type===`token`)return normalizeSecretInput(cred.token)}async function resolveOAuthToken(params){let cfg=loadConfig(),store=await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),deduped=dedupeProfileIds(resolveAuthProfileOrder({cfg,store,provider:params.provider}));for(let profileId of deduped){let cred=store.profiles[profileId];if(!(!cred||cred.type!==`oauth`&&cred.type!==`token`))try{let resolved=await resolveApiKeyForProfile({cfg:void 0,store,profileId,agentDir:params.agentDir});if(!resolved?.apiKey)continue;let token=resolved.apiKey;return(params.provider===`google-gemini-cli`||params.provider===`google-antigravity`)&&(token=parseGoogleToken(resolved.apiKey)?.token??resolved.apiKey),{provider:params.provider,token,accountId:cred.type===`oauth`&&`accountId`in cred?cred.accountId:void 0}}catch{}}return null}async function resolveOAuthProviders(agentDir){let store=await ensureAuthProfileStore(agentDir,{allowKeychainPrompt:!1}),cfg=loadConfig(),providers=[`anthropic`,`github-copilot`,`google-gemini-cli`,`google-antigravity`,`openai-codex`],isOAuthLikeCredential=id=>{let cred=store.profiles[id];return cred?.type===`oauth`||cred?.type===`token`};return providers.filter(provider=>{if(listProfilesForProvider(store,provider).filter(isOAuthLikeCredential).length>0)return!0;let normalized=normalizeProviderId(provider);return Object.entries(cfg.auth?.profiles??{}).filter(([,profile])=>normalizeProviderId(profile.provider)===normalized).map(([id])=>id).filter(isOAuthLikeCredential).length>0})}async function resolveProviderAuths(params){if(params.auth)return params.auth;let oauthProviders=await resolveOAuthProviders(params.agentDir),auths=[];for(let provider of params.providers){if(provider===`zai`){let apiKey=await resolveZaiApiKey();apiKey&&auths.push({provider,token:apiKey});continue}if(provider===`minimax`){let apiKey=await resolveMinimaxApiKey();apiKey&&auths.push({provider,token:apiKey});continue}if(provider===`xiaomi`){let apiKey=await resolveXiaomiApiKey();apiKey&&auths.push({provider,token:apiKey});continue}if(!oauthProviders.includes(provider))continue;let auth=await resolveOAuthToken({provider,agentDir:params.agentDir});auth&&auths.push(auth)}return auths}async function fetchJson(url,init,timeoutMs,fetchFn){let controller=new AbortController,timer=setTimeout(controller.abort.bind(controller),timeoutMs);try{return await fetchFn(url,{...init,signal:controller.signal})}finally{clearTimeout(timer)}}const BASE_URL=`https://cloudcode-pa.googleapis.com`,METADATA={ideType:`ANTIGRAVITY`,platform:`PLATFORM_UNSPECIFIED`,pluginType:`GEMINI`};function parseNumber(value){if(typeof value==`number`&&Number.isFinite(value))return value;if(typeof value==`string`){let parsed=Number.parseFloat(value);if(Number.isFinite(parsed))return parsed}}function parseEpochMs(isoString){if(isoString?.trim())try{let ms=Date.parse(isoString);if(Number.isFinite(ms))return ms}catch{}}async function parseErrorMessage(res){try{let message=(await res.json())?.error?.message?.trim();if(message)return message}catch{}return`HTTP ${res.status}`}function extractCredits(data){let available=parseNumber(data.availablePromptCredits),monthly=parseNumber(data.planInfo?.monthlyPromptCredits);if(!(available===void 0||monthly===void 0||monthly<=0))return{available,monthly}}function extractPlanInfo(data){let tierName=data.currentTier?.name?.trim();if(tierName)return tierName;let planType=data.planType?.trim();if(planType)return planType}function extractProjectId(data){let project=data.cloudaicompanionProject;if(project)return typeof project==`string`?project.trim()?project:void 0:(typeof project.id==`string`?project.id.trim():void 0)||void 0}function extractModelQuotas(data){let result=new Map;if(!data.models||typeof data.models!=`object`)return result;for(let[modelId,modelInfo]of Object.entries(data.models)){let quotaInfo=modelInfo.quotaInfo;if(!quotaInfo)continue;let remainingFraction=parseNumber(quotaInfo.remainingFraction);if(remainingFraction===void 0)continue;let resetTime=parseEpochMs(quotaInfo.resetTime);result.set(modelId,{remainingFraction,resetTime})}return result}function buildUsageWindows(opts){let windows=[];if(opts.credits){let{available,monthly}=opts.credits,usedPercent=clampPercent((monthly-available)/monthly*100);windows.push({label:`Credits`,usedPercent})}if(opts.modelQuotas&&opts.modelQuotas.size>0){let modelWindows=[];for(let[modelId,quota]of opts.modelQuotas){let lowerModelId=modelId.toLowerCase();if(lowerModelId.includes(`chat_`)||lowerModelId.includes(`tab_`))continue;let window={label:modelId,usedPercent:clampPercent((1-quota.remainingFraction)*100)};quota.resetTime&&(window.resetAt=quota.resetTime),modelWindows.push(window)}modelWindows.sort((a,b)=>b.usedPercent-a.usedPercent);let topModels=modelWindows.slice(0,10);logDebug(`[antigravity] Built ${topModels.length} model windows from ${opts.modelQuotas.size} total models`);for(let w of topModels)logDebug(`[antigravity] ${w.label}: ${w.usedPercent.toFixed(1)}% used${w.resetAt?` (resets at ${new Date(w.resetAt).toISOString()})`:``}`);windows.push(...topModels)}return windows}async function fetchAntigravityUsage(token,timeoutMs,fetchFn){let headers={Authorization:`Bearer ${token}`,"Content-Type":`application/json`,"User-Agent":`antigravity`,"X-Goog-Api-Client":`google-cloud-sdk vscode_cloudshelleditor/0.1`},credits,modelQuotas,planInfo,lastError,projectId;try{let res=await fetchJson(`${BASE_URL}/v1internal:loadCodeAssist`,{method:`POST`,headers,body:JSON.stringify({metadata:METADATA})},timeoutMs,fetchFn);if(res.ok){let data=await res.json();projectId=extractProjectId(data),credits=extractCredits(data),planInfo=extractPlanInfo(data),logDebug(`[antigravity] Credits: ${credits?`${credits.available}/${credits.monthly}`:`none`}${planInfo?` (plan: ${planInfo})`:``}`)}else if(lastError=await parseErrorMessage(res),res.status===401)return{provider:`google-antigravity`,displayName:PROVIDER_LABELS[`google-antigravity`],windows:[],error:`Token expired`}}catch{lastError=`Network error`}projectId||logDebug(`[antigravity] Missing project id; requesting available models without project`);try{let body=JSON.stringify(projectId?{project:projectId}:{}),res=await fetchJson(`${BASE_URL}/v1internal:fetchAvailableModels`,{method:`POST`,headers,body},timeoutMs,fetchFn);if(res.ok){modelQuotas=extractModelQuotas(await res.json()),logDebug(`[antigravity] Extracted ${modelQuotas.size} model quotas from API`);for(let[modelId,quota]of modelQuotas)logDebug(`[antigravity] ${modelId}: ${(quota.remainingFraction*100).toFixed(1)}% remaining${quota.resetTime?` (resets ${new Date(quota.resetTime).toISOString()})`:``}`)}else{let err=await parseErrorMessage(res);res.status===401?lastError=`Token expired`:lastError||=err}}catch{lastError||=`Network error`}let windows=buildUsageWindows({credits,modelQuotas});if(windows.length===0&&lastError)return logDebug(`[antigravity] Returning error snapshot: ${lastError}`),{provider:`google-antigravity`,displayName:PROVIDER_LABELS[`google-antigravity`],windows:[],error:lastError};let snapshot={provider:`google-antigravity`,displayName:PROVIDER_LABELS[`google-antigravity`],windows,plan:planInfo};return logDebug(`[antigravity] Returning snapshot with ${windows.length} windows${planInfo?` (plan: ${planInfo})`:``}`),logDebug(`[antigravity] Snapshot: ${JSON.stringify(snapshot,null,2)}`),snapshot}function buildClaudeUsageWindows(data){let windows=[];data.five_hour?.utilization!==void 0&&windows.push({label:`5h`,usedPercent:clampPercent(data.five_hour.utilization),resetAt:data.five_hour.resets_at?new Date(data.five_hour.resets_at).getTime():void 0}),data.seven_day?.utilization!==void 0&&windows.push({label:`Week`,usedPercent:clampPercent(data.seven_day.utilization),resetAt:data.seven_day.resets_at?new Date(data.seven_day.resets_at).getTime():void 0});let modelWindow=data.seven_day_sonnet||data.seven_day_opus;return modelWindow?.utilization!==void 0&&windows.push({label:data.seven_day_sonnet?`Sonnet`:`Opus`,usedPercent:clampPercent(modelWindow.utilization)}),windows}function resolveClaudeWebSessionKey(){let direct=process.env.CLAUDE_AI_SESSION_KEY?.trim()??process.env.CLAUDE_WEB_SESSION_KEY?.trim();if(direct?.startsWith(`sk-ant-`))return direct;let cookieHeader=process.env.CLAUDE_WEB_COOKIE?.trim();if(!cookieHeader)return;let value=cookieHeader.replace(/^cookie:\\s*/i,``).match(/(?:^|;\\s*)sessionKey=([^;\\s]+)/i)?.[1]?.trim();return value?.startsWith(`sk-ant-`)?value:void 0}async function fetchClaudeWebUsage(sessionKey,timeoutMs,fetchFn){let headers={Cookie:`sessionKey=${sessionKey}`,Accept:`application/json`},orgRes=await fetchJson(`https://claude.ai/api/organizations`,{headers},timeoutMs,fetchFn);if(!orgRes.ok)return null;let orgId=(await orgRes.json())?.[0]?.uuid?.trim();if(!orgId)return null;let usageRes=await fetchJson(`https://claude.ai/api/organizations/${orgId}/usage`,{headers},timeoutMs,fetchFn);if(!usageRes.ok)return null;let windows=buildClaudeUsageWindows(await usageRes.json());return windows.length===0?null:{provider:`anthropic`,displayName:PROVIDER_LABELS.anthropic,windows}}async function fetchClaudeUsage(token,timeoutMs,fetchFn){let res=await fetchJson(`https://api.anthropic.com/api/oauth/usage`,{headers:{Authorization:`Bearer ${token}`,"User-Agent":`builderforce`,Accept:`application/json`,"anthropic-version":`2023-06-01`,"anthropic-beta":`oauth-2025-04-20`}},timeoutMs,fetchFn);if(!res.ok){let message;try{let raw=(await res.json())?.error?.message;typeof raw==`string`&&raw.trim()&&(message=raw.trim())}catch{}if(res.status===403&&message?.includes(`scope requirement user:profile`)){let sessionKey=resolveClaudeWebSessionKey();if(sessionKey){let web=await fetchClaudeWebUsage(sessionKey,timeoutMs,fetchFn);if(web)return web}}let suffix=message?`: ${message}`:``;return{provider:`anthropic`,displayName:PROVIDER_LABELS.anthropic,windows:[],error:`HTTP ${res.status}${suffix}`}}let windows=buildClaudeUsageWindows(await res.json());return{provider:`anthropic`,displayName:PROVIDER_LABELS.anthropic,windows}}async function fetchCodexUsage(token,accountId,timeoutMs,fetchFn){let headers={Authorization:`Bearer ${token}`,"User-Agent":`CodexBar`,Accept:`application/json`};accountId&&(headers[`ChatGPT-Account-Id`]=accountId);let res=await fetchJson(`https://chatgpt.com/backend-api/wham/usage`,{method:`GET`,headers},timeoutMs,fetchFn);if(res.status===401||res.status===403)return{provider:`openai-codex`,displayName:PROVIDER_LABELS[`openai-codex`],windows:[],error:`Token expired`};if(!res.ok)return{provider:`openai-codex`,displayName:PROVIDER_LABELS[`openai-codex`],windows:[],error:`HTTP ${res.status}`};let data=await res.json(),windows=[];if(data.rate_limit?.primary_window){let pw=data.rate_limit.primary_window,windowHours=Math.round((pw.limit_window_seconds||10800)/3600);windows.push({label:`${windowHours}h`,usedPercent:clampPercent(pw.used_percent||0),resetAt:pw.reset_at?pw.reset_at*1e3:void 0})}if(data.rate_limit?.secondary_window){let sw=data.rate_limit.secondary_window,windowHours=Math.round((sw.limit_window_seconds||86400)/3600),label=windowHours>=24?`Day`:`${windowHours}h`;windows.push({label,usedPercent:clampPercent(sw.used_percent||0),resetAt:sw.reset_at?sw.reset_at*1e3:void 0})}let plan=data.plan_type;if(data.credits?.balance!==void 0&&data.credits.balance!==null){let balance=typeof data.credits.balance==`number`?data.credits.balance:parseFloat(data.credits.balance)||0;plan=plan?`${plan} ($${balance.toFixed(2)})`:`$${balance.toFixed(2)}`}return{provider:`openai-codex`,displayName:PROVIDER_LABELS[`openai-codex`],windows,plan}}async function fetchCopilotUsage(token,timeoutMs,fetchFn){let res=await fetchJson(`https://api.github.com/copilot_internal/user`,{headers:{Authorization:`token ${token}`,"Editor-Version":`vscode/1.96.2`,"User-Agent":`GitHubCopilotChat/0.26.7`,"X-Github-Api-Version":`2025-04-01`}},timeoutMs,fetchFn);if(!res.ok)return{provider:`github-copilot`,displayName:PROVIDER_LABELS[`github-copilot`],windows:[],error:`HTTP ${res.status}`};let data=await res.json(),windows=[];if(data.quota_snapshots?.premium_interactions){let remaining=data.quota_snapshots.premium_interactions.percent_remaining;windows.push({label:`Premium`,usedPercent:clampPercent(100-(remaining??0))})}if(data.quota_snapshots?.chat){let remaining=data.quota_snapshots.chat.percent_remaining;windows.push({label:`Chat`,usedPercent:clampPercent(100-(remaining??0))})}return{provider:`github-copilot`,displayName:PROVIDER_LABELS[`github-copilot`],windows,plan:data.copilot_plan}}async function fetchGeminiUsage(token,timeoutMs,fetchFn,provider){let res=await fetchJson(`https://cloudcode-pa.googleapis.com/v1internal:retrieveUserQuota`,{method:`POST`,headers:{Authorization:`Bearer ${token}`,"Content-Type":`application/json`},body:`{}`},timeoutMs,fetchFn);if(!res.ok)return{provider,displayName:PROVIDER_LABELS[provider],windows:[],error:`HTTP ${res.status}`};let data=await res.json(),quotas={};for(let bucket of data.buckets||[]){let model=bucket.modelId||`unknown`,frac=bucket.remainingFraction??1;(!quotas[model]||frac<quotas[model])&&(quotas[model]=frac)}let windows=[],proMin=1,flashMin=1,hasPro=!1,hasFlash=!1;for(let[model,frac]of Object.entries(quotas)){let lower=model.toLowerCase();lower.includes(`pro`)&&(hasPro=!0,frac<proMin&&(proMin=frac)),lower.includes(`flash`)&&(hasFlash=!0,frac<flashMin&&(flashMin=frac))}return hasPro&&windows.push({label:`Pro`,usedPercent:clampPercent((1-proMin)*100)}),hasFlash&&windows.push({label:`Flash`,usedPercent:clampPercent((1-flashMin)*100)}),{provider,displayName:PROVIDER_LABELS[provider],windows}}const RESET_KEYS=[`reset_at`,`resetAt`,`reset_time`,`resetTime`,`next_reset_at`,`nextResetAt`,`next_reset_time`,`nextResetTime`,`expires_at`,`expiresAt`,`expire_at`,`expireAt`,`end_time`,`endTime`,`window_end`,`windowEnd`],PERCENT_KEYS=[`used_percent`,`usedPercent`,`usage_percent`,`usagePercent`,`used_rate`,`usage_rate`,`used_ratio`,`usage_ratio`,`usedRatio`,`usageRatio`],USED_KEYS=[`used`,`usage`,`used_amount`,`usedAmount`,`used_tokens`,`usedTokens`,`used_quota`,`usedQuota`,`used_times`,`usedTimes`,`prompt_used`,`promptUsed`,`used_prompt`,`usedPrompt`,`prompts_used`,`promptsUsed`,`current_interval_usage_count`,`currentIntervalUsageCount`,`consumed`],TOTAL_KEYS=`total.total_amount.totalAmount.total_tokens.totalTokens.total_quota.totalQuota.total_times.totalTimes.prompt_total.promptTotal.total_prompt.totalPrompt.prompt_limit.promptLimit.limit_prompt.limitPrompt.prompts_total.promptsTotal.total_prompts.totalPrompts.current_interval_total_count.currentIntervalTotalCount.limit.quota.quota_limit.quotaLimit.max`.split(`.`),REMAINING_KEYS=`remain.remaining.remain_amount.remainingAmount.remaining_amount.remain_tokens.remainingTokens.remaining_tokens.remain_quota.remainingQuota.remaining_quota.remain_times.remainingTimes.remaining_times.prompt_remain.promptRemain.remain_prompt.remainPrompt.prompt_remaining.promptRemaining.remaining_prompt.remainingPrompt.prompts_remaining.promptsRemaining.prompt_left.promptLeft.prompts_left.promptsLeft.left`.split(`.`),PLAN_KEYS=[`plan`,`plan_name`,`planName`,`product`,`tier`],WINDOW_HOUR_KEYS=[`window_hours`,`windowHours`,`duration_hours`,`durationHours`,`hours`],WINDOW_MINUTE_KEYS=[`window_minutes`,`windowMinutes`,`duration_minutes`,`durationMinutes`,`minutes`];function pickNumber(record,keys){for(let key of keys){let value=record[key];if(typeof value==`number`&&Number.isFinite(value))return value;if(typeof value==`string`){let parsed=Number.parseFloat(value);if(Number.isFinite(parsed))return parsed}}}function pickString(record,keys){for(let key of keys){let value=record[key];if(typeof value==`string`&&value.trim())return value.trim()}}function parseEpoch(value){if(typeof value==`number`&&Number.isFinite(value))return value<0xe8d4a51000?Math.floor(value*1e3):Math.floor(value);if(typeof value==`string`&&value.trim()){let parsed=Date.parse(value);if(Number.isFinite(parsed))return parsed}}function hasAny(record,keys){return keys.some(key=>key in record)}function scoreUsageRecord(record){let score=0;return hasAny(record,PERCENT_KEYS)&&(score+=4),hasAny(record,TOTAL_KEYS)&&(score+=3),(hasAny(record,USED_KEYS)||hasAny(record,REMAINING_KEYS))&&(score+=2),hasAny(record,RESET_KEYS)&&(score+=1),hasAny(record,PLAN_KEYS)&&(score+=1),score}function collectUsageCandidates(root){let queue=[{value:root,depth:0}],seen=new Set,candidates=[],scanned=0;for(;queue.length&&scanned<60;){let next=queue.shift();if(!next)break;scanned+=1;let{value,depth}=next;if(isRecord(value)){if(seen.has(value))continue;seen.add(value);let score=scoreUsageRecord(value);if(score>0&&candidates.push({record:value,score,depth}),depth<4)for(let nested of Object.values(value))(isRecord(nested)||Array.isArray(nested))&&queue.push({value:nested,depth:depth+1});continue}if(Array.isArray(value)&&depth<4)for(let nested of value)(isRecord(nested)||Array.isArray(nested))&&queue.push({value:nested,depth:depth+1})}return candidates.sort((a,b)=>b.score-a.score||a.depth-b.depth),candidates.map(candidate=>candidate.record)}function deriveWindowLabel(payload){let hours=pickNumber(payload,WINDOW_HOUR_KEYS);if(hours&&Number.isFinite(hours))return`${hours}h`;let minutes=pickNumber(payload,WINDOW_MINUTE_KEYS);return minutes&&Number.isFinite(minutes)?`${minutes}m`:`5h`}function deriveUsedPercent(payload){let total=pickNumber(payload,TOTAL_KEYS),used=pickNumber(payload,USED_KEYS),remaining=pickNumber(payload,REMAINING_KEYS);used===void 0&&remaining!==void 0&&total!==void 0&&(used=total-remaining);let fromCounts=total&&total>0&&used!==void 0&&Number.isFinite(used)?clampPercent(used/total*100):null,percentRaw=pickNumber(payload,PERCENT_KEYS);if(percentRaw!==void 0){let normalized=clampPercent(percentRaw<=1?percentRaw*100:percentRaw);if(fromCounts!==null){let inverted=clampPercent(100-normalized);return Math.abs(normalized-fromCounts)<=1||Math.abs(inverted-fromCounts),fromCounts}return normalized}return fromCounts}async function fetchMinimaxUsage(apiKey,timeoutMs,fetchFn){let res=await fetchJson(`https://api.minimaxi.com/v1/api/openplatform/coding_plan/remains`,{method:`GET`,headers:{Authorization:`Bearer ${apiKey}`,"Content-Type":`application/json`,"MM-API-Source":`BuilderForceAgents`}},timeoutMs,fetchFn);if(!res.ok)return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows:[],error:`HTTP ${res.status}`};let data=await res.json().catch(()=>null);if(!isRecord(data))return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows:[],error:`Invalid JSON`};let baseResp=isRecord(data.base_resp)?data.base_resp:void 0;if(baseResp&&typeof baseResp.status_code==`number`&&baseResp.status_code!==0)return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows:[],error:baseResp.status_msg?.trim()||`API error`};let payload=isRecord(data.data)?data.data:data,candidates=collectUsageCandidates(payload),usageRecord=payload,usedPercent=null;for(let candidate of candidates){let candidatePercent=deriveUsedPercent(candidate);if(candidatePercent!==null){usageRecord=candidate,usedPercent=candidatePercent;break}}if(usedPercent===null&&(usedPercent=deriveUsedPercent(payload)),usedPercent===null)return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows:[],error:`Unsupported response shape`};let resetAt=parseEpoch(pickString(usageRecord,RESET_KEYS))??parseEpoch(pickNumber(usageRecord,RESET_KEYS))??parseEpoch(pickString(payload,RESET_KEYS))??parseEpoch(pickNumber(payload,RESET_KEYS)),windows=[{label:deriveWindowLabel(usageRecord),usedPercent,resetAt}];return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows,plan:pickString(usageRecord,PLAN_KEYS)??pickString(payload,PLAN_KEYS)}}async function fetchZaiUsage(apiKey,timeoutMs,fetchFn){let res=await fetchJson(`https://api.z.ai/api/monitor/usage/quota/limit`,{method:`GET`,headers:{Authorization:`Bearer ${apiKey}`,Accept:`application/json`}},timeoutMs,fetchFn);if(!res.ok)return{provider:`zai`,displayName:PROVIDER_LABELS.zai,windows:[],error:`HTTP ${res.status}`};let data=await res.json();if(!data.success||data.code!==200)return{provider:`zai`,displayName:PROVIDER_LABELS.zai,windows:[],error:data.msg||`API error`};let windows=[],limits=data.data?.limits||[];for(let limit of limits){let percent=clampPercent(limit.percentage||0),nextReset=limit.nextResetTime?new Date(limit.nextResetTime).getTime():void 0,windowLabel=`Limit`;limit.unit===1?windowLabel=`${limit.number}d`:limit.unit===3?windowLabel=`${limit.number}h`:limit.unit===5&&(windowLabel=`${limit.number}m`),limit.type===`TOKENS_LIMIT`?windows.push({label:`Tokens (${windowLabel})`,usedPercent:percent,resetAt:nextReset}):limit.type===`TIME_LIMIT`&&windows.push({label:`Monthly`,usedPercent:percent,resetAt:nextReset})}let planName=data.data?.planName||data.data?.plan||void 0;return{provider:`zai`,displayName:PROVIDER_LABELS.zai,windows,plan:planName}}async function loadProviderUsageSummary(opts={}){let now=opts.now??Date.now(),timeoutMs=opts.timeoutMs??5e3,fetchFn=resolveFetch(opts.fetch);if(!fetchFn)throw Error(`fetch is not available`);let auths=await resolveProviderAuths({providers:opts.providers??usageProviders,auth:opts.auth,agentDir:opts.agentDir});if(auths.length===0)return{updatedAt:now,providers:[]};let tasks=auths.map(auth=>withTimeout((async()=>{switch(auth.provider){case`anthropic`:return await fetchClaudeUsage(auth.token,timeoutMs,fetchFn);case`github-copilot`:return await fetchCopilotUsage(auth.token,timeoutMs,fetchFn);case`google-antigravity`:return await fetchAntigravityUsage(auth.token,timeoutMs,fetchFn);case`google-gemini-cli`:return await fetchGeminiUsage(auth.token,timeoutMs,fetchFn,auth.provider);case`openai-codex`:return await fetchCodexUsage(auth.token,auth.accountId,timeoutMs,fetchFn);case`minimax`:return await fetchMinimaxUsage(auth.token,timeoutMs,fetchFn);case`xiaomi`:return{provider:`xiaomi`,displayName:PROVIDER_LABELS.xiaomi,windows:[]};case`zai`:return await fetchZaiUsage(auth.token,timeoutMs,fetchFn);default:return{provider:auth.provider,displayName:PROVIDER_LABELS[auth.provider],windows:[],error:`Unsupported provider`}}})(),timeoutMs+1e3,{provider:auth.provider,displayName:PROVIDER_LABELS[auth.provider],windows:[],error:`Timeout`}));return{updatedAt:now,providers:(await Promise.all(tasks)).filter(entry=>entry.windows.length>0||!entry.error?!0:!ignoredErrors.has(entry.error))}}export{resolveUsageProviderId as i,formatUsageReportLines as n,formatUsageWindowSummary as r,loadProviderUsageSummary as t};
1
+ import{d as isRecord}from"./utils-BP60e80M.js";import{Gt as getCustomProviderApiKey,Qt as normalizeSecretInput,R as normalizeProviderId,Yt as resolveEnvApiKey,b as ensureAuthProfileStore,h as listProfilesForProvider,m as dedupeProfileIds,s as resolveApiKeyForProfile,t as resolveAuthProfileOrder}from"./auth-profiles-pt7Tr4HA.js";import{t as logDebug}from"./logger-wuOr7HKl.js";import{r as loadConfig}from"./io-D9hC2aG0.js";import{t as resolveFetch}from"./fetch-DnWD6ydH.js";import os from"node:os";import path from"node:path";import fs from"node:fs";const PROVIDER_LABELS={anthropic:`Claude`,"github-copilot":`Copilot`,"google-gemini-cli":`Gemini`,"google-antigravity":`Antigravity`,minimax:`MiniMax`,"openai-codex":`Codex`,xiaomi:`Xiaomi`,zai:`z.ai`},usageProviders=[`anthropic`,`github-copilot`,`google-gemini-cli`,`google-antigravity`,`minimax`,`openai-codex`,`xiaomi`,`zai`];function resolveUsageProviderId(provider){if(!provider)return;let normalized=normalizeProviderId(provider);return usageProviders.includes(normalized)?normalized:void 0}const ignoredErrors=new Set([`No credentials`,`No token`,`No API key`,`Not logged in`,`No auth`]),clampPercent=value=>Math.max(0,Math.min(100,Number.isFinite(value)?value:0)),withTimeout=async(work,ms,fallback)=>{let timeout;try{return await Promise.race([work,new Promise(resolve=>{timeout=setTimeout(()=>resolve(fallback),ms)})])}finally{timeout&&clearTimeout(timeout)}};function formatResetRemaining(targetMs,now){if(!targetMs)return null;let diffMs=targetMs-(now??Date.now());if(diffMs<=0)return`now`;let diffMins=Math.floor(diffMs/6e4);if(diffMins<60)return`${diffMins}m`;let hours=Math.floor(diffMins/60),mins=diffMins%60;if(hours<24)return mins>0?`${hours}h ${mins}m`:`${hours}h`;let days=Math.floor(hours/24);return days<7?`${days}d ${hours%24}h`:new Intl.DateTimeFormat(`en-US`,{month:`short`,day:`numeric`}).format(new Date(targetMs))}function formatUsageWindowSummary(snapshot,opts){if(snapshot.error||snapshot.windows.length===0)return null;let now=opts?.now??Date.now(),maxWindows=typeof opts?.maxWindows==`number`&&opts.maxWindows>0?Math.min(opts.maxWindows,snapshot.windows.length):snapshot.windows.length,includeResets=opts?.includeResets??!1;return snapshot.windows.slice(0,maxWindows).map(window=>{let remaining=clampPercent(100-window.usedPercent),reset=includeResets?formatResetRemaining(window.resetAt,now):null,resetSuffix=reset?` ⏱${reset}`:``;return`${window.label} ${remaining.toFixed(0)}% left${resetSuffix}`}).join(` · `)}function formatUsageReportLines(summary,opts){if(summary.providers.length===0)return[`Usage: no provider usage available.`];let lines=[`Usage:`];for(let entry of summary.providers){let planSuffix=entry.plan?` (${entry.plan})`:``;if(entry.error){lines.push(` ${entry.displayName}${planSuffix}: ${entry.error}`);continue}if(entry.windows.length===0){lines.push(` ${entry.displayName}${planSuffix}: no data`);continue}lines.push(` ${entry.displayName}${planSuffix}`);for(let window of entry.windows){let remaining=clampPercent(100-window.usedPercent),reset=formatResetRemaining(window.resetAt,opts?.now),resetSuffix=reset?` · resets ${reset}`:``;lines.push(` ${window.label}: ${remaining.toFixed(0)}% left${resetSuffix}`)}}return lines}function parseGoogleToken(apiKey){if(!apiKey)return null;try{let parsed=JSON.parse(apiKey);if(parsed&&typeof parsed.token==`string`)return{token:parsed.token}}catch{}return null}async function resolveZaiApiKey(){let envDirect=normalizeSecretInput(process.env.ZAI_API_KEY)||normalizeSecretInput(process.env.Z_AI_API_KEY);if(envDirect)return envDirect;let envResolved=resolveEnvApiKey(`zai`);if(envResolved?.apiKey)return envResolved.apiKey;let cfg=loadConfig(),key=getCustomProviderApiKey(cfg,`zai`)||getCustomProviderApiKey(cfg,`z-ai`);if(key)return key;let store=await ensureAuthProfileStore(),apiProfile=[...listProfilesForProvider(store,`zai`),...listProfilesForProvider(store,`z-ai`)].find(id=>store.profiles[id]?.type===`api_key`);if(apiProfile){let cred=store.profiles[apiProfile];if(cred?.type===`api_key`&&normalizeSecretInput(cred.key))return normalizeSecretInput(cred.key)}try{let authPath=path.join(os.homedir(),`.pi`,`agent`,`auth.json`);if(!fs.existsSync(authPath))return;let data=JSON.parse(fs.readFileSync(authPath,`utf-8`));return data[`z-ai`]?.access||data.zai?.access}catch{return}}async function resolveMinimaxApiKey(){return resolveProviderApiKeyFromConfigAndStore({providerId:`minimax`,envDirect:[process.env.MINIMAX_CODE_PLAN_KEY,process.env.MINIMAX_API_KEY]})}async function resolveXiaomiApiKey(){return resolveProviderApiKeyFromConfigAndStore({providerId:`xiaomi`,envDirect:[process.env.XIAOMI_API_KEY]})}async function resolveProviderApiKeyFromConfigAndStore(params){let envDirect=params.envDirect.map(normalizeSecretInput).find(Boolean);if(envDirect)return envDirect;let envResolved=resolveEnvApiKey(params.providerId);if(envResolved?.apiKey)return envResolved.apiKey;let key=getCustomProviderApiKey(loadConfig(),params.providerId);if(key)return key;let store=await ensureAuthProfileStore(),apiProfile=listProfilesForProvider(store,params.providerId).find(id=>{let cred=store.profiles[id];return cred?.type===`api_key`||cred?.type===`token`});if(!apiProfile)return;let cred=store.profiles[apiProfile];if(cred?.type===`api_key`)return normalizeSecretInput(cred.key);if(cred?.type===`token`)return normalizeSecretInput(cred.token)}async function resolveOAuthToken(params){let cfg=loadConfig(),store=await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),deduped=dedupeProfileIds(resolveAuthProfileOrder({cfg,store,provider:params.provider}));for(let profileId of deduped){let cred=store.profiles[profileId];if(!(!cred||cred.type!==`oauth`&&cred.type!==`token`))try{let resolved=await resolveApiKeyForProfile({cfg:void 0,store,profileId,agentDir:params.agentDir});if(!resolved?.apiKey)continue;let token=resolved.apiKey;return(params.provider===`google-gemini-cli`||params.provider===`google-antigravity`)&&(token=parseGoogleToken(resolved.apiKey)?.token??resolved.apiKey),{provider:params.provider,token,accountId:cred.type===`oauth`&&`accountId`in cred?cred.accountId:void 0}}catch{}}return null}async function resolveOAuthProviders(agentDir){let store=await ensureAuthProfileStore(agentDir,{allowKeychainPrompt:!1}),cfg=loadConfig(),providers=[`anthropic`,`github-copilot`,`google-gemini-cli`,`google-antigravity`,`openai-codex`],isOAuthLikeCredential=id=>{let cred=store.profiles[id];return cred?.type===`oauth`||cred?.type===`token`};return providers.filter(provider=>{if(listProfilesForProvider(store,provider).filter(isOAuthLikeCredential).length>0)return!0;let normalized=normalizeProviderId(provider);return Object.entries(cfg.auth?.profiles??{}).filter(([,profile])=>normalizeProviderId(profile.provider)===normalized).map(([id])=>id).filter(isOAuthLikeCredential).length>0})}async function resolveProviderAuths(params){if(params.auth)return params.auth;let oauthProviders=await resolveOAuthProviders(params.agentDir),auths=[];for(let provider of params.providers){if(provider===`zai`){let apiKey=await resolveZaiApiKey();apiKey&&auths.push({provider,token:apiKey});continue}if(provider===`minimax`){let apiKey=await resolveMinimaxApiKey();apiKey&&auths.push({provider,token:apiKey});continue}if(provider===`xiaomi`){let apiKey=await resolveXiaomiApiKey();apiKey&&auths.push({provider,token:apiKey});continue}if(!oauthProviders.includes(provider))continue;let auth=await resolveOAuthToken({provider,agentDir:params.agentDir});auth&&auths.push(auth)}return auths}async function fetchJson(url,init,timeoutMs,fetchFn){let controller=new AbortController,timer=setTimeout(controller.abort.bind(controller),timeoutMs);try{return await fetchFn(url,{...init,signal:controller.signal})}finally{clearTimeout(timer)}}const BASE_URL=`https://cloudcode-pa.googleapis.com`,METADATA={ideType:`ANTIGRAVITY`,platform:`PLATFORM_UNSPECIFIED`,pluginType:`GEMINI`};function parseNumber(value){if(typeof value==`number`&&Number.isFinite(value))return value;if(typeof value==`string`){let parsed=Number.parseFloat(value);if(Number.isFinite(parsed))return parsed}}function parseEpochMs(isoString){if(isoString?.trim())try{let ms=Date.parse(isoString);if(Number.isFinite(ms))return ms}catch{}}async function parseErrorMessage(res){try{let message=(await res.json())?.error?.message?.trim();if(message)return message}catch{}return`HTTP ${res.status}`}function extractCredits(data){let available=parseNumber(data.availablePromptCredits),monthly=parseNumber(data.planInfo?.monthlyPromptCredits);if(!(available===void 0||monthly===void 0||monthly<=0))return{available,monthly}}function extractPlanInfo(data){let tierName=data.currentTier?.name?.trim();if(tierName)return tierName;let planType=data.planType?.trim();if(planType)return planType}function extractProjectId(data){let project=data.cloudaicompanionProject;if(project)return typeof project==`string`?project.trim()?project:void 0:(typeof project.id==`string`?project.id.trim():void 0)||void 0}function extractModelQuotas(data){let result=new Map;if(!data.models||typeof data.models!=`object`)return result;for(let[modelId,modelInfo]of Object.entries(data.models)){let quotaInfo=modelInfo.quotaInfo;if(!quotaInfo)continue;let remainingFraction=parseNumber(quotaInfo.remainingFraction);if(remainingFraction===void 0)continue;let resetTime=parseEpochMs(quotaInfo.resetTime);result.set(modelId,{remainingFraction,resetTime})}return result}function buildUsageWindows(opts){let windows=[];if(opts.credits){let{available,monthly}=opts.credits,usedPercent=clampPercent((monthly-available)/monthly*100);windows.push({label:`Credits`,usedPercent})}if(opts.modelQuotas&&opts.modelQuotas.size>0){let modelWindows=[];for(let[modelId,quota]of opts.modelQuotas){let lowerModelId=modelId.toLowerCase();if(lowerModelId.includes(`chat_`)||lowerModelId.includes(`tab_`))continue;let window={label:modelId,usedPercent:clampPercent((1-quota.remainingFraction)*100)};quota.resetTime&&(window.resetAt=quota.resetTime),modelWindows.push(window)}modelWindows.sort((a,b)=>b.usedPercent-a.usedPercent);let topModels=modelWindows.slice(0,10);logDebug(`[antigravity] Built ${topModels.length} model windows from ${opts.modelQuotas.size} total models`);for(let w of topModels)logDebug(`[antigravity] ${w.label}: ${w.usedPercent.toFixed(1)}% used${w.resetAt?` (resets at ${new Date(w.resetAt).toISOString()})`:``}`);windows.push(...topModels)}return windows}async function fetchAntigravityUsage(token,timeoutMs,fetchFn){let headers={Authorization:`Bearer ${token}`,"Content-Type":`application/json`,"User-Agent":`antigravity`,"X-Goog-Api-Client":`google-cloud-sdk vscode_cloudshelleditor/0.1`},credits,modelQuotas,planInfo,lastError,projectId;try{let res=await fetchJson(`${BASE_URL}/v1internal:loadCodeAssist`,{method:`POST`,headers,body:JSON.stringify({metadata:METADATA})},timeoutMs,fetchFn);if(res.ok){let data=await res.json();projectId=extractProjectId(data),credits=extractCredits(data),planInfo=extractPlanInfo(data),logDebug(`[antigravity] Credits: ${credits?`${credits.available}/${credits.monthly}`:`none`}${planInfo?` (plan: ${planInfo})`:``}`)}else if(lastError=await parseErrorMessage(res),res.status===401)return{provider:`google-antigravity`,displayName:PROVIDER_LABELS[`google-antigravity`],windows:[],error:`Token expired`}}catch{lastError=`Network error`}projectId||logDebug(`[antigravity] Missing project id; requesting available models without project`);try{let body=JSON.stringify(projectId?{project:projectId}:{}),res=await fetchJson(`${BASE_URL}/v1internal:fetchAvailableModels`,{method:`POST`,headers,body},timeoutMs,fetchFn);if(res.ok){modelQuotas=extractModelQuotas(await res.json()),logDebug(`[antigravity] Extracted ${modelQuotas.size} model quotas from API`);for(let[modelId,quota]of modelQuotas)logDebug(`[antigravity] ${modelId}: ${(quota.remainingFraction*100).toFixed(1)}% remaining${quota.resetTime?` (resets ${new Date(quota.resetTime).toISOString()})`:``}`)}else{let err=await parseErrorMessage(res);res.status===401?lastError=`Token expired`:lastError||=err}}catch{lastError||=`Network error`}let windows=buildUsageWindows({credits,modelQuotas});if(windows.length===0&&lastError)return logDebug(`[antigravity] Returning error snapshot: ${lastError}`),{provider:`google-antigravity`,displayName:PROVIDER_LABELS[`google-antigravity`],windows:[],error:lastError};let snapshot={provider:`google-antigravity`,displayName:PROVIDER_LABELS[`google-antigravity`],windows,plan:planInfo};return logDebug(`[antigravity] Returning snapshot with ${windows.length} windows${planInfo?` (plan: ${planInfo})`:``}`),logDebug(`[antigravity] Snapshot: ${JSON.stringify(snapshot,null,2)}`),snapshot}function buildClaudeUsageWindows(data){let windows=[];data.five_hour?.utilization!==void 0&&windows.push({label:`5h`,usedPercent:clampPercent(data.five_hour.utilization),resetAt:data.five_hour.resets_at?new Date(data.five_hour.resets_at).getTime():void 0}),data.seven_day?.utilization!==void 0&&windows.push({label:`Week`,usedPercent:clampPercent(data.seven_day.utilization),resetAt:data.seven_day.resets_at?new Date(data.seven_day.resets_at).getTime():void 0});let modelWindow=data.seven_day_sonnet||data.seven_day_opus;return modelWindow?.utilization!==void 0&&windows.push({label:data.seven_day_sonnet?`Sonnet`:`Opus`,usedPercent:clampPercent(modelWindow.utilization)}),windows}function resolveClaudeWebSessionKey(){let direct=process.env.CLAUDE_AI_SESSION_KEY?.trim()??process.env.CLAUDE_WEB_SESSION_KEY?.trim();if(direct?.startsWith(`sk-ant-`))return direct;let cookieHeader=process.env.CLAUDE_WEB_COOKIE?.trim();if(!cookieHeader)return;let value=cookieHeader.replace(/^cookie:\\s*/i,``).match(/(?:^|;\\s*)sessionKey=([^;\\s]+)/i)?.[1]?.trim();return value?.startsWith(`sk-ant-`)?value:void 0}async function fetchClaudeWebUsage(sessionKey,timeoutMs,fetchFn){let headers={Cookie:`sessionKey=${sessionKey}`,Accept:`application/json`},orgRes=await fetchJson(`https://claude.ai/api/organizations`,{headers},timeoutMs,fetchFn);if(!orgRes.ok)return null;let orgId=(await orgRes.json())?.[0]?.uuid?.trim();if(!orgId)return null;let usageRes=await fetchJson(`https://claude.ai/api/organizations/${orgId}/usage`,{headers},timeoutMs,fetchFn);if(!usageRes.ok)return null;let windows=buildClaudeUsageWindows(await usageRes.json());return windows.length===0?null:{provider:`anthropic`,displayName:PROVIDER_LABELS.anthropic,windows}}async function fetchClaudeUsage(token,timeoutMs,fetchFn){let res=await fetchJson(`https://api.anthropic.com/api/oauth/usage`,{headers:{Authorization:`Bearer ${token}`,"User-Agent":`builderforce`,Accept:`application/json`,"anthropic-version":`2023-06-01`,"anthropic-beta":`oauth-2025-04-20`}},timeoutMs,fetchFn);if(!res.ok){let message;try{let raw=(await res.json())?.error?.message;typeof raw==`string`&&raw.trim()&&(message=raw.trim())}catch{}if(res.status===403&&message?.includes(`scope requirement user:profile`)){let sessionKey=resolveClaudeWebSessionKey();if(sessionKey){let web=await fetchClaudeWebUsage(sessionKey,timeoutMs,fetchFn);if(web)return web}}let suffix=message?`: ${message}`:``;return{provider:`anthropic`,displayName:PROVIDER_LABELS.anthropic,windows:[],error:`HTTP ${res.status}${suffix}`}}let windows=buildClaudeUsageWindows(await res.json());return{provider:`anthropic`,displayName:PROVIDER_LABELS.anthropic,windows}}async function fetchCodexUsage(token,accountId,timeoutMs,fetchFn){let headers={Authorization:`Bearer ${token}`,"User-Agent":`CodexBar`,Accept:`application/json`};accountId&&(headers[`ChatGPT-Account-Id`]=accountId);let res=await fetchJson(`https://chatgpt.com/backend-api/wham/usage`,{method:`GET`,headers},timeoutMs,fetchFn);if(res.status===401||res.status===403)return{provider:`openai-codex`,displayName:PROVIDER_LABELS[`openai-codex`],windows:[],error:`Token expired`};if(!res.ok)return{provider:`openai-codex`,displayName:PROVIDER_LABELS[`openai-codex`],windows:[],error:`HTTP ${res.status}`};let data=await res.json(),windows=[];if(data.rate_limit?.primary_window){let pw=data.rate_limit.primary_window,windowHours=Math.round((pw.limit_window_seconds||10800)/3600);windows.push({label:`${windowHours}h`,usedPercent:clampPercent(pw.used_percent||0),resetAt:pw.reset_at?pw.reset_at*1e3:void 0})}if(data.rate_limit?.secondary_window){let sw=data.rate_limit.secondary_window,windowHours=Math.round((sw.limit_window_seconds||86400)/3600),label=windowHours>=24?`Day`:`${windowHours}h`;windows.push({label,usedPercent:clampPercent(sw.used_percent||0),resetAt:sw.reset_at?sw.reset_at*1e3:void 0})}let plan=data.plan_type;if(data.credits?.balance!==void 0&&data.credits.balance!==null){let balance=typeof data.credits.balance==`number`?data.credits.balance:parseFloat(data.credits.balance)||0;plan=plan?`${plan} ($${balance.toFixed(2)})`:`$${balance.toFixed(2)}`}return{provider:`openai-codex`,displayName:PROVIDER_LABELS[`openai-codex`],windows,plan}}async function fetchCopilotUsage(token,timeoutMs,fetchFn){let res=await fetchJson(`https://api.github.com/copilot_internal/user`,{headers:{Authorization:`token ${token}`,"Editor-Version":`vscode/1.96.2`,"User-Agent":`GitHubCopilotChat/0.26.7`,"X-Github-Api-Version":`2025-04-01`}},timeoutMs,fetchFn);if(!res.ok)return{provider:`github-copilot`,displayName:PROVIDER_LABELS[`github-copilot`],windows:[],error:`HTTP ${res.status}`};let data=await res.json(),windows=[];if(data.quota_snapshots?.premium_interactions){let remaining=data.quota_snapshots.premium_interactions.percent_remaining;windows.push({label:`Premium`,usedPercent:clampPercent(100-(remaining??0))})}if(data.quota_snapshots?.chat){let remaining=data.quota_snapshots.chat.percent_remaining;windows.push({label:`Chat`,usedPercent:clampPercent(100-(remaining??0))})}return{provider:`github-copilot`,displayName:PROVIDER_LABELS[`github-copilot`],windows,plan:data.copilot_plan}}async function fetchGeminiUsage(token,timeoutMs,fetchFn,provider){let res=await fetchJson(`https://cloudcode-pa.googleapis.com/v1internal:retrieveUserQuota`,{method:`POST`,headers:{Authorization:`Bearer ${token}`,"Content-Type":`application/json`},body:`{}`},timeoutMs,fetchFn);if(!res.ok)return{provider,displayName:PROVIDER_LABELS[provider],windows:[],error:`HTTP ${res.status}`};let data=await res.json(),quotas={};for(let bucket of data.buckets||[]){let model=bucket.modelId||`unknown`,frac=bucket.remainingFraction??1;(!quotas[model]||frac<quotas[model])&&(quotas[model]=frac)}let windows=[],proMin=1,flashMin=1,hasPro=!1,hasFlash=!1;for(let[model,frac]of Object.entries(quotas)){let lower=model.toLowerCase();lower.includes(`pro`)&&(hasPro=!0,frac<proMin&&(proMin=frac)),lower.includes(`flash`)&&(hasFlash=!0,frac<flashMin&&(flashMin=frac))}return hasPro&&windows.push({label:`Pro`,usedPercent:clampPercent((1-proMin)*100)}),hasFlash&&windows.push({label:`Flash`,usedPercent:clampPercent((1-flashMin)*100)}),{provider,displayName:PROVIDER_LABELS[provider],windows}}const RESET_KEYS=[`reset_at`,`resetAt`,`reset_time`,`resetTime`,`next_reset_at`,`nextResetAt`,`next_reset_time`,`nextResetTime`,`expires_at`,`expiresAt`,`expire_at`,`expireAt`,`end_time`,`endTime`,`window_end`,`windowEnd`],PERCENT_KEYS=[`used_percent`,`usedPercent`,`usage_percent`,`usagePercent`,`used_rate`,`usage_rate`,`used_ratio`,`usage_ratio`,`usedRatio`,`usageRatio`],USED_KEYS=[`used`,`usage`,`used_amount`,`usedAmount`,`used_tokens`,`usedTokens`,`used_quota`,`usedQuota`,`used_times`,`usedTimes`,`prompt_used`,`promptUsed`,`used_prompt`,`usedPrompt`,`prompts_used`,`promptsUsed`,`current_interval_usage_count`,`currentIntervalUsageCount`,`consumed`],TOTAL_KEYS=`total.total_amount.totalAmount.total_tokens.totalTokens.total_quota.totalQuota.total_times.totalTimes.prompt_total.promptTotal.total_prompt.totalPrompt.prompt_limit.promptLimit.limit_prompt.limitPrompt.prompts_total.promptsTotal.total_prompts.totalPrompts.current_interval_total_count.currentIntervalTotalCount.limit.quota.quota_limit.quotaLimit.max`.split(`.`),REMAINING_KEYS=`remain.remaining.remain_amount.remainingAmount.remaining_amount.remain_tokens.remainingTokens.remaining_tokens.remain_quota.remainingQuota.remaining_quota.remain_times.remainingTimes.remaining_times.prompt_remain.promptRemain.remain_prompt.remainPrompt.prompt_remaining.promptRemaining.remaining_prompt.remainingPrompt.prompts_remaining.promptsRemaining.prompt_left.promptLeft.prompts_left.promptsLeft.left`.split(`.`),PLAN_KEYS=[`plan`,`plan_name`,`planName`,`product`,`tier`],WINDOW_HOUR_KEYS=[`window_hours`,`windowHours`,`duration_hours`,`durationHours`,`hours`],WINDOW_MINUTE_KEYS=[`window_minutes`,`windowMinutes`,`duration_minutes`,`durationMinutes`,`minutes`];function pickNumber(record,keys){for(let key of keys){let value=record[key];if(typeof value==`number`&&Number.isFinite(value))return value;if(typeof value==`string`){let parsed=Number.parseFloat(value);if(Number.isFinite(parsed))return parsed}}}function pickString(record,keys){for(let key of keys){let value=record[key];if(typeof value==`string`&&value.trim())return value.trim()}}function parseEpoch(value){if(typeof value==`number`&&Number.isFinite(value))return value<0xe8d4a51000?Math.floor(value*1e3):Math.floor(value);if(typeof value==`string`&&value.trim()){let parsed=Date.parse(value);if(Number.isFinite(parsed))return parsed}}function hasAny(record,keys){return keys.some(key=>key in record)}function scoreUsageRecord(record){let score=0;return hasAny(record,PERCENT_KEYS)&&(score+=4),hasAny(record,TOTAL_KEYS)&&(score+=3),(hasAny(record,USED_KEYS)||hasAny(record,REMAINING_KEYS))&&(score+=2),hasAny(record,RESET_KEYS)&&(score+=1),hasAny(record,PLAN_KEYS)&&(score+=1),score}function collectUsageCandidates(root){let queue=[{value:root,depth:0}],seen=new Set,candidates=[],scanned=0;for(;queue.length&&scanned<60;){let next=queue.shift();if(!next)break;scanned+=1;let{value,depth}=next;if(isRecord(value)){if(seen.has(value))continue;seen.add(value);let score=scoreUsageRecord(value);if(score>0&&candidates.push({record:value,score,depth}),depth<4)for(let nested of Object.values(value))(isRecord(nested)||Array.isArray(nested))&&queue.push({value:nested,depth:depth+1});continue}if(Array.isArray(value)&&depth<4)for(let nested of value)(isRecord(nested)||Array.isArray(nested))&&queue.push({value:nested,depth:depth+1})}return candidates.sort((a,b)=>b.score-a.score||a.depth-b.depth),candidates.map(candidate=>candidate.record)}function deriveWindowLabel(payload){let hours=pickNumber(payload,WINDOW_HOUR_KEYS);if(hours&&Number.isFinite(hours))return`${hours}h`;let minutes=pickNumber(payload,WINDOW_MINUTE_KEYS);return minutes&&Number.isFinite(minutes)?`${minutes}m`:`5h`}function deriveUsedPercent(payload){let total=pickNumber(payload,TOTAL_KEYS),used=pickNumber(payload,USED_KEYS),remaining=pickNumber(payload,REMAINING_KEYS);used===void 0&&remaining!==void 0&&total!==void 0&&(used=total-remaining);let fromCounts=total&&total>0&&used!==void 0&&Number.isFinite(used)?clampPercent(used/total*100):null,percentRaw=pickNumber(payload,PERCENT_KEYS);if(percentRaw!==void 0){let normalized=clampPercent(percentRaw<=1?percentRaw*100:percentRaw);if(fromCounts!==null){let inverted=clampPercent(100-normalized);return Math.abs(normalized-fromCounts)<=1||Math.abs(inverted-fromCounts),fromCounts}return normalized}return fromCounts}async function fetchMinimaxUsage(apiKey,timeoutMs,fetchFn){let res=await fetchJson(`https://api.minimaxi.com/v1/api/openplatform/coding_plan/remains`,{method:`GET`,headers:{Authorization:`Bearer ${apiKey}`,"Content-Type":`application/json`,"MM-API-Source":`BuilderForceAgents`}},timeoutMs,fetchFn);if(!res.ok)return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows:[],error:`HTTP ${res.status}`};let data=await res.json().catch(()=>null);if(!isRecord(data))return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows:[],error:`Invalid JSON`};let baseResp=isRecord(data.base_resp)?data.base_resp:void 0;if(baseResp&&typeof baseResp.status_code==`number`&&baseResp.status_code!==0)return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows:[],error:baseResp.status_msg?.trim()||`API error`};let payload=isRecord(data.data)?data.data:data,candidates=collectUsageCandidates(payload),usageRecord=payload,usedPercent=null;for(let candidate of candidates){let candidatePercent=deriveUsedPercent(candidate);if(candidatePercent!==null){usageRecord=candidate,usedPercent=candidatePercent;break}}if(usedPercent===null&&(usedPercent=deriveUsedPercent(payload)),usedPercent===null)return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows:[],error:`Unsupported response shape`};let resetAt=parseEpoch(pickString(usageRecord,RESET_KEYS))??parseEpoch(pickNumber(usageRecord,RESET_KEYS))??parseEpoch(pickString(payload,RESET_KEYS))??parseEpoch(pickNumber(payload,RESET_KEYS)),windows=[{label:deriveWindowLabel(usageRecord),usedPercent,resetAt}];return{provider:`minimax`,displayName:PROVIDER_LABELS.minimax,windows,plan:pickString(usageRecord,PLAN_KEYS)??pickString(payload,PLAN_KEYS)}}async function fetchZaiUsage(apiKey,timeoutMs,fetchFn){let res=await fetchJson(`https://api.z.ai/api/monitor/usage/quota/limit`,{method:`GET`,headers:{Authorization:`Bearer ${apiKey}`,Accept:`application/json`}},timeoutMs,fetchFn);if(!res.ok)return{provider:`zai`,displayName:PROVIDER_LABELS.zai,windows:[],error:`HTTP ${res.status}`};let data=await res.json();if(!data.success||data.code!==200)return{provider:`zai`,displayName:PROVIDER_LABELS.zai,windows:[],error:data.msg||`API error`};let windows=[],limits=data.data?.limits||[];for(let limit of limits){let percent=clampPercent(limit.percentage||0),nextReset=limit.nextResetTime?new Date(limit.nextResetTime).getTime():void 0,windowLabel=`Limit`;limit.unit===1?windowLabel=`${limit.number}d`:limit.unit===3?windowLabel=`${limit.number}h`:limit.unit===5&&(windowLabel=`${limit.number}m`),limit.type===`TOKENS_LIMIT`?windows.push({label:`Tokens (${windowLabel})`,usedPercent:percent,resetAt:nextReset}):limit.type===`TIME_LIMIT`&&windows.push({label:`Monthly`,usedPercent:percent,resetAt:nextReset})}let planName=data.data?.planName||data.data?.plan||void 0;return{provider:`zai`,displayName:PROVIDER_LABELS.zai,windows,plan:planName}}async function loadProviderUsageSummary(opts={}){let now=opts.now??Date.now(),timeoutMs=opts.timeoutMs??5e3,fetchFn=resolveFetch(opts.fetch);if(!fetchFn)throw Error(`fetch is not available`);let auths=await resolveProviderAuths({providers:opts.providers??usageProviders,auth:opts.auth,agentDir:opts.agentDir});if(auths.length===0)return{updatedAt:now,providers:[]};let tasks=auths.map(auth=>withTimeout((async()=>{switch(auth.provider){case`anthropic`:return await fetchClaudeUsage(auth.token,timeoutMs,fetchFn);case`github-copilot`:return await fetchCopilotUsage(auth.token,timeoutMs,fetchFn);case`google-antigravity`:return await fetchAntigravityUsage(auth.token,timeoutMs,fetchFn);case`google-gemini-cli`:return await fetchGeminiUsage(auth.token,timeoutMs,fetchFn,auth.provider);case`openai-codex`:return await fetchCodexUsage(auth.token,auth.accountId,timeoutMs,fetchFn);case`minimax`:return await fetchMinimaxUsage(auth.token,timeoutMs,fetchFn);case`xiaomi`:return{provider:`xiaomi`,displayName:PROVIDER_LABELS.xiaomi,windows:[]};case`zai`:return await fetchZaiUsage(auth.token,timeoutMs,fetchFn);default:return{provider:auth.provider,displayName:PROVIDER_LABELS[auth.provider],windows:[],error:`Unsupported provider`}}})(),timeoutMs+1e3,{provider:auth.provider,displayName:PROVIDER_LABELS[auth.provider],windows:[],error:`Timeout`}));return{updatedAt:now,providers:(await Promise.all(tasks)).filter(entry=>entry.windows.length>0||!entry.error?!0:!ignoredErrors.has(entry.error))}}export{resolveUsageProviderId as i,formatUsageReportLines as n,formatUsageWindowSummary as r,loadProviderUsageSummary as t};
@@ -1,2 +1,2 @@
1
- import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{A as isVerbose}from"./utils-DbaBVFaK.js";import{Ci as estimateBase64DecodedBytes,cn as writeJsonAtomic,on as createAsyncLock,sn as readJsonFile,x as sniffMimeFromBase64}from"./reply-Cd3vVnD7.js";import{C as parseAgentSessionKey}from"./session-key-EoB0qaG9.js";import{l as shouldLogSubsystemToConsole,t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{n as redactSensitiveText,t as getDefaultRedactPatterns}from"./redact-BHdfp2MZ.js";import path from"node:path";import{createHash,createPrivateKey,sign}from"node:crypto";import chalk from"chalk";import fs from"node:fs/promises";import http2 from"node:http2";let gatewayWsLogStyle=`auto`;function setGatewayWsLogStyle(style){gatewayWsLogStyle=style}function getGatewayWsLogStyle(){return gatewayWsLogStyle}const UUID_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,WS_LOG_REDACT_OPTIONS={mode:`tools`,patterns:getDefaultRedactPatterns()},wsInflightCompact=new Map;let wsLastCompactConnId;const wsInflightOptimized=new Map,wsInflightSince=new Map,wsLog=createSubsystemLogger(`gateway/ws`),WS_META_SKIP_KEYS=new Set([`connId`,`id`,`method`,`ok`,`event`]);function collectWsRestMeta(meta){let restMeta=[];if(!meta)return restMeta;for(let[key,value]of Object.entries(meta))value!==void 0&&(WS_META_SKIP_KEYS.has(key)||restMeta.push(`${chalk.dim(key)}=${formatForLog(value)}`));return restMeta}function buildWsHeadline(params){if((params.kind===`req`||params.kind===`res`)&&params.method)return chalk.bold(params.method);if(params.kind===`event`&&params.event)return chalk.bold(params.event)}function buildWsStatusToken(kind,ok){if(!(kind!==`res`||ok===void 0))return ok?chalk.greenBright(`✓`):chalk.redBright(`✗`)}function logWsInfoLine(params){let tokens=[params.prefix,params.statusToken,params.headline,params.durationToken,...params.restMeta,...params.trailing].filter(t=>!!t);wsLog.info(tokens.join(` `))}function shouldLogWs(){return shouldLogSubsystemToConsole(`gateway/ws`)}function shortId(value){let s=value.trim();return UUID_RE.test(s)?`${s.slice(0,8)}…${s.slice(-4)}`:s.length<=24?s:`${s.slice(0,12)}…${s.slice(-4)}`}function formatForLog(value){try{if(value instanceof Error){let parts=[];value.name&&parts.push(value.name),value.message&&parts.push(value.message);let code=`code`in value&&(typeof value.code==`string`||typeof value.code==`number`)?String(value.code):``;code&&parts.push(`code=${code}`);let combined=parts.filter(Boolean).join(`: `).trim();if(combined)return combined.length>240?`${combined.slice(0,240)}...`:combined}if(value&&typeof value==`object`){let rec=value;if(typeof rec.message==`string`&&rec.message.trim()){let name=typeof rec.name==`string`?rec.name.trim():``,code=typeof rec.code==`string`||typeof rec.code==`number`?String(rec.code):``,parts=[name,rec.message.trim()].filter(Boolean);code&&parts.push(`code=${code}`);let combined=parts.join(`: `).trim();return combined.length>240?`${combined.slice(0,240)}...`:combined}}let str=typeof value==`string`||typeof value==`number`?String(value):JSON.stringify(value);if(!str)return``;let redacted=redactSensitiveText(str,WS_LOG_REDACT_OPTIONS);return redacted.length>240?`${redacted.slice(0,240)}...`:redacted}catch{return String(value)}}function compactPreview(input,maxLen=160){let oneLine=input.replace(/\s+/g,` `).trim();return oneLine.length<=maxLen?oneLine:`${oneLine.slice(0,Math.max(0,maxLen-1))}…`}function summarizeAgentEventForWsLog(payload){if(!payload||typeof payload!=`object`)return{};let rec=payload,runId=typeof rec.runId==`string`?rec.runId:void 0,stream=typeof rec.stream==`string`?rec.stream:void 0,seq=typeof rec.seq==`number`?rec.seq:void 0,sessionKey=typeof rec.sessionKey==`string`?rec.sessionKey:void 0,data=rec.data&&typeof rec.data==`object`?rec.data:void 0,extra={};if(runId&&(extra.run=shortId(runId)),sessionKey){let parsed=parseAgentSessionKey(sessionKey);parsed?(extra.agent=parsed.agentId,extra.session=parsed.rest):extra.session=sessionKey}if(stream&&(extra.stream=stream),seq!==void 0&&(extra.aseq=seq),!data)return extra;if(stream===`assistant`){let text=typeof data.text==`string`?data.text:void 0;text?.trim()&&(extra.text=compactPreview(text));let mediaUrls=Array.isArray(data.mediaUrls)?data.mediaUrls:void 0;return mediaUrls&&mediaUrls.length>0&&(extra.media=mediaUrls.length),extra}if(stream===`tool`){let phase=typeof data.phase==`string`?data.phase:void 0,name=typeof data.name==`string`?data.name:void 0;(phase||name)&&(extra.tool=`${phase??`?`}:${name??`?`}`);let toolCallId=typeof data.toolCallId==`string`?data.toolCallId:void 0;toolCallId&&(extra.call=shortId(toolCallId));let meta=typeof data.meta==`string`?data.meta:void 0;return meta?.trim()&&(extra.meta=meta),typeof data.isError==`boolean`&&(extra.err=data.isError),extra}if(stream===`lifecycle`){let phase=typeof data.phase==`string`?data.phase:void 0;phase&&(extra.phase=phase),typeof data.aborted==`boolean`&&(extra.aborted=data.aborted);let error=typeof data.error==`string`?data.error:void 0;return error?.trim()&&(extra.error=compactPreview(error,120)),extra}let reason=typeof data.reason==`string`?data.reason:void 0;return reason?.trim()&&(extra.reason=reason),extra}function logWs(direction,kind,meta){if(!shouldLogSubsystemToConsole(`gateway/ws`))return;let style=getGatewayWsLogStyle();if(!isVerbose()){logWsOptimized(direction,kind,meta);return}if(style===`compact`||style===`auto`){logWsCompact(direction,kind,meta);return}let now=Date.now(),connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,method=typeof meta?.method==`string`?meta.method:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,event=typeof meta?.event==`string`?meta.event:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;direction===`in`&&kind===`req`&&inflightKey&&wsInflightSince.set(inflightKey,now);let durationMs=direction===`out`&&kind===`res`&&inflightKey?(()=>{let startedAt=wsInflightSince.get(inflightKey);if(startedAt!==void 0)return wsInflightSince.delete(inflightKey),now-startedAt})():void 0,dirArrow=direction===`in`?`←`:`→`,prefix=`${(direction===`in`?chalk.greenBright:chalk.cyanBright)(dirArrow)} ${chalk.bold(kind)}`,headline=buildWsHeadline({kind,method,event}),statusToken=buildWsStatusToken(kind,ok),durationToken=typeof durationMs==`number`?chalk.dim(`${durationMs}ms`):void 0,restMeta=collectWsRestMeta(meta),trailing=[];connId&&trailing.push(`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`),id&&trailing.push(`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`),logWsInfoLine({prefix,statusToken,headline,durationToken,restMeta,trailing})}function logWsOptimized(direction,kind,meta){let connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,method=typeof meta?.method==`string`?meta.method:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;if(direction===`in`&&kind===`req`&&inflightKey){wsInflightOptimized.set(inflightKey,Date.now()),wsInflightOptimized.size>2e3&&wsInflightOptimized.clear();return}if(kind===`parse-error`){let errorMsg=typeof meta?.error==`string`?formatForLog(meta.error):void 0;wsLog.warn([`${chalk.redBright(`✗`)} ${chalk.bold(`parse-error`)}`,errorMsg?`${chalk.dim(`error`)}=${errorMsg}`:void 0,`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId??`?`))}`].filter(t=>!!t).join(` `));return}if(direction!==`out`||kind!==`res`){if(kind===`event`&&direction===`out`&&(typeof meta?.event==`string`?meta.event:void 0)===`agent`){let stream=typeof meta?.stream==`string`?meta.stream:void 0,tool=typeof meta?.tool==`string`?meta.tool:void 0,phase=typeof meta?.phase==`string`?meta.phase:void 0,run=typeof meta?.run==`string`?meta.run:void 0,agent=typeof meta?.agent==`string`?meta.agent:void 0,tokens=[`${chalk.cyanBright(`→`)} ${chalk.bold(`agent`)}`,stream?`${chalk.dim(`stream`)}=${stream}`:void 0,tool?`${chalk.dim(`tool`)}=${tool}`:void 0,phase?`${chalk.dim(`phase`)}=${phase}`:void 0,agent?`${chalk.dim(`agent`)}=${agent}`:void 0,run?`${chalk.dim(`run`)}=${chalk.gray(run)}`:void 0].filter(t=>!!t);wsLog.info(tokens.join(` `))}return}let startedAt=inflightKey?wsInflightOptimized.get(inflightKey):void 0;inflightKey&&wsInflightOptimized.delete(inflightKey);let durationMs=typeof startedAt==`number`?Date.now()-startedAt:void 0;if(!(ok===!1||typeof durationMs==`number`&&durationMs>=50))return;let statusToken=buildWsStatusToken(`res`,ok),durationToken=typeof durationMs==`number`?chalk.dim(`${durationMs}ms`):void 0,restMeta=collectWsRestMeta(meta);logWsInfoLine({prefix:`${chalk.yellowBright(`⇄`)} ${chalk.bold(`res`)}`,statusToken,headline:method?chalk.bold(method):void 0,durationToken,restMeta,trailing:[connId?`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`:``,id?`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`:``].filter(Boolean)})}function logWsCompact(direction,kind,meta){let now=Date.now(),connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,method=typeof meta?.method==`string`?meta.method:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;if(kind===`req`&&direction===`in`&&inflightKey){wsInflightCompact.set(inflightKey,{ts:now,method,meta});return}let compactArrow=kind===`req`||kind===`res`?`⇄`:direction===`in`?`←`:`→`,prefix=`${(kind===`req`||kind===`res`?chalk.yellowBright:direction===`in`?chalk.greenBright:chalk.cyanBright)(compactArrow)} ${chalk.bold(kind)}`,statusToken=buildWsStatusToken(kind,ok),startedAt=kind===`res`&&direction===`out`&&inflightKey?wsInflightCompact.get(inflightKey)?.ts:void 0;kind===`res`&&direction===`out`&&inflightKey&&wsInflightCompact.delete(inflightKey);let durationToken=typeof startedAt==`number`?chalk.dim(`${now-startedAt}ms`):void 0,headline=buildWsHeadline({kind,method,event:typeof meta?.event==`string`?meta.event:void 0}),restMeta=collectWsRestMeta(meta),trailing=[];connId&&connId!==wsLastCompactConnId&&(trailing.push(`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`),wsLastCompactConnId=connId),id&&trailing.push(`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`),logWsInfoLine({prefix,statusToken,headline,durationToken,restMeta,trailing})}function normalizeMime(mime){if(mime)return mime.split(`;`)[0]?.trim().toLowerCase()||void 0}function isImageMime(mime){return typeof mime==`string`&&mime.startsWith(`image/`)}function isValidBase64(value){return value.length>0&&value.length%4==0&&/^[A-Za-z0-9+/]+={0,2}$/.test(value)}function normalizeAttachment(att,idx,opts){let mime=att.mimeType??``,content=att.content,label=att.fileName||att.type||`attachment-${idx+1}`;if(typeof content!=`string`)throw Error(`attachment ${label}: content must be base64 string`);if(opts.requireImageMime&&!mime.startsWith(`image/`))throw Error(`attachment ${label}: only image/* supported`);let base64=content.trim();if(opts.stripDataUrlPrefix){let dataUrlMatch=/^data:[^;]+;base64,(.*)$/.exec(base64);dataUrlMatch&&(base64=dataUrlMatch[1])}return{label,mime,base64}}function validateAttachmentBase64OrThrow(normalized,opts){if(!isValidBase64(normalized.base64))throw Error(`attachment ${normalized.label}: invalid base64 content`);let sizeBytes=estimateBase64DecodedBytes(normalized.base64);if(sizeBytes<=0||sizeBytes>opts.maxBytes)throw Error(`attachment ${normalized.label}: exceeds size limit (${sizeBytes} > ${opts.maxBytes} bytes)`);return sizeBytes}async function parseMessageWithAttachments(message,attachments,opts){let maxBytes=opts?.maxBytes??5e6,log=opts?.log;if(!attachments||attachments.length===0)return{message,images:[]};let images=[];for(let[idx,att]of attachments.entries()){if(!att)continue;let normalized=normalizeAttachment(att,idx,{stripDataUrlPrefix:!0,requireImageMime:!1});validateAttachmentBase64OrThrow(normalized,{maxBytes});let{base64:b64,label,mime}=normalized,providedMime=normalizeMime(mime),sniffedMime=normalizeMime(await sniffMimeFromBase64(b64));if(sniffedMime&&!isImageMime(sniffedMime)){log?.warn(`attachment ${label}: detected non-image (${sniffedMime}), dropping`);continue}if(!sniffedMime&&!isImageMime(providedMime)){log?.warn(`attachment ${label}: unable to detect image mime type, dropping`);continue}sniffedMime&&providedMime&&sniffedMime!==providedMime&&log?.warn(`attachment ${label}: mime mismatch (${providedMime} -> ${sniffedMime}), using sniffed`),images.push({type:`image`,data:b64,mimeType:sniffedMime??providedMime??mime})}return{message,images}}function normalizeRpcAttachmentsToChatAttachments(attachments){return attachments?.map(a=>({type:typeof a?.type==`string`?a.type:void 0,mimeType:typeof a?.mimeType==`string`?a.mimeType:void 0,fileName:typeof a?.fileName==`string`?a.fileName:void 0,content:typeof a?.content==`string`?a.content:ArrayBuffer.isView(a?.content)?Buffer.from(a.content.buffer,a.content.byteOffset,a.content.byteLength).toString(`base64`):a?.content instanceof ArrayBuffer?Buffer.from(a.content).toString(`base64`):void 0})).filter(a=>a.content)??[]}const withLock=createAsyncLock();let cachedJwt=null;function resolveApnsRegistrationPath(baseDir){let root=baseDir??resolveStateDir();return path.join(root,`push/apns-registrations.json`)}function normalizeNodeId(value){return value.trim()}function normalizeApnsToken(value){return value.trim().replace(/[<>\s]/g,``).toLowerCase()}function normalizeTopic(value){return value.trim()}function isLikelyApnsToken(value){return/^[0-9a-f]{32,}$/i.test(value)}function parseReason(body){let trimmed=body.trim();if(trimmed)try{let parsed=JSON.parse(trimmed);return typeof parsed.reason==`string`&&parsed.reason.trim().length>0?parsed.reason.trim():trimmed.slice(0,200)}catch{return trimmed.slice(0,200)}}function toBase64UrlBytes(value){return Buffer.from(value).toString(`base64`).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/g,``)}function toBase64UrlJson(value){return toBase64UrlBytes(Buffer.from(JSON.stringify(value)))}function getJwtCacheKey(auth){let keyHash=createHash(`sha256`).update(auth.privateKey).digest(`hex`);return`${auth.teamId}:${auth.keyId}:${keyHash}`}function getApnsBearerToken(auth,nowMs=Date.now()){let cacheKey=getJwtCacheKey(auth);if(cachedJwt&&cachedJwt.cacheKey===cacheKey&&nowMs<cachedJwt.expiresAtMs)return cachedJwt.token;let iat=Math.floor(nowMs/1e3),signingInput=`${toBase64UrlJson({alg:`ES256`,kid:auth.keyId,typ:`JWT`})}.${toBase64UrlJson({iss:auth.teamId,iat})}`,token=`${signingInput}.${toBase64UrlBytes(sign(`sha256`,Buffer.from(signingInput,`utf8`),{key:createPrivateKey(auth.privateKey),dsaEncoding:`ieee-p1363`}))}`;return cachedJwt={cacheKey,token,expiresAtMs:nowMs+3e6},token}function normalizePrivateKey(value){return value.trim().replace(/\\n/g,`
1
+ import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{A as isVerbose}from"./utils-DbaBVFaK.js";import{Ci as estimateBase64DecodedBytes,cn as writeJsonAtomic,on as createAsyncLock,sn as readJsonFile,x as sniffMimeFromBase64}from"./reply-GY1C8tcv.js";import{C as parseAgentSessionKey}from"./session-key-EoB0qaG9.js";import{l as shouldLogSubsystemToConsole,t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{n as redactSensitiveText,t as getDefaultRedactPatterns}from"./redact-BHdfp2MZ.js";import path from"node:path";import{createHash,createPrivateKey,sign}from"node:crypto";import chalk from"chalk";import fs from"node:fs/promises";import http2 from"node:http2";let gatewayWsLogStyle=`auto`;function setGatewayWsLogStyle(style){gatewayWsLogStyle=style}function getGatewayWsLogStyle(){return gatewayWsLogStyle}const UUID_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,WS_LOG_REDACT_OPTIONS={mode:`tools`,patterns:getDefaultRedactPatterns()},wsInflightCompact=new Map;let wsLastCompactConnId;const wsInflightOptimized=new Map,wsInflightSince=new Map,wsLog=createSubsystemLogger(`gateway/ws`),WS_META_SKIP_KEYS=new Set([`connId`,`id`,`method`,`ok`,`event`]);function collectWsRestMeta(meta){let restMeta=[];if(!meta)return restMeta;for(let[key,value]of Object.entries(meta))value!==void 0&&(WS_META_SKIP_KEYS.has(key)||restMeta.push(`${chalk.dim(key)}=${formatForLog(value)}`));return restMeta}function buildWsHeadline(params){if((params.kind===`req`||params.kind===`res`)&&params.method)return chalk.bold(params.method);if(params.kind===`event`&&params.event)return chalk.bold(params.event)}function buildWsStatusToken(kind,ok){if(!(kind!==`res`||ok===void 0))return ok?chalk.greenBright(`✓`):chalk.redBright(`✗`)}function logWsInfoLine(params){let tokens=[params.prefix,params.statusToken,params.headline,params.durationToken,...params.restMeta,...params.trailing].filter(t=>!!t);wsLog.info(tokens.join(` `))}function shouldLogWs(){return shouldLogSubsystemToConsole(`gateway/ws`)}function shortId(value){let s=value.trim();return UUID_RE.test(s)?`${s.slice(0,8)}…${s.slice(-4)}`:s.length<=24?s:`${s.slice(0,12)}…${s.slice(-4)}`}function formatForLog(value){try{if(value instanceof Error){let parts=[];value.name&&parts.push(value.name),value.message&&parts.push(value.message);let code=`code`in value&&(typeof value.code==`string`||typeof value.code==`number`)?String(value.code):``;code&&parts.push(`code=${code}`);let combined=parts.filter(Boolean).join(`: `).trim();if(combined)return combined.length>240?`${combined.slice(0,240)}...`:combined}if(value&&typeof value==`object`){let rec=value;if(typeof rec.message==`string`&&rec.message.trim()){let name=typeof rec.name==`string`?rec.name.trim():``,code=typeof rec.code==`string`||typeof rec.code==`number`?String(rec.code):``,parts=[name,rec.message.trim()].filter(Boolean);code&&parts.push(`code=${code}`);let combined=parts.join(`: `).trim();return combined.length>240?`${combined.slice(0,240)}...`:combined}}let str=typeof value==`string`||typeof value==`number`?String(value):JSON.stringify(value);if(!str)return``;let redacted=redactSensitiveText(str,WS_LOG_REDACT_OPTIONS);return redacted.length>240?`${redacted.slice(0,240)}...`:redacted}catch{return String(value)}}function compactPreview(input,maxLen=160){let oneLine=input.replace(/\s+/g,` `).trim();return oneLine.length<=maxLen?oneLine:`${oneLine.slice(0,Math.max(0,maxLen-1))}…`}function summarizeAgentEventForWsLog(payload){if(!payload||typeof payload!=`object`)return{};let rec=payload,runId=typeof rec.runId==`string`?rec.runId:void 0,stream=typeof rec.stream==`string`?rec.stream:void 0,seq=typeof rec.seq==`number`?rec.seq:void 0,sessionKey=typeof rec.sessionKey==`string`?rec.sessionKey:void 0,data=rec.data&&typeof rec.data==`object`?rec.data:void 0,extra={};if(runId&&(extra.run=shortId(runId)),sessionKey){let parsed=parseAgentSessionKey(sessionKey);parsed?(extra.agent=parsed.agentId,extra.session=parsed.rest):extra.session=sessionKey}if(stream&&(extra.stream=stream),seq!==void 0&&(extra.aseq=seq),!data)return extra;if(stream===`assistant`){let text=typeof data.text==`string`?data.text:void 0;text?.trim()&&(extra.text=compactPreview(text));let mediaUrls=Array.isArray(data.mediaUrls)?data.mediaUrls:void 0;return mediaUrls&&mediaUrls.length>0&&(extra.media=mediaUrls.length),extra}if(stream===`tool`){let phase=typeof data.phase==`string`?data.phase:void 0,name=typeof data.name==`string`?data.name:void 0;(phase||name)&&(extra.tool=`${phase??`?`}:${name??`?`}`);let toolCallId=typeof data.toolCallId==`string`?data.toolCallId:void 0;toolCallId&&(extra.call=shortId(toolCallId));let meta=typeof data.meta==`string`?data.meta:void 0;return meta?.trim()&&(extra.meta=meta),typeof data.isError==`boolean`&&(extra.err=data.isError),extra}if(stream===`lifecycle`){let phase=typeof data.phase==`string`?data.phase:void 0;phase&&(extra.phase=phase),typeof data.aborted==`boolean`&&(extra.aborted=data.aborted);let error=typeof data.error==`string`?data.error:void 0;return error?.trim()&&(extra.error=compactPreview(error,120)),extra}let reason=typeof data.reason==`string`?data.reason:void 0;return reason?.trim()&&(extra.reason=reason),extra}function logWs(direction,kind,meta){if(!shouldLogSubsystemToConsole(`gateway/ws`))return;let style=getGatewayWsLogStyle();if(!isVerbose()){logWsOptimized(direction,kind,meta);return}if(style===`compact`||style===`auto`){logWsCompact(direction,kind,meta);return}let now=Date.now(),connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,method=typeof meta?.method==`string`?meta.method:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,event=typeof meta?.event==`string`?meta.event:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;direction===`in`&&kind===`req`&&inflightKey&&wsInflightSince.set(inflightKey,now);let durationMs=direction===`out`&&kind===`res`&&inflightKey?(()=>{let startedAt=wsInflightSince.get(inflightKey);if(startedAt!==void 0)return wsInflightSince.delete(inflightKey),now-startedAt})():void 0,dirArrow=direction===`in`?`←`:`→`,prefix=`${(direction===`in`?chalk.greenBright:chalk.cyanBright)(dirArrow)} ${chalk.bold(kind)}`,headline=buildWsHeadline({kind,method,event}),statusToken=buildWsStatusToken(kind,ok),durationToken=typeof durationMs==`number`?chalk.dim(`${durationMs}ms`):void 0,restMeta=collectWsRestMeta(meta),trailing=[];connId&&trailing.push(`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`),id&&trailing.push(`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`),logWsInfoLine({prefix,statusToken,headline,durationToken,restMeta,trailing})}function logWsOptimized(direction,kind,meta){let connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,method=typeof meta?.method==`string`?meta.method:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;if(direction===`in`&&kind===`req`&&inflightKey){wsInflightOptimized.set(inflightKey,Date.now()),wsInflightOptimized.size>2e3&&wsInflightOptimized.clear();return}if(kind===`parse-error`){let errorMsg=typeof meta?.error==`string`?formatForLog(meta.error):void 0;wsLog.warn([`${chalk.redBright(`✗`)} ${chalk.bold(`parse-error`)}`,errorMsg?`${chalk.dim(`error`)}=${errorMsg}`:void 0,`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId??`?`))}`].filter(t=>!!t).join(` `));return}if(direction!==`out`||kind!==`res`){if(kind===`event`&&direction===`out`&&(typeof meta?.event==`string`?meta.event:void 0)===`agent`){let stream=typeof meta?.stream==`string`?meta.stream:void 0,tool=typeof meta?.tool==`string`?meta.tool:void 0,phase=typeof meta?.phase==`string`?meta.phase:void 0,run=typeof meta?.run==`string`?meta.run:void 0,agent=typeof meta?.agent==`string`?meta.agent:void 0,tokens=[`${chalk.cyanBright(`→`)} ${chalk.bold(`agent`)}`,stream?`${chalk.dim(`stream`)}=${stream}`:void 0,tool?`${chalk.dim(`tool`)}=${tool}`:void 0,phase?`${chalk.dim(`phase`)}=${phase}`:void 0,agent?`${chalk.dim(`agent`)}=${agent}`:void 0,run?`${chalk.dim(`run`)}=${chalk.gray(run)}`:void 0].filter(t=>!!t);wsLog.info(tokens.join(` `))}return}let startedAt=inflightKey?wsInflightOptimized.get(inflightKey):void 0;inflightKey&&wsInflightOptimized.delete(inflightKey);let durationMs=typeof startedAt==`number`?Date.now()-startedAt:void 0;if(!(ok===!1||typeof durationMs==`number`&&durationMs>=50))return;let statusToken=buildWsStatusToken(`res`,ok),durationToken=typeof durationMs==`number`?chalk.dim(`${durationMs}ms`):void 0,restMeta=collectWsRestMeta(meta);logWsInfoLine({prefix:`${chalk.yellowBright(`⇄`)} ${chalk.bold(`res`)}`,statusToken,headline:method?chalk.bold(method):void 0,durationToken,restMeta,trailing:[connId?`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`:``,id?`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`:``].filter(Boolean)})}function logWsCompact(direction,kind,meta){let now=Date.now(),connId=typeof meta?.connId==`string`?meta.connId:void 0,id=typeof meta?.id==`string`?meta.id:void 0,method=typeof meta?.method==`string`?meta.method:void 0,ok=typeof meta?.ok==`boolean`?meta.ok:void 0,inflightKey=connId&&id?`${connId}:${id}`:void 0;if(kind===`req`&&direction===`in`&&inflightKey){wsInflightCompact.set(inflightKey,{ts:now,method,meta});return}let compactArrow=kind===`req`||kind===`res`?`⇄`:direction===`in`?`←`:`→`,prefix=`${(kind===`req`||kind===`res`?chalk.yellowBright:direction===`in`?chalk.greenBright:chalk.cyanBright)(compactArrow)} ${chalk.bold(kind)}`,statusToken=buildWsStatusToken(kind,ok),startedAt=kind===`res`&&direction===`out`&&inflightKey?wsInflightCompact.get(inflightKey)?.ts:void 0;kind===`res`&&direction===`out`&&inflightKey&&wsInflightCompact.delete(inflightKey);let durationToken=typeof startedAt==`number`?chalk.dim(`${now-startedAt}ms`):void 0,headline=buildWsHeadline({kind,method,event:typeof meta?.event==`string`?meta.event:void 0}),restMeta=collectWsRestMeta(meta),trailing=[];connId&&connId!==wsLastCompactConnId&&(trailing.push(`${chalk.dim(`conn`)}=${chalk.gray(shortId(connId))}`),wsLastCompactConnId=connId),id&&trailing.push(`${chalk.dim(`id`)}=${chalk.gray(shortId(id))}`),logWsInfoLine({prefix,statusToken,headline,durationToken,restMeta,trailing})}function normalizeMime(mime){if(mime)return mime.split(`;`)[0]?.trim().toLowerCase()||void 0}function isImageMime(mime){return typeof mime==`string`&&mime.startsWith(`image/`)}function isValidBase64(value){return value.length>0&&value.length%4==0&&/^[A-Za-z0-9+/]+={0,2}$/.test(value)}function normalizeAttachment(att,idx,opts){let mime=att.mimeType??``,content=att.content,label=att.fileName||att.type||`attachment-${idx+1}`;if(typeof content!=`string`)throw Error(`attachment ${label}: content must be base64 string`);if(opts.requireImageMime&&!mime.startsWith(`image/`))throw Error(`attachment ${label}: only image/* supported`);let base64=content.trim();if(opts.stripDataUrlPrefix){let dataUrlMatch=/^data:[^;]+;base64,(.*)$/.exec(base64);dataUrlMatch&&(base64=dataUrlMatch[1])}return{label,mime,base64}}function validateAttachmentBase64OrThrow(normalized,opts){if(!isValidBase64(normalized.base64))throw Error(`attachment ${normalized.label}: invalid base64 content`);let sizeBytes=estimateBase64DecodedBytes(normalized.base64);if(sizeBytes<=0||sizeBytes>opts.maxBytes)throw Error(`attachment ${normalized.label}: exceeds size limit (${sizeBytes} > ${opts.maxBytes} bytes)`);return sizeBytes}async function parseMessageWithAttachments(message,attachments,opts){let maxBytes=opts?.maxBytes??5e6,log=opts?.log;if(!attachments||attachments.length===0)return{message,images:[]};let images=[];for(let[idx,att]of attachments.entries()){if(!att)continue;let normalized=normalizeAttachment(att,idx,{stripDataUrlPrefix:!0,requireImageMime:!1});validateAttachmentBase64OrThrow(normalized,{maxBytes});let{base64:b64,label,mime}=normalized,providedMime=normalizeMime(mime),sniffedMime=normalizeMime(await sniffMimeFromBase64(b64));if(sniffedMime&&!isImageMime(sniffedMime)){log?.warn(`attachment ${label}: detected non-image (${sniffedMime}), dropping`);continue}if(!sniffedMime&&!isImageMime(providedMime)){log?.warn(`attachment ${label}: unable to detect image mime type, dropping`);continue}sniffedMime&&providedMime&&sniffedMime!==providedMime&&log?.warn(`attachment ${label}: mime mismatch (${providedMime} -> ${sniffedMime}), using sniffed`),images.push({type:`image`,data:b64,mimeType:sniffedMime??providedMime??mime})}return{message,images}}function normalizeRpcAttachmentsToChatAttachments(attachments){return attachments?.map(a=>({type:typeof a?.type==`string`?a.type:void 0,mimeType:typeof a?.mimeType==`string`?a.mimeType:void 0,fileName:typeof a?.fileName==`string`?a.fileName:void 0,content:typeof a?.content==`string`?a.content:ArrayBuffer.isView(a?.content)?Buffer.from(a.content.buffer,a.content.byteOffset,a.content.byteLength).toString(`base64`):a?.content instanceof ArrayBuffer?Buffer.from(a.content).toString(`base64`):void 0})).filter(a=>a.content)??[]}const withLock=createAsyncLock();let cachedJwt=null;function resolveApnsRegistrationPath(baseDir){let root=baseDir??resolveStateDir();return path.join(root,`push/apns-registrations.json`)}function normalizeNodeId(value){return value.trim()}function normalizeApnsToken(value){return value.trim().replace(/[<>\s]/g,``).toLowerCase()}function normalizeTopic(value){return value.trim()}function isLikelyApnsToken(value){return/^[0-9a-f]{32,}$/i.test(value)}function parseReason(body){let trimmed=body.trim();if(trimmed)try{let parsed=JSON.parse(trimmed);return typeof parsed.reason==`string`&&parsed.reason.trim().length>0?parsed.reason.trim():trimmed.slice(0,200)}catch{return trimmed.slice(0,200)}}function toBase64UrlBytes(value){return Buffer.from(value).toString(`base64`).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/g,``)}function toBase64UrlJson(value){return toBase64UrlBytes(Buffer.from(JSON.stringify(value)))}function getJwtCacheKey(auth){let keyHash=createHash(`sha256`).update(auth.privateKey).digest(`hex`);return`${auth.teamId}:${auth.keyId}:${keyHash}`}function getApnsBearerToken(auth,nowMs=Date.now()){let cacheKey=getJwtCacheKey(auth);if(cachedJwt&&cachedJwt.cacheKey===cacheKey&&nowMs<cachedJwt.expiresAtMs)return cachedJwt.token;let iat=Math.floor(nowMs/1e3),signingInput=`${toBase64UrlJson({alg:`ES256`,kid:auth.keyId,typ:`JWT`})}.${toBase64UrlJson({iss:auth.teamId,iat})}`,token=`${signingInput}.${toBase64UrlBytes(sign(`sha256`,Buffer.from(signingInput,`utf8`),{key:createPrivateKey(auth.privateKey),dsaEncoding:`ieee-p1363`}))}`;return cachedJwt={cacheKey,token,expiresAtMs:nowMs+3e6},token}function normalizePrivateKey(value){return value.trim().replace(/\\n/g,`
2
2
  `)}function normalizeNonEmptyString(value){let trimmed=value?.trim()??``;return trimmed.length>0?trimmed:null}async function loadRegistrationsState(baseDir){let existing=await readJsonFile(resolveApnsRegistrationPath(baseDir));return!existing||typeof existing!=`object`?{registrationsByNodeId:{}}:{registrationsByNodeId:existing.registrationsByNodeId&&typeof existing.registrationsByNodeId==`object`&&!Array.isArray(existing.registrationsByNodeId)?existing.registrationsByNodeId:{}}}async function persistRegistrationsState(state,baseDir){await writeJsonAtomic(resolveApnsRegistrationPath(baseDir),state)}function normalizeApnsEnvironment(value){if(typeof value!=`string`)return null;let normalized=value.trim().toLowerCase();return normalized===`sandbox`||normalized===`production`?normalized:null}async function registerApnsToken(params){let nodeId=normalizeNodeId(params.nodeId),token=normalizeApnsToken(params.token),topic=normalizeTopic(params.topic),environment=normalizeApnsEnvironment(params.environment)??`sandbox`;if(!nodeId)throw Error(`nodeId required`);if(!topic)throw Error(`topic required`);if(!isLikelyApnsToken(token))throw Error(`invalid APNs token`);return await withLock(async()=>{let state=await loadRegistrationsState(params.baseDir),next={nodeId,token,topic,environment,updatedAtMs:Date.now()};return state.registrationsByNodeId[nodeId]=next,await persistRegistrationsState(state,params.baseDir),next})}async function loadApnsRegistration(nodeId,baseDir){let normalizedNodeId=normalizeNodeId(nodeId);return normalizedNodeId?(await loadRegistrationsState(baseDir)).registrationsByNodeId[normalizedNodeId]??null:null}async function resolveApnsAuthConfigFromEnv(env=process.env){let teamId=normalizeNonEmptyString(env.BUILDERFORCE_AGENTS_APNS_TEAM_ID),keyId=normalizeNonEmptyString(env.BUILDERFORCE_AGENTS_APNS_KEY_ID);if(!teamId||!keyId)return{ok:!1,error:`APNs auth missing: set BUILDERFORCE_AGENTS_APNS_TEAM_ID and BUILDERFORCE_AGENTS_APNS_KEY_ID`};let inlineKeyRaw=normalizeNonEmptyString(env.BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY_P8)??normalizeNonEmptyString(env.BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY);if(inlineKeyRaw)return{ok:!0,value:{teamId,keyId,privateKey:normalizePrivateKey(inlineKeyRaw)}};let keyPath=normalizeNonEmptyString(env.BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY_PATH);if(!keyPath)return{ok:!1,error:`APNs private key missing: set BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY_P8 or BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY_PATH`};try{return{ok:!0,value:{teamId,keyId,privateKey:normalizePrivateKey(await fs.readFile(keyPath,`utf8`))}}}catch(err){return{ok:!1,error:`failed reading BUILDERFORCE_AGENTS_APNS_PRIVATE_KEY_PATH (${keyPath}): ${err instanceof Error?err.message:String(err)}`}}}async function sendApnsRequest(params){let authority=params.environment===`production`?`https://api.push.apple.com`:`https://api.sandbox.push.apple.com`,body=JSON.stringify(params.payload),requestPath=`/3/device/${params.token}`;return await new Promise((resolve,reject)=>{let client=http2.connect(authority),settled=!1,fail=err=>{settled||(settled=!0,client.destroy(),reject(err))},finish=result=>{settled||(settled=!0,client.close(),resolve(result))};client.once(`error`,err=>fail(err));let req=client.request({":method":`POST`,":path":requestPath,authorization:`bearer ${params.bearerToken}`,"apns-topic":params.topic,"apns-push-type":params.pushType,"apns-priority":params.priority,"apns-expiration":`0`,"content-type":`application/json`,"content-length":Buffer.byteLength(body).toString()}),statusCode=0,apnsId,responseBody=``;req.setEncoding(`utf8`),req.setTimeout(params.timeoutMs,()=>{req.close(http2.constants.NGHTTP2_CANCEL),fail(Error(`APNs request timed out after ${params.timeoutMs}ms`))}),req.on(`response`,headers=>{let statusHeader=headers[`:status`];statusCode=typeof statusHeader==`number`?statusHeader:Number(statusHeader??0);let idHeader=headers[`apns-id`];typeof idHeader==`string`&&idHeader.trim().length>0&&(apnsId=idHeader.trim())}),req.on(`data`,chunk=>{typeof chunk==`string`&&(responseBody+=chunk)}),req.on(`end`,()=>{finish({status:statusCode,apnsId,body:responseBody})}),req.on(`error`,err=>fail(err)),req.end(body)})}function resolveApnsTimeoutMs(timeoutMs){return typeof timeoutMs==`number`&&Number.isFinite(timeoutMs)?Math.max(1e3,Math.trunc(timeoutMs)):1e4}function resolveApnsSendContext(params){let token=normalizeApnsToken(params.registration.token);if(!isLikelyApnsToken(token))throw Error(`invalid APNs token`);let topic=normalizeTopic(params.registration.topic);if(!topic)throw Error(`topic required`);return{token,topic,environment:params.registration.environment,bearerToken:getApnsBearerToken(params.auth)}}function toApnsPushResult(params){return{ok:params.response.status===200,status:params.response.status,apnsId:params.response.apnsId,reason:parseReason(params.response.body),tokenSuffix:params.token.slice(-8),topic:params.topic,environment:params.environment}}async function sendApnsAlert(params){let{token,topic,environment,bearerToken}=resolveApnsSendContext({auth:params.auth,registration:params.registration}),payload={aps:{alert:{title:params.title,body:params.body},sound:`default`},builderforce:{kind:`push.test`,nodeId:params.nodeId,ts:Date.now()}};return toApnsPushResult({response:await(params.requestSender??sendApnsRequest)({token,topic,environment,bearerToken,payload,timeoutMs:resolveApnsTimeoutMs(params.timeoutMs),pushType:`alert`,priority:`10`}),token,topic,environment})}async function sendApnsBackgroundWake(params){let{token,topic,environment,bearerToken}=resolveApnsSendContext({auth:params.auth,registration:params.registration}),payload={aps:{"content-available":1},builderforce:{kind:`node.wake`,reason:params.wakeReason??`node.invoke`,nodeId:params.nodeId,ts:Date.now()}};return toApnsPushResult({response:await(params.requestSender??sendApnsRequest)({token,topic,environment,bearerToken,payload,timeoutMs:resolveApnsTimeoutMs(params.timeoutMs),pushType:`background`,priority:`5`}),token,topic,environment})}export{sendApnsAlert as a,parseMessageWithAttachments as c,shouldLogWs as d,summarizeAgentEventForWsLog as f,resolveApnsAuthConfigFromEnv as i,formatForLog as l,normalizeApnsEnvironment as n,sendApnsBackgroundWake as o,setGatewayWsLogStyle as p,registerApnsToken as r,normalizeRpcAttachmentsToChatAttachments as s,loadApnsRegistration as t,logWs as u};