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

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-T7ANHTUW.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-4L5KCKFY.js} +181 -93
  7. package/{agentEmailCommands-A6XBQZBN.js → agentEmailCommands-2IMMIRO2.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-KIWXWT6L.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-727NPCRW.js +154 -0
  14. package/agentRunCommand-JASIG3FZ.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-SLV57QGU.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-ID7LNBWR.js → chunk-3T4ZG6AC.js} +1920 -644
  35. package/{chunk-GNMAFAIS.js → chunk-44WXLHFI.js} +1 -1
  36. package/{chunk-AGGIDPCZ.js → chunk-4JH2UMJR.js} +6 -0
  37. package/chunk-4LCOCOR5.js +50 -0
  38. package/chunk-4YRTZIVN.js +871 -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-TXH4IWJL.js → chunk-626KHJNX.js} +20 -11
  46. package/{chunk-M5PVFLD4.js → chunk-64K7WX26.js} +90 -21
  47. package/{chunk-AKG5W4LG.js → chunk-6CCFTVBP.js} +76 -221
  48. package/chunk-6MJNEXUU.js +614 -0
  49. package/{chunk-62IL3KQV.js → chunk-6MXDOUMH.js} +15 -3
  50. package/{chunk-QOKAKDPE.js → chunk-6Q7UTJKR.js} +6 -94
  51. package/chunk-6QDYSCPW.js +223 -0
  52. package/{chunk-HYZIYH2H.js → chunk-74RAWNQN.js} +56 -63
  53. package/chunk-7DPNBQSV.js +9 -0
  54. package/{chunk-IAESIMK7.js → chunk-A4MW3YZL.js} +10 -14
  55. package/{chunk-OMRJYNCI.js → chunk-AG7MCDLR.js} +26 -31
  56. package/chunk-AGIM7IMJ.js +147 -0
  57. package/{chunk-7CHC4W22.js → chunk-AIZE5TDM.js} +3 -3
  58. package/chunk-AJ3G7X2K.js +7012 -0
  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-YAQJJDC2.js → chunk-BJEZC5RA.js} +214 -51
  63. package/{chunk-RYZINGPM.js → chunk-BPMPOFWP.js} +347 -235
  64. package/{chunk-YUNJN43V.js → chunk-BU2YQBV4.js} +215 -28
  65. package/{chunk-XPRWFQQK.js → chunk-CBHGZRCE.js} +38 -12
  66. package/{chunk-Y3PMXGLH.js → chunk-CHCS6XPJ.js} +365 -144
  67. package/chunk-CHOZJMJS.js +78 -0
  68. package/chunk-CYJWI3NH.js +119 -0
  69. package/{chunk-GBRG75BQ.js → chunk-D2MDMY2M.js} +1 -0
  70. package/{chunk-3SV7RM24.js → chunk-D2QN6CTI.js} +117 -72
  71. package/{chunk-TZZ2WRBL.js → chunk-DFDXM2Y4.js} +20 -16
  72. package/{chunk-5TEEECZM.js → chunk-E2AKSW7L.js} +10 -7
  73. package/{chunk-RSEEDUMS.js → chunk-EDX5XSJM.js} +2 -2
  74. package/{chunk-QDSINZM3.js → chunk-EUGTFFO6.js} +2 -23
  75. package/{chunk-UNYJU5L6.js → chunk-EYLGAEB4.js} +5 -1
  76. package/{chunk-CU3QB4HW.js → chunk-EYWJT7A2.js} +12 -12
  77. package/{chunk-BNGW5ASC.js → chunk-EZVK3N5L.js} +66 -18
  78. package/{chunk-6FGTMQCL.js → chunk-F32Z66T4.js} +6 -10
  79. package/{chunk-ZOVKKMF6.js → chunk-FY4SDK2E.js} +1 -1
  80. package/chunk-G6OOUQWJ.js +417 -0
  81. package/{chunk-PQWU42UQ.js → chunk-GCKHQECX.js} +6 -6
  82. package/chunk-GKXCHNTE.js +15 -0
  83. package/{chunk-P6GMCCAT.js → chunk-GQV5KHJU.js} +78 -12
  84. package/{chunk-B2XUQXQX.js → chunk-HIQ4GF53.js} +191 -68
  85. package/{chunk-GMZLP5DV.js → chunk-HNUWUO75.js} +30 -19
  86. package/{chunk-UASIEDKM.js → chunk-I2XLRXVX.js} +36 -31
  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-BIDGLJQ3.js → chunk-IK2TSJQA.js} +45 -8
  93. package/{chunk-CPUFH46E.js → chunk-ILU2NPWY.js} +10 -10
  94. package/{chunk-SLLGJZDT.js → chunk-ISQL4V7C.js} +4 -4
  95. package/chunk-IT3ZZRJE.js +12 -0
  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-BFU6C242.js → chunk-NMFV26UG.js} +1 -1
  103. package/{chunk-5J3PYNUP.js → chunk-NYYFIKHI.js} +17 -3
  104. package/{chunk-6O4IK4V2.js → chunk-OFFL4DCR.js} +1 -1
  105. package/{chunk-B6SAMB33.js → chunk-OWYYDMGJ.js} +209 -9
  106. package/{chunk-KQHGZWSV.js → chunk-OXME3PEE.js} +1 -1
  107. package/{chunk-CTUQJVQM.js → chunk-P5QACQDK.js} +1 -1
  108. package/{chunk-TB3MIBRC.js → chunk-PIDUNDFS.js} +572 -430
  109. package/{chunk-4JMDLJAD.js → chunk-PJNFNEJE.js} +114 -37
  110. package/chunk-PKZKOVA5.js +11507 -0
  111. package/{chunk-Z4CSIXYP.js → chunk-PLSVXHSA.js} +3 -3
  112. package/chunk-PWTNI4N7.js +47 -0
  113. package/chunk-QFEW2ULV.js +42 -0
  114. package/{chunk-RGNEEJ3Y.js → chunk-QLQ573SU.js} +35 -9
  115. package/chunk-QQ56R7KS.js +88 -0
  116. package/chunk-QYPE3TS3.js +43 -0
  117. package/{chunk-HTVYCXBP.js → chunk-RN2GPWN6.js} +354 -120
  118. package/{chunk-ATLTFRYJ.js → chunk-ROCUB2H2.js} +280 -98
  119. package/{chunk-4DPP773Q.js → chunk-RSHPU4PD.js} +59 -11
  120. package/chunk-RVWMAFIT.js +134 -0
  121. package/{chunk-ESHYE7WU.js → chunk-S73EPYNC.js} +10 -7
  122. package/{chunk-UQNS32WZ.js → chunk-SCMHQUMK.js} +1 -1
  123. package/chunk-SW4S4XYB.js +1794 -0
  124. package/{chunk-ZUEK6A6C.js → chunk-TTH4HOJD.js} +1973 -754
  125. package/chunk-TY3TIUJK.js +89 -0
  126. package/{chunk-X2QRZXZH.js → chunk-TYJ5XFEA.js} +4 -4
  127. package/{chunk-ALFH24P3.js → chunk-TYYRSFBG.js} +197 -155
  128. package/{chunk-MST6R3E4.js → chunk-U5GPBQDG.js} +34 -22
  129. package/chunk-U5ICMAFV.js +14110 -0
  130. package/{chunk-7KVZ5LDQ.js → chunk-UBUH2TCC.js} +18 -4
  131. package/chunk-UEILX4EV.js +15 -0
  132. package/chunk-UHTDNB5Y.js +140 -0
  133. package/{chunk-YYLHWIW6.js → chunk-UKZX3NHN.js} +1 -1
  134. package/{chunk-OHOVNO7I.js → chunk-UOKFKFPO.js} +6 -3
  135. package/{chunk-XISEYOGH.js → chunk-USHQX6VT.js} +5 -5
  136. package/chunk-UUPR3TD7.js +53 -0
  137. package/{chunk-3DAVPNFT.js → chunk-V4EE3D54.js} +122 -107
  138. package/{chunk-HDLLCBRF.js → chunk-VEA7H5FG.js} +2 -2
  139. package/chunk-VHGD6FHV.js +116 -0
  140. package/chunk-VIWDGTDA.js +8 -0
  141. package/{chunk-GOH6RW6F.js → chunk-VJXHL6MH.js} +34 -11
  142. package/{chunk-4XEYAFLY.js → chunk-VL5KOY2C.js} +623 -94
  143. package/{chunk-EADNWBAZ.js → chunk-VP3BINY7.js} +13 -0
  144. package/{chunk-DXHL7G2L.js → chunk-VWW6O2TL.js} +274 -93
  145. package/{chunk-EOARMOVD.js → chunk-W4S6OTSC.js} +6 -3
  146. package/chunk-WD4XYDYC.js +567 -0
  147. package/chunk-WJZOQR2J.js +151 -0
  148. package/{chunk-AUDNYVRC.js → chunk-XETG4RIX.js} +5 -5
  149. package/{chunk-MX574M24.js → chunk-XI7DGLUK.js} +4 -4
  150. package/{chunk-3L2WKC3W.js → chunk-XPWGOTBQ.js} +8 -1
  151. package/chunk-XRUSXPCQ.js +514 -0
  152. package/{chunk-I4OPU5TK.js → chunk-XS47QOFV.js} +273 -11
  153. package/{chunk-S5XGT6GB.js → chunk-XZNCX52W.js} +30 -9
  154. package/{chunk-5OA5HMTL.js → chunk-YLMMECCH.js} +1 -1
  155. package/{chunk-CFT5HBGW.js → chunk-YVLQXTUB.js} +448 -12
  156. package/chunk-YVPQATSC.js +709 -0
  157. package/chunk-ZEZC7IIM.js +126 -0
  158. package/{chunk-ALGORS6Y.js → chunk-ZF6526IQ.js} +43 -8
  159. package/chunk-ZIWPQEFU.js +165 -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-NBLZEMCW.js} +183 -107
  164. package/contentThunks-6AIWNSGO.js +84 -0
  165. package/{cooldownCommands-ZLEPIB4A.js → cooldownCommands-JFKTYS2D.js} +2 -2
  166. package/{createAgentAutomationAction-5UGTB26P.js → createAgentAutomationAction-4BUS65DZ.js} +53 -44
  167. package/createDialogAction-QAIKSCG4.js +76 -0
  168. package/{createPageAction-CDLDKPRM.js → createPageAction-DXCZ334C.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-PVUSMKFW.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-CSEBEMKP.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-G2TLYGC4.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-B4TAYYA7.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-6OBFD3XF.js} +503 -161
  190. package/{machineInfo-66ZFUMLE.js → machineInfo-UKPTZO5Y.js} +2 -2
  191. package/machineWsRunDispatch-OO7N3O3Y.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-UIQN7JUR.js} +5017 -915
  200. package/{removeDialogAgentAction-OSYNZRX7.js → removeDialogAgentAction-E2H3OZU6.js} +29 -28
  201. package/{runAgentClientLoop-6E6UC3CE.js → runAgentClientLoop-GS3SGG37.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-4XYC33KE.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-P77EE7Q4.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-CIANVPZC.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
@@ -7,22 +7,25 @@ import {
7
7
  runLogoutCommand,
8
8
  runWhoamiCommand,
9
9
  saveTokenLogin
10
- } from "./chunk-IVZJWTDI.js";
11
- import "./chunk-ESHYE7WU.js";
12
- import "./chunk-ZOVKKMF6.js";
10
+ } from "./chunk-36OMEXXR.js";
11
+ import "./chunk-TY3TIUJK.js";
12
+ import "./chunk-S73EPYNC.js";
13
+ import "./chunk-ZEZC7IIM.js";
14
+ import "./chunk-OW765XBU.js";
15
+ import "./chunk-5EMSBTQ6.js";
16
+ import "./chunk-I42VC5KR.js";
17
+ import "./chunk-U6VC4MU4.js";
18
+ import "./chunk-WWC7I6TA.js";
19
+ import "./chunk-3EUW3WEO.js";
20
+ import "./chunk-FY4SDK2E.js";
13
21
  import "./chunk-GLKOYSRU.js";
