nolo-cli 0.104.0-alpha.1 → 0.104.0
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/README.md +1 -1
- package/{_executeModel-4W7C3ACS.js → _executeModel-JXG5TLPE.js} +75 -68
- package/action-GVA5ARSJ.js +20 -0
- package/{addContentAction-O7R66HEX.js → addContentAction-J3DLDV64.js} +12 -11
- package/{addDialogAgentAction-74OA7KYP.js → addDialogAgentAction-PHIXJCF2.js} +18 -19
- package/{agentDeleteCommand-2YAHAZFJ.js → agentDeleteCommand-2AWJGHXG.js} +117 -42
- package/{agentEmailCommands-O2KH4G7U.js → agentEmailCommands-VV5OSILE.js} +98 -88
- package/agentListCommands-OQMRBDWP.js +742 -0
- package/{agentMachineCommands-5I5CCUBM.js → agentMachineCommands-3VLLR6RL.js} +48 -43
- package/{agentProviderCommands-GNPTL5XR.js → agentProviderCommands-XPJYZSCE.js} +97 -2
- package/{agentPullCommand-O5MPVJ5E.js → agentPullCommand-B4T2DJ5H.js} +1 -1
- package/agentRecordCommands-GPIARVOW.js +138 -0
- package/agentRunCommand-LRJTZ7IM.js +167 -0
- package/{agentRunControl-AVJR4JW4.js → agentRunControl-3HWA2LLQ.js} +2 -2
- package/{agentRuntimeLocal-VXZSDIGT.js → agentRuntimeLocal-PV6AZOEU.js} +48 -39
- package/{agentSlice-6LBOYNKN.js → agentSlice-6R3JKS6I.js} +14 -13
- package/{appDeleteCommands-32MHLR4L.js → appDeleteCommands-WEX73P5R.js} +46 -41
- package/{appDeployCommands-WCQOUSOB.js → appDeployCommands-7BAXWA4M.js} +46 -41
- package/{appDeployStatusCommands-6QKB7DYN.js → appDeployStatusCommands-EJ6A2U4X.js} +46 -41
- package/{appGetCommands-SFAPP5PB.js → appGetCommands-SB355OEX.js} +46 -41
- package/{appListCommands-EKUBDRUO.js → appListCommands-TSZDPIKJ.js} +46 -41
- package/{authCommand-F4EFRRX6.js → authCommand-5PB3YRVV.js} +118 -24
- package/{authCommands-RGOGCPP6.js → authCommands-5RTUDYZW.js} +7 -5
- package/{builtinSkillRegistry-FUAVTRVZ.js → builtinSkillRegistry-SBBWTANC.js} +10 -8
- package/{chromeCommands-FZYAU75D.js → chromeCommands-AU5ZJXBG.js} +289 -37
- package/{chromeOpsCommands-62P2Q2YB.js → chromeOpsCommands-ZYTCMNHG.js} +156 -22
- package/{chunk-6OZ36FXI.js → chunk-27ONFIEY.js} +22 -4
- package/{chunk-JEDZAO7L.js → chunk-2SYTUTLI.js} +257 -37
- package/{chunk-HVURBGF3.js → chunk-2U3NHADM.js} +6 -6
- package/{chunk-53HEEOTT.js → chunk-2WJ57RJA.js} +83 -16
- package/{chunk-OIVSQH2O.js → chunk-3BXNTXYI.js} +299 -5
- package/{chunk-V4MJDUSR.js → chunk-3F424ASC.js} +2 -2
- package/{chunk-HJUYAD4A.js → chunk-3Q7NEHAR.js} +5 -5
- package/chunk-44CU7CKA.js +13545 -0
- package/{chunk-EYAQT56M.js → chunk-4DPP773Q.js} +2 -2
- package/chunk-4LCOCOR5.js +50 -0
- package/{chunk-JPGCXHNM.js → chunk-4LKMZ3RR.js} +1 -1
- package/{chunk-2GRGFCF6.js → chunk-4VJAC32I.js} +2 -1
- package/{chunk-6D6VBVEW.js → chunk-4W24JM32.js} +80 -14
- package/{chunk-H62HCIUP.js → chunk-4WMMIL66.js} +35 -22
- package/{chunk-MC4XLIJ7.js → chunk-523DITKR.js} +1 -1
- package/{chunk-ZCYXJSTU.js → chunk-54VPQTOA.js} +66 -94
- package/{chunk-E4MARS3Q.js → chunk-5GVBDNTO.js} +1 -1
- package/chunk-5MMAK75Q.js +15 -0
- package/{chunk-7S4YWN7P.js → chunk-5UUIGN6I.js} +4 -4
- package/{chunk-42V6BK2E.js → chunk-62IL3KQV.js} +4 -34
- package/{chunk-GQBOR3G6.js → chunk-7KVZ5LDQ.js} +2 -2
- package/chunk-A4SQRTZ6.js +15 -0
- package/{chunk-L5UXH3B2.js → chunk-AFH5QC6R.js} +58 -9
- package/{chunk-AEOE4Z6Q.js → chunk-AFSY3ZMB.js} +39 -15
- package/chunk-AGIM7IMJ.js +147 -0
- package/{chunk-5UTFL4QJ.js → chunk-AOTBKDRK.js} +7 -0
- package/{chunk-NA35QHCF.js → chunk-AWVP7PPG.js} +1 -1
- package/{chunk-EEGDMATE.js → chunk-B7APRSPS.js} +86 -81
- package/{chunk-W324THOB.js → chunk-BB7LVBTS.js} +20 -11
- package/{chunk-6YTOJY35.js → chunk-BZ7NPA6G.js} +35 -2
- package/{chunk-5H7KJX7J.js → chunk-CFHWVEUJ.js} +5 -5
- package/chunk-CHOZJMJS.js +78 -0
- package/{chunk-ETI2NYVF.js → chunk-CNA27EMD.js} +4 -4
- package/{chunk-ACTMNVHM.js → chunk-CYSYR67N.js} +1 -1
- package/{chunk-WV42OMV7.js → chunk-D2GQE6AF.js} +8 -8
- package/{chunk-GBRG75BQ.js → chunk-D2MDMY2M.js} +1 -0
- package/{chunk-Q554LLSI.js → chunk-DMXLXZKL.js} +1 -1
- package/chunk-DZ7R5V3Y.js +164 -0
- package/{chunk-3VNWWVKB.js → chunk-E3YWHWCR.js} +50 -18
- package/{chunk-KQ4ONNQD.js → chunk-EKPKW6RM.js} +155 -8
- package/{chunk-2J5Y72GY.js → chunk-EP7BWZ4B.js} +1 -1
- package/{chunk-ABQYVJBJ.js → chunk-EV235ILT.js} +5 -5
- package/{chunk-TRV2MIDW.js → chunk-EXAJ6DCR.js} +1 -0
- package/{chunk-3ZW5ZJMM.js → chunk-FGSJ3YMD.js} +23 -28
- package/{chunk-2F7RJC6L.js → chunk-FOXQ7BAB.js} +1 -1
- package/{chunk-SH43IESU.js → chunk-GGC55Q32.js} +199 -29
- package/chunk-GMZLP5DV.js +82 -0
- package/{chunk-DHDMC6FO.js → chunk-GSKPJIHY.js} +14 -9
- package/{chunk-FDTR4QJ6.js → chunk-H6A6X4EK.js} +32 -1
- package/{chunk-DVINR3PL.js → chunk-HDLLCBRF.js} +1 -1
- package/{chunk-QOKAKDPE.js → chunk-HIM3FCLF.js} +0 -1
- package/{chunk-ONXOABJR.js → chunk-HNGRBWYF.js} +3 -0
- package/{chunk-VLTIYV3X.js → chunk-HP57OUJO.js} +4 -4
- package/{chunk-NXUYQBDZ.js → chunk-HYXABXCZ.js} +29 -78
- package/{chunk-DNCEALKX.js → chunk-IEJ5YDA4.js} +22 -29
- package/{chunk-O6OSWFZQ.js → chunk-IHPDK6UD.js} +6 -0
- package/{chunk-BP4XNZRM.js → chunk-JIXGJTBU.js} +4 -4
- package/{chunk-GPCZ7UXG.js → chunk-K6U4NKFJ.js} +1 -1
- package/{chunk-Z77CRGTW.js → chunk-KA5O5KQL.js} +1 -1
- package/{chunk-4OEFYTWL.js → chunk-L5WOICCV.js} +67 -48
- package/{chunk-LS2ZANRJ.js → chunk-LOCNXNOU.js} +1 -1
- package/chunk-LWLNLZC5.js +265 -0
- package/{chunk-H66KLASO.js → chunk-LWXE6IFU.js} +567 -519
- package/{chunk-PUOC4YRO.js → chunk-M7VLQGQP.js} +11 -0
- package/chunk-NKWIS6G2.js +442 -0
- package/{chunk-BFU6C242.js → chunk-NMFV26UG.js} +1 -1
- package/{chunk-DJWMIXDZ.js → chunk-NSAFG343.js} +10 -10
- package/{chunk-UKZDAFYT.js → chunk-NSBID7PR.js} +6 -10
- package/{chunk-4J4QNKTW.js → chunk-NTR4SD3P.js} +845 -240
- package/{chunk-FZGV4FGK.js → chunk-NUHHBEJC.js} +378 -187
- package/chunk-NWENLDMM.js +42 -0
- package/chunk-O7SVKKLY.js +875 -0
- package/chunk-OCZKATRC.js +129 -0
- package/{chunk-VMFTFOWF.js → chunk-OKGVNZTL.js} +35 -8
- package/{chunk-KQHGZWSV.js → chunk-OXME3PEE.js} +1 -1
- package/{chunk-JRQFUXY7.js → chunk-P5GCTVGV.js} +99 -22
- package/{chunk-PQFHGD77.js → chunk-QKTESDWK.js} +161 -14
- package/{chunk-U3JZVWIB.js → chunk-QMXJ5KDJ.js} +68 -46
- package/{chunk-GEPUP7OO.js → chunk-QYUBY3OZ.js} +3 -3
- package/{chunk-3BMYXEUW.js → chunk-R5AJODNI.js} +1 -1
- package/{chunk-J4MOO56S.js → chunk-RILRSUGC.js} +10 -2
- package/{chunk-OEVAY4J6.js → chunk-RWX7AY7J.js} +18 -20
- package/{chunk-YY7I6GQ3.js → chunk-S2NSK7AZ.js} +11 -9
- package/{chunk-IIVGDG4I.js → chunk-SJKULPGX.js} +13 -7
- package/{chunk-BYMV6QZG.js → chunk-TNIX77YM.js} +4 -0
- package/chunk-TY3TIUJK.js +89 -0
- package/{chunk-I3TQJXQ7.js → chunk-U3C3IA32.js} +9 -2
- package/{chunk-UZGQNTVW.js → chunk-UA324D4O.js} +8 -6
- package/{chunk-YYLHWIW6.js → chunk-UKZX3NHN.js} +1 -1
- package/chunk-UWXDA7L5.js +8005 -0
- package/{chunk-3DII57IT.js → chunk-VCAQFMVN.js} +1 -1
- package/chunk-VIWDGTDA.js +8 -0
- package/chunk-VJVNU77E.js +83 -0
- package/{chunk-A6FMKU7M.js → chunk-VVJ2ENLY.js} +47 -67
- package/{chunk-UKWGR5SS.js → chunk-VY6VFGKR.js} +194 -1144
- package/{chunk-QDSINZM3.js → chunk-WJ3B6FX6.js} +1 -14
- package/{chunk-Q67DOFOO.js → chunk-Y3PMXGLH.js} +2 -0
- package/chunk-YK5MHOWM.js +915 -0
- package/chunk-YV25TM3R.js +780 -0
- package/{chunk-TOP2VXOR.js → chunk-YVU4XVJD.js} +5 -5
- package/{chunk-7SOWRCQQ.js → chunk-Z5NGE5DH.js} +29 -9
- package/{chunk-6VFARHZW.js → chunk-ZBHR642M.js} +994 -1079
- package/chunk-ZRAU6T47.js +56 -0
- package/{chunk-B6P4QKEN.js → chunk-ZSUDOTPL.js} +19 -17
- package/commandRegistry-QU62WJQX.js +833 -0
- package/{contentThunks-LXOZUD2Y.js → contentThunks-VGV3JJVB.js} +37 -35
- package/{cooldownCommands-REAWYVTY.js → cooldownCommands-ZLEPIB4A.js} +2 -2
- package/{createAgentAutomationAction-M5NDEIC6.js → createAgentAutomationAction-ZNVLI4WV.js} +39 -37
- package/createDialogAction-TTUA46DT.js +69 -0
- package/{createPageAction-WY5ZKP2M.js → createPageAction-KUFSC5XW.js} +46 -43
- package/{chunk-ITBLTYQB.js → cursorProvider-YGGNMVWX.js} +2496 -9897
- package/{dbSlice-XVWBAGYN.js → dbSlice-MYEETO73.js} +11 -10
- package/{deleteFile-YG6QMJLU.js → deleteFile-KESP65GC.js} +7 -6
- package/{dialogCommands-5J56DFWN.js → dialogCommands-DRDPEOTL.js} +49 -45
- package/{dialogSlice-HSGREZGA.js → dialogSlice-V2SVSTIV.js} +41 -34
- package/{dist-VODFSGNG.js → dist-NJC2W7I4.js} +61 -54
- package/{docCreateCommands-KYI2DC2U.js → docCreateCommands-M26CFDDQ.js} +48 -43
- package/{docDeleteCommands-67REUSRY.js → docDeleteCommands-LRZHCKVX.js} +49 -44
- package/{docReadCommands-HOSVSBDJ.js → docReadCommands-6QJSISHK.js} +47 -42
- package/{docStore-IIS36NGG.js → docStore-4RWAFNDM.js} +16 -12
- package/{docUpdateCommands-EMGCSMXY.js → docUpdateCommands-W4KU4U5T.js} +48 -43
- package/{fetchMessages-EIU7UFFK.js → fetchMessages-3PXAHKCR.js} +5 -5
- package/{getPricing-LUSEABA6.js → getPricing-NMMFT3YI.js} +4 -4
- package/{handleSendMessageAction-FEHCWMN2.js → handleSendMessageAction-VEWLGB5Z.js} +107 -41
- package/index.js +87 -884
- package/{lib-FRRS27KN.js → lib-PU2G2MSO.js} +523 -191
- package/{localDialogRead-BTFJ4V2I.js → localDialogRead-UYCKO7YZ.js} +2 -2
- package/{localRuntimeAuthority-6IR6BBXE.js → localRuntimeAuthority-TU6OBC76.js} +9 -6
- package/{localRuntimeDb-SYQGUF4U.js → localRuntimeDb-VKWVOPPI.js} +1 -1
- package/{machineCommands-G5J754EH.js → machineCommands-AEHHCJEW.js} +92 -82
- package/machineWsRunDispatch-MY2KHS36.js +154 -0
- package/{memberThunks-QGFLFVCI.js → memberThunks-EE6TI3TV.js} +20 -18
- package/{models-T3SG6MJ5.js → models-ZPU5EDF4.js} +2 -2
- package/oauthTokenStore-ITEB663N.js +23 -0
- package/package.json +1 -1
- package/pdf-U6KSUEZZ.js +26435 -0
- package/processSpawn-SOAV3FEV.js +11 -0
- package/profileConfig-ZGOFORWV.js +43 -0
- package/{providerPresetApply-FG6NZ57W.js → providerPresetApply-TEBH7FDX.js} +7 -7
- package/{providerRegistry-757OWH3O.js → providerRegistry-CBJLNCET.js} +11 -7
- package/{read-COE3ZYR6.js → read-PJIT2YEJ.js} +7 -6
- package/{readDocTool-5USN4A6V.js → readDocTool-DRSXHGNL.js} +5 -3
- package/{readlineWorkspace-TGCYJFEB.js → readlineWorkspace-7Q6MITLV.js} +2685 -2050
- package/{removeDialogAgentAction-IX3MN2ZO.js → removeDialogAgentAction-IN4WUKJJ.js} +21 -25
- package/{runAgentClientLoop-UY76PPZM.js → runAgentClientLoop-H2JALUVD.js} +76 -70
- package/{runtimeDoctorCommands-X6WDBEQX.js → runtimeDoctorCommands-PIVSBZRZ.js} +4 -4
- package/runtimeModeArgs-2Y7BALTO.js +31 -0
- package/{setDialogExtraReferencesAction-X4HCPNZL.js → setDialogExtraReferencesAction-VDRF7LPK.js} +15 -13
- package/{setPrimaryDialogAgentAction-4GMIQLOD.js → setPrimaryDialogAgentAction-RO6LIWJ4.js} +22 -26
- package/{chunk-AFUORTY4.js → settingThunks-3OPOLOIA.js} +226 -940
- package/{skillDiscovery-CYUCJMAG.js → skillDiscovery-ZBU76COE.js} +3 -3
- package/{slateUtils-RIZES3PV.js → slateUtils-NGV2NMKM.js} +1 -1
- package/{spaceCommands-NKJVJCQQ.js → spaceCommands-UBLL5EF2.js} +51 -46
- package/{streamAgentChatTurn-3YVIO4KE.js → streamAgentChatTurn-FFJWW3FD.js} +214 -108
- package/{switchDialogAgentAction-N52LRPA3.js → switchDialogAgentAction-MVF2JNE7.js} +18 -19
- package/{tableCommands-O6NWHFKV.js → tableCommands-6U4BMLRR.js} +10 -10
- package/{toolApiClient-QVJ6HDNN.js → toolApiClient-EJT6TMFG.js} +3 -3
- package/tools-AZRYLYNK.js +116 -0
- package/{tuiSummaryLlmCaller-WFRWERGK.js → tuiSummaryLlmCaller-7S5HJ3MT.js} +25 -22
- package/{updateCommands-2M74UL7P.js → updateCommands-4EHDLF5J.js} +3 -3
- package/{updateDialogTitleAction-GF5T3VMK.js → updateDialogTitleAction-5WXTRUJM.js} +82 -44
- package/action-YVYQEAAV.js +0 -31
- package/agentListCommands-GUDMBDHZ.js +0 -410
- package/agentRecordCommands-RSS44XHC.js +0 -128
- package/agentRunCommand-P7VHL4ZR.js +0 -156
- package/browser-image-compression-MFDTD7K6.js +0 -1763
- package/chatQueueReduxAdapter-WFROMKD3.js +0 -186
- package/chunk-CQ3WA2NE.js +0 -299
- package/chunk-FQUHIG5X.js +0 -20782
- package/chunk-M76ECQRD.js +0 -13658
- package/chunk-MEYIRKDN.js +0 -8967
- package/chunk-Q5FJJ6XI.js +0 -103
- package/chunk-S7Z2HMCN.js +0 -25
- package/chunk-Y5GCAMGP.js +0 -9
- package/chunk-YPREESF4.js +0 -225
- package/createDialogAction-TDFOINOY.js +0 -65
- package/machineWsRunDispatch-VXYBYYKM.js +0 -144
- package/settingSlice-ZQZVUPKK.js +0 -204
- package/syncMapping-N6RGXGBW.js +0 -437
- package/tools-Q6IBBG33.js +0 -110
- package/{chunk-X7HHHIOZ.js → chunk-Y6ROFCZO.js} +0 -0
- package/{db-WK5MDZVN.js → db-VQSAOWAO.js} +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
|
-
createChromeConnectorClient
|
|
3
|
-
|
|
2
|
+
createChromeConnectorClient,
|
|
3
|
+
createVerifiedChromeConnectorClient
|
|
4
|
+
} from "./chunk-GGC55Q32.js";
|
|
4
5
|
import {
|
|
5
6
|
toErrorMessage
|
|
6
7
|
} from "./chunk-HNMXYYJR.js";
|
|
@@ -23,6 +24,14 @@ function wantsHelp(args) {
|
|
|
23
24
|
function readTrimmedOption(args, flag) {
|
|
24
25
|
return (readOption(args, flag) ?? "").trim();
|
|
25
26
|
}
|
|
27
|
+
function readBrowserFlag(args) {
|
|
28
|
+
const equalsForm = args.find((arg) => arg.startsWith("--browser="));
|
|
29
|
+
const raw = equalsForm !== void 0 ? equalsForm.slice("--browser=".length) : readOption(args, "--browser");
|
|
30
|
+
if (raw === void 0) return void 0;
|
|
31
|
+
const value = raw.trim();
|
|
32
|
+
if (value === "chrome" || value === "firefox") return value;
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
26
35
|
function readAllOptions(args, flag) {
|
|
27
36
|
const values = [];
|
|
28
37
|
for (let i = 0; i < args.length; i++) {
|
|
@@ -44,6 +53,25 @@ function readIntOption(args, flag, usage) {
|
|
|
44
53
|
}
|
|
45
54
|
return value;
|
|
46
55
|
}
|
|
56
|
+
function readNonNegativeIntOption(args, flag, usage) {
|
|
57
|
+
const equalsForm = args.find((arg) => arg.startsWith(`${flag}=`));
|
|
58
|
+
const raw = equalsForm !== void 0 ? equalsForm.slice(`${flag}=`.length) : readOption(args, flag);
|
|
59
|
+
if (raw === void 0) {
|
|
60
|
+
if (args.includes(flag)) {
|
|
61
|
+
throw new Error(`Invalid ${flag} <N>. Usage: ${usage}`);
|
|
62
|
+
}
|
|
63
|
+
return void 0;
|
|
64
|
+
}
|
|
65
|
+
const trimmed = raw.trim();
|
|
66
|
+
if (!/^\d+$/.test(trimmed)) {
|
|
67
|
+
throw new Error(`Invalid ${flag} <N>. Usage: ${usage}`);
|
|
68
|
+
}
|
|
69
|
+
const value = Number.parseInt(trimmed, 10);
|
|
70
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
71
|
+
throw new Error(`Invalid ${flag} <N>. Usage: ${usage}`);
|
|
72
|
+
}
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
47
75
|
function requireTabId(args, usage) {
|
|
48
76
|
const tabId = readTrimmedOption(args, "--tab");
|
|
49
77
|
if (!tabId) {
|
|
@@ -67,12 +95,12 @@ function requireTarget(args, usage) {
|
|
|
67
95
|
var CHROME_OPS_SUBCOMMANDS = {
|
|
68
96
|
"list-tabs": {
|
|
69
97
|
action: "list_tabs",
|
|
70
|
-
usage: "nolo
|
|
98
|
+
usage: "nolo browser list-tabs",
|
|
71
99
|
payload: () => ({})
|
|
72
100
|
},
|
|
73
101
|
"open-tab": {
|
|
74
102
|
action: "open_tab",
|
|
75
|
-
usage: "nolo
|
|
103
|
+
usage: "nolo browser open-tab --url <url> [--active]",
|
|
76
104
|
payload: (args, usage) => {
|
|
77
105
|
const url = readTrimmedOption(args, "--url");
|
|
78
106
|
if (!url) {
|
|
@@ -83,12 +111,12 @@ var CHROME_OPS_SUBCOMMANDS = {
|
|
|
83
111
|
},
|
|
84
112
|
"close-tab": {
|
|
85
113
|
action: "close_tab",
|
|
86
|
-
usage: "nolo
|
|
114
|
+
usage: "nolo browser close-tab --tab <id>",
|
|
87
115
|
payload: (args, usage) => ({ tabId: requireTabId(args, usage) })
|
|
88
116
|
},
|
|
89
117
|
"read-page": {
|
|
90
118
|
action: "read_page",
|
|
91
|
-
usage: "nolo
|
|
119
|
+
usage: "nolo browser read-page --tab <id> [--selector <css>] [--detail compact|full] [--max-elements N] [--offset N] [--viewport]",
|
|
92
120
|
payload: (args, usage) => {
|
|
93
121
|
const payload = { tabId: requireTabId(args, usage) };
|
|
94
122
|
const selector = readTrimmedOption(args, "--selector");
|
|
@@ -97,12 +125,15 @@ var CHROME_OPS_SUBCOMMANDS = {
|
|
|
97
125
|
if (detail) payload.detail = detail;
|
|
98
126
|
const maxElements = readIntOption(args, "--max-elements", usage);
|
|
99
127
|
if (maxElements !== void 0) payload.maxElements = maxElements;
|
|
128
|
+
const offset = readNonNegativeIntOption(args, "--offset", usage);
|
|
129
|
+
if (offset !== void 0) payload.offset = offset;
|
|
130
|
+
if (args.includes("--viewport")) payload.viewportOnly = true;
|
|
100
131
|
return payload;
|
|
101
132
|
}
|
|
102
133
|
},
|
|
103
134
|
click: {
|
|
104
135
|
action: "click",
|
|
105
|
-
usage: "nolo
|
|
136
|
+
usage: "nolo browser click --tab <id> (--ref <elementRef> | --selector <css>)",
|
|
106
137
|
payload: (args, usage) => ({
|
|
107
138
|
tabId: requireTabId(args, usage),
|
|
108
139
|
...requireTarget(args, usage)
|
|
@@ -110,7 +141,7 @@ var CHROME_OPS_SUBCOMMANDS = {
|
|
|
110
141
|
},
|
|
111
142
|
type: {
|
|
112
143
|
action: "type",
|
|
113
|
-
usage: "nolo
|
|
144
|
+
usage: "nolo browser type --tab <id> (--ref <elementRef> | --selector <css>) --text <text> [--append]",
|
|
114
145
|
payload: (args, usage) => {
|
|
115
146
|
const text = readOption(args, "--text");
|
|
116
147
|
if (text === void 0 || text.startsWith("--")) {
|
|
@@ -126,7 +157,7 @@ var CHROME_OPS_SUBCOMMANDS = {
|
|
|
126
157
|
},
|
|
127
158
|
upload: {
|
|
128
159
|
action: "set_files",
|
|
129
|
-
usage: "nolo
|
|
160
|
+
usage: "nolo browser upload --tab <id> (--ref <elementRef> | --selector <css>) --file <path> [--file <path>...]",
|
|
130
161
|
payload: (args, usage) => {
|
|
131
162
|
const files = readAllOptions(args, "--file");
|
|
132
163
|
if (files.length === 0) {
|
|
@@ -144,7 +175,7 @@ var CHROME_OPS_SUBCOMMANDS = {
|
|
|
144
175
|
},
|
|
145
176
|
press: {
|
|
146
177
|
action: "press",
|
|
147
|
-
usage: "nolo
|
|
178
|
+
usage: "nolo browser press --tab <id> --key <key>",
|
|
148
179
|
payload: (args, usage) => {
|
|
149
180
|
const key = readTrimmedOption(args, "--key");
|
|
150
181
|
if (!key) {
|
|
@@ -155,7 +186,7 @@ var CHROME_OPS_SUBCOMMANDS = {
|
|
|
155
186
|
},
|
|
156
187
|
scroll: {
|
|
157
188
|
action: "scroll",
|
|
158
|
-
usage: "nolo
|
|
189
|
+
usage: "nolo browser scroll --tab <id> [--delta-x N] [--delta-y N]",
|
|
159
190
|
payload: (args, usage) => {
|
|
160
191
|
const payload = { tabId: requireTabId(args, usage) };
|
|
161
192
|
const deltaX = readIntOption(args, "--delta-x", usage);
|
|
@@ -167,7 +198,7 @@ var CHROME_OPS_SUBCOMMANDS = {
|
|
|
167
198
|
},
|
|
168
199
|
screenshot: {
|
|
169
200
|
action: "screenshot",
|
|
170
|
-
usage: "nolo
|
|
201
|
+
usage: "nolo browser screenshot --tab <id> [--out <path>] [--full-page]",
|
|
171
202
|
payload: (args, usage) => ({
|
|
172
203
|
tabId: requireTabId(args, usage),
|
|
173
204
|
...args.includes("--full-page") ? { fullPage: true } : {}
|
|
@@ -175,7 +206,7 @@ var CHROME_OPS_SUBCOMMANDS = {
|
|
|
175
206
|
},
|
|
176
207
|
"read-console": {
|
|
177
208
|
action: "read_console",
|
|
178
|
-
usage: "nolo
|
|
209
|
+
usage: "nolo browser read-console --tab <id> [--limit N]",
|
|
179
210
|
payload: (args, usage) => {
|
|
180
211
|
const payload = { tabId: requireTabId(args, usage) };
|
|
181
212
|
const limit = readIntOption(args, "--limit", usage);
|
|
@@ -185,7 +216,7 @@ var CHROME_OPS_SUBCOMMANDS = {
|
|
|
185
216
|
},
|
|
186
217
|
"read-network": {
|
|
187
218
|
action: "read_network",
|
|
188
|
-
usage: "nolo
|
|
219
|
+
usage: "nolo browser read-network --tab <id> [--limit N] [--include-assets]",
|
|
189
220
|
payload: (args, usage) => {
|
|
190
221
|
const payload = { tabId: requireTabId(args, usage) };
|
|
191
222
|
const limit = readIntOption(args, "--limit", usage);
|
|
@@ -197,28 +228,59 @@ var CHROME_OPS_SUBCOMMANDS = {
|
|
|
197
228
|
};
|
|
198
229
|
function renderChromeOpsHelp() {
|
|
199
230
|
const lines = [
|
|
200
|
-
"Operate the user's Chrome through the Nolo
|
|
201
|
-
"the same RPC the
|
|
231
|
+
"Operate the user's browser (Chrome or Firefox) through the Nolo Browser Connector",
|
|
232
|
+
"(the desktop bridge; the same RPC the browser_* agent tools use \u2014 legacy `chrome_*` names still work).",
|
|
202
233
|
"",
|
|
203
234
|
"Usage:",
|
|
204
|
-
" nolo
|
|
235
|
+
" nolo browser <subcommand> [flags]",
|
|
236
|
+
" nolo chrome <subcommand> [flags] # compatibility alias",
|
|
205
237
|
"",
|
|
206
238
|
"Subcommands:",
|
|
207
239
|
...Object.values(CHROME_OPS_SUBCOMMANDS).map(
|
|
208
|
-
(spec) => ` ${spec.usage.replace(/^nolo
|
|
240
|
+
(spec) => ` ${spec.usage.replace(/^nolo browser /, "")}`
|
|
209
241
|
),
|
|
210
242
|
"",
|
|
211
243
|
"Notes:",
|
|
212
|
-
" --ref takes an elementRef copied from `nolo
|
|
244
|
+
" --ref takes an elementRef copied from `nolo browser read-page` (revision-scoped,",
|
|
213
245
|
" preferred over --selector); --selector takes a CSS selector.",
|
|
214
246
|
" Actions the connector classifies as irreversible (Submit / Delete / Pay ...)",
|
|
215
247
|
" are refused with CONFIRMATION_REQUIRED \u2014 ask the user to perform them.",
|
|
248
|
+
" read-console / read-network / upload work on Chrome only (Firefox lacks chrome.debugger).",
|
|
249
|
+
" --browser chrome|firefox selects which connector endpoint serves the call (default",
|
|
250
|
+
" auto-detects single online browser: chrome = 127.0.0.1:38947, firefox = 127.0.0.1:38948);",
|
|
251
|
+
" the wrong browser is refused.",
|
|
216
252
|
" Every subcommand prints the connector's raw JSON result; failures exit 1.",
|
|
217
|
-
" Endpoint: NOLO_CHROME_CONNECTOR_RPC_URL or
|
|
253
|
+
" Endpoint: NOLO_CHROME_CONNECTOR_RPC_URL or per-browser NOLO_CHROME_CONNECTOR_PORT /",
|
|
254
|
+
" NOLO_FIREFOX_CONNECTOR_PORT (default http://127.0.0.1:38947/rpc)."
|
|
218
255
|
];
|
|
219
256
|
return lines.join("\n");
|
|
220
257
|
}
|
|
221
258
|
var CHROME_OPS_HELP_TEXT = renderChromeOpsHelp();
|
|
259
|
+
async function defaultProbeBrowser(browser) {
|
|
260
|
+
try {
|
|
261
|
+
const client = createChromeConnectorClient({
|
|
262
|
+
browser,
|
|
263
|
+
fetchImpl: (input, init) => {
|
|
264
|
+
return fetch(input, {
|
|
265
|
+
...init,
|
|
266
|
+
signal: AbortSignal.timeout(400)
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
const info = await client.request("connector_info", {});
|
|
271
|
+
return typeof info?.extensionId === "string";
|
|
272
|
+
} catch (error) {
|
|
273
|
+
if (error?.code === "CHROME_CONNECTOR_UNAVAILABLE") {
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
const handshakeError = new Error(
|
|
277
|
+
`\u63A2\u6D4B\u5230\u7AEF\u70B9\u4F46\u63E1\u624B\u5931\u8D25\uFF1A${toErrorMessage(error)}`
|
|
278
|
+
);
|
|
279
|
+
handshakeError.code = error?.code || "CHROME_CONNECTOR_HANDSHAKE_FAILED";
|
|
280
|
+
handshakeError.details = error?.details;
|
|
281
|
+
throw handshakeError;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
222
284
|
async function runChromeOpsCommand(subcommand, args, deps = {}) {
|
|
223
285
|
const io = {
|
|
224
286
|
stdout: (text) => console.log(text),
|
|
@@ -227,7 +289,7 @@ async function runChromeOpsCommand(subcommand, args, deps = {}) {
|
|
|
227
289
|
};
|
|
228
290
|
const spec = CHROME_OPS_SUBCOMMANDS[subcommand];
|
|
229
291
|
if (!spec) {
|
|
230
|
-
io.stderr(`Unknown
|
|
292
|
+
io.stderr(`Unknown browser subcommand "${subcommand}".
|
|
231
293
|
|
|
232
294
|
${CHROME_OPS_HELP_TEXT}`);
|
|
233
295
|
return 1;
|
|
@@ -236,6 +298,13 @@ ${CHROME_OPS_HELP_TEXT}`);
|
|
|
236
298
|
io.stdout(CHROME_OPS_HELP_TEXT);
|
|
237
299
|
return 0;
|
|
238
300
|
}
|
|
301
|
+
const browserFlag = readBrowserFlag(args);
|
|
302
|
+
if (browserFlag === null) {
|
|
303
|
+
io.stderr(
|
|
304
|
+
`Invalid --browser value: expected "chrome" or "firefox". Usage: ${spec.usage}`
|
|
305
|
+
);
|
|
306
|
+
return 1;
|
|
307
|
+
}
|
|
239
308
|
let payload;
|
|
240
309
|
try {
|
|
241
310
|
payload = spec.payload(args, spec.usage);
|
|
@@ -245,7 +314,72 @@ ${CHROME_OPS_HELP_TEXT}`);
|
|
|
245
314
|
}
|
|
246
315
|
let result;
|
|
247
316
|
try {
|
|
248
|
-
const
|
|
317
|
+
const env = deps.env ?? process.env;
|
|
318
|
+
let client;
|
|
319
|
+
if (deps.client) {
|
|
320
|
+
client = deps.client;
|
|
321
|
+
} else {
|
|
322
|
+
let targetBrowser = browserFlag;
|
|
323
|
+
if (!targetBrowser && !env.NOLO_CHROME_CONNECTOR_RPC_URL) {
|
|
324
|
+
const probe = deps.probeBrowser ?? defaultProbeBrowser;
|
|
325
|
+
const [chromeResult, firefoxResult] = await Promise.allSettled([
|
|
326
|
+
probe("chrome"),
|
|
327
|
+
probe("firefox")
|
|
328
|
+
]);
|
|
329
|
+
const chromeOnline = chromeResult.status === "fulfilled" && chromeResult.value === true;
|
|
330
|
+
const firefoxOnline = firefoxResult.status === "fulfilled" && firefoxResult.value === true;
|
|
331
|
+
if (chromeOnline && firefoxOnline) {
|
|
332
|
+
const error = new Error(
|
|
333
|
+
"Both Chrome and Firefox connectors are online. Specify --browser chrome or --browser firefox."
|
|
334
|
+
);
|
|
335
|
+
error.code = "MULTIPLE_BROWSERS_AVAILABLE";
|
|
336
|
+
throw error;
|
|
337
|
+
}
|
|
338
|
+
if (chromeOnline) {
|
|
339
|
+
targetBrowser = "chrome";
|
|
340
|
+
} else if (firefoxOnline) {
|
|
341
|
+
targetBrowser = "firefox";
|
|
342
|
+
} else {
|
|
343
|
+
if (chromeResult.status === "rejected") {
|
|
344
|
+
const reason = toErrorMessage(chromeResult.reason);
|
|
345
|
+
const err = new Error(
|
|
346
|
+
reason.startsWith("\u63A2\u6D4B\u5230\u7AEF\u70B9\u4F46\u63E1\u624B\u5931\u8D25\uFF1A") ? reason : `\u63A2\u6D4B\u5230\u7AEF\u70B9\u4F46\u63E1\u624B\u5931\u8D25\uFF1A${reason}`
|
|
347
|
+
);
|
|
348
|
+
err.code = chromeResult.reason?.code || "CHROME_CONNECTOR_HANDSHAKE_FAILED";
|
|
349
|
+
err.details = chromeResult.reason?.details;
|
|
350
|
+
throw err;
|
|
351
|
+
}
|
|
352
|
+
if (firefoxResult.status === "rejected") {
|
|
353
|
+
const reason = toErrorMessage(firefoxResult.reason);
|
|
354
|
+
const err = new Error(
|
|
355
|
+
reason.startsWith("\u63A2\u6D4B\u5230\u7AEF\u70B9\u4F46\u63E1\u624B\u5931\u8D25\uFF1A") ? reason : `\u63A2\u6D4B\u5230\u7AEF\u70B9\u4F46\u63E1\u624B\u5931\u8D25\uFF1A${reason}`
|
|
356
|
+
);
|
|
357
|
+
err.code = firefoxResult.reason?.code || "CHROME_CONNECTOR_HANDSHAKE_FAILED";
|
|
358
|
+
err.details = firefoxResult.reason?.details;
|
|
359
|
+
throw err;
|
|
360
|
+
}
|
|
361
|
+
const chromePort = env.NOLO_CHROME_CONNECTOR_PORT || 38947;
|
|
362
|
+
const firefoxPort = env.NOLO_FIREFOX_CONNECTOR_PORT || 38948;
|
|
363
|
+
const chromeEndpoint = `http://127.0.0.1:${chromePort}/rpc`;
|
|
364
|
+
const firefoxEndpoint = `http://127.0.0.1:${firefoxPort}/rpc`;
|
|
365
|
+
const error = new Error(
|
|
366
|
+
`Chrome connector RPC endpoint is unavailable at ${chromeEndpoint} or ${firefoxEndpoint}.`
|
|
367
|
+
);
|
|
368
|
+
error.code = "CHROME_CONNECTOR_UNAVAILABLE";
|
|
369
|
+
throw error;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
if (deps.createClient) {
|
|
373
|
+
client = deps.createClient(targetBrowser);
|
|
374
|
+
} else if (targetBrowser) {
|
|
375
|
+
client = createVerifiedChromeConnectorClient({
|
|
376
|
+
client: createChromeConnectorClient({ browser: targetBrowser }),
|
|
377
|
+
expectedBrowser: targetBrowser
|
|
378
|
+
});
|
|
379
|
+
} else {
|
|
380
|
+
client = createChromeConnectorClient();
|
|
381
|
+
}
|
|
382
|
+
}
|
|
249
383
|
result = await client.request(spec.action, payload);
|
|
250
384
|
} catch (error) {
|
|
251
385
|
const code = typeof error?.code === "string" ? error.code : "CHROME_COMMAND_FAILED";
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
resolvePlatformChatCompletionsEndpoint,
|
|
4
4
|
resolvePlatformHostedCredentialProvider,
|
|
5
5
|
resolvePlatformResponsesEndpoint
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-7KVZ5LDQ.js";
|
|
7
7
|
import {
|
|
8
8
|
CLI_PROVIDER_VALUES
|
|
9
9
|
} from "./chunk-W7XHHYWM.js";
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
CLIENT_VERSION_TOO_OLD_CODE,
|
|
12
12
|
buildClientVersionGateErrorDetail,
|
|
13
13
|
evaluatePlatformHostedClientVersionGate
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-Y3PMXGLH.js";
|
|
15
15
|
import {
|
|
16
16
|
asTrimmedLowercaseString
|
|
17
17
|
} from "./chunk-QSJ3HFEF.js";
|
|
@@ -164,10 +164,28 @@ function resolveProviderAuthHeaderName(args) {
|
|
|
164
164
|
if (/xiaomimimo\.com/i.test(args.endpoint)) return "api-key";
|
|
165
165
|
return "Authorization";
|
|
166
166
|
}
|
|
167
|
+
var OPENCODE_GO_ENDPOINT_RE = /^https?:\/\/opencode\.ai\/zen\/go\//i;
|
|
168
|
+
var OPENCODE_SESSION_HEADER = "x-opencode-session";
|
|
169
|
+
var OPENCODE_USER_AGENT = "nolo-agent/1.0";
|
|
170
|
+
var PROCESS_FALLBACK_SESSION_ID = `nolo-${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`;
|
|
171
|
+
function isOpenCodeGoEndpoint(endpoint) {
|
|
172
|
+
return typeof endpoint === "string" && OPENCODE_GO_ENDPOINT_RE.test(endpoint.trim());
|
|
173
|
+
}
|
|
174
|
+
function buildProviderSessionHeaders(args) {
|
|
175
|
+
if (!isOpenCodeGoEndpoint(args.endpoint)) return {};
|
|
176
|
+
return {
|
|
177
|
+
[OPENCODE_SESSION_HEADER]: args.sessionId?.trim() || PROCESS_FALLBACK_SESSION_ID,
|
|
178
|
+
"User-Agent": OPENCODE_USER_AGENT
|
|
179
|
+
};
|
|
180
|
+
}
|
|
167
181
|
function buildProviderAuthHeaders(args) {
|
|
168
|
-
|
|
182
|
+
const sessionHeaders = buildProviderSessionHeaders(args);
|
|
183
|
+
if (!args.apiKey) return sessionHeaders;
|
|
169
184
|
const headerName = resolveProviderAuthHeaderName(args);
|
|
170
|
-
return
|
|
185
|
+
return {
|
|
186
|
+
...sessionHeaders,
|
|
187
|
+
...headerName.toLowerCase() === "authorization" ? { Authorization: `Bearer ${args.apiKey}` } : { [headerName]: args.apiKey }
|
|
188
|
+
};
|
|
171
189
|
}
|
|
172
190
|
async function buildProviderExecutionPlan(args) {
|
|
173
191
|
const { agentConfig, env } = args;
|