@actions-json/bridge 0.1.121 → 0.1.124

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.
@@ -82,6 +82,98 @@
82
82
  "additionalProperties": false
83
83
  }
84
84
  },
85
+ {
86
+ "name": "browser.navigate",
87
+ "support": "supported",
88
+ "reason": null,
89
+ "capability_class": "privileged",
90
+ "portable": false,
91
+ "summary": "Navigate a claimed tab to a URL (or reload it) and reconnect its runtime.",
92
+ "input_schema": {
93
+ "type": "object",
94
+ "properties": {
95
+ "url": {
96
+ "type": "string",
97
+ "description": "Destination URL. Required unless reload is true."
98
+ },
99
+ "reload": {
100
+ "type": "boolean",
101
+ "description": "Reload the current tab instead of navigating."
102
+ },
103
+ "tab_id": {
104
+ "type": "integer",
105
+ "description": "Claimed tab id. Omit for the active claimed tab."
106
+ }
107
+ },
108
+ "additionalProperties": false
109
+ }
110
+ },
111
+ {
112
+ "name": "browser.open_tab",
113
+ "support": "supported",
114
+ "reason": null,
115
+ "capability_class": "privileged",
116
+ "portable": false,
117
+ "summary": "Open a new browser tab, auto-claim it, and return a ready-to-drive runtime.",
118
+ "input_schema": {
119
+ "type": "object",
120
+ "properties": {
121
+ "url": {
122
+ "type": "string",
123
+ "description": "URL to open. Defaults to a blank page."
124
+ },
125
+ "active": {
126
+ "type": "boolean",
127
+ "description": "Foreground the new tab. Default true."
128
+ }
129
+ },
130
+ "additionalProperties": false
131
+ }
132
+ },
133
+ {
134
+ "name": "browser.close_tab",
135
+ "support": "supported",
136
+ "reason": null,
137
+ "capability_class": "privileged",
138
+ "portable": false,
139
+ "summary": "Close a claimed tab (defaults to active); refuses to close the last remaining claimed tab.",
140
+ "input_schema": {
141
+ "type": "object",
142
+ "properties": {
143
+ "tab_id": {
144
+ "type": "integer",
145
+ "description": "Claimed tab id. Omit for the active claimed tab."
146
+ }
147
+ },
148
+ "additionalProperties": false
149
+ }
150
+ },
151
+ {
152
+ "name": "browser.dismiss_dialog",
153
+ "support": "supported",
154
+ "reason": null,
155
+ "capability_class": "privileged",
156
+ "portable": false,
157
+ "summary": "Dismiss a native JS dialog (alert/confirm/prompt/beforeunload) blocking a claimed tab via CDP; recovers a wedged tab.",
158
+ "input_schema": {
159
+ "type": "object",
160
+ "properties": {
161
+ "tab_id": {
162
+ "type": "integer",
163
+ "description": "Claimed Chrome tab id whose dialog to dismiss. Omit for the active claimed tab."
164
+ },
165
+ "accept": {
166
+ "type": "boolean",
167
+ "description": "Accept (true, default) or cancel (false) the dialog. For a beforeunload 'Leave site?' confirm, accept=true leaves the page, accept=false stays."
168
+ },
169
+ "prompt_text": {
170
+ "type": "string",
171
+ "description": "Text to enter for a prompt() dialog. Ignored for other dialog types."
172
+ }
173
+ },
174
+ "additionalProperties": false
175
+ }
176
+ },
85
177
  {
86
178
  "name": "runtime.agent.start",
87
179
  "support": "supported",
@@ -130,6 +222,14 @@
130
222
  "text": {
131
223
  "type": "string",
132
224
  "description": "User-style instruction to send into the active hosted Realtime session for testing."
225
+ },
226
+ "mode": {
227
+ "type": "string",
228
+ "enum": [
229
+ "queue",
230
+ "interrupt"
231
+ ],
232
+ "description": "How to handle an in-flight response: 'queue' (default) waits for it to finish then sends; 'interrupt' cancels the active response and sends immediately."
133
233
  }
134
234
  },
135
235
  "additionalProperties": false
@@ -190,6 +290,13 @@
190
290
  "middle",
191
291
  "right"
192
292
  ]
293
+ },
294
+ "modifiers": {
295
+ "type": "array",
296
+ "items": {
297
+ "type": "string"
298
+ },
299
+ "description": "Optional modifier keys held during the click (shift, alt/option, control/ctrl, meta/cmd/command). E.g. [\"Shift\"] for shift-click range selection."
193
300
  }
194
301
  },
195
302
  "additionalProperties": false
@@ -386,7 +493,7 @@
386
493
  "reason": null,
387
494
  "capability_class": "mixed",
388
495
  "portable": false,
389
- "summary": "Dispatch a page-level keyboard key or modifier chord to the focused element.",
496
+ "summary": "Dispatch a page-level keyboard key or modifier chord to the focused element. Pass trusted:true to dispatch a real (debugger) key event that canvas editors honor; default is synthetic.",
390
497
  "input_schema": {
391
498
  "type": "object",
392
499
  "required": [
@@ -412,6 +519,106 @@
412
519
  "Option"
413
520
  ]
414
521
  }
