nolo-cli 0.104.0-alpha.2 → 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.
Files changed (208) hide show
  1. package/README.md +1 -1
  2. package/{_executeModel-4W7C3ACS.js → _executeModel-JXG5TLPE.js} +75 -68
  3. package/action-GVA5ARSJ.js +20 -0
  4. package/{addContentAction-O7R66HEX.js → addContentAction-J3DLDV64.js} +12 -11
  5. package/{addDialogAgentAction-74OA7KYP.js → addDialogAgentAction-PHIXJCF2.js} +18 -19
  6. package/{agentDeleteCommand-YB3S2LPY.js → agentDeleteCommand-2AWJGHXG.js} +117 -42
  7. package/{agentEmailCommands-AQZVMNLR.js → agentEmailCommands-VV5OSILE.js} +98 -88
  8. package/agentListCommands-OQMRBDWP.js +742 -0
  9. package/{agentMachineCommands-R5AVYYN3.js → agentMachineCommands-3VLLR6RL.js} +48 -43
  10. package/{agentProviderCommands-GNPTL5XR.js → agentProviderCommands-XPJYZSCE.js} +97 -2
  11. package/{agentPullCommand-O5MPVJ5E.js → agentPullCommand-B4T2DJ5H.js} +1 -1
  12. package/agentRecordCommands-GPIARVOW.js +138 -0
  13. package/agentRunCommand-LRJTZ7IM.js +167 -0
  14. package/{agentRunControl-AVJR4JW4.js → agentRunControl-3HWA2LLQ.js} +2 -2
  15. package/{agentRuntimeLocal-FRUE5P2V.js → agentRuntimeLocal-PV6AZOEU.js} +44 -39
  16. package/{agentSlice-6LBOYNKN.js → agentSlice-6R3JKS6I.js} +14 -13
  17. package/{appDeleteCommands-JPWTSFID.js → appDeleteCommands-WEX73P5R.js} +46 -41
  18. package/{appDeployCommands-YCVY2UYO.js → appDeployCommands-7BAXWA4M.js} +46 -41
  19. package/{appDeployStatusCommands-JMCEIKTI.js → appDeployStatusCommands-EJ6A2U4X.js} +46 -41
  20. package/{appGetCommands-EXWT3QAE.js → appGetCommands-SB355OEX.js} +46 -41
  21. package/{appListCommands-PKRLSWRE.js → appListCommands-TSZDPIKJ.js} +46 -41
  22. package/{authCommand-F4EFRRX6.js → authCommand-5PB3YRVV.js} +118 -24
  23. package/{authCommands-RGOGCPP6.js → authCommands-5RTUDYZW.js} +7 -5
  24. package/{builtinSkillRegistry-FUAVTRVZ.js → builtinSkillRegistry-SBBWTANC.js} +10 -8
  25. package/{chromeCommands-FZYAU75D.js → chromeCommands-AU5ZJXBG.js} +289 -37
  26. package/{chromeOpsCommands-62P2Q2YB.js → chromeOpsCommands-ZYTCMNHG.js} +156 -22
  27. package/{chunk-6OZ36FXI.js → chunk-27ONFIEY.js} +22 -4
  28. package/{chunk-JEDZAO7L.js → chunk-2SYTUTLI.js} +257 -37
  29. package/{chunk-HVURBGF3.js → chunk-2U3NHADM.js} +6 -6
  30. package/{chunk-53HEEOTT.js → chunk-2WJ57RJA.js} +83 -16
  31. package/{chunk-OIVSQH2O.js → chunk-3BXNTXYI.js} +299 -5
  32. package/{chunk-V4MJDUSR.js → chunk-3F424ASC.js} +2 -2
  33. package/{chunk-HJUYAD4A.js → chunk-3Q7NEHAR.js} +5 -5
  34. package/chunk-44CU7CKA.js +13545 -0
  35. package/{chunk-EYAQT56M.js → chunk-4DPP773Q.js} +2 -2
  36. package/chunk-4LCOCOR5.js +50 -0
  37. package/{chunk-JPGCXHNM.js → chunk-4LKMZ3RR.js} +1 -1
  38. package/{chunk-2GRGFCF6.js → chunk-4VJAC32I.js} +2 -1
  39. package/{chunk-6D6VBVEW.js → chunk-4W24JM32.js} +80 -14
  40. package/{chunk-H62HCIUP.js → chunk-4WMMIL66.js} +35 -22
  41. package/{chunk-MC4XLIJ7.js → chunk-523DITKR.js} +1 -1
  42. package/{chunk-ZCYXJSTU.js → chunk-54VPQTOA.js} +66 -94
  43. package/{chunk-E4MARS3Q.js → chunk-5GVBDNTO.js} +1 -1
  44. package/chunk-5MMAK75Q.js +15 -0
  45. package/{chunk-7S4YWN7P.js → chunk-5UUIGN6I.js} +4 -4
  46. package/{chunk-42V6BK2E.js → chunk-62IL3KQV.js} +4 -34
  47. package/{chunk-GQBOR3G6.js → chunk-7KVZ5LDQ.js} +2 -2
  48. package/chunk-A4SQRTZ6.js +15 -0
  49. package/{chunk-L5UXH3B2.js → chunk-AFH5QC6R.js} +58 -9
  50. package/{chunk-AEOE4Z6Q.js → chunk-AFSY3ZMB.js} +39 -15
  51. package/chunk-AGIM7IMJ.js +147 -0
  52. package/{chunk-5UTFL4QJ.js → chunk-AOTBKDRK.js} +7 -0
  53. package/{chunk-NA35QHCF.js → chunk-AWVP7PPG.js} +1 -1
  54. package/{chunk-EEGDMATE.js → chunk-B7APRSPS.js} +86 -81
  55. package/{chunk-W324THOB.js → chunk-BB7LVBTS.js} +20 -11
  56. package/{chunk-6YTOJY35.js → chunk-BZ7NPA6G.js} +35 -2
  57. package/{chunk-5H7KJX7J.js → chunk-CFHWVEUJ.js} +5 -5
  58. package/chunk-CHOZJMJS.js +78 -0
  59. package/{chunk-ETI2NYVF.js → chunk-CNA27EMD.js} +4 -4
  60. package/{chunk-ACTMNVHM.js → chunk-CYSYR67N.js} +1 -1
  61. package/{chunk-WV42OMV7.js → chunk-D2GQE6AF.js} +8 -8
  62. package/{chunk-GBRG75BQ.js → chunk-D2MDMY2M.js} +1 -0
  63. package/{chunk-Q554LLSI.js → chunk-DMXLXZKL.js} +1 -1
  64. package/chunk-DZ7R5V3Y.js +164 -0
  65. package/{chunk-3VNWWVKB.js → chunk-E3YWHWCR.js} +50 -18
  66. package/{chunk-KQ4ONNQD.js → chunk-EKPKW6RM.js} +155 -8
  67. package/{chunk-2J5Y72GY.js → chunk-EP7BWZ4B.js} +1 -1
  68. package/{chunk-ABQYVJBJ.js → chunk-EV235ILT.js} +5 -5
  69. package/{chunk-TRV2MIDW.js → chunk-EXAJ6DCR.js} +1 -0
  70. package/{chunk-3ZW5ZJMM.js → chunk-FGSJ3YMD.js} +23 -28
  71. package/{chunk-2F7RJC6L.js → chunk-FOXQ7BAB.js} +1 -1
  72. package/{chunk-SH43IESU.js → chunk-GGC55Q32.js} +199 -29
  73. package/chunk-GMZLP5DV.js +82 -0
  74. package/{chunk-DHDMC6FO.js → chunk-GSKPJIHY.js} +14 -9
  75. package/{chunk-FDTR4QJ6.js → chunk-H6A6X4EK.js} +32 -1
  76. package/{chunk-DVINR3PL.js → chunk-HDLLCBRF.js} +1 -1
  77. package/{chunk-QOKAKDPE.js → chunk-HIM3FCLF.js} +0 -1
  78. package/{chunk-ONXOABJR.js → chunk-HNGRBWYF.js} +3 -0
  79. package/{chunk-VLTIYV3X.js → chunk-HP57OUJO.js} +4 -4
  80. package/{chunk-NXUYQBDZ.js → chunk-HYXABXCZ.js} +29 -78
  81. package/{chunk-DNCEALKX.js → chunk-IEJ5YDA4.js} +22 -29
  82. package/{chunk-O6OSWFZQ.js → chunk-IHPDK6UD.js} +6 -0
  83. package/{chunk-BP4XNZRM.js → chunk-JIXGJTBU.js} +4 -4
  84. package/{chunk-GPCZ7UXG.js → chunk-K6U4NKFJ.js} +1 -1
  85. package/{chunk-Z77CRGTW.js → chunk-KA5O5KQL.js} +1 -1
  86. package/{chunk-4OEFYTWL.js → chunk-L5WOICCV.js} +67 -48
  87. package/{chunk-LS2ZANRJ.js → chunk-LOCNXNOU.js} +1 -1
  88. package/chunk-LWLNLZC5.js +265 -0
  89. package/{chunk-H66KLASO.js → chunk-LWXE6IFU.js} +567 -519
  90. package/{chunk-PUOC4YRO.js → chunk-M7VLQGQP.js} +11 -0
  91. package/chunk-NKWIS6G2.js +442 -0
  92. package/{chunk-BFU6C242.js → chunk-NMFV26UG.js} +1 -1
  93. package/{chunk-DJWMIXDZ.js → chunk-NSAFG343.js} +10 -10
  94. package/{chunk-UKZDAFYT.js → chunk-NSBID7PR.js} +6 -10
  95. package/{chunk-O7EBSHZR.js → chunk-NTR4SD3P.js} +845 -240
  96. package/{chunk-FZGV4FGK.js → chunk-NUHHBEJC.js} +378 -187
  97. package/chunk-NWENLDMM.js +42 -0
  98. package/chunk-O7SVKKLY.js +875 -0
  99. package/chunk-OCZKATRC.js +129 -0
  100. package/{chunk-VMFTFOWF.js → chunk-OKGVNZTL.js} +35 -8
  101. package/{chunk-KQHGZWSV.js → chunk-OXME3PEE.js} +1 -1
  102. package/{chunk-JRQFUXY7.js → chunk-P5GCTVGV.js} +99 -22
  103. package/{chunk-PQFHGD77.js → chunk-QKTESDWK.js} +161 -14
  104. package/{chunk-U3JZVWIB.js → chunk-QMXJ5KDJ.js} +68 -46
  105. package/{chunk-GEPUP7OO.js → chunk-QYUBY3OZ.js} +3 -3
  106. package/{chunk-3BMYXEUW.js → chunk-R5AJODNI.js} +1 -1
  107. package/{chunk-J4MOO56S.js → chunk-RILRSUGC.js} +10 -2
  108. package/{chunk-OEVAY4J6.js → chunk-RWX7AY7J.js} +18 -20
  109. package/{chunk-YY7I6GQ3.js → chunk-S2NSK7AZ.js} +11 -9
  110. package/{chunk-IIVGDG4I.js → chunk-SJKULPGX.js} +13 -7
  111. package/{chunk-BYMV6QZG.js → chunk-TNIX77YM.js} +4 -0
  112. package/chunk-TY3TIUJK.js +89 -0
  113. package/{chunk-I3TQJXQ7.js → chunk-U3C3IA32.js} +9 -2
  114. package/{chunk-UZGQNTVW.js → chunk-UA324D4O.js} +8 -6
  115. package/{chunk-YYLHWIW6.js → chunk-UKZX3NHN.js} +1 -1
  116. package/chunk-UWXDA7L5.js +8005 -0
  117. package/{chunk-3DII57IT.js → chunk-VCAQFMVN.js} +1 -1
  118. package/chunk-VIWDGTDA.js +8 -0
  119. package/chunk-VJVNU77E.js +83 -0
  120. package/{chunk-A6FMKU7M.js → chunk-VVJ2ENLY.js} +47 -67
  121. package/{chunk-UKWGR5SS.js → chunk-VY6VFGKR.js} +194 -1144
  122. package/{chunk-QDSINZM3.js → chunk-WJ3B6FX6.js} +1 -14
  123. package/{chunk-Q67DOFOO.js → chunk-Y3PMXGLH.js} +2 -0
  124. package/chunk-YK5MHOWM.js +915 -0
  125. package/chunk-YV25TM3R.js +780 -0
  126. package/{chunk-TOP2VXOR.js → chunk-YVU4XVJD.js} +5 -5
  127. package/{chunk-S6JLBH6Z.js → chunk-Z5NGE5DH.js} +29 -9
  128. package/{chunk-LC43IGO4.js → chunk-ZBHR642M.js} +704 -950
  129. package/chunk-ZRAU6T47.js +56 -0
  130. package/{chunk-VLI5LVL5.js → chunk-ZSUDOTPL.js} +19 -17
  131. package/commandRegistry-QU62WJQX.js +833 -0
  132. package/{contentThunks-LXOZUD2Y.js → contentThunks-VGV3JJVB.js} +37 -35
  133. package/{cooldownCommands-REAWYVTY.js → cooldownCommands-ZLEPIB4A.js} +2 -2
  134. package/{createAgentAutomationAction-M5NDEIC6.js → createAgentAutomationAction-ZNVLI4WV.js} +39 -37
  135. package/createDialogAction-TTUA46DT.js +69 -0
  136. package/{createPageAction-WY5ZKP2M.js → createPageAction-KUFSC5XW.js} +46 -43
  137. package/{chunk-RJ4QOQDA.js → cursorProvider-YGGNMVWX.js} +2496 -9905
  138. package/{dbSlice-XVWBAGYN.js → dbSlice-MYEETO73.js} +11 -10
  139. package/{deleteFile-YG6QMJLU.js → deleteFile-KESP65GC.js} +7 -6
  140. package/{dialogCommands-YVMHDEOX.js → dialogCommands-DRDPEOTL.js} +49 -45
  141. package/{dialogSlice-HSGREZGA.js → dialogSlice-V2SVSTIV.js} +41 -34
  142. package/{dist-VODFSGNG.js → dist-NJC2W7I4.js} +61 -54
  143. package/{docCreateCommands-7UTWDYJU.js → docCreateCommands-M26CFDDQ.js} +48 -43
  144. package/{docDeleteCommands-GG6BJ4PS.js → docDeleteCommands-LRZHCKVX.js} +49 -44
  145. package/{docReadCommands-QHMQVSLP.js → docReadCommands-6QJSISHK.js} +47 -42
  146. package/{docStore-IIS36NGG.js → docStore-4RWAFNDM.js} +16 -12
  147. package/{docUpdateCommands-QPL6IVUK.js → docUpdateCommands-W4KU4U5T.js} +48 -43
  148. package/{fetchMessages-EIU7UFFK.js → fetchMessages-3PXAHKCR.js} +5 -5
  149. package/{getPricing-LUSEABA6.js → getPricing-NMMFT3YI.js} +4 -4
  150. package/{handleSendMessageAction-FEHCWMN2.js → handleSendMessageAction-VEWLGB5Z.js} +107 -41
  151. package/index.js +87 -884
  152. package/{lib-FRRS27KN.js → lib-PU2G2MSO.js} +523 -191
  153. package/{localDialogRead-BTFJ4V2I.js → localDialogRead-UYCKO7YZ.js} +2 -2
  154. package/{localRuntimeAuthority-6IR6BBXE.js → localRuntimeAuthority-TU6OBC76.js} +9 -6
  155. package/{localRuntimeDb-SYQGUF4U.js → localRuntimeDb-VKWVOPPI.js} +1 -1
  156. package/{machineCommands-7DEUPY32.js → machineCommands-AEHHCJEW.js} +92 -82
  157. package/machineWsRunDispatch-MY2KHS36.js +154 -0
  158. package/{memberThunks-QGFLFVCI.js → memberThunks-EE6TI3TV.js} +20 -18
  159. package/{models-T3SG6MJ5.js → models-ZPU5EDF4.js} +2 -2
  160. package/oauthTokenStore-ITEB663N.js +23 -0
  161. package/package.json +1 -1
  162. package/pdf-U6KSUEZZ.js +26435 -0
  163. package/processSpawn-SOAV3FEV.js +11 -0
  164. package/profileConfig-ZGOFORWV.js +43 -0
  165. package/{providerPresetApply-FG6NZ57W.js → providerPresetApply-TEBH7FDX.js} +7 -7
  166. package/{providerRegistry-757OWH3O.js → providerRegistry-CBJLNCET.js} +11 -7
  167. package/{read-COE3ZYR6.js → read-PJIT2YEJ.js} +7 -6
  168. package/{readDocTool-5USN4A6V.js → readDocTool-DRSXHGNL.js} +5 -3
  169. package/{readlineWorkspace-JP2AOALW.js → readlineWorkspace-7Q6MITLV.js} +2685 -2050
  170. package/{removeDialogAgentAction-IX3MN2ZO.js → removeDialogAgentAction-IN4WUKJJ.js} +21 -25
  171. package/{runAgentClientLoop-UY76PPZM.js → runAgentClientLoop-H2JALUVD.js} +76 -70
  172. package/{runtimeDoctorCommands-X6WDBEQX.js → runtimeDoctorCommands-PIVSBZRZ.js} +4 -4
  173. package/runtimeModeArgs-2Y7BALTO.js +31 -0
  174. package/{setDialogExtraReferencesAction-X4HCPNZL.js → setDialogExtraReferencesAction-VDRF7LPK.js} +15 -13
  175. package/{setPrimaryDialogAgentAction-4GMIQLOD.js → setPrimaryDialogAgentAction-RO6LIWJ4.js} +22 -26
  176. package/{chunk-AFUORTY4.js → settingThunks-3OPOLOIA.js} +226 -940
  177. package/{skillDiscovery-CYUCJMAG.js → skillDiscovery-ZBU76COE.js} +3 -3
  178. package/{slateUtils-RIZES3PV.js → slateUtils-NGV2NMKM.js} +1 -1
  179. package/{spaceCommands-BMXKR7H6.js → spaceCommands-UBLL5EF2.js} +51 -46
  180. package/{streamAgentChatTurn-3YVIO4KE.js → streamAgentChatTurn-FFJWW3FD.js} +214 -108
  181. package/{switchDialogAgentAction-N52LRPA3.js → switchDialogAgentAction-MVF2JNE7.js} +18 -19
  182. package/{tableCommands-O6NWHFKV.js → tableCommands-6U4BMLRR.js} +10 -10
  183. package/{toolApiClient-QVJ6HDNN.js → toolApiClient-EJT6TMFG.js} +3 -3
  184. package/tools-AZRYLYNK.js +116 -0
  185. package/{tuiSummaryLlmCaller-WFRWERGK.js → tuiSummaryLlmCaller-7S5HJ3MT.js} +25 -22
  186. package/{updateCommands-2M74UL7P.js → updateCommands-4EHDLF5J.js} +3 -3
  187. package/{updateDialogTitleAction-GF5T3VMK.js → updateDialogTitleAction-5WXTRUJM.js} +82 -44
  188. package/action-YVYQEAAV.js +0 -31
  189. package/agentListCommands-3GWH4E4G.js +0 -410
  190. package/agentRecordCommands-JY4IWSSQ.js +0 -128
  191. package/agentRunCommand-7VTYZY3Q.js +0 -156
  192. package/browser-image-compression-MFDTD7K6.js +0 -1763
  193. package/chatQueueReduxAdapter-WFROMKD3.js +0 -186
  194. package/chunk-CQ3WA2NE.js +0 -299
  195. package/chunk-FQUHIG5X.js +0 -20782
  196. package/chunk-M76ECQRD.js +0 -13658
  197. package/chunk-MEYIRKDN.js +0 -8967
  198. package/chunk-Q5FJJ6XI.js +0 -103
  199. package/chunk-S7Z2HMCN.js +0 -25
  200. package/chunk-Y5GCAMGP.js +0 -9
  201. package/chunk-YPREESF4.js +0 -225
  202. package/createDialogAction-TDFOINOY.js +0 -65
  203. package/machineWsRunDispatch-D2NHL3P7.js +0 -144
  204. package/settingSlice-ZQZVUPKK.js +0 -204
  205. package/syncMapping-N6RGXGBW.js +0 -437
  206. package/tools-Q6IBBG33.js +0 -110
  207. package/{chunk-X7HHHIOZ.js → chunk-Y6ROFCZO.js} +0 -0
  208. package/{db-WK5MDZVN.js → db-VQSAOWAO.js} +1 -1
