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.
- package/{_executeModel-OW3H7ICR.js → _executeModel-T7ANHTUW.js} +134 -91
- package/accountResolver-7RYB4D2P.js +300 -0
- package/action-SXJD5N5R.js +23 -0
- package/{addContentAction-B2DRF7P6.js → addContentAction-ZV774PHH.js} +20 -14
- package/{addDialogAgentAction-2P2FLTLD.js → addDialogAgentAction-A6SMKAGH.js} +26 -22
- package/{agentDeleteCommand-7IDWF6E3.js → agentDeleteCommand-4L5KCKFY.js} +181 -93
- package/{agentEmailCommands-A6XBQZBN.js → agentEmailCommands-2IMMIRO2.js} +132 -112
- package/{agentGrantCommands-M3XFO6EN.js → agentGrantCommands-HOJ3JBBQ.js} +3 -3
- package/agentListCommands-TWFLUYIZ.js +802 -0
- package/{agentMachineCommands-DQPUIMAC.js → agentMachineCommands-KIWXWT6L.js} +58 -62
- package/{agentProviderCommands-YK2BIIXZ.js → agentProviderCommands-HL6MBLCL.js} +149 -2
- package/{agentPullCommand-HF4A42D4.js → agentPullCommand-FA43RBRU.js} +7 -7
- package/agentRecordCommands-727NPCRW.js +154 -0
- package/agentRunCommand-JASIG3FZ.js +183 -0
- package/{agentRunControl-2SKCR4SB.js → agentRunControl-IFM7IGMG.js} +10 -2
- package/{agentRuntimeLocal-AK2QVJHY.js → agentRuntimeLocal-KKSQJMTE.js} +47 -50
- package/{agentSlice-O4RUQUMT.js → agentSlice-SLV57QGU.js} +23 -16
- package/{appDeleteCommands-N3XEVVYC.js → appDeleteCommands-4PL4KYRN.js} +58 -59
- package/{appDeployCommands-AWFIXYVW.js → appDeployCommands-EEEXCEB6.js} +67 -63
- package/{appDeployStatusCommands-CZRON2FO.js → appDeployStatusCommands-35ZX7T66.js} +56 -56
- package/{appGetCommands-XQIUY4TD.js → appGetCommands-WFCHXJWF.js} +56 -56
- package/{appListCommands-NNG4H36Y.js → appListCommands-XY2U6DPF.js} +57 -59
- package/{authCommand-UBJ4EWYZ.js → authCommand-QYN47CQD.js} +371 -68
- package/{authCommands-H6WKKCRW.js → authCommands-77CHYBGF.js} +12 -9
- package/{builtinSkillRegistry-ZMF6YGNO.js → builtinSkillRegistry-TDQ6JB2E.js} +13 -11
- package/{chromeCommands-2N6MEWRU.js → chromeCommands-OBBNJCLS.js} +314 -13
- package/chromeOpsCommands-3Z34RKSE.js +472 -0
- package/{chunk-ALXHV7NK.js → chunk-2GGXHQIW.js} +43 -4
- package/{localRuntimeAuthority-5W6IJRAD.js → chunk-2IXDJNZI.js} +154 -75
- package/{chunk-IVZJWTDI.js → chunk-36OMEXXR.js} +89 -21
- package/{chunk-H6A6X4EK.js → chunk-3MZAGMYY.js} +16 -0
- package/chunk-3PVYUPXK.js +40 -0
- package/chunk-3SZA4U64.js +1192 -0
- package/{chunk-ID7LNBWR.js → chunk-3T4ZG6AC.js} +1920 -644
- package/{chunk-GNMAFAIS.js → chunk-44WXLHFI.js} +1 -1
- package/{chunk-AGGIDPCZ.js → chunk-4JH2UMJR.js} +6 -0
- package/chunk-4LCOCOR5.js +50 -0
- package/chunk-4YRTZIVN.js +871 -0
- package/{chunk-N7J63Q6C.js → chunk-56GBUMO5.js} +10 -1
- package/{chunk-W7XHHYWM.js → chunk-5BHQICF2.js} +5 -1
- package/{chunk-XUWRURDF.js → chunk-5EBLANFT.js} +1 -1
- package/{chunk-3AH7LNUB.js → chunk-5EMSBTQ6.js} +33 -14
- package/{chunk-YRRASA5Q.js → chunk-5MM7NNO6.js} +113 -52
- package/chunk-5MMAK75Q.js +15 -0
- package/{chunk-TXH4IWJL.js → chunk-626KHJNX.js} +20 -11
- package/{chunk-M5PVFLD4.js → chunk-64K7WX26.js} +90 -21
- package/{chunk-AKG5W4LG.js → chunk-6CCFTVBP.js} +76 -221
- package/chunk-6MJNEXUU.js +614 -0
- package/{chunk-62IL3KQV.js → chunk-6MXDOUMH.js} +15 -3
- package/{chunk-QOKAKDPE.js → chunk-6Q7UTJKR.js} +6 -94
- package/chunk-6QDYSCPW.js +223 -0
- package/{chunk-HYZIYH2H.js → chunk-74RAWNQN.js} +56 -63
- package/chunk-7DPNBQSV.js +9 -0
- package/{chunk-IAESIMK7.js → chunk-A4MW3YZL.js} +10 -14
- package/{chunk-OMRJYNCI.js → chunk-AG7MCDLR.js} +26 -31
- package/chunk-AGIM7IMJ.js +147 -0
- package/{chunk-7CHC4W22.js → chunk-AIZE5TDM.js} +3 -3
- package/chunk-AJ3G7X2K.js +7012 -0
- package/{chunk-5GVBDNTO.js → chunk-AU7AXHUL.js} +1 -1
- package/{chunk-4H22P2JV.js → chunk-AUIJZACN.js} +2073 -1275
- package/{chunk-CIF4X6ZM.js → chunk-AWVFQMOV.js} +25 -3
- package/{chunk-YAQJJDC2.js → chunk-BJEZC5RA.js} +214 -51
- package/{chunk-RYZINGPM.js → chunk-BPMPOFWP.js} +347 -235
- package/{chunk-YUNJN43V.js → chunk-BU2YQBV4.js} +215 -28
- package/{chunk-XPRWFQQK.js → chunk-CBHGZRCE.js} +38 -12
- package/{chunk-Y3PMXGLH.js → chunk-CHCS6XPJ.js} +365 -144
- package/chunk-CHOZJMJS.js +78 -0
- package/chunk-CYJWI3NH.js +119 -0
- package/{chunk-GBRG75BQ.js → chunk-D2MDMY2M.js} +1 -0
- package/{chunk-3SV7RM24.js → chunk-D2QN6CTI.js} +117 -72
- package/{chunk-TZZ2WRBL.js → chunk-DFDXM2Y4.js} +20 -16
- package/{chunk-5TEEECZM.js → chunk-E2AKSW7L.js} +10 -7
- package/{chunk-RSEEDUMS.js → chunk-EDX5XSJM.js} +2 -2
- package/{chunk-QDSINZM3.js → chunk-EUGTFFO6.js} +2 -23
- package/{chunk-UNYJU5L6.js → chunk-EYLGAEB4.js} +5 -1
- package/{chunk-CU3QB4HW.js → chunk-EYWJT7A2.js} +12 -12
- package/{chunk-BNGW5ASC.js → chunk-EZVK3N5L.js} +66 -18
- package/{chunk-6FGTMQCL.js → chunk-F32Z66T4.js} +6 -10
- package/{chunk-ZOVKKMF6.js → chunk-FY4SDK2E.js} +1 -1
- package/chunk-G6OOUQWJ.js +417 -0
- package/{chunk-PQWU42UQ.js → chunk-GCKHQECX.js} +6 -6
- package/chunk-GKXCHNTE.js +15 -0
- package/{chunk-P6GMCCAT.js → chunk-GQV5KHJU.js} +78 -12
- package/{chunk-B2XUQXQX.js → chunk-HIQ4GF53.js} +191 -68
- package/{chunk-GMZLP5DV.js → chunk-HNUWUO75.js} +30 -19
- package/{chunk-UASIEDKM.js → chunk-I2XLRXVX.js} +36 -31
- package/{chunk-5UTFL4QJ.js → chunk-I2ZMGXXF.js} +10 -5
- package/chunk-I42VC5KR.js +15 -0
- package/{chunk-3BXNTXYI.js → chunk-I4SN4NUQ.js} +1199 -56
- package/chunk-IA7TRNNR.js +11 -0
- package/{chunk-WIWM4FE3.js → chunk-IJERIUXS.js} +55 -748
- package/{chunk-BIDGLJQ3.js → chunk-IK2TSJQA.js} +45 -8
- package/{chunk-CPUFH46E.js → chunk-ILU2NPWY.js} +10 -10
- package/{chunk-SLLGJZDT.js → chunk-ISQL4V7C.js} +4 -4
- package/chunk-IT3ZZRJE.js +12 -0
- package/{chunk-DY7ANLKG.js → chunk-JKMLSTZK.js} +43 -12
- package/{chunk-6TPOEJMQ.js → chunk-JZX2XLKC.js} +64 -23
- package/{chunk-27ONFIEY.js → chunk-K2AER7RX.js} +19 -12
- package/{chunk-O2OWEFII.js → chunk-KFHQQ3NO.js} +1 -1
- package/{chunk-QXGPFY6J.js → chunk-LGN377P3.js} +27 -17
- package/{chunk-L36OWPP3.js → chunk-LIQJTQRN.js} +118 -139
- package/{chunk-BFU6C242.js → chunk-NMFV26UG.js} +1 -1
- package/{chunk-5J3PYNUP.js → chunk-NYYFIKHI.js} +17 -3
- package/{chunk-6O4IK4V2.js → chunk-OFFL4DCR.js} +1 -1
- package/{chunk-B6SAMB33.js → chunk-OWYYDMGJ.js} +209 -9
- package/{chunk-KQHGZWSV.js → chunk-OXME3PEE.js} +1 -1
- package/{chunk-CTUQJVQM.js → chunk-P5QACQDK.js} +1 -1
- package/{chunk-TB3MIBRC.js → chunk-PIDUNDFS.js} +572 -430
- package/{chunk-4JMDLJAD.js → chunk-PJNFNEJE.js} +114 -37
- package/chunk-PKZKOVA5.js +11507 -0
- package/{chunk-Z4CSIXYP.js → chunk-PLSVXHSA.js} +3 -3
- package/chunk-PWTNI4N7.js +47 -0
- package/chunk-QFEW2ULV.js +42 -0
- package/{chunk-RGNEEJ3Y.js → chunk-QLQ573SU.js} +35 -9
- package/chunk-QQ56R7KS.js +88 -0
- package/chunk-QYPE3TS3.js +43 -0
- package/{chunk-HTVYCXBP.js → chunk-RN2GPWN6.js} +354 -120
- package/{chunk-ATLTFRYJ.js → chunk-ROCUB2H2.js} +280 -98
- package/{chunk-4DPP773Q.js → chunk-RSHPU4PD.js} +59 -11
- package/chunk-RVWMAFIT.js +134 -0
- package/{chunk-ESHYE7WU.js → chunk-S73EPYNC.js} +10 -7
- package/{chunk-UQNS32WZ.js → chunk-SCMHQUMK.js} +1 -1
- package/chunk-SW4S4XYB.js +1794 -0
- package/{chunk-ZUEK6A6C.js → chunk-TTH4HOJD.js} +1973 -754
- package/chunk-TY3TIUJK.js +89 -0
- package/{chunk-X2QRZXZH.js → chunk-TYJ5XFEA.js} +4 -4
- package/{chunk-ALFH24P3.js → chunk-TYYRSFBG.js} +197 -155
- package/{chunk-MST6R3E4.js → chunk-U5GPBQDG.js} +34 -22
- package/chunk-U5ICMAFV.js +14110 -0
- package/{chunk-7KVZ5LDQ.js → chunk-UBUH2TCC.js} +18 -4
- package/chunk-UEILX4EV.js +15 -0
- package/chunk-UHTDNB5Y.js +140 -0
- package/{chunk-YYLHWIW6.js → chunk-UKZX3NHN.js} +1 -1
- package/{chunk-OHOVNO7I.js → chunk-UOKFKFPO.js} +6 -3
- package/{chunk-XISEYOGH.js → chunk-USHQX6VT.js} +5 -5
- package/chunk-UUPR3TD7.js +53 -0
- package/{chunk-3DAVPNFT.js → chunk-V4EE3D54.js} +122 -107
- package/{chunk-HDLLCBRF.js → chunk-VEA7H5FG.js} +2 -2
- package/chunk-VHGD6FHV.js +116 -0
- package/chunk-VIWDGTDA.js +8 -0
- package/{chunk-GOH6RW6F.js → chunk-VJXHL6MH.js} +34 -11
- package/{chunk-4XEYAFLY.js → chunk-VL5KOY2C.js} +623 -94
- package/{chunk-EADNWBAZ.js → chunk-VP3BINY7.js} +13 -0
- package/{chunk-DXHL7G2L.js → chunk-VWW6O2TL.js} +274 -93
- package/{chunk-EOARMOVD.js → chunk-W4S6OTSC.js} +6 -3
- package/chunk-WD4XYDYC.js +567 -0
- package/chunk-WJZOQR2J.js +151 -0
- package/{chunk-AUDNYVRC.js → chunk-XETG4RIX.js} +5 -5
- package/{chunk-MX574M24.js → chunk-XI7DGLUK.js} +4 -4
- package/{chunk-3L2WKC3W.js → chunk-XPWGOTBQ.js} +8 -1
- package/chunk-XRUSXPCQ.js +514 -0
- package/{chunk-I4OPU5TK.js → chunk-XS47QOFV.js} +273 -11
- package/{chunk-S5XGT6GB.js → chunk-XZNCX52W.js} +30 -9
- package/{chunk-5OA5HMTL.js → chunk-YLMMECCH.js} +1 -1
- package/{chunk-CFT5HBGW.js → chunk-YVLQXTUB.js} +448 -12
- package/chunk-YVPQATSC.js +709 -0
- package/chunk-ZEZC7IIM.js +126 -0
- package/{chunk-ALGORS6Y.js → chunk-ZF6526IQ.js} +43 -8
- package/chunk-ZIWPQEFU.js +165 -0
- package/chunk-ZRAU6T47.js +56 -0
- package/{cliExecutor-AWYR3T33.js → cliExecutor-BWBF2MTI.js} +4 -3
- package/{clipboardy-BX4NMYHE.js → clipboardy-GCO3GT3I.js} +3 -8
- package/{commandRegistry-2KBOXZQC.js → commandRegistry-NBLZEMCW.js} +183 -107
- package/contentThunks-6AIWNSGO.js +84 -0
- package/{cooldownCommands-ZLEPIB4A.js → cooldownCommands-JFKTYS2D.js} +2 -2
- package/{createAgentAutomationAction-5UGTB26P.js → createAgentAutomationAction-4BUS65DZ.js} +53 -44
- package/createDialogAction-QAIKSCG4.js +76 -0
- package/{createPageAction-CDLDKPRM.js → createPageAction-DXCZ334C.js} +65 -54
- package/cursorProvider-YGGNMVWX.js +6123 -0
- package/{db-VQSAOWAO.js → db-2QOTXYGH.js} +11 -5
- package/{dbSlice-DQ32LYTJ.js → dbSlice-J37OGIXH.js} +19 -13
- package/{deleteFile-NX6QHCWZ.js → deleteFile-6JWDDRVP.js} +10 -6
- package/dialogCommands-YZLSJB6X.js +113 -0
- package/{dialogSlice-N3YB65G5.js → dialogSlice-PVUSMKFW.js} +53 -39
- package/{docCreateCommands-ZSLGVBZT.js → docCreateCommands-JB2RRMRJ.js} +54 -57
- package/{docDeleteCommands-5N4GVZBG.js → docDeleteCommands-AQENULNM.js} +56 -58
- package/{docReadCommands-YJSAA7AV.js → docReadCommands-DYD25YLQ.js} +53 -56
- package/{docStore-E3CEOV5Q.js → docStore-CSEBEMKP.js} +25 -16
- package/{docUpdateCommands-WEMLSW6W.js → docUpdateCommands-3GVS23QL.js} +54 -57
- package/{fetchMessages-67MEFPZR.js → fetchMessages-IIJWQ3HR.js} +5 -4
- package/{getPricing-NMMFT3YI.js → getPricing-FKK3F5EJ.js} +11 -9
- package/{handleSendMessageAction-DQAD5ERJ.js → handleSendMessageAction-G2TLYGC4.js} +422 -118
- package/index.js +11 -7
- package/{lib-FRRS27KN.js → lib-4YTWAGY7.js} +581 -248
- package/{localDialogRead-EBRS242U.js → localDialogRead-FSOMOPDZ.js} +2 -2
- package/localRuntimeAdapter-B4TAYYA7.js +244 -0
- package/localRuntimeAuthority-JDAD7CB6.js +16 -0
- package/{localRuntimeDb-3LRMNLCM.js → localRuntimeDb-CVC62PM5.js} +1 -1
- package/{machineCommands-HAP75VSG.js → machineCommands-6OBFD3XF.js} +503 -161
- package/{machineInfo-66ZFUMLE.js → machineInfo-UKPTZO5Y.js} +2 -2
- package/machineWsRunDispatch-OO7N3O3Y.js +169 -0
- package/{memberThunks-5ZXPR63F.js → memberThunks-66DH6ABQ.js} +25 -18
- package/{models-ZPU5EDF4.js → models-LAS4B2B5.js} +2 -2
- package/package.json +1 -1
- package/{providerPresetApply-DD6NGWW6.js → providerPresetApply-MY66I6NT.js} +10 -10
- package/{providerRegistry-XDRLMYGJ.js → providerRegistry-QOE2FT57.js} +13 -9
- package/{read-EPTJRAEF.js → read-DC4NUGN6.js} +12 -8
- package/{readDocTool-W4NDXNEX.js → readDocTool-NCJ5NT25.js} +1 -1
- package/{readlineWorkspace-7BC66QSX.js → readlineWorkspace-UIQN7JUR.js} +5017 -915
- package/{removeDialogAgentAction-OSYNZRX7.js → removeDialogAgentAction-E2H3OZU6.js} +29 -28
- package/{runAgentClientLoop-6E6UC3CE.js → runAgentClientLoop-GS3SGG37.js} +154 -97
- package/{runtimeDoctorCommands-ID23PNNZ.js → runtimeDoctorCommands-GIOGC5SC.js} +17 -17
- package/secretCommands-ZXZRLR3R.js +700 -0
- package/setDialogExtraReferencesAction-SITRPMYU.js +37 -0
- package/{setPrimaryDialogAgentAction-WZ7KI3YA.js → setPrimaryDialogAgentAction-U7N45TGC.js} +30 -29
- package/{chunk-SONWNI3L.js → settingThunks-Y7SVJOMZ.js} +223 -928
- package/{skillDiscovery-ZBU76COE.js → skillDiscovery-QC35EQY4.js} +2 -2
- package/{slateUtils-RIZES3PV.js → slateUtils-NGV2NMKM.js} +1 -1
- package/{spaceCommands-UJOVU4XI.js → spaceCommands-ZR5BR3GX.js} +59 -59
- package/{streamAgentChatTurn-3UXPYFNX.js → streamAgentChatTurn-4XYC33KE.js} +309 -165
- package/{switchDialogAgentAction-GMR7WN3P.js → switchDialogAgentAction-OMGBD3N2.js} +26 -22
- package/{tableCommands-G7RV3RU3.js → tableCommands-U3QDY4L6.js} +19 -17
- package/{toolApiClient-CVGWM4PN.js → toolApiClient-7WSJJJBV.js} +6 -5
- package/tools-P77EE7Q4.js +124 -0
- package/tuiSummaryLlmCaller-BM3VSTBU.js +130 -0
- package/{updateCommands-4EHDLF5J.js → updateCommands-NQXAGFM7.js} +3 -3
- package/{updateDialogTitleAction-UPFV7TDT.js → updateDialogTitleAction-CIANVPZC.js} +102 -57
- package/workloadLifecycle-36DXRZKU.js +320 -0
- package/action-GI44T4DR.js +0 -31
- package/agentListCommands-IW3GQVUP.js +0 -427
- package/agentRecordCommands-VCA76W6B.js +0 -134
- package/agentRunCommand-YNLDKVR7.js +0 -161
- package/browser-image-compression-MFDTD7K6.js +0 -1763
- package/chatQueueReduxAdapter-TJRMXMYA.js +0 -186
- package/chromeOpsCommands-IXRLN57H.js +0 -289
- package/chunk-36KZDDO5.js +0 -2415
- package/chunk-ACQD6YI2.js +0 -25363
- package/chunk-CQ3WA2NE.js +0 -299
- package/chunk-CYSYR67N.js +0 -93
- package/chunk-JBTJAPUF.js +0 -35
- package/chunk-K2CSUCHJ.js +0 -620
- package/chunk-LTRXGFMS.js +0 -83
- package/chunk-M76ECQRD.js +0 -13658
- package/chunk-MEYIRKDN.js +0 -8967
- package/chunk-OCZKATRC.js +0 -129
- package/chunk-OTGFTBLI.js +0 -13
- package/chunk-PUOC4YRO.js +0 -394
- package/chunk-PZZTFEKK.js +0 -34
- package/chunk-URMS4XY2.js +0 -10
- package/chunk-UV6VISQJ.js +0 -20
- package/chunk-VJVNU77E.js +0 -83
- package/chunk-XYJSY4KG.js +0 -13807
- package/chunk-Y5GCAMGP.js +0 -9
- package/chunk-YPREESF4.js +0 -225
- package/contentThunks-BDIQRZR6.js +0 -73
- package/createDialogAction-B7VGVEVU.js +0 -66
- package/dialogCommands-G7YBVAMC.js +0 -102
- package/levelLazyShim-GZBKODGI.js +0 -7
- package/machineWsRunDispatch-L32G7C4P.js +0 -149
- package/serverStoreFactory-YMXDF4NI.js +0 -20
- package/setDialogExtraReferencesAction-M32UYNCG.js +0 -30
- package/settingSlice-Q6EKL7EQ.js +0 -204
- package/syncMapping-N6RGXGBW.js +0 -437
- package/tools-MKYDMWA4.js +0 -111
- package/tuiSummaryLlmCaller-3YFNHCTW.js +0 -128
- package/{chunk-SV5IJK6K.js → chunk-NBTY7YJF.js} +3 -3
- package/{chunk-2SYTUTLI.js → chunk-YBNHPX4S.js} +3 -3
- 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-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
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-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
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-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
360
|
-
|
|
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
|
|
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
|
|
498
|
-
if (
|
|
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
|
|
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
|