522
+ },
523
+ "trusted": {
524
+ "type": "boolean",
525
+ "description": "When true, dispatch a TRUSTED key event via the browser debugger (reaches canvas editors like Google Slides/Docs/Sheets, where synthetic keys are ignored — e.g. Control+A to select all). Defaults to false (synthetic, portable). Run both and compare to confirm whether trusted is actually required."
526
+ },
527
+ "repeat": {
528
+ "type": "integer",
529
+ "description": "Press the chord this many times inside ONE trusted debugger session (1-1000, default 1). The fast path for positional caret walks (e.g. ArrowRight x400 in milliseconds-per-key instead of ~0.5s/key)."
530
+ }
531
+ },
532
+ "additionalProperties": false
533
+ }
534
+ },
535
+ {
536
+ "name": "keyboard.press_gated",
537
+ "support": "supported",
538
+ "reason": null,
539
+ "capability_class": "debug",
540
+ "portable": false,
541
+ "summary": "Accessibility-gated key-repeat: press a key/chord and gate each repeat on the a11y layer's return (stop=count|until|path, positive/negative polarity), halting loud on a path mismatch. Reliable word/menu navigation where open-loop bursts coalesce. Always trusted (CDP).",
542
+ "input_schema": {
543
+ "type": "object",
544
+ "required": [
545
+ "key",
546
+ "stop"
547
+ ],
548
+ "properties": {
549
+ "key": {
550
+ "type": "string",
551
+ "description": "Key name, or a compact chord such as Control+ArrowRight, ArrowDown, Shift+End."
552
+ },
553
+ "modifiers": {
554
+ "type": "array",
555
+ "items": {
556
+ "type": "string",
557
+ "enum": [
558
+ "Alt",
559
+ "Control",
560
+ "Ctrl",
561
+ "Meta",
562
+ "Cmd",
563
+ "Command",
564
+ "Shift",
565
+ "Option"
566
+ ]
567
+ },
568
+ "description": "Modifiers held for every press (or fold them into `key` as a chord)."
569
+ },
570
+ "stop": {
571
+ "type": "string",
572
+ "enum": [
573
+ "count",
574
+ "until",
575
+ "path"
576
+ ],
577
+ "description": "count = press N times (no gate); until = press until `expect` matches; path = advance through the ordered `expect` regex list."
578
+ },
579
+ "count": {
580
+ "type": "integer",
581
+ "description": "Number of presses when stop=count (0-2000)."
582
+ },
583
+ "expect": {
584
+ "description": "Regex (stop=until: one) or ordered list of regexes (stop=path: one per expected a11y return). Each is matched against the a11y layer's value after that press.",
585
+ "oneOf": [
586
+ {
587
+ "type": "string"
588
+ },
589
+ {
590
+ "type": "array",
591
+ "items": {
592
+ "type": "string"
593
+ }
594
+ }
595
+ ]
596
+ },
597
+ "polarity": {
598
+ "description": "match (default) advances on a regex match; no_match advances on a non-match. May be a single value or a per-step array (path).",
599
+ "oneOf": [
600
+ {
601
+ "type": "string",
602
+ "enum": [
603
+ "match",
604
+ "no_match"
605
+ ]
606
+ },
607
+ {
608
+ "type": "array",
609
+ "items": {
610
+ "type": "string",
611
+ "enum": [
612
+ "match",
613
+ "no_match"
614
+ ]
615
+ }
616
+ }
617
+ ]
618
+ },
619
+ "max_presses": {
620
+ "type": "integer",
621
+ "description": "Safety cap on total presses (default 200, max 2000). On hitting it the primitive returns a clean partial (steps_done + position), not an error."
415
622
  }
416
623
  },
417
624
  "additionalProperties": false
@@ -552,11 +759,11 @@
552
759
  },
553
760
  {
554
761
  "name": "clipboard.write",
555
- "support": "unsupported",
556
- "reason": "transfer_buffer_preferred",
557
- "capability_class": "privileged",
558
- "portable": false,
559
- "summary": "Write text to the extension-approved clipboard or transfer surface when permission is available.",
762
+ "support": "supported",
763
+ "reason": null,
764
+ "capability_class": "portable",
765
+ "portable": true,
766
+ "summary": "Write text to the system clipboard (pure clipboard I/O).",
560
767
  "input_schema": {
561
768
  "type": "object",
562
769
  "required": [
@@ -572,11 +779,11 @@
572
779
  },
573
780
  {
574
781
  "name": "clipboard.read",
575
- "support": "unsupported",
576
- "reason": "transfer_buffer_preferred",
577
- "capability_class": "privileged",
578
- "portable": false,
579
- "summary": "Read text from the extension-approved clipboard or transfer surface when permission is available.",
782
+ "support": "supported",
783
+ "reason": null,
784
+ "capability_class": "portable",
785
+ "portable": true,
786
+ "summary": "Read the current system clipboard text (pure clipboard I/O).",
580
787
  "input_schema": {
581
788
  "type": "object",
582
789
  "properties": {},
@@ -744,6 +951,26 @@
744
951
  "additionalProperties": false
745
952
  }
746
953
  },
954
+ {
955
+ "name": "dom.focus",
956
+ "support": "supported",
957
+ "reason": null,
958
+ "capability_class": "portable",
959
+ "portable": true,
960
+ "summary": "Move keyboard focus to the element matched by a locator (calls element.focus()). Use to re-seat focus on an intended target after a transient focus-owning surface (an overlay search/find field, a command palette, a popover input) closes without returning focus. Returns { focused, active_is_target, selection_preserved, selection_before_length, selection_after_length } so callers can tell whether focusing kept or collapsed an existing text selection.",
961
+ "input_schema": {
962
+ "type": "object",
963
+ "required": [
964
+ "locator"
965
+ ],
966
+ "properties": {
967
+ "locator": {
968
+ "type": "object"
969
+ }
970
+ },
971
+ "additionalProperties": false
972
+ }
973
+ },
747
974
  {
748
975
  "name": "locator.wait_for",
749
976
  "support": "supported",
@@ -1366,68 +1593,415 @@
1366
1593
  "component": "ActionsJsonTaskQueue"
1367
1594
  }
1368
1595
  }
1369
- }
1370
- ]
1371
- },
1372
- "prompt": {
1373
- "title": "Browser overlay runtime",
1374
- "instructions": "Use overlay.open to present an agent-created HTML document as a temporary draggable, resizable, minimizable overlay on the current page. For reusable overlays, prefer a storage-backed template reference plus a JSON data reference so shared template code can stay separate from private user data. The template receives the parsed data through a script tag marked data-actions-json-overlay-data. Prefer supplying launchers that integrate visible reopen buttons into the relevant original DOM context. Launchers are conditional registrations: they may be declared before their target DOM is visible, then installed when URL and DOM predicates match. Do not use this action for credential capture, deceptive UI, or persistent page modification.",
1375
- "source": {
1376
- "files": [
1377
- "src/content.js"
1378
- ],
1379
- "symbols": [
1380
- "actionsJsonOverlay.openHtml"
1381
- ],
1382
- "selectors": [
1383
- "#__actions_json_overlay_runtime_host"
1384
- ]
1385
- }
1386
- },
1387
- "tools": [
1388
- {
1389
- "name": "overlay.open",
1390
- "description": "Render an inline HTML document or a storage-backed template/data overlay in a draggable, resizable, and minimizable popup on the authorized browser tab. Use template plus data when the visual template should be reusable and the user data should remain in a separate private JSON file. Registered launchers can coexist and reattach independently when SPA navigation brings their matching context into view.",
1391
- "input_schema": {
1392
- "type": "object",
1393
- "properties": {
1394
- "html": {
1395
- "type": "string",
1396
- "description": "Inline HTML body or document markup to render inside the overlay. Use either html or template, not both."
1397
- },
1398
- "template": {
1399
- "type": "object",
1400
- "description": "Storage reference for a reusable overlay template. The runtime resolves it from the uploaded actions.json.storage bundle.",
1401
- "required": [
1402
- "scope",
1403
- "path"
1404
- ],
1405
- "properties": {
1406
- "scope": {
1407
- "type": "string",
1408
- "description": "Storage scope, such as public, private, or shared/name."
1409
- },
1410
- "path": {
1411
- "type": "string",
1412
- "description": "Path inside the scope, such as sites/example.com/overlays/report/template.html."
1413
- }
1596
+ },
1597
+ {
1598
+ "name": "text.select",
1599
+ "support": "supported",
1600
+ "reason": null,
1601
+ "capability_class": "portable",
1602
+ "portable": true,
1603
+ "summary": "Select a range on the page (a target's or the focused element's editable contents).",
1604
+ "input_schema": {
1605
+ "type": "object",
1606
+ "properties": {
1607
+ "target": {
1608
+ "type": "object",
1609
+ "description": "Optional locator. Omit to use the focused element."
1414
1610
  },
1415
- "additionalProperties": false
1611
+ "mode": {
1612
+ "type": "string",
1613
+ "enum": [
1614
+ "all"
1615
+ ],
1616
+ "default": "all"
1617
+ }
1416
1618
  },
1417
- "data": {
1418
- "type": "object",
1419
- "description": "Optional storage reference for JSON data injected into a template as [data-actions-json-overlay-data]. Commonly private data with a public template.",
1420
- "required": [
1421
- "scope",
1422
- "path"
1423
- ],
1424
- "properties": {
1425
- "scope": {
1426
- "type": "string"
1427
- },
1428
- "path": {
1429
- "type": "string"
1430
- }
1619
+ "additionalProperties": false
1620
+ }
1621
+ },
1622
+ {
1623
+ "name": "clipboard.copy",
1624
+ "support": "supported",
1625
+ "reason": null,
1626
+ "capability_class": "portable",
1627
+ "portable": true,
1628
+ "summary": "Move the current page selection into the system clipboard (page -> clipboard).",
1629
+ "input_schema": {
1630
+ "type": "object",
1631
+ "properties": {
1632
+ "target": {
1633
+ "type": "object",
1634
+ "description": "Optional locator whose selection to copy. Omit to use the current selection / focused element."
1635
+ }
1636
+ },
1637
+ "additionalProperties": false
1638
+ }
1639
+ },
1640
+ {
1641
+ "name": "clipboard.paste",
1642
+ "support": "supported",
1643
+ "reason": null,
1644
+ "capability_class": "portable",
1645
+ "portable": true,
1646
+ "summary": "Paste text (given, or the system clipboard) into a DOM element via a synthetic paste event; reaches iframe-hosted editors. Supply html for structured content (e.g. a <table> that Google Sheets expands into a range).",
1647
+ "input_schema": {
1648
+ "type": "object",
1649
+ "properties": {
1650
+ "text": {
1651
+ "type": "string",
1652
+ "description": "Optional. Plain-text flavor to paste. Omit to paste the current system clipboard."
1653
+ },
1654
+ "html": {
1655
+ "type": "string",
1656
+ "description": "Optional. Exact text/html clipboard flavor. Use for tables or rich runs (e.g. an HTML <table> so Google Sheets expands a real multi-column range). Omitted: html is derived from text."
1657
+ },
1658
+ "target": {
1659
+ "type": "object",
1660
+ "description": "Optional locator to paste into. Omit to use the focused element. An iframe target falls back to the focused inner element."
1661
+ }
1662
+ },
1663
+ "additionalProperties": false
1664
+ }
1665
+ },
1666
+ {
1667
+ "name": "page.fetch",
1668
+ "support": "supported",
1669
+ "reason": null,
1670
+ "capability_class": "portable",
1671
+ "portable": true,
1672
+ "summary": "Authenticated same-origin GET of a URL from the page context; returns the raw response body (read-only).",
1673
+ "input_schema": {
1674
+ "type": "object",
1675
+ "required": [
1676
+ "url"
1677
+ ],
1678
+ "properties": {
1679
+ "url": {
1680
+ "type": "string",
1681
+ "description": "Same-origin URL to GET (authenticated with the page session). Cross-origin or non-GET is rejected."
1682
+ }
1683
+ },
1684
+ "additionalProperties": false
1685
+ }
1686
+ },
1687
+ {
1688
+ "name": "marker.query",
1689
+ "support": "supported",
1690
+ "reason": null,
1691
+ "capability_class": "portable",
1692
+ "portable": true,
1693
+ "summary": "Resolve a registered marker to its live location by running its recipe.",
1694
+ "input_schema": {
1695
+ "type": "object",
1696
+ "required": [
1697
+ "id"
1698
+ ],
1699
+ "properties": {
1700
+ "id": {
1701
+ "type": "string",
1702
+ "description": "The marker id, as emitted in the projection output's markers[]."
1703
+ }
1704
+ }
1705
+ }
1706
+ },
1707
+ {
1708
+ "name": "cursor.move_to",
1709
+ "support": "supported",
1710
+ "reason": null,
1711
+ "capability_class": "portable",
1712
+ "portable": true,
1713
+ "summary": "Move the text cursor to a cursor-type marker's location by running its recipe.",
1714
+ "input_schema": {
1715
+ "type": "object",
1716
+ "required": [
1717
+ "marker"
1718
+ ],
1719
+ "properties": {
1720
+ "marker": {
1721
+ "type": "string",
1722
+ "description": "The cursor-marker id from the projection output's markers[]."
1723
+ }
1724
+ }
1725
+ }
1726
+ },
1727
+ {
1728
+ "name": "pointer.move_to",
1729
+ "support": "supported",
1730
+ "reason": null,
1731
+ "capability_class": "portable",
1732
+ "portable": true,
1733
+ "summary": "Move the mouse pointer to a pointer-type marker's live location.",
1734
+ "input_schema": {
1735
+ "type": "object",
1736
+ "required": [
1737
+ "marker"
1738
+ ],
1739
+ "properties": {
1740
+ "marker": {
1741
+ "type": "string",
1742
+ "description": "The pointer-marker id from the projection output's markers[]."
1743
+ }
1744
+ }
1745
+ }
1746
+ },
1747
+ {
1748
+ "name": "text.type",
1749
+ "support": "supported",
1750
+ "reason": null,
1751
+ "capability_class": "portable",
1752
+ "portable": true,
1753
+ "summary": "Type a string at the focused element (trusted:true overtypes a selection in canvas editors).",
1754
+ "input_schema": {
1755
+ "type": "object",
1756
+ "required": [
1757
+ "text"
1758
+ ],
1759
+ "properties": {
1760
+ "text": {
1761
+ "type": "string",
1762
+ "description": "Text to type at the focused element."
1763
+ },
1764
+ "trusted": {
1765
+ "type": "boolean",
1766
+ "description": "When true, types via CDP Input.insertText (trusted) — REPLACES the active selection and reaches canvas editors (Docs/Slides/Sheets). Default false = synthetic insert at the focused editable."
1767
+ },
1768
+ "mode": {
1769
+ "type": "string",
1770
+ "description": "Synthetic path only: 'insert' (default) or 'replace'."
1771
+ },
1772
+ "select_back_chars": {
1773
+ "type": "number",
1774
+ "description": "Trusted path only: before typing, extend the selection backward this many characters (Shift+Left) so the type overtypes exactly that span — one atomic CDP call. Use the character length of the phrase to replace."
1775
+ }
1776
+ }
1777
+ }
1778
+ },
1779
+ {
1780
+ "name": "a11y.tree",
1781
+ "support": "supported",
1782
+ "reason": null,
1783
+ "capability_class": "privileged",
1784
+ "portable": false,
1785
+ "summary": "Accessibility-tree outline via the CDP Accessibility domain (background/debugger authority).",
1786
+ "input_schema": {
1787
+ "type": "object",
1788
+ "properties": {
1789
+ "tab_id": {
1790
+ "type": "integer",
1791
+ "description": "Target tab. Defaults to the routed/active tab."
1792
+ },
1793
+ "max_depth": {
1794
+ "type": "integer"
1795
+ },
1796
+ "max_nodes": {
1797
+ "type": "integer"
1798
+ }
1799
+ },
1800
+ "additionalProperties": false
1801
+ },
1802
+ "x_actions": {
1803
+ "handler": "background"
1804
+ }
1805
+ },
1806
+ {
1807
+ "name": "a11y.query",
1808
+ "support": "supported",
1809
+ "reason": null,
1810
+ "capability_class": "privileged",
1811
+ "portable": false,
1812
+ "summary": "Identity-based element lookup (role + accessible name) with clickable center.",
1813
+ "input_schema": {
1814
+ "type": "object",
1815
+ "properties": {
1816
+ "tab_id": {
1817
+ "type": "integer",
1818
+ "description": "Target tab. Defaults to the routed/active tab."
1819
+ },
1820
+ "role": {
1821
+ "type": "string"
1822
+ },
1823
+ "name": {
1824
+ "type": "string"
1825
+ },
1826
+ "name_contains": {
1827
+ "type": "string"
1828
+ }
1829
+ },
1830
+ "additionalProperties": false
1831
+ },
1832
+ "x_actions": {
1833
+ "handler": "background"
1834
+ }
1835
+ },
1836
+ {
1837
+ "name": "a11y.events.read",
1838
+ "support": "supported",
1839
+ "reason": null,
1840
+ "capability_class": "bridge",
1841
+ "portable": false,
1842
+ "summary": "Cursored read of the buffered announcement history (bridge-side store).",
1843
+ "input_schema": {
1844
+ "type": "object",
1845
+ "properties": {
1846
+ "since": {
1847
+ "type": "integer"
1848
+ },
1849
+ "limit": {
1850
+ "type": "integer"
1851
+ }
1852
+ },
1853
+ "additionalProperties": false
1854
+ },
1855
+ "x_actions": {
1856
+ "handler": "bridge"
1857
+ }
1858
+ },
1859
+ {
1860
+ "name": "a11y.announcements_subscribe",
1861
+ "support": "supported",
1862
+ "reason": null,
1863
+ "capability_class": "bridge",
1864
+ "portable": false,
1865
+ "summary": "Per-(agent, tab) announcement delivery configuration (inject/buffer/off).",
1866
+ "input_schema": {
1867
+ "type": "object",
1868
+ "properties": {
1869
+ "subscriber": {
1870
+ "type": "string"
1871
+ },
1872
+ "tab_id": {
1873
+ "type": "integer"
1874
+ },
1875
+ "assertive": {
1876
+ "type": "string"
1877
+ },
1878
+ "polite": {
1879
+ "type": "string"
1880
+ }
1881
+ },
1882
+ "additionalProperties": false
1883
+ },
1884
+ "x_actions": {
1885
+ "handler": "bridge"
1886
+ }
1887
+ },
1888
+ {
1889
+ "name": "a11y.announcements_configure",
1890
+ "support": "supported",
1891
+ "reason": null,
1892
+ "capability_class": "bridge",
1893
+ "portable": false,
1894
+ "summary": "Alias of a11y.announcements_subscribe.",
1895
+ "input_schema": {
1896
+ "type": "object",
1897
+ "properties": {
1898
+ "subscriber": {
1899
+ "type": "string"
1900
+ },
1901
+ "tab_id": {
1902
+ "type": "integer"
1903
+ },
1904
+ "assertive": {
1905
+ "type": "string"
1906
+ },
1907
+ "polite": {
1908
+ "type": "string"
1909
+ }
1910
+ },
1911
+ "additionalProperties": false
1912
+ },
1913
+ "x_actions": {
1914
+ "handler": "bridge"
1915
+ }
1916
+ },
1917
+ {
1918
+ "name": "a11y.watch",
1919
+ "support": "supported",
1920
+ "reason": null,
1921
+ "capability_class": "privileged",
1922
+ "portable": false,
1923
+ "summary": "Inject the live-region observer (all frames) + enable screen-reader mode so a tab narrates itself.",
1924
+ "input_schema": {
1925
+ "type": "object",
1926
+ "properties": {
1927
+ "tab_id": {
1928
+ "type": "integer",
1929
+ "description": "Target tab. Defaults to the routed/active tab."
1930
+ },
1931
+ "enable_screen_reader": {
1932
+ "type": "boolean"
1933
+ },
1934
+ "screen_reader_chord": {
1935
+ "type": "string"
1936
+ }
1937
+ },
1938
+ "additionalProperties": false
1939
+ },
1940
+ "x_actions": {
1941
+ "handler": "background"
1942
+ }
1943
+ }
1944
+ ]
1945
+ },
1946
+ "prompt": {
1947
+ "title": "Browser overlay runtime",
1948
+ "instructions": "Use overlay.open to present an agent-created HTML document as a temporary draggable, resizable, minimizable overlay on the current page. For reusable overlays, prefer a storage-backed template reference plus a JSON data reference so shared template code can stay separate from private user data. The template receives the parsed data through a script tag marked data-actions-json-overlay-data. Prefer supplying launchers that integrate visible reopen buttons into the relevant original DOM context. Launchers are conditional registrations: they may be declared before their target DOM is visible, then installed when URL and DOM predicates match. Do not use this action for credential capture, deceptive UI, or persistent page modification.",
1949
+ "source": {
1950
+ "files": [
1951
+ "src/content.js"
1952
+ ],
1953
+ "symbols": [
1954
+ "actionsJsonOverlay.openHtml"
1955
+ ],
1956
+ "selectors": [
1957
+ "#__actions_json_overlay_runtime_host"
1958
+ ]
1959
+ }
1960
+ },
1961
+ "tools": [
1962
+ {
1963
+ "name": "overlay.open",
1964
+ "description": "Render an inline HTML document or a storage-backed template/data overlay in a draggable, resizable, and minimizable popup on the authorized browser tab. Use template plus data when the visual template should be reusable and the user data should remain in a separate private JSON file. Registered launchers can coexist and reattach independently when SPA navigation brings their matching context into view.",
1965
+ "input_schema": {
1966
+ "type": "object",
1967
+ "properties": {
1968
+ "html": {
1969
+ "type": "string",
1970
+ "description": "Inline HTML body or document markup to render inside the overlay. Use either html or template, not both."
1971
+ },
1972
+ "template": {
1973
+ "type": "object",
1974
+ "description": "Storage reference for a reusable overlay template. The runtime resolves it from the uploaded actions.json.storage bundle.",
1975
+ "required": [
1976
+ "scope",
1977
+ "path"
1978
+ ],
1979
+ "properties": {
1980
+ "scope": {
1981
+ "type": "string",
1982
+ "description": "Storage scope, such as public, private, or shared/name."
1983
+ },
1984
+ "path": {
1985
+ "type": "string",
1986
+ "description": "Path inside the scope, such as sites/example.com/overlays/report/template.html."
1987
+ }
1988
+ },
1989
+ "additionalProperties": false
1990
+ },
1991
+ "data": {
1992
+ "type": "object",
1993
+ "description": "Optional storage reference for JSON data injected into a template as [data-actions-json-overlay-data]. Commonly private data with a public template.",
1994
+ "required": [
1995
+ "scope",
1996
+ "path"
1997
+ ],
1998
+ "properties": {
1999
+ "scope": {
2000
+ "type": "string"
2001
+ },
2002
+ "path": {
2003
+ "type": "string"
2004
+ }
1431
2005
  },
1432
2006
  "additionalProperties": false
1433
2007
  },
@@ -1999,6 +2573,28 @@
1999
2573
  }
2000
2574
  }
2001
2575
  },
2576
+ {
2577
+ "name": "runtime.agent.memory_clear",
2578
+ "description": "Clear the hosted agent's persistent local memory (ACTIONS_JSON_AGENT_MEMORY_V1). A new hosted session rehydrates the last stored events as context; clear the memory first when a genuinely fresh, uncontaminated session is required (for example before an acceptance test). Returns the number of events cleared.",
2579
+ "input_schema": {
2580
+ "type": "object",
2581
+ "properties": {},
2582
+ "additionalProperties": false
2583
+ },
2584
+ "x_actions": {
2585
+ "direction": "agent_to_html",
2586
+ "handler": "actionsJsonOverlay.runtimeAgentMemoryClear",
2587
+ "scope": "active_surface",
2588
+ "source": {
2589
+ "files": [
2590
+ "src/content.js",
2591
+ "src/background.js",
2592
+ "src/agent/session-memory-store.mjs"
2593
+ ],
2594
+ "component": "HostedRealtimeSession"
2595
+ }
2596
+ }
2597
+ },
2002
2598
  {
2003
2599
  "name": "runtime.agent.user_message",
2004
2600
  "description": "Inject a developer test prompt into the active hosted GPT Realtime session. The model response is requested as text only and shown in the browser as a toast instead of being spoken.",
@@ -2008,6 +2604,14 @@
2008
2604
  "text": {
2009
2605
  "type": "string",
2010
2606
  "description": "User-style instruction to send into the active hosted Realtime session for testing."
2607
+ },
2608
+ "mode": {
2609
+ "type": "string",
2610
+ "enum": [
2611
+ "queue",
2612
+ "interrupt"
2613
+ ],
2614
+ "description": "How to handle an in-flight response: 'queue' (default) waits for it to finish then sends; 'interrupt' cancels the active response and sends immediately."
2011
2615
  }
2012
2616
  },
2013
2617
  "required": [
@@ -2056,6 +2660,82 @@
2056
2660
  "additionalProperties": false
2057
2661
  }
2058
2662
  },
2663
+ {
2664
+ "name": "browser.navigate",
2665
+ "description": "Navigate a claimed tab to a URL (or reload it), then reconnect its runtime so it stays drivable after the load. Defaults to the active claimed tab; pass tab_id to target another. Use this to recover a tab that is wedged, stuck on a stale/soft-navigated view, or to move it to a known URL. Refuses chrome/about/file/edge URLs. Verify the result with page.info or a projection afterward.",
2666
+ "input_schema": {
2667
+ "type": "object",
2668
+ "properties": {
2669
+ "url": {
2670
+ "type": "string",
2671
+ "description": "Destination URL. Required unless reload is true."
2672
+ },
2673
+ "reload": {
2674
+ "type": "boolean",
2675
+ "description": "Reload the current tab instead of navigating to url. The clean escape from a wedged editor or a half-mounted SPA view."
2676
+ },
2677
+ "tab_id": {
2678
+ "type": "integer",
2679
+ "description": "Claimed Chrome tab id to navigate. Omit to use the active claimed tab."
2680
+ }
2681
+ },
2682
+ "additionalProperties": false
2683
+ }
2684
+ },
2685
+ {
2686
+ "name": "browser.open_tab",
2687
+ "description": "Open a new browser tab (optionally at a URL), auto-claim and authorize it, and return a ready-to-drive runtime. Use this to get unstuck without losing the tab you were on, or to work on a fresh page. Returns tab_id and runtime_id; route subsequent calls to that runtime. Refuses chrome/about/file/edge URLs.",
2688
+ "input_schema": {
2689
+ "type": "object",
2690
+ "properties": {
2691
+ "url": {
2692
+ "type": "string",
2693
+ "description": "URL to open in the new tab. Defaults to a blank Google page if omitted."
2694
+ },
2695
+ "active": {
2696
+ "type": "boolean",
2697
+ "description": "Whether to foreground the new tab. Defaults to true."
2698
+ }
2699
+ },
2700
+ "additionalProperties": false
2701
+ }
2702
+ },
2703
+ {
2704
+ "name": "browser.close_tab",
2705
+ "description": "Close a claimed tab you are done with (defaults to the active tab; pass tab_id to target another). Use to reap stale/duplicate tabs that cause ambiguous routing. Refuses to close the last remaining claimed tab. Removes the tab's runtime from the bridge.",
2706
+ "input_schema": {
2707
+ "type": "object",
2708
+ "properties": {
2709
+ "tab_id": {
2710
+ "type": "integer",
2711
+ "description": "Claimed Chrome tab id to close. Omit to close the active claimed tab."
2712
+ }
2713
+ },
2714
+ "additionalProperties": false
2715
+ }
2716
+ },
2717
+ {
2718
+ "name": "browser.dismiss_dialog",
2719
+ "description": "Dismiss a native JavaScript dialog (alert/confirm/prompt/beforeunload) blocking a claimed tab, via the CDP Page domain. A native modal freezes the page main thread so no content-script primitive can clear it; this works below the page event loop and recovers a tab wedged after navigating away from an editor with unsaved changes. Defaults to the active claimed tab and accept=true.",
2720
+ "input_schema": {
2721
+ "type": "object",
2722
+ "properties": {
2723
+ "tab_id": {
2724
+ "type": "integer",
2725
+ "description": "Claimed Chrome tab id whose dialog to dismiss. Omit for the active claimed tab."
2726
+ },
2727
+ "accept": {
2728
+ "type": "boolean",
2729
+ "description": "Accept (true, default) or cancel (false) the dialog. For a beforeunload 'Leave site?' confirm, accept=true leaves the page, accept=false stays."
2730
+ },
2731
+ "prompt_text": {
2732
+ "type": "string",
2733
+ "description": "Text to enter for a prompt() dialog. Ignored for other dialog types."
2734
+ }
2735
+ },
2736
+ "additionalProperties": false
2737
+ }
2738
+ },
2059
2739
  {
2060
2740
  "name": "browser.screenshot",
2061
2741
  "description": "Capture the currently visible browser tab as an image so the agent can inspect the page state after authorization.",
@@ -2271,6 +2951,13 @@
2271
2951
  "minimum": 0,
2272
2952
  "maximum": 20,
2273
2953
  "default": 4
2954
+ },
2955
+ "frame": {
2956
+ "type": [
2957
+ "string",
2958
+ "array"
2959
+ ],
2960
+ "description": "Optional CSS selector (or array of selectors, outer->inner) for iframe(s) to target inside. Same-origin only; a cross-origin frame errors frame_cross_origin."
2274
2961
  }
2275
2962
  },
2276
2963
  "additionalProperties": false
@@ -2451,6 +3138,13 @@
2451
3138
  "type": "integer",
2452
3139
  "minimum": 12,
2453
3140
  "maximum": 500
3141
+ },
3142
+ "frame": {
3143
+ "type": [
3144
+ "string",
3145
+ "array"
3146
+ ],
3147
+ "description": "Optional CSS selector (or array of selectors, outer->inner) for iframe(s) to target inside. Same-origin only; a cross-origin frame errors frame_cross_origin."
2454
3148
  }
2455
3149
  },
2456
3150
  "additionalProperties": false
@@ -2541,7 +3235,16 @@
2541
3235
  "type": "object",
2542
3236
  "properties": {
2543
3237
  "locator": {
2544
- "type": "object"
3238
+ "type": "object",
3239
+ "properties": {
3240
+ "frame": {
3241
+ "type": [
3242
+ "string",
3243
+ "array"
3244
+ ],
3245
+ "description": "Optional CSS selector (or array of selectors, outer->inner) for iframe(s) to target inside. Same-origin only; a cross-origin frame errors frame_cross_origin."
3246
+ }
3247
+ }
2545
3248
  }
2546
3249
  },
2547
3250
  "required": [
@@ -2657,6 +3360,13 @@
2657
3360
  "middle",
2658
3361
  "right"
2659
3362
  ]
3363
+ },
3364
+ "modifiers": {
3365
+ "type": "array",
3366
+ "items": {
3367
+ "type": "string"
3368
+ },
3369
+ "description": "Optional modifier keys held during the click (shift, alt/option, control/ctrl, meta/cmd/command). E.g. [\"Shift\"] for shift-click range selection."
2660
3370
  }
2661
3371
  },
