@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.
@@ -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
- :root { --bg: #0f172a; --card: #1e293b; --border: #334155; --text: #e2e8f0; --muted: #94a3b8; --accent: #3b82f6; --success: #15803d; --warning: #f59e0b; --danger: #ef4444; --radius: 10px; }
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: #0f172a; border: 1px solid var(--border); padding: 2px 6px; border-radius: 4px; font-size: 13px; color: var(--accent); }
16
- pre { background: #0f172a; border: 1px solid var(--border); padding: 16px; border-radius: var(--radius); overflow-x: auto; margin: 12px 0; font-size: 13px; line-height: 1.5; }
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(--card); border: 1px solid var(--border); border-radius: var(--radius); padding: 20px; margin: 16px 0; }
19
- .tip { background: rgba(59,130,246,0.1); border: 1px solid rgba(59,130,246,0.3); padding: 12px 16px; border-radius: var(--radius); margin: 12px 0; font-size: 13px; }
20
- .warning { background: rgba(245,158,11,0.1); border: 1px solid rgba(245,158,11,0.3); padding: 12px 16px; border-radius: var(--radius); margin: 12px 0; font-size: 13px; }
21
- .danger { background: rgba(239,68,68,0.1); border: 1px solid rgba(239,68,68,0.3); padding: 12px 16px; border-radius: var(--radius); margin: 12px 0; font-size: 13px; }
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(--card); font-weight: 600; }
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: #22c55e; }
29
- .badge-medium { background: rgba(245,158,11,0.2); color: #f59e0b; }
30
- .badge-advanced { background: rgba(239,68,68,0.2); color: #ef4444; }
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">← Back to Dashboard</a>
65
+ <a class="back" href="/dashboard/agents">&#8592; 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
- <th>Provider</th>
48
- <th>Best For</th>
49
- <th>Video Calls</th>
50
- <th>Difficulty</th>
51
- <th>Cost</th>
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 a camera, microphone, or visible display</li>
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 bundled with Playwright and installed automatically when the agent first starts.</p>
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>The agent installs it automatically on first run. If it fails, check disk space (needs ~300MB).</td></tr>
120
- <tr><td>Missing dependencies on Linux</td><td>Install: <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>
121
- <tr><td>"Display not available" in headed mode</td><td>Headed mode requires X11 or Wayland. Use headless mode on servers without a display, or install Xvfb: <code>apt-get install xvfb && Xvfb :99 &</code></td></tr>
122
- <tr><td>Timeout on navigation</td><td>Increase timeout in browser settings. Some sites take longer to load with JavaScript rendering.</td></tr>
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>Tasks requiring a persistent browser session (stay logged in across agent restarts)</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>Running the agent on a headless server but needing browser GUI features</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 — Mac, Windows, Linux)</li>
141
- <li>Chrome configured to accept remote connections</li>
142
- <li>Network access between your AgenticMail server and the Chrome machine</li>
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 you want Chrome to run.</p>
148
- <p><strong>Step 2:</strong> Launch Chrome with remote debugging enabled:</p>
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 the AgenticMail dashboard, enter the address: <code>192.168.x.x:9222</code> (replace with the Mac's IP address)</p>
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 if not already installed:</p>
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 and run:</p>
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 2:</strong> Allow Chrome through Windows Firewall when prompted (or add a rule for port 9222).</p>
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>Best Option</th><th>Notes</th></tr>
205
- <tr><td>AWS</td><td>EC2 with Ubuntu Desktop AMI, or WorkSpaces</td><td>Use t3.medium+. Open port 9222 in security group (restrict to your AgenticMail IP).</td></tr>
206
- <tr><td>Azure</td><td>Azure Virtual Desktop or VM with Desktop</td><td>Use B2s or larger. Open port 9222 in NSG.</td></tr>
207
- <tr><td>Google Cloud</td><td>Compute Engine with Desktop</td><td>Use e2-medium+. Open port 9222 in firewall rules.</td></tr>
208
- <tr><td>Hetzner</td><td>Cloud Server with Ubuntu Desktop</td><td>Very cost-effective (~€4/mo). Open port 9222 in firewall.</td></tr>
209
- <tr><td>DigitalOcean</td><td>Droplet with Desktop</td><td>Use 2GB+ RAM. Open port 9222 in firewall.</td></tr>
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 (~&#8364;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;">For all cloud VMs: follow the Linux setup above, then configure the firewall to only allow connections from your AgenticMail server's IP address.</p>
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 note:</strong> Chrome's remote debugging port has NO authentication by default. Anyone who can reach port 9222 has full browser control. Always restrict access.</div>
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>Ensure SSH access to the remote machine is configured (SSH key recommended)</li>
230
- <li>In the dashboard, set the Remote Browser Address to <code>localhost:9222</code></li>
231
- <li>In the SSH Tunnel field, enter: <code>user@remote-host</code></li>
232
- <li>We automatically create the tunnel (<code>ssh -L 9222:localhost:9222 user@remote-host</code>) before connecting</li>
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: (1) Chrome is running with --remote-debugging-port, (2) firewall allows the connection, (3) IP/port are correct</td></tr>
241
- <tr><td>"Connection refused"</td><td>Chrome may not be listening on all interfaces. Ensure <code>--remote-debugging-address=0.0.0.0</code> is set (or use SSH tunnel with localhost)</td></tr>
242
- <tr><td>"WebSocket handshake failed"</td><td>The WebSocket URL changes each time Chrome starts. Use the host:port format (e.g., <code>192.168.1.100:9222</code>) and we auto-discover the current URL</td></tr>
243
- <tr><td>"No cameras found" in video call</td><td>The remote machine needs a camera (physical or virtual). On Linux: <code>sudo modprobe v4l2loopback</code></td></tr>
244
- <tr><td>"No audio" in video call</td><td>Install PulseAudio on Linux. On macOS/Windows, audio should work automatically.</td></tr>
245
- <tr><td>SSH tunnel fails</td><td>Check: (1) SSH key is configured (no password prompt), (2) remote host is reachable, (3) user has login access</td></tr>
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>Go to your <a href="https://www.browserless.io/dashboard" target="_blank">dashboard</a> and copy your API token</li>
265
- <li>Paste the token in the AgenticMail dashboard under Browser → Browserless → API Token</li>
266
- <li>Click "Test Connection" to verify</li>
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>Go to <a href="https://www.browserbase.com/settings" target="_blank">Settings</a> and copy your API key</li>
298
- <li>Copy your Project ID from the dashboard</li>
299
- <li>Enter both in the AgenticMail dashboard under Browser → Browserbase</li>
300
- <li>Click "Test Connection" to verify</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
- <p>Open-source browser API designed for AI agents. Can be self-hosted for free or used as a managed cloud service. Built-in session management and stealth capabilities.</p>
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 your API key from the dashboard</li>
321
- <li>Enter it in AgenticMail under Browser → Steel</li>
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 your API key from the <a href="https://www.scrapingbee.com/dashboard" target="_blank">dashboard</a></li>
348
- <li>Enter it in AgenticMail under Browser → ScrapingBee</li>
349
- <li>Click "Test Connection" — you'll see your remaining API credits</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;">For all providers</h3>
260
+ <h3 style="margin-top: 0;">All providers</h3>
361
261
  <ul>
362
- <li><strong>Use domain allowlists:</strong> Restrict which websites agents can visit in Security & Limits</li>
363
- <li><strong>Set page limits:</strong> Limit concurrent pages to prevent runaway browsing</li>
364
- <li><strong>Enable SSRF protection:</strong> Blocks navigation to internal/private IPs (enabled by default)</li>
365
- <li><strong>Rotate API keys:</strong> Change cloud provider API keys periodically</li>
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 to the public internet</strong> without a firewall or SSH tunnel</li>
371
- <li><strong>Use SSH tunnels</strong> for the most secure connection (all traffic encrypted)</li>
372
- <li><strong>Use a dedicated Chrome profile</strong> (--user-data-dir) — don't use your personal browser</li>
373
- <li><strong>Run Chrome as a non-root user</strong> on Linux</li>
374
- <li><strong>Keep Chrome updated</strong> — remote debugging inherits all Chrome vulnerabilities</li>
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>API keys are encrypted:</strong> All credentials are stored encrypted in the AgenticMail vault</li>
380
- <li><strong>Use provider IP allowlists:</strong> Most cloud browser providers let you restrict API access by IP</li>
381
- <li><strong>Monitor usage:</strong> Set up alerts on your cloud provider dashboard for unusual usage</li>
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 browser providers?</h3>
390
- <p>No. Cloud providers (Browserless, Browserbase, Steel, ScrapingBee) don't have camera or microphone access. For video calls, use <strong>Remote CDP</strong> connected to a machine with a camera and microphone (physical or virtual).</p>
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 is fastest (no network latency). For cloud providers, Browserless and Steel are typically fastest for page loads. Browserbase adds session management overhead but is the most reliable for complex automations.</p>
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. Browser sessions are independent of each other. Switching providers in the dashboard takes effect on the next browser action. Note: cookies and login sessions from one provider don't transfer to another.</p>
397
-
398
- <h3>What if my cloud provider goes down?</h3>
399
- <p>The agent will fall back to local Chromium automatically if the cloud provider connection fails (configurable in Security & Limits).</p>
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<br>
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-T4DN77PH.js";
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-J3J5XEWS.js";
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-MCQ2Q4SC.js";
45
+ } from "./chunk-DD36VGKL.js";
46
46
  import "./chunk-OF4MUWWS.js";
47
47
  import {
48
48
  PROVIDER_REGISTRY,