chrome-relay 0.5.15 → 0.5.17

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/dist/cli.js CHANGED
@@ -234,6 +234,16 @@ function parseChromeHoverArgs(input) {
234
234
  const target = parseTargetArgs(obj, TOOL_NAMES.HOVER);
235
235
  const x = optNumber(obj, "x", TOOL_NAMES.HOVER);
236
236
  const y = optNumber(obj, "y", TOOL_NAMES.HOVER);
237
+ if (x !== void 0 !== (y !== void 0)) {
238
+ throw new RelayError({
239
+ code: "invalid_arguments",
240
+ message: "chrome_hover: pass BOTH x and y, or neither (selector mode).",
241
+ tool: TOOL_NAMES.HOVER,
242
+ phase: "parse_arguments",
243
+ details: { received: { x: obj.x, y: obj.y } },
244
+ retryable: false
245
+ });
246
+ }
237
247
  if (x !== void 0 && y !== void 0) {
238
248
  return { ...target, kind: "coords", x, y };
239
249
  }
@@ -818,6 +828,54 @@ var init_multi = __esm({
818
828
  });
819
829
 
820
830
  // ../protocol/dist/args/index.js
831
+ function parseToolArgs(name, input) {
832
+ switch (name) {
833
+ case "get_windows_and_tabs":
834
+ return parseGetWindowsAndTabsArgs(input);
835
+ case "chrome_navigate":
836
+ return parseChromeNavigateArgs(input);
837
+ case "chrome_switch_tab":
838
+ return parseChromeSwitchTabArgs(input);
839
+ case "chrome_close_tabs":
840
+ return parseChromeCloseTabsArgs(input);
841
+ case "chrome_screenshot":
842
+ return parseChromeScreenshotArgs(input);
843
+ case "chrome_read_page":
844
+ return parseChromeReadPageArgs(input);
845
+ case "chrome_click_element":
846
+ return parseChromeClickArgs(input);
847
+ case "chrome_fill_or_select":
848
+ return parseChromeFillArgs(input);
849
+ case "chrome_keyboard":
850
+ return parseChromeKeyboardArgs(input);
851
+ case "chrome_type":
852
+ return parseChromeTypeArgs(input);
853
+ case "chrome_evaluate":
854
+ return parseChromeEvaluateArgs(input);
855
+ case "chrome_viewport":
856
+ return parseChromeViewportArgs(input);
857
+ case "chrome_self_reload":
858
+ return parseChromeSelfReloadArgs(input);
859
+ case "chrome_console":
860
+ return parseChromeConsoleArgs(input);
861
+ case "chrome_workspace":
862
+ return parseChromeWorkspaceArgs(input);
863
+ case "chrome_group":
864
+ return parseChromeGroupArgs(input);
865
+ case "chrome_ax":
866
+ return parseChromeAxArgs(input);
867
+ case "chrome_click_ax":
868
+ return parseChromeClickAxArgs(input);
869
+ case "chrome_network":
870
+ return parseChromeNetworkArgs(input);
871
+ case "chrome_hover":
872
+ return parseChromeHoverArgs(input);
873
+ case "chrome_screencast":
874
+ return parseChromeScreencastArgs(input);
875
+ }
876
+ const exhaustive = name;
877
+ return exhaustive;
878
+ }
821
879
  var init_args = __esm({
822
880
  "../protocol/dist/args/index.js"() {
823
881
  "use strict";
@@ -827,11 +885,16 @@ var init_args = __esm({
827
885
  init_network();
828
886
  init_simple();
829
887
  init_multi();
888
+ init_navigate();
889
+ init_hover();
890
+ init_network();
891
+ init_simple();
892
+ init_multi();
830
893
  }
831
894
  });
832
895
 
833
896
  // ../protocol/dist/limits.js
834
- var DEFAULT_TOOL_CALL_TIMEOUT_MS, DEFAULT_PING_TIMEOUT_MS, DEFAULT_READY_TIMEOUT_MS, DEFAULT_EVAL_TIMEOUT_MS, DEFAULT_BODY_PREVIEW_BYTES, NETWORK_BUFFER_MAX_ENTRIES, NETWORK_BUFFER_MAX_BYTES, CONSOLE_BUFFER_MAX_ENTRIES, CONSOLE_BUFFER_MAX_BYTES;
897
+ var DEFAULT_TOOL_CALL_TIMEOUT_MS, DEFAULT_PING_TIMEOUT_MS, DEFAULT_READY_TIMEOUT_MS, DEFAULT_EVAL_TIMEOUT_MS, DEFAULT_BODY_PREVIEW_BYTES, NETWORK_BUFFER_MAX_ENTRIES, NETWORK_BUFFER_MAX_BYTES, CONSOLE_BUFFER_MAX_ENTRIES, CONSOLE_BUFFER_MAX_BYTES, CONSOLE_ENTRY_TEXT_MAX_CHARS, CONSOLE_ENTRY_STACK_MAX_CHARS;
835
898
  var init_limits = __esm({
836
899
  "../protocol/dist/limits.js"() {
837
900
  "use strict";
@@ -844,6 +907,8 @@ var init_limits = __esm({
844
907
  NETWORK_BUFFER_MAX_BYTES = 512 * 1024;
845
908
  CONSOLE_BUFFER_MAX_ENTRIES = 200;
846
909
  CONSOLE_BUFFER_MAX_BYTES = 256 * 1024;
910
+ CONSOLE_ENTRY_TEXT_MAX_CHARS = 1e3;
911
+ CONSOLE_ENTRY_STACK_MAX_CHARS = 1e3;
847
912
  }
848
913
  });
849
914
 
@@ -853,6 +918,8 @@ __export(dist_exports, {
853
918
  CHROME_WEB_STORE_EXTENSION_ID: () => CHROME_WEB_STORE_EXTENSION_ID,
854
919
  CONSOLE_BUFFER_MAX_BYTES: () => CONSOLE_BUFFER_MAX_BYTES,
855
920
  CONSOLE_BUFFER_MAX_ENTRIES: () => CONSOLE_BUFFER_MAX_ENTRIES,
921
+ CONSOLE_ENTRY_STACK_MAX_CHARS: () => CONSOLE_ENTRY_STACK_MAX_CHARS,
922
+ CONSOLE_ENTRY_TEXT_MAX_CHARS: () => CONSOLE_ENTRY_TEXT_MAX_CHARS,
856
923
  DEFAULT_BODY_PREVIEW_BYTES: () => DEFAULT_BODY_PREVIEW_BYTES,
857
924
  DEFAULT_EVAL_TIMEOUT_MS: () => DEFAULT_EVAL_TIMEOUT_MS,
858
925
  DEFAULT_EXTENSION_ID: () => DEFAULT_EXTENSION_ID,
@@ -897,6 +964,7 @@ __export(dist_exports, {
897
964
  parseChromeWorkspaceArgs: () => parseChromeWorkspaceArgs,
898
965
  parseGetWindowsAndTabsArgs: () => parseGetWindowsAndTabsArgs,
899
966
  parseTargetArgs: () => parseTargetArgs,
967
+ parseToolArgs: () => parseToolArgs,
900
968
  requireString: () => requireString,
901
969
  toBridgeError: () => toBridgeError
902
970
  });
@@ -1009,7 +1077,7 @@ var init_dist = __esm({
1009
1077
  import { Command } from "commander";
1010
1078
 
1011
1079
  // src/index.ts
1012
- var CHROME_RELAY_VERSION = true ? "0.5.15" : "0.0.0-dev";
1080
+ var CHROME_RELAY_VERSION = true ? "0.5.17" : "0.0.0-dev";
1013
1081
 
1014
1082
  // src/commands/shared.ts
1015
1083
  init_dist();
@@ -1117,7 +1185,8 @@ function emitTargetOverride(kind, from, to) {
1117
1185
  }
1118
1186
  async function runToolImpl(name, args) {
1119
1187
  try {
1120
- const result = await callTool(name, args);
1188
+ const parsedArgs = isToolName(name) ? parseToolArgs(name, args) : args;
1189
+ const result = await callTool(name, parsedArgs);
1121
1190
  if (typeof result === "string") {
1122
1191
  process.stdout.write(result + "\n");
1123
1192
  } else {
@@ -1136,6 +1205,9 @@ async function runToolImpl(name, args) {
1136
1205
  }
1137
1206
  }
1138
1207
  var runTool = runToolImpl;
1208
+ function isToolName(name) {
1209
+ return Object.values(TOOL_NAMES).includes(name);
1210
+ }
1139
1211
 
1140
1212
  // src/install/install.ts
1141
1213
  init_dist();
@@ -1248,6 +1320,21 @@ async function runDoctor() {
1248
1320
 
1249
1321
  // src/release-notes.ts
1250
1322
  var RELEASE_NOTES = {
1323
+ "0.5.17": [
1324
+ "Force-visible on attach (default-on). Modern SPAs (Cloudflare dashboard, Linear, Notion) gate their JS on `document.visibilityState` and stall on backgrounded tabs \u2014 chrome-relay's whole pitch is operate-without-stealing-focus, and that pitch silently broke whenever the page was visibility-gated. Fix runs three CDP calls on every attach: `Page.setWebLifecycleState({state:'active'})` to stop Chrome's rAF/timer throttling, plus a JS shim (installed via `Page.addScriptToEvaluateOnNewDocument` AND `Runtime.evaluate`) that overrides `document.visibilityState` / `document.hidden` so the page's own checks see 'visible.'",
1325
+ "Scoped to debugger-attached tabs only \u2014 other tabs the user has open stay normally throttled. Override clears when chrome-relay detaches. User's viewport never changes.",
1326
+ "Behavioral guidance: never call `chrome-relay switch` to make a backgrounded SPA render \u2014 it stalls because of visibility gating, not chrome-relay. The new attach behavior fixes it invisibly.",
1327
+ "Tests: +4 in apps/extension/test/force-visibility.test.ts. Total 426 (was 422)."
1328
+ ],
1329
+ "0.5.16": [
1330
+ "chrome_hover now rejects partial-coordinate intent (`--x 10` without `--y`, or vice versa) instead of silently falling through to selector-mode and losing the half-passed coordinate. CLI forwards even partial input so the protocol parser sees it.",
1331
+ "Network body errors are now structured RelayError instead of plain Error. `getBody` for a request that's not in the buffer \u2192 `target_not_found`; CDP failure (Chrome GC'd the body, permission denied, etc.) \u2192 `cdp_error` with the original message under `details.underlying`. Agents can branch on the code instead of pattern-matching the message.",
1332
+ "Console truncation cap (1000 chars) consolidated into limits.ts as CONSOLE_ENTRY_TEXT_MAX_CHARS / CONSOLE_ENTRY_STACK_MAX_CHARS. 4 hardcoded sites in console-buffer.ts now reference the constants.",
1333
+ "CLI help text interpolates limits from @chrome-relay/protocol. `chrome-relay network --help` and `chrome-relay console --help` no longer hardcode '200' or '256 KB' \u2014 they read from NETWORK_BUFFER_MAX_ENTRIES / CONSOLE_BUFFER_MAX_ENTRIES / CONSOLE_BUFFER_MAX_BYTES. Future bumps propagate without manual edits.",
1334
+ "Removed the PER_TAB_MAX / PER_TAB_MAX_BYTES alias indirection in network-buffer.ts and console-buffer.ts. The protocol constants have good names; aliasing them was leftover from before they existed.",
1335
+ "Softened the over-claiming parser comments in args/index.ts and shared.ts \u2014 they correctly describe the extension as the trust boundary that runs the parsers (CLI doesn't pre-validate today; that's a documented future PR).",
1336
+ "Tests: +1 hover partial-coord + 2 network getBody structured-error coverage. Total 417 (was 416)."
1337
+ ],
1251
1338
  "0.5.15": [
1252
1339
  "Tab-id coercion is now strict against blank strings. `--tabs '1,,3'` (or `[\"\"]`, or `[' ']`) used to silently become `[1, 0, 3]` because Number('') === 0 \u2014 and tab 0 is a real Chrome target. Now throws RelayError(invalid_arguments). Affects chrome_group create/add/remove, chrome_switch_tab, chrome_close_tabs.",
1253
1340
  "Numeric range validation added across the parsers. `optPositiveNumber` (> 0) and `optNonNegativeNumber` (>= 0) helpers reject out-of-range values at the parser boundary instead of letting nonsense through to CDP / handler logic. Affects: chrome_evaluate timeoutMs, chrome_screenshot maxEdge + padding, chrome_screencast quality/maxWidth/maxHeight/everyNthFrame, chrome_network body head.",
@@ -1598,10 +1685,8 @@ tooltip appearance, etc.) that a bare click would skip past too quickly.
1598
1685
  ).action(async (selector, opts) => {
1599
1686
  const extras = {};
1600
1687
  if (selector) extras.selector = selector;
1601
- if (typeof opts.x === "number" && typeof opts.y === "number") {
1602
- extras.x = opts.x;
1603
- extras.y = opts.y;
1604
- }
1688
+ if (typeof opts.x === "number") extras.x = opts.x;
1689
+ if (typeof opts.y === "number") extras.y = opts.y;
1605
1690
  await run("chrome_hover", withBase(opts, extras));
1606
1691
  });
1607
1692
  }
@@ -1857,6 +1942,8 @@ Notes:
1857
1942
  }
1858
1943
 
1859
1944
  // src/commands/sessions.ts
1945
+ init_dist();
1946
+ var CONSOLE_BUFFER_MAX_KB = Math.round(CONSOLE_BUFFER_MAX_BYTES / 1024);
1860
1947
  function netFilterOpts(cmd) {
1861
1948
  return cmd.option("--filter <substr>", "url substring filter").option("--status <bucket>", "ok | redirect | client_error | server_error | failed").option("--method <verb>", "exact method, e.g. POST").option("--limit <n>", "cap response length", (v) => Number(v));
1862
1949
  }
@@ -1984,13 +2071,13 @@ Notes:
1984
2071
  await run("chrome_group", { action: "remove", tabIds: String(opts.tabs) });
1985
2072
  });
1986
2073
  const network = tabOpt(netFilterOpts(
1987
- program.command("network").description("Capture HTTP request/response metadata. Ring buffer, last 200 per tab.")
2074
+ program.command("network").description(`Capture HTTP request/response metadata. Ring buffer, last ${NETWORK_BUFFER_MAX_ENTRIES} per tab.`)
1988
2075
  )).addHelpText(
1989
2076
  "after",
1990
2077
  `
1991
2078
 
1992
2079
  Examples:
1993
- chrome-relay network --tab 123 # last 200 requests
2080
+ chrome-relay network --tab 123 # last ${NETWORK_BUFFER_MAX_ENTRIES} requests
1994
2081
  chrome-relay network --tab 123 --filter api.example.com # url substring
1995
2082
  chrome-relay network --tab 123 --status failed
1996
2083
  chrome-relay network --tab 123 --method POST
@@ -2045,7 +2132,7 @@ Notes:
2045
2132
  await run("chrome_network", withBase(opts, { action: "clear" }));
2046
2133
  });
2047
2134
  tabOpt(
2048
- program.command("console").description("Read console.log/warn/error + page exceptions (ring buffer, last 200).").option("--level <levels>", "comma-separated: log,info,warn,error,debug,exception").option("--since <id>", "only return entries with id > since (live-tail-ish)", (v) => Number(v)).option("--limit <n>", "cap response length", (v) => Number(v)).option("--clear", "wipe the buffer (no read)").addHelpText(
2135
+ program.command("console").description(`Read console.log/warn/error + page exceptions (ring buffer, last ${CONSOLE_BUFFER_MAX_ENTRIES}).`).option("--level <levels>", "comma-separated: log,info,warn,error,debug,exception").option("--since <id>", "only return entries with id > since (live-tail-ish)", (v) => Number(v)).option("--limit <n>", "cap response length", (v) => Number(v)).option("--clear", "wipe the buffer (no read)").addHelpText(
2049
2136
  "after",
2050
2137
  `
2051
2138
 
@@ -2056,7 +2143,7 @@ Examples:
2056
2143
  chrome-relay console --tab 123 --clear
2057
2144
 
2058
2145
  Notes:
2059
- Ring buffer holds the last 200 entries per tab (or 256 KB, whichever first).
2146
+ Ring buffer holds the last ${CONSOLE_BUFFER_MAX_ENTRIES} entries per tab (or ${CONSOLE_BUFFER_MAX_KB} KB, whichever first).
2060
2147
  Wipes on tab close. First call on a tab subscribes; subsequent calls are
2061
2148
  instant in-memory reads.
2062
2149
  `
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/index.ts
2
- var CHROME_RELAY_VERSION = true ? "0.5.15" : "0.0.0-dev";
2
+ var CHROME_RELAY_VERSION = true ? "0.5.17" : "0.0.0-dev";
3
3
  export {
4
4
  CHROME_RELAY_VERSION
5
5
  };
@@ -56,7 +56,7 @@ function toBridgeError(unknownErr, fallbackTool) {
56
56
  }
57
57
 
58
58
  // src/index.ts
59
- var CHROME_RELAY_VERSION = true ? "0.5.15" : "0.0.0-dev";
59
+ var CHROME_RELAY_VERSION = true ? "0.5.17" : "0.0.0-dev";
60
60
 
61
61
  // src/release-notes.ts
62
62
  function compareSemver(a, b) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chrome-relay",
3
- "version": "0.5.15",
3
+ "version": "0.5.17",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",