@omercnet/paseo-shared-browser 0.3.1-next.72.1
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 +71 -0
- package/LICENSE +21 -0
- package/README.md +182 -0
- package/client/browser.tsx +2098 -0
- package/docs/images/shared-browser-compact.png +0 -0
- package/docs/images/shared-browser-wide.png +0 -0
- package/index.client.tsx +35 -0
- package/index.server.ts +118 -0
- package/package.json +78 -0
- package/paseo-plugin.json +10 -0
- package/scripts/prepare-dependencies.mjs +25 -0
- package/scripts/prepare-runtime.mjs +168 -0
- package/server/agent-browser-runtime.ts +970 -0
- package/server/browser-policy.ts +836 -0
- package/server/browser.ts +306 -0
- package/server/cdp.ts +265 -0
- package/server/electron.d.ts +1 -0
- package/server/mcp-entry.ts +194 -0
- package/server/runtime-owner.ts +122 -0
- package/server/runtime-protocol.ts +260 -0
- package/server/supervisor-client.ts +402 -0
- package/server/supervisor-entry.ts +9 -0
- package/server/supervisor.ts +1081 -0
- package/shared/browser.ts +364 -0
- package/tsconfig.json +29 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.3.1](https://github.com/omercnet/paseo-plugins/compare/shared-browser-v0.3.0...shared-browser-v0.3.1) (2026-09-15)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **shared-browser:** support system Chromium on Linux ARM64 ([#58](https://github.com/omercnet/paseo-plugins/issues/58)) ([f9c3dcb](https://github.com/omercnet/paseo-plugins/commit/f9c3dcb1031840c7cd0aed4a70f984d9d9bd24c1))
|
|
9
|
+
|
|
10
|
+
## [0.3.0](https://github.com/omercnet/paseo-plugins/compare/shared-browser-v0.2.2...shared-browser-v0.3.0) (2026-09-12)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
* **shared-browser:** adopt agent-browser runtime ([#18](https://github.com/omercnet/paseo-plugins/issues/18)) ([09623f3](https://github.com/omercnet/paseo-plugins/commit/09623f34f2b93943c19f809a865813fa37f467bd))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Bug Fixes
|
|
19
|
+
|
|
20
|
+
* **shared-browser:** skip MCP injection for OMP ([#21](https://github.com/omercnet/paseo-plugins/issues/21)) ([ee2db08](https://github.com/omercnet/paseo-plugins/commit/ee2db08243640600c5592debe72f680446fa26d0))
|
|
21
|
+
|
|
22
|
+
## [1.0.0](https://github.com/omercnet/paseo-plugins/compare/shared-browser-v0.2.2...shared-browser-v1.0.0) (2026-09-12)
|
|
23
|
+
|
|
24
|
+
### ⚠ BREAKING CHANGES
|
|
25
|
+
|
|
26
|
+
* replace the browser runtime in place with plugin-owned `agent-browser` 0.37.1 and a detached daemon-host supervisor; deployments must provide the packaged runtime and a compatible Chromium executable, with Linux ARM64 deployments supplying native Chromium through `PASEO_SHARED_BROWSER_CHROMIUM_EXECUTABLE`
|
|
27
|
+
|
|
28
|
+
### Bug Fixes
|
|
29
|
+
|
|
30
|
+
* leave OMP agent creation unchanged because the provider rejects external MCP servers
|
|
31
|
+
|
|
32
|
+
### Features
|
|
33
|
+
|
|
34
|
+
* preserve workspace browser processes across client disconnects and plugin reloads during a 120-second orphan grace, while retaining per-workspace profiles and tearing down active runtimes when workspace archive events are received
|
|
35
|
+
* add daemon-local runtime overrides through `PASEO_SHARED_BROWSER_AGENT_BROWSER_BINARY` and `PASEO_SHARED_BROWSER_CHROMIUM_EXECUTABLE`
|
|
36
|
+
|
|
37
|
+
## [0.2.2](https://github.com/omercnet/paseo-plugins/compare/shared-browser-v0.2.1...shared-browser-v0.2.2) (2026-09-10)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
### Bug Fixes
|
|
41
|
+
|
|
42
|
+
* upgrade plugins to Paseo 0.8.0 ([c6b4e40](https://github.com/omercnet/paseo-plugins/commit/c6b4e4081fc9527de0ca6183a3903ff5ec4f93c4))
|
|
43
|
+
* upgrade plugins to Paseo 0.8.0 ([d7ad454](https://github.com/omercnet/paseo-plugins/commit/d7ad4540d2e1875bdf4a4d21f76ded25cac2f3dc))
|
|
44
|
+
|
|
45
|
+
## [0.2.1](https://github.com/omercnet/paseo-shared-browser/compare/v0.2.0...v0.2.1) (2026-09-08)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
### Bug Fixes
|
|
49
|
+
|
|
50
|
+
* address Paseo 0.8 migration review feedback ([#10](https://github.com/omercnet/paseo-shared-browser/issues/10)) ([15d2515](https://github.com/omercnet/paseo-shared-browser/commit/15d25157503b7fb70d02c5e420522764250cab62))
|
|
51
|
+
|
|
52
|
+
## [0.2.0](https://github.com/omercnet/paseo-shared-browser/compare/v0.1.1...v0.2.0) (2026-09-08)
|
|
53
|
+
|
|
54
|
+
### Features
|
|
55
|
+
|
|
56
|
+
* migrate shared browser to Paseo 0.8 ([#8](https://github.com/omercnet/paseo-shared-browser/issues/8)) ([36f27ab](https://github.com/omercnet/paseo-shared-browser/commit/36f27abc5dab4a16c9770d6296916631965af333))
|
|
57
|
+
## [0.1.1](https://github.com/omercnet/paseo-shared-browser/compare/v0.1.0...v0.1.1) (2026-09-07)
|
|
58
|
+
|
|
59
|
+
### Bug Fixes
|
|
60
|
+
|
|
61
|
+
* include README screenshots in release archives ([#6](https://github.com/omercnet/paseo-shared-browser/issues/6)) ([a231db4](https://github.com/omercnet/paseo-shared-browser/commit/a231db4b20e9c52ebe8624ad69e34e907037ac0a))
|
|
62
|
+
|
|
63
|
+
## 0.1.0 (2026-09-07)
|
|
64
|
+
|
|
65
|
+
### Features
|
|
66
|
+
|
|
67
|
+
* share one live Chromium session per Paseo workspace ([b1e9fac](https://github.com/omercnet/paseo-shared-browser/commit/b1e9fac5021746cf2dc09f7bfb9ccf0cb3b82e5d))
|
|
68
|
+
|
|
69
|
+
### Bug Fixes
|
|
70
|
+
|
|
71
|
+
* keep format check off the generated changelog ([#4](https://github.com/omercnet/paseo-shared-browser/issues/4)) ([2219adf](https://github.com/omercnet/paseo-shared-browser/commit/2219adf3c11591a88dc54b899dece76003f313c4))
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Omer Cohen
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# Shared Browser
|
|
2
|
+
|
|
3
|
+
A Paseo plugin that runs one real Chromium browser per workspace on the daemon host and shares that
|
|
4
|
+
exact live session with every connected Paseo client. Version 1.0 replaces the previous browser
|
|
5
|
+
runtime in place with a plugin-owned, pinned `agent-browser` runtime; existing installations keep
|
|
6
|
+
the `shared-browser` plugin ID and upgrade without installing a second plugin.
|
|
7
|
+
|
|
8
|
+
This is not URL synchronization and not a second browser with copied cookies. Every viewer and
|
|
9
|
+
eligible workspace agent acts on the same running page, DOM, navigation state, and login state.
|
|
10
|
+
Many viewers can watch; human control remains server-authoritative and takes priority over agent
|
|
11
|
+
input.
|
|
12
|
+
|
|
13
|
+
## Screenshots
|
|
14
|
+
|
|
15
|
+
### Wide desktop
|
|
16
|
+
|
|
17
|
+

|
|
18
|
+
|
|
19
|
+
### Compact client
|
|
20
|
+
|
|
21
|
+

|
|
22
|
+
|
|
23
|
+
## Runtime model
|
|
24
|
+
|
|
25
|
+
- The plugin server runs beside the Paseo daemon and starts one `agent-browser` session and Chromium
|
|
26
|
+
process per open browser workspace. Browser execution, profiles, IPC, and network access are on the
|
|
27
|
+
daemon host, not on the viewing phone, browser, or desktop app.
|
|
28
|
+
- The plugin owns `agent-browser` version `0.37.1`, its IPC directory, and the Chromium executable.
|
|
29
|
+
It strips inherited `AGENT_BROWSER_*` variables and sets `AGENT_BROWSER_SOCKET_DIR`,
|
|
30
|
+
`AGENT_BROWSER_IDLE_TIMEOUT_MS=0`, `AGENT_BROWSER_STREAM_PORT=0`, and
|
|
31
|
+
`AGENT_BROWSER_NO_AUTO_DIALOG=1` itself.
|
|
32
|
+
- Frames stream from Chromium through CDP `Page.startScreencast`, with a bounded screenshot fallback.
|
|
33
|
+
Remote input supports tap, double-tap, right-click, drag, swipe scrolling, text, and special keys.
|
|
34
|
+
- Device presets for Desktop Chrome, iPhone 15 Pro, Pixel 7, and iPad Pro 11 change Chromium's
|
|
35
|
+
viewport, device pixel ratio, touch behavior, platform, and user agent. A phone can view and
|
|
36
|
+
control the shared browser, but the rendered browser remains Chromium. An iPhone preset is mobile
|
|
37
|
+
emulation, not WebKit, iOS, or real Safari.
|
|
38
|
+
|
|
39
|
+
## Lifetime and persistence
|
|
40
|
+
|
|
41
|
+
The browser runtime is held by a detached supervisor rather than by a particular Paseo client or
|
|
42
|
+
plugin subprocess. Closing a panel, disconnecting a client, or losing the plugin bridge invalidates
|
|
43
|
+
that client's viewer/control tokens but does not immediately close Chromium. A replacement plugin
|
|
44
|
+
bridge can reclaim the existing workspace runtime. If no bridge reconnects, the supervisor closes
|
|
45
|
+
all orphaned runtimes after a 120-second grace period. A missed heartbeat fences the old bridge after
|
|
46
|
+
30 seconds; the bridge sends heartbeats every 10 seconds.
|
|
47
|
+
|
|
48
|
+
Each workspace gets a private profile under
|
|
49
|
+
`$PASEO_HOME/plugin-data/shared-browser/profiles/<workspace-id-sha256>`. Cookies and site login state
|
|
50
|
+
therefore survive viewer disconnects, plugin reloads, and Chromium process restarts while that
|
|
51
|
+
directory remains intact. Profiles are local to one daemon host: they are not synchronized between
|
|
52
|
+
hosts or Paseo clients, do not use a personal Chrome or Safari profile, and are not portable across
|
|
53
|
+
arbitrary Chromium versions.
|
|
54
|
+
|
|
55
|
+
When Paseo emits `workspace.archived` while the plugin server is active, the plugin fences that
|
|
56
|
+
workspace, expires its viewers and controller, and closes its browser runtime, including a runtime
|
|
57
|
+
whose creation raced the archive. The profile directory is retained. Archive events missed while
|
|
58
|
+
the plugin bridge is disconnected are not replayed or reconciled by the plugin; the orphan grace
|
|
59
|
+
still closes the runtime, but retained profile data must be removed manually if it is no longer
|
|
60
|
+
wanted.
|
|
61
|
+
|
|
62
|
+
## Install
|
|
63
|
+
|
|
64
|
+
Enable trusted plugins on the target Paseo daemon, then install from npm:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
paseo plugin install npm:@omercnet/paseo-shared-browser
|
|
68
|
+
paseo plugin ls
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Or install from Git:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
paseo plugin add omercnet/paseo-plugins:paseo-shared-browser
|
|
75
|
+
paseo plugin ls
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Installation runs `npm ci --include=dev` and `npm run prepare:runtime` on the daemon host. The
|
|
79
|
+
preparation step installs the pinned browser runtime and builds both `supervisor.cjs` and
|
|
80
|
+
`shared-browser-mcp.cjs` under
|
|
81
|
+
`$PASEO_HOME/plugin-data/shared-browser/runtime`. For a local monorepo checkout:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
cd paseo-plugins/paseo-shared-browser
|
|
85
|
+
npm ci --include=dev
|
|
86
|
+
npm run prepare:runtime
|
|
87
|
+
paseo plugin install "$PWD"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The build requires Node.js 24 or newer and npm on the daemon host. The runtime also needs a
|
|
91
|
+
Chromium-compatible executable. On Linux ARM64, where the bundled download is unavailable, the
|
|
92
|
+
installer automatically uses native Chromium from `/usr/bin/chromium`. Install a non-Snap Chromium
|
|
93
|
+
build with the system package manager before adding the plugin. Set
|
|
94
|
+
`PASEO_SHARED_BROWSER_CHROMIUM_EXECUTABLE` to an absolute path when Chromium is installed elsewhere.
|
|
95
|
+
The plugin does not emulate x64 Chromium.
|
|
96
|
+
|
|
97
|
+
Open a workspace, search the Command Center for **Open Shared Browser**, or tap the **Shared
|
|
98
|
+
Browser** composer pill while a workspace session is open.
|
|
99
|
+
|
|
100
|
+
## Agent MCP access
|
|
101
|
+
|
|
102
|
+
The plugin automatically injects its stdio MCP adapter only when a new, non-internal agent is
|
|
103
|
+
created with a provider that accepts external MCP servers. Agents that already exist, resumed
|
|
104
|
+
sessions, imported sessions, and Paseo's internal agents are not modified. Paseo's OMP provider
|
|
105
|
+
uses native host-tool injection and rejects external MCP servers, so OMP agents are left unchanged.
|
|
106
|
+
Pi agents continue to receive the adapter, but they require Pi's optional MCP support to launch it.
|
|
107
|
+
|
|
108
|
+
The injected MCP server exposes exactly these tools: `shared_browser_status`,
|
|
109
|
+
`shared_browser_capture`, `shared_browser_acquire_control`, `shared_browser_release_control`,
|
|
110
|
+
`shared_browser_navigate`, `shared_browser_input`, and `shared_browser_viewport`. It does not
|
|
111
|
+
expose arbitrary CDP commands, JavaScript or page evaluation, browser profile access, or filesystem
|
|
112
|
+
access.
|
|
113
|
+
|
|
114
|
+
Each adapter launch receives an opaque credential bound to its workspace. It cannot use that
|
|
115
|
+
credential to operate another workspace's browser. Agent input follows human-priority control: an
|
|
116
|
+
agent cannot force a takeover while a human viewer holds control. The human must release control or
|
|
117
|
+
the lease must expire before agent input can proceed.
|
|
118
|
+
|
|
119
|
+
The provider launches the stdio adapter on the Paseo daemon host, beside the daemon-owned browser
|
|
120
|
+
runtime. Web, desktop, and mobile clients never own or host the adapter or Chromium, and a client
|
|
121
|
+
disconnect does not close or reset either process.
|
|
122
|
+
|
|
123
|
+
## Runtime environment overrides
|
|
124
|
+
|
|
125
|
+
The plugin recognizes only these deployment overrides:
|
|
126
|
+
|
|
127
|
+
| Variable | Meaning |
|
|
128
|
+
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
129
|
+
| `PASEO_HOME` | Paseo data root. Defaults to `~/.paseo`; browser runtime, supervisor IPC, and profiles live below `plugin-data/shared-browser`. |
|
|
130
|
+
| `PASEO_SHARED_BROWSER_AGENT_BROWSER_BINARY` | Absolute path to the pinned `agent-browser` executable. Defaults to `$PASEO_HOME/plugin-data/shared-browser/runtime/node_modules/.bin/agent-browser`. |
|
|
131
|
+
| `PASEO_SHARED_BROWSER_CHROMIUM_EXECUTABLE` | Absolute path to Chromium. Defaults to `$PASEO_HOME/plugin-data/shared-browser/runtime/chromium/chrome`. On Linux ARM64, installation automatically links `/usr/bin/chromium`; use this override for another compatible, non-Snap location. |
|
|
132
|
+
|
|
133
|
+
User-supplied `AGENT_BROWSER_*` variables are deliberately ignored.
|
|
134
|
+
|
|
135
|
+
## Controls
|
|
136
|
+
|
|
137
|
+
- Toolbar: back, forward, reload, address bar, and device emulation.
|
|
138
|
+
- Status row: session state, viewer count, controller, and lease expiry.
|
|
139
|
+
- Human control: **Take control**, **Release**, and **Take over** for explicit handoff. Agent MCP
|
|
140
|
+
calls have no forced-takeover operation.
|
|
141
|
+
- Mobile: swipe scrolls by default; pointer and keyboard options open as bottom sheets.
|
|
142
|
+
|
|
143
|
+
## Security boundary
|
|
144
|
+
|
|
145
|
+
- Paseo plugins are trusted, unsandboxed code. The plugin server, detached supervisor,
|
|
146
|
+
`agent-browser`, and Chromium execute as the daemon OS user and can reach that user's files,
|
|
147
|
+
processes, credentials, and network.
|
|
148
|
+
- Supervisor IPC uses a user-private Unix socket and token files with owner-only permissions.
|
|
149
|
+
`agent-browser` IPC metadata and workspace profile directories are also owner-only. The plugin
|
|
150
|
+
rejects a non-loopback CDP endpoint and disables the `agent-browser` stream port.
|
|
151
|
+
- Viewer and control tokens coordinate clients already paired to the same Paseo daemon. Paseo v0.8
|
|
152
|
+
plugin RPC callbacks expose no authenticated caller identity, so these human-viewer tokens are a
|
|
153
|
+
workflow safeguard, not an authorization boundary. The stdio MCP adapter separately uses an
|
|
154
|
+
opaque, workspace-bound credential.
|
|
155
|
+
- Downloads, uploads, clipboard synchronization, media permissions, extensions, native passkeys,
|
|
156
|
+
and platform authenticators are not exposed by this plugin.
|
|
157
|
+
- Browser navigation uses the daemon OS user's network access, including local development servers.
|
|
158
|
+
It is therefore a trusted-agent capability; this plugin deliberately does not apply a blanket
|
|
159
|
+
loopback or RFC1918 navigation ban.
|
|
160
|
+
|
|
161
|
+
## Develop
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
npm ci
|
|
165
|
+
npm run typecheck
|
|
166
|
+
npm run lint
|
|
167
|
+
npm run format:check
|
|
168
|
+
npm run test:unit
|
|
169
|
+
npm run prepare:runtime
|
|
170
|
+
paseo plugin install "$PWD"
|
|
171
|
+
paseo plugin reload shared-browser
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
`npm run test:smoke` launches the configured real Chromium runtime and exercises two viewers,
|
|
175
|
+
control handoff, reconnect, stale-frame rejection, viewport changes, device emulation, profile
|
|
176
|
+
persistence, and archive teardown.
|
|
177
|
+
|
|
178
|
+
Release Please maintains the version, changelog, component tag, and GitHub release from
|
|
179
|
+
Conventional Commits in the monorepo.
|
|
180
|
+
|
|
181
|
+
Both the Paseo daemon and app must satisfy `^0.8.0`, including Paseo 0.8 prereleases. The client
|
|
182
|
+
surface uses React Native primitives and works in desktop, web, iOS, and Android Paseo clients.
|