browserzap 0.8.0 → 0.8.5

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/CHANGELOG.md CHANGED
@@ -1,6 +1,77 @@
1
1
  # Changelog
2
2
 
3
- ## 0.8.0 — the connection fix and chat (draft until the store publishes it)
3
+ ## 0.8.5 — typing that editors accept, fewer prompts (2026-11-05)
4
+
5
+ A blocker fix for text input. On Medium (and in Gmail, LinkedIn, X, Slack and Notion) the agent's typing could look
6
+ right on screen while the editor itself rejected it — Medium showed “Something is wrong and we cannot save your
7
+ story” and BrowserZap still said “verified”. Typing now goes through Chrome's own input channel, at the caret, exactly
8
+ as your keyboard does, and “verified” means the page kept the text.
9
+
10
+ **Permissions: fewer prompts, same safety**
11
+ - **Preparation goes ahead, a final action asks.** Attaching a file you named no longer asks. Submitting, sending,
12
+ deleting and paying still ask: **Approve once**, **Deny**, or the new **Always allow on this site**.
13
+ - **Settings → Permissions.** Set each kind of action to Allow, Ask or Block, and see (and remove) the sites you
14
+ allowed. Block always wins; payments can only Ask or Block; the agent can never change these settings.
15
+
16
+ **Settings on their own page**
17
+ - The gear in the side panel opens a full Settings page (also Chrome's “Options” for BrowserZap): General,
18
+ Permissions, Plan, Help and Advanced, laid out for a wide window and for a phone-width one.
19
+
20
+ **Writing in editors (found writing a real Medium story)**
21
+ - **Every character is a real keystroke**, as Chrome sends it for your keyboard (Shift included). Medium ignored text
22
+ that arrived any other way while BrowserZap reported it as kept.
23
+ - **The agent types where it clicked.** Click a title, then fill: the text goes into the title, not to the end of the
24
+ story. Clicking the text of an editor never asks for approval, whatever words it contains.
25
+ - **Uploads behind a button.** `file_upload` accepts a button like “Add an image”: BrowserZap catches the file chooser
26
+ the page opens (no dialog appears) and attaches the file you approved — Medium, Gmail and Notion work this way.
27
+ - **Honest results:** a list that “1. ” turned into is reported as converted, not lost; quotes the page curls are
28
+ “reformatted”; an icon-only toolbar button gets a name from its icon or hint (`nameSource: "hint"`).
29
+
30
+ **The agent's cursor**
31
+ - White with an orange outline, the same on light and dark pages. It stays on the element it acted on when the page
32
+ scrolls, and a cursor left behind by an extension reload is removed instead of shown twice.
33
+
34
+ **Typing**
35
+ - **Rich editors accept what the agent types.** BrowserZap no longer rewrites an editor's page. It clicks where the
36
+ caret belongs and types there, so the editor sees the same events as a person's keyboard: Medium, Gmail, LinkedIn,
37
+ X, Slack, Notion and comment boxes work.
38
+ - **A whole document is never cleared.** When the editor holds several blocks (Medium's story editor), the text is
39
+ added at the end of the last block, and the result says so. A single block is replaced only when that is what you
40
+ asked for.
41
+ - **Every keystroke is real.** Search boxes show suggestions as the agent types, autocompletes open, phone and card
42
+ masks format, character counters count, and shortcuts work — because the page receives real key events, not a
43
+ silent value change.
44
+ - **`verified` is honest.** BrowserZap reads the field back after a moment. If the page kept the text but reformatted
45
+ it (a phone mask, uppercase in a controlled field), the result says “reformatted by the page”. If it did not keep it,
46
+ the call fails with “the page did not keep the text” instead of pretending.
47
+ - **Background tabs behave like the tab in front.** The agent types and clicks without bringing your tab forward, and
48
+ without you losing your place.
49
+
50
+ **Keys, hover and scrolling**
51
+ - **Any key, and shortcuts.** `browser_press_key` now takes letters, digits and chords such as `ctrl+b`, `ctrl+k`,
52
+ `ctrl+a`, `ctrl+alt+1` and `ctrl+enter`. A bad key is refused before anything happens. Enter and Ctrl+Enter keep the
53
+ same approval rule when they would submit or send.
54
+ - **Hover.** New `element_hover`: menus, tooltips and buttons that appear only on hover can now be reached. It is
55
+ read-only, and it reports what appeared.
56
+ - **Scrolling loads more.** `browser_scroll` sends a real mouse wheel, so infinite lists and wheel-driven widgets load
57
+ the next page. The old behaviour is the fallback.
58
+
59
+ **Tabs**
60
+ - **Your agent keeps its tab.** If you click, type or navigate in the agent's tab, or look at another tab in its
61
+ group, the agent carries on in its own tab instead of stopping. Its next result says what changed while it was away
62
+ (address, title, whether fields were filled or emptied — never the values) and tells it to look at the page first.
63
+ - **A tab you shared still comes back** when you close its panel. Opening or closing the panel on a tab the agent
64
+ opened changes nothing.
65
+ - **Tab groups say BrowserZap.** An agent's group is titled `BrowserZap · claude-code` (or the name the agent gave
66
+ its session), so its tabs are easy to tell apart from another extension's groups.
67
+
68
+ **Updates**
69
+ - **Store updates install without a Chrome restart.** BrowserZap's connection to the bridge kept Chrome from ever
70
+ installing a downloaded update until the browser restarted. It now reloads into the new version as soon as no agent
71
+ is working, no side panel is open and Comment mode is off. A developer (unpacked) copy still needs its reload button.
72
+ - **No new permissions.** Same Chrome Web Store permissions as 0.8.0.
73
+
74
+ ## 0.8.0 — the connection fix and chat (2026-11-04)
4
75
 
5
76
  Compared with the last public release (0.7.0). Only finished, tested work is listed. Everything is free during early
6
77
  access; nothing that keeps you safe (approvals, hand-off, Stop) will ever be paid.
@@ -73,7 +73,7 @@ const MAX_EXTENSION_MESSAGES_PER_SECOND = 500;
73
73
  // execution in the page is not part of this product.
74
74
  // Must match AGENT_ACTIONS in src/types/protocol.ts (tests/contract.test.mjs).
75
75
  const VALID_AGENT_ACTIONS = new Set([
76
- 'status', 'inspect', 'navigate', 'click', 'fill', 'select_option', 'wait_for',
76
+ 'status', 'inspect', 'navigate', 'click', 'hover', 'fill', 'select_option', 'wait_for',
77
77
  'screenshot', 'press_key', 'scroll', 'pause', 'resume',
78
78
  'new_tab', 'list_tabs', 'switch_tab', 'close_tab', 'notify', 'upload',
79
79
  'console', 'network', 'say',
@@ -171,12 +171,31 @@ const MCP_TOOLS = [
171
171
  },
172
172
  },
173
173
  },
174
+ {
175
+ name: 'element_hover',
176
+ description:
177
+ 'Move the pointer over exactly one element and report what appeared (a menu, tooltip, or controls a row reveals ' +
178
+ 'on hover). Resolves the target like element_click and refuses ambiguous, hidden or covered targets. Read-only: ' +
179
+ 'no approval. Follow with element_click on what appeared.',
180
+ inputSchema: {
181
+ type: 'object',
182
+ additionalProperties: false,
183
+ required: ['target'],
184
+ properties: {
185
+ target: TARGET,
186
+ timeoutMs: ACTION_TIMEOUT,
187
+ },
188
+ },
189
+ },
174
190
  {
175
191
  name: 'field_fill',
176
192
  description:
177
193
  'Replace the content of one text field (or set a checkbox/radio with "true"/"false") and verify it. ' +
178
- 'Sensitive fields (passwords, one-time codes, card numbers, government IDs) are refused with ' +
179
- 'USER_ACTION_REQUIRED — ask the user to type those. The value is never logged or echoed back.',
194
+ 'Text is typed through Chrome\'s trusted input channel at the caret, so key listeners fire and rich editors ' +
195
+ '(Medium, Gmail, LinkedIn, Slack) accept it. A multi-block rich editor is never cleared: the text is appended ' +
196
+ 'at the end of its last block and the result says mode "append". Sensitive fields (passwords, one-time codes, ' +
197
+ 'card numbers, government IDs) are refused with USER_ACTION_REQUIRED — ask the user to type those. The value is ' +
198
+ 'never logged or echoed back.',
180
199
  inputSchema: {
181
200
  type: 'object',
182
201
  additionalProperties: false,
@@ -248,16 +267,18 @@ const MCP_TOOLS = [
248
267
  {
249
268
  name: 'browser_press_key',
250
269
  description:
251
- 'Press one key on the focused element. Enter inside a form counts as submitting it and follows the same ' +
252
- 'approval rules as element_click.',
270
+ 'Press one key on the focused element: a named key (Enter, Tab, Escape, Backspace, Delete, the arrows, Home, ' +
271
+ 'End, PageUp, PageDown, Space), one printable character, or either with modifiers joined by "+" — ctrl+b, ' +
272
+ 'ctrl+k, ctrl+a, ctrl+alt+1, ctrl+enter, meta+shift+t. Enter (with or without modifiers) inside a form counts ' +
273
+ 'as submitting it and follows the same approval rules as element_click.',
253
274
  inputSchema: {
254
275
  type: 'object',
255
276
  additionalProperties: false,
256
277
  required: ['key'],
257
278
  properties: {
258
279
  key: {
259
- type: 'string',
260
- enum: ['Enter', 'Tab', 'Escape', 'Backspace', 'Delete', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End', 'PageUp', 'PageDown', 'Space'],
280
+ type: 'string', minLength: 1, maxLength: 32,
281
+ description: 'A named key, one printable character, or a chord: ctrl+b, ctrl+enter, ctrl+alt+1.',
261
282
  },
262
283
  modifiers: { type: 'array', maxItems: 4, items: { type: 'string', enum: ['ctrl', 'alt', 'shift', 'meta'] } },
263
284
  approvalId: { type: 'string', maxLength: 64 },
@@ -703,6 +724,7 @@ const ANNOTATIONS = {
703
724
  page_inspect: ['Inspect page', READ],
704
725
  browser_navigate: ['Navigate', { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }],
705
726
  element_click: ['Click element', { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true }],
727
+ element_hover: ['Hover element', READ],
706
728
  field_fill: ['Fill field', { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }],
707
729
  select_option: ['Select option', { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }],
708
730
  wait_for_state: ['Wait for page state', READ],
@@ -756,6 +778,7 @@ const TOOL_TO_ACTION = {
756
778
  page_inspect: 'inspect',
757
779
  browser_navigate: 'navigate',
758
780
  element_click: 'click',
781
+ element_hover: 'hover',
759
782
  field_fill: 'fill',
760
783
  select_option: 'select_option',
761
784
  wait_for_state: 'wait_for',
@@ -782,7 +805,7 @@ const INTERNAL_ACTIONS = new Set(['notify']);
782
805
 
783
806
  /** Tools that act on page content and therefore carry the origin allowlist. */
784
807
  const PAGE_TOOLS = new Set([
785
- 'page_inspect', 'browser_navigate', 'element_click', 'field_fill', 'select_option',
808
+ 'page_inspect', 'browser_navigate', 'element_click', 'element_hover', 'field_fill', 'select_option',
786
809
  'wait_for_state', 'screenshot_capture', 'browser_press_key', 'browser_scroll',
787
810
  ]);
788
811
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browserzap",
3
- "version": "0.8.0",
3
+ "version": "0.8.5",
4
4
  "description": "Let your AI agent (Claude Code, Codex, Cursor or any MCP client) work in your own Chrome, with your logins, your approval and a Stop button.",
5
5
  "homepage": "https://browserzap.com",
6
6
  "bugs": {