chrome-relay 0.5.12 → 0.5.13

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
@@ -75,8 +75,17 @@ function parseChromeNavigateArgs(input) {
75
75
  };
76
76
  if (typeof obj.tabId === "string" && obj.tabId) {
77
77
  const n = Number(obj.tabId);
78
- if (Number.isFinite(n))
79
- out.tabId = n;
78
+ if (!Number.isFinite(n)) {
79
+ throw new RelayError({
80
+ code: "invalid_arguments",
81
+ message: `chrome_navigate: invalid tabId ${JSON.stringify(obj.tabId)}. Expected a number.`,
82
+ tool: TOOL_NAMES.NAVIGATE,
83
+ phase: "parse_arguments",
84
+ details: { field: "tabId", received: obj.tabId },
85
+ retryable: false
86
+ });
87
+ }
88
+ out.tabId = n;
80
89
  } else {
81
90
  const n = optNumber(obj, "tabId");
82
91
  if (n !== void 0)
@@ -226,6 +235,475 @@ var init_network = __esm({
226
235
  }
227
236
  });
228
237
 
238
+ // ../protocol/dist/args/simple.js
239
+ function parseGetWindowsAndTabsArgs(_input) {
240
+ return {};
241
+ }
242
+ function parseChromeSelfReloadArgs(_input) {
243
+ return {};
244
+ }
245
+ function parseChromeReadPageArgs(input) {
246
+ const obj = asObject(input, TOOL_NAMES.READ_PAGE);
247
+ const out = { ...parseTargetArgs(obj) };
248
+ const io = optBool(obj, "interactiveOnly");
249
+ if (io !== void 0)
250
+ out.interactiveOnly = io;
251
+ return out;
252
+ }
253
+ function parseChromeClickArgs(input) {
254
+ const obj = asObject(input, TOOL_NAMES.CLICK);
255
+ return {
256
+ selector: requireString(obj, "selector", TOOL_NAMES.CLICK),
257
+ ...parseTargetArgs(obj)
258
+ };
259
+ }
260
+ function parseChromeFillArgs(input) {
261
+ const obj = asObject(input, TOOL_NAMES.FILL);
262
+ if (typeof obj.value !== "string") {
263
+ throw new RelayError({
264
+ code: "invalid_arguments",
265
+ message: `${TOOL_NAMES.FILL}: \`value\` is required and must be a string (empty string allowed).`,
266
+ tool: TOOL_NAMES.FILL,
267
+ phase: "parse_arguments",
268
+ details: { field: "value", received: obj.value },
269
+ retryable: false
270
+ });
271
+ }
272
+ return {
273
+ selector: requireString(obj, "selector", TOOL_NAMES.FILL),
274
+ value: obj.value,
275
+ ...parseTargetArgs(obj)
276
+ };
277
+ }
278
+ function parseChromeKeyboardArgs(input) {
279
+ const obj = asObject(input, TOOL_NAMES.KEYBOARD);
280
+ return {
281
+ keys: requireString(obj, "keys", TOOL_NAMES.KEYBOARD),
282
+ ...parseTargetArgs(obj)
283
+ };
284
+ }
285
+ function parseChromeTypeArgs(input) {
286
+ const obj = asObject(input, TOOL_NAMES.TYPE);
287
+ const out = {
288
+ text: requireString(obj, "text", TOOL_NAMES.TYPE),
289
+ ...parseTargetArgs(obj)
290
+ };
291
+ const selector = optString(obj, "selector");
292
+ if (selector)
293
+ out.selector = selector;
294
+ return out;
295
+ }
296
+ function parseChromeEvaluateArgs(input) {
297
+ const obj = asObject(input, TOOL_NAMES.EVALUATE);
298
+ const out = {
299
+ code: requireString(obj, "code", TOOL_NAMES.EVALUATE),
300
+ ...parseTargetArgs(obj)
301
+ };
302
+ const t = optNumber(obj, "timeoutMs");
303
+ if (t !== void 0)
304
+ out.timeoutMs = t;
305
+ return out;
306
+ }
307
+ function parseChromeSwitchTabArgs(input) {
308
+ const obj = asObject(input, TOOL_NAMES.SWITCH_TAB);
309
+ const tabId = Number(obj.tabId);
310
+ if (!Number.isFinite(tabId)) {
311
+ throw new RelayError({
312
+ code: "invalid_arguments",
313
+ message: `${TOOL_NAMES.SWITCH_TAB} requires a numeric tabId.`,
314
+ tool: TOOL_NAMES.SWITCH_TAB,
315
+ phase: "parse_arguments",
316
+ details: { received: obj.tabId },
317
+ retryable: false
318
+ });
319
+ }
320
+ return { tabId };
321
+ }
322
+ function parseChromeCloseTabsArgs(input) {
323
+ const obj = asObject(input, TOOL_NAMES.CLOSE_TABS);
324
+ if (!Array.isArray(obj.tabIds)) {
325
+ throw new RelayError({
326
+ code: "invalid_arguments",
327
+ message: `${TOOL_NAMES.CLOSE_TABS} requires a numeric tabIds array.`,
328
+ tool: TOOL_NAMES.CLOSE_TABS,
329
+ phase: "parse_arguments",
330
+ details: { field: "tabIds", received: obj.tabIds },
331
+ retryable: false
332
+ });
333
+ }
334
+ const tabIds = obj.tabIds.map((v) => Number(v));
335
+ if (tabIds.length === 0 || tabIds.some((n) => !Number.isFinite(n))) {
336
+ throw new RelayError({
337
+ code: "invalid_arguments",
338
+ message: `${TOOL_NAMES.CLOSE_TABS} requires a non-empty array of numeric tab IDs.`,
339
+ tool: TOOL_NAMES.CLOSE_TABS,
340
+ phase: "parse_arguments",
341
+ details: { received: obj.tabIds },
342
+ retryable: false
343
+ });
344
+ }
345
+ return { tabIds };
346
+ }
347
+ function parseChromeAxArgs(input) {
348
+ const obj = asObject(input, TOOL_NAMES.AX);
349
+ const out = { ...parseTargetArgs(obj) };
350
+ const io = optBool(obj, "interactiveOnly");
351
+ if (io !== void 0)
352
+ out.interactiveOnly = io;
353
+ const root = optString(obj, "rootRole");
354
+ if (root)
355
+ out.rootRole = root;
356
+ const is = optBool(obj, "includeSubframes");
357
+ if (is !== void 0)
358
+ out.includeSubframes = is;
359
+ return out;
360
+ }
361
+ function parseChromeClickAxArgs(input) {
362
+ const obj = asObject(input, TOOL_NAMES.CLICK_AX);
363
+ const node = Number(obj.node ?? obj.id);
364
+ if (!Number.isFinite(node) || node <= 0) {
365
+ throw new RelayError({
366
+ code: "invalid_arguments",
367
+ message: `${TOOL_NAMES.CLICK_AX} requires \`node\` (a positive backendDOMNodeId from chrome_ax).`,
368
+ tool: TOOL_NAMES.CLICK_AX,
369
+ phase: "parse_arguments",
370
+ details: { received: obj.node ?? obj.id },
371
+ retryable: false
372
+ });
373
+ }
374
+ return { node, ...parseTargetArgs(obj) };
375
+ }
376
+ function parseChromeScreenshotArgs(input) {
377
+ const obj = asObject(input, TOOL_NAMES.SCREENSHOT);
378
+ const out = { ...parseTargetArgs(obj) };
379
+ const fp = optBool(obj, "fullPage");
380
+ if (fp !== void 0)
381
+ out.fullPage = fp;
382
+ const bbox = optString(obj, "bbox");
383
+ if (bbox)
384
+ out.bbox = bbox;
385
+ const sel = optString(obj, "selector");
386
+ if (sel)
387
+ out.selector = sel;
388
+ const pad = optNumber(obj, "padding");
389
+ if (pad !== void 0)
390
+ out.padding = pad;
391
+ const me = optNumber(obj, "maxEdge");
392
+ if (me !== void 0 && me > 0)
393
+ out.maxEdge = me;
394
+ return out;
395
+ }
396
+ var init_simple = __esm({
397
+ "../protocol/dist/args/simple.js"() {
398
+ "use strict";
399
+ init_dist();
400
+ init_shared();
401
+ }
402
+ });
403
+
404
+ // ../protocol/dist/args/multi.js
405
+ function invalidAction(tool, received, expected) {
406
+ throw new RelayError({
407
+ code: "invalid_arguments",
408
+ message: `${tool}: unknown action ${JSON.stringify(received)}. Expected ${expected.join(" | ")}.`,
409
+ tool,
410
+ phase: "parse_action",
411
+ details: { received, validChoices: expected },
412
+ retryable: false
413
+ });
414
+ }
415
+ function parseChromeViewportArgs(input) {
416
+ const obj = asObject(input, TOOL_NAMES.VIEWPORT);
417
+ const action = typeof obj.action === "string" ? obj.action : "set";
418
+ if (!VALID_VIEWPORT_ACTIONS.includes(action)) {
419
+ invalidAction(TOOL_NAMES.VIEWPORT, action, VALID_VIEWPORT_ACTIONS);
420
+ }
421
+ const target = parseTargetArgs(obj);
422
+ if (action === "list")
423
+ return { action: "list" };
424
+ if (action === "clear")
425
+ return { ...target, action: "clear" };
426
+ if (action === "preset") {
427
+ return { ...target, action: "preset", name: requireString(obj, "name", TOOL_NAMES.VIEWPORT) };
428
+ }
429
+ const width = Number(obj.width);
430
+ const height = Number(obj.height);
431
+ if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {
432
+ throw new RelayError({
433
+ code: "invalid_arguments",
434
+ message: `${TOOL_NAMES.VIEWPORT} set requires positive numeric width and height.`,
435
+ tool: TOOL_NAMES.VIEWPORT,
436
+ phase: "parse_dimensions",
437
+ details: { received: { width: obj.width, height: obj.height } },
438
+ retryable: false
439
+ });
440
+ }
441
+ const out = {
442
+ ...target,
443
+ action: "set",
444
+ width,
445
+ height
446
+ };
447
+ const dpr = optNumber(obj, "dpr");
448
+ if (dpr !== void 0)
449
+ out.dpr = dpr;
450
+ const mobile = optBool(obj, "mobile");
451
+ if (mobile !== void 0)
452
+ out.mobile = mobile;
453
+ const hasTouch = optBool(obj, "hasTouch");
454
+ if (hasTouch !== void 0)
455
+ out.hasTouch = hasTouch;
456
+ const userAgent = optString(obj, "userAgent");
457
+ if (userAgent)
458
+ out.userAgent = userAgent;
459
+ return out;
460
+ }
461
+ function parseLevels(input) {
462
+ if (input === void 0 || input === null)
463
+ return void 0;
464
+ const valid = new Set(VALID_CONSOLE_LEVELS);
465
+ const verify = (s) => {
466
+ if (typeof s !== "string" || !valid.has(s)) {
467
+ throw new RelayError({
468
+ code: "invalid_arguments",
469
+ message: `${TOOL_NAMES.CONSOLE}: invalid level ${JSON.stringify(s)}. Expected one of: ${VALID_CONSOLE_LEVELS.join(", ")}.`,
470
+ tool: TOOL_NAMES.CONSOLE,
471
+ phase: "parse_levels",
472
+ details: { received: s, validChoices: VALID_CONSOLE_LEVELS },
473
+ retryable: false
474
+ });
475
+ }
476
+ return s;
477
+ };
478
+ if (typeof input === "string")
479
+ return input.split(",").map((s) => verify(s.trim()));
480
+ if (Array.isArray(input))
481
+ return input.map(verify);
482
+ throw new RelayError({
483
+ code: "invalid_arguments",
484
+ message: `${TOOL_NAMES.CONSOLE}: invalid levels argument ${JSON.stringify(input)}. Expected a comma-separated string or an array of strings.`,
485
+ tool: TOOL_NAMES.CONSOLE,
486
+ phase: "parse_levels",
487
+ details: { received: input },
488
+ retryable: false
489
+ });
490
+ }
491
+ function parseChromeConsoleArgs(input) {
492
+ const obj = asObject(input, TOOL_NAMES.CONSOLE);
493
+ const target = parseTargetArgs(obj);
494
+ const action = typeof obj.action === "string" ? obj.action : "read";
495
+ if (!VALID_CONSOLE_ACTIONS.includes(action)) {
496
+ invalidAction(TOOL_NAMES.CONSOLE, action, VALID_CONSOLE_ACTIONS);
497
+ }
498
+ if (action === "clear")
499
+ return { ...target, action: "clear" };
500
+ const out = { ...target, action: "read" };
501
+ const levels = parseLevels(obj.levels);
502
+ if (levels)
503
+ out.levels = levels;
504
+ const since = optNumber(obj, "since");
505
+ if (since !== void 0)
506
+ out.since = since;
507
+ const limit = optNumber(obj, "limit");
508
+ if (limit !== void 0)
509
+ out.limit = limit;
510
+ return out;
511
+ }
512
+ function parseChromeWorkspaceArgs(input) {
513
+ const obj = asObject(input, TOOL_NAMES.WORKSPACE);
514
+ const action = typeof obj.action === "string" ? obj.action : "list";
515
+ if (!VALID_WORKSPACE_ACTIONS.includes(action)) {
516
+ invalidAction(TOOL_NAMES.WORKSPACE, action, VALID_WORKSPACE_ACTIONS);
517
+ }
518
+ if (action === "list")
519
+ return { action: "list" };
520
+ if (action === "close")
521
+ return { action: "close", name: requireString(obj, "name", TOOL_NAMES.WORKSPACE) };
522
+ const out = {
523
+ action: "create",
524
+ name: requireString(obj, "name", TOOL_NAMES.WORKSPACE)
525
+ };
526
+ const url = optString(obj, "url");
527
+ if (url)
528
+ out.url = url;
529
+ const label = optString(obj, "label");
530
+ if (label)
531
+ out.label = label;
532
+ return out;
533
+ }
534
+ function parseTabIds(raw) {
535
+ const reject = (bad) => {
536
+ throw new RelayError({
537
+ code: "invalid_arguments",
538
+ message: `${TOOL_NAMES.GROUP}: invalid tabId ${JSON.stringify(bad)}. Expected a number or a comma-separated list of numbers.`,
539
+ tool: TOOL_NAMES.GROUP,
540
+ phase: "parse_tab_ids",
541
+ details: { received: bad },
542
+ retryable: false
543
+ });
544
+ };
545
+ const coerce = (v) => {
546
+ const n = Number(typeof v === "string" ? v.trim() : v);
547
+ if (!Number.isFinite(n))
548
+ reject(v);
549
+ return n;
550
+ };
551
+ if (Array.isArray(raw))
552
+ return raw.map(coerce);
553
+ if (typeof raw === "string")
554
+ return raw.split(",").map(coerce);
555
+ if (typeof raw === "number")
556
+ return [raw];
557
+ return [];
558
+ }
559
+ function parseColor(raw) {
560
+ if (raw === void 0 || raw === null)
561
+ return void 0;
562
+ if (typeof raw !== "string") {
563
+ throw new RelayError({
564
+ code: "invalid_arguments",
565
+ message: `${TOOL_NAMES.GROUP}: invalid color ${JSON.stringify(raw)}. Expected one of: ${VALID_GROUP_COLORS.join(", ")}.`,
566
+ tool: TOOL_NAMES.GROUP,
567
+ phase: "parse_color",
568
+ details: { received: raw, validChoices: VALID_GROUP_COLORS },
569
+ retryable: false
570
+ });
571
+ }
572
+ const c = raw.toLowerCase();
573
+ if (!VALID_GROUP_COLORS.includes(c)) {
574
+ throw new RelayError({
575
+ code: "invalid_arguments",
576
+ message: `${TOOL_NAMES.GROUP}: invalid color "${raw}". Expected one of: ${VALID_GROUP_COLORS.join(", ")}.`,
577
+ tool: TOOL_NAMES.GROUP,
578
+ phase: "parse_color",
579
+ details: { received: raw, validChoices: VALID_GROUP_COLORS },
580
+ retryable: false
581
+ });
582
+ }
583
+ return c;
584
+ }
585
+ function parseChromeGroupArgs(input) {
586
+ const obj = asObject(input, TOOL_NAMES.GROUP);
587
+ const action = typeof obj.action === "string" ? obj.action : "list";
588
+ if (!VALID_GROUP_ACTIONS.includes(action)) {
589
+ invalidAction(TOOL_NAMES.GROUP, action, VALID_GROUP_ACTIONS);
590
+ }
591
+ if (action === "list")
592
+ return { action: "list" };
593
+ if (action === "close")
594
+ return { action: "close", name: requireString(obj, "name", TOOL_NAMES.GROUP) };
595
+ if (action === "remove") {
596
+ const tabIds2 = parseTabIds(obj.tabIds);
597
+ if (tabIds2.length === 0) {
598
+ throw new RelayError({
599
+ code: "invalid_arguments",
600
+ message: `${TOOL_NAMES.GROUP} remove requires tabIds.`,
601
+ tool: TOOL_NAMES.GROUP,
602
+ phase: "parse_arguments",
603
+ details: { field: "tabIds" },
604
+ retryable: false
605
+ });
606
+ }
607
+ return { action: "remove", tabIds: tabIds2 };
608
+ }
609
+ if (action === "add") {
610
+ const tabIds2 = parseTabIds(obj.tabIds);
611
+ if (tabIds2.length === 0) {
612
+ throw new RelayError({
613
+ code: "invalid_arguments",
614
+ message: `${TOOL_NAMES.GROUP} add requires tabIds.`,
615
+ tool: TOOL_NAMES.GROUP,
616
+ phase: "parse_arguments",
617
+ details: { field: "tabIds" },
618
+ retryable: false
619
+ });
620
+ }
621
+ return { action: "add", name: requireString(obj, "name", TOOL_NAMES.GROUP), tabIds: tabIds2 };
622
+ }
623
+ const tabIds = parseTabIds(obj.tabIds);
624
+ if (tabIds.length === 0) {
625
+ throw new RelayError({
626
+ code: "invalid_arguments",
627
+ message: `${TOOL_NAMES.GROUP} create requires at least one tabId.`,
628
+ tool: TOOL_NAMES.GROUP,
629
+ phase: "parse_arguments",
630
+ details: { field: "tabIds" },
631
+ retryable: false
632
+ });
633
+ }
634
+ const out = {
635
+ action: "create",
636
+ name: requireString(obj, "name", TOOL_NAMES.GROUP),
637
+ tabIds
638
+ };
639
+ const color = parseColor(obj.color);
640
+ if (color)
641
+ out.color = color;
642
+ const collapsed = optBool(obj, "collapsed");
643
+ if (collapsed !== void 0)
644
+ out.collapsed = collapsed;
645
+ const windowId = optNumber(obj, "windowId");
646
+ if (windowId !== void 0)
647
+ out.windowId = windowId;
648
+ return out;
649
+ }
650
+ function parseChromeScreencastArgs(input) {
651
+ const obj = asObject(input, TOOL_NAMES.SCREENCAST);
652
+ const target = parseTargetArgs(obj);
653
+ const action = typeof obj.action === "string" ? obj.action : "start";
654
+ if (!VALID_SCREENCAST_ACTIONS.includes(action)) {
655
+ invalidAction(TOOL_NAMES.SCREENCAST, action, VALID_SCREENCAST_ACTIONS);
656
+ }
657
+ if (action === "stop")
658
+ return { ...target, action: "stop" };
659
+ const out = {
660
+ ...target,
661
+ action: "start"
662
+ };
663
+ if (obj.format !== void 0 && obj.format !== null) {
664
+ if (obj.format !== "jpeg" && obj.format !== "png") {
665
+ throw new RelayError({
666
+ code: "invalid_arguments",
667
+ message: `${TOOL_NAMES.SCREENCAST}: invalid format ${JSON.stringify(obj.format)}. Expected "jpeg" or "png".`,
668
+ tool: TOOL_NAMES.SCREENCAST,
669
+ phase: "parse_format",
670
+ details: { received: obj.format, validChoices: VALID_SCREENCAST_FORMATS },
671
+ retryable: false
672
+ });
673
+ }
674
+ out.format = obj.format;
675
+ }
676
+ const q = optNumber(obj, "quality");
677
+ if (q !== void 0)
678
+ out.quality = q;
679
+ const mw = optNumber(obj, "maxWidth");
680
+ if (mw !== void 0)
681
+ out.maxWidth = mw;
682
+ const mh = optNumber(obj, "maxHeight");
683
+ if (mh !== void 0)
684
+ out.maxHeight = mh;
685
+ const en = optNumber(obj, "everyNthFrame");
686
+ if (en !== void 0)
687
+ out.everyNthFrame = en;
688
+ return out;
689
+ }
690
+ var VALID_VIEWPORT_ACTIONS, VALID_CONSOLE_ACTIONS, VALID_CONSOLE_LEVELS, VALID_WORKSPACE_ACTIONS, VALID_GROUP_ACTIONS, VALID_GROUP_COLORS, VALID_SCREENCAST_ACTIONS, VALID_SCREENCAST_FORMATS;
691
+ var init_multi = __esm({
692
+ "../protocol/dist/args/multi.js"() {
693
+ "use strict";
694
+ init_dist();
695
+ init_shared();
696
+ VALID_VIEWPORT_ACTIONS = ["set", "preset", "clear", "list"];
697
+ VALID_CONSOLE_ACTIONS = ["read", "clear"];
698
+ VALID_CONSOLE_LEVELS = ["log", "info", "warn", "error", "debug", "exception"];
699
+ VALID_WORKSPACE_ACTIONS = ["create", "list", "close"];
700
+ VALID_GROUP_ACTIONS = ["create", "list", "close", "add", "remove"];
701
+ VALID_GROUP_COLORS = ["grey", "blue", "red", "yellow", "green", "pink", "purple", "cyan", "orange"];
702
+ VALID_SCREENCAST_ACTIONS = ["start", "stop"];
703
+ VALID_SCREENCAST_FORMATS = ["jpeg", "png"];
704
+ }
705
+ });
706
+
229
707
  // ../protocol/dist/args/index.js