@@ -1,6 +1,7 @@
1
1
  import {
2
- createChromeConnectorClient
3
- } from "./chunk-SH43IESU.js";
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 chrome list-tabs",
98
+ usage: "nolo browser list-tabs",
71
99
  payload: () => ({})
72
100
  },
73
101
  "open-tab": {
74
102
  action: "open_tab",
75
- usage: "nolo chrome open-tab --url <url> [--active]",
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 chrome close-tab --tab <id>",
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 chrome read-page --tab <id> [--selector <css>] [--detail compact|full] [--max-elements N]",
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 chrome click --tab <id> (--ref <elementRef> | --selector <css>)",
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 chrome type --tab <id> (--ref <elementRef> | --selector <css>) --text <text> [--append]",
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 chrome upload --tab <id> (--ref <elementRef> | --selector <css>) --file <path> [--file <path>...]",
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 chrome press --tab <id> --key <key>",
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 chrome scroll --tab <id> [--delta-x N] [--delta-y N]",
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 chrome screenshot --tab <id> [--out <path>] [--full-page]",
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 chrome read-console --tab <id> [--limit N]",
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 chrome read-network --tab <id> [--limit N] [--include-assets]",
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 Chrome connector (the desktop bridge;",
201
- "the same RPC the chrome_* agent tools use).",
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 chrome <subcommand> [flags]",
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 chrome /, "")}`
240
+ (spec) => ` ${spec.usage.replace(/^nolo browser /, "")}`
209
241
  ),
210
242
  "",
211
243
  "Notes:",
212
- " --ref takes an elementRef copied from `nolo chrome read-page` (revision-scoped,",
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 http://127.0.0.1:38947/rpc."
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 chrome subcommand: ${subcommand}
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 client = deps.client ?? createChromeConnectorClient();
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-GQBOR3G6.js";
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-Q67DOFOO.js";
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
- if (!args.apiKey) return {};
182
+ const sessionHeaders = buildProviderSessionHeaders(args);
183
+ if (!args.apiKey) return sessionHeaders;
169
184
  const headerName = resolveProviderAuthHeaderName(args);
170
- return headerName.toLowerCase() === "authorization" ? { Authorization: `Bearer ${args.apiKey}` } : { [headerName]: args.apiKey };
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;