nolo-cli 0.95.0-alpha.6 → 0.95.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 (180) hide show
  1. package/README.md +1 -1
  2. package/{_executeModel-AUQRMRWL.js → _executeModel-4NTXSCYT.js} +67 -63
  3. package/{action-YVYQEAAV.js → action-GI44T4DR.js} +10 -10
  4. package/{addContentAction-O7R66HEX.js → addContentAction-B2DRF7P6.js} +9 -9
  5. package/{addDialogAgentAction-74OA7KYP.js → addDialogAgentAction-T3I7IXPK.js} +15 -17
  6. package/{agentDeleteCommand-4BAHJRU3.js → agentDeleteCommand-QYCCUQ35.js} +47 -43
  7. package/{agentEmailCommands-QISOY7Y6.js → agentEmailCommands-GJ7KXHA6.js} +89 -82
  8. package/{agentListCommands-U46ODMQU.js → agentListCommands-JDU7V3M5.js} +77 -82
  9. package/{agentMachineCommands-EHV2KM2C.js → agentMachineCommands-PXJG3EDI.js} +42 -38
  10. package/{agentProviderCommands-GNPTL5XR.js → agentProviderCommands-YK2BIIXZ.js} +1 -1
  11. package/{agentPullCommand-O5MPVJ5E.js → agentPullCommand-HF4A42D4.js} +1 -1
  12. package/agentRecordCommands-3ONMYU6P.js +135 -0
  13. package/{agentRunCommand-K4CLMA6B.js → agentRunCommand-L6NJGDBA.js} +88 -80
  14. package/{agentRunControl-XLGD3UZ5.js → agentRunControl-5T64LM2M.js} +2 -2
  15. package/{agentRuntimeLocal-O4HPUJA4.js → agentRuntimeLocal-SYLNOKCT.js} +44 -36
  16. package/{agentSlice-ZYT2OUR3.js → agentSlice-X63VSE6R.js} +11 -11
  17. package/{appDeleteCommands-R5BBTKQK.js → appDeleteCommands-IP22BHZE.js} +42 -38
  18. package/{appDeployCommands-ZJIXOJWD.js → appDeployCommands-5ZTQL6UL.js} +42 -38
  19. package/{appDeployStatusCommands-B3R2ZTBF.js → appDeployStatusCommands-G6EMAT75.js} +42 -38
  20. package/{appGetCommands-2AQSOV2A.js → appGetCommands-UXBDAYEM.js} +42 -38
  21. package/{appListCommands-HCIJGZFY.js → appListCommands-J274GTVP.js} +42 -38
  22. package/{authCommand-F4EFRRX6.js → authCommand-W6I6GD3F.js} +115 -23
  23. package/{authCommands-RGOGCPP6.js → authCommands-GBIFZWD3.js} +5 -5
  24. package/{builtinSkillRegistry-FUAVTRVZ.js → builtinSkillRegistry-ZMF6YGNO.js} +6 -5
  25. package/{chatQueueReduxAdapter-Q5V4YJVI.js → chatQueueReduxAdapter-KN774OKJ.js} +30 -29
  26. package/{chromeCommands-FZYAU75D.js → chromeCommands-K27J4OVZ.js} +124 -28
  27. package/{chromeOpsCommands-62P2Q2YB.js → chromeOpsCommands-IXRLN57H.js} +4 -3
  28. package/{chunk-6OZ36FXI.js → chunk-27ONFIEY.js} +22 -4
  29. package/{chunk-XOVEWFLK.js → chunk-2JCOP36I.js} +100 -100
  30. package/{chunk-JEDZAO7L.js → chunk-2SYTUTLI.js} +257 -37
  31. package/{chunk-OIVSQH2O.js → chunk-3BXNTXYI.js} +299 -5
  32. package/{chunk-EYAQT56M.js → chunk-4DPP773Q.js} +2 -2
  33. package/chunk-4LCOCOR5.js +50 -0
  34. package/{chunk-2GRGFCF6.js → chunk-4VJAC32I.js} +2 -1
  35. package/{chunk-MC4XLIJ7.js → chunk-523DITKR.js} +1 -1
  36. package/{chunk-IAO6JBYW.js → chunk-5B7XS6UO.js} +164 -14
  37. package/{chunk-E4MARS3Q.js → chunk-5GVBDNTO.js} +1 -1
  38. package/chunk-5J3PYNUP.js +255 -0
  39. package/chunk-5MMAK75Q.js +15 -0
  40. package/{chunk-JPGCXHNM.js → chunk-5OA5HMTL.js} +1 -1
  41. package/{chunk-AFDS2CVM.js → chunk-5T2W2ZZN.js} +15 -20
  42. package/{chunk-42V6BK2E.js → chunk-62IL3KQV.js} +4 -34
  43. package/{chunk-YQTQQX2H.js → chunk-67HHBCFJ.js} +1 -1
  44. package/{chunk-SNPMM7H3.js → chunk-67T7O467.js} +13 -13
  45. package/{chunk-6YTOJY35.js → chunk-6D2JFXLY.js} +35 -0
  46. package/{chunk-4MY4GLIW.js → chunk-6IHBIRPK.js} +969 -1090
  47. package/{chunk-3BMYXEUW.js → chunk-6O4IK4V2.js} +1 -1
  48. package/{chunk-DHDMC6FO.js → chunk-6TPOEJMQ.js} +9 -4
  49. package/{chunk-LLT642J4.js → chunk-6UPZ63YT.js} +24 -5
  50. package/{chunk-WADCY6G6.js → chunk-6ZWMH6TJ.js} +111 -41
  51. package/{chunk-ABQYVJBJ.js → chunk-7CHC4W22.js} +1 -1
  52. package/{chunk-GQBOR3G6.js → chunk-7KVZ5LDQ.js} +2 -2
  53. package/{chunk-MMPXJXHT.js → chunk-7VJHIB2S.js} +573 -476
  54. package/{chunk-OA6Q2A4I.js → chunk-A7RSPKU6.js} +98 -22
  55. package/{chunk-KQ4ONNQD.js → chunk-ALFH24P3.js} +56 -7
  56. package/{chunk-Q554LLSI.js → chunk-AUDNYVRC.js} +1 -1
  57. package/{chunk-GPCZ7UXG.js → chunk-AZRHIN5B.js} +1 -1
  58. package/{chunk-JRQFUXY7.js → chunk-B2XUQXQX.js} +96 -19
  59. package/chunk-BMQ2MJUK.js +153 -0
  60. package/{chunk-3IIEFNGY.js → chunk-C53ZG23R.js} +2 -2
  61. package/chunk-CHOZJMJS.js +78 -0
  62. package/{chunk-A6G32FNX.js → chunk-CJXHT3S7.js} +13 -13
  63. package/{chunk-HJUYAD4A.js → chunk-CPUFH46E.js} +8 -8
  64. package/{chunk-JOHSKZQX.js → chunk-CQMQXVFQ.js} +859 -141
  65. package/{chunk-LS2ZANRJ.js → chunk-CTUQJVQM.js} +1 -1
  66. package/{chunk-BP4XNZRM.js → chunk-CU3QB4HW.js} +3 -3
  67. package/{chunk-ACTMNVHM.js → chunk-CYSYR67N.js} +1 -1
  68. package/{chunk-ZXKVPF4K.js → chunk-DA54MHPJ.js} +236 -36
  69. package/{chunk-VLTIYV3X.js → chunk-DCLMZ5TX.js} +4 -4
  70. package/{chunk-UKZDAFYT.js → chunk-DSSTTEKI.js} +6 -10
  71. package/{chunk-HVURBGF3.js → chunk-ESRMFY7G.js} +2 -2
  72. package/{chunk-TRV2MIDW.js → chunk-EXAJ6DCR.js} +1 -0
  73. package/chunk-GMZLP5DV.js +82 -0
  74. package/{chunk-FDTR4QJ6.js → chunk-H6A6X4EK.js} +32 -1
  75. package/{chunk-DVINR3PL.js → chunk-HDLLCBRF.js} +1 -1
  76. package/{chunk-ONXOABJR.js → chunk-HNGRBWYF.js} +3 -0
  77. package/{chunk-ZLR5JN3E.js → chunk-HWRQVJGX.js} +7 -7
  78. package/{chunk-H62HCIUP.js → chunk-HYZIYH2H.js} +11 -10
  79. package/{chunk-NTW5GWDM.js → chunk-I3QNET24.js} +32 -17
  80. package/{chunk-WV42OMV7.js → chunk-IAESIMK7.js} +4 -4
  81. package/{chunk-QIAVMDHY.js → chunk-IUVCUGQR.js} +4 -4
  82. package/{chunk-EGSKXKR5.js → chunk-IX27RP45.js} +1 -1
  83. package/{chunk-IIVGDG4I.js → chunk-LNPYTNMG.js} +8 -4
  84. package/{chunk-BLJWCTRL.js → chunk-LVITW736.js} +1 -1
  85. package/{chunk-76WEAXJB.js → chunk-M3LRSBOX.js} +18 -15
  86. package/{chunk-XRWZB6CF.js → chunk-M73PVOVS.js} +23 -76
  87. package/{chunk-7S4YWN7P.js → chunk-MX574M24.js} +1 -1
  88. package/{chunk-FZGV4FGK.js → chunk-NUHHBEJC.js} +378 -187
  89. package/{chunk-53HEEOTT.js → chunk-O26PCYLS.js} +80 -13
  90. package/{chunk-3DII57IT.js → chunk-O2OWEFII.js} +1 -1
  91. package/chunk-OCZKATRC.js +129 -0
  92. package/chunk-P6GMCCAT.js +870 -0
  93. package/{chunk-CPH3W5A7.js → chunk-Q4GP72HX.js} +94 -3
  94. package/{chunk-Z77CRGTW.js → chunk-R4SQ3LGW.js} +1 -1
  95. package/chunk-RE3CDVRX.js +7600 -0
  96. package/{chunk-DEUUPHOO.js → chunk-RKGKDQGJ.js} +74 -17
  97. package/{chunk-V4MJDUSR.js → chunk-RSEEDUMS.js} +2 -2
  98. package/{chunk-BZWBEHGD.js → chunk-S3VFZW75.js} +66 -38
  99. package/{chunk-UZGQNTVW.js → chunk-S5XGT6GB.js} +5 -3
  100. package/{chunk-AFUORTY4.js → chunk-SONWNI3L.js} +21 -21
  101. package/{chunk-BYMV6QZG.js → chunk-TNIX77YM.js} +4 -0
  102. package/{chunk-OF7AQZUG.js → chunk-TU5NE4U3.js} +9 -84
  103. package/chunk-UNYJU5L6.js +780 -0
  104. package/{chunk-J4MOO56S.js → chunk-UQNS32WZ.js} +10 -2
  105. package/chunk-V2SAIXHE.js +13349 -0
  106. package/chunk-VIWDGTDA.js +8 -0
  107. package/chunk-VJVNU77E.js +83 -0
  108. package/{chunk-6D6VBVEW.js → chunk-VPFEPRME.js} +9 -9
  109. package/{chunk-JAXOVNM4.js → chunk-WILHZY7K.js} +45 -45
  110. package/{chunk-UKWGR5SS.js → chunk-WIWM4FE3.js} +187 -398
  111. package/{chunk-BGSLKVCP.js → chunk-XTDH3PGV.js} +6 -7
  112. package/{chunk-O6OSWFZQ.js → chunk-XUWRURDF.js} +6 -0
  113. package/{chunk-Q67DOFOO.js → chunk-Y3PMXGLH.js} +2 -0
  114. package/{chunk-SH43IESU.js → chunk-YUNJN43V.js} +44 -9
  115. package/{chunk-TOP2VXOR.js → chunk-Z4CSIXYP.js} +2 -2
  116. package/{chunk-2F7RJC6L.js → chunk-ZOVKKMF6.js} +1 -1
  117. package/chunk-ZRAU6T47.js +56 -0
  118. package/commandRegistry-NPS6IYBO.js +833 -0
  119. package/{contentThunks-PT23JWJX.js → contentThunks-EB4JFL4K.js} +32 -30
  120. package/{cooldownCommands-REAWYVTY.js → cooldownCommands-ZLEPIB4A.js} +2 -2
  121. package/{createAgentAutomationAction-N27SYTLU.js → createAgentAutomationAction-NZS7N4AW.js} +32 -30
  122. package/{createDialogAction-XZPLHD5G.js → createDialogAction-4Q4J7P4T.js} +36 -33
  123. package/{createPageAction-KHVJQ3CS.js → createPageAction-FPKRGV7D.js} +38 -36
  124. package/{chunk-3SJQXXGY.js → cursorProvider-YGGNMVWX.js} +2560 -9879
  125. package/{dbSlice-XVWBAGYN.js → dbSlice-DQ32LYTJ.js} +8 -8
  126. package/{deleteFile-YG6QMJLU.js → deleteFile-NX6QHCWZ.js} +3 -3
  127. package/{dialogCommands-ZUWW5UT6.js → dialogCommands-XXZH5K6U.js} +45 -41
  128. package/{dialogSlice-3YH242HS.js → dialogSlice-DXEZ3PA3.js} +36 -29
  129. package/{dist-VODFSGNG.js → dist-NJC2W7I4.js} +61 -54
  130. package/{docCreateCommands-Q6FADDSJ.js → docCreateCommands-FLNUDWG6.js} +44 -40
  131. package/{docDeleteCommands-ZKIH54PZ.js → docDeleteCommands-74OURFAB.js} +44 -40
  132. package/{docReadCommands-7BZT2QTW.js → docReadCommands-QENWDQVH.js} +43 -39
  133. package/{docStore-YSZRNUUD.js → docStore-2JTPJVFK.js} +11 -10
  134. package/{docUpdateCommands-WJXWTRL7.js → docUpdateCommands-J4HWJ5JO.js} +44 -40
  135. package/{fetchMessages-EIU7UFFK.js → fetchMessages-67MEFPZR.js} +2 -2
  136. package/{getPricing-LUSEABA6.js → getPricing-NMMFT3YI.js} +3 -3
  137. package/{handleSendMessageAction-KJO2QDBM.js → handleSendMessageAction-FGPHI364.js} +91 -83
  138. package/index.js +87 -884
  139. package/{localDialogRead-BTFJ4V2I.js → localDialogRead-EBRS242U.js} +2 -2
  140. package/{localRuntimeAuthority-6IR6BBXE.js → localRuntimeAuthority-5W6IJRAD.js} +6 -6
  141. package/{localRuntimeDb-SYQGUF4U.js → localRuntimeDb-3LRMNLCM.js} +1 -1
  142. package/{machineCommands-QC4TD7GJ.js → machineCommands-26AZP4AS.js} +84 -77
  143. package/{machineWsRunDispatch-XUOIAXO7.js → machineWsRunDispatch-GQ5XJ2DL.js} +81 -74
  144. package/{memberThunks-QGFLFVCI.js → memberThunks-5ZXPR63F.js} +9 -9
  145. package/{models-T3SG6MJ5.js → models-ZPU5EDF4.js} +2 -2
  146. package/oauthTokenStore-ITEB663N.js +23 -0
  147. package/package.json +1 -1
  148. package/pdf-U6KSUEZZ.js +26435 -0
  149. package/processSpawn-SOAV3FEV.js +11 -0
  150. package/profileConfig-ZGOFORWV.js +43 -0
  151. package/{providerPresetApply-FG6NZ57W.js → providerPresetApply-DD6NGWW6.js} +7 -7
  152. package/{providerRegistry-757OWH3O.js → providerRegistry-XDRLMYGJ.js} +7 -7
  153. package/{read-COE3ZYR6.js → read-EPTJRAEF.js} +5 -5
  154. package/{readDocTool-5USN4A6V.js → readDocTool-W4NDXNEX.js} +5 -3
  155. package/{readlineWorkspace-74TXXSLO.js → readlineWorkspace-B7NBQCX6.js} +2448 -2022
  156. package/{removeDialogAgentAction-IX3MN2ZO.js → removeDialogAgentAction-BVAWQKXE.js} +17 -19
  157. package/{runAgentClientLoop-37BXJD62.js → runAgentClientLoop-RVB5K6R2.js} +61 -58
  158. package/{runtimeDoctorCommands-X6WDBEQX.js → runtimeDoctorCommands-3USD722U.js} +3 -3
  159. package/runtimeModeArgs-2Y7BALTO.js +31 -0
  160. package/{setDialogExtraReferencesAction-X4HCPNZL.js → setDialogExtraReferencesAction-LYY45IAD.js} +12 -11
  161. package/{setPrimaryDialogAgentAction-4GMIQLOD.js → setPrimaryDialogAgentAction-73IL7DLU.js} +18 -20
  162. package/{settingSlice-ZQZVUPKK.js → settingSlice-Q6EKL7EQ.js} +9 -9
  163. package/{skillDiscovery-CYUCJMAG.js → skillDiscovery-ZBU76COE.js} +3 -3
  164. package/{spaceCommands-P3ONT6LL.js → spaceCommands-BYDGOMW7.js} +44 -40
  165. package/{streamAgentChatTurn-FGXQXALU.js → streamAgentChatTurn-HV3FSRHN.js} +183 -91
  166. package/{switchDialogAgentAction-N52LRPA3.js → switchDialogAgentAction-UUXDSQ6X.js} +15 -17
  167. package/{tableCommands-O6NWHFKV.js → tableCommands-G7RV3RU3.js} +4 -4
  168. package/{toolApiClient-QVJ6HDNN.js → toolApiClient-INIQCPGY.js} +3 -3
  169. package/{tools-R5UF2KZO.js → tools-AZR26MXC.js} +54 -51
  170. package/{tuiSummaryLlmCaller-T2SHYMDZ.js → tuiSummaryLlmCaller-74NRRLVW.js} +18 -16
  171. package/{updateCommands-2M74UL7P.js → updateCommands-4EHDLF5J.js} +3 -3
  172. package/{updateDialogTitleAction-RTADGV7A.js → updateDialogTitleAction-HEWCCXZZ.js} +81 -43
  173. package/agentRecordCommands-SIPURU2S.js +0 -128
  174. package/chunk-FOWEGIMF.js +0 -18881
  175. package/chunk-M76ECQRD.js +0 -13658
  176. package/chunk-Q5FJJ6XI.js +0 -103
  177. package/chunk-S7Z2HMCN.js +0 -25
  178. package/{chunk-VMFTFOWF.js → chunk-3AH7LNUB.js} +7 -7
  179. package/{chunk-X7HHHIOZ.js → chunk-Y6ROFCZO.js} +0 -0
  180. package/{db-WK5MDZVN.js → db-VQSAOWAO.js} +1 -1
