@agenticmail/enterprise 0.5.85 → 0.5.87
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/chunk-6YHJFTJV.js +898 -0
- package/dist/chunk-F23OR2UN.js +15813 -0
- package/dist/chunk-FN73A3AQ.js +15813 -0
- package/dist/chunk-NRF3YRF7.js +198 -0
- package/dist/chunk-QJIY4RQJ.js +2191 -0
- package/dist/chunk-U72GUDSD.js +898 -0
- package/dist/chunk-WY7EUYDG.js +2191 -0
- package/dist/cli.js +1 -1
- package/dist/dashboard/pages/agent-detail.js +73 -4
- package/dist/environment-QR43BVUX.js +11 -0
- package/dist/index.js +4 -4
- package/dist/routes-5BXENG5D.js +6871 -0
- package/dist/routes-IUGAENMP.js +6871 -0
- package/dist/runtime-APPERXEP.js +49 -0
- package/dist/runtime-XVQZ3DRZ.js +49 -0
- package/dist/server-5NCVUWGY.js +12 -0
- package/dist/server-A235D4XK.js +12 -0
- package/dist/setup-3KIT2V6U.js +20 -0
- package/dist/setup-R2EI7Y2P.js +20 -0
- package/package.json +1 -1
- package/src/dashboard/pages/agent-detail.js +73 -4
- package/src/engine/agent-routes.ts +14 -0
- package/src/runtime/environment.ts +12 -2
|
@@ -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-F23OR2UN.js";
|
|
18
|
+
import "./chunk-NRF3YRF7.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,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-FN73A3AQ.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-QJIY4RQJ.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,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createServer
|
|
3
|
+
} from "./chunk-WY7EUYDG.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-U72GUDSD.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
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {
|
|
2
|
+
promptCompanyInfo,
|
|
3
|
+
promptDatabase,
|
|
4
|
+
promptDeployment,
|
|
5
|
+
promptDomain,
|
|
6
|
+
promptRegistration,
|
|
7
|
+
provision,
|
|
8
|
+
runSetupWizard
|
|
9
|
+
} from "./chunk-6YHJFTJV.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
|
@@ -4003,6 +4003,14 @@ function MeetingCapabilitiesSection(props) {
|
|
|
4003
4003
|
var _d = useApp(); var toast = _d.toast;
|
|
4004
4004
|
var _launching = useState(false); var launching = _launching[0]; var setLaunching = _launching[1];
|
|
4005
4005
|
var _browserStatus = useState(null); var browserStatus = _browserStatus[0]; var setBrowserStatus = _browserStatus[1];
|
|
4006
|
+
var _sysCaps = useState(null); var sysCaps = _sysCaps[0]; var setSysCaps = _sysCaps[1];
|
|
4007
|
+
|
|
4008
|
+
// Fetch system capabilities on mount
|
|
4009
|
+
useEffect(function() {
|
|
4010
|
+
engineCall('/bridge/system/capabilities')
|
|
4011
|
+
.then(function(d) { setSysCaps(d); })
|
|
4012
|
+
.catch(function() { setSysCaps(null); });
|
|
4013
|
+
}, []);
|
|
4006
4014
|
|
|
4007
4015
|
function checkMeetingBrowser() {
|
|
4008
4016
|
engineCall('/bridge/agents/' + agentId + '/browser-config/test', { method: 'POST' })
|
|
@@ -4027,9 +4035,53 @@ function MeetingCapabilitiesSection(props) {
|
|
|
4027
4035
|
|
|
4028
4036
|
var meetingsOn = cfg.meetingsEnabled === true;
|
|
4029
4037
|
|
|
4038
|
+
var isContainer = sysCaps && sysCaps.raw && (sysCaps.raw.deployment === 'container');
|
|
4039
|
+
var canJoinMeetings = sysCaps && sysCaps.raw && sysCaps.raw.canJoinMeetings;
|
|
4040
|
+
var isObserverOnly = sysCaps && sysCaps.raw && sysCaps.raw.isContainerWithFakeMedia;
|
|
4041
|
+
var canJoinFullMedia = sysCaps && sysCaps.raw && sysCaps.raw.canJoinMeetingsFullMedia;
|
|
4042
|
+
|
|
4030
4043
|
return h('div', { style: sectionStyle },
|
|
4031
4044
|
sectionTitle('\uD83C\uDFA5', 'Meetings & Video Calls'),
|
|
4032
4045
|
|
|
4046
|
+
// Deployment capability warning — show for no-meeting OR observer-only
|
|
4047
|
+
sysCaps && (!canJoinMeetings || isObserverOnly) && h('div', { style: {
|
|
4048
|
+
background: isObserverOnly ? 'rgba(33,150,243,0.08)' : 'rgba(255,152,0,0.08)',
|
|
4049
|
+
border: '1px solid ' + (isObserverOnly ? 'rgba(33,150,243,0.3)' : 'rgba(255,152,0,0.3)'),
|
|
4050
|
+
borderRadius: 8, padding: '12px 16px', marginBottom: 16,
|
|
4051
|
+
} },
|
|
4052
|
+
h('div', { style: { display: 'flex', alignItems: 'flex-start', gap: 10 } },
|
|
4053
|
+
h('span', { style: { fontSize: 18 } }, isObserverOnly ? '\uD83D\uDC41\uFE0F' : '\u26A0\uFE0F'),
|
|
4054
|
+
h('div', null,
|
|
4055
|
+
h('div', { style: { fontWeight: 600, fontSize: 13, marginBottom: 4 } },
|
|
4056
|
+
isObserverOnly
|
|
4057
|
+
? 'Observer Mode — Container Deployment'
|
|
4058
|
+
: 'Limited on this deployment' + (isContainer ? ' (container)' : '')
|
|
4059
|
+
),
|
|
4060
|
+
h('div', { style: { fontSize: 12, color: 'var(--text-muted)', lineHeight: 1.5 } },
|
|
4061
|
+
isObserverOnly
|
|
4062
|
+
? 'This container has Chromium + virtual display, but uses fake media devices. The agent can join meetings as an observer — it can see the screen, read chat, and take notes, but cannot send or receive real audio/video.'
|
|
4063
|
+
: 'Video meeting joining requires a display server, audio subsystem, and browser — which are not available on container deployments (Fly.io, Railway, etc.).'
|
|
4064
|
+
),
|
|
4065
|
+
isObserverOnly && h('div', { style: { fontSize: 12, marginTop: 8, lineHeight: 1.5 } },
|
|
4066
|
+
h('strong', null, 'Works in observer mode: '),
|
|
4067
|
+
'Join meetings, read chat, see shared screens, take screenshots, capture meeting notes.'
|
|
4068
|
+
),
|
|
4069
|
+
isObserverOnly && h('div', { style: { fontSize: 12, marginTop: 4, lineHeight: 1.5 } },
|
|
4070
|
+
h('strong', null, 'Does NOT work: '),
|
|
4071
|
+
'Speaking, sending audio, showing video/camera, screen sharing.'
|
|
4072
|
+
),
|
|
4073
|
+
!isObserverOnly && h('div', { style: { fontSize: 12, marginTop: 8, lineHeight: 1.5 } },
|
|
4074
|
+
h('strong', null, 'What works here: '), 'Calendar management, meeting prep, Drive organization, notes, email scanning for invites, RSVP.'
|
|
4075
|
+
),
|
|
4076
|
+
h('div', { style: { fontSize: 12, marginTop: 8, lineHeight: 1.5 } },
|
|
4077
|
+
h('strong', null, 'For full media (audio + video): '), 'Deploy on a VM (Hetzner, DigitalOcean, GCP) with our ',
|
|
4078
|
+
h('code', { style: { fontSize: 11, background: 'var(--bg-secondary)', padding: '1px 4px', borderRadius: 3 } }, 'vm-setup.sh'),
|
|
4079
|
+
' script, or use a Remote Browser (CDP) provider.'
|
|
4080
|
+
)
|
|
4081
|
+
)
|
|
4082
|
+
)
|
|
4083
|
+
),
|
|
4084
|
+
|
|
4033
4085
|
// Main toggle
|
|
4034
4086
|
h('div', { style: { display: 'flex', alignItems: 'center', gap: 16, marginBottom: meetingsOn ? 16 : 0 } },
|
|
4035
4087
|
h('div', {
|
|
@@ -4070,11 +4122,28 @@ function MeetingCapabilitiesSection(props) {
|
|
|
4070
4122
|
browserStatus?.ok && h('span', { className: 'badge', style: { fontSize: 10, padding: '1px 6px', background: 'var(--success-soft)', color: 'var(--success)' } }, 'Running')
|
|
4071
4123
|
),
|
|
4072
4124
|
browserStatus?.ok
|
|
4073
|
-
? h('div',
|
|
4125
|
+
? h('div', null,
|
|
4126
|
+
h('div', { style: { fontSize: 12, color: 'var(--text-muted)' } }, browserStatus.browserVersion || 'Chromium ready'),
|
|
4127
|
+
isObserverOnly && h('span', { className: 'badge', style: { fontSize: 10, padding: '1px 6px', marginLeft: 8, background: 'rgba(33,150,243,0.15)', color: 'var(--accent)' } }, 'Observer Only'),
|
|
4128
|
+
isContainer && !canJoinMeetings && !isObserverOnly && h('div', { style: { fontSize: 11, color: 'var(--warning)', marginTop: 4 } },
|
|
4129
|
+
'\u26A0 Browser is headless-only on this container. It cannot join video calls (no display/audio).'
|
|
4130
|
+
)
|
|
4131
|
+
)
|
|
4074
4132
|
: h('div', null,
|
|
4075
|
-
h('div', { style: { fontSize: 12, color: 'var(--text-muted)', marginBottom: 8 } },
|
|
4076
|
-
|
|
4077
|
-
|
|
4133
|
+
h('div', { style: { fontSize: 12, color: 'var(--text-muted)', marginBottom: 8 } },
|
|
4134
|
+
isContainer && !canJoinMeetings
|
|
4135
|
+
? 'Meeting browser cannot join video calls on container deployments. Use a VM or Remote Browser (CDP) instead.'
|
|
4136
|
+
: 'A dedicated browser instance will be launched for video calls with virtual display and audio.'
|
|
4137
|
+
),
|
|
4138
|
+
h('button', {
|
|
4139
|
+
className: 'btn btn-sm',
|
|
4140
|
+
disabled: launching || (isContainer && !canJoinMeetings),
|
|
4141
|
+
onClick: launchMeetingBrowser,
|
|
4142
|
+
title: isContainer && !canJoinMeetings ? 'Not available on container deployments' : '',
|
|
4143
|
+
},
|
|
4144
|
+
isContainer && !canJoinMeetings
|
|
4145
|
+
? '\u274C Not available on containers'
|
|
4146
|
+
: launching ? 'Launching...' : '\u25B6\uFE0F Launch Meeting Browser'
|
|
4078
4147
|
)
|
|
4079
4148
|
)
|
|
4080
4149
|
)
|
|
@@ -957,6 +957,20 @@ export function createAgentRoutes(opts: {
|
|
|
957
957
|
if (!managed) return c.json({ error: 'Agent not found' }, 404);
|
|
958
958
|
|
|
959
959
|
try {
|
|
960
|
+
// Check system capabilities first
|
|
961
|
+
const { detectCapabilities, getCapabilitySummary } = await import('../runtime/environment.js');
|
|
962
|
+
const caps = detectCapabilities();
|
|
963
|
+
if (!caps.canJoinMeetings) {
|
|
964
|
+
const summary = getCapabilitySummary(caps);
|
|
965
|
+
return c.json({
|
|
966
|
+
error: 'Meeting browser cannot run on this ' + summary.deployment + ' deployment',
|
|
967
|
+
deployment: summary.deployment,
|
|
968
|
+
missing: summary.unavailable,
|
|
969
|
+
recommendations: summary.recommendations,
|
|
970
|
+
hint: 'Deploy on a VM with display + audio, or configure a Remote Browser (CDP) provider.',
|
|
971
|
+
}, 400);
|
|
972
|
+
}
|
|
973
|
+
|
|
960
974
|
const { execSync, spawn } = await import('node:child_process');
|
|
961
975
|
const chromePath = process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH || '/usr/bin/chromium';
|
|
962
976
|
|
|
@@ -26,10 +26,14 @@ export interface SystemCapabilities {
|
|
|
26
26
|
hasVirtualCamera: boolean;
|
|
27
27
|
/** Can run headed browser (display + browser) */
|
|
28
28
|
canRunHeadedBrowser: boolean;
|
|
29
|
-
/** Can join video calls (display + browser + audio) */
|
|
29
|
+
/** Can join video calls (display + browser + audio) — may be observer-only on containers */
|
|
30
30
|
canJoinMeetings: boolean;
|
|
31
|
+
/** Can join with full media (real audio/video, not container fake media) */
|
|
32
|
+
canJoinMeetingsFullMedia: boolean;
|
|
31
33
|
/** Can record meetings (display + browser + audio + ffmpeg) */
|
|
32
34
|
canRecordMeetings: boolean;
|
|
35
|
+
/** Container deployment with Xvfb+PulseAudio but fake media (observer-only) */
|
|
36
|
+
isContainerWithFakeMedia: boolean;
|
|
33
37
|
/** ffmpeg available */
|
|
34
38
|
hasFfmpeg: boolean;
|
|
35
39
|
/** Persistent filesystem (not ephemeral container) */
|
|
@@ -187,6 +191,9 @@ export function detectCapabilities(): SystemCapabilities {
|
|
|
187
191
|
if (commandExists('nvidia-smi')) { execSync('nvidia-smi', { timeout: 3000 }); hasGpu = true; }
|
|
188
192
|
} catch { /* no GPU */ }
|
|
189
193
|
|
|
194
|
+
// On containers with fake media, meetings work but only as observer (no real audio/video)
|
|
195
|
+
const isContainerWithFakeMedia = deployment === 'container' && hasBrowser && hasDisplay && hasAudio;
|
|
196
|
+
|
|
190
197
|
const caps: SystemCapabilities = {
|
|
191
198
|
deployment,
|
|
192
199
|
hasBrowser,
|
|
@@ -196,7 +203,9 @@ export function detectCapabilities(): SystemCapabilities {
|
|
|
196
203
|
hasVirtualCamera,
|
|
197
204
|
canRunHeadedBrowser: hasBrowser && hasDisplay,
|
|
198
205
|
canJoinMeetings: hasBrowser && hasDisplay && hasAudio,
|
|
206
|
+
canJoinMeetingsFullMedia: hasBrowser && hasDisplay && hasAudio && !isContainerWithFakeMedia,
|
|
199
207
|
canRecordMeetings: hasBrowser && hasDisplay && hasAudio && hasFfmpeg,
|
|
208
|
+
isContainerWithFakeMedia,
|
|
200
209
|
hasFfmpeg,
|
|
201
210
|
hasPersistentDisk: !!hasPersistentDisk,
|
|
202
211
|
hasGpu,
|
|
@@ -243,7 +252,8 @@ export function getCapabilitySummary(caps?: SystemCapabilities): {
|
|
|
243
252
|
if (c.canRunHeadedBrowser) available.push('Browser (headed/visible)');
|
|
244
253
|
else if (c.hasBrowser) unavailable.push('Headed browser — no display server (install Xvfb)');
|
|
245
254
|
|
|
246
|
-
if (c.
|
|
255
|
+
if (c.canJoinMeetingsFullMedia) available.push('Video meetings — full media (Google Meet, Zoom, Teams)');
|
|
256
|
+
else if (c.canJoinMeetings && c.isContainerWithFakeMedia) available.push('Video meetings — observer only (container: no real audio/video, can read chat + take notes)');
|
|
247
257
|
else unavailable.push('Video meetings — requires display + browser + audio');
|
|
248
258
|
|
|
249
259
|
if (c.canRecordMeetings) available.push('Meeting recording');
|