14
- import "./chunk-JBTJAPUF.js";
15
22
  import "./chunk-A7GB5UGH.js";
16
23
  import "./chunk-OLZBQWZU.js";
17
- import "./chunk-TNIX77YM.js";
18
- import "./chunk-3AH7LNUB.js";
19
- import "./chunk-WWC7I6TA.js";
20
- import "./chunk-3EUW3WEO.js";
21
- import "./chunk-U6VC4MU4.js";
22
24
  import "./chunk-LCBAMY2M.js";
23
25
  import "./chunk-4SN6J65J.js";
24
26
  import "./chunk-CF7PE763.js";
25
27
  import "./chunk-G3SUCT4W.js";
28
+ import "./chunk-TNIX77YM.js";
26
29
  import "./chunk-4VNS5WPM.js";
27
30
  export {
28
31
  LOGIN_HELP_TEXT,
@@ -7,20 +7,22 @@ import {
7
7
  resolveBuiltinSkillEntry,
8
8
  resolveBuiltinSkillPage,
9
9
  resolveBuiltinSkillSlug
10
- } from "./chunk-B2XUQXQX.js";
11
- import "./chunk-6TPOEJMQ.js";
12
- import "./chunk-AUDNYVRC.js";
13
- import "./chunk-KHCLMKZZ.js";
14
- import "./chunk-XUWRURDF.js";
15
- import "./chunk-5J3PYNUP.js";
16
- import "./chunk-QDSINZM3.js";
17
- import "./chunk-3AH7LNUB.js";
18
- import "./chunk-WWC7I6TA.js";
19
- import "./chunk-BNGW5ASC.js";
10
+ } from "./chunk-HIQ4GF53.js";
11
+ import "./chunk-JZX2XLKC.js";
12
+ import "./chunk-EUGTFFO6.js";
13
+ import "./chunk-XETG4RIX.js";
14
+ import "./chunk-GKXCHNTE.js";
15
+ import "./chunk-5EBLANFT.js";
16
+ import "./chunk-NYYFIKHI.js";
17
+ import "./chunk-EZVK3N5L.js";
20
18
  import "./chunk-M2EJHDJP.js";
