@agenticmail/enterprise 0.5.238 → 0.5.239
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/dist/agent-heartbeat-FF6ASUZ4.js +510 -0
- package/dist/chunk-DD36VGKL.js +3778 -0
- package/dist/chunk-FORLAPWB.js +4463 -0
- package/dist/chunk-TCQTHG7L.js +1224 -0
- package/dist/cli-agent-G4FLS4M5.js +1721 -0
- package/dist/cli-serve-CO5UAKD2.js +114 -0
- package/dist/cli.js +3 -3
- package/dist/dashboard/docs/browser-providers.html +149 -258
- package/dist/index.js +3 -3
- package/dist/routes-4YJNJJSS.js +13245 -0
- package/dist/runtime-2AQSHJKC.js +45 -0
- package/dist/server-IQME5P6B.js +15 -0
- package/dist/setup-AEBSFYUE.js +20 -0
- package/package.json +1 -1
- package/src/dashboard/docs/browser-providers.html +149 -258
- package/src/engine/agent-routes.ts +186 -13
|
@@ -5,406 +5,297 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>Browser Provider Setup Guide — AgenticMail Enterprise</title>
|
|
7
7
|
<style>
|
|
8
|
-
|
|
8
|
+
/* ── Inherit from the main dashboard theme via CSS custom properties ── */
|
|
9
|
+
:root {
|
|
10
|
+
--bg-primary: #0f172a; --bg-secondary: #1e293b; --bg-tertiary: #334155;
|
|
11
|
+
--text-primary: #e2e8f0; --text-secondary: #cbd5e1; --text-muted: #94a3b8;
|
|
12
|
+
--accent: #3b82f6; --accent-soft: rgba(59,130,246,0.12);
|
|
13
|
+
--border: #334155; --radius: 10px;
|
|
14
|
+
--success: #15803d; --warning: #f59e0b; --danger: #ef4444;
|
|
15
|
+
--info-soft: rgba(59,130,246,0.08);
|
|
16
|
+
}
|
|
17
|
+
/* Light theme (warm golden — matches dashboard) */
|
|
18
|
+
[data-theme="light"] {
|
|
19
|
+
--bg-primary: #d0c5a0; --bg-secondary: #ddd3b2; --bg-tertiary: #c8bc94;
|
|
20
|
+
--text-primary: #2c2410; --text-secondary: #3d3520; --text-muted: #6b5e42;
|
|
21
|
+
--accent: #2563eb; --accent-soft: rgba(37,99,235,0.1);
|
|
22
|
+
--border: #b8ad8a; --info-soft: rgba(37,99,235,0.06);
|
|
23
|
+
}
|
|
9
24
|
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
10
|
-
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg); color: var(--text); line-height: 1.7; padding: 32px; max-width: 900px; margin: 0 auto; }
|
|
25
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg-primary); color: var(--text-primary); line-height: 1.7; padding: 32px; max-width: 900px; margin: 0 auto; }
|
|
11
26
|
h1 { font-size: 28px; margin-bottom: 8px; }
|
|
12
27
|
h2 { font-size: 20px; margin: 32px 0 12px; padding-bottom: 8px; border-bottom: 1px solid var(--border); }
|
|
13
28
|
h3 { font-size: 16px; margin: 20px 0 8px; color: var(--accent); }
|
|
14
|
-
p { margin-bottom: 12px; }
|
|
15
|
-
code { background:
|
|
16
|
-
pre { background:
|
|
29
|
+
p { margin-bottom: 12px; color: var(--text-secondary); }
|
|
30
|
+
code { background: var(--bg-primary); border: 1px solid var(--border); padding: 2px 6px; border-radius: 4px; font-size: 13px; color: var(--accent); }
|
|
31
|
+
pre { background: var(--bg-primary); border: 1px solid var(--border); padding: 16px; border-radius: var(--radius); overflow-x: auto; margin: 12px 0; font-size: 13px; line-height: 1.5; color: var(--text-secondary); }
|
|
17
32
|
pre code { background: none; border: none; padding: 0; }
|
|
18
|
-
.card { background: var(--
|
|
19
|
-
.tip { background:
|
|
20
|
-
.warning { background: rgba(245,158,11,0.
|
|
21
|
-
.danger { background: rgba(239,68,68,0.
|
|
33
|
+
.card { background: var(--bg-secondary); border: 1px solid var(--border); border-radius: var(--radius); padding: 20px; margin: 16px 0; }
|
|
34
|
+
.tip { background: var(--info-soft); border: 1px solid rgba(59,130,246,0.3); padding: 12px 16px; border-radius: var(--radius); margin: 12px 0; font-size: 13px; color: var(--text-secondary); }
|
|
35
|
+
.warning { background: rgba(245,158,11,0.08); border: 1px solid rgba(245,158,11,0.3); padding: 12px 16px; border-radius: var(--radius); margin: 12px 0; font-size: 13px; color: var(--text-secondary); }
|
|
36
|
+
.danger { background: rgba(239,68,68,0.08); border: 1px solid rgba(239,68,68,0.3); padding: 12px 16px; border-radius: var(--radius); margin: 12px 0; font-size: 13px; color: var(--text-secondary); }
|
|
22
37
|
table { width: 100%; border-collapse: collapse; margin: 12px 0; font-size: 13px; }
|
|
23
|
-
th, td { text-align: left; padding: 8px 12px; border: 1px solid var(--border); }
|
|
24
|
-
th { background: var(--
|
|
25
|
-
ul, ol { padding-left: 24px; margin-bottom: 12px; }
|
|
38
|
+
th, td { text-align: left; padding: 8px 12px; border: 1px solid var(--border); color: var(--text-secondary); }
|
|
39
|
+
th { background: var(--bg-secondary); font-weight: 600; color: var(--text-primary); }
|
|
40
|
+
ul, ol { padding-left: 24px; margin-bottom: 12px; color: var(--text-secondary); }
|
|
26
41
|
li { margin-bottom: 6px; }
|
|
27
42
|
.badge { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 11px; font-weight: 600; }
|
|
28
|
-
.badge-easy { background: rgba(21,128,61,0.2); color:
|
|
29
|
-
.badge-medium { background: rgba(245,158,11,0.2); color:
|
|
30
|
-
.badge-advanced { background: rgba(239,68,68,0.2); color:
|
|
43
|
+
.badge-easy { background: rgba(21,128,61,0.2); color: var(--success); }
|
|
44
|
+
.badge-medium { background: rgba(245,158,11,0.2); color: var(--warning); }
|
|
45
|
+
.badge-advanced { background: rgba(239,68,68,0.2); color: var(--danger); }
|
|
31
46
|
a { color: var(--accent); }
|
|
32
|
-
.back { display: inline-block; margin-bottom: 20px; font-size: 13px; color: var(--muted); text-decoration: none; }
|
|
33
|
-
.back:hover { color: var(--text); }
|
|
47
|
+
.back { display: inline-block; margin-bottom: 20px; font-size: 13px; color: var(--text-muted); text-decoration: none; }
|
|
48
|
+
.back:hover { color: var(--text-primary); }
|
|
49
|
+
strong { color: var(--text-primary); }
|
|
34
50
|
</style>
|
|
51
|
+
<script>
|
|
52
|
+
// Sync theme with dashboard preference
|
|
53
|
+
(function() {
|
|
54
|
+
var saved = localStorage.getItem('em-theme');
|
|
55
|
+
if (saved === 'light') document.documentElement.setAttribute('data-theme', 'light');
|
|
56
|
+
else if (saved === 'dark') document.documentElement.setAttribute('data-theme', 'dark');
|
|
57
|
+
else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) {
|
|
58
|
+
document.documentElement.setAttribute('data-theme', 'light');
|
|
59
|
+
}
|
|
60
|
+
})();
|
|
61
|
+
</script>
|
|
35
62
|
</head>
|
|
36
63
|
<body>
|
|
37
64
|
|
|
38
|
-
<a class="back" href="/dashboard/agents"
|
|
65
|
+
<a class="back" href="/dashboard/agents">← Back to Dashboard</a>
|
|
39
66
|
|
|
40
67
|
<h1>Browser Provider Setup Guide</h1>
|
|
41
|
-
<p style="color: var(--muted); margin-bottom: 24px;">Complete reference for connecting your AI agents to browsers — local, remote, or cloud-hosted.</p>
|
|
68
|
+
<p style="color: var(--text-muted); margin-bottom: 24px;">Complete reference for connecting your AI agents to browsers — local, remote, or cloud-hosted.</p>
|
|
42
69
|
|
|
43
70
|
<div class="card">
|
|
44
71
|
<h3 style="margin-top: 0;">Quick Comparison</h3>
|
|
45
72
|
<table>
|
|
46
|
-
<tr>
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
</tr>
|
|
53
|
-
<tr>
|
|
54
|
-
<td><strong>Local Chromium</strong></td>
|
|
55
|
-
<td>Web scraping, form filling, screenshots</td>
|
|
56
|
-
<td>No (headless) / Yes (headed, if display available)</td>
|
|
57
|
-
<td><span class="badge badge-easy">Easy</span></td>
|
|
58
|
-
<td>Free</td>
|
|
59
|
-
</tr>
|
|
60
|
-
<tr>
|
|
61
|
-
<td><strong>Remote CDP</strong></td>
|
|
62
|
-
<td>Video calls, persistent sessions, full browser control</td>
|
|
63
|
-
<td>Yes</td>
|
|
64
|
-
<td><span class="badge badge-medium">Medium</span></td>
|
|
65
|
-
<td>VM cost only</td>
|
|
66
|
-
</tr>
|
|
67
|
-
<tr>
|
|
68
|
-
<td><strong>Browserless.io</strong></td>
|
|
69
|
-
<td>Scalable scraping, stealth browsing, managed infra</td>
|
|
70
|
-
<td>No</td>
|
|
71
|
-
<td><span class="badge badge-easy">Easy</span></td>
|
|
72
|
-
<td>From $0/mo (free tier)</td>
|
|
73
|
-
</tr>
|
|
74
|
-
<tr>
|
|
75
|
-
<td><strong>Browserbase</strong></td>
|
|
76
|
-
<td>AI agent automation, session replay, anti-detection</td>
|
|
77
|
-
<td>No</td>
|
|
78
|
-
<td><span class="badge badge-easy">Easy</span></td>
|
|
79
|
-
<td>From $0/mo (free tier)</td>
|
|
80
|
-
</tr>
|
|
81
|
-
<tr>
|
|
82
|
-
<td><strong>Steel.dev</strong></td>
|
|
83
|
-
<td>Self-hostable, AI-native, session management</td>
|
|
84
|
-
<td>No</td>
|
|
85
|
-
<td><span class="badge badge-medium">Medium</span></td>
|
|
86
|
-
<td>Free (self-hosted) / Paid (cloud)</td>
|
|
87
|
-
</tr>
|
|
88
|
-
<tr>
|
|
89
|
-
<td><strong>ScrapingBee</strong></td>
|
|
90
|
-
<td>Web scraping with proxy rotation, CAPTCHA solving</td>
|
|
91
|
-
<td>No</td>
|
|
92
|
-
<td><span class="badge badge-easy">Easy</span></td>
|
|
93
|
-
<td>From $0/mo (free tier)</td>
|
|
94
|
-
</tr>
|
|
73
|
+
<tr><th>Provider</th><th>Best For</th><th>Video Calls</th><th>Difficulty</th><th>Cost</th></tr>
|
|
74
|
+
<tr><td><strong>Local Chromium</strong></td><td>Web scraping, form filling, screenshots</td><td>No (headless) / Yes (headed + display)</td><td><span class="badge badge-easy">Easy</span></td><td>Free</td></tr>
|
|
75
|
+
<tr><td><strong>Remote CDP</strong></td><td>Video calls, persistent sessions, full control</td><td>Yes</td><td><span class="badge badge-medium">Medium</span></td><td>VM cost only</td></tr>
|
|
76
|
+
<tr><td><strong>Browserless.io</strong></td><td>Scalable scraping, stealth, managed infra</td><td>No</td><td><span class="badge badge-easy">Easy</span></td><td>Free tier available</td></tr>
|
|
77
|
+
<tr><td><strong>Browserbase</strong></td><td>AI automation, session replay, anti-detection</td><td>No</td><td><span class="badge badge-easy">Easy</span></td><td>Free tier available</td></tr>
|
|
78
|
+
<tr><td><strong>Steel.dev</strong></td><td>Self-hostable, AI-native, open-source</td><td>No</td><td><span class="badge badge-medium">Medium</span></td><td>Free (self-hosted)</td></tr>
|
|
79
|
+
<tr><td><strong>ScrapingBee</strong></td><td>Proxy rotation, CAPTCHA solving</td><td>No</td><td><span class="badge badge-easy">Easy</span></td><td>Free tier available</td></tr>
|
|
95
80
|
</table>
|
|
96
81
|
</div>
|
|
97
82
|
|
|
98
|
-
<!-- ═══════════════════════════════════════════ -->
|
|
99
83
|
<h2 id="local">1. Local Chromium (Default)</h2>
|
|
100
|
-
|
|
101
84
|
<p>The simplest option. A headless Chromium browser runs on the same machine as AgenticMail. No external services needed.</p>
|
|
102
|
-
|
|
103
85
|
<h3>When to use</h3>
|
|
104
86
|
<ul>
|
|
105
87
|
<li>Web scraping and data extraction</li>
|
|
106
88
|
<li>Taking screenshots of web pages</li>
|
|
107
89
|
<li>Filling out forms and automating websites</li>
|
|
108
|
-
<li>Any task that doesn't need
|
|
90
|
+
<li>Any task that doesn't need camera, microphone, or visible display</li>
|
|
109
91
|
</ul>
|
|
110
|
-
|
|
111
92
|
<h3>Setup</h3>
|
|
112
|
-
<p>No setup needed — it's the default. Chromium is
|
|
113
|
-
|
|
114
|
-
<div class="tip"><strong>Headed mode:</strong> If your server has a display (desktop, not headless server), you can switch to "Headed" mode in the dashboard to see the browser window. This is useful for debugging.</div>
|
|
115
|
-
|
|
93
|
+
<p>No setup needed — it's the default. Chromium is auto-detected (Google Chrome, system Chromium, or Playwright's bundled Chromium). If none found, we install Playwright Chromium automatically on first launch.</p>
|
|
94
|
+
<div class="tip"><strong>Headed mode:</strong> If your server has a display (desktop machine, not headless server), switch to "Headed" in the dashboard to see the browser window. Useful for debugging.</div>
|
|
116
95
|
<h3>Troubleshooting</h3>
|
|
117
96
|
<table>
|
|
118
97
|
<tr><th>Issue</th><th>Solution</th></tr>
|
|
119
|
-
<tr><td>Chromium not found</td><td>
|
|
120
|
-
<tr><td>Missing dependencies on Linux</td><td
|
|
121
|
-
<tr><td>"Display not available" in headed mode</td><td>Headed mode requires X11
|
|
122
|
-
<tr><td>Timeout on navigation</td><td>Increase timeout in browser settings. Some sites
|
|
98
|
+
<tr><td>Chromium not found</td><td>We auto-install on first use. If it fails, check disk space (~300MB needed).</td></tr>
|
|
99
|
+
<tr><td>Missing dependencies on Linux</td><td><code>apt-get install -y libnss3 libatk1.0-0 libatk-bridge2.0-0 libdrm2 libxcomposite1 libxdamage1 libxrandr2 libgbm1 libpango-1.0-0 libasound2</code></td></tr>
|
|
100
|
+
<tr><td>"Display not available" in headed mode</td><td>Headed mode requires X11/Wayland. Use headless on servers, or install Xvfb: <code>apt-get install xvfb && Xvfb :99 &</code></td></tr>
|
|
101
|
+
<tr><td>Timeout on navigation</td><td>Increase timeout in browser settings. Some sites need longer with JS rendering.</td></tr>
|
|
123
102
|
</table>
|
|
124
103
|
|
|
125
|
-
<!-- ═══════════════════════════════════════════ -->
|
|
126
104
|
<h2 id="remote-cdp">2. Remote Browser (CDP)</h2>
|
|
127
|
-
|
|
128
|
-
<p>Connect to a Chrome browser running on another machine. The agent controls it remotely via the Chrome DevTools Protocol. This is the <strong>only option that supports video calls</strong> (Google Meet, Teams, Zoom) because it can access a real camera, microphone, and display on the remote machine.</p>
|
|
129
|
-
|
|
105
|
+
<p>Connect to a Chrome browser running on another machine. The agent controls it remotely via Chrome DevTools Protocol. This is the <strong>only option that supports video calls</strong> (Google Meet, Teams, Zoom) because it can access a real camera, microphone, and display.</p>
|
|
130
106
|
<h3>When to use</h3>
|
|
131
107
|
<ul>
|
|
132
108
|
<li>Video calls and meetings (Google Meet, Microsoft Teams, Zoom)</li>
|
|
133
|
-
<li>
|
|
109
|
+
<li>Persistent browser sessions (stay logged in across restarts)</li>
|
|
134
110
|
<li>When you need a real display, camera, or microphone</li>
|
|
135
|
-
<li>
|
|
111
|
+
<li>Agent on headless server but needs browser GUI</li>
|
|
136
112
|
</ul>
|
|
137
|
-
|
|
138
113
|
<h3>What you need</h3>
|
|
139
114
|
<ol>
|
|
140
|
-
<li>A machine with Google Chrome installed (any OS
|
|
141
|
-
<li>Chrome
|
|
142
|
-
<li>Network access between your AgenticMail server and
|
|
115
|
+
<li>A machine with Google Chrome installed (any OS)</li>
|
|
116
|
+
<li>Chrome launched with remote debugging enabled</li>
|
|
117
|
+
<li>Network access between your AgenticMail server and that machine</li>
|
|
143
118
|
</ol>
|
|
144
119
|
|
|
145
120
|
<h3>Setup: macOS</h3>
|
|
146
121
|
<div class="card">
|
|
147
|
-
<p><strong>Step 1:</strong> Open Terminal on the Mac where
|
|
148
|
-
<p><strong>Step 2:</strong> Launch Chrome with remote debugging
|
|
122
|
+
<p><strong>Step 1:</strong> Open Terminal on the Mac where Chrome should run.</p>
|
|
123
|
+
<p><strong>Step 2:</strong> Launch Chrome with remote debugging:</p>
|
|
149
124
|
<pre><code>/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
|
|
150
125
|
--remote-debugging-port=9222 \
|
|
151
126
|
--remote-debugging-address=0.0.0.0 \
|
|
152
127
|
--user-data-dir=/tmp/chrome-remote \
|
|
153
128
|
--no-first-run</code></pre>
|
|
154
|
-
<p><strong>Step 3:</strong> In
|
|
129
|
+
<p><strong>Step 3:</strong> In AgenticMail dashboard, enter: <code>192.168.x.x:9222</code> (the Mac's IP)</p>
|
|
155
130
|
<p><strong>Step 4:</strong> Click "Test Connection" — you should see the Chrome version.</p>
|
|
156
131
|
</div>
|
|
157
|
-
|
|
158
|
-
<div class="tip"><strong>To run Chrome at startup on macOS:</strong> Create a Launch Agent plist at <code>~/Library/LaunchAgents/com.chrome.remote.plist</code> — or simply add the command to Login Items in System Settings.</div>
|
|
132
|
+
<div class="tip"><strong>Run at startup:</strong> Add the command to Login Items in System Settings, or create a Launch Agent plist at <code>~/Library/LaunchAgents/com.chrome.remote.plist</code>.</div>
|
|
159
133
|
|
|
160
134
|
<h3>Setup: Linux (Ubuntu/Debian)</h3>
|
|
161
135
|
<div class="card">
|
|
162
|
-
<p><strong>Step 1:</strong> Install Chrome
|
|
136
|
+
<p><strong>Step 1:</strong> Install Chrome:</p>
|
|
163
137
|
<pre><code>wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /usr/share/keyrings/google-chrome.gpg
|
|
164
138
|
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome.gpg] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
|
|
165
139
|
sudo apt-get update && sudo apt-get install -y google-chrome-stable</code></pre>
|
|
166
|
-
|
|
167
|
-
<p><strong>Step 2:</strong> For headless servers (no display), install a virtual display:</p>
|
|
140
|
+
<p><strong>Step 2:</strong> For headless servers (no display), install virtual display:</p>
|
|
168
141
|
<pre><code>sudo apt-get install -y xvfb pulseaudio
|
|
169
|
-
# Start virtual display and audio
|
|
170
142
|
Xvfb :99 -screen 0 1920x1080x24 &
|
|
171
143
|
export DISPLAY=:99
|
|
172
144
|
pulseaudio --start</code></pre>
|
|
173
|
-
|
|
174
145
|
<p><strong>Step 3:</strong> Launch Chrome:</p>
|
|
175
146
|
<pre><code>google-chrome-stable \
|
|
176
147
|
--remote-debugging-port=9222 \
|
|
177
148
|
--remote-debugging-address=0.0.0.0 \
|
|
178
|
-
--no-sandbox \
|
|
179
|
-
--disable-gpu \
|
|
149
|
+
--no-sandbox --disable-gpu \
|
|
180
150
|
--user-data-dir=/tmp/chrome-remote \
|
|
181
151
|
--no-first-run &</code></pre>
|
|
182
|
-
|
|
183
|
-
<p><strong>Step 4:</strong> Enter the server IP and port in the dashboard: <code>your-server-ip:9222</code></p>
|
|
152
|
+
<p><strong>Step 4:</strong> Enter <code>your-server-ip:9222</code> in the dashboard.</p>
|
|
184
153
|
</div>
|
|
185
|
-
|
|
186
|
-
<div class="tip"><strong>For video calls on Linux:</strong> Install virtual camera/audio: <code>sudo apt install v4l2loopback-dkms</code> for virtual camera, and PulseAudio virtual sinks for audio routing.</div>
|
|
154
|
+
<div class="tip"><strong>For video calls on Linux:</strong> Virtual camera: <code>sudo apt install v4l2loopback-dkms</code>. Virtual audio: PulseAudio virtual sinks.</div>
|
|
187
155
|
|
|
188
156
|
<h3>Setup: Windows</h3>
|
|
189
157
|
<div class="card">
|
|
190
|
-
<p><strong>Step 1:</strong> Open PowerShell
|
|
158
|
+
<p><strong>Step 1:</strong> Open PowerShell:</p>
|
|
191
159
|
<pre><code>& "C:\Program Files\Google\Chrome\Application\chrome.exe" `
|
|
192
160
|
--remote-debugging-port=9222 `
|
|
193
161
|
--remote-debugging-address=0.0.0.0 `
|
|
194
162
|
--user-data-dir="$env:TEMP\chrome-remote" `
|
|
195
163
|
--no-first-run</code></pre>
|
|
196
|
-
|
|
197
|
-
<p><strong>Step
|
|
198
|
-
<p><strong>Step 3:</strong> Enter the Windows machine's IP and port in the dashboard.</p>
|
|
164
|
+
<p><strong>Step 2:</strong> Allow Chrome through Windows Firewall when prompted.</p>
|
|
165
|
+
<p><strong>Step 3:</strong> Enter the Windows machine's IP:9222 in the dashboard.</p>
|
|
199
166
|
</div>
|
|
200
167
|
|
|
201
168
|
<h3>Setup: Cloud VMs</h3>
|
|
202
169
|
<div class="card">
|
|
203
170
|
<table>
|
|
204
|
-
<tr><th>Provider</th><th>
|
|
205
|
-
<tr><td>AWS</td><td>EC2
|
|
206
|
-
<tr><td>Azure</td><td>
|
|
207
|
-
<tr><td>Google Cloud</td><td>Compute Engine with Desktop</td><td>
|
|
208
|
-
<tr><td>Hetzner</td><td>Cloud Server with Ubuntu Desktop</td><td>
|
|
209
|
-
<tr><td>DigitalOcean</td><td>Droplet with Desktop</td><td>
|
|
171
|
+
<tr><th>Provider</th><th>Recommended</th><th>Notes</th></tr>
|
|
172
|
+
<tr><td>AWS</td><td>EC2 Ubuntu Desktop / WorkSpaces</td><td>t3.medium+. Open port 9222 in security group (restrict to your AgenticMail IP).</td></tr>
|
|
173
|
+
<tr><td>Azure</td><td>Virtual Desktop or VM</td><td>B2s+. Open port 9222 in NSG.</td></tr>
|
|
174
|
+
<tr><td>Google Cloud</td><td>Compute Engine with Desktop</td><td>e2-medium+. Open port 9222 in firewall.</td></tr>
|
|
175
|
+
<tr><td>Hetzner</td><td>Cloud Server with Ubuntu Desktop</td><td>Cost-effective (~€4/mo). Open port 9222.</td></tr>
|
|
176
|
+
<tr><td>DigitalOcean</td><td>Droplet with Desktop</td><td>2GB+ RAM. Open port 9222.</td></tr>
|
|
210
177
|
</table>
|
|
211
|
-
<p style="margin-top: 8px;">
|
|
178
|
+
<p style="margin-top: 8px;">Follow the Linux setup above, then configure firewall to only allow your AgenticMail server's IP.</p>
|
|
212
179
|
</div>
|
|
213
180
|
|
|
214
181
|
<h3>Securing the Connection</h3>
|
|
215
|
-
<div class="warning"><strong>Security
|
|
216
|
-
|
|
217
|
-
<p><strong>Option A: Firewall rules (simplest)</strong></p>
|
|
218
|
-
<p>Only allow your AgenticMail server's IP to connect to port 9222:</p>
|
|
182
|
+
<div class="warning"><strong>Security:</strong> Chrome's debug port has NO authentication by default. Anyone who reaches port 9222 has full browser control. Always restrict access.</div>
|
|
183
|
+
<p><strong>Option A: Firewall (simplest)</strong></p>
|
|
219
184
|
<pre><code># Linux (ufw)
|
|
220
185
|
sudo ufw allow from YOUR_AGENTICMAIL_IP to any port 9222
|
|
221
186
|
|
|
222
187
|
# Linux (iptables)
|
|
223
188
|
sudo iptables -A INPUT -p tcp --dport 9222 -s YOUR_AGENTICMAIL_IP -j ACCEPT
|
|
224
189
|
sudo iptables -A INPUT -p tcp --dport 9222 -j DROP</code></pre>
|
|
225
|
-
|
|
226
190
|
<p><strong>Option B: SSH Tunnel (most secure)</strong></p>
|
|
227
|
-
<p>Don't expose port 9222 at all. Instead, use the SSH Tunnel field in the dashboard:</p>
|
|
228
191
|
<ol>
|
|
229
|
-
<li>
|
|
230
|
-
<li>In the dashboard, set
|
|
231
|
-
<li>In
|
|
232
|
-
<li>We
|
|
192
|
+
<li>Don't expose port 9222 publicly</li>
|
|
193
|
+
<li>In the dashboard, set Remote Browser Address to <code>localhost:9222</code></li>
|
|
194
|
+
<li>In SSH Tunnel field, enter: <code>user@remote-host</code></li>
|
|
195
|
+
<li>We auto-create the tunnel before connecting — all traffic encrypted</li>
|
|
233
196
|
</ol>
|
|
234
197
|
|
|
235
|
-
<div class="tip"><strong>SSH key setup:</strong> On your AgenticMail server, run <code>ssh-keygen</code> if you haven't already, then copy your public key to the remote machine: <code>ssh-copy-id user@remote-host</code></div>
|
|
236
|
-
|
|
237
198
|
<h3>Troubleshooting</h3>
|
|
238
199
|
<table>
|
|
239
200
|
<tr><th>Issue</th><th>Solution</th></tr>
|
|
240
|
-
<tr><td>"Cannot connect to CDP"</td><td>Check:
|
|
241
|
-
<tr><td>"Connection refused"</td><td>
|
|
242
|
-
<tr><td>"WebSocket handshake failed"</td><td>
|
|
243
|
-
<tr><td>
|
|
244
|
-
<tr><td>
|
|
245
|
-
<tr><td>SSH tunnel fails</td><td>Check:
|
|
201
|
+
<tr><td>"Cannot connect to CDP"</td><td>Check: Chrome running with --remote-debugging-port, firewall allows it, IP/port correct</td></tr>
|
|
202
|
+
<tr><td>"Connection refused"</td><td>Ensure <code>--remote-debugging-address=0.0.0.0</code> is set, or use SSH tunnel</td></tr>
|
|
203
|
+
<tr><td>"WebSocket handshake failed"</td><td>Use host:port format (e.g. <code>192.168.1.100:9222</code>) — we auto-discover the WebSocket URL</td></tr>
|
|
204
|
+
<tr><td>No camera in video call</td><td>Remote machine needs a camera (physical or virtual). Linux: <code>sudo modprobe v4l2loopback</code></td></tr>
|
|
205
|
+
<tr><td>No audio</td><td>Install PulseAudio on Linux. macOS/Windows: works automatically.</td></tr>
|
|
206
|
+
<tr><td>SSH tunnel fails</td><td>Check: SSH key configured (no password), host reachable, user has access</td></tr>
|
|
246
207
|
</table>
|
|
247
208
|
|
|
248
|
-
<!-- ═══════════════════════════════════════════ -->
|
|
249
209
|
<h2 id="browserless">3. Browserless.io</h2>
|
|
250
|
-
|
|
251
|
-
<p>A managed cloud browser service. Browserless runs Chrome instances in the cloud and you connect via API token. Great for scalable scraping and automation without managing infrastructure.</p>
|
|
252
|
-
|
|
253
|
-
<h3>When to use</h3>
|
|
254
|
-
<ul>
|
|
255
|
-
<li>High-volume web scraping that needs to scale</li>
|
|
256
|
-
<li>Anti-detection / stealth browsing (bypassing bot detection)</li>
|
|
257
|
-
<li>When you don't want to manage browser infrastructure</li>
|
|
258
|
-
<li>Concurrent browsing sessions across multiple agents</li>
|
|
259
|
-
</ul>
|
|
260
|
-
|
|
210
|
+
<p>Managed cloud browser service. Chrome in the cloud, connect via API token. Scalable and maintenance-free.</p>
|
|
261
211
|
<h3>Setup</h3>
|
|
262
212
|
<ol>
|
|
263
213
|
<li>Sign up at <a href="https://www.browserless.io" target="_blank">browserless.io</a></li>
|
|
264
|
-
<li>
|
|
265
|
-
<li>Paste
|
|
266
|
-
<li>Click "Test Connection"
|
|
214
|
+
<li>Copy your API token from the <a href="https://www.browserless.io/dashboard" target="_blank">dashboard</a></li>
|
|
215
|
+
<li>Paste in AgenticMail → Browser → Browserless → API Token</li>
|
|
216
|
+
<li>Click "Test Connection"</li>
|
|
267
217
|
</ol>
|
|
218
|
+
<h3>Self-hosted</h3>
|
|
219
|
+
<pre><code>docker run -d --name browserless -p 3000:3000 -e TOKEN=your-secret ghcr.io/browserless/chromium</code></pre>
|
|
220
|
+
<p>Set endpoint to <code>ws://your-server:3000</code>.</p>
|
|
221
|
+
<div class="warning"><strong>No video calls.</strong> Cloud browsers don't have camera/mic. Use Remote CDP for meetings.</div>
|
|
268
222
|
|
|
269
|
-
<div class="tip"><strong>Free tier:</strong> Browserless offers a free tier with limited sessions per month — plenty for testing.</div>
|
|
270
|
-
|
|
271
|
-
<h3>Self-hosted Browserless</h3>
|
|
272
|
-
<p>You can run Browserless on your own server using Docker:</p>
|
|
273
|
-
<pre><code>docker run -d --name browserless \
|
|
274
|
-
-p 3000:3000 \
|
|
275
|
-
-e TOKEN=your-secret-token \
|
|
276
|
-
ghcr.io/browserless/chromium</code></pre>
|
|
277
|
-
<p>Then set the endpoint to <code>ws://your-server:3000</code> in the dashboard.</p>
|
|
278
|
-
|
|
279
|
-
<div class="warning"><strong>Note:</strong> Browserless does not support video calls (no camera/mic access). Use Remote CDP for meetings.</div>
|
|
280
|
-
|
|
281
|
-
<!-- ═══════════════════════════════════════════ -->
|
|
282
223
|
<h2 id="browserbase">4. Browserbase</h2>
|
|
283
|
-
|
|
284
|
-
<p>AI-native cloud browser built specifically for agent automation. Offers session replay, anti-detection, and managed infrastructure with a developer-friendly API.</p>
|
|
285
|
-
|
|
286
|
-
<h3>When to use</h3>
|
|
287
|
-
<ul>
|
|
288
|
-
<li>AI agent workflows that need persistent browser sessions</li>
|
|
289
|
-
<li>Session recording and replay for debugging agent actions</li>
|
|
290
|
-
<li>Sites with aggressive anti-bot detection</li>
|
|
291
|
-
<li>When you want the most agent-friendly browser service</li>
|
|
292
|
-
</ul>
|
|
293
|
-
|
|
224
|
+
<p>AI-native cloud browser. Session replay, anti-detection, built for agent automation.</p>
|
|
294
225
|
<h3>Setup</h3>
|
|
295
226
|
<ol>
|
|
296
227
|
<li>Sign up at <a href="https://www.browserbase.com" target="_blank">browserbase.com</a></li>
|
|
297
|
-
<li>
|
|
298
|
-
<li>Copy
|
|
299
|
-
<li>Enter both in
|
|
300
|
-
<li>
|
|
228
|
+
<li>Copy API key from <a href="https://www.browserbase.com/settings" target="_blank">Settings</a></li>
|
|
229
|
+
<li>Copy Project ID from dashboard</li>
|
|
230
|
+
<li>Enter both in AgenticMail → Browser → Browserbase</li>
|
|
231
|
+
<li>"Test Connection"</li>
|
|
301
232
|
</ol>
|
|
233
|
+
<div class="tip"><strong>Session replay:</strong> Watch exactly what your agent did at browserbase.com.</div>
|
|
302
234
|
|
|
303
|
-
<div class="tip"><strong>Session replay:</strong> Browserbase records every session by default. You can watch exactly what your agent did at <a href="https://www.browserbase.com" target="_blank">browserbase.com</a>.</div>
|
|
304
|
-
|
|
305
|
-
<!-- ═══════════════════════════════════════════ -->
|
|
306
235
|
<h2 id="steel">5. Steel.dev</h2>
|
|
307
|
-
|
|
308
|
-
<
|
|
309
|
-
|
|
310
|
-
<h3>When to use</h3>
|
|
311
|
-
<ul>
|
|
312
|
-
<li>Self-hosted browser infrastructure (full control, no vendor lock-in)</li>
|
|
313
|
-
<li>AI agent workflows that need session persistence</li>
|
|
314
|
-
<li>When you want open-source and the ability to customize</li>
|
|
315
|
-
</ul>
|
|
316
|
-
|
|
317
|
-
<h3>Setup: Cloud (managed)</h3>
|
|
236
|
+
<p>Open-source browser API for AI agents. Self-host for free or use managed cloud.</p>
|
|
237
|
+
<h3>Cloud setup</h3>
|
|
318
238
|
<ol>
|
|
319
239
|
<li>Sign up at <a href="https://app.steel.dev" target="_blank">app.steel.dev</a></li>
|
|
320
|
-
<li>Copy
|
|
321
|
-
<li>Enter
|
|
322
|
-
<li>Click "Test Connection" to verify</li>
|
|
240
|
+
<li>Copy API key</li>
|
|
241
|
+
<li>Enter in AgenticMail → Browser → Steel</li>
|
|
323
242
|
</ol>
|
|
243
|
+
<h3>Self-hosted</h3>
|
|
244
|
+
<pre><code>docker run -d --name steel -p 3000:3000 ghcr.io/nichochar/steel-browser:latest</code></pre>
|
|
245
|
+
<p>Set endpoint to <code>http://your-server:3000</code>.</p>
|
|
324
246
|
|
|
325
|
-
<h3>Setup: Self-hosted (Docker)</h3>
|
|
326
|
-
<pre><code>docker run -d --name steel \
|
|
327
|
-
-p 3000:3000 \
|
|
328
|
-
ghcr.io/nichochar/steel-browser:latest</code></pre>
|
|
329
|
-
<p>Set the endpoint to <code>http://your-server:3000</code> and leave the API key empty for local use.</p>
|
|
330
|
-
|
|
331
|
-
<!-- ═══════════════════════════════════════════ -->
|
|
332
247
|
<h2 id="scrapingbee">6. ScrapingBee</h2>
|
|
333
|
-
|
|
334
|
-
<p>Web scraping API with built-in browser rendering, proxy rotation, and CAPTCHA solving. Works differently from other providers — it routes your browser traffic through ScrapingBee's proxy network for anti-detection.</p>
|
|
335
|
-
|
|
336
|
-
<h3>When to use</h3>
|
|
337
|
-
<ul>
|
|
338
|
-
<li>Scraping websites that block bots aggressively</li>
|
|
339
|
-
<li>When you need residential proxy IPs</li>
|
|
340
|
-
<li>CAPTCHA-heavy websites</li>
|
|
341
|
-
<li>Geo-targeted browsing (browse as if from a specific country)</li>
|
|
342
|
-
</ul>
|
|
343
|
-
|
|
248
|
+
<p>Scraping API with proxy rotation and CAPTCHA solving. Routes your browser through their network for anti-detection.</p>
|
|
344
249
|
<h3>Setup</h3>
|
|
345
250
|
<ol>
|
|
346
251
|
<li>Sign up at <a href="https://www.scrapingbee.com" target="_blank">scrapingbee.com</a></li>
|
|
347
|
-
<li>Copy
|
|
348
|
-
<li>Enter
|
|
349
|
-
<li>
|
|
252
|
+
<li>Copy API key from <a href="https://www.scrapingbee.com/dashboard" target="_blank">dashboard</a></li>
|
|
253
|
+
<li>Enter in AgenticMail → Browser → ScrapingBee</li>
|
|
254
|
+
<li>"Test Connection" — shows remaining credits</li>
|
|
350
255
|
</ol>
|
|
256
|
+
<div class="warning"><strong>Proxy-based:</strong> Works differently from other providers. Some advanced Playwright features (file uploads, complex interactions) may not work through the proxy. Use Browserless or Browserbase for those.</div>
|
|
351
257
|
|
|
352
|
-
<div class="tip"><strong>Free tier:</strong> ScrapingBee offers 1,000 free API credits — enough for testing.</div>
|
|
353
|
-
|
|
354
|
-
<div class="warning"><strong>Note:</strong> ScrapingBee works as a proxy, not a direct browser connection. Some advanced Playwright features (like file uploads or complex interactions) may not work through the proxy. For those cases, use Browserless or Browserbase.</div>
|
|
355
|
-
|
|
356
|
-
<!-- ═══════════════════════════════════════════ -->
|
|
357
258
|
<h2 id="security">Security Best Practices</h2>
|
|
358
|
-
|
|
359
259
|
<div class="card">
|
|
360
|
-
<h3 style="margin-top: 0;">
|
|
260
|
+
<h3 style="margin-top: 0;">All providers</h3>
|
|
361
261
|
<ul>
|
|
362
|
-
<li><strong>
|
|
363
|
-
<li><strong>
|
|
364
|
-
<li><strong>
|
|
365
|
-
<li><strong>Rotate API keys:</strong> Change cloud provider
|
|
262
|
+
<li><strong>Domain allowlists:</strong> Restrict which websites agents can visit</li>
|
|
263
|
+
<li><strong>Page limits:</strong> Limit concurrent pages to prevent runaway browsing</li>
|
|
264
|
+
<li><strong>SSRF protection:</strong> Blocks navigation to internal IPs (enabled by default)</li>
|
|
265
|
+
<li><strong>Rotate API keys:</strong> Change cloud provider keys periodically</li>
|
|
366
266
|
</ul>
|
|
367
|
-
|
|
368
|
-
<h3>For Remote CDP specifically</h3>
|
|
267
|
+
<h3>Remote CDP</h3>
|
|
369
268
|
<ul>
|
|
370
|
-
<li><strong>Never expose port 9222
|
|
371
|
-
<li><strong>Use SSH tunnels</strong> for
|
|
372
|
-
<li><strong>
|
|
373
|
-
<li><strong>
|
|
374
|
-
<li><strong>Keep Chrome updated</strong
|
|
269
|
+
<li><strong>Never expose port 9222 publicly</strong> without firewall or SSH tunnel</li>
|
|
270
|
+
<li><strong>Use SSH tunnels</strong> for encrypted connections</li>
|
|
271
|
+
<li><strong>Dedicated Chrome profile</strong> (--user-data-dir) — don't use your personal browser</li>
|
|
272
|
+
<li><strong>Non-root user</strong> on Linux</li>
|
|
273
|
+
<li><strong>Keep Chrome updated</strong></li>
|
|
375
274
|
</ul>
|
|
376
|
-
|
|
377
|
-
<h3>For cloud providers</h3>
|
|
275
|
+
<h3>Cloud providers</h3>
|
|
378
276
|
<ul>
|
|
379
|
-
<li><strong>
|
|
380
|
-
<li><strong>
|
|
381
|
-
<li><strong>
|
|
277
|
+
<li><strong>Credentials encrypted</strong> in AgenticMail vault</li>
|
|
278
|
+
<li><strong>IP allowlists</strong> on provider dashboards</li>
|
|
279
|
+
<li><strong>Usage alerts</strong> for unusual activity</li>
|
|
382
280
|
</ul>
|
|
383
281
|
</div>
|
|
384
282
|
|
|
385
|
-
|
|
386
|
-
<h2 id="faq">Frequently Asked Questions</h2>
|
|
387
|
-
|
|
283
|
+
<h2 id="faq">FAQ</h2>
|
|
388
284
|
<div class="card">
|
|
389
|
-
<h3 style="margin-top: 0;">Can I use video calls with cloud
|
|
390
|
-
<p>No. Cloud providers
|
|
391
|
-
|
|
285
|
+
<h3 style="margin-top: 0;">Can I use video calls with cloud providers?</h3>
|
|
286
|
+
<p>No. Cloud providers don't have camera/mic. Use <strong>Remote CDP</strong> for meetings.</p>
|
|
392
287
|
<h3>Which provider is fastest?</h3>
|
|
393
|
-
<p>Local Chromium
|
|
394
|
-
|
|
288
|
+
<p>Local Chromium (no network latency). For cloud: Browserless and Steel are fastest.</p>
|
|
395
289
|
<h3>Can I switch providers without losing anything?</h3>
|
|
396
|
-
<p>Yes.
|
|
397
|
-
|
|
398
|
-
<
|
|
399
|
-
<
|
|
400
|
-
|
|
401
|
-
<h3>How do I use multiple browsers for different tasks?</h3>
|
|
402
|
-
<p>Each agent has its own browser configuration. Create different agents for different purposes — one with Remote CDP for meetings, another with Browserless for scraping.</p>
|
|
290
|
+
<p>Yes. Sessions are independent. Switching takes effect on next browser action. Cookies don't transfer between providers.</p>
|
|
291
|
+
<h3>What if cloud provider goes down?</h3>
|
|
292
|
+
<p>Agent falls back to local Chromium automatically.</p>
|
|
293
|
+
<h3>Multiple browsers for different tasks?</h3>
|
|
294
|
+
<p>Each agent has its own browser config. Create different agents for different purposes.</p>
|
|
403
295
|
</div>
|
|
404
296
|
|
|
405
|
-
<p style="margin-top: 32px; color: var(--muted); font-size: 12px; text-align: center;">
|
|
406
|
-
AgenticMail Enterprise — Browser Provider Setup Guide
|
|
407
|
-
Need help? Contact support or check the <a href="https://docs.agenticmail.io" style="color: var(--muted);">full documentation</a>.
|
|
297
|
+
<p style="margin-top: 32px; color: var(--text-muted); font-size: 12px; text-align: center;">
|
|
298
|
+
AgenticMail Enterprise — Browser Provider Setup Guide
|
|
408
299
|
</p>
|
|
409
300
|
|
|
410
301
|
</body>
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
provision,
|
|
9
9
|
runSetupWizard
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-TCQTHG7L.js";
|
|
11
11
|
import {
|
|
12
12
|
AgenticMailManager,
|
|
13
13
|
GoogleEmailProvider,
|
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
executeTool,
|
|
29
29
|
runAgentLoop,
|
|
30
30
|
toolsToDefinitions
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-FORLAPWB.js";
|
|
32
32
|
import {
|
|
33
33
|
ValidationError,
|
|
34
34
|
auditLogger,
|
|
@@ -42,7 +42,7 @@ import {
|
|
|
42
42
|
requireRole,
|
|
43
43
|
securityHeaders,
|
|
44
44
|
validate
|
|
45
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-DD36VGKL.js";
|
|
46
46
|
import "./chunk-OF4MUWWS.js";
|
|
47
47
|
import {
|
|
48
48
|
PROVIDER_REGISTRY,
|