@@ -1,6 +1,6 @@
1
1
  import {
2
- require_date_fns
3
- } from "./chunk-M76ECQRD.js";
2
+ formatISO
3
+ } from "./chunk-ZRAU6T47.js";
4
4
  import {
5
5
  require_react
6
6
  } from "./chunk-YDH3FDFQ.js";
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  patch,
12
12
  readAndWait
13
- } from "./chunk-H62HCIUP.js";
13
+ } from "./chunk-HYZIYH2H.js";
14
14
  import {
15
15
  asOptionalTrimmedString
16
16
  } from "./chunk-G3SUCT4W.js";
@@ -20,7 +20,6 @@ import {
20
20
 
21
21
  // packages/render/page/docStore.ts
22
22
  var import_react = __toESM(require_react(), 1);
23
- var import_date_fns = __toESM(require_date_fns(), 1);
24
23
  var createInitialState = () => ({
25
24
  content: null,
26
25
  slateData: null,
@@ -309,7 +308,7 @@ async function saveDocState(arg, { dispatch, getState }) {
309
308
  const skillSummary = buildSkillSummaryMarker(meta);
310
309
  const content = slateToRenderMarkdown(slateData);
311
310
  const now = /* @__PURE__ */ new Date();
312
- const updatedAt = (0, import_date_fns.formatISO)(now);
311
+ const updatedAt = formatISO(now);
313
312
  await dispatch(
314
313
  patch({
315
314
  dbKey: pageKey,
@@ -326,7 +325,7 @@ async function saveDocState(arg, { dispatch, getState }) {
326
325
  ).unwrap();
327
326
  if (dbSpaceId) {
328
327
  try {
329
- const { updateContentTitle } = await import("./contentThunks-PT23JWJX.js");
328
+ const { updateContentTitle } = await import("./contentThunks-EB4JFL4K.js");
330
329
  await dispatch(
331
330
  updateContentTitle({
332
331
  spaceId: dbSpaceId,
@@ -365,7 +364,7 @@ async function saveDocState(arg, { dispatch, getState }) {
365
364
  }
366
365
  }
367
366
  async function createDocState(args, thunkApi) {
368
- const { createPageAction } = await import("./createPageAction-KHVJQ3CS.js");
367
+ const { createPageAction } = await import("./createPageAction-FPKRGV7D.js");
369
368
  return createPageAction(args, thunkApi);
370
369
  }
371
370
  function subscribe(listener) {
@@ -1,5 +1,11 @@
1
+ import {
2
+ CHROME_CONNECTOR_LEGACY_TOOL_ALIASES
3
+ } from "./chunk-5J3PYNUP.js";
4
+
1
5
  // packages/agent-runtime/toolNameAliases.ts
2
6
  var LEGACY_TOOL_NAME_ALIASES = {
7
+ // Nolo Browser Connector: legacy chrome_* → canonical browser_*
8
+ ...CHROME_CONNECTOR_LEGACY_TOOL_ALIASES,
3
9
  createPage: "createDoc",
4
10
  updatePage: "updateDoc",
5
11
  update_page: "updateDoc",
@@ -11,6 +11,7 @@ var PLATFORM_HOSTED_KIMI_K3_MODEL = "kimi-k3";
11
11
  var PLATFORM_HOSTED_KIMI_K26_MODEL = "kimi-k2.6";
12
12
  var PLATFORM_HOSTED_KIMI_PROVIDER = "nolo";
13
13
  var LEGACY_OLLAMA_CLOUD_PROVIDER = "ollama-cloud";
14
+ var PLATFORM_LLM_BUSY_USER_MESSAGE = "\u670D\u52A1\u5668\u7D27\u5F20";
14
15
  var isNoloHostedProvider = (provider) => {
15
16
  const normalized = asTrimmedLowercaseString(provider);
16
17
  return normalized === PLATFORM_HOSTED_KIMI_PROVIDER || normalized === LEGACY_OLLAMA_CLOUD_PROVIDER;
@@ -1200,6 +1201,7 @@ export {
1200
1201
  openrouterModels,
1201
1202
  PLATFORM_HOSTED_KIMI_K3_MODEL,
1202
1203
  PLATFORM_HOSTED_KIMI_PROVIDER,
1204
+ PLATFORM_LLM_BUSY_USER_MESSAGE,
1203
1205
  isNoloHostedProvider,
1204
1206
  isFireworksKimiModel,
1205
1207
  isDeepInfraKimiModel,
@@ -136,6 +136,11 @@ function logUploadAudit(entry, logFn = console.warn) {
136
136
 
137
137
  // packages/desktop-chrome-connector/chromeConnector.ts
138
138
  var NOLO_CHROME_CONNECTOR_EXTENSION_ID = "ahpdoopadkamnglhlacfjdfnonpjdplg";
139
+ var NOLO_FIREFOX_CONNECTOR_EXTENSION_ID = "nolo-browser-connector@nolo.chat";
140
+ var NOLO_CONNECTOR_EXTENSION_IDS = [
141
+ NOLO_CHROME_CONNECTOR_EXTENSION_ID,
142
+ NOLO_FIREFOX_CONNECTOR_EXTENSION_ID
143
+ ];
139
144
  var NOLO_CHROME_CONNECTOR_PROTOCOL_VERSION = "2";
140
145
  function defaultTokenPath() {
141
146
  return resolve2(
@@ -149,6 +154,18 @@ function readConnectorToken(tokenPath = defaultTokenPath()) {
149
154
  return readFileSync(tokenPath, "utf8").trim();
150
155
  }
151
156
  var CHROME_TOOL_ACTIONS = {
157
+ browser_list_tabs: "list_tabs",
158
+ browser_open_tab: "open_tab",
159
+ browser_close_tab: "close_tab",
160
+ browser_read_page: "read_page",
161
+ browser_click_element: "click",
162
+ browser_type: "type",
163
+ browser_press: "press",
164
+ browser_scroll: "scroll",
165
+ browser_screenshot: "screenshot",
166
+ browser_read_console: "read_console",
167
+ browser_read_network: "read_network",
168
+ // Legacy aliases (kept for existing agents/tests).
152
169
  chrome_list_tabs: "list_tabs",
153
170
  chrome_open_tab: "open_tab",
154
171
  chrome_close_tab: "close_tab",
@@ -164,6 +181,12 @@ var CHROME_TOOL_ACTIONS = {
164
181
  chrome_upload_file: "set_files",
165
182
  chrome_upload: "set_files"
166
183
  };
184
+ for (const legacyName of ["chrome_set_files", "chrome_upload_file", "chrome_upload"]) {
185
+ const action = CHROME_TOOL_ACTIONS[legacyName];
186
+ if (action) {
187
+ CHROME_TOOL_ACTIONS[`browser_${legacyName.slice("chrome_".length)}`] = action;
188
+ }
189
+ }
167
190
  function createConnectorError(code, message, details) {
168
191
  const error = new Error(message);
169
192
  error.code = code;
@@ -183,9 +206,13 @@ function parseArguments(raw) {
183
206
  }
184
207
  }
185
208
  function errorPayload(error) {
209
+ const code = error?.code ?? "CHROME_CONNECTOR_ERROR";
186
210
  return {
187
- code: error?.code ?? "CHROME_CONNECTOR_ERROR",
211
+ code,
188
212
  message: toErrorMessage(error),
213
+ ...code === "CHROME_CONNECTOR_UNAVAILABLE" ? {
214
+ hint: "The Nolo Browser Connector is not reachable. It runs inside the user's own Chrome or Firefox \u2014 ask the user to open their browser with the Nolo Browser Connector extension enabled, or install it from https://nolo.chat/downloads (Firefox can install the signed .xpi directly), then retry."
215
+ } : {},
189
216
  ...error?.details !== void 0 ? { details: error.details } : {}
190
217
  };
191
218
  }
@@ -198,7 +225,7 @@ function validateChromeConnectorPayload(action, payload) {
198
225
  if (!tabId) {
199
226
  throw createConnectorError(
200
227
  "TAB_ID_REQUIRED",
201
- `Provide the tabId from chrome_list_tabs before calling ${action}.`
228
+ `Provide the tabId from browser_list_tabs before calling ${action}.`
202
229
  );
203
230
  }
204
231
  if (!TARGET_REQUIRED_ACTIONS.has(action)) return;
@@ -210,7 +237,7 @@ function validateChromeConnectorPayload(action, payload) {
210
237
  if (!elementRef && !selector) {
211
238
  throw createConnectorError(
212
239
  "ELEMENT_TARGET_REQUIRED",
213
- "Provide elementRef from chrome_read_page or a CSS selector."
240
+ "Provide elementRef from browser_read_page or a CSS selector."
214
241
  );
215
242
  }
216
243
  if (action === "set_files") {
@@ -285,7 +312,10 @@ var REQUIRED_CHROME_CONNECTOR_FEATURES = {
285
312
  type: ["compact_observation_v2", "action_gate"],
286
313
  press: ["compact_observation_v2", "action_gate"],
287
314
  scroll: ["compact_observation_v2"],
288
- screenshot: ["browser_debug"],
315
+ // Both browsers advertise the dedicated `screenshot` feature: Chrome serves it through
316
+ // Page.captureScreenshot (browser_debug-adjacent) while Firefox falls back to
317
+ // tabs.captureVisibleTab, so gating on browser_debug would wrongly refuse Firefox.
318
+ screenshot: ["screenshot"],
289
319
  read_console: ["browser_debug"],
290
320
  read_network: ["browser_debug"],
291
321
  detach: ["browser_debug"],
@@ -296,17 +326,20 @@ function requiredFeaturesForConnectorAction(action) {
296
326
  }
297
327
  function createVerifiedChromeConnectorClient(args) {
298
328
  const client = args?.client ?? createChromeConnectorClient();
299
- const expectedExtensionId = args?.expectedExtensionId ?? NOLO_CHROME_CONNECTOR_EXTENSION_ID;
329
+ const expectedExtensionIds = new Set(
330
+ args?.expectedExtensionIds ?? (args?.expectedExtensionId ? [args.expectedExtensionId] : NOLO_CONNECTOR_EXTENSION_IDS)
331
+ );
300
332
  let verified = null;
301
333
  let negotiatedFeatures = [];
302
334
  const verify = async () => {
303
335
  const connectorInfo = await client.request("connector_info", {});
304
336
  const receivedExtensionId = connectorInfo?.extensionId;
305
- if (receivedExtensionId !== expectedExtensionId) {
337
+ if (typeof receivedExtensionId !== "string" || !expectedExtensionIds.has(receivedExtensionId)) {
338
+ const expectedList = [...expectedExtensionIds].join(", ");
306
339
  throw createConnectorError(
307
340
  "CHROME_CONNECTOR_EXTENSION_MISMATCH",
308
- `Chrome connector extension id mismatch: expected ${expectedExtensionId}, received ${typeof receivedExtensionId === "string" ? receivedExtensionId : "unknown"}.`,
309
- { expectedExtensionId, receivedExtensionId }
341
+ `Chrome connector extension id mismatch: expected one of ${expectedList}, received ${typeof receivedExtensionId === "string" ? receivedExtensionId : "unknown"}.`,
342
+ { expectedExtensionIds: [...expectedExtensionIds], receivedExtensionId }
310
343
  );
311
344
  }
312
345
  const receivedProtocolVersion = connectorInfo?.protocolVersion;
@@ -366,7 +399,7 @@ async function executeChromeConnectorTool(args) {
366
399
  };
367
400
  }
368
401
  try {
369
- const payload = parseArguments(args.call.arguments);
402
+ const { target: _ignoredTarget, ...payload } = parseArguments(args.call.arguments);
370
403
  validateChromeConnectorPayload(action, payload);
371
404
  const result = await (args.client ?? createChromeConnectorClient()).request(action, payload);
372
405
  return {
@@ -392,6 +425,8 @@ var CHROME_CONNECTOR_TOOL_ACTIONS = { ...CHROME_TOOL_ACTIONS };
392
425
 
393
426
  export {
394
427
  NOLO_CHROME_CONNECTOR_EXTENSION_ID,
428
+ NOLO_FIREFOX_CONNECTOR_EXTENSION_ID,
429
+ NOLO_CONNECTOR_EXTENSION_IDS,
395
430
  NOLO_CHROME_CONNECTOR_PROTOCOL_VERSION,
396
431
  createChromeConnectorClient,
397
432
  REQUIRED_CHROME_CONNECTOR_FEATURES,
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  selectCurrentServer
3
- } from "./chunk-AFUORTY4.js";
3
+ } from "./chunk-SONWNI3L.js";
4
4
  import {
5
5
  patch
6
- } from "./chunk-H62HCIUP.js";
6
+ } from "./chunk-HYZIYH2H.js";
7
7
  import {
8
8
  getIsDesktopApp
9
9
  } from "./chunk-QOKAKDPE.js";
@@ -14,7 +14,7 @@ function buildCliLocalRuntimeDbEnv(env = process.env) {
14
14
  };
15
15
  }
16
16
  async function getDefaultCliLocalRuntimeDb(options = {}) {
17
- const { getDefaultCliLocalRuntimeDb: getAuthorityBackedDb } = await import("./localRuntimeAuthority-6IR6BBXE.js");
17
+ const { getDefaultCliLocalRuntimeDb: getAuthorityBackedDb } = await import("./localRuntimeAuthority-5W6IJRAD.js");
18
18
  return getAuthorityBackedDb(options);
19
19
  }
20
20
 
@@ -0,0 +1,56 @@
1
+ import {
2
+ addLeadingZeros,
3
+ requiredArgs,
4
+ toDate
5
+ } from "./chunk-4LCOCOR5.js";
6
+
7
+ // node_modules/date-fns/esm/formatISO/index.js
8
+ function formatISO(date, options) {
9
+ var _options$format, _options$representati;
10
+ requiredArgs(1, arguments);
11
+ var originalDate = toDate(date);
12
+ if (isNaN(originalDate.getTime())) {
13
+ throw new RangeError("Invalid time value");
14
+ }
15
+ var format = String((_options$format = options === null || options === void 0 ? void 0 : options.format) !== null && _options$format !== void 0 ? _options$format : "extended");
16
+ var representation = String((_options$representati = options === null || options === void 0 ? void 0 : options.representation) !== null && _options$representati !== void 0 ? _options$representati : "complete");
17
+ if (format !== "extended" && format !== "basic") {
18
+ throw new RangeError("format must be 'extended' or 'basic'");
19
+ }
20
+ if (representation !== "date" && representation !== "time" && representation !== "complete") {
21
+ throw new RangeError("representation must be 'date', 'time', or 'complete'");
22
+ }
23
+ var result = "";
24
+ var tzOffset = "";
25
+ var dateDelimiter = format === "extended" ? "-" : "";
26
+ var timeDelimiter = format === "extended" ? ":" : "";
27
+ if (representation !== "time") {
28
+ var day = addLeadingZeros(originalDate.getDate(), 2);
29
+ var month = addLeadingZeros(originalDate.getMonth() + 1, 2);
30
+ var year = addLeadingZeros(originalDate.getFullYear(), 4);
31
+ result = "".concat(year).concat(dateDelimiter).concat(month).concat(dateDelimiter).concat(day);
32
+ }
33
+ if (representation !== "date") {
34
+ var offset = originalDate.getTimezoneOffset();
35
+ if (offset !== 0) {
36
+ var absoluteOffset = Math.abs(offset);
37
+ var hourOffset = addLeadingZeros(Math.floor(absoluteOffset / 60), 2);
38
+ var minuteOffset = addLeadingZeros(absoluteOffset % 60, 2);
39
+ var sign = offset < 0 ? "+" : "-";
40
+ tzOffset = "".concat(sign).concat(hourOffset, ":").concat(minuteOffset);
41
+ } else {
42
+ tzOffset = "Z";
43
+ }
44
+ var hour = addLeadingZeros(originalDate.getHours(), 2);
45
+ var minute = addLeadingZeros(originalDate.getMinutes(), 2);
46
+ var second = addLeadingZeros(originalDate.getSeconds(), 2);
47
+ var separator = result === "" ? "" : "T";
48
+ var time = [hour, minute, second].join(timeDelimiter);
49
+ result = "".concat(result).concat(separator).concat(time).concat(tzOffset);
50
+ }
51
+ return result;
52
+ }
53
+
54
+ export {
55
+ formatISO
56
+ };