@agenticmail/enterprise 0.5.277 → 0.5.279

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.
@@ -174,7 +174,54 @@ Object.assign(BrandLogo, {
174
174
  heroku: function(s) { return _pill('#430098', '#fff', 'H', s); },
175
175
  firebase: function(s) { return _pill('#FFCA28', '#000', 'FB', s); },
176
176
  openai: function(s) { return _pill('#412991', '#fff', 'AI', s); },
177
- mongodb: function(s) { return _pill('#47A248', '#fff', 'MG', s); },
177
+ mongodb: function(s) {
178
+ s = s || 28;
179
+ return h('svg', { viewBox: '0 0 28 28', width: s, height: s, style: { borderRadius: 4 } },
180
+ h('rect', { width: 28, height: 28, rx: 4, fill: '#023430' }),
181
+ h('path', { d: 'M14.5 5c-.2 1.2-.8 2.1-1.6 2.9-1.3 1.3-2.6 2.5-3 4.3-.5 2.3.3 4.2 1.8 5.8.3.3.6.6 1 .8l.1 1.8h1.4l.1-1.8c2-1 3.2-2.6 3.3-4.9.1-2.5-1.2-4.3-2.7-5.9-.3-.3-.5-.6-.5-1 0-.7.1-1.4.1-2z', fill: '#00ED64' }),
182
+ h('path', { d: 'M14.2 20.7l.1 1.8h-.6l.1-1.8c-.1-.1-.2-.3-.3-.4.1 0 .2-.1.4-.1s.3 0 .4.1c-.1.1-.1.3-.1.4z', fill: '#B8C4C2' })
183
+ );
184
+ },
185
+ postgresql: function(s) {
186
+ s = s || 28;
187
+ return h('svg', { viewBox: '0 0 28 28', width: s, height: s, style: { borderRadius: 4 } },
188
+ h('rect', { width: 28, height: 28, rx: 4, fill: '#336791' }),
189
+ h('path', { d: 'M20.3 17.6c-.4-1-.3-1.9-.2-3 .1-.7.2-1.5.1-2.4-.2-2.1-1.5-3.5-2.5-4.3.4-.1.8-.3 1.1-.5 0 0-2.7-1-5.2-.1-.6.1-1.1.3-1.6.6-1-.3-2.4-.4-3.4 0C6.3 9.2 7 11.1 7 11.1l.2-.1c.5-.3 1.1-.3 1.7-.2-.4.6-.7 1.3-.7 2.1 0 .3 0 .7.1 1 .4 1.5 1.5 2.2 2.6 2.4-.2.3-.4.7-.4 1.2v.2c-.5.2-1.2.2-1.6-.2-.5-.5-.8-1.1-1.5-1.3-.3-.1-.6 0-.5.2.5.5.8.8 1.1 1.4.3.5.7.9 1.4 1 .5.1 1.1 0 1.3-.1v1.5c0 .3-.2.5-.3.6-.1.1-.2.3.1.4.3.1 1.4.3 1.7-.4.1-.2.1-.4.1-.6v-2.2c0-.5 0-1 .1-1.1l.2-.2v3.5c0 .4-.1 1.2.2 1.5.1.2.4.5.8.4.3-.1.5-.2.5-.7v-3.8c.2 0 .2.4.2.4v2.3c0 .3.1.7.3.9.4.5 1.3.4 1.6.2.3-.2.2-.6.2-.9v-2.9c.1-.3.3-.6.3-.6s0 1.8.9 2.8c.5.6 1.3.8 1.7.3.4-.5-.2-1-.5-1.7z', fill: '#fff' })
190
+ );
191
+ },
192
+ mysql: function(s) {
193
+ s = s || 28;
194
+ return h('svg', { viewBox: '0 0 28 28', width: s, height: s, style: { borderRadius: 4 } },
195
+ h('rect', { width: 28, height: 28, rx: 4, fill: '#00546B' }),
196
+ h('path', { d: 'M6 19.5c0-1 .6-1.5 1.8-1.7l1.5-.2c.5-.1.7-.3.7-.6 0-.4-.4-.7-1.1-.7s-1.2.3-1.3.8H6.2c.1-1.1 1-1.8 2.5-1.8s2.4.7 2.4 1.8v3.4h-1.3v-.7c-.4.5-1 .8-1.7.8-1.1 0-2.1-.5-2.1-1.6v-.5zm4-.4v-.4l-1.3.2c-.6.1-.9.3-.9.7 0 .4.3.6.9.6.8 0 1.3-.4 1.3-1.1z', fill: '#F29111' }),
197
+ h('text', { x: 18, y: 20.5, textAnchor: 'middle', fill: '#F29111', fontFamily: 'system-ui,sans-serif', fontWeight: 700, fontSize: 7 }, 'SQL')
198
+ );
199
+ },
200
+ redis: function(s) {
201
+ s = s || 28;
202
+ return h('svg', { viewBox: '0 0 28 28', width: s, height: s, style: { borderRadius: 4 } },
203
+ h('rect', { width: 28, height: 28, rx: 4, fill: '#DC382D' }),
204
+ h('path', { d: 'M22.5 16.2c-1 .5-6 2.6-7.1 3.1-1 .6-1.6.6-2.5.1-1-.5-6.3-2.6-7.3-3.1-.5-.3-.8-.5-.8-.7v-2.2s7-1.5 8.2-2c1.2-.4 1.6-.4 2.6 0 1 .4 6.9 1.9 6.9 1.9v2.2c0 .2-.3.5-1 .7z', fill: '#fff', opacity: '.3' }),
205
+ h('path', { d: 'M22.5 13.9c-1 .5-6 2.6-7.1 3.1-1 .6-1.6.6-2.5.1-1-.5-6.3-2.6-7.3-3.1-1-.5-1-.8 0-1.2 1-.4 6.3-2.5 7.4-2.9 1.2-.4 1.6-.4 2.6 0 1 .4 5.8 2.3 6.8 2.8 1.1.4 1.1.8.1 1.2z', fill: '#fff' }),
206
+ h('path', { d: 'M14.8 12.4l-1.3-.5-1.2.5.6-1.1-.5-1 1.3.3 1-.6-.2 1.2.8.9-1.5.3z', fill: '#DC382D' })
207
+ );
208
+ },
209
+ sqlite: function(s) {
210
+ s = s || 28;
211
+ return h('svg', { viewBox: '0 0 28 28', width: s, height: s, style: { borderRadius: 4 } },
212
+ h('rect', { width: 28, height: 28, rx: 4, fill: '#003B57' }),
213
+ h('path', { d: 'M17.5 5L11 11.5c-.3.4-.5.9-.6 1.5-.2 1.3.2 2.8.8 4.2.6 1.3 1.2 2.3 1.6 3.1.4.8.6 1.3.6 1.7H12c0-.5-1.2-2.4-1.8-3.9-.6-1.6-1-3.3-.7-5 .2-.9.6-1.7 1.2-2.3L17.5 5z', fill: '#fff' }),
214
+ h('circle', { cx: 17.5, cy: 8, r: 2, fill: '#0F80CC' })
215
+ );
216
+ },
217
+ mariadb: function(s) { return _pill('#003545', '#C97E68', 'MDB', s); },
218
+ mssql: function(s) { return _pill('#CC2927', '#fff', 'SQL', s); },
219
+ oracle: function(s) { return _pill('#F80000', '#fff', 'ORA', s); },
220
+ neon: function(s) { return _pill('#00E599', '#000', 'N', s); },
221
+ planetscale: function(s) { return _pill('#000', '#fff', 'PS', s); },
222
+ cockroachdb: function(s) { return _pill('#6933FF', '#fff', 'CR', s); },
223
+ turso: function(s) { return _pill('#4FF8D2', '#000', 'T', s); },
224
+ dynamodb: function(s) { return _pill('#4053D6', '#fff', 'DDB', s); },
178
225
  paypal: function(s) { return _pill('#003087', '#fff', 'PP', s); },
179
226
  linkedin: function(s) { return _pill('#0A66C2', '#fff', 'in', s); },
180
227
  twitter: function(s) { return _pill('#000', '#fff', 'X', s); },
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1"/>
6
6
  <title>AgenticMail Enterprise</title>
7
7
  <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><defs><linearGradient id='g' x1='0%25' y1='0%25' x2='100%25' y2='100%25'><stop offset='0%25' stop-color='%23f43f5e'/><stop offset='100%25' stop-color='%23e11d48'/></linearGradient></defs><rect x='2' y='5' width='20' height='14' rx='2.5' fill='url(%23g)'/><polyline points='2 5 12 13 22 5' stroke='white' stroke-width='1.8' fill='none' stroke-linejoin='round' opacity='0.85'/></svg>"/>
8
- <script src="/dashboard/vendor/react.development.js"></script>
9
- <script src="/dashboard/vendor/react-dom.development.js"></script>
8
+ <script src="/dashboard/vendor/react.production.min.js"></script>
9
+ <script src="/dashboard/vendor/react-dom.production.min.js"></script>
10
10
  <style>
11
11
  /* ═══════════════════════════════════════════════════════════
12
12
  THEME SYSTEM — CSS Custom Properties
@@ -2,30 +2,37 @@ import { h, useState, useEffect, useCallback, Fragment, useApp, engineCall, getO
2
2
  import { I } from '../components/icons.js?v=2';
3
3
  import { Modal } from '../components/modal.js';
4
4
  import { HelpButton } from '../components/help-button.js';
5
+ import { BrandLogo } from '../assets/brand-logos.js';
5
6
 
6
7
  var DATABASE_TYPES = [
7
8
  { section: 'Relational (SQL)', items: [
8
- { value: 'postgresql', label: 'PostgreSQL', icon: '🐘' },
9
- { value: 'mysql', label: 'MySQL', icon: '🐬' },
10
- { value: 'mariadb', label: 'MariaDB', icon: '🦭' },
11
- { value: 'mssql', label: 'Microsoft SQL Server', icon: '🪟' },
12
- { value: 'oracle', label: 'Oracle', icon: '🔴' },
13
- { value: 'sqlite', label: 'SQLite', icon: '📦' },
9
+ { value: 'postgresql', label: 'PostgreSQL' },
10
+ { value: 'mysql', label: 'MySQL' },
11
+ { value: 'mariadb', label: 'MariaDB' },
12
+ { value: 'mssql', label: 'Microsoft SQL Server' },
13
+ { value: 'oracle', label: 'Oracle' },
14
+ { value: 'sqlite', label: 'SQLite' },
14
15
  ]},
15
16
  { section: 'Cloud-Native SQL', items: [
16
- { value: 'supabase', label: 'Supabase', icon: '⚡' },
17
- { value: 'neon', label: 'Neon', icon: '🌀' },
18
- { value: 'planetscale', label: 'PlanetScale', icon: '🪐' },
19
- { value: 'cockroachdb', label: 'CockroachDB', icon: '🪳' },
20
- { value: 'turso', label: 'Turso / LibSQL', icon: '🐢' },
17
+ { value: 'supabase', label: 'Supabase' },
18
+ { value: 'neon', label: 'Neon' },
19
+ { value: 'planetscale', label: 'PlanetScale' },
20
+ { value: 'cockroachdb', label: 'CockroachDB' },
21
+ { value: 'turso', label: 'Turso / LibSQL' },
21
22
  ]},
22
23
  { section: 'NoSQL / Key-Value', items: [
23
- { value: 'mongodb', label: 'MongoDB', icon: '🍃' },
24
- { value: 'redis', label: 'Redis', icon: '🔴' },
25
- { value: 'dynamodb', label: 'AWS DynamoDB', icon: '☁️' },
24
+ { value: 'mongodb', label: 'MongoDB' },
25
+ { value: 'redis', label: 'Redis' },
26
+ { value: 'dynamodb', label: 'AWS DynamoDB' },
26
27
  ]},
27
28
  ];
28
29
 
30
+ function dbLogo(type, size) {
31
+ if (BrandLogo[type]) return BrandLogo[type](size || 28);
32
+ var dbType = ALL_DB_TYPES.find(function(d) { return d.value === type; });
33
+ return h('span', { style: { fontSize: (size || 28) * 0.75 + 'px', lineHeight: 1 } }, dbType ? dbType.label.charAt(0) : '?');
34
+ }
35
+
29
36
  var ALL_DB_TYPES = DATABASE_TYPES.flatMap(function(s) { return s.items; });
30
37
 
31
38
  var PERMISSIONS = [
@@ -205,7 +212,7 @@ function ConnectionsTab(props) {
205
212
  var statusStyle = conn.status === 'active' ? s.badgeActive : conn.status === 'error' ? s.badgeError : s.badgeInactive;
206
213
  return h('div', { key: conn.id, style: s.card },
207
214
  h('div', { style: s.cardHeader },
208
- h('span', { style: s.cardIcon }, dbType ? dbType.icon : '🗄️'),
215
+ h('span', { style: s.cardIcon }, dbLogo(conn.type, 32)),
209
216
  h('div', null,
210
217
  h('div', { style: s.cardTitle }, conn.name),
211
218
  h('div', { style: s.cardType }, dbType ? dbType.label : conn.type),
@@ -275,7 +282,7 @@ function AgentAccessTab(props) {
275
282
  var dbType = ALL_DB_TYPES.find(function(t) { return t.value === conn.type; });
276
283
  return h('div', { key: grant.connectionId, style: s.agentRow },
277
284
  h('div', { style: css('display: flex; align-items: center; gap: 8px;') },
278
- h('span', null, dbType ? dbType.icon : '🗄️'),
285
+ h('span', null, dbLogo(conn.type, 20)),
279
286
  h('span', { style: s.agentName }, conn.name || grant.connectionId),
280
287
  ),
281
288
  h('div', { style: s.agentPerms },
@@ -391,7 +398,7 @@ function AddConnectionModal(props) {
391
398
  style: isActive ? s.dbPickerItemActive : s.dbPickerItem,
392
399
  onClick: function() { setDbType(item.value); },
393
400
  },
394
- h('div', { style: css('font-size: 24px; margin-bottom: 4px;') }, item.icon),
401
+ h('div', { style: css('margin-bottom: 4px; display: flex; justify-content: center;') }, dbLogo(item.value, 32)),
395
402
  h('div', { style: css('font-size: 12px; font-weight: 500;') }, item.label),
396
403
  );
397
404
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agenticmail/enterprise",
3
- "version": "0.5.277",
3
+ "version": "0.5.279",
4
4
  "description": "AgenticMail Enterprise — cloud-hosted AI agent identity, email, auth & compliance for organizations",
5
5
  "type": "module",
6
6
  "bin": {
@@ -174,7 +174,54 @@ Object.assign(BrandLogo, {
174
174
  heroku: function(s) { return _pill('#430098', '#fff', 'H', s); },
175
175
  firebase: function(s) { return _pill('#FFCA28', '#000', 'FB', s); },
176
176
  openai: function(s) { return _pill('#412991', '#fff', 'AI', s); },
177
- mongodb: function(s) { return _pill('#47A248', '#fff', 'MG', s); },
177
+ mongodb: function(s) {
178
+ s = s || 28;
179
+ return h('svg', { viewBox: '0 0 28 28', width: s, height: s, style: { borderRadius: 4 } },
180
+ h('rect', { width: 28, height: 28, rx: 4, fill: '#023430' }),
181
+ h('path', { d: 'M14.5 5c-.2 1.2-.8 2.1-1.6 2.9-1.3 1.3-2.6 2.5-3 4.3-.5 2.3.3 4.2 1.8 5.8.3.3.6.6 1 .8l.1 1.8h1.4l.1-1.8c2-1 3.2-2.6 3.3-4.9.1-2.5-1.2-4.3-2.7-5.9-.3-.3-.5-.6-.5-1 0-.7.1-1.4.1-2z', fill: '#00ED64' }),
182
+ h('path', { d: 'M14.2 20.7l.1 1.8h-.6l.1-1.8c-.1-.1-.2-.3-.3-.4.1 0 .2-.1.4-.1s.3 0 .4.1c-.1.1-.1.3-.1.4z', fill: '#B8C4C2' })
183
+ );
184
+ },
185
+ postgresql: function(s) {
186
+ s = s || 28;
187
+ return h('svg', { viewBox: '0 0 28 28', width: s, height: s, style: { borderRadius: 4 } },
188
+ h('rect', { width: 28, height: 28, rx: 4, fill: '#336791' }),
189
+ h('path', { d: 'M20.3 17.6c-.4-1-.3-1.9-.2-3 .1-.7.2-1.5.1-2.4-.2-2.1-1.5-3.5-2.5-4.3.4-.1.8-.3 1.1-.5 0 0-2.7-1-5.2-.1-.6.1-1.1.3-1.6.6-1-.3-2.4-.4-3.4 0C6.3 9.2 7 11.1 7 11.1l.2-.1c.5-.3 1.1-.3 1.7-.2-.4.6-.7 1.3-.7 2.1 0 .3 0 .7.1 1 .4 1.5 1.5 2.2 2.6 2.4-.2.3-.4.7-.4 1.2v.2c-.5.2-1.2.2-1.6-.2-.5-.5-.8-1.1-1.5-1.3-.3-.1-.6 0-.5.2.5.5.8.8 1.1 1.4.3.5.7.9 1.4 1 .5.1 1.1 0 1.3-.1v1.5c0 .3-.2.5-.3.6-.1.1-.2.3.1.4.3.1 1.4.3 1.7-.4.1-.2.1-.4.1-.6v-2.2c0-.5 0-1 .1-1.1l.2-.2v3.5c0 .4-.1 1.2.2 1.5.1.2.4.5.8.4.3-.1.5-.2.5-.7v-3.8c.2 0 .2.4.2.4v2.3c0 .3.1.7.3.9.4.5 1.3.4 1.6.2.3-.2.2-.6.2-.9v-2.9c.1-.3.3-.6.3-.6s0 1.8.9 2.8c.5.6 1.3.8 1.7.3.4-.5-.2-1-.5-1.7z', fill: '#fff' })
190
+ );
191
+ },
192
+ mysql: function(s) {
193
+ s = s || 28;
194
+ return h('svg', { viewBox: '0 0 28 28', width: s, height: s, style: { borderRadius: 4 } },
195
+ h('rect', { width: 28, height: 28, rx: 4, fill: '#00546B' }),
196
+ h('path', { d: 'M6 19.5c0-1 .6-1.5 1.8-1.7l1.5-.2c.5-.1.7-.3.7-.6 0-.4-.4-.7-1.1-.7s-1.2.3-1.3.8H6.2c.1-1.1 1-1.8 2.5-1.8s2.4.7 2.4 1.8v3.4h-1.3v-.7c-.4.5-1 .8-1.7.8-1.1 0-2.1-.5-2.1-1.6v-.5zm4-.4v-.4l-1.3.2c-.6.1-.9.3-.9.7 0 .4.3.6.9.6.8 0 1.3-.4 1.3-1.1z', fill: '#F29111' }),
197
+ h('text', { x: 18, y: 20.5, textAnchor: 'middle', fill: '#F29111', fontFamily: 'system-ui,sans-serif', fontWeight: 700, fontSize: 7 }, 'SQL')
198
+ );
199
+ },
200
+ redis: function(s) {
201
+ s = s || 28;
202
+ return h('svg', { viewBox: '0 0 28 28', width: s, height: s, style: { borderRadius: 4 } },
203
+ h('rect', { width: 28, height: 28, rx: 4, fill: '#DC382D' }),
204
+ h('path', { d: 'M22.5 16.2c-1 .5-6 2.6-7.1 3.1-1 .6-1.6.6-2.5.1-1-.5-6.3-2.6-7.3-3.1-.5-.3-.8-.5-.8-.7v-2.2s7-1.5 8.2-2c1.2-.4 1.6-.4 2.6 0 1 .4 6.9 1.9 6.9 1.9v2.2c0 .2-.3.5-1 .7z', fill: '#fff', opacity: '.3' }),
205
+ h('path', { d: 'M22.5 13.9c-1 .5-6 2.6-7.1 3.1-1 .6-1.6.6-2.5.1-1-.5-6.3-2.6-7.3-3.1-1-.5-1-.8 0-1.2 1-.4 6.3-2.5 7.4-2.9 1.2-.4 1.6-.4 2.6 0 1 .4 5.8 2.3 6.8 2.8 1.1.4 1.1.8.1 1.2z', fill: '#fff' }),
206
+ h('path', { d: 'M14.8 12.4l-1.3-.5-1.2.5.6-1.1-.5-1 1.3.3 1-.6-.2 1.2.8.9-1.5.3z', fill: '#DC382D' })
207
+ );
208
+ },
209
+ sqlite: function(s) {
210
+ s = s || 28;
211
+ return h('svg', { viewBox: '0 0 28 28', width: s, height: s, style: { borderRadius: 4 } },
212
+ h('rect', { width: 28, height: 28, rx: 4, fill: '#003B57' }),
213
+ h('path', { d: 'M17.5 5L11 11.5c-.3.4-.5.9-.6 1.5-.2 1.3.2 2.8.8 4.2.6 1.3 1.2 2.3 1.6 3.1.4.8.6 1.3.6 1.7H12c0-.5-1.2-2.4-1.8-3.9-.6-1.6-1-3.3-.7-5 .2-.9.6-1.7 1.2-2.3L17.5 5z', fill: '#fff' }),
214
+ h('circle', { cx: 17.5, cy: 8, r: 2, fill: '#0F80CC' })
215
+ );
216
+ },
217
+ mariadb: function(s) { return _pill('#003545', '#C97E68', 'MDB', s); },
218
+ mssql: function(s) { return _pill('#CC2927', '#fff', 'SQL', s); },
219
+ oracle: function(s) { return _pill('#F80000', '#fff', 'ORA', s); },
220
+ neon: function(s) { return _pill('#00E599', '#000', 'N', s); },
221
+ planetscale: function(s) { return _pill('#000', '#fff', 'PS', s); },
222
+ cockroachdb: function(s) { return _pill('#6933FF', '#fff', 'CR', s); },
223
+ turso: function(s) { return _pill('#4FF8D2', '#000', 'T', s); },
224
+ dynamodb: function(s) { return _pill('#4053D6', '#fff', 'DDB', s); },
178
225
  paypal: function(s) { return _pill('#003087', '#fff', 'PP', s); },
179
226
  linkedin: function(s) { return _pill('#0A66C2', '#fff', 'in', s); },
180
227
  twitter: function(s) { return _pill('#000', '#fff', 'X', s); },
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1"/>
6
6
  <title>AgenticMail Enterprise</title>
7
7
  <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><defs><linearGradient id='g' x1='0%25' y1='0%25' x2='100%25' y2='100%25'><stop offset='0%25' stop-color='%23f43f5e'/><stop offset='100%25' stop-color='%23e11d48'/></linearGradient></defs><rect x='2' y='5' width='20' height='14' rx='2.5' fill='url(%23g)'/><polyline points='2 5 12 13 22 5' stroke='white' stroke-width='1.8' fill='none' stroke-linejoin='round' opacity='0.85'/></svg>"/>
8
- <script src="/dashboard/vendor/react.development.js"></script>
9
- <script src="/dashboard/vendor/react-dom.development.js"></script>
8
+ <script src="/dashboard/vendor/react.production.min.js"></script>
9
+ <script src="/dashboard/vendor/react-dom.production.min.js"></script>
10
10
  <style>
11
11
  /* ═══════════════════════════════════════════════════════════
12
12
  THEME SYSTEM — CSS Custom Properties
@@ -2,30 +2,37 @@ import { h, useState, useEffect, useCallback, Fragment, useApp, engineCall, getO
2
2
  import { I } from '../components/icons.js?v=2';
3
3
  import { Modal } from '../components/modal.js';
4
4
  import { HelpButton } from '../components/help-button.js';
5
+ import { BrandLogo } from '../assets/brand-logos.js';
5
6
 
6
7
  var DATABASE_TYPES = [
7
8
  { section: 'Relational (SQL)', items: [
8
- { value: 'postgresql', label: 'PostgreSQL', icon: '🐘' },
9
- { value: 'mysql', label: 'MySQL', icon: '🐬' },
10
- { value: 'mariadb', label: 'MariaDB', icon: '🦭' },
11
- { value: 'mssql', label: 'Microsoft SQL Server', icon: '🪟' },
12
- { value: 'oracle', label: 'Oracle', icon: '🔴' },
13
- { value: 'sqlite', label: 'SQLite', icon: '📦' },
9
+ { value: 'postgresql', label: 'PostgreSQL' },
10
+ { value: 'mysql', label: 'MySQL' },
11
+ { value: 'mariadb', label: 'MariaDB' },
12
+ { value: 'mssql', label: 'Microsoft SQL Server' },
13
+ { value: 'oracle', label: 'Oracle' },
14
+ { value: 'sqlite', label: 'SQLite' },
14
15
  ]},
15
16
  { section: 'Cloud-Native SQL', items: [
16
- { value: 'supabase', label: 'Supabase', icon: '⚡' },
17
- { value: 'neon', label: 'Neon', icon: '🌀' },
18
- { value: 'planetscale', label: 'PlanetScale', icon: '🪐' },
19
- { value: 'cockroachdb', label: 'CockroachDB', icon: '🪳' },
20
- { value: 'turso', label: 'Turso / LibSQL', icon: '🐢' },
17
+ { value: 'supabase', label: 'Supabase' },
18
+ { value: 'neon', label: 'Neon' },
19
+ { value: 'planetscale', label: 'PlanetScale' },
20
+ { value: 'cockroachdb', label: 'CockroachDB' },
21
+ { value: 'turso', label: 'Turso / LibSQL' },
21
22
  ]},
22
23
  { section: 'NoSQL / Key-Value', items: [
23
- { value: 'mongodb', label: 'MongoDB', icon: '🍃' },
24
- { value: 'redis', label: 'Redis', icon: '🔴' },
25
- { value: 'dynamodb', label: 'AWS DynamoDB', icon: '☁️' },
24
+ { value: 'mongodb', label: 'MongoDB' },
25
+ { value: 'redis', label: 'Redis' },
26
+ { value: 'dynamodb', label: 'AWS DynamoDB' },
26
27
  ]},
27
28
  ];
28
29
 
30
+ function dbLogo(type, size) {
31
+ if (BrandLogo[type]) return BrandLogo[type](size || 28);
32
+ var dbType = ALL_DB_TYPES.find(function(d) { return d.value === type; });
33
+ return h('span', { style: { fontSize: (size || 28) * 0.75 + 'px', lineHeight: 1 } }, dbType ? dbType.label.charAt(0) : '?');
34
+ }
35
+
29
36
  var ALL_DB_TYPES = DATABASE_TYPES.flatMap(function(s) { return s.items; });
30
37
 
31
38
  var PERMISSIONS = [
@@ -205,7 +212,7 @@ function ConnectionsTab(props) {
205
212
  var statusStyle = conn.status === 'active' ? s.badgeActive : conn.status === 'error' ? s.badgeError : s.badgeInactive;
206
213
  return h('div', { key: conn.id, style: s.card },
207
214
  h('div', { style: s.cardHeader },
208
- h('span', { style: s.cardIcon }, dbType ? dbType.icon : '🗄️'),
215
+ h('span', { style: s.cardIcon }, dbLogo(conn.type, 32)),
209
216
  h('div', null,
210
217
  h('div', { style: s.cardTitle }, conn.name),
211
218
  h('div', { style: s.cardType }, dbType ? dbType.label : conn.type),
@@ -275,7 +282,7 @@ function AgentAccessTab(props) {
275
282
  var dbType = ALL_DB_TYPES.find(function(t) { return t.value === conn.type; });
276
283
  return h('div', { key: grant.connectionId, style: s.agentRow },
277
284
  h('div', { style: css('display: flex; align-items: center; gap: 8px;') },
278
- h('span', null, dbType ? dbType.icon : '🗄️'),
285
+ h('span', null, dbLogo(conn.type, 20)),
279
286
  h('span', { style: s.agentName }, conn.name || grant.connectionId),
280
287
  ),
281
288
  h('div', { style: s.agentPerms },
@@ -391,7 +398,7 @@ function AddConnectionModal(props) {
391
398
  style: isActive ? s.dbPickerItemActive : s.dbPickerItem,
392
399
  onClick: function() { setDbType(item.value); },
393
400
  },
394
- h('div', { style: css('font-size: 24px; margin-bottom: 4px;') }, item.icon),
401
+ h('div', { style: css('margin-bottom: 4px; display: flex; justify-content: center;') }, dbLogo(item.value, 32)),
395
402
  h('div', { style: css('font-size: 12px; font-weight: 500;') }, item.label),
396
403
  );
397
404
  })