@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.
- package/dist/browser-tool-KJMHSNK3.js +3997 -0
- package/dist/chunk-AQH4DFYV.js +142 -0
- package/dist/chunk-CETB63LZ.js +15813 -0
- package/dist/chunk-LOA5LNXR.js +898 -0
- package/dist/chunk-PHZS6OIO.js +2191 -0
- package/dist/chunk-QISZRTVR.js +2154 -0
- package/dist/chunk-TGOSFAYW.js +194 -0
- package/dist/cli.js +1 -1
- package/dist/environment-L6BN6KGK.js +11 -0
- package/dist/index.js +5 -3
- package/dist/pw-ai-IRORDXFW.js +2212 -0
- package/dist/routes-VIK7WDVW.js +6859 -0
- package/dist/runtime-NEO2ZB6O.js +49 -0
- package/dist/server-ZIB4HUUC.js +12 -0
- package/dist/setup-YD3LJ6DT.js +20 -0
- package/package.json +1 -1
- package/scripts/vm-setup.sh +309 -0
- package/src/agent-tools/index.ts +69 -2
- package/src/agent-tools/tools/meeting-lifecycle.ts +437 -0
- package/src/engine/agent-routes.ts +14 -0
- package/src/runtime/agent-loop.ts +1 -1
- package/src/runtime/environment.ts +290 -0
- package/src/runtime/index.ts +3 -3
|
@@ -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
|
@@ -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}"
|
package/src/agent-tools/index.ts
CHANGED
|
@@ -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) {
|