21
- import "./chunk-3EUW3WEO.js";
19
+ import "./chunk-5EMSBTQ6.js";
20
+ import "./chunk-I42VC5KR.js";
22
21
  import "./chunk-U6VC4MU4.js";
22
+ import "./chunk-WWC7I6TA.js";
23
+ import "./chunk-3EUW3WEO.js";
23
24
  import "./chunk-G3SUCT4W.js";
25
+ import "./chunk-KHCLMKZZ.js";
24
26
  import "./chunk-4VNS5WPM.js";
25
27
  export {
26
28
  CAPABILITY_SLUG_COLLISIONS,
@@ -1,18 +1,21 @@
1
1
  import {
2
+ NOLO_CHROME_CONNECTOR_DEFAULT_PORTS,
2
3
  NOLO_CHROME_CONNECTOR_EXTENSION_ID,
3
4
  NOLO_CHROME_CONNECTOR_PROTOCOL_VERSION,
4
5
  NOLO_CONNECTOR_EXTENSION_IDS,
5
6
  NOLO_FIREFOX_CONNECTOR_EXTENSION_ID,
6
7
  REQUIRED_CHROME_CONNECTOR_FEATURES,
7
- createChromeConnectorClient
8
- } from "./chunk-YUNJN43V.js";
8
+ createChromeConnectorClient,
9
+ resolveUploadRoots
10
+ } from "./chunk-BU2YQBV4.js";
11
+ import "./chunk-KUG52IAP.js";
9
12
  import {
10
13
  toErrorMessage
11
14
  } from "./chunk-HNMXYYJR.js";
