browserzap 0.8.0 → 0.8.6

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,88 @@
1
1
  # Changelog
2
2
 
3
- ## 0.8.0 — the connection fix and chat (draft until the store publishes it)
3
+ ## 0.8.6 — the companion installs on macOS and Linux (2026-11-06, npm only)
4
+
5
+ - **npm no longer refuses macOS and Linux.** `package.json` declared `"os": ["win32"]`, so `npm install -g browserzap`
6
+ stopped with EBADPLATFORM outside Windows. The field is gone, so macOS and Linux install and set up the same way
7
+ (`browserzap setup` already registers Chrome's helper there). They are new: please report what breaks.
8
+ - **The site**: setup by AI prompt on Getting started (any MCP app), the platforms page and every page now say
9
+ Windows, macOS and Linux, a lighter hero chip, and the demo fits one phone screen.
10
+ - **No extension change.** The companion's code is the same as 0.8.5 and works with the 0.8.5 extension in the Chrome
11
+ Web Store (protocol 4; the companion only warns below 0.7.0). The 0.8.6 extension zip on the GitHub release is the
12
+ same code with the new version number and is not submitted to the store; the next store version is 0.9.0.
13
+
14
+ ## 0.8.5 — typing that editors accept, fewer prompts (2026-11-05)
15
+
16
+ A blocker fix for text input. On Medium (and in Gmail, LinkedIn, X, Slack and Notion) the agent's typing could look
17
+ right on screen while the editor itself rejected it — Medium showed “Something is wrong and we cannot save your
18
+ story” and BrowserZap still said “verified”. Typing now goes through Chrome's own input channel, at the caret, exactly
19
+ as your keyboard does, and “verified” means the page kept the text.
20
+
21
+ **Permissions: fewer prompts, same safety**
22
+ - **Preparation goes ahead, a final action asks.** Attaching a file you named no longer asks. Submitting, sending,
23
+ deleting and paying still ask: **Approve once**, **Deny**, or the new **Always allow on this site**.
24
+ - **Settings → Permissions.** Set each kind of action to Allow, Ask or Block, and see (and remove) the sites you
25
+ allowed. Block always wins; payments can only Ask or Block; the agent can never change these settings.
26
+
27
+ **Settings on their own page**
28
+ - The gear in the side panel opens a full Settings page (also Chrome's “Options” for BrowserZap): General,
29
+ Permissions, Plan, Help and Advanced, laid out for a wide window and for a phone-width one.
30
+
31
+ **Writing in editors (found writing a real Medium story)**
32
+ - **Every character is a real keystroke**, as Chrome sends it for your keyboard (Shift included). Medium ignored text
33
+ that arrived any other way while BrowserZap reported it as kept.
34
+ - **The agent types where it clicked.** Click a title, then fill: the text goes into the title, not to the end of the
35
+ story. Clicking the text of an editor never asks for approval, whatever words it contains.
36
+ - **Uploads behind a button.** `file_upload` accepts a button like “Add an image”: BrowserZap catches the file chooser
37
+ the page opens (no dialog appears) and attaches the file you approved — Medium, Gmail and Notion work this way.
38
+ - **Honest results:** a list that “1. ” turned into is reported as converted, not lost; quotes the page curls are
39
+ “reformatted”; an icon-only toolbar button gets a name from its icon or hint (`nameSource: "hint"`).
40
+
41
+ **The agent's cursor**
42
+ - White with an orange outline, the same on light and dark pages. It stays on the element it acted on when the page
43
+ scrolls, and a cursor left behind by an extension reload is removed instead of shown twice.
44
+
45
+ **Typing**
46
+ - **Rich editors accept what the agent types.** BrowserZap no longer rewrites an editor's page. It clicks where the
47
+ caret belongs and types there, so the editor sees the same events as a person's keyboard: Medium, Gmail, LinkedIn,
48
+ X, Slack, Notion and comment boxes work.
49
+ - **A whole document is never cleared.** When the editor holds several blocks (Medium's story editor), the text is
50
+ added at the end of the last block, and the result says so. A single block is replaced only when that is what you
51
+ asked for.
52
+ - **Every keystroke is real.** Search boxes show suggestions as the agent types, autocompletes open, phone and card
53
+ masks format, character counters count, and shortcuts work — because the page receives real key events, not a
54
+ silent value change.
55
+ - **`verified` is honest.** BrowserZap reads the field back after a moment. If the page kept the text but reformatted
56
+ it (a phone mask, uppercase in a controlled field), the result says “reformatted by the page”. If it did not keep it,
57
+ the call fails with “the page did not keep the text” instead of pretending.
58
+ - **Background tabs behave like the tab in front.** The agent types and clicks without bringing your tab forward, and
59
+ without you losing your place.
60
+
61
+ **Keys, hover and scrolling**
62
+ - **Any key, and shortcuts.** `browser_press_key` now takes letters, digits and chords such as `ctrl+b`, `ctrl+k`,
63
+ `ctrl+a`, `ctrl+alt+1` and `ctrl+enter`. A bad key is refused before anything happens. Enter and Ctrl+Enter keep the
64
+ same approval rule when they would submit or send.
65
+ - **Hover.** New `element_hover`: menus, tooltips and buttons that appear only on hover can now be reached. It is
66
+ read-only, and it reports what appeared.
67
+ - **Scrolling loads more.** `browser_scroll` sends a real mouse wheel, so infinite lists and wheel-driven widgets load
68
+ the next page. The old behaviour is the fallback.
69
+
70
+ **Tabs**
71
+ - **Your agent keeps its tab.** If you click, type or navigate in the agent's tab, or look at another tab in its
72
+ group, the agent carries on in its own tab instead of stopping. Its next result says what changed while it was away
73
+ (address, title, whether fields were filled or emptied — never the values) and tells it to look at the page first.
74
+ - **A tab you shared still comes back** when you close its panel. Opening or closing the panel on a tab the agent
75
+ opened changes nothing.
76
+ - **Tab groups say BrowserZap.** An agent's group is titled `BrowserZap · claude-code` (or the name the agent gave
77
+ its session), so its tabs are easy to tell apart from another extension's groups.
78
+
79
+ **Updates**
80
+ - **Store updates install without a Chrome restart.** BrowserZap's connection to the bridge kept Chrome from ever
81
+ installing a downloaded update until the browser restarted. It now reloads into the new version as soon as no agent
82
+ is working, no side panel is open and Comment mode is off. A developer (unpacked) copy still needs its reload button.
83
+ - **No new permissions.** Same Chrome Web Store permissions as 0.8.0.
84
+
85
+ ## 0.8.0 — the connection fix and chat (2026-11-04)
4
86
 
5
87
  Compared with the last public release (0.7.0). Only finished, tested work is listed. Everything is free during early
6
88
  access; nothing that keeps you safe (approvals, hand-off, Stop) will ever be paid.
package/README.md CHANGED
@@ -147,7 +147,8 @@ page goes to the AI client you connected, under that client's terms. Full policy
147
147
 
148
148
  ## Known limitations
149
149
 
150
- - Windows only so far (Chrome or Edge). macOS and Linux are planned.
150
+ - Runs on Windows 10/11, macOS and Linux (Chrome, or Edge on Windows). macOS and Linux are new since 0.8.6: the same
151
+ install and `browserzap setup`; please report what breaks to hello@browserzap.com.
151
152
  - `chrome://` pages and the Chrome Web Store cannot be automated.
152
153
  - Canvas apps, some custom widgets and cross-origin frames may need you to do the step.
153
154
  - In a background tab, clicks are made inside the page; a site that requires a real user click needs the tab in front.
@@ -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.6",
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": {
@@ -107,8 +107,5 @@
107
107
  "author": "Akash Yadav",
108
108
  "publishConfig": {
109
109
  "access": "public"
110
- },
111
- "os": [
112
- "win32"
113
- ]
110
+ }
114
111
  }