@agenticmail/enterprise 0.5.86 → 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.
@@ -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,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-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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agenticmail/enterprise",
3
- "version": "0.5.86",
3
+ "version": "0.5.87",
4
4
  "description": "AgenticMail Enterprise — cloud-hosted AI agent identity, email, auth & compliance for organizations",
5
5
  "type": "module",
6
6
  "bin": {
@@ -4037,34 +4037,46 @@ function MeetingCapabilitiesSection(props) {
4037
4037
 
4038
4038
  var isContainer = sysCaps && sysCaps.raw && (sysCaps.raw.deployment === 'container');
4039
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;
4040
4042
 
4041
4043
  return h('div', { style: sectionStyle },
4042
4044
  sectionTitle('\uD83C\uDFA5', 'Meetings & Video Calls'),
4043
4045
 
4044
- // Deployment capability warning
4045
- sysCaps && !canJoinMeetings && h('div', { style: {
4046
- background: 'rgba(255,152,0,0.08)', border: '1px solid rgba(255,152,0,0.3)',
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)'),
4047
4050
  borderRadius: 8, padding: '12px 16px', marginBottom: 16,
4048
4051
  } },
4049
4052
  h('div', { style: { display: 'flex', alignItems: 'flex-start', gap: 10 } },
4050
- h('span', { style: { fontSize: 18 } }, '\u26A0\uFE0F'),
4053
+ h('span', { style: { fontSize: 18 } }, isObserverOnly ? '\uD83D\uDC41\uFE0F' : '\u26A0\uFE0F'),
4051
4054
  h('div', null,
4052
4055
  h('div', { style: { fontWeight: 600, fontSize: 13, marginBottom: 4 } },
4053
- 'Limited on this deployment' + (isContainer ? ' (container)' : '')
4056
+ isObserverOnly
4057
+ ? 'Observer Mode — Container Deployment'
4058
+ : 'Limited on this deployment' + (isContainer ? ' (container)' : '')
4054
4059
  ),
4055
4060
  h('div', { style: { fontSize: 12, color: 'var(--text-muted)', lineHeight: 1.5 } },
4056
- 'Video meeting joining requires a display server, audio subsystem, and browser — which are not available on container deployments (Fly.io, Railway, etc.).'
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.).'
4057
4064
  ),
4058
- h('div', { style: { fontSize: 12, marginTop: 8, lineHeight: 1.5 } },
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 } },
4059
4074
  h('strong', null, 'What works here: '), 'Calendar management, meeting prep, Drive organization, notes, email scanning for invites, RSVP.'
4060
4075
  ),
4061
- h('div', { style: { fontSize: 12, marginTop: 4, lineHeight: 1.5 } },
4062
- h('strong', null, 'For meeting joining: '), 'Deploy on a VM (Hetzner, DigitalOcean, GCP) with our ',
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 ',
4063
4078
  h('code', { style: { fontSize: 11, background: 'var(--bg-secondary)', padding: '1px 4px', borderRadius: 3 } }, 'vm-setup.sh'),
4064
- ' script, or use a Remote Browser (CDP) provider below.'
4065
- ),
4066
- sysCaps.unavailable && sysCaps.unavailable.length > 0 && h('div', { style: { fontSize: 11, color: 'var(--text-muted)', marginTop: 8 } },
4067
- 'Missing: ' + sysCaps.unavailable.join(' \u2022 ')
4079
+ ' script, or use a Remote Browser (CDP) provider.'
4068
4080
  )
4069
4081
  )
4070
4082
  )
@@ -4112,7 +4124,8 @@ function MeetingCapabilitiesSection(props) {
4112
4124
  browserStatus?.ok
4113
4125
  ? h('div', null,
4114
4126
  h('div', { style: { fontSize: 12, color: 'var(--text-muted)' } }, browserStatus.browserVersion || 'Chromium ready'),
4115
- isContainer && !canJoinMeetings && h('div', { style: { fontSize: 11, color: 'var(--warning)', marginTop: 4 } },
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 } },
4116
4129
  '\u26A0 Browser is headless-only on this container. It cannot join video calls (no display/audio).'
4117
4130
  )
4118
4131
  )
@@ -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.canJoinMeetings) available.push('Video meetings (Google Meet, Zoom, Teams)');
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');