12
- import "./chunk-KUG52IAP.js";
13
15
  import "./chunk-4VNS5WPM.js";
14
16
 
15
17
  // packages/cli/chromeCommands.ts
18
+ import { spawnSync } from "node:child_process";
16
19
  import { existsSync as existsSync2, readFileSync as readFileSync2, statSync as statSync2 } from "node:fs";
17
20
  import { resolve as resolve2 } from "node:path";
18
21
 
@@ -77,6 +80,7 @@ function resolveNativeHostInstallPaths({
77
80
  browser = "chrome"
78
81
  } = {}) {
79
82
  const supportDir = resolve(home, "Library/Application Support/Nolo/ChromeConnector");
83
+ const wrapperName = browser === "firefox" ? "nolo-firefox-native-host" : "nolo-chrome-native-host";
80
84
  return {
81
85
  connectorRoot,
82
86
  browser,
@@ -89,9 +93,15 @@ function resolveNativeHostInstallPaths({
89
93
  ),
90
94
  supportDir,
91
95
  tokenPath: resolve(supportDir, "token"),
92
- wrapperPath: resolve(supportDir, "nolo-chrome-native-host")
96
+ wrapperPath: resolve(supportDir, wrapperName)
93
97
  };
94
98
  }
99
+ function connectorPortForBrowser({ browser = "chrome", env = process.env } = {}) {
100
+ if (browser === "firefox") {
101
+ return Number(env.NOLO_FIREFOX_CONNECTOR_PORT || 38948);
102
+ }
103
+ return Number(env.NOLO_CHROME_CONNECTOR_PORT || 38947);
104
+ }
95
105
  function installNativeHostManifest({
96
106
  home = process.env.HOME || "",
97
107
  connectorRoot = DEFAULT_CONNECTOR_ROOT,
@@ -110,10 +120,11 @@ function installNativeHostManifest({
110
120
  const token = existingToken || randomBytes(32).toString("hex");
111
121
  writeFileSync(paths.tokenPath, `${token}
112
122
  `, { mode: 384 });
123
+ const port = connectorPortForBrowser({ browser });
113
124
  writeFileSync(
114
125
  paths.wrapperPath,
115
126
  `#!/bin/sh
116
- NOLO_CHROME_CONNECTOR_TOKEN=${JSON.stringify(token)} exec ${JSON.stringify(resolvedNodePath)} ${JSON.stringify(paths.hostPath)}
127
+ NOLO_CHROME_CONNECTOR_BROWSER=${JSON.stringify(browser)} NOLO_CHROME_CONNECTOR_TOKEN=${JSON.stringify(token)} ${browser === "firefox" ? `NOLO_FIREFOX_CONNECTOR_PORT=${JSON.stringify(String(port))} ` : ""}exec ${JSON.stringify(resolvedNodePath)} ${JSON.stringify(paths.hostPath)}
117
128
  `
118
129
  );
119
130
  chmodSync(paths.wrapperPath, 493);
@@ -161,6 +172,64 @@ function expectedFeaturesForBrowser(browser) {
161
172
  function browserLabel(browser) {
162
173
  return browser === "firefox" ? "Firefox" : browser === "chrome" ? "Chrome" : "browser";
163
174
  }
175
+ async function fetchOnlineBuildSha(fetchImpl = fetch, timeoutMs = 3e3) {
176
+ try {
177
+ const controller = new AbortController();
178
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
179
+ const res = await fetchImpl("https://us.nolo.chat/public/latest-assets.json", {
180
+ signal: controller.signal
181
+ }).finally(() => clearTimeout(timer));
182
+ if (!res.ok) return null;
183
+ const data = await res.json();
184
+ return typeof data?.buildSha === "string" ? data.buildSha : null;
185
+ } catch {
186
+ return null;
187
+ }
188
+ }
189
+ function resolveLocalHeadSha() {
190
+ try {
191
+ const result = spawnSync("git", ["rev-parse", "HEAD"], {
192
+ encoding: "utf8",
193
+ timeout: 3e3,
194
+ stdio: ["ignore", "pipe", "ignore"]
195
+ });
196
+ if (result.status === 0 && typeof result.stdout === "string") {
197
+ const sha = result.stdout.trim();
198
+ return sha.length >= 7 ? sha : null;
199
+ }
200
+ return null;
201
+ } catch {
202
+ return null;
203
+ }
204
+ }
205
+ function compareDeployShas(localSha, onlineSha) {
206
+ if (!localSha || !onlineSha) return "unknown";
207
+ if (localSha === onlineSha || localSha.slice(0, 7) === onlineSha.slice(0, 7)) {
208
+ return "in sync";
209
+ }
210
+ try {
211
+ const localAhead = spawnSync("git", ["merge-base", "--is-ancestor", onlineSha, localSha], {
212
+ timeout: 3e3,
213
+ stdio: ["ignore", "ignore", "ignore"]
214
+ });
215
+ if (localAhead.status === 0) return "local ahead";
216
+ const onlineAhead = spawnSync("git", ["merge-base", "--is-ancestor", localSha, onlineSha], {
217
+ timeout: 3e3,
218
+ stdio: ["ignore", "ignore", "ignore"]
219
+ });
220
+ if (onlineAhead.status === 0) return "online ahead";
221
+ const objCheck = spawnSync("git", ["cat-file", "-e", `${onlineSha}^{commit}`], {
222
+ timeout: 3e3,
223
+ stdio: ["ignore", "ignore", "ignore"]
224
+ });
225
+ if (objCheck.status === 0) {
226
+ return "diverged";
227
+ }
228
+ return "unknown";
229
+ } catch {
230
+ return "unknown";
231
+ }
232
+ }
164
233
  function pickCliConnectorRoot(candidates) {
165
234
  for (const candidate of candidates) {
166
235
  if (existsSync2(resolve2(candidate, "extension", "manifest.json"))) return candidate;
@@ -249,6 +318,12 @@ function readJsonFile(path) {
249
318
  return null;
250
319
  }
251
320
  }
321
+ function resolveConnectorEndpoint(browser, env) {
322
+ const explicitUrl = (env.NOLO_CHROME_CONNECTOR_RPC_URL ?? "").trim();
323
+ if (explicitUrl) return explicitUrl;
324
+ const port = browser === "firefox" ? env.NOLO_FIREFOX_CONNECTOR_PORT : env.NOLO_CHROME_CONNECTOR_PORT;
325
+ return `http://127.0.0.1:${port || NOLO_CHROME_CONNECTOR_DEFAULT_PORTS[browser]}/rpc`;
326
+ }
252
327
  async function probeConnectorRpc(requestChrome) {
253
328
  try {
254
329
  const connectorInfo = await requestChrome("connector_info", {}) ?? {};
@@ -274,6 +349,90 @@ async function probeConnectorRpc(requestChrome) {
274
349
  };
275
350
  }
276
351
  }
352
+ var CONNECTOR_BROWSER_ORDER = ["chrome", "firefox"];
353
+ var notProbedRequest = async () => {
354
+ throw Object.assign(new Error("endpoint not probed (a shared request override pins the other one)"), {
355
+ code: "CHROME_CONNECTOR_UNAVAILABLE"
356
+ });
357
+ };
358
+ function expectedExtensionIdFor(browser, chromeExtensionId) {
359
+ return browser === "firefox" ? NOLO_FIREFOX_CONNECTOR_EXTENSION_ID : chromeExtensionId;
360
+ }
361
+ async function probeBrowserStatuses(args) {
362
+ const entries = await Promise.all(
363
+ CONNECTOR_BROWSER_ORDER.map(async (browser) => {
364
+ const probe = await probeConnectorRpc(args.requestFor(browser));
365
+ const build = probe.online ? resolveConnectorBrowser(probe.extensionId) : null;
366
+ const status = {
367
+ browser,
368
+ endpoint: resolveConnectorEndpoint(browser, args.env),
369
+ expectedExtensionId: expectedExtensionIdFor(browser, args.chromeExtensionId),
370
+ nativeHost: {
371
+ manifestPath: null,
372
+ installed: false,
373
+ wrapperPathMatches: false,
374
+ allowedOriginMatches: false
375
+ },
376
+ token: { path: null, present: false },
377
+ rpc: {
378
+ online: probe.online,
379
+ extensionId: probe.extensionId,
380
+ build,
381
+ protocolVersion: probe.protocolVersion,
382
+ features: probe.features,
383
+ ...probe.online ? {} : { error: probe.error }
384
+ },
385
+ usable: probe.online
386
+ };
387
+ return [browser, status];
388
+ })
389
+ );
390
+ return Object.fromEntries(entries);
391
+ }
392
+ function summarizeBrowsers(statuses, explicit) {
393
+ const online = CONNECTOR_BROWSER_ORDER.filter((browser) => statuses[browser].usable);
394
+ const requiresExplicitBrowser = online.length > 1;
395
+ const autoSelected = requiresExplicitBrowser ? null : online[0] ?? null;
396
+ return {
397
+ chrome: statuses.chrome,
398
+ firefox: statuses.firefox,
399
+ online: [...online],
400
+ autoSelected,
401
+ requiresExplicitBrowser,
402
+ explicit,
403
+ // Falls back to Chrome only to keep the legacy single-browser fields non-null-shaped (the old
404
+ // report always described the Chrome endpoint when nothing was connected).
405
+ selected: explicit ?? autoSelected ?? "chrome"
406
+ };
407
+ }
408
+ function fillBrowserInstallFacts(status, args) {
409
+ try {
410
+ const paths = resolveNativeHostInstallPaths({
411
+ home: args.home,
412
+ connectorRoot: args.connectorRoot,
413
+ platform: args.platform,
414
+ browser: status.browser
415
+ });
416
+ const installedManifest = existsSync2(paths.nativeManifestPath) ? readJsonFile(paths.nativeManifestPath) : null;
417
+ status.nativeHost = {
418
+ manifestPath: paths.nativeManifestPath,
419
+ installed: installedManifest !== null,
420
+ wrapperPathMatches: typeof installedManifest?.path === "string" && installedManifest.path === paths.wrapperPath,
421
+ allowedOriginMatches: status.browser === "firefox" ? Array.isArray(installedManifest?.allowed_extensions) && installedManifest.allowed_extensions.includes(NOLO_FIREFOX_CONNECTOR_EXTENSION_ID) : Array.isArray(installedManifest?.allowed_origins) && installedManifest.allowed_origins.includes(
422
+ `chrome-extension://${args.chromeExtensionId}/`
423
+ )
424
+ };
425
+ status.token = { path: paths.tokenPath, present: false };
426
+ if (existsSync2(paths.tokenPath)) {
427
+ try {
428
+ status.token.present = readFileSync2(paths.tokenPath, "utf8").trim().length > 0;
429
+ } catch {
430
+ status.token.present = false;
431
+ }
432
+ }
433
+ } catch {
434
+ }
435
+ }
277
436
  function resolveStatusNextStep(report) {
278
437
  const targetBrowser = report.rpc.browser ?? report.nativeHost.browser;
279
438
  const installCmd = targetBrowser === "firefox" ? "nolo chrome install --browser firefox" : "nolo chrome install";
@@ -310,12 +469,16 @@ function resolveStatusNextStep(report) {
310
469
  if (report.rpc.missingFeatures.length > 0) {
311
470
  return `nolo chrome reload (the running extension is missing ${report.rpc.missingFeatures.join(", ")}); if that persists, the checkout's extension is older than the CLI expects.`;
312
471
  }
472
+ if (report.browsers.requiresExplicitBrowser) {
473
+ return `Both Chrome and Firefox connectors are online, so every unqualified \`nolo browser <op>\` call fails with MULTIPLE_BROWSERS_AVAILABLE: pass --browser chrome or --browser firefox. The single-browser lines above describe ${browserLabel(report.browsers.selected)} (--browser, else Chrome).`;
474
+ }
313
475
  return `The Nolo Browser Connector is online (${connectedLabel}): connector tools execute against this ${connectedLabel} profile.`;
314
476
  }
315
477
  async function buildChromeConnectorStatus(args = {}) {
316
478
  const env = args.env ?? process.env;
317
479
  const home = args.home ?? env.HOME ?? "";
318
480
  const platform = args.platform ?? process.platform;
481
+ const browserTarget = args.browser;
319
482
  let connectorRoot = args.connectorRoot ?? null;
320
483
  let rootError = null;
321
484
  if (!connectorRoot) {
@@ -327,6 +490,19 @@ async function buildChromeConnectorStatus(args = {}) {
327
490
  }
328
491
  const extensionManifest = connectorRoot ? readExtensionManifest(connectorRoot) : null;
329
492
  const expectedId = extensionManifest && typeof extensionManifest.key === "string" ? extensionIdFromPublicKey(extensionManifest.key) : NOLO_CHROME_CONNECTOR_EXTENSION_ID;
493
+ const sharedOverrideTarget = browserTarget ?? "chrome";
494
+ const requestFor = (browser) => {
495
+ const perBrowser = args.requestChromeFor?.(browser);
496
+ if (perBrowser) return perBrowser;
497
+ if (!args.requestChrome) return createChromeConnectorClient({ browser }).request;
498
+ return browser === sharedOverrideTarget ? args.requestChrome : notProbedRequest;
499
+ };
500
+ const browserStatuses = await probeBrowserStatuses({
501
+ env,
502
+ chromeExtensionId: expectedId,
503
+ requestFor
504
+ });
505
+ const browsersReport = summarizeBrowsers(browserStatuses, browserTarget ?? null);
330
506
  const report = {
331
507
  ok: false,
332
508
  connectorRoot,
@@ -345,6 +521,12 @@ async function buildChromeConnectorStatus(args = {}) {
345
521
  browser: null
346
522
  },
347
523
  token: { path: null, present: false },
524
+ uploadRoots: { roots: [], isDefault: false },
525
+ deploy: {
526
+ localSha: null,
527
+ onlineSha: null,
528
+ sync: "unknown"
529
+ },
348
530
  rpc: {
349
531
  online: false,
350
532
  extensionId: null,
@@ -354,10 +536,48 @@ async function buildChromeConnectorStatus(args = {}) {
354
536
  missingFeatures: [...FULL_SUPPORT_CHROME_FEATURES],
355
537
  expectedProtocolVersion: NOLO_CHROME_CONNECTOR_PROTOCOL_VERSION
356
538
  },
539
+ browsers: browsersReport,
357
540
  nextStep: ""
358
541
  };
359
- const requestChrome = args.requestChrome ?? createChromeConnectorClient().request;
360
- const probe = await probeConnectorRpc(requestChrome);
542
+ try {
543
+ const rootsInfo = resolveUploadRoots({ ...env, ...home ? { HOME: home } : {} });
544
+ report.uploadRoots = {
545
+ roots: rootsInfo.roots,
546
+ isDefault: rootsInfo.isDefault
547
+ };
548
+ } catch (error) {
549
+ report.uploadRoots = {
550
+ roots: [],
551
+ isDefault: false,
552
+ error: toErrorMessage(error)
553
+ };
554
+ }
555
+ let localHeadSha = null;
556
+ try {
557
+ localHeadSha = (args.resolveLocalHeadSha ?? resolveLocalHeadSha)();
558
+ } catch {
559
+ localHeadSha = null;
560
+ }
561
+ let onlineBuildSha = null;
562
+ try {
563
+ onlineBuildSha = await (args.fetchOnlineBuildSha ?? fetchOnlineBuildSha)();
564
+ } catch {
565
+ onlineBuildSha = null;
566
+ }
567
+ let sync = "unknown";
568
+ try {
569
+ const compareShas = args.compareDeployShas ?? compareDeployShas;
570
+ sync = compareShas(localHeadSha, onlineBuildSha);
571
+ } catch {
572
+ sync = "unknown";
573
+ }
574
+ report.deploy = {
575
+ localSha: localHeadSha,
576
+ onlineSha: onlineBuildSha,
577
+ sync
578
+ };
579
+ const selectedBrowser = browsersReport.selected ?? "chrome";
580
+ const probe = browserStatuses[selectedBrowser].rpc;
361
581
  report.rpc.online = probe.online;
362
582
  report.rpc.extensionId = probe.extensionId;
363
583
  report.rpc.protocolVersion = probe.protocolVersion;
@@ -374,7 +594,7 @@ async function buildChromeConnectorStatus(args = {}) {
374
594
  report.nextStep = resolveStatusNextStep(report);
375
595
  return report;
376
596
  }
377
- let manifestBrowser = report.rpc.browser === "firefox" ? "firefox" : "chrome";
597
+ let manifestBrowser = browserTarget ?? (report.rpc.browser === "firefox" ? "firefox" : "chrome");
378
598
  if (!report.rpc.browser) {
379
599
  try {
380
600
  const chromeManifestPath = resolveNativeHostInstallPaths({
@@ -413,6 +633,16 @@ async function buildChromeConnectorStatus(args = {}) {
413
633
  report.nativeHost.manifestPath = paths.nativeManifestPath;
414
634
  report.nativeHost.wrapperPath = paths.wrapperPath;
415
635
  report.token.path = paths.tokenPath;
636
+ if (connectorRoot) {
637
+ for (const browser of CONNECTOR_BROWSER_ORDER) {
638
+ fillBrowserInstallFacts(browserStatuses[browser], {
639
+ home,
640
+ connectorRoot,
641
+ platform,
642
+ chromeExtensionId: expectedId
643
+ });
644
+ }
645
+ }
416
646
  const installedManifest = existsSync2(paths.nativeManifestPath) ? readJsonFile(paths.nativeManifestPath) : null;
417
647
  report.nativeHost.installed = installedManifest !== null;
418
648
  report.nativeHost.installedWrapperPath = typeof installedManifest?.path === "string" ? installedManifest.path : null;
@@ -432,6 +662,29 @@ async function buildChromeConnectorStatus(args = {}) {
432
662
  function yesNo(value) {
433
663
  return value ? "ok" : "mismatch";
434
664
  }
665
+ function endpointPort(endpoint) {
666
+ try {
667
+ return new URL(endpoint).port || "(default)";
668
+ } catch {
669
+ return endpoint;
670
+ }
671
+ }
672
+ function formatBrowserStatusLine(status) {
673
+ const rpcText = status.rpc.online ? `RPC online build ${status.rpc.build ?? "unrecognized"} extension ${status.rpc.extensionId ?? "unknown"} protocolVersion ${status.rpc.protocolVersion ?? "unknown"}` : `RPC offline ${status.rpc.error ? `${status.rpc.error.code}: ${status.rpc.error.message}` : "(no detail)"}`;
674
+ const installText = status.nativeHost.manifestPath ? `manifest ${status.nativeHost.installed ? "installed" : "missing"} token ${status.token.present ? "present" : "missing"}` : "manifest (not resolved)";
675
+ const verdict = !status.usable ? "unusable" : status.rpc.build && status.rpc.build !== status.browser ? `usable, but answers as the ${browserLabel(status.rpc.build)} build` : "usable";
676
+ return `${rpcText} port ${endpointPort(status.endpoint)} ${installText} -> ${verdict}`;
677
+ }
678
+ function describeBrowserSelection(browsers) {
679
+ const explicitNote = browsers.explicit ? ` [--browser ${browsers.explicit} pins this report]` : "";
680
+ if (browsers.requiresExplicitBrowser) {
681
+ return `none \u2014 both Chrome and Firefox are online, so pass --browser chrome|firefox (an unqualified call fails with MULTIPLE_BROWSERS_AVAILABLE)${explicitNote}`;
682
+ }
683
+ if (browsers.autoSelected) {
684
+ return `${browsers.autoSelected} \u2014 only ${browserLabel(browsers.autoSelected)} answered, so a bare \`nolo browser <op>\` routes to it${explicitNote}`;
685
+ }
686
+ return `none \u2014 no connector answered, so a bare \`nolo browser <op>\` fails with CHROME_CONNECTOR_UNAVAILABLE${explicitNote}`;
687
+ }
435
688
  function formatChromeConnectorStatus(report) {
436
689
  const lines = ["Nolo Browser Connector"];
437
690
  lines.push(
@@ -450,6 +703,21 @@ function formatChromeConnectorStatus(report) {
450
703
  lines.push(
451
704
  ` token : ${report.token.present ? "present" : "missing"}${report.token.path ? ` ${report.token.path}` : ""}`
452
705
  );
706
+ if (report.uploadRoots.error) {
707
+ lines.push(` upload roots : error (${report.uploadRoots.error})`);
708
+ } else if (report.uploadRoots.roots.length > 0) {
709
+ const originLabel = report.uploadRoots.isDefault ? "default" : "configured";
710
+ lines.push(` upload roots : ${report.uploadRoots.roots.join(", ")} (${originLabel})`);
711
+ } else {
712
+ lines.push(` upload roots : (none)`);
713
+ }
714
+ const localShort = report.deploy.localSha ? report.deploy.localSha.slice(0, 7) : "unknown";
715
+ const onlineShort = report.deploy.onlineSha ? report.deploy.onlineSha.slice(0, 7) : "unknown";
716
+ lines.push(` deploy status : local ${localShort} online ${onlineShort} (${report.deploy.sync})`);
717
+ for (const browser of CONNECTOR_BROWSER_ORDER) {
718
+ lines.push(` ${`${browserLabel(browser)}${browser === "chrome" ? " " : ""}`.padEnd(16)}: ${formatBrowserStatusLine(report.browsers[browser])}`);
719
+ }
720
+ lines.push(` auto selection : ${describeBrowserSelection(report.browsers)}`);
453
721
  const rpc = report.rpc;
454
722
  if (rpc.online) {
455
723
  lines.push(
@@ -466,9 +734,14 @@ function formatChromeConnectorStatus(report) {
466
734
  }
467
735
  async function runChromeStatusCommand(args, deps = {}) {
468
736
  const output = deps.output ?? process.stdout;
737
+ const browser = readBrowserOption(args);
738
+ if (browser === null) {
739
+ output.write('[nolo] Chrome connector status failed: --browser must be "chrome" or "firefox".\n');
740
+ return 1;
741
+ }
469
742
  let report;
470
743
  try {
471
- report = await buildChromeConnectorStatus(deps);
744
+ report = await buildChromeConnectorStatus({ ...deps, browser });
472
745
  } catch (error) {
473
746
  output.write(`[nolo] Chrome connector status failed: ${toErrorMessage(error)}
474
747
  `);
@@ -486,7 +759,7 @@ function readBrowserOption(args) {
486
759
  const equalsForm = args.find((arg) => arg.startsWith("--browser="));
487
760
  const index = args.indexOf("--browser");
488
761
  const raw = equalsForm !== void 0 ? equalsForm.slice("--browser=".length) : index >= 0 ? args[index + 1] : void 0;
489
- if (raw === void 0) return "chrome";
762
+ if (raw === void 0) return void 0;
490
763
  const value = raw.trim();
491
764
  if (value === "chrome" || value === "firefox") return value;
492
765
  return null;
@@ -494,13 +767,14 @@ function readBrowserOption(args) {
494
767
  async function runChromeInstallCommand(args, deps = {}) {
495
768
  const env = deps.env ?? process.env;
496
769
  const output = deps.output ?? process.stdout;
497
- const browser = readBrowserOption(args);
498
- if (browser === null) {
770
+ const parsed = readBrowserOption(args);
771
+ if (parsed === null) {
499
772
  output.write(
500
773
  '[nolo] Chrome native host install failed: --browser must be "chrome" or "firefox".\n'
501
774
  );
502
775
  return 1;
503
776
  }
777
+ const browser = parsed ?? "chrome";
504
778
  const install = deps.installNativeHost ?? installNativeHostManifest;
505
779
  let connectorRoot;
506
780
  try {
@@ -553,8 +827,32 @@ async function runChromeInstallCommand(args, deps = {}) {
553
827
  }
554
828
  async function runChromeReloadCommand(args, deps = {}) {
555
829
  const output = deps.output ?? process.stdout;
556
- const requestChrome = deps.requestChrome ?? createChromeConnectorClient().request;
830
+ const browser = readBrowserOption(args);
831
+ if (browser === null) {
832
+ output.write('[nolo] Chrome connector reload failed: --browser must be "chrome" or "firefox".\n');
833
+ return 1;
834
+ }
835
+ const requestChrome = deps.requestChrome ?? createChromeConnectorClient({ browser }).request;
557
836
  try {
837
+ if (browser) {
838
+ try {
839
+ const info = await requestChrome("connector_info", {});
840
+ const connectedBrowser = resolveConnectorBrowser(
841
+ typeof info?.extensionId === "string" ? info.extensionId : null
842
+ );
843
+ if (connectedBrowser !== null && connectedBrowser !== browser) {
844
+ const mismatch = new Error(
845
+ `the connector on this endpoint answers as ${browserLabel(connectedBrowser)}, not ${browserLabel(browser)} \u2014 refusing to reload the wrong browser. Check NOLO_CHROME_CONNECTOR_RPC_URL / the per-browser port overrides.`
846
+ );
847
+ mismatch.code = "CHROME_CONNECTOR_EXTENSION_MISMATCH";
848
+ throw mismatch;
849
+ }
850
+ } catch (error) {
851
+ if (error?.code === "CHROME_CONNECTOR_EXTENSION_MISMATCH") {
852
+ throw error;
853
+ }
854
+ }
855
+ }
558
856
  const result = await requestChrome("reload_extension", {});
559
857
  if (args.includes("--json")) {
560
858
  output.write(`${JSON.stringify({ ok: true, result }, null, 2)}
@@ -584,11 +882,14 @@ export {
584
882
  FIREFOX_UNAVAILABLE_FEATURES,
585
883
  FULL_SUPPORT_CHROME_FEATURES,
586
884
  buildChromeConnectorStatus,
885
+ compareDeployShas,
587
886
  detectWorktreeCheckout,
588
887
  expectedFeaturesForBrowser,
888
+ fetchOnlineBuildSha,
589
889
  formatChromeConnectorStatus,
590
890
  resolveCliConnectorRoot,
591
891
  resolveConnectorBrowser,
892
+ resolveLocalHeadSha,
592
893
  runChromeInstallCommand,
593
894
  runChromeReloadCommand,
594
895
  runChromeStatusCommand