@agenticmail/enterprise 0.5.234 → 0.5.235
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.
|
@@ -75,7 +75,7 @@ export function MeetingCapabilitiesSection(props) {
|
|
|
75
75
|
var canJoinFullMedia = sysCaps && sysCaps.raw && sysCaps.raw.canJoinMeetingsFullMedia;
|
|
76
76
|
|
|
77
77
|
return h('div', { style: sectionStyle },
|
|
78
|
-
sectionTitle(
|
|
78
|
+
sectionTitle(I.play(), 'Meetings & Video Calls'),
|
|
79
79
|
|
|
80
80
|
// Deployment capability warning — show for no-meeting OR observer-only
|
|
81
81
|
sysCaps && (!canJoinMeetings || isObserverOnly) && h('div', { style: {
|
|
@@ -167,7 +167,7 @@ export function MeetingCapabilitiesSection(props) {
|
|
|
167
167
|
disabled: stopping,
|
|
168
168
|
onClick: stopMeetingBrowser,
|
|
169
169
|
style: { background: 'var(--danger)', color: '#fff', border: 'none', marginTop: 4 },
|
|
170
|
-
}, stopping ? 'Stopping...' : '
|
|
170
|
+
}, stopping ? 'Stopping...' : I.stop(), ' Stop Meeting Browser'),
|
|
171
171
|
isContainer && !canJoinMeetings && !isObserverOnly && h('div', { style: { fontSize: 11, color: 'var(--warning)', marginTop: 4 } },
|
|
172
172
|
h('span', { style: { display: 'inline-flex', alignItems: 'center', gap: 6 } }, E.warning(14), ' Browser is headless-only on this container. It cannot join video calls (no display/audio).')
|
|
173
173
|
)
|
|
@@ -185,8 +185,8 @@ export function MeetingCapabilitiesSection(props) {
|
|
|
185
185
|
title: isContainer && !canJoinMeetings ? 'Not available on container deployments' : '',
|
|
186
186
|
},
|
|
187
187
|
isContainer && !canJoinMeetings
|
|
188
|
-
? '
|
|
189
|
-
: launching ? 'Launching...' : '
|
|
188
|
+
? I.x(), ' Not available on containers'
|
|
189
|
+
: launching ? 'Launching...' : I.play(), ' Launch Meeting Browser'
|
|
190
190
|
)
|
|
191
191
|
)
|
|
192
192
|
)
|
|
@@ -203,7 +203,7 @@ export function MeetingCapabilitiesSection(props) {
|
|
|
203
203
|
onClick: function() { update(p.key, !p.enabled); }
|
|
204
204
|
},
|
|
205
205
|
h('div', { style: { display: 'flex', alignItems: 'center', gap: 6, marginBottom: 4 } },
|
|
206
|
-
h('span', null, p.icon),
|
|
206
|
+
I[p.icon] ? I[p.icon]() : h('span', null, p.icon),
|
|
207
207
|
h('span', { style: { fontWeight: 600, fontSize: 12 } }, p.name),
|
|
208
208
|
h('span', { style: { marginLeft: 'auto', fontSize: 11, color: p.enabled ? 'var(--success)' : 'var(--text-muted)' } }, p.enabled ? 'ON' : 'OFF')
|
|
209
209
|
),
|
|
@@ -329,17 +329,17 @@ export function BrowserConfigCard(props) {
|
|
|
329
329
|
var sectionStyle = { padding: '12px 0', borderBottom: '1px solid var(--border)' };
|
|
330
330
|
var sectionTitle = function(icon, text) {
|
|
331
331
|
return h('div', { style: { fontSize: 13, fontWeight: 600, color: 'var(--text-primary)', marginBottom: 12, display: 'flex', alignItems: 'center', gap: 6 } },
|
|
332
|
-
h('span',
|
|
332
|
+
typeof icon === 'string' ? h('span', { style: { width: 16, height: 16, display: 'inline-flex' } }, icon) : icon, text);
|
|
333
333
|
};
|
|
334
334
|
|
|
335
335
|
// Provider descriptions
|
|
336
336
|
var providers = [
|
|
337
|
-
{ id: 'local', name: 'Local Chromium', icon: '
|
|
338
|
-
{ id: 'remote-cdp', name: 'Remote Browser (CDP)', icon: '
|
|
339
|
-
{ id: 'browserless', name: 'Browserless.io', icon: '
|
|
340
|
-
{ id: 'browserbase', name: 'Browserbase', icon: '
|
|
341
|
-
{ id: 'steel', name: 'Steel.dev', icon: '
|
|
342
|
-
{ id: 'scrapingbee', name: 'ScrapingBee', icon: '
|
|
337
|
+
{ id: 'local', name: 'Local Chromium', icon: 'dashboard', desc: 'Built-in headless Chromium on this server. Best for web automation, scraping, screenshots, form filling.' },
|
|
338
|
+
{ id: 'remote-cdp', name: 'Remote Browser (CDP)', icon: 'globe', desc: 'Connect to a Chrome/Chromium instance via Chrome DevTools Protocol. Required for headed mode, video calls, persistent sessions.' },
|
|
339
|
+
{ id: 'browserless', name: 'Browserless.io', icon: 'globe', desc: 'Cloud browser service. Scalable, managed infrastructure. Supports stealth mode, residential proxies, and concurrent sessions.' },
|
|
340
|
+
{ id: 'browserbase', name: 'Browserbase', icon: 'upload', desc: 'AI-native cloud browser. Built for agent automation with session replay, anti-detection, and managed infrastructure.' },
|
|
341
|
+
{ id: 'steel', name: 'Steel.dev', icon: 'activity', desc: 'Open-source browser API designed for AI agents. Self-hostable, session management, built-in stealth.' },
|
|
342
|
+
{ id: 'scrapingbee', name: 'ScrapingBee', icon: 'search', desc: 'Web scraping API with browser rendering, proxy rotation, and CAPTCHA solving.' },
|
|
343
343
|
];
|
|
344
344
|
|
|
345
345
|
return h('div', { className: 'card', style: { marginTop: 16 } },
|
|
@@ -349,7 +349,7 @@ export function BrowserConfigCard(props) {
|
|
|
349
349
|
onClick: function() { setCollapsed(!collapsed); }
|
|
350
350
|
},
|
|
351
351
|
h('span', { style: { display: 'flex', alignItems: 'center', gap: 8 } },
|
|
352
|
-
'
|
|
352
|
+
I.globe(), ' Browser & Web Automation', h(HelpButton, { label: 'Browser & Web Automation' },
|
|
353
353
|
h('p', null, 'Configure how this agent accesses web pages. Choose from local Chromium, remote browsers (CDP), or cloud browser services.'),
|
|
354
354
|
h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
|
|
355
355
|
h('li', null, h('strong', null, 'Local Chromium'), ' — Built-in headless browser. Best for most automation tasks.'),
|
|
@@ -368,7 +368,7 @@ export function BrowserConfigCard(props) {
|
|
|
368
368
|
|
|
369
369
|
// ─── Section 1: Browser Provider ─────────────────
|
|
370
370
|
h('div', { style: sectionStyle },
|
|
371
|
-
sectionTitle(
|
|
371
|
+
sectionTitle(I.settings(), 'Browser Provider'),
|
|
372
372
|
h('div', { style: { display: 'grid', gap: 8, gridTemplateColumns: 'repeat(auto-fill, minmax(280px, 1fr))' } },
|
|
373
373
|
providers.map(function(p) {
|
|
374
374
|
var selected = provider === p.id;
|
|
@@ -383,9 +383,9 @@ export function BrowserConfigCard(props) {
|
|
|
383
383
|
}
|
|
384
384
|
},
|
|
385
385
|
h('div', { style: { display: 'flex', alignItems: 'center', gap: 8, marginBottom: 4 } },
|
|
386
|
-
h('span', { style: { fontSize: 18 } }, p.icon),
|
|
386
|
+
I[p.icon] ? I[p.icon]() : h('span', { style: { fontSize: 18 } }, p.icon),
|
|
387
387
|
h('span', { style: { fontWeight: 600, fontSize: 13 } }, p.name),
|
|
388
|
-
selected && h('span', { style: { marginLeft: 'auto', color: 'var(--accent)', fontSize: 14 } },
|
|
388
|
+
selected && h('span', { style: { marginLeft: 'auto', color: 'var(--accent)', fontSize: 14 } }, I.check())
|
|
389
389
|
),
|
|
390
390
|
h('div', { style: { fontSize: 11, color: 'var(--text-muted)', lineHeight: 1.4 } }, p.desc)
|
|
391
391
|
);
|
|
@@ -398,7 +398,7 @@ export function BrowserConfigCard(props) {
|
|
|
398
398
|
|
|
399
399
|
// Local Chromium
|
|
400
400
|
provider === 'local' && h(Fragment, null,
|
|
401
|
-
sectionTitle(
|
|
401
|
+
sectionTitle(I.dashboard(), 'Local Chromium Settings'),
|
|
402
402
|
h('div', { style: { display: 'grid', gap: 12, gridTemplateColumns: '1fr 1fr' } },
|
|
403
403
|
h('div', { className: 'form-group' },
|
|
404
404
|
h('label', { style: labelStyle }, 'Display Mode'),
|
|
@@ -439,7 +439,7 @@ export function BrowserConfigCard(props) {
|
|
|
439
439
|
|
|
440
440
|
// Remote CDP
|
|
441
441
|
provider === 'remote-cdp' && h(Fragment, null,
|
|
442
|
-
sectionTitle(
|
|
442
|
+
sectionTitle(I.globe(), 'Remote Browser Connection'),
|
|
443
443
|
h('div', { style: { padding: '10px 14px', background: 'var(--info-soft)', borderRadius: 'var(--radius)', marginBottom: 12, fontSize: 12, lineHeight: 1.5 } },
|
|
444
444
|
h('strong', null, 'How it works: '),
|
|
445
445
|
'The agent connects to a Chrome/Chromium browser running on another machine via the Chrome DevTools Protocol (CDP). ',
|
|
@@ -489,7 +489,7 @@ export function BrowserConfigCard(props) {
|
|
|
489
489
|
|
|
490
490
|
// Browserless
|
|
491
491
|
provider === 'browserless' && h(Fragment, null,
|
|
492
|
-
sectionTitle(
|
|
492
|
+
sectionTitle(I.globe(), 'Browserless.io Configuration'),
|
|
493
493
|
h('div', { style: { display: 'grid', gap: 12 } },
|
|
494
494
|
h('div', { className: 'form-group' },
|
|
495
495
|
h('label', { style: labelStyle }, 'API Token *'),
|
|
@@ -539,7 +539,7 @@ export function BrowserConfigCard(props) {
|
|
|
539
539
|
|
|
540
540
|
// Browserbase
|
|
541
541
|
provider === 'browserbase' && h(Fragment, null,
|
|
542
|
-
sectionTitle(
|
|
542
|
+
sectionTitle(I.upload(), 'Browserbase Configuration'),
|
|
543
543
|
h('div', { style: { display: 'grid', gap: 12 } },
|
|
544
544
|
h('div', { className: 'form-group' },
|
|
545
545
|
h('label', { style: labelStyle }, 'API Key *'),
|
|
@@ -581,7 +581,7 @@ export function BrowserConfigCard(props) {
|
|
|
581
581
|
|
|
582
582
|
// Steel
|
|
583
583
|
provider === 'steel' && h(Fragment, null,
|
|
584
|
-
sectionTitle(
|
|
584
|
+
sectionTitle(I.activity(), 'Steel.dev Configuration'),
|
|
585
585
|
h('div', { style: { display: 'grid', gap: 12 } },
|
|
586
586
|
h('div', { className: 'form-group' },
|
|
587
587
|
h('label', { style: labelStyle }, 'API Key *'),
|
|
@@ -612,7 +612,7 @@ export function BrowserConfigCard(props) {
|
|
|
612
612
|
|
|
613
613
|
// ScrapingBee
|
|
614
614
|
provider === 'scrapingbee' && h(Fragment, null,
|
|
615
|
-
sectionTitle(
|
|
615
|
+
sectionTitle(I.search(), 'ScrapingBee Configuration'),
|
|
616
616
|
h('div', { style: { display: 'grid', gap: 12 } },
|
|
617
617
|
h('div', { className: 'form-group' },
|
|
618
618
|
h('label', { style: labelStyle }, 'API Key *'),
|
|
@@ -655,7 +655,7 @@ export function BrowserConfigCard(props) {
|
|
|
655
655
|
|
|
656
656
|
// ─── Section 3: Security & Limits ────────────────
|
|
657
657
|
h('div', { style: sectionStyle },
|
|
658
|
-
sectionTitle(
|
|
658
|
+
sectionTitle(I.shield(), 'Security & Limits'),
|
|
659
659
|
h('div', { style: { display: 'grid', gap: 12, gridTemplateColumns: '1fr 1fr' } },
|
|
660
660
|
h('div', { className: 'form-group' },
|
|
661
661
|
h('label', { style: labelStyle }, 'URL Protection'),
|
|
@@ -728,7 +728,7 @@ export function BrowserConfigCard(props) {
|
|
|
728
728
|
|
|
729
729
|
// ─── Section 5: Persistent Sessions ──────────────
|
|
730
730
|
h('div', { style: { paddingTop: 12 } },
|
|
731
|
-
sectionTitle(
|
|
731
|
+
sectionTitle(I.refresh(), 'Session Persistence'),
|
|
732
732
|
h('div', { style: { display: 'grid', gap: 12, gridTemplateColumns: '1fr 1fr' } },
|
|
733
733
|
h('div', { className: 'form-group' },
|
|
734
734
|
h('label', { style: labelStyle }, 'Persist Login Sessions'),
|
|
@@ -758,7 +758,7 @@ export function BrowserConfigCard(props) {
|
|
|
758
758
|
testing ? 'Testing...' : '\u{1F50C} Test Connection'
|
|
759
759
|
),
|
|
760
760
|
testResult && h('span', { style: { fontSize: 12, color: testResult.error ? 'var(--danger)' : 'var(--success)', alignSelf: 'center' } },
|
|
761
|
-
testResult.error ? '
|
|
761
|
+
testResult.error ? 'Failed: ' + testResult.error : 'Connected — ' + (testResult.browserVersion || 'OK')
|
|
762
762
|
)
|
|
763
763
|
),
|
|
764
764
|
h('button', { className: 'btn', disabled: saving, onClick: save }, saving ? 'Saving...' : 'Save Browser Config')
|
|
@@ -810,7 +810,7 @@ export function ToolRestrictionsCard(props) {
|
|
|
810
810
|
style: { cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'space-between' },
|
|
811
811
|
onClick: function() { setCollapsed(!collapsed); }
|
|
812
812
|
},
|
|
813
|
-
h('span', { style: { display: 'flex', alignItems: 'center' } }, '
|
|
813
|
+
h('span', { style: { display: 'flex', alignItems: 'center' } }, I.shield(), ' Tool Restrictions', h(HelpButton, { label: 'Tool Restrictions' },
|
|
814
814
|
h('p', null, 'Per-agent restrictions on file sizes, shell access, web fetching, email sending, database access, and file sharing. These are independent of tool security sandboxes.'),
|
|
815
815
|
h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Use these to limit what an agent can do beyond its tool security settings. For example, block shell execution for agents that only need email access.')
|
|
816
816
|
)),
|
|
@@ -524,7 +524,7 @@ export function SettingsPage() {
|
|
|
524
524
|
|
|
525
525
|
// Info about per-agent auth
|
|
526
526
|
orgEmail.configured && h('div', { style: { marginTop: 16, padding: '12px 16px', background: 'var(--bg-tertiary)', borderRadius: 'var(--radius)', fontSize: 12, color: 'var(--text-muted)' } },
|
|
527
|
-
'
|
|
527
|
+
'Each agent still needs to individually authorize via their Email tab. This org config provides the shared OAuth app credentials so agents don\'t need to enter Client ID/Secret individually.'
|
|
528
528
|
)
|
|
529
529
|
)
|
|
530
530
|
),
|
package/package.json
CHANGED
|
@@ -75,7 +75,7 @@ export function MeetingCapabilitiesSection(props) {
|
|
|
75
75
|
var canJoinFullMedia = sysCaps && sysCaps.raw && sysCaps.raw.canJoinMeetingsFullMedia;
|
|
76
76
|
|
|
77
77
|
return h('div', { style: sectionStyle },
|
|
78
|
-
sectionTitle(
|
|
78
|
+
sectionTitle(I.play(), 'Meetings & Video Calls'),
|
|
79
79
|
|
|
80
80
|
// Deployment capability warning — show for no-meeting OR observer-only
|
|
81
81
|
sysCaps && (!canJoinMeetings || isObserverOnly) && h('div', { style: {
|
|
@@ -167,7 +167,7 @@ export function MeetingCapabilitiesSection(props) {
|
|
|
167
167
|
disabled: stopping,
|
|
168
168
|
onClick: stopMeetingBrowser,
|
|
169
169
|
style: { background: 'var(--danger)', color: '#fff', border: 'none', marginTop: 4 },
|
|
170
|
-
}, stopping ? 'Stopping...' : '
|
|
170
|
+
}, stopping ? 'Stopping...' : I.stop(), ' Stop Meeting Browser'),
|
|
171
171
|
isContainer && !canJoinMeetings && !isObserverOnly && h('div', { style: { fontSize: 11, color: 'var(--warning)', marginTop: 4 } },
|
|
172
172
|
h('span', { style: { display: 'inline-flex', alignItems: 'center', gap: 6 } }, E.warning(14), ' Browser is headless-only on this container. It cannot join video calls (no display/audio).')
|
|
173
173
|
)
|
|
@@ -185,8 +185,8 @@ export function MeetingCapabilitiesSection(props) {
|
|
|
185
185
|
title: isContainer && !canJoinMeetings ? 'Not available on container deployments' : '',
|
|
186
186
|
},
|
|
187
187
|
isContainer && !canJoinMeetings
|
|
188
|
-
? '
|
|
189
|
-
: launching ? 'Launching...' : '
|
|
188
|
+
? I.x(), ' Not available on containers'
|
|
189
|
+
: launching ? 'Launching...' : I.play(), ' Launch Meeting Browser'
|
|
190
190
|
)
|
|
191
191
|
)
|
|
192
192
|
)
|
|
@@ -203,7 +203,7 @@ export function MeetingCapabilitiesSection(props) {
|
|
|
203
203
|
onClick: function() { update(p.key, !p.enabled); }
|
|
204
204
|
},
|
|
205
205
|
h('div', { style: { display: 'flex', alignItems: 'center', gap: 6, marginBottom: 4 } },
|
|
206
|
-
h('span', null, p.icon),
|
|
206
|
+
I[p.icon] ? I[p.icon]() : h('span', null, p.icon),
|
|
207
207
|
h('span', { style: { fontWeight: 600, fontSize: 12 } }, p.name),
|
|
208
208
|
h('span', { style: { marginLeft: 'auto', fontSize: 11, color: p.enabled ? 'var(--success)' : 'var(--text-muted)' } }, p.enabled ? 'ON' : 'OFF')
|
|
209
209
|
),
|
|
@@ -329,17 +329,17 @@ export function BrowserConfigCard(props) {
|
|
|
329
329
|
var sectionStyle = { padding: '12px 0', borderBottom: '1px solid var(--border)' };
|
|
330
330
|
var sectionTitle = function(icon, text) {
|
|
331
331
|
return h('div', { style: { fontSize: 13, fontWeight: 600, color: 'var(--text-primary)', marginBottom: 12, display: 'flex', alignItems: 'center', gap: 6 } },
|
|
332
|
-
h('span',
|
|
332
|
+
typeof icon === 'string' ? h('span', { style: { width: 16, height: 16, display: 'inline-flex' } }, icon) : icon, text);
|
|
333
333
|
};
|
|
334
334
|
|
|
335
335
|
// Provider descriptions
|
|
336
336
|
var providers = [
|
|
337
|
-
{ id: 'local', name: 'Local Chromium', icon: '
|
|
338
|
-
{ id: 'remote-cdp', name: 'Remote Browser (CDP)', icon: '
|
|
339
|
-
{ id: 'browserless', name: 'Browserless.io', icon: '
|
|
340
|
-
{ id: 'browserbase', name: 'Browserbase', icon: '
|
|
341
|
-
{ id: 'steel', name: 'Steel.dev', icon: '
|
|
342
|
-
{ id: 'scrapingbee', name: 'ScrapingBee', icon: '
|
|
337
|
+
{ id: 'local', name: 'Local Chromium', icon: 'dashboard', desc: 'Built-in headless Chromium on this server. Best for web automation, scraping, screenshots, form filling.' },
|
|
338
|
+
{ id: 'remote-cdp', name: 'Remote Browser (CDP)', icon: 'globe', desc: 'Connect to a Chrome/Chromium instance via Chrome DevTools Protocol. Required for headed mode, video calls, persistent sessions.' },
|
|
339
|
+
{ id: 'browserless', name: 'Browserless.io', icon: 'globe', desc: 'Cloud browser service. Scalable, managed infrastructure. Supports stealth mode, residential proxies, and concurrent sessions.' },
|
|
340
|
+
{ id: 'browserbase', name: 'Browserbase', icon: 'upload', desc: 'AI-native cloud browser. Built for agent automation with session replay, anti-detection, and managed infrastructure.' },
|
|
341
|
+
{ id: 'steel', name: 'Steel.dev', icon: 'activity', desc: 'Open-source browser API designed for AI agents. Self-hostable, session management, built-in stealth.' },
|
|
342
|
+
{ id: 'scrapingbee', name: 'ScrapingBee', icon: 'search', desc: 'Web scraping API with browser rendering, proxy rotation, and CAPTCHA solving.' },
|
|
343
343
|
];
|
|
344
344
|
|
|
345
345
|
return h('div', { className: 'card', style: { marginTop: 16 } },
|
|
@@ -349,7 +349,7 @@ export function BrowserConfigCard(props) {
|
|
|
349
349
|
onClick: function() { setCollapsed(!collapsed); }
|
|
350
350
|
},
|
|
351
351
|
h('span', { style: { display: 'flex', alignItems: 'center', gap: 8 } },
|
|
352
|
-
'
|
|
352
|
+
I.globe(), ' Browser & Web Automation', h(HelpButton, { label: 'Browser & Web Automation' },
|
|
353
353
|
h('p', null, 'Configure how this agent accesses web pages. Choose from local Chromium, remote browsers (CDP), or cloud browser services.'),
|
|
354
354
|
h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
|
|
355
355
|
h('li', null, h('strong', null, 'Local Chromium'), ' — Built-in headless browser. Best for most automation tasks.'),
|
|
@@ -368,7 +368,7 @@ export function BrowserConfigCard(props) {
|
|
|
368
368
|
|
|
369
369
|
// ─── Section 1: Browser Provider ─────────────────
|
|
370
370
|
h('div', { style: sectionStyle },
|
|
371
|
-
sectionTitle(
|
|
371
|
+
sectionTitle(I.settings(), 'Browser Provider'),
|
|
372
372
|
h('div', { style: { display: 'grid', gap: 8, gridTemplateColumns: 'repeat(auto-fill, minmax(280px, 1fr))' } },
|
|
373
373
|
providers.map(function(p) {
|
|
374
374
|
var selected = provider === p.id;
|
|
@@ -383,9 +383,9 @@ export function BrowserConfigCard(props) {
|
|
|
383
383
|
}
|
|
384
384
|
},
|
|
385
385
|
h('div', { style: { display: 'flex', alignItems: 'center', gap: 8, marginBottom: 4 } },
|
|
386
|
-
h('span', { style: { fontSize: 18 } }, p.icon),
|
|
386
|
+
I[p.icon] ? I[p.icon]() : h('span', { style: { fontSize: 18 } }, p.icon),
|
|
387
387
|
h('span', { style: { fontWeight: 600, fontSize: 13 } }, p.name),
|
|
388
|
-
selected && h('span', { style: { marginLeft: 'auto', color: 'var(--accent)', fontSize: 14 } },
|
|
388
|
+
selected && h('span', { style: { marginLeft: 'auto', color: 'var(--accent)', fontSize: 14 } }, I.check())
|
|
389
389
|
),
|
|
390
390
|
h('div', { style: { fontSize: 11, color: 'var(--text-muted)', lineHeight: 1.4 } }, p.desc)
|
|
391
391
|
);
|
|
@@ -398,7 +398,7 @@ export function BrowserConfigCard(props) {
|
|
|
398
398
|
|
|
399
399
|
// Local Chromium
|
|
400
400
|
provider === 'local' && h(Fragment, null,
|
|
401
|
-
sectionTitle(
|
|
401
|
+
sectionTitle(I.dashboard(), 'Local Chromium Settings'),
|
|
402
402
|
h('div', { style: { display: 'grid', gap: 12, gridTemplateColumns: '1fr 1fr' } },
|
|
403
403
|
h('div', { className: 'form-group' },
|
|
404
404
|
h('label', { style: labelStyle }, 'Display Mode'),
|
|
@@ -439,7 +439,7 @@ export function BrowserConfigCard(props) {
|
|
|
439
439
|
|
|
440
440
|
// Remote CDP
|
|
441
441
|
provider === 'remote-cdp' && h(Fragment, null,
|
|
442
|
-
sectionTitle(
|
|
442
|
+
sectionTitle(I.globe(), 'Remote Browser Connection'),
|
|
443
443
|
h('div', { style: { padding: '10px 14px', background: 'var(--info-soft)', borderRadius: 'var(--radius)', marginBottom: 12, fontSize: 12, lineHeight: 1.5 } },
|
|
444
444
|
h('strong', null, 'How it works: '),
|
|
445
445
|
'The agent connects to a Chrome/Chromium browser running on another machine via the Chrome DevTools Protocol (CDP). ',
|
|
@@ -489,7 +489,7 @@ export function BrowserConfigCard(props) {
|
|
|
489
489
|
|
|
490
490
|
// Browserless
|
|
491
491
|
provider === 'browserless' && h(Fragment, null,
|
|
492
|
-
sectionTitle(
|
|
492
|
+
sectionTitle(I.globe(), 'Browserless.io Configuration'),
|
|
493
493
|
h('div', { style: { display: 'grid', gap: 12 } },
|
|
494
494
|
h('div', { className: 'form-group' },
|
|
495
495
|
h('label', { style: labelStyle }, 'API Token *'),
|
|
@@ -539,7 +539,7 @@ export function BrowserConfigCard(props) {
|
|
|
539
539
|
|
|
540
540
|
// Browserbase
|
|
541
541
|
provider === 'browserbase' && h(Fragment, null,
|
|
542
|
-
sectionTitle(
|
|
542
|
+
sectionTitle(I.upload(), 'Browserbase Configuration'),
|
|
543
543
|
h('div', { style: { display: 'grid', gap: 12 } },
|
|
544
544
|
h('div', { className: 'form-group' },
|
|
545
545
|
h('label', { style: labelStyle }, 'API Key *'),
|
|
@@ -581,7 +581,7 @@ export function BrowserConfigCard(props) {
|
|
|
581
581
|
|
|
582
582
|
// Steel
|
|
583
583
|
provider === 'steel' && h(Fragment, null,
|
|
584
|
-
sectionTitle(
|
|
584
|
+
sectionTitle(I.activity(), 'Steel.dev Configuration'),
|
|
585
585
|
h('div', { style: { display: 'grid', gap: 12 } },
|
|
586
586
|
h('div', { className: 'form-group' },
|
|
587
587
|
h('label', { style: labelStyle }, 'API Key *'),
|
|
@@ -612,7 +612,7 @@ export function BrowserConfigCard(props) {
|
|
|
612
612
|
|
|
613
613
|
// ScrapingBee
|
|
614
614
|
provider === 'scrapingbee' && h(Fragment, null,
|
|
615
|
-
sectionTitle(
|
|
615
|
+
sectionTitle(I.search(), 'ScrapingBee Configuration'),
|
|
616
616
|
h('div', { style: { display: 'grid', gap: 12 } },
|
|
617
617
|
h('div', { className: 'form-group' },
|
|
618
618
|
h('label', { style: labelStyle }, 'API Key *'),
|
|
@@ -655,7 +655,7 @@ export function BrowserConfigCard(props) {
|
|
|
655
655
|
|
|
656
656
|
// ─── Section 3: Security & Limits ────────────────
|
|
657
657
|
h('div', { style: sectionStyle },
|
|
658
|
-
sectionTitle(
|
|
658
|
+
sectionTitle(I.shield(), 'Security & Limits'),
|
|
659
659
|
h('div', { style: { display: 'grid', gap: 12, gridTemplateColumns: '1fr 1fr' } },
|
|
660
660
|
h('div', { className: 'form-group' },
|
|
661
661
|
h('label', { style: labelStyle }, 'URL Protection'),
|
|
@@ -728,7 +728,7 @@ export function BrowserConfigCard(props) {
|
|
|
728
728
|
|
|
729
729
|
// ─── Section 5: Persistent Sessions ──────────────
|
|
730
730
|
h('div', { style: { paddingTop: 12 } },
|
|
731
|
-
sectionTitle(
|
|
731
|
+
sectionTitle(I.refresh(), 'Session Persistence'),
|
|
732
732
|
h('div', { style: { display: 'grid', gap: 12, gridTemplateColumns: '1fr 1fr' } },
|
|
733
733
|
h('div', { className: 'form-group' },
|
|
734
734
|
h('label', { style: labelStyle }, 'Persist Login Sessions'),
|
|
@@ -758,7 +758,7 @@ export function BrowserConfigCard(props) {
|
|
|
758
758
|
testing ? 'Testing...' : '\u{1F50C} Test Connection'
|
|
759
759
|
),
|
|
760
760
|
testResult && h('span', { style: { fontSize: 12, color: testResult.error ? 'var(--danger)' : 'var(--success)', alignSelf: 'center' } },
|
|
761
|
-
testResult.error ? '
|
|
761
|
+
testResult.error ? 'Failed: ' + testResult.error : 'Connected — ' + (testResult.browserVersion || 'OK')
|
|
762
762
|
)
|
|
763
763
|
),
|
|
764
764
|
h('button', { className: 'btn', disabled: saving, onClick: save }, saving ? 'Saving...' : 'Save Browser Config')
|
|
@@ -810,7 +810,7 @@ export function ToolRestrictionsCard(props) {
|
|
|
810
810
|
style: { cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'space-between' },
|
|
811
811
|
onClick: function() { setCollapsed(!collapsed); }
|
|
812
812
|
},
|
|
813
|
-
h('span', { style: { display: 'flex', alignItems: 'center' } }, '
|
|
813
|
+
h('span', { style: { display: 'flex', alignItems: 'center' } }, I.shield(), ' Tool Restrictions', h(HelpButton, { label: 'Tool Restrictions' },
|
|
814
814
|
h('p', null, 'Per-agent restrictions on file sizes, shell access, web fetching, email sending, database access, and file sharing. These are independent of tool security sandboxes.'),
|
|
815
815
|
h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Use these to limit what an agent can do beyond its tool security settings. For example, block shell execution for agents that only need email access.')
|
|
816
816
|
)),
|
|
@@ -524,7 +524,7 @@ export function SettingsPage() {
|
|
|
524
524
|
|
|
525
525
|
// Info about per-agent auth
|
|
526
526
|
orgEmail.configured && h('div', { style: { marginTop: 16, padding: '12px 16px', background: 'var(--bg-tertiary)', borderRadius: 'var(--radius)', fontSize: 12, color: 'var(--text-muted)' } },
|
|
527
|
-
'
|
|
527
|
+
'Each agent still needs to individually authorize via their Email tab. This org config provides the shared OAuth app credentials so agents don\'t need to enter Client ID/Secret individually.'
|
|
528
528
|
)
|
|
529
529
|
)
|
|
530
530
|
),
|