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 +98 -11
- package/dist/index.js +1 -1
- package/dist/native-host.js +1 -1
- package/package.json +1 -1
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.
|
|
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
|
|
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"
|
|
1602
|
-
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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
package/dist/native-host.js
CHANGED
|
@@ -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.
|
|
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) {
|