nolo-cli 0.149.0-alpha.1 → 0.151.0-alpha.2

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 (258) hide show
  1. package/{_executeModel-OW3H7ICR.js → _executeModel-XHAFJ2MM.js} +134 -91
  2. package/accountResolver-7RYB4D2P.js +300 -0
  3. package/action-SXJD5N5R.js +23 -0
  4. package/{addContentAction-B2DRF7P6.js → addContentAction-ZV774PHH.js} +20 -14
  5. package/{addDialogAgentAction-2P2FLTLD.js → addDialogAgentAction-A6SMKAGH.js} +26 -22
  6. package/{agentDeleteCommand-7IDWF6E3.js → agentDeleteCommand-DPUUS56Z.js} +181 -93
  7. package/{agentEmailCommands-A6XBQZBN.js → agentEmailCommands-V4P5EFLP.js} +132 -112
  8. package/{agentGrantCommands-M3XFO6EN.js → agentGrantCommands-HOJ3JBBQ.js} +3 -3
  9. package/agentListCommands-TWFLUYIZ.js +802 -0
  10. package/{agentMachineCommands-DQPUIMAC.js → agentMachineCommands-MELPAZZI.js} +58 -62
  11. package/{agentProviderCommands-YK2BIIXZ.js → agentProviderCommands-HL6MBLCL.js} +149 -2
  12. package/{agentPullCommand-HF4A42D4.js → agentPullCommand-FA43RBRU.js} +7 -7
  13. package/agentRecordCommands-FSWSSQIO.js +154 -0
  14. package/agentRunCommand-GDBJVOAT.js +183 -0
  15. package/{agentRunControl-2SKCR4SB.js → agentRunControl-IFM7IGMG.js} +10 -2
  16. package/{agentRuntimeLocal-AK2QVJHY.js → agentRuntimeLocal-KKSQJMTE.js} +47 -50
  17. package/{agentSlice-O4RUQUMT.js → agentSlice-YO2ZLJMD.js} +23 -16
  18. package/{appDeleteCommands-N3XEVVYC.js → appDeleteCommands-4PL4KYRN.js} +58 -59
  19. package/{appDeployCommands-AWFIXYVW.js → appDeployCommands-EEEXCEB6.js} +67 -63
  20. package/{appDeployStatusCommands-CZRON2FO.js → appDeployStatusCommands-35ZX7T66.js} +56 -56
  21. package/{appGetCommands-XQIUY4TD.js → appGetCommands-WFCHXJWF.js} +56 -56
  22. package/{appListCommands-NNG4H36Y.js → appListCommands-XY2U6DPF.js} +57 -59
  23. package/{authCommand-UBJ4EWYZ.js → authCommand-QYN47CQD.js} +371 -68
  24. package/{authCommands-H6WKKCRW.js → authCommands-77CHYBGF.js} +12 -9
  25. package/{builtinSkillRegistry-ZMF6YGNO.js → builtinSkillRegistry-TDQ6JB2E.js} +13 -11
  26. package/{chromeCommands-2N6MEWRU.js → chromeCommands-OBBNJCLS.js} +314 -13
  27. package/chromeOpsCommands-3Z34RKSE.js +472 -0
  28. package/{chunk-ALXHV7NK.js → chunk-2GGXHQIW.js} +43 -4
  29. package/{localRuntimeAuthority-5W6IJRAD.js → chunk-2IXDJNZI.js} +154 -75
  30. package/{chunk-IVZJWTDI.js → chunk-36OMEXXR.js} +89 -21
  31. package/{chunk-H6A6X4EK.js → chunk-3MZAGMYY.js} +16 -0
  32. package/chunk-3PVYUPXK.js +40 -0
  33. package/chunk-3SZA4U64.js +1192 -0
  34. package/{chunk-GNMAFAIS.js → chunk-44WXLHFI.js} +1 -1
  35. package/{chunk-AGGIDPCZ.js → chunk-4JH2UMJR.js} +6 -0
  36. package/chunk-4LCOCOR5.js +50 -0
  37. package/chunk-4YRTZIVN.js +871 -0
  38. package/chunk-556RW72X.js +14110 -0
  39. package/{chunk-N7J63Q6C.js → chunk-56GBUMO5.js} +10 -1
  40. package/{chunk-W7XHHYWM.js → chunk-5BHQICF2.js} +5 -1
  41. package/{chunk-XUWRURDF.js → chunk-5EBLANFT.js} +1 -1
  42. package/{chunk-3AH7LNUB.js → chunk-5EMSBTQ6.js} +33 -14
  43. package/{chunk-YRRASA5Q.js → chunk-5MM7NNO6.js} +113 -52
  44. package/chunk-5MMAK75Q.js +15 -0
  45. package/{chunk-M5PVFLD4.js → chunk-64K7WX26.js} +90 -21
  46. package/{chunk-AKG5W4LG.js → chunk-6CCFTVBP.js} +76 -221
  47. package/chunk-6MJNEXUU.js +614 -0
  48. package/{chunk-62IL3KQV.js → chunk-6MXDOUMH.js} +15 -3
  49. package/{chunk-QOKAKDPE.js → chunk-6Q7UTJKR.js} +6 -94
  50. package/chunk-6QDYSCPW.js +223 -0
  51. package/{chunk-HYZIYH2H.js → chunk-74RAWNQN.js} +56 -63
  52. package/chunk-7DPNBQSV.js +9 -0
  53. package/chunk-7MOXKPHC.js +119 -0
  54. package/{chunk-ZUEK6A6C.js → chunk-7XKL25PW.js} +1973 -754
  55. package/{chunk-IAESIMK7.js → chunk-A4MW3YZL.js} +10 -14
  56. package/chunk-AGIM7IMJ.js +147 -0
  57. package/{chunk-7CHC4W22.js → chunk-AIZE5TDM.js} +3 -3
  58. package/{chunk-YAQJJDC2.js → chunk-AOCM7HPT.js} +214 -51
  59. package/{chunk-5GVBDNTO.js → chunk-AU7AXHUL.js} +1 -1
  60. package/{chunk-4H22P2JV.js → chunk-AUIJZACN.js} +2073 -1275
  61. package/{chunk-CIF4X6ZM.js → chunk-AWVFQMOV.js} +25 -3
  62. package/{chunk-RYZINGPM.js → chunk-BPMPOFWP.js} +347 -235
  63. package/{chunk-YUNJN43V.js → chunk-BU2YQBV4.js} +215 -28
  64. package/{chunk-XPRWFQQK.js → chunk-CBHGZRCE.js} +38 -12
  65. package/{chunk-Y3PMXGLH.js → chunk-CHCS6XPJ.js} +365 -144
  66. package/chunk-CHOZJMJS.js +78 -0
  67. package/{chunk-GBRG75BQ.js → chunk-D2MDMY2M.js} +1 -0
  68. package/{chunk-3SV7RM24.js → chunk-D2QN6CTI.js} +117 -72
  69. package/{chunk-5TEEECZM.js → chunk-E2AKSW7L.js} +10 -7
  70. package/{chunk-RSEEDUMS.js → chunk-EDX5XSJM.js} +2 -2
  71. package/{chunk-ATLTFRYJ.js → chunk-ES633ZS5.js} +280 -98
  72. package/{chunk-QDSINZM3.js → chunk-EUGTFFO6.js} +2 -23
  73. package/{chunk-UNYJU5L6.js → chunk-EYLGAEB4.js} +5 -1
  74. package/{chunk-CU3QB4HW.js → chunk-EYWJT7A2.js} +12 -12
  75. package/{chunk-BNGW5ASC.js → chunk-EZVK3N5L.js} +66 -18
  76. package/{chunk-6FGTMQCL.js → chunk-F32Z66T4.js} +6 -10
  77. package/chunk-FJMRBOPO.js +11507 -0
  78. package/{chunk-ZOVKKMF6.js → chunk-FY4SDK2E.js} +1 -1
  79. package/chunk-G6OOUQWJ.js +417 -0
  80. package/{chunk-PQWU42UQ.js → chunk-GCKHQECX.js} +6 -6
  81. package/chunk-GKXCHNTE.js +15 -0
  82. package/{chunk-TXH4IWJL.js → chunk-GQN2WLAI.js} +20 -11
  83. package/{chunk-P6GMCCAT.js → chunk-GQV5KHJU.js} +78 -12
  84. package/{chunk-B2XUQXQX.js → chunk-HIQ4GF53.js} +191 -68
  85. package/{chunk-MST6R3E4.js → chunk-HKX3ULQB.js} +34 -22
  86. package/{chunk-GMZLP5DV.js → chunk-HNUWUO75.js} +30 -19
  87. package/{chunk-5UTFL4QJ.js → chunk-I2ZMGXXF.js} +10 -5
  88. package/chunk-I42VC5KR.js +15 -0
  89. package/{chunk-3BXNTXYI.js → chunk-I4SN4NUQ.js} +1199 -56
  90. package/chunk-IA7TRNNR.js +11 -0
  91. package/{chunk-WIWM4FE3.js → chunk-IJERIUXS.js} +55 -748
  92. package/{chunk-CPUFH46E.js → chunk-ILU2NPWY.js} +10 -10
  93. package/{chunk-SLLGJZDT.js → chunk-ISQL4V7C.js} +4 -4
  94. package/chunk-IT3ZZRJE.js +12 -0
  95. package/{chunk-TZZ2WRBL.js → chunk-IZ7OJB6K.js} +20 -16
  96. package/{chunk-DY7ANLKG.js → chunk-JKMLSTZK.js} +43 -12
  97. package/{chunk-6TPOEJMQ.js → chunk-JZX2XLKC.js} +64 -23
  98. package/{chunk-27ONFIEY.js → chunk-K2AER7RX.js} +19 -12
  99. package/{chunk-O2OWEFII.js → chunk-KFHQQ3NO.js} +1 -1
  100. package/{chunk-QXGPFY6J.js → chunk-LGN377P3.js} +27 -17
  101. package/{chunk-L36OWPP3.js → chunk-LIQJTQRN.js} +118 -139
  102. package/{chunk-UASIEDKM.js → chunk-LTRUTOHX.js} +36 -31
  103. package/{chunk-BFU6C242.js → chunk-NMFV26UG.js} +1 -1
  104. package/{chunk-5J3PYNUP.js → chunk-NYYFIKHI.js} +17 -3
  105. package/{chunk-6O4IK4V2.js → chunk-OFFL4DCR.js} +1 -1
  106. package/{chunk-B6SAMB33.js → chunk-OWYYDMGJ.js} +209 -9
  107. package/{chunk-KQHGZWSV.js → chunk-OXME3PEE.js} +1 -1
  108. package/{chunk-CTUQJVQM.js → chunk-P5QACQDK.js} +1 -1
  109. package/{chunk-DXHL7G2L.js → chunk-PCKVQXYV.js} +274 -93
  110. package/{chunk-4JMDLJAD.js → chunk-PJNFNEJE.js} +114 -37
  111. package/{chunk-Z4CSIXYP.js → chunk-PLSVXHSA.js} +3 -3
  112. package/{chunk-BIDGLJQ3.js → chunk-PLXDDGBK.js} +45 -8
  113. package/chunk-PWTNI4N7.js +47 -0
  114. package/chunk-QFEW2ULV.js +42 -0
  115. package/{chunk-RGNEEJ3Y.js → chunk-QLQ573SU.js} +35 -9
  116. package/chunk-QQ56R7KS.js +88 -0
  117. package/chunk-QYPE3TS3.js +43 -0
  118. package/{chunk-4DPP773Q.js → chunk-RSHPU4PD.js} +59 -11
  119. package/chunk-RVWMAFIT.js +134 -0
  120. package/{chunk-ESHYE7WU.js → chunk-S73EPYNC.js} +10 -7
  121. package/{chunk-UQNS32WZ.js → chunk-SCMHQUMK.js} +1 -1
  122. package/{chunk-HTVYCXBP.js → chunk-SMENBO3M.js} +354 -120
  123. package/{chunk-OMRJYNCI.js → chunk-SSFDFOVT.js} +26 -31
  124. package/chunk-SW4S4XYB.js +1794 -0
  125. package/{chunk-TB3MIBRC.js → chunk-T6X3D7NB.js} +572 -430
  126. package/chunk-TY3TIUJK.js +89 -0
  127. package/{chunk-X2QRZXZH.js → chunk-TYJ5XFEA.js} +4 -4
  128. package/{chunk-ALFH24P3.js → chunk-TYYRSFBG.js} +197 -155
  129. package/{chunk-7KVZ5LDQ.js → chunk-UBUH2TCC.js} +18 -4
  130. package/chunk-UEILX4EV.js +15 -0
  131. package/chunk-UHTDNB5Y.js +140 -0
  132. package/{chunk-YYLHWIW6.js → chunk-UKZX3NHN.js} +1 -1
  133. package/{chunk-OHOVNO7I.js → chunk-UOKFKFPO.js} +6 -3
  134. package/{chunk-XISEYOGH.js → chunk-USHQX6VT.js} +5 -5
  135. package/chunk-UUPR3TD7.js +53 -0
  136. package/{chunk-HDLLCBRF.js → chunk-VEA7H5FG.js} +2 -2
  137. package/chunk-VHGD6FHV.js +116 -0
  138. package/chunk-VIWDGTDA.js +8 -0
  139. package/{chunk-GOH6RW6F.js → chunk-VJXHL6MH.js} +34 -11
  140. package/{chunk-4XEYAFLY.js → chunk-VL5KOY2C.js} +623 -94
  141. package/{chunk-EADNWBAZ.js → chunk-VP3BINY7.js} +13 -0
  142. package/{chunk-EOARMOVD.js → chunk-W4S6OTSC.js} +6 -3
  143. package/chunk-WD4XYDYC.js +567 -0
  144. package/chunk-WJZOQR2J.js +151 -0
  145. package/{chunk-AUDNYVRC.js → chunk-XETG4RIX.js} +5 -5
  146. package/{chunk-MX574M24.js → chunk-XI7DGLUK.js} +4 -4
  147. package/{chunk-3L2WKC3W.js → chunk-XPWGOTBQ.js} +8 -1
  148. package/chunk-XRUSXPCQ.js +514 -0
  149. package/{chunk-I4OPU5TK.js → chunk-XS47QOFV.js} +273 -11
  150. package/{chunk-S5XGT6GB.js → chunk-XZNCX52W.js} +30 -9
  151. package/{chunk-ID7LNBWR.js → chunk-Y2DXOPSO.js} +1920 -644
  152. package/{chunk-5OA5HMTL.js → chunk-YLMMECCH.js} +1 -1
  153. package/{chunk-CFT5HBGW.js → chunk-YVLQXTUB.js} +448 -12
  154. package/chunk-YVPQATSC.js +709 -0
  155. package/{chunk-3DAVPNFT.js → chunk-Z7OJUX6S.js} +122 -107
  156. package/chunk-ZEZC7IIM.js +126 -0
  157. package/{chunk-ALGORS6Y.js → chunk-ZF6526IQ.js} +43 -8
  158. package/chunk-ZIWPQEFU.js +165 -0
  159. package/chunk-ZKZ5X2HS.js +7012 -0
  160. package/chunk-ZRAU6T47.js +56 -0
  161. package/{cliExecutor-AWYR3T33.js → cliExecutor-BWBF2MTI.js} +4 -3
  162. package/{clipboardy-BX4NMYHE.js → clipboardy-GCO3GT3I.js} +3 -8
  163. package/{commandRegistry-2KBOXZQC.js → commandRegistry-XN7C5GHO.js} +183 -107
  164. package/contentThunks-5L7YQI3S.js +84 -0
  165. package/{cooldownCommands-ZLEPIB4A.js → cooldownCommands-JFKTYS2D.js} +2 -2
  166. package/{createAgentAutomationAction-5UGTB26P.js → createAgentAutomationAction-QOPOLCRK.js} +53 -44
  167. package/createDialogAction-MZ66VY5Q.js +76 -0
  168. package/{createPageAction-CDLDKPRM.js → createPageAction-VQDJIXMY.js} +65 -54
  169. package/cursorProvider-YGGNMVWX.js +6123 -0
  170. package/{db-VQSAOWAO.js → db-2QOTXYGH.js} +11 -5
  171. package/{dbSlice-DQ32LYTJ.js → dbSlice-J37OGIXH.js} +19 -13
  172. package/{deleteFile-NX6QHCWZ.js → deleteFile-6JWDDRVP.js} +10 -6
  173. package/dialogCommands-YZLSJB6X.js +113 -0
  174. package/{dialogSlice-N3YB65G5.js → dialogSlice-6RODVYCK.js} +53 -39
  175. package/{docCreateCommands-ZSLGVBZT.js → docCreateCommands-JB2RRMRJ.js} +54 -57
  176. package/{docDeleteCommands-5N4GVZBG.js → docDeleteCommands-AQENULNM.js} +56 -58
  177. package/{docReadCommands-YJSAA7AV.js → docReadCommands-DYD25YLQ.js} +53 -56
  178. package/{docStore-E3CEOV5Q.js → docStore-ZZA3OPM5.js} +25 -16
  179. package/{docUpdateCommands-WEMLSW6W.js → docUpdateCommands-3GVS23QL.js} +54 -57
  180. package/{fetchMessages-67MEFPZR.js → fetchMessages-IIJWQ3HR.js} +5 -4
  181. package/{getPricing-NMMFT3YI.js → getPricing-FKK3F5EJ.js} +11 -9
  182. package/{handleSendMessageAction-DQAD5ERJ.js → handleSendMessageAction-DVG5U26T.js} +422 -118
  183. package/index.js +11 -7
  184. package/{lib-FRRS27KN.js → lib-4YTWAGY7.js} +581 -248
  185. package/{localDialogRead-EBRS242U.js → localDialogRead-FSOMOPDZ.js} +2 -2
  186. package/localRuntimeAdapter-HXRHFKRC.js +244 -0
  187. package/localRuntimeAuthority-JDAD7CB6.js +16 -0
  188. package/{localRuntimeDb-3LRMNLCM.js → localRuntimeDb-CVC62PM5.js} +1 -1
  189. package/{machineCommands-HAP75VSG.js → machineCommands-5KBF4RCC.js} +503 -161
  190. package/{machineInfo-66ZFUMLE.js → machineInfo-UKPTZO5Y.js} +2 -2
  191. package/machineWsRunDispatch-4OQDEDOR.js +169 -0
  192. package/{memberThunks-5ZXPR63F.js → memberThunks-66DH6ABQ.js} +25 -18
  193. package/{models-ZPU5EDF4.js → models-LAS4B2B5.js} +2 -2
  194. package/package.json +1 -1
  195. package/{providerPresetApply-DD6NGWW6.js → providerPresetApply-MY66I6NT.js} +10 -10
  196. package/{providerRegistry-XDRLMYGJ.js → providerRegistry-QOE2FT57.js} +13 -9
  197. package/{read-EPTJRAEF.js → read-DC4NUGN6.js} +12 -8
  198. package/{readDocTool-W4NDXNEX.js → readDocTool-NCJ5NT25.js} +1 -1
  199. package/{readlineWorkspace-7BC66QSX.js → readlineWorkspace-RIE62QVZ.js} +5022 -921
  200. package/{removeDialogAgentAction-OSYNZRX7.js → removeDialogAgentAction-E2H3OZU6.js} +29 -28
  201. package/{runAgentClientLoop-6E6UC3CE.js → runAgentClientLoop-KLUUXBZS.js} +154 -97
  202. package/{runtimeDoctorCommands-ID23PNNZ.js → runtimeDoctorCommands-GIOGC5SC.js} +17 -17
  203. package/secretCommands-ZXZRLR3R.js +700 -0
  204. package/setDialogExtraReferencesAction-SITRPMYU.js +37 -0
  205. package/{setPrimaryDialogAgentAction-WZ7KI3YA.js → setPrimaryDialogAgentAction-U7N45TGC.js} +30 -29
  206. package/{chunk-SONWNI3L.js → settingThunks-Y7SVJOMZ.js} +223 -928
  207. package/{skillDiscovery-ZBU76COE.js → skillDiscovery-QC35EQY4.js} +2 -2
  208. package/{slateUtils-RIZES3PV.js → slateUtils-NGV2NMKM.js} +1 -1
  209. package/{spaceCommands-UJOVU4XI.js → spaceCommands-ZR5BR3GX.js} +59 -59
  210. package/{streamAgentChatTurn-3UXPYFNX.js → streamAgentChatTurn-MN2SSPGA.js} +309 -165
  211. package/{switchDialogAgentAction-GMR7WN3P.js → switchDialogAgentAction-OMGBD3N2.js} +26 -22
  212. package/{tableCommands-G7RV3RU3.js → tableCommands-U3QDY4L6.js} +19 -17
  213. package/{toolApiClient-CVGWM4PN.js → toolApiClient-7WSJJJBV.js} +6 -5
  214. package/tools-W2MOLERY.js +124 -0
  215. package/tuiSummaryLlmCaller-BM3VSTBU.js +130 -0
  216. package/{updateCommands-4EHDLF5J.js → updateCommands-NQXAGFM7.js} +3 -3
  217. package/{updateDialogTitleAction-UPFV7TDT.js → updateDialogTitleAction-Z4JX6REN.js} +102 -57
  218. package/workloadLifecycle-36DXRZKU.js +320 -0
  219. package/action-GI44T4DR.js +0 -31
  220. package/agentListCommands-IW3GQVUP.js +0 -427
  221. package/agentRecordCommands-VCA76W6B.js +0 -134
  222. package/agentRunCommand-YNLDKVR7.js +0 -161
  223. package/browser-image-compression-MFDTD7K6.js +0 -1763
  224. package/chatQueueReduxAdapter-TJRMXMYA.js +0 -186
  225. package/chromeOpsCommands-IXRLN57H.js +0 -289
  226. package/chunk-36KZDDO5.js +0 -2415
  227. package/chunk-ACQD6YI2.js +0 -25363
  228. package/chunk-CQ3WA2NE.js +0 -299
  229. package/chunk-CYSYR67N.js +0 -93
  230. package/chunk-JBTJAPUF.js +0 -35
  231. package/chunk-K2CSUCHJ.js +0 -620
  232. package/chunk-LTRXGFMS.js +0 -83
  233. package/chunk-M76ECQRD.js +0 -13658
  234. package/chunk-MEYIRKDN.js +0 -8967
  235. package/chunk-OCZKATRC.js +0 -129
  236. package/chunk-OTGFTBLI.js +0 -13
  237. package/chunk-PUOC4YRO.js +0 -394
  238. package/chunk-PZZTFEKK.js +0 -34
  239. package/chunk-URMS4XY2.js +0 -10
  240. package/chunk-UV6VISQJ.js +0 -20
  241. package/chunk-VJVNU77E.js +0 -83
  242. package/chunk-XYJSY4KG.js +0 -13807
  243. package/chunk-Y5GCAMGP.js +0 -9
  244. package/chunk-YPREESF4.js +0 -225
  245. package/contentThunks-BDIQRZR6.js +0 -73
  246. package/createDialogAction-B7VGVEVU.js +0 -66
  247. package/dialogCommands-G7YBVAMC.js +0 -102
  248. package/levelLazyShim-GZBKODGI.js +0 -7
  249. package/machineWsRunDispatch-L32G7C4P.js +0 -149
  250. package/serverStoreFactory-YMXDF4NI.js +0 -20
  251. package/setDialogExtraReferencesAction-M32UYNCG.js +0 -30
  252. package/settingSlice-Q6EKL7EQ.js +0 -204
  253. package/syncMapping-N6RGXGBW.js +0 -437
  254. package/tools-MKYDMWA4.js +0 -111
  255. package/tuiSummaryLlmCaller-3YFNHCTW.js +0 -128
  256. package/{chunk-SV5IJK6K.js → chunk-NBTY7YJF.js} +3 -3
  257. package/{chunk-2SYTUTLI.js → chunk-YBNHPX4S.js} +3 -3
  258. package/{offlineMarxistsAgentCommand-HGXZV4XJ.js → offlineMarxistsAgentCommand-2QTHJCHV.js} +4 -4
