@quanta-intellect/vessel-browser 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026
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,377 @@
1
+ ![vessel-logo-cropped](https://github.com/user-attachments/assets/58887932-26b3-45b5-be5e-21de562d2855)
2
+
3
+ # Vessel: Your Agent's Browser
4
+
5
+ Open-source browser runtime for persistent web agents on Linux.
6
+
7
+ Vessel gives external agent harnesses a real browser with durable state, MCP control, and a human-visible supervisory UI. It is built for long-running workflows where the agent drives and the human audits, intervenes, and redirects when needed.
8
+
9
+ - **Built for agent harnesses** such as Hermes Agent, OpenClaw, and other MCP clients
10
+ - **Keeps browser state alive** with named sessions, bookmarks, checkpoints, and structured page visibility
11
+ - **Keeps humans in the loop** with approvals, runtime controls, and a visible browser instead of a headless black box
12
+
13
+ *Vessel is in active development and currently makes no security assurances. Use and deploy it with care.*
14
+
15
+ ## Quick Start
16
+
17
+ ### Fastest Install Today
18
+
19
+ The preferred MVP install path is the Linux AppImage from GitHub Releases:
20
+
21
+ 1. Download the latest `Vessel-<version>-x64.AppImage`
22
+ 2. Mark it executable: `chmod +x Vessel-*.AppImage`
23
+ 3. Launch it: `./Vessel-*.AppImage`
24
+ 4. Open Settings (`Ctrl+,`) and confirm the MCP endpoint shown there
25
+
26
+ ### Source Install
27
+
28
+ ```bash
29
+ curl -fsSL https://raw.githubusercontent.com/unmodeled-tyler/quanta-vessel-browser/main/scripts/install.sh | bash
30
+ ```
31
+
32
+ ### Development From Source
33
+
34
+ ```bash
35
+ npm install
36
+ npm run dev
37
+ ```
38
+
39
+ ### Why Vessel?
40
+
41
+ Most browser automation stacks are either headless, stateless, or designed around a human as the primary operator. Vessel is built around the opposite model: the browser is the agent's operating surface, and the human stays in the loop through a visible interface with clear supervisory controls.
42
+
43
+ <img width="1280" height="800" alt="vessel_2026-03-16_144201_7545" src="https://github.com/user-attachments/assets/da7b28ea-6c5f-4aa7-909e-0a255c80d508" />
44
+
45
+ <img width="1280" height="800" alt="vessel_2026-03-17_145154_5389" src="https://github.com/user-attachments/assets/b1c08d6c-bcdf-4c9a-8429-a71a23a61903" />
46
+
47
+ <img width="1280" height="785" alt="vessel_2026-03-16_171108_8677" src="https://github.com/user-attachments/assets/613c285f-0253-4344-b335-f74a64e124ac" />
48
+
49
+
50
+ Vessel is built for persistent web agents that need a real browser, durable state, and a human-visible interface. The agent is the primary operator. The human follows along in the live browser UI, audits what the agent is doing, and steers when needed.
51
+
52
+ Today, Vessel provides the browser shell, page visibility, and supervisory surfaces needed to support that model. The long-term goal is not "a browser with AI features," but a browser runtime for autonomous agents with a clear supervisory experience for humans.
53
+
54
+ ## Features
55
+
56
+ - **Agent-first browser model** — Vessel is designed around an agent driving the browser while a human watches, intervenes, and redirects
57
+ - **Human-visible browser UI** — pages render like a normal browser so agent activity stays legible instead of disappearing into a headless run
58
+ - **Command Bar** (`Ctrl+L`) — a secondary operator surface for harness-driven workflows and future runtime commands
59
+ - **Supervisor Sidebar** (`Ctrl+Shift+L`) — live supervision across four tabs: Supervisor, Bookmarks, Checkpoints, and Chat
60
+ - **Chat Assistant** — built-in conversational AI in the sidebar Chat tab; supports Anthropic, OpenAI, Ollama, Mistral, xAI, Google Gemini, OpenRouter, and any OpenAI-compatible endpoint; reads the current page automatically; has full access to the same browser tools as external agents; multi-turn session history; configure provider, model, and API key in Settings
61
+ - **Dev Tools Panel** (`F12`) — inspect console output, network requests, and MCP/agent activity in a resizable panel at the bottom of the window; export logs by category and date range as JSON
62
+ - **Bookmarks for Agents** — save pages into folders, attach one-line folder summaries, and search bookmarks over MCP instead of dumping the entire library
63
+ - **Named Session Persistence** — save cookies, localStorage, and current tab layout under a reusable name, then reload it after a restart
64
+ - **Structured Page Visibility Context** — extraction can report in-viewport elements, obscured controls, active overlays, and dormant consent/modal UI
65
+ - **Popup Recovery Tools** — agents can explicitly dismiss common popups, newsletter gates, and consent walls instead of brute-forcing generic clicks
66
+ - **Per-Tab Ad Blocking Controls** — tabs default to ad blocking on, but agents can selectively disable and re-enable blocking when a page misbehaves
67
+ - **Obsidian Memory Hooks** — optional vault path for agent-written markdown notes, page captures, and research breadcrumbs
68
+ - **Runtime Health Checks** — startup warnings for MCP port conflicts, unreadable settings, and user-data write failures
69
+ - **Reader Mode** — extract article content into a clean, distraction-free view; toggle on and off from the address bar
70
+ - **Focus Mode** (`Ctrl+Shift+F`) — hide all chrome, content fills the screen
71
+ - **Resizable Panels** — drag the sidebar edge to resize; width persists across sessions
72
+ - **Minimal Dark Theme** — warm dark grays, restrained accent color, and no pure black/white
73
+
74
+ ## Positioning
75
+
76
+ Most browsers treat automation as secondary and assume a human is the primary actor. Vessel is the opposite: it is the browser for the agent, with a visible interface that keeps the human in the loop.
77
+
78
+ That means the product should optimize for:
79
+
80
+ - persistent browser state across tasks and sessions
81
+ - clear visibility into what the agent is doing right now
82
+ - lightweight human intervention instead of constant manual driving
83
+ - a browser runtime that can serve long-lived agent systems such as Hermes Agent or OpenClaw-style harnesses
84
+
85
+ ## Stack
86
+
87
+ | Layer | Technology |
88
+ |-------|-----------|
89
+ | Engine | Chromium (Electron 40) |
90
+ | UI Framework | SolidJS |
91
+ | Language | TypeScript |
92
+ | Build | electron-vite + Vite |
93
+ | AI Control | External agent harnesses (Hermes Agent, OpenClaw, MCP clients) + built-in chat (Anthropic, OpenAI, Ollama, and any OAI-compatible endpoint) |
94
+ | Content Extraction | @mozilla/readability |
95
+
96
+ ## Architecture
97
+
98
+ ```
99
+ Main Process Renderer (SolidJS)
100
+ ├── TabManager (WebContentsView[]) ├── TabBar, AddressBar
101
+ ├── AgentRuntime (session + supervision) ├── CommandBar (secondary surface)
102
+ ├── MCP server for external agents ├── AI Sidebar (Supervisor/Bookmarks/Checkpoints/Chat)
103
+ ├── AI providers (Anthropic + OAI-compat) ├── DevTools Panel (Console/Network/Activity)
104
+ ├── Supervision, bookmarks, checkpoints └── Signal stores (tabs, ai, ui)
105
+ └── IPC Handlers ◄──contextBridge──► Preload API
106
+ ```
107
+
108
+ Each browser tab is a separate `WebContentsView` managed by the main process. The browser chrome (SolidJS) runs in its own view layered on top. All communication between renderer and main goes through typed IPC channels via `contextBridge`.
109
+
110
+ ## Getting Started
111
+
112
+ The installer:
113
+
114
+ - clones or updates Vessel into `~/.local/share/vessel-browser`
115
+ - installs dependencies and builds the app
116
+ - creates a `vessel-browser` launcher in `~/.local/bin`
117
+ - creates a `vessel-browser-launch` helper in `~/.local/bin`
118
+ - creates a `vessel-browser-update` helper in `~/.local/bin`
119
+ - creates a `vessel-browser-status` helper in `~/.local/bin`
120
+ - creates a desktop entry for Linux app launchers
121
+ - writes `~/.config/vessel/vessel-settings.json` with MCP port `3100`
122
+ - writes `~/.config/vessel/mcp-http-snippet.json`
123
+ - prints the exact HTTP MCP snippet to paste into your harness config
124
+
125
+ The packaged AppImage path:
126
+
127
+ - does not require a local Node/Electron toolchain
128
+ - uses the packaged Vessel app icon and metadata
129
+ - is the recommended path for early adopters who just want to run Vessel
130
+
131
+ After install:
132
+
133
+ ```bash
134
+ vessel-browser
135
+ ```
136
+
137
+ ```bash
138
+ # Install dependencies
139
+ npm install
140
+
141
+ # If Electron download fails, use a mirror:
142
+ ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/" npm install
143
+
144
+ # Development (with HMR)
145
+ npm run dev
146
+
147
+ # Production build
148
+ npm run build
149
+
150
+ # Smoke-test the MVP release path
151
+ npm run smoke:test
152
+
153
+ # Package an unpacked Linux app
154
+ npm run dist:dir
155
+
156
+ # Package a Linux AppImage
157
+ npm run dist
158
+ ```
159
+
160
+ Notes:
161
+
162
+ - `npm run dev` still launches the stock Electron binary, so Linux may continue showing the default Electron gear icon in development
163
+ - packaged builds created with `npm run dist` / `npm run dist:dir` use the Vessel app icon
164
+ - the tracked smoke test runs typecheck, build, and the Electron navigation regression harness
165
+ - for headless CI, run the smoke test under `xvfb-run -a npm run smoke:test`
166
+
167
+ ### Setting up Vessel for Hermes Agent or OpenClaw
168
+
169
+ Vessel is designed to act as the browser runtime that your external agent harness drives.
170
+
171
+ 1. Launch Vessel
172
+ 2. Open Settings (`Ctrl+,`) to confirm MCP status, copy the endpoint, or change the MCP port
173
+ 3. Optional: set an Obsidian vault path or session preferences
174
+ 4. Start Hermes Agent or OpenClaw and configure it to connect to Vessel's MCP endpoint at `http://127.0.0.1:<mcpPort>/mcp`
175
+ 5. Use the Supervisor panel in Vessel's sidebar to pause the agent, change approval mode, review pending approvals, checkpoint, or restore the browser session while the harness runs
176
+ 6. Use the Bookmarks panel to organize saved pages into folders and expose those bookmarks back to the agent over MCP
177
+
178
+ Notes:
179
+
180
+ - Vessel exposes browser control to external agents through its local MCP server
181
+ - The default MCP port is `3100`
182
+ - Hermes Agent and OpenClaw should treat Vessel as the persistent, human-visible browser rather than launching their own separate browser session
183
+ - Vessel supports a built-in Chat tab with configurable AI provider; open Settings (`Ctrl+,`) and enable Chat Assistant to set a provider and model
184
+ - Approval policy is controlled live from the sidebar Supervisor panel rather than a separate global settings screen
185
+ - Settings now show MCP runtime status, active endpoint, startup warnings, and allow changing the MCP port with an immediate server restart
186
+ - Agents can selectively disable ad blocking for a problematic tab, reload, retry the flow, and turn blocking back on later
187
+ - Agents can persist authenticated state with named sessions, for example `github-logged-in`, and reload that state in later runs
188
+ - The intended control plane is an external harness driving Vessel through MCP
189
+ - If you set an Obsidian vault path in Settings, harnesses can write markdown notes directly into that vault via Vessel memory MCP tools
190
+
191
+ Initial memory tools:
192
+
193
+ - `vessel_memory_note_create`
194
+ - `vessel_memory_append`
195
+ - `vessel_memory_list`
196
+ - `vessel_memory_search`
197
+ - `vessel_memory_page_capture`
198
+ - `vessel_memory_link_bookmark`
199
+
200
+ Bookmark and folder tools exposed today include:
201
+
202
+ - `vessel_bookmark_list`
203
+ - `vessel_bookmark_search`
204
+ - `vessel_bookmark_open`
205
+ - `vessel_bookmark_save`
206
+ - `vessel_bookmark_remove`
207
+ - `vessel_create_folder`
208
+ - `vessel_folder_rename`
209
+ - `vessel_folder_remove`
210
+
211
+ Page interaction and recovery tools exposed today include:
212
+
213
+ - `vessel_extract_content`
214
+ - `vessel_read_page`
215
+ - `vessel_scroll`
216
+ - `vessel_dismiss_popup`
217
+ - `vessel_set_ad_blocking`
218
+ - `vessel_wait_for`
219
+
220
+ Named session tools exposed today include:
221
+
222
+ - `vessel_save_session`
223
+ - `vessel_load_session`
224
+ - `vessel_list_sessions`
225
+ - `vessel_delete_session`
226
+
227
+ Session files are sensitive because they may contain login cookies and tokens. Vessel stores them under the app user-data directory with restrictive file permissions.
228
+
229
+ Notable extraction modes include:
230
+
231
+ - `visible_only` — only currently visible, in-viewport, unobstructed interactive elements plus active overlays
232
+ - `results_only` — likely primary search/result links only
233
+ - `full` / `summary` / `interactives_only` / `forms_only` / `text_only`
234
+
235
+ The extraction output can distinguish:
236
+
237
+ - active blocking overlays
238
+ - dormant consent/modal UI present in the DOM but not active for the current session or region
239
+
240
+ Generic HTTP MCP config:
241
+
242
+ ```json
243
+ {
244
+ "mcpServers": {
245
+ "vessel": {
246
+ "type": "http",
247
+ "url": "http://127.0.0.1:3100/mcp"
248
+ }
249
+ }
250
+ }
251
+ ```
252
+
253
+ Hermes Agent `config.yaml` MCP config:
254
+
255
+ ```yaml
256
+ mcp_servers:
257
+ vessel:
258
+ url: "http://127.0.0.1:3100/mcp"
259
+ timeout: 180
260
+ connect_timeout: 30
261
+ ```
262
+
263
+ ## Configuration
264
+
265
+ The installer writes both snippets to:
266
+
267
+ - `~/.config/vessel/mcp-http-snippet.json`
268
+ - `~/.config/vessel/mcp-hermes-snippet.yaml`
269
+
270
+ It also installs a helper command:
271
+
272
+ ```bash
273
+ vessel-browser-mcp
274
+ ```
275
+
276
+ Helper examples:
277
+
278
+ ```bash
279
+ # Generic JSON snippet
280
+ vessel-browser-mcp
281
+
282
+ # Hermes-ready YAML snippet
283
+ vessel-browser-mcp --format hermes
284
+
285
+ # Raw MCP endpoint URL
286
+ vessel-browser-mcp --format url
287
+ ```
288
+
289
+ Source install update helpers:
290
+
291
+ ```bash
292
+ # Check whether a source-install update is available
293
+ vessel-browser-update --check
294
+
295
+ # Fetch, rebuild, and update the local source install
296
+ vessel-browser-update
297
+ ```
298
+
299
+ Status helper:
300
+
301
+ ```bash
302
+ # Human-readable local install + MCP status
303
+ vessel-browser-status
304
+
305
+ # Machine-readable status for harnesses
306
+ vessel-browser-status --json
307
+ ```
308
+
309
+ Smart launch helper:
310
+
311
+ ```bash
312
+ # Launch Vessel using the best available local install
313
+ vessel-browser-launch
314
+
315
+ # Show the chosen launch path without starting anything
316
+ vessel-browser-launch --dry-run
317
+ ```
318
+
319
+ `vessel-browser-launch` prefers a healthy source install and falls back to the newest local AppImage when the source install is likely blocked by Electron sandbox permissions.
320
+
321
+ ## Keyboard Shortcuts
322
+
323
+ | Shortcut | Action |
324
+ |----------|--------|
325
+ | `Ctrl+L` | AI Command Bar |
326
+ | `Ctrl+Shift+L` | Toggle AI Sidebar |
327
+ | `Ctrl+Shift+F` | Toggle Focus Mode |
328
+ | `F12` | Toggle Dev Tools Panel |
329
+ | `Ctrl+T` | New Tab |
330
+ | `Ctrl+W` | Close Tab |
331
+ | `Ctrl+,` | Settings |
332
+
333
+ ## Project Structure
334
+
335
+ ```
336
+ src/
337
+ ├── main/ # Electron main process
338
+ │ ├── ai/ # Agent tools, query flow, and AI provider implementations
339
+ │ ├── tabs/ # Tab + TabManager (WebContentsView)
340
+ │ ├── agent/ # Agent runtime, checkpoints, supervision
341
+ │ ├── content/ # Readability extraction, reader mode
342
+ │ ├── config/ # Settings persistence
343
+ │ ├── ipc/ # IPC handler registry
344
+ │ ├── mcp/ # MCP server for external agent control
345
+ │ ├── devtools/ # CDP session management for Dev Tools panel
346
+ │ ├── window.ts # Window layout manager
347
+ │ └── index.ts # App entry point
348
+ ├── preload/ # contextBridge scripts
349
+ │ ├── index.ts # Chrome UI preload
350
+ │ └── content-script.ts # Web page preload (readability)
351
+ ├── renderer/ # SolidJS browser UI
352
+ │ └── src/
353
+ │ ├── components/
354
+ │ │ ├── chrome/ # TitleBar, TabBar, AddressBar
355
+ │ │ ├── ai/ # CommandBar, Sidebar (Supervisor/Bookmarks/Checkpoints/Chat)
356
+ │ │ ├── devtools/ # DevTools panel (Console, Network, Activity)
357
+ │ │ └── shared/ # Settings panel
358
+ │ ├── stores/ # SolidJS signal stores
359
+ │ ├── styles/ # Theme, global CSS
360
+ │ └── lib/ # Keybindings
361
+ └── shared/ # Types + IPC channel constants
362
+ ```
363
+
364
+ ## Design Principles
365
+
366
+ - **Agent first** — the browser is the agent's operating surface, not just a human tool with automation bolted on
367
+ - **Human visible** — the UI should make agent behavior easy to follow, audit, and steer
368
+ - **Persistent by default** — browser state should survive long-running workflows and repeated sessions
369
+ - **Content first** — chrome is 110px, everything else is your page
370
+ - **Easy on the eyes** — warm dark grays, muted text, no visual noise
371
+ - **Linux-native** — frameless window, system font fallbacks, XDG conventions
372
+
373
+ ## License
374
+
375
+ MIT
376
+
377
+ *Developed by Tyler Williams in Portland, Oregon (2026)*
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ const { spawn } = require("child_process");
3
+ const path = require("path");
4
+
5
+ let electronPath;
6
+ try {
7
+ electronPath = require("electron");
8
+ } catch {
9
+ console.error(
10
+ 'Error: "electron" is required but not installed.\n' +
11
+ "Install it with: npm install -g electron"
12
+ );
13
+ process.exit(1);
14
+ }
15
+
16
+ const appPath = path.resolve(__dirname, "..");
17
+
18
+ const child = spawn(electronPath, [appPath], {
19
+ stdio: "inherit",
20
+ env: { ...process.env, ELECTRON_IS_NPM_LAUNCH: "1" },
21
+ });
22
+
23
+ child.on("close", (code) => {
24
+ process.exit(code ?? 0);
25
+ });