2662
3372
  "required": [
@@ -2887,7 +3597,7 @@
2887
3597
  },
2888
3598
  {
2889
3599
  "name": "keyboard.press",
2890
- "description": "Dispatch a keyboard key or modifier chord to the focused page element. Use this for Enter/Escape/Tab flows after focusing a visible target.",
3600
+ "description": "Dispatch a keyboard key or modifier chord to the focused page element. Use this for Enter/Escape/Tab flows after focusing a visible target Pass trusted:true for a real (debugger-dispatched) key that reaches canvas editors like Google Slides (e.g. Control+A); default false is the synthetic, portable path — run both and compare to see if trusted is needed.",
2891
3601
  "input_schema": {
2892
3602
  "type": "object",
2893
3603
  "properties": {
@@ -2910,25 +3620,133 @@
2910
3620
  "Option"
2911
3621
  ]
2912
3622
  }
3623
+ },
3624
+ "trusted": {
3625
+ "type": "boolean",
3626
+ "description": "When true, dispatch a TRUSTED key event via the browser debugger (reaches canvas editors like Google Slides/Docs/Sheets, where synthetic keys are ignored — e.g. Control+A to select all). Defaults to false (synthetic, portable). Run both and compare to confirm whether trusted is actually required."
3627
+ }
3628
+ },
3629
+ "required": [
3630
+ "key"
3631
+ ],
3632
+ "additionalProperties": false
3633
+ },
3634
+ "x_actions": {
3635
+ "direction": "agent_to_html",
3636
+ "handler": "actionsJsonOverlay.keyboardPress",
3637
+ "scope": "active_surface",
3638
+ "source": {
3639
+ "files": [
3640
+ "src/content.js"
3641
+ ],
3642
+ "symbols": [
3643
+ "actionsJsonOverlay.keyboardPress"
3644
+ ],
3645
+ "component": "ActionsJsonOverlay"
3646
+ }
3647
+ }
3648
+ },
3649
+ {
3650
+ "name": "keyboard.press_gated",
3651
+ "description": "ACCESSIBILITY-GATED key-repeat: press a key/chord repeatedly, gating each repeat on what the accessibility layer reports after the previous press. RELIABLE where an open-loop burst coalesces (e.g. Ctrl+ArrowRight word-jumps on Google Docs). Surface-agnostic — also drives menu/listbox/field navigation. stop=count presses N times; stop=until presses until the a11y return matches the single `expect` regex; stop=path advances through the ordered `expect` regex list one press per step and HALTS LOUD on a mismatch (steps_done/expected/actual returned) so the caller re-reads instead of drifting. polarity=match advances on a regex match, no_match advances on a non-match. Always trusted (CDP).",
3652
+ "input_schema": {
3653
+ "type": "object",
3654
+ "required": [
3655
+ "key",
3656
+ "stop"
3657
+ ],
3658
+ "properties": {
3659
+ "key": {
3660
+ "type": "string",
3661
+ "description": "Key name, or a compact chord such as Control+ArrowRight, ArrowDown, Shift+End."
3662
+ },
3663
+ "modifiers": {
3664
+ "type": "array",
3665
+ "items": {
3666
+ "type": "string",
3667
+ "enum": [
3668
+ "Alt",
3669
+ "Control",
3670
+ "Ctrl",
3671
+ "Meta",
3672
+ "Cmd",
3673
+ "Command",
3674
+ "Shift",
3675
+ "Option"
3676
+ ]
3677
+ },
3678
+ "description": "Modifiers held for every press (or fold them into `key` as a chord)."
3679
+ },
3680
+ "stop": {
3681
+ "type": "string",
3682
+ "enum": [
3683
+ "count",
3684
+ "until",
3685
+ "path"
3686
+ ],
3687
+ "description": "count = press N times (no gate); until = press until `expect` matches; path = advance through the ordered `expect` regex list."
3688
+ },
3689
+ "count": {
3690
+ "type": "integer",
3691
+ "description": "Number of presses when stop=count (0-2000)."
3692
+ },
3693
+ "expect": {
3694
+ "description": "Regex (stop=until: one) or ordered list of regexes (stop=path: one per expected a11y return). Each is matched against the a11y layer's value after that press.",
3695
+ "oneOf": [
3696
+ {
3697
+ "type": "string"
3698
+ },
3699
+ {
3700
+ "type": "array",
3701
+ "items": {
3702
+ "type": "string"
3703
+ }
3704
+ }
3705
+ ]
3706
+ },
3707
+ "polarity": {
3708
+ "description": "match (default) advances on a regex match; no_match advances on a non-match. May be a single value or a per-step array (path).",
3709
+ "oneOf": [
3710
+ {
3711
+ "type": "string",
3712
+ "enum": [
3713
+ "match",
3714
+ "no_match"
3715
+ ]
3716
+ },
3717
+ {
3718
+ "type": "array",
3719
+ "items": {
3720
+ "type": "string",
3721
+ "enum": [
3722
+ "match",
3723
+ "no_match"
3724
+ ]
3725
+ }
3726
+ }
3727
+ ]
3728
+ },
3729
+ "max_presses": {
3730
+ "type": "integer",
3731
+ "description": "Safety cap on total presses (default 200, max 2000). On hitting it the primitive returns a clean partial (steps_done + position), not an error."
2913
3732
  }
2914
3733
  },
2915
- "required": [
2916
- "key"
2917
- ],
2918
3734
  "additionalProperties": false
2919
3735
  },
2920
3736
  "x_actions": {
2921
3737
  "direction": "agent_to_html",
2922
- "handler": "actionsJsonOverlay.keyboardPress",
3738
+ "handler": "dispatchGatedRepeat",
2923
3739
  "scope": "active_surface",
2924
3740
  "source": {
2925
3741
  "files": [
2926
- "src/content.js"
3742
+ "src/background.js",
3743
+ "src/a11y/gated-repeat.mjs"
2927
3744
  ],
2928
3745
  "symbols": [
2929
- "actionsJsonOverlay.keyboardPress"
3746
+ "dispatchGatedRepeat",
3747
+ "runGatedRepeat"
2930
3748
  ],
2931
- "component": "ActionsJsonOverlay"
3749
+ "component": "BackgroundWorker"
2932
3750
  }
2933
3751
  }
2934
3752
  },
