@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('\uD83C\uDFA5', 'Meetings & Video Calls'),
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...' : '\u23F9\uFE0F Stop Meeting Browser'),
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
- ? '\u274C Not available on containers'
189
- : launching ? 'Launching...' : '\u25B6\uFE0F Launch Meeting Browser'
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', null, icon), text);
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: '\uD83D\uDCBB', 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: '\uD83C\uDF10', 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: '\u2601\uFE0F', desc: 'Cloud browser service. Scalable, managed infrastructure. Supports stealth mode, residential proxies, and concurrent sessions.' },
340
- { id: 'browserbase', name: 'Browserbase', icon: '\uD83D\uDE80', desc: 'AI-native cloud browser. Built for agent automation with session replay, anti-detection, and managed infrastructure.' },
341
- { id: 'steel', name: 'Steel.dev', icon: '\u26A1', desc: 'Open-source browser API designed for AI agents. Self-hostable, session management, built-in stealth.' },
342
- { id: 'scrapingbee', name: 'ScrapingBee', icon: '\uD83D\uDC1D', desc: 'Web scraping API with browser rendering, proxy rotation, and CAPTCHA solving.' },
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
- '\uD83C\uDF10 Browser & Web Automation', h(HelpButton, { label: 'Browser & Web Automation' },
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('\uD83D\uDD27', 'Browser Provider'),
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 } }, '\u2713')
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('\uD83D\uDCBB', 'Local Chromium Settings'),
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('\uD83C\uDF10', 'Remote Browser Connection'),
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('\u2601\uFE0F', 'Browserless.io Configuration'),
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('\uD83D\uDE80', 'Browserbase Configuration'),
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('\u26A1', 'Steel.dev Configuration'),
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('\uD83D\uDC1D', 'ScrapingBee Configuration'),
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('\uD83D\uDD12', 'Security & Limits'),
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('\uD83D\uDD04', 'Session Persistence'),
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 ? '\u274C ' + testResult.error : '\u2705 Connected — ' + (testResult.browserVersion || 'OK')
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' } }, '\uD83D\uDD12 Tool Restrictions', h(HelpButton, { label: 'Tool Restrictions' },
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
- '\u2139\uFE0F 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.'
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agenticmail/enterprise",
3
- "version": "0.5.234",
3
+ "version": "0.5.235",
4
4
  "description": "AgenticMail Enterprise — cloud-hosted AI agent identity, email, auth & compliance for organizations",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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('\uD83C\uDFA5', 'Meetings & Video Calls'),
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...' : '\u23F9\uFE0F Stop Meeting Browser'),
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
- ? '\u274C Not available on containers'
189
- : launching ? 'Launching...' : '\u25B6\uFE0F Launch Meeting Browser'
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', null, icon), text);
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: '\uD83D\uDCBB', 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: '\uD83C\uDF10', 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: '\u2601\uFE0F', desc: 'Cloud browser service. Scalable, managed infrastructure. Supports stealth mode, residential proxies, and concurrent sessions.' },
340
- { id: 'browserbase', name: 'Browserbase', icon: '\uD83D\uDE80', desc: 'AI-native cloud browser. Built for agent automation with session replay, anti-detection, and managed infrastructure.' },
341
- { id: 'steel', name: 'Steel.dev', icon: '\u26A1', desc: 'Open-source browser API designed for AI agents. Self-hostable, session management, built-in stealth.' },
342
- { id: 'scrapingbee', name: 'ScrapingBee', icon: '\uD83D\uDC1D', desc: 'Web scraping API with browser rendering, proxy rotation, and CAPTCHA solving.' },
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
- '\uD83C\uDF10 Browser & Web Automation', h(HelpButton, { label: 'Browser & Web Automation' },
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('\uD83D\uDD27', 'Browser Provider'),
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 } }, '\u2713')
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('\uD83D\uDCBB', 'Local Chromium Settings'),
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('\uD83C\uDF10', 'Remote Browser Connection'),
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('\u2601\uFE0F', 'Browserless.io Configuration'),
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('\uD83D\uDE80', 'Browserbase Configuration'),
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('\u26A1', 'Steel.dev Configuration'),
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('\uD83D\uDC1D', 'ScrapingBee Configuration'),
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('\uD83D\uDD12', 'Security & Limits'),
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('\uD83D\uDD04', 'Session Persistence'),
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 ? '\u274C ' + testResult.error : '\u2705 Connected — ' + (testResult.browserVersion || 'OK')
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' } }, '\uD83D\uDD12 Tool Restrictions', h(HelpButton, { label: 'Tool Restrictions' },
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
- '\u2139\uFE0F 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.'
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
  ),