@agenticmail/enterprise 0.5.84 → 0.5.85

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.
@@ -0,0 +1,49 @@
1
+ import {
2
+ AgentRuntime,
3
+ EmailChannel,
4
+ FollowUpScheduler,
5
+ SessionManager,
6
+ SubAgentManager,
7
+ ToolRegistry,
8
+ callLLM,
9
+ createAgentRuntime,
10
+ createNoopHooks,
11
+ createRuntimeHooks,
12
+ estimateMessageTokens,
13
+ estimateTokens,
14
+ executeTool,
15
+ runAgentLoop,
16
+ toolsToDefinitions
17
+ } from "./chunk-CETB63LZ.js";
18
+ import "./chunk-TGOSFAYW.js";
19
+ import "./chunk-TYW5XTOW.js";
20
+ import "./chunk-AQH4DFYV.js";
21
+ import "./chunk-JLSQOQ5L.js";
22
+ import {
23
+ PROVIDER_REGISTRY,
24
+ listAllProviders,
25
+ resolveApiKeyForProvider,
26
+ resolveProvider
27
+ } from "./chunk-67KZYSLU.js";
28
+ import "./chunk-KFQGP6VL.js";
29
+ export {
30
+ AgentRuntime,
31
+ EmailChannel,
32
+ FollowUpScheduler,
33
+ PROVIDER_REGISTRY,
34
+ SessionManager,
35
+ SubAgentManager,
36
+ ToolRegistry,
37
+ callLLM,
38
+ createAgentRuntime,
39
+ createNoopHooks,
40
+ createRuntimeHooks,
41
+ estimateMessageTokens,
42
+ estimateTokens,
43
+ executeTool,
44
+ listAllProviders,
45
+ resolveApiKeyForProvider,
46
+ resolveProvider,
47
+ runAgentLoop,
48
+ toolsToDefinitions
49
+ };
@@ -0,0 +1,12 @@
1
+ import {
2
+ createServer
3
+ } from "./chunk-PHZS6OIO.js";
4
+ import "./chunk-3SMTCIR4.js";
5
+ import "./chunk-JLSQOQ5L.js";
6
+ import "./chunk-RO537U6H.js";
7
+ import "./chunk-DRXMYYKN.js";
8
+ import "./chunk-67KZYSLU.js";
9
+ import "./chunk-KFQGP6VL.js";
10
+ export {
11
+ createServer
12
+ };
@@ -0,0 +1,20 @@
1
+ import {
2
+ promptCompanyInfo,
3
+ promptDatabase,
4
+ promptDeployment,
5
+ promptDomain,
6
+ promptRegistration,
7
+ provision,
8
+ runSetupWizard
9
+ } from "./chunk-LOA5LNXR.js";
10
+ import "./chunk-QDXUZP7Y.js";
11
+ import "./chunk-KFQGP6VL.js";
12
+ export {
13
+ promptCompanyInfo,
14
+ promptDatabase,
15
+ promptDeployment,
16
+ promptDomain,
17
+ promptRegistration,
18
+ provision,
19
+ runSetupWizard
20
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agenticmail/enterprise",
3
- "version": "0.5.84",
3
+ "version": "0.5.85",
4
4
  "description": "AgenticMail Enterprise — cloud-hosted AI agent identity, email, auth & compliance for organizations",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,309 @@
1
+ #!/bin/bash
2
+ # ─────────────────────────────────────────────────────────────
3
+ # AgenticMail Enterprise — VM Setup Script
4
+ #
5
+ # Sets up a Linux VM (Ubuntu 22.04/24.04) with everything needed
6
+ # for full enterprise agent capabilities including:
7
+ # - Node.js 22
8
+ # - Chromium (headed via Xvfb virtual display)
9
+ # - PulseAudio (virtual audio for meetings)
10
+ # - v4l2loopback (virtual camera)
11
+ # - FFmpeg (recording/transcoding)
12
+ # - PostgreSQL client
13
+ # - Systemd service for auto-start
14
+ #
15
+ # Usage:
16
+ # curl -fsSL https://raw.githubusercontent.com/agenticmail/enterprise/main/scripts/vm-setup.sh | bash
17
+ # # or
18
+ # bash vm-setup.sh
19
+ #
20
+ # Tested on: Ubuntu 22.04 LTS, Ubuntu 24.04 LTS, Debian 12
21
+ # Recommended: Hetzner CPX31 (4 vCPU, 8GB RAM) — $15/mo
22
+ # ─────────────────────────────────────────────────────────────
23
+
24
+ set -euo pipefail
25
+
26
+ # Colors
27
+ RED='\033[0;31m'
28
+ GREEN='\033[0;32m'
29
+ YELLOW='\033[1;33m'
30
+ BLUE='\033[0;34m'
31
+ NC='\033[0m'
32
+
33
+ log() { echo -e "${GREEN}[✓]${NC} $*"; }
34
+ warn() { echo -e "${YELLOW}[!]${NC} $*"; }
35
+ err() { echo -e "${RED}[✗]${NC} $*"; exit 1; }
36
+ step() { echo -e "\n${BLUE}━━━ $* ━━━${NC}"; }
37
+
38
+ # Must be root or sudo
39
+ if [ "$(id -u)" -ne 0 ]; then
40
+ err "Run as root: sudo bash vm-setup.sh"
41
+ fi
42
+
43
+ AGENT_USER="${AGENT_USER:-agenticmail}"
44
+ AGENT_HOME="/home/${AGENT_USER}"
45
+ AGENT_PORT="${AGENT_PORT:-8080}"
46
+ NODE_VERSION="22"
47
+
48
+ step "1/8 — System Update"
49
+ export DEBIAN_FRONTEND=noninteractive
50
+ apt-get update -qq
51
+ apt-get upgrade -y -qq
52
+ log "System updated"
53
+
54
+ step "2/8 — Install Core Dependencies"
55
+ apt-get install -y -qq \
56
+ curl wget git unzip jq \
57
+ build-essential \
58
+ ca-certificates gnupg \
59
+ fonts-liberation fonts-noto-color-emoji \
60
+ libatk-bridge2.0-0 libatk1.0-0 libcups2 libdrm2 \
61
+ libgbm1 libgtk-3-0 libnss3 libxcomposite1 libxdamage1 \
62
+ libxfixes3 libxrandr2 libxss1 libpango-1.0-0 \
63
+ xdg-utils libasound2 \
64
+ > /dev/null
65
+ log "Core dependencies installed"
66
+
67
+ step "3/8 — Node.js ${NODE_VERSION}"
68
+ if ! command -v node &>/dev/null || ! node -v | grep -q "v${NODE_VERSION}"; then
69
+ curl -fsSL https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash - > /dev/null 2>&1
70
+ apt-get install -y -qq nodejs > /dev/null
71
+ fi
72
+ log "Node.js $(node -v) installed"
73
+
74
+ step "4/8 — Chromium + Xvfb (Virtual Display)"
75
+ apt-get install -y -qq chromium-browser xvfb > /dev/null 2>&1 || \
76
+ apt-get install -y -qq chromium xvfb > /dev/null 2>&1
77
+ CHROMIUM_PATH=$(which chromium-browser 2>/dev/null || which chromium 2>/dev/null || echo "")
78
+ if [ -z "$CHROMIUM_PATH" ]; then
79
+ warn "Chromium not found in repos, trying snap..."
80
+ snap install chromium 2>/dev/null || true
81
+ CHROMIUM_PATH="/snap/bin/chromium"
82
+ fi
83
+ log "Chromium installed at: $CHROMIUM_PATH"
84
+ log "Xvfb installed"
85
+
86
+ step "5/8 — PulseAudio + Virtual Audio"
87
+ apt-get install -y -qq pulseaudio pulseaudio-utils > /dev/null
88
+ log "PulseAudio installed"
89
+
90
+ # v4l2loopback for virtual camera
91
+ apt-get install -y -qq v4l2loopback-dkms v4l2loopback-utils > /dev/null 2>&1 || \
92
+ warn "v4l2loopback not available (kernel headers may be needed). Virtual camera skipped."
93
+ log "Virtual audio + camera setup complete"
94
+
95
+ step "6/8 — FFmpeg"
96
+ apt-get install -y -qq ffmpeg > /dev/null
97
+ log "FFmpeg $(ffmpeg -version 2>&1 | head -1 | awk '{print $3}') installed"
98
+
99
+ step "7/8 — Create Agent User + Application"
100
+ # Create user if doesn't exist
101
+ if ! id "$AGENT_USER" &>/dev/null; then
102
+ useradd -m -s /bin/bash "$AGENT_USER"
103
+ log "Created user: $AGENT_USER"
104
+ else
105
+ log "User $AGENT_USER already exists"
106
+ fi
107
+
108
+ # Create app directory
109
+ mkdir -p "${AGENT_HOME}/app" "${AGENT_HOME}/data" "${AGENT_HOME}/recordings"
110
+ chown -R "${AGENT_USER}:${AGENT_USER}" "${AGENT_HOME}"
111
+
112
+ # Install enterprise package
113
+ cat > "${AGENT_HOME}/app/package.json" << 'PKGJSON'
114
+ {
115
+ "name": "agenticmail-enterprise-vm",
116
+ "private": true,
117
+ "type": "module",
118
+ "dependencies": {
119
+ "@agenticmail/enterprise": "0.5.84",
120
+ "pg": "^8.18.0",
121
+ "playwright-core": "^1.50.0",
122
+ "ws": "^8.18.0",
123
+ "imapflow": "^1.0.171",
124
+ "nodemailer": "^6.10.0"
125
+ }
126
+ }
127
+ PKGJSON
128
+
129
+ cat > "${AGENT_HOME}/app/entrypoint.mjs" << 'ENTRY'
130
+ import { createServer, startServer } from '@agenticmail/enterprise';
131
+ import pg from 'pg';
132
+
133
+ const { Pool } = pg;
134
+ const pool = new Pool({ connectionString: process.env.DATABASE_URL, ssl: { rejectUnauthorized: false } });
135
+ const db = { query: (sql, params) => pool.query(sql, params) };
136
+
137
+ const server = createServer({ db, port: parseInt(process.env.PORT || '8080') });
138
+ await startServer(server);
139
+ console.log(`[enterprise] Running on port ${process.env.PORT || 8080} | VM deployment`);
140
+ ENTRY
141
+
142
+ cd "${AGENT_HOME}/app"
143
+ su - "$AGENT_USER" -c "cd ~/app && npm install --production" 2>/dev/null
144
+ log "Enterprise application installed"
145
+
146
+ step "8/8 — Systemd Services"
147
+
148
+ # Xvfb service (virtual display)
149
+ cat > /etc/systemd/system/xvfb.service << EOF
150
+ [Unit]
151
+ Description=Xvfb Virtual Display
152
+ After=network.target
153
+
154
+ [Service]
155
+ Type=simple
156
+ User=${AGENT_USER}
157
+ ExecStart=/usr/bin/Xvfb :99 -screen 0 1920x1080x24 -ac +extension GLX +render -noreset
158
+ Environment=DISPLAY=:99
159
+ Restart=always
160
+ RestartSec=5
161
+
162
+ [Install]
163
+ WantedBy=multi-user.target
164
+ EOF
165
+
166
+ # PulseAudio service (virtual audio)
167
+ cat > /etc/systemd/system/pulseaudio-virtual.service << EOF
168
+ [Unit]
169
+ Description=PulseAudio Virtual Audio
170
+ After=xvfb.service
171
+ Requires=xvfb.service
172
+
173
+ [Service]
174
+ Type=simple
175
+ User=${AGENT_USER}
176
+ Environment=HOME=${AGENT_HOME}
177
+ ExecStartPre=/bin/bash -c 'mkdir -p ${AGENT_HOME}/.config/pulse'
178
+ ExecStart=/usr/bin/pulseaudio --daemonize=no --exit-idle-time=-1 --log-level=notice
179
+ ExecStartPost=/bin/bash -c 'sleep 2 && pactl load-module module-null-sink sink_name=virtual_speaker sink_properties=device.description="Virtual_Speaker" && pactl load-module module-virtual-source source_name=virtual_mic master=virtual_speaker.monitor source_properties=device.description="Virtual_Microphone"'
180
+ Restart=always
181
+ RestartSec=5
182
+
183
+ [Install]
184
+ WantedBy=multi-user.target
185
+ EOF
186
+
187
+ # v4l2loopback (virtual camera)
188
+ cat > /etc/systemd/system/v4l2loopback.service << EOF
189
+ [Unit]
190
+ Description=v4l2loopback Virtual Camera
191
+ After=network.target
192
+
193
+ [Service]
194
+ Type=oneshot
195
+ RemainAfterExit=yes
196
+ ExecStart=/sbin/modprobe v4l2loopback devices=1 video_nr=10 card_label="Virtual_Camera" exclusive_caps=1
197
+ ExecStop=/sbin/modprobe -r v4l2loopback
198
+
199
+ [Install]
200
+ WantedBy=multi-user.target
201
+ EOF
202
+
203
+ # Main enterprise agent service
204
+ cat > /etc/systemd/system/agenticmail.service << EOF
205
+ [Unit]
206
+ Description=AgenticMail Enterprise Agent
207
+ After=network.target xvfb.service pulseaudio-virtual.service
208
+ Wants=xvfb.service pulseaudio-virtual.service
209
+
210
+ [Service]
211
+ Type=simple
212
+ User=${AGENT_USER}
213
+ WorkingDirectory=${AGENT_HOME}/app
214
+ EnvironmentFile=${AGENT_HOME}/.env
215
+ Environment=NODE_ENV=production
216
+ Environment=DISPLAY=:99
217
+ Environment=PULSE_SERVER=unix:/run/user/$(id -u ${AGENT_USER})/pulse/native
218
+ Environment=PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=${CHROMIUM_PATH}
219
+ Environment=PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
220
+ Environment=XDG_RUNTIME_DIR=/run/user/$(id -u ${AGENT_USER})
221
+ ExecStart=/usr/bin/node entrypoint.mjs
222
+ Restart=always
223
+ RestartSec=10
224
+ StandardOutput=journal
225
+ StandardError=journal
226
+ SyslogIdentifier=agenticmail
227
+
228
+ # Security hardening
229
+ NoNewPrivileges=true
230
+ ProtectSystem=strict
231
+ ReadWritePaths=${AGENT_HOME} /tmp
232
+ PrivateTmp=true
233
+
234
+ [Install]
235
+ WantedBy=multi-user.target
236
+ EOF
237
+
238
+ # Create .env template
239
+ if [ ! -f "${AGENT_HOME}/.env" ]; then
240
+ cat > "${AGENT_HOME}/.env" << 'ENVFILE'
241
+ # AgenticMail Enterprise — Environment Configuration
242
+ # Edit these values before starting the service.
243
+
244
+ # Required: PostgreSQL connection string
245
+ DATABASE_URL=postgresql://user:password@host:5432/dbname?sslmode=require
246
+
247
+ # Required: JWT secret for API authentication
248
+ JWT_SECRET=change-me-to-a-random-string
249
+
250
+ # Optional: Port (default 8080)
251
+ PORT=8080
252
+
253
+ # These are auto-set by systemd, but can be overridden:
254
+ # DISPLAY=:99
255
+ # PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/chromium-browser
256
+ ENVFILE
257
+ chown "${AGENT_USER}:${AGENT_USER}" "${AGENT_HOME}/.env"
258
+ chmod 600 "${AGENT_HOME}/.env"
259
+ fi
260
+
261
+ # Enable services
262
+ systemctl daemon-reload
263
+ systemctl enable xvfb.service
264
+ systemctl enable pulseaudio-virtual.service
265
+ systemctl enable agenticmail.service
266
+ # Don't enable v4l2loopback by default (may not have kernel module)
267
+ systemctl enable v4l2loopback.service 2>/dev/null || true
268
+
269
+ log "Systemd services created and enabled"
270
+
271
+ # ─── Summary ──────────────────────────────────────────────
272
+
273
+ echo ""
274
+ echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
275
+ echo -e "${GREEN} AgenticMail Enterprise — VM Setup Complete${NC}"
276
+ echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
277
+ echo ""
278
+ echo " Installed:"
279
+ echo " Node.js $(node -v)"
280
+ echo " Chromium ${CHROMIUM_PATH}"
281
+ echo " Xvfb Virtual display :99 (1920x1080)"
282
+ echo " Pulse Virtual audio (speaker + mic)"
283
+ echo " FFmpeg $(ffmpeg -version 2>&1 | head -1 | awk '{print $3}')"
284
+ echo ""
285
+ echo " Next steps:"
286
+ echo ""
287
+ echo " 1. Edit the .env file with your database and secrets:"
288
+ echo " ${YELLOW}sudo nano ${AGENT_HOME}/.env${NC}"
289
+ echo ""
290
+ echo " 2. Start all services:"
291
+ echo " ${YELLOW}sudo systemctl start xvfb${NC}"
292
+ echo " ${YELLOW}sudo systemctl start pulseaudio-virtual${NC}"
293
+ echo " ${YELLOW}sudo systemctl start agenticmail${NC}"
294
+ echo ""
295
+ echo " 3. Check status:"
296
+ echo " ${YELLOW}sudo systemctl status agenticmail${NC}"
297
+ echo " ${YELLOW}sudo journalctl -u agenticmail -f${NC}"
298
+ echo ""
299
+ echo " 4. Update to latest version:"
300
+ echo " ${YELLOW}cd ${AGENT_HOME}/app && npm update @agenticmail/enterprise && sudo systemctl restart agenticmail${NC}"
301
+ echo ""
302
+ echo " Capabilities on this VM:"
303
+ echo " ✓ Headless + headed browser (via Xvfb)"
304
+ echo " ✓ Video meetings (Google Meet, Zoom, Teams)"
305
+ echo " ✓ Meeting recording (ffmpeg)"
306
+ echo " ✓ Google Workspace (Calendar, Drive, Docs, Sheets, Gmail)"
307
+ echo " ✓ Persistent storage"
308
+ echo ""
309
+ echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
@@ -113,6 +113,13 @@ export { createAllGoogleTools, createGmailTools, createGoogleCalendarTools, crea
113
113
  export { createTokenProvider } from './tools/oauth-token-provider.js';
114
114
  export type { TokenProvider, OAuthTokens, TokenProviderConfig } from './tools/oauth-token-provider.js';
115
115
 
116
+ // --- Tool creators (meeting lifecycle) ---
117
+ export { createMeetingLifecycleTools } from './tools/meeting-lifecycle.js';
118
+
119
+ // --- Environment detection ---
120
+ export { detectCapabilities, getCapabilitySummary, resetCapabilitiesCache } from '../runtime/environment.js';
121
+ export type { SystemCapabilities, DeploymentType } from '../runtime/environment.js';
122
+
116
123
  // --- Tool creators (enterprise) ---
117
124
  export { createDatabaseTools } from './tools/enterprise-database.js';
118
125
  export { createSpreadsheetTools } from './tools/enterprise-spreadsheet.js';
@@ -178,6 +185,8 @@ import type { AgenticMailManagerRef } from './tools/agenticmail.js';
178
185
  import { createAllGoogleTools } from './tools/google/index.js';
179
186
  import { createTokenProvider } from './tools/oauth-token-provider.js';
180
187
  import type { OAuthTokens, TokenProvider } from './tools/oauth-token-provider.js';
188
+ import { createMeetingLifecycleTools } from './tools/meeting-lifecycle.js';
189
+ import { detectCapabilities } from '../runtime/environment.js';
181
190
 
182
191
  /** Extended options that includes AgenticMail manager */
183
192
  export interface AllToolsOptions extends ToolCreationOptions {
@@ -197,6 +206,16 @@ export interface AllToolsOptions extends ToolCreationOptions {
197
206
  };
198
207
  /** Callback to persist updated tokens after refresh */
199
208
  onTokenRefresh?: (tokens: Partial<OAuthTokens>) => void;
209
+ /** Browser configuration for enterprise browser tool */
210
+ browserConfig?: {
211
+ provider?: string;
212
+ baseUrl?: string;
213
+ defaultProfile?: string;
214
+ allowEvaluate?: boolean;
215
+ headless?: boolean;
216
+ };
217
+ /** Use enterprise browser tool (full Playwright) instead of simple browser */
218
+ useEnterpriseBrowser?: boolean;
200
219
  }
201
220
 
202
221
  /**
@@ -206,7 +225,7 @@ export interface AllToolsOptions extends ToolCreationOptions {
206
225
  *
207
226
  * Includes 10 core tools + 87 enterprise tools (16 skills) + 63 AgenticMail tools (if configured).
208
227
  */
209
- export function createAllTools(options?: AllToolsOptions): AnyAgentTool[] {
228
+ export async function createAllTools(options?: AllToolsOptions): Promise<AnyAgentTool[]> {
210
229
  // Create security primitives
211
230
  var pathSandbox = options?.workspaceDir && options?.security?.pathSandbox?.enabled !== false
212
231
  ? createPathSandbox(options.workspaceDir, {
@@ -244,6 +263,39 @@ export function createAllTools(options?: AllToolsOptions): AnyAgentTool[] {
244
263
  createMemoryTool(options),
245
264
  ];
246
265
 
266
+ // Replace simple browser with enterprise browser tool if configured
267
+ // Uses lazy import to avoid pulling in ws/playwright at module load
268
+ if (options?.useEnterpriseBrowser) {
269
+ // Remove the simple browser tool
270
+ rawTools = rawTools.filter(function(t) { return !t || t.name !== 'browser'; });
271
+ // Enterprise browser will be added async — caller must await createAllToolsAsync()
272
+ // For sync createAllTools, add a stub that tells the agent to use system_capabilities first
273
+ var caps = detectCapabilities();
274
+ if (!caps.hasBrowser) {
275
+ rawTools.push({
276
+ name: 'browser',
277
+ label: 'Browser',
278
+ description: 'Browser automation — NOT AVAILABLE on this deployment. Use system_capabilities to check what is available.',
279
+ category: 'browser',
280
+ parameters: { type: 'object', properties: { action: { type: 'string' } }, required: ['action'] },
281
+ execute: async function() {
282
+ var c = detectCapabilities();
283
+ var { getCapabilitySummary: getSummary } = await import('../runtime/environment.js');
284
+ var summary = getSummary(c);
285
+ return {
286
+ content: [{
287
+ type: 'text',
288
+ text: 'Browser is not available on this ' + summary.deployment + ' deployment.\n\n' +
289
+ 'Missing: ' + summary.unavailable.join(', ') + '\n\n' +
290
+ summary.recommendations.join('\n') + '\n\n' +
291
+ 'API-based tools (email, calendar, drive, docs) work without a browser.',
292
+ }],
293
+ };
294
+ },
295
+ } as AnyAgentTool);
296
+ }
297
+ }
298
+
247
299
  // Enterprise tools (16 skills, 87 tools)
248
300
  var enterpriseTools: AnyAgentTool[] = [
249
301
  ...createDatabaseTools(options),
@@ -303,16 +355,31 @@ export function createAllTools(options?: AllToolsOptions): AnyAgentTool[] {
303
355
  var provider = tp.getProvider();
304
356
  if (provider === 'google') {
305
357
  workspaceTools = createAllGoogleTools({ tokenProvider: tp }, options);
358
+ // Meeting lifecycle tools (work on all deployments — API-based)
359
+ workspaceTools = workspaceTools.concat(createMeetingLifecycleTools({ tokenProvider: tp }, options));
306
360
  }
307
361
  // TODO: Microsoft Graph tools
308
362
  // if (provider === 'microsoft') { workspaceTools = createAllMicrosoftTools({ tokenProvider: tp }, options); }
309
363
  }
310
364
 
365
+ // Try to load enterprise browser tool async (non-blocking)
366
+ var enterpriseBrowserTools: AnyAgentTool[] = [];
367
+ if (options?.useEnterpriseBrowser) {
368
+ try {
369
+ var { createEnterpriseBrowserTool: createEB } = await import('./tools/browser-tool.js');
370
+ var ebTool = createEB(options.browserConfig);
371
+ enterpriseBrowserTools = [ebTool];
372
+ } catch (_e) {
373
+ // browser-tool.ts has heavy deps — fall through to simple browser or stub
374
+ }
375
+ }
376
+
311
377
  var enabledTools = rawTools
312
378
  .filter(function(t): t is AnyAgentTool { return t !== null; })
313
379
  .concat(enterpriseTools)
314
380
  .concat(agenticmailTools)
315
- .concat(workspaceTools);
381
+ .concat(workspaceTools)
382
+ .concat(enterpriseBrowserTools);
316
383
 
317
384
  // Wrap with middleware if configured
318
385
  if (options?.middleware) {