@@ -0,0 +1,140 @@
1
+ import {
2
+ asTrimmedString
3
+ } from "./chunk-3EUW3WEO.js";
4
+ import {
5
+ getCredentialsDir,
6
+ getLegacyCredentialPath,
7
+ migrateLegacyCredentialFile
8
+ } from "./chunk-ZWQUWF6W.js";
9
+
10
+ // packages/agent-runtime/fileCredentialBroker.ts
11
+ import {
12
+ chmodSync,
13
+ existsSync,
14
+ mkdirSync,
15
+ readFileSync,
16
+ unlinkSync,
17
+ writeFileSync
18
+ } from "node:fs";
19
+ import { homedir } from "node:os";
20
+ import { join } from "node:path";
21
+
22
+ // packages/agent-runtime/credentialBroker.ts
23
+ function assertCredentialRef(ref) {
24
+ const trimmed = asTrimmedString(ref);
25
+ if (!trimmed) {
26
+ throw new Error("invalid_ref");
27
+ }
28
+ if (trimmed.includes("..") || trimmed.includes("/") || trimmed.includes("\\")) {
29
+ throw new Error("invalid_ref");
30
+ }
31
+ return trimmed;
32
+ }
33
+
34
+ // packages/agent-runtime/fileCredentialBroker.ts
35
+ function getApiKeyCredentialsDir(homeDir) {
36
+ return join(getCredentialsDir(homeDir), "keys");
37
+ }
38
+ function credentialRefToFileName(ref) {
39
+ const safe = assertCredentialRef(ref).replace(/[^a-zA-Z0-9._-]+/g, "_");
40
+ if (!safe || safe === "." || safe === "..") {
41
+ throw new Error(`Credential ref is not filesystem-safe: ${ref}`);
42
+ }
43
+ return `${safe}.json`;
44
+ }
45
+ function getApiKeyCredentialPath(ref, homeDir) {
46
+ return join(getApiKeyCredentialsDir(homeDir), credentialRefToFileName(ref));
47
+ }
48
+ function ensurePrivateDir(dir) {
49
+ mkdirSync(dir, { recursive: true, mode: 448 });
50
+ try {
51
+ chmodSync(dir, 448);
52
+ } catch {
53
+ }
54
+ }
55
+ function writePrivateFile(path, body) {
56
+ writeFileSync(path, body, { encoding: "utf8", mode: 384 });
57
+ try {
58
+ chmodSync(path, 384);
59
+ } catch {
60
+ }
61
+ }
62
+ function migrateApiKeyCredentialIfNeeded(ref, homeDir, migration) {
63
+ if (homeDir !== void 0 || !migration?.enableLegacyMigration) return;
64
+ const legacyHomeDir = migration.legacyHomeDir ?? homedir();
65
+ const relativePath = join("keys", credentialRefToFileName(ref));
66
+ migrateLegacyCredentialFile({
67
+ canonicalPath: getApiKeyCredentialPath(ref),
68
+ legacyPath: getLegacyCredentialPath(relativePath, legacyHomeDir),
69
+ mode: migration.mode ?? (migration.legacyHomeDir ? "test" : "production"),
70
+ isValid: (raw) => {
71
+ try {
72
+ const parsed = JSON.parse(raw);
73
+ return typeof parsed?.secret === "string" && Boolean(parsed.secret);
74
+ } catch {
75
+ return false;
76
+ }
77
+ }
78
+ });
79
+ }
80
+ function readApiKeyCredential(ref, homeDir, migration) {
81
+ migrateApiKeyCredentialIfNeeded(ref, homeDir, migration);
82
+ const path = getApiKeyCredentialPath(ref, homeDir);
83
+ if (!existsSync(path)) return null;
84
+ try {
85
+ const raw = readFileSync(path, "utf8");
86
+ const parsed = JSON.parse(raw);
87
+ if (typeof parsed?.secret !== "string" || !parsed.secret) return null;
88
+ return parsed.secret;
89
+ } catch {
90
+ return null;
91
+ }
92
+ }
93
+ function writeApiKeyCredential(ref, secret, homeDir, now = Date.now()) {
94
+ const trimmedSecret = secret.trim();
95
+ if (!trimmedSecret) {
96
+ throw new Error("Cannot store an empty credential secret.");
97
+ }
98
+ assertCredentialRef(ref);
99
+ const dir = getApiKeyCredentialsDir(homeDir);
100
+ ensurePrivateDir(dir);
101
+ const path = getApiKeyCredentialPath(ref, homeDir);
102
+ const payload = {
103
+ secret: trimmedSecret,
104
+ updatedAt: now
105
+ };
106
+ writePrivateFile(path, `${JSON.stringify(payload, null, 2)}
107
+ `);
108
+ }
109
+ function removeApiKeyCredential(ref, homeDir) {
110
+ assertCredentialRef(ref);
111
+ const path = getApiKeyCredentialPath(ref, homeDir);
112
+ if (!existsSync(path)) return;
113
+ unlinkSync(path);
114
+ }
115
+ function hasApiKeyCredential(ref, homeDir, migration) {
116
+ return readApiKeyCredential(ref, homeDir, migration) !== null;
117
+ }
118
+ function createFileCredentialBroker(options = {}) {
119
+ const homeDir = options.homeDir;
120
+ const migration = options.migration;
121
+ const now = options.now ?? Date.now;
122
+ return {
123
+ get(ref) {
124
+ return readApiKeyCredential(ref, homeDir, migration);
125
+ },
126
+ put(ref, secret) {
127
+ writeApiKeyCredential(ref, secret, homeDir, now());
128
+ },
129
+ delete(ref) {
130
+ removeApiKeyCredential(ref, homeDir);
131
+ },
132
+ has(ref) {
133
+ return hasApiKeyCredential(ref, homeDir, migration);
134
+ }
135
+ };
136
+ }
137
+
138
+ export {
139
+ createFileCredentialBroker
140
+ };
@@ -35,7 +35,7 @@ var LOCAL_HOSTS = /* @__PURE__ */ new Set(["127.0.0.1", "localhost", "::1", "0.0
35
35
  function isRemoteCustomEndpoint(url) {
36
36
  if (typeof url !== "string") return false;
37
37
  try {
38
- const host = new URL(url).hostname.toLowerCase();
38
+ const host = new URL(url).hostname.toLowerCase().replace(/^\[|\]$/g, "");
39
39
  return !LOCAL_HOSTS.has(host);
40
40
  } catch {
41
41
  return false;
@@ -3,10 +3,10 @@ import {
3
3
  } from "./chunk-5ZUL4CUO.js";
4
4
  import {
5
5
  resolveAgentImageInputSupport
6
- } from "./chunk-PQWU42UQ.js";
6
+ } from "./chunk-GCKHQECX.js";
7
7
  import {
8
8
  getModelContextWindow
9
- } from "./chunk-AKG5W4LG.js";
9
+ } from "./chunk-BPMPOFWP.js";
10
10
  import {
11
11
  asOptionalFiniteNumber
12
12
  } from "./chunk-WWC7I6TA.js";
@@ -80,7 +80,9 @@ var devinChannelContextWindow = (model) => {
80
80
  if (!raw) return void 0;
81
81
  return DEVIN_CHANNEL_CONTEXT_WINDOWS[raw];
82
82
  };
83
- var resolveAgentContextWindow = (agent) => (isDevinOAuthAgent(agent) ? devinChannelContextWindow(agent.model) : void 0) ?? getModelContextWindow(agent.model ?? "");
83
+ var resolveAgentContextWindow = (agent) => (isDevinOAuthAgent(agent) ? devinChannelContextWindow(agent.model) : void 0) ?? // provider 透传给全局解析:平台托管通道(CF)与 Codex OAuth 等通道对同一 id
84
+ // 窗口不同,按通道取真值,不做全局取大/取小。
85
+ getModelContextWindow(agent.model ?? "", agent.provider);
84
86
 
85
87
  // packages/agent-runtime/agentRecordConfig.ts
86
88
  function stringField(record, key) {
@@ -450,6 +452,7 @@ export {
450
452
  hasImageInRuntimeMessages,
451
453
  stripImagePartsFromMessages,
452
454
  stripImagePartsForTextOnlyAgent,
455
+ devinChannelContextWindow,
453
456
  resolveAgentContextWindow,
454
457
  resolveAgentRuntimeConfigFromRecord,
455
458
  buildDesktopAgentRuntimeAgentConfigSnapshot,
@@ -2,16 +2,16 @@ import {
2
2
  deleteDbRecord,
3
3
  queryUserRecords,
4
4
  readDbRecord
5
- } from "./chunk-ALGORS6Y.js";
5
+ } from "./chunk-ZF6526IQ.js";
6
6
  import {
7
7
  mergeAndDedupUserData
8
- } from "./chunk-KQHGZWSV.js";
8
+ } from "./chunk-OXME3PEE.js";
9
+ import {
10
+ isTombstoneRecord
11
+ } from "./chunk-D2MDMY2M.js";
9
12
  import {
10
13
  toErrorMessage
11
14
  } from "./chunk-HNMXYYJR.js";
12
- import {
13
- isTombstoneRecord
14
- } from "./chunk-GBRG75BQ.js";
15
15
 
16
16
  // packages/cli/globalRecordOperations.ts
17
17
  async function listUserRecordsFromServers(args) {
@@ -0,0 +1,53 @@
1
+ import {
2
+ buildAgentRuntimeAgentLookupKeys,
3
+ shouldFetchAgentRuntimeRecordRemotely
4
+ } from "./chunk-QLQ573SU.js";
5
+
6
+ // packages/agent-runtime/oauthProviderRefs.ts
7
+ var OAUTH_PROVIDER_REFS = [
8
+ "chatgpt",
9
+ "xai",
10
+ "antigravity",
11
+ "claude",
12
+ "cursor",
13
+ "devin",
14
+ "workbuddy",
15
+ "workbuddy-ai"
16
+ ];
17
+ var METERED_API_KEY_REF_PREFIX = "api-key:";
18
+ var normalizeRef = (ref) => typeof ref === "string" ? ref.trim().toLowerCase() : "";
19
+ var isKnownOAuthProviderRef = (ref) => OAUTH_PROVIDER_REFS.includes(normalizeRef(ref));
20
+ var isMeteredApiKeyRef = (ref) => {
21
+ const trimmed = typeof ref === "string" ? ref.trim() : "";
22
+ return trimmed.length > METERED_API_KEY_REF_PREFIX.length && trimmed.slice(0, METERED_API_KEY_REF_PREFIX.length).toLowerCase() === METERED_API_KEY_REF_PREFIX;
23
+ };
24
+ var OAUTH_PROVIDER_REF_LIST_COPY = OAUTH_PROVIDER_REFS.join(" / ");
25
+ function classifyAgentApiKeyRef(raw) {
26
+ const trimmed = typeof raw === "string" ? raw.trim() : "";
27
+ if (!trimmed) return { ok: true, kind: "empty" };
28
+ if (isKnownOAuthProviderRef(trimmed)) {
29
+ return {
30
+ ok: true,
31
+ kind: "oauth-provider",
32
+ provider: normalizeRef(trimmed)
33
+ };
34
+ }
35
+ if (isMeteredApiKeyRef(trimmed)) return { ok: true, kind: "metered-api-key" };
36
+ return { ok: false, kind: "unsupported-oauth-provider", ref: trimmed };
37
+ }
38
+ function formatUnsupportedAgentApiKeyRefMessage(raw) {
39
+ const shown = typeof raw === "string" ? raw.trim() : "";
40
+ return `apiKeyRef "${shown}" \u4E0D\u662F\u53D7\u652F\u6301\u7684\u53D6\u503C\uFF0C\u8BB0\u5F55\u672A\u5199\u5165\u3002\u5408\u6CD5\u53D6\u503C\uFF1AOAuth provider ref\uFF08${OAUTH_PROVIDER_REF_LIST_COPY}\uFF09\uFF0C\u6216\u8BA1\u91CF/\u8BBE\u5907 broker ref\uFF08\u4EE5 "${METERED_API_KEY_REF_PREFIX}" \u5F00\u5934\uFF0C\u5982 ${METERED_API_KEY_REF_PREFIX}agent-...\uFF09\u3002\u6539\u6CD5\uFF1A\u628A apiKeyRef \u6539\u6210\u4E0A\u9762\u67D0\u4E2A\u53D7\u652F\u6301\u7684\u53D6\u503C\uFF0C\u6216\u6539\u7528 ${METERED_API_KEY_REF_PREFIX}<id>\uFF1B\u82E5\u8981\u7528\u81EA\u5E26 API key\uFF0C\u8BF7\u6E05\u7A7A apiKeyRef \u5E76\u586B\u5199 apiKey\u3002`;
41
+ }
42
+
43
+ // packages/cli/client/localAgentRecords.ts
44
+ var buildLocalAgentLookupKeys = buildAgentRuntimeAgentLookupKeys;
45
+ var shouldReadAgentKeyRemotely = shouldFetchAgentRuntimeRecordRemotely;
46
+
47
+ export {
48
+ OAUTH_PROVIDER_REFS,
49
+ classifyAgentApiKeyRef,
50
+ formatUnsupportedAgentApiKeyRefMessage,
51
+ buildLocalAgentLookupKeys,
52
+ shouldReadAgentKeyRemotely
53
+ };
@@ -81,9 +81,9 @@ var buildSkillDiscoveryLayer = (skills, _boundFolder) => {
81
81
  if (skills.length === 0) return null;
82
82
  const lines = [
83
83
  "--- \u53EF\u7528\u6280\u80FD\uFF08Skills\uFF09---",
84
- `\u5DE5\u4F5C\u533A\u4E2D\u53D1\u73B0\u4E86 ${skills.length} \u4E2A\u6280\u80FD\uFF08SKILL.md\uFF09\uFF0C\u6A21\u578B\u53EF\u6309\u9700\u7528 loadSkill \u6309\u540D\u52A0\u8F7D\u6216 readFile \u76F4\u63A5\u8BFB\u53D6\uFF1A`,
84
+ `\u5DE5\u4F5C\u533A\u4E2D\u53D1\u73B0\u4E86 ${skills.length} \u4E2A\u6280\u80FD\uFF08SKILL.md\uFF09\uFF0C\u6A21\u578B\u53EF\u6309\u9700\u7528 loadSkill \u6309\u540D\u52A0\u8F7D\u6216 readFile \u76F4\u63A5\u8BFB\u53D6\uFF08\u8DEF\u5F84\u89C4\u5219 .agents/skills/<name>/SKILL.md\uFF09\uFF1A`,
85
85
  ...skills.map(
86
- (s) => `- ${s.name}: ${s.description} (path: ${s.relativePath})`
86
+ (s) => `- ${s.name}: ${s.description}`
87
87
  )
88
88
  ];
89
89
  return makeLayer("skill-discovery", lines.join("\n"), "session");
@@ -0,0 +1,116 @@
1
+ // packages/cli/tui/ciStatus.ts
2
+ import { execFile } from "node:child_process";
3
+ var DEFAULT_SSH_HOST = "alpha-raw";
4
+ var DEFAULT_CI_PORT = "3900";
5
+ function resolveSshTarget() {
6
+ const alias = process.env.NOLO_ALPHA_SSH_CONFIG_HOST?.trim();
7
+ if (alias) return alias;
8
+ const raw = process.env.NOLO_ALPHA_RAW_HOST?.trim();
9
+ if (raw) {
10
+ const user = process.env.NOLO_ALPHA_SSH_USER?.trim() || "root";
11
+ return `${user}@${raw}`;
12
+ }
13
+ return DEFAULT_SSH_HOST;
14
+ }
15
+ function asRecord(value) {
16
+ return typeof value === "object" && value !== null ? value : void 0;
17
+ }
18
+ function asString(value) {
19
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
20
+ }
21
+ function extractFailedPhase(raw) {
22
+ if (!Array.isArray(raw)) return void 0;
23
+ for (const entry of raw) {
24
+ const timing = asRecord(entry);
25
+ if (!timing) continue;
26
+ const status = timing.status;
27
+ const phase = asString(timing.phase);
28
+ if (phase && typeof status === "number" && status !== 0) return phase;
29
+ }
30
+ return void 0;
31
+ }
32
+ function toCiJob(value) {
33
+ const record = asRecord(value);
34
+ if (!record) return void 0;
35
+ const jobId = asString(record.jobId);
36
+ const status = asString(record.status);
37
+ if (!jobId || !status) return void 0;
38
+ const durationMs = typeof record.durationMs === "number" ? record.durationMs : void 0;
39
+ return {
40
+ jobId,
41
+ kind: asString(record.kind) ?? "unknown",
42
+ status,
43
+ shortSha: asString(record.shortSha) ?? asString(record.sha) ?? "",
44
+ startedAt: asString(record.startedAt),
45
+ durationMs,
46
+ failedPhase: extractFailedPhase(record.phaseTimings)
47
+ };
48
+ }
49
+ function parseCiStatusPayload(raw) {
50
+ let parsed;
51
+ try {
52
+ parsed = JSON.parse(raw);
53
+ } catch {
54
+ return void 0;
55
+ }
56
+ const root = asRecord(parsed);
57
+ if (!root) return void 0;
58
+ const jobs = root.jobs;
59
+ if (Array.isArray(jobs)) {
60
+ return jobs.map(toCiJob).filter((job) => job !== void 0);
61
+ }
62
+ const single = toCiJob(parsed);
63
+ return single ? [single] : void 0;
64
+ }
65
+ function buildRemoteCommand(limit) {
66
+ const rawPort = process.env.NOLO_CI_PORT?.trim() ?? "";
67
+ const port = /^\d{1,5}$/.test(rawPort) && Number(rawPort) > 0 && Number(rawPort) <= 65535 ? rawPort : DEFAULT_CI_PORT;
68
+ const safeLimit = Math.max(1, Math.min(20, Math.trunc(limit) || 5));
69
+ return `curl -s -m 3 "http://127.0.0.1:${port}/status?limit=${safeLimit}"`;
70
+ }
71
+ function fetchCiStatus(limit = 5, timeoutMs = 4e3) {
72
+ return new Promise((resolve) => {
73
+ let settled = false;
74
+ let guard;
75
+ const finish = (value) => {
76
+ if (settled) return;
77
+ settled = true;
78
+ if (guard) clearTimeout(guard);
79
+ resolve(value);
80
+ };
81
+ guard = setTimeout(() => finish(void 0), timeoutMs + 500);
82
+ guard.unref?.();
83
+ try {
84
+ execFile(
85
+ "ssh",
86
+ ["-o", "BatchMode=yes", "-o", `ConnectTimeout=3`, resolveSshTarget(), buildRemoteCommand(limit)],
87
+ { timeout: timeoutMs, encoding: "utf8", maxBuffer: 1024 * 1024 },
88
+ (error, stdout) => {
89
+ if (error) {
90
+ finish(void 0);
91
+ return;
92
+ }
93
+ finish(parseCiStatusPayload(stdout ?? ""));
94
+ }
95
+ );
96
+ } catch {
97
+ finish(void 0);
98
+ }
99
+ });
100
+ }
101
+ function summarizeLatest(jobs) {
102
+ const latest = jobs?.[0];
103
+ if (!latest) return void 0;
104
+ const sha = latest.shortSha ? latest.shortSha.slice(0, 7) : "???????";
105
+ if (latest.status === "running") return `ci:${sha} \u2026`;
106
+ if (latest.status === "succeeded") return `ci:${sha} \u2713`;
107
+ if (latest.status === "failed" || latest.status === "orphaned") {
108
+ return `ci:${sha} \u2717${latest.failedPhase ? ` ${latest.failedPhase}` : ""}`;
109
+ }
110
+ return `ci:${sha} ${latest.status}`;
111
+ }
112
+
113
+ export {
114
+ fetchCiStatus,
115
+ summarizeLatest
116
+ };
@@ -0,0 +1,8 @@
1
+ // packages/agent-runtime/cursor/isCursorOAuthAgent.ts
2
+ function isCursorOAuthAgent(agent) {
3
+ return agent.apiKeyRef?.trim().toLowerCase() === "cursor";
4
+ }
5
+
6
+ export {
7
+ isCursorOAuthAgent
8
+ };
@@ -1,13 +1,16 @@
1
1
  import {
2
2
  listUserRecordsFromServers,
3
3
  readLiveDbRecordAfterTombstoneMerge
4
- } from "./chunk-XISEYOGH.js";
4
+ } from "./chunk-USHQX6VT.js";
5
5
  import {
6
6
  agentRecordHasConfiguredCredential
7
- } from "./chunk-ALGORS6Y.js";
7
+ } from "./chunk-ZF6526IQ.js";
8
8
  import {
9
9
  deriveCredentialGroup
10
- } from "./chunk-DY7ANLKG.js";
10
+ } from "./chunk-JKMLSTZK.js";
11
+ import {
12
+ isTombstoneRecord
13
+ } from "./chunk-D2MDMY2M.js";
11
14
  import {
12
15
  PUBLIC_AGENT_KEY_PREFIX,
13
16
  isOwnedAgentKey,
@@ -30,6 +33,7 @@ function buildCompanionKeys(rawId, userId) {
30
33
  };
31
34
  }
32
35
  function normalizeListedAgent(record) {
36
+ if (isTombstoneRecord(record)) return null;
33
37
  const privateKey = typeof record?.dbKey === "string" ? record.dbKey : "";
34
38
  const explicitId = typeof record?.id === "string" && record.id ? record.id : void 0;
35
39
  const ownerUserId = typeof record?.userId === "string" ? record.userId : "";
@@ -52,6 +56,9 @@ function normalizeListedAgent(record) {
52
56
  ...typeof record?.handle === "string" && record.handle ? { handle: record.handle } : {},
53
57
  ...typeof record?.introduction === "string" && record.introduction ? { introduction: record.introduction } : typeof record?.description === "string" && record.description ? { introduction: record.description } : {},
54
58
  ...typeof record?.provider === "string" && record.provider ? { provider: record.provider } : {},
59
+ // 仅供 resolveBillingSource 判定订阅端点(Step Plan / OpenCode Go 等),
60
+ // safe 投影不输出它。缺了它本地 agent list 会把订阅端点全报成 user_api。
61
+ ...typeof record?.customProviderUrl === "string" && record.customProviderUrl ? { customProviderUrl: record.customProviderUrl } : {},
55
62
  ...typeof record?.inputPrice === "number" && Number.isFinite(record.inputPrice) ? { inputPrice: record.inputPrice } : {},
56
63
  ...typeof record?.outputPrice === "number" && Number.isFinite(record.outputPrice) ? { outputPrice: record.outputPrice } : {},
57
64
  updatedAt: typeof record?.updatedAt === "string" || typeof record?.updatedAt === "number" ? record.updatedAt : typeof record?.createdAt === "string" || typeof record?.createdAt === "number" ? record.createdAt : typeof record?.created === "string" || typeof record?.created === "number" ? record.created : null,
@@ -104,6 +111,7 @@ async function listLocalCachedAgents(args) {
104
111
  for (const prefix of [ownedPrefix, PUBLIC_AGENT_KEY_PREFIX]) {
105
112
  for await (const [key, value] of args.db.iterator({ gte: prefix, lte: `${prefix}\uFFFF` })) {
106
113
  if (typeof key !== "string" || !value || typeof value !== "object") continue;
114
+ if (isTombstoneRecord(value)) continue;
107
115
  if (isOwnedAgentKey(key, args.userId)) {
108
116
  privateRecords.set(key, { ...value, dbKey: key });
109
117
  continue;
@@ -187,8 +195,11 @@ async function listFavoriteAgentIdsAcrossServers(args) {
187
195
  },
188
196
  body: JSON.stringify({ targetType: "agent" })
189
197
  });
190
- if (!res.ok) return;
191
- const data = await res.json().catch(() => ({}));
198
+ if (!res.ok) throw new Error("favorites request failed");
199
+ const data = await res.json();
200
+ if (!Array.isArray(data?.items) && !Array.isArray(data?.ids)) {
201
+ throw new Error("invalid favorites response");
202
+ }
192
203
  const items = Array.isArray(data?.items) ? data.items : [];
193
204
  for (const item of items) {
194
205
  const id = typeof item?.id === "string" ? item.id : "";
@@ -206,6 +217,7 @@ async function listFavoriteAgentIdsAcrossServers(args) {
206
217
  }
207
218
  }
208
219
  } catch {
220
+ args.onFailure?.(serverUrl);
209
221
  }
210
222
  })
211
223
  );
@@ -258,9 +270,11 @@ function findTightestQuotaWindow(quota, now = Date.now()) {
258
270
  return best ?? quota.windows[0];
259
271
  }
260
272
  function formatQuotaSummary(quota, now = Date.now(), options) {
261
- const tightest = findTightestQuotaWindow(quota, now);
262
- if (!tightest) return void 0;
263
273
  const compact = options?.compact === true;
274
+ const planText = formatPlanLabel(quota?.plan);
275
+ const planName = typeof quota?.plan?.name === "string" ? quota.plan.name.trim() : "";
276
+ const tightest = findTightestQuotaWindow(quota, now);
277
+ if (!tightest) return compact ? planName || void 0 : planText;
264
278
  const parts = [];
265
279
  if (typeof tightest.utilization === "number") {
266
280
  const pct = Math.round(tightest.utilization * 100);
@@ -272,7 +286,10 @@ function formatQuotaSummary(quota, now = Date.now(), options) {
272
286
  parts.push(`\u4F59${tightest.remaining}${tightest.unit ? ` ${tightest.unit}` : ""}`);
273
287
  }
274
288
  }
275
- if (compact) return parts.length > 0 ? parts[0] : void 0;
289
+ if (compact) {
290
+ const head = parts.length > 0 ? parts[0] : void 0;
291
+ return [planName || void 0, head].filter(Boolean).join(" \xB7 ") || void 0;
292
+ }
276
293
  if (tightest.scope && tightest.scope !== "user" && tightest.scope !== "project" && tightest.scope !== tightest.unit) {
277
294
  parts.push(tightest.scope);
278
295
  }
@@ -290,9 +307,15 @@ function formatQuotaSummary(quota, now = Date.now(), options) {
290
307
  parts.push(`${days}d\u540E\u91CD\u7F6E`);
291
308
  }
292
309
  }
293
- if (parts.length === 0) return void 0;
294
- if (parts.length === 1 && parts[0] === tightest.scope) return void 0;
295
- return parts.join(" \xB7 ");
310
+ const onlyScope = parts.length === 0 || parts.length === 1 && parts[0] === tightest.scope;
311
+ if (onlyScope) return planText;
312
+ return [planText, ...parts].filter(Boolean).join(" \xB7 ");
313
+ }
314
+ function formatPlanLabel(plan) {
315
+ const name = typeof plan?.name === "string" ? plan.name.trim() : "";
316
+ if (!name) return void 0;
317
+ const credits = typeof plan?.monthlyCreditsUsd === "number" && Number.isFinite(plan.monthlyCreditsUsd) && plan.monthlyCreditsUsd > 0 ? `\u6708\u5EA6\u989D\u5EA6 $${plan.monthlyCreditsUsd}` : void 0;
318
+ return [`${name} \u5957\u9910`, credits].filter(Boolean).join(" \xB7 ");
296
319
  }
297
320
 
298
321
  export {