@@ -3192,6 +4010,348 @@
3192
4010
  "component": "ActionsJsonTaskQueue"
3193
4011
  }
3194
4012
  }
4013
+ },
4014
+ {
4015
+ "name": "text.select",
4016
+ "description": "Select a range on the page (a target's editable contents, or the focused element's contents). Precursor to clipboard.copy.",
4017
+ "input_schema": {
4018
+ "type": "object",
4019
+ "properties": {
4020
+ "target": {
4021
+ "type": "object",
4022
+ "description": "Optional locator. Omit to use the focused element."
4023
+ },
4024
+ "mode": {
4025
+ "type": "string",
4026
+ "enum": [
4027
+ "all"
4028
+ ],
4029
+ "default": "all"
4030
+ }
4031
+ },
4032
+ "additionalProperties": false
4033
+ }
4034
+ },
4035
+ {
4036
+ "name": "clipboard.copy",
4037
+ "description": "Move the current page selection into the system clipboard (page -> clipboard). Dispatches a synthetic copy event so page-side copy handlers run and writes the selection text to the system clipboard.",
4038
+ "input_schema": {
4039
+ "type": "object",
4040
+ "properties": {
4041
+ "target": {
4042
+ "type": "object",
4043
+ "description": "Optional locator whose selection to copy. Omit to use the current selection / focused element."
4044
+ }
4045
+ },
4046
+ "additionalProperties": false
4047
+ }
4048
+ },
4049
+ {
4050
+ "name": "clipboard.paste",
4051
+ "description": "Paste into a DOM element (clipboard -> page). With text: paste that plain text. With html: paste that exact text/html flavor (use for tables/rich runs — e.g. an HTML <table> that Google Sheets expands into a real multi-column range). Without text: paste the current system clipboard. Dispatches a synthetic paste event at the target (default: focused element); this is the way to write into iframe-hosted editors like Google Docs where text.insert cannot reach.",
4052
+ "input_schema": {
4053
+ "type": "object",
4054
+ "properties": {
4055
+ "text": {
4056
+ "type": "string",
4057
+ "description": "Optional. Plain-text flavor to paste. Omit to paste the current system clipboard."
4058
+ },
4059
+ "html": {
4060
+ "type": "string",
4061
+ "description": "Optional. Exact text/html clipboard flavor. Use for tables or rich runs (e.g. an HTML <table> so Google Sheets expands a real multi-column range). Omitted: html is derived from text."
4062
+ },
4063
+ "target": {
4064
+ "type": "object",
4065
+ "description": "Optional locator to paste into. Omit to use the focused element. An iframe target falls back to the focused inner element."
4066
+ }
4067
+ },
4068
+ "additionalProperties": false
4069
+ }
4070
+ },
4071
+ {
4072
+ "name": "clipboard.read",
4073
+ "description": "Read the current system clipboard text. Pure clipboard I/O; does not touch the page.",
4074
+ "input_schema": {
4075
+ "type": "object",
4076
+ "properties": {},
4077
+ "additionalProperties": false
4078
+ }
4079
+ },
4080
+ {
4081
+ "name": "clipboard.write",
4082
+ "description": "Write text to the system clipboard. Pure clipboard I/O; does not touch the page.",
4083
+ "input_schema": {
4084
+ "type": "object",
4085
+ "required": [
4086
+ "text"
4087
+ ],
4088
+ "properties": {
4089
+ "text": {
4090
+ "type": "string"
4091
+ }
4092
+ },
4093
+ "additionalProperties": false
4094
+ }
4095
+ },
4096
+ {
4097
+ "name": "page.fetch",
4098
+ "description": "Authenticated same-origin GET of a URL from the page context; returns the raw response body. Use to read a page-published text/HTML view (e.g. Google Docs /mobilebasic, Sheets /htmlview) that the canvas-rendered DOM does not expose. Cross-origin or non-GET is rejected; app-specific parsing belongs in the site map.",
4099
+ "input_schema": {
4100
+ "type": "object",
4101
+ "required": [
4102
+ "url"
4103
+ ],
4104
+ "properties": {
4105
+ "url": {
4106
+ "type": "string",
4107
+ "description": "Same-origin URL to GET (authenticated with the page session). Cross-origin or non-GET is rejected."
4108
+ }
4109
+ },
4110
+ "additionalProperties": false
4111
+ }
4112
+ },
4113
+ {
4114
+ "name": "marker.query",
4115
+ "description": "Resolve a registered projection marker to its LIVE on-screen location (computed now by running the marker's recipe; coordinates are never cached — re-query after scrolling). Markers are minted by running a state projection that declares them.",
4116
+ "input_schema": {
4117
+ "type": "object",
4118
+ "required": [
4119
+ "id"
4120
+ ],
4121
+ "properties": {
4122
+ "id": {
4123
+ "type": "string",
4124
+ "description": "The marker id, as emitted in the projection output's markers[]."
4125
+ }
4126
+ }
4127
+ }
4128
+ },
4129
+ {
4130
+ "name": "cursor.move_to",
4131
+ "description": "Run a CURSOR-type marker's recipe so the text cursor (caret) ends at the marker's location. The marker's promise: after this call the caret is there. Use markers minted by the current page's projection; re-run the projection after navigation.",
4132
+ "input_schema": {
4133
+ "type": "object",
4134
+ "required": [
4135
+ "marker"
4136
+ ],
4137
+ "properties": {
4138
+ "marker": {
4139
+ "type": "string",
4140
+ "description": "The cursor-marker id from the projection output's markers[]."
4141
+ }
4142
+ }
4143
+ }
4144
+ },
4145
+ {
4146
+ "name": "pointer.move_to",
4147
+ "description": "Run a POINTER-type marker's recipe and move the mouse pointer to the marker's live location. Compose selections as: pointer.move_to(start) + pointer.click, then pointer.move_to(end) + pointer.click{modifiers:[\"Shift\"]}.",
4148
+ "input_schema": {
4149
+ "type": "object",
4150
+ "required": [
4151
+ "marker"
4152
+ ],
4153
+ "properties": {
4154
+ "marker": {
4155
+ "type": "string",
4156
+ "description": "The pointer-marker id from the projection output's markers[]."
4157
+ }
4158
+ }
4159
+ }
4160
+ },
4161
+ {
4162
+ "name": "text.type",
4163
+ "description": "Type a string at the focused element as keystrokes. Synthetic by default; with trusted:true it uses CDP Input.insertText, which overtypes the active selection and works in canvas editors — the overtype step after a keyboard selection (clipboard.paste does not route to a keyboard-made selection).",
4164
+ "input_schema": {
4165
+ "type": "object",
4166
+ "required": [
4167
+ "text"
4168
+ ],
4169
+ "properties": {
4170
+ "text": {
4171
+ "type": "string",
4172
+ "description": "Text to type at the focused element."
4173
+ },
4174
+ "trusted": {
4175
+ "type": "boolean",
4176
+ "description": "When true, types via CDP Input.insertText (trusted) — REPLACES the active selection and reaches canvas editors (Docs/Slides/Sheets). Default false = synthetic insert at the focused editable."
4177
+ },
4178
+ "mode": {
4179
+ "type": "string",
4180
+ "description": "Synthetic path only: 'insert' (default) or 'replace'."
4181
+ },
4182
+ "select_back_chars": {
4183
+ "type": "number",
4184
+ "description": "Trusted path only: before typing, extend the selection backward this many characters (Shift+Left) so the type overtypes exactly that span — one atomic CDP call. Use the character length of the phrase to replace."
4185
+ }
4186
+ }
4187
+ }
4188
+ },
4189
+ {
4190
+ "name": "a11y.tree",
4191
+ "description": "Accessibility-tree outline of the page (role/name/value/state, live regions annotated) from the CDP Accessibility domain. The blind agent's map — consult before screenshot-squinting.",
4192
+ "input_schema": {
4193
+ "type": "object",
4194
+ "properties": {
4195
+ "tab_id": {
4196
+ "type": "integer",
4197
+ "description": "Target tab. Defaults to the routed/active tab."
4198
+ },
4199
+ "max_depth": {
4200
+ "type": "integer",
4201
+ "minimum": 1,
4202
+ "maximum": 40
4203
+ },
4204
+ "max_nodes": {
4205
+ "type": "integer",
4206
+ "minimum": 1,
4207
+ "maximum": 2000
4208
+ }
4209
+ },
4210
+ "additionalProperties": false
4211
+ }
4212
+ },
4213
+ {
4214
+ "name": "a11y.query",
4215
+ "description": "Resolve an element by accessibility identity (role and/or accessible name) to its node and clickable center — the identity-based locator that replaces CSS/geometry targeting.",
4216
+ "input_schema": {
4217
+ "type": "object",
4218
+ "properties": {
4219
+ "tab_id": {
4220
+ "type": "integer",
4221
+ "description": "Target tab. Defaults to the routed/active tab."
4222
+ },
4223
+ "role": {
4224
+ "type": "string",
4225
+ "description": "AX role, e.g. button, link, textbox."
4226
+ },
4227
+ "name": {
4228
+ "type": "string",
4229
+ "description": "Exact accessible name."
4230
+ },
4231
+ "name_contains": {
4232
+ "type": "string",
4233
+ "description": "Accessible-name substring match."
4234
+ }
4235
+ },
4236
+ "additionalProperties": false
4237
+ }
4238
+ },
4239
+ {
4240
+ "name": "a11y.events.read",
4241
+ "description": "Read the buffered a11y announcement history (the speech history): live-region utterances produced by the ChromeVox core, cursored. Inject-mode announcements also piggyback on every tool result.",
4242
+ "input_schema": {
4243
+ "type": "object",
4244
+ "properties": {
4245
+ "since": {
4246
+ "type": "integer",
4247
+ "description": "Cursor from a prior read; returns records with seq > since."
4248
+ },
4249
+ "limit": {
4250
+ "type": "integer",
4251
+ "minimum": 1,
4252
+ "maximum": 200
4253
+ }
4254
+ },
4255
+ "additionalProperties": false
4256
+ }
4257
+ },
4258
+ {
4259
+ "name": "a11y.announcements_subscribe",
4260
+ "description": "Adjust this agent's own listening settings for a11y announcements, per tab (an agent manages only its own subscription). Modes: inject (piggyback on tool results), buffer (history only), off.",
4261
+ "input_schema": {
4262
+ "type": "object",
4263
+ "properties": {
4264
+ "subscriber": {
4265
+ "type": "string",
4266
+ "enum": [
4267
+ "mcp",
4268
+ "hosted"
4269
+ ],
4270
+ "default": "mcp"
4271
+ },
4272
+ "tab_id": {
4273
+ "type": "integer",
4274
+ "description": "Scope to one tab; omit for the subscriber-wide default."
4275
+ },
4276
+ "assertive": {
4277
+ "type": "string",
4278
+ "enum": [
4279
+ "inject",
4280
+ "buffer",
4281
+ "off"
4282
+ ]
4283
+ },
4284
+ "polite": {
4285
+ "type": "string",
4286
+ "enum": [
4287
+ "inject",
4288
+ "buffer",
4289
+ "off"
4290
+ ]
4291
+ }
4292
+ },
4293
+ "additionalProperties": false
4294
+ }
4295
+ },
4296
+ {
4297
+ "name": "a11y.announcements_configure",
4298
+ "description": "Alias of a11y.announcements_subscribe: update per-(agent, tab) announcement delivery modes.",
4299
+ "input_schema": {
4300
+ "type": "object",
4301
+ "properties": {
4302
+ "subscriber": {
4303
+ "type": "string",
4304
+ "enum": [
4305
+ "mcp",
4306
+ "hosted"
4307
+ ],
4308
+ "default": "mcp"
4309
+ },
4310
+ "tab_id": {
4311
+ "type": "integer"
4312
+ },
4313
+ "assertive": {
4314
+ "type": "string",
4315
+ "enum": [
4316
+ "inject",
4317
+ "buffer",
4318
+ "off"
4319
+ ]
4320
+ },
4321
+ "polite": {
4322
+ "type": "string",
4323
+ "enum": [
4324
+ "inject",
4325
+ "buffer",
4326
+ "off"
4327
+ ]
4328
+ }
4329
+ },
4330
+ "additionalProperties": false
4331
+ }
4332
+ },
4333
+ {
4334
+ "name": "a11y.watch",
4335
+ "description": "Start listening to a tab's live regions: inject the accessibility observer into all frames (idempotent — works on already-open tabs) and enable the site's screen-reader mode so it narrates itself. Call once before expecting a11y announcements.",
4336
+ "input_schema": {
4337
+ "type": "object",
4338
+ "properties": {
4339
+ "tab_id": {
4340
+ "type": "integer",
4341
+ "description": "Target tab. Defaults to the routed/active tab."
4342
+ },
4343
+ "enable_screen_reader": {
4344
+ "type": "boolean",
4345
+ "default": true,
4346
+ "description": "Enable the site screen-reader mode (e.g. Docs Ctrl+Alt+Z) idempotently."
4347
+ },
4348
+ "screen_reader_chord": {
4349
+ "type": "string",
4350
+ "description": "Override the SR-mode toggle chord (default Control+Alt+z)."
4351
+ }
4352
+ },
4353
+ "additionalProperties": false
4354
+ }
3195
4355
  }
3196
4356
  ],
3197
4357
  "signals": [