230
708
  var init_args = __esm({
231
709
  "../protocol/dist/args/index.js"() {
@@ -234,6 +712,8 @@ var init_args = __esm({
234
712
  init_navigate();
235
713
  init_hover();
236
714
  init_network();
715
+ init_simple();
716
+ init_multi();
237
717
  }
238
718
  });
239
719
 
@@ -253,9 +733,27 @@ __export(dist_exports, {
253
733
  optBool: () => optBool,
254
734
  optNumber: () => optNumber,
255
735
  optString: () => optString,
736
+ parseChromeAxArgs: () => parseChromeAxArgs,
737
+ parseChromeClickArgs: () => parseChromeClickArgs,
738
+ parseChromeClickAxArgs: () => parseChromeClickAxArgs,
739
+ parseChromeCloseTabsArgs: () => parseChromeCloseTabsArgs,
740
+ parseChromeConsoleArgs: () => parseChromeConsoleArgs,
741
+ parseChromeEvaluateArgs: () => parseChromeEvaluateArgs,
742
+ parseChromeFillArgs: () => parseChromeFillArgs,
743
+ parseChromeGroupArgs: () => parseChromeGroupArgs,
256
744
  parseChromeHoverArgs: () => parseChromeHoverArgs,
745
+ parseChromeKeyboardArgs: () => parseChromeKeyboardArgs,
257
746
  parseChromeNavigateArgs: () => parseChromeNavigateArgs,
258
747
  parseChromeNetworkArgs: () => parseChromeNetworkArgs,
748
+ parseChromeReadPageArgs: () => parseChromeReadPageArgs,
749
+ parseChromeScreencastArgs: () => parseChromeScreencastArgs,
750
+ parseChromeScreenshotArgs: () => parseChromeScreenshotArgs,
751
+ parseChromeSelfReloadArgs: () => parseChromeSelfReloadArgs,
752
+ parseChromeSwitchTabArgs: () => parseChromeSwitchTabArgs,
753
+ parseChromeTypeArgs: () => parseChromeTypeArgs,
754
+ parseChromeViewportArgs: () => parseChromeViewportArgs,
755
+ parseChromeWorkspaceArgs: () => parseChromeWorkspaceArgs,
756
+ parseGetWindowsAndTabsArgs: () => parseGetWindowsAndTabsArgs,
259
757
  parseTargetArgs: () => parseTargetArgs,
260
758
  requireString: () => requireString,
261
759
  toBridgeError: () => toBridgeError
@@ -368,7 +866,7 @@ var init_dist = __esm({
368
866
  import { Command } from "commander";
369
867
 
370
868
  // src/index.ts
371
- var CHROME_RELAY_VERSION = true ? "0.5.12" : "0.0.0-dev";
869
+ var CHROME_RELAY_VERSION = true ? "0.5.13" : "0.0.0-dev";
372
870
 
373
871
  // src/commands/shared.ts
374
872
  init_dist();
@@ -602,6 +1100,13 @@ async function runDoctor() {
602
1100
 
603
1101
  // src/release-notes.ts
604
1102
  var RELEASE_NOTES = {
1103
+ "0.5.13": [
1104
+ "Protocol arg-parser coverage complete (code-quality-hardening Risk 1 \u2014 finished). Every one of the 22 tools now has an executable parser in @chrome-relay/protocol that returns a typed args object with `code:'invalid_arguments'` errors on malformed input.",
1105
+ "New parsers in this release: parseChrome{ReadPage,Click,Fill,Keyboard,Type,Evaluate,SwitchTab,CloseTabs,Ax,ClickAx,Screenshot,Viewport,Console,Workspace,Group,Screencast}Args, plus parseGetWindowsAndTabsArgs and parseChromeSelfReloadArgs.",
1106
+ "All extension handlers now consume their parser at the top of the handler body \u2014 silent shape drift between CLI and extension is structurally impossible.",
1107
+ "Multi-action tools (viewport, console, network, workspace, group, screencast) return discriminated unions so the handler branches with TypeScript narrowing instead of `typeof args.action === 'string'` boilerplate.",
1108
+ "36 new tests in packages/protocol/test/args-all.test.ts. Total now 433 (was 397)."
1109
+ ],
605
1110
  "0.5.12": [
606
1111
  "Protocol-owned tool arg parsers (code-quality-hardening Risk 1). New @chrome-relay/protocol exports: `parseChromeNavigateArgs`, `parseChromeHoverArgs`, `parseChromeNetworkArgs`. Each is the single source of truth for what its tool accepts \u2014 CLI and extension consume the same parser so silent shape drift can't happen.",
607
1112
  "Pattern established with 3 representative tools (navigate, hover, network \u2014 the doc-followup explicitly named these). Remaining 19 tools are mechanical follow-up (~20 lines + tests each). Each parser throws `RelayError(invalid_arguments)` with field/received/validChoices in details.",
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/index.ts
2
- var CHROME_RELAY_VERSION = true ? "0.5.12" : "0.0.0-dev";
2
+ var CHROME_RELAY_VERSION = true ? "0.5.13" : "0.0.0-dev";
3
3
  export {
4
4
  CHROME_RELAY_VERSION
5
5
  };
@@ -48,7 +48,7 @@ function toBridgeError(unknownErr, fallbackTool) {
48
48
  }
49
49
 
50
50
  // src/index.ts
51
- var CHROME_RELAY_VERSION = true ? "0.5.12" : "0.0.0-dev";
51
+ var CHROME_RELAY_VERSION = true ? "0.5.13" : "0.0.0-dev";
52
52
 
53
53
  // src/release-notes.ts
54
54
  function compareSemver(a, b) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chrome-relay",
3
- "version": "0.5.12",
3
+ "version": "0.5.13",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",