@agenticmail/enterprise 0.5.299 → 0.5.300

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.
@@ -56,6 +56,7 @@ export const I = {
56
56
  chevronLeft: () => h('svg', S, h('polyline', { points: '15 18 9 12 15 6' })),
57
57
  chevronRight: () => h('svg', S, h('polyline', { points: '9 18 15 12 9 6' })),
58
58
  chevronDown: () => h('svg', S, h('polyline', { points: '6 9 12 15 18 9' })),
59
+ mail: () => h('svg', S, h('path', { d: 'M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z' }), h('polyline', { points: '22,6 12,13 2,6' })),
59
60
  building: () => h('svg', S, h('path', { d: 'M3 21h18M3 10h18M3 7l9-4 9 4M4 10v11M20 10v11M8 14v.01M12 14v.01M16 14v.01M8 18v.01M12 18v.01M16 18v.01' })),
60
61
  edit: () => h('svg', S, h('path', { d: 'M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7' }), h('path', { d: 'M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z' })),
61
62
  };
@@ -158,8 +158,9 @@ export function OrganizationsPage() {
158
158
  .finally(function() { setActing(''); });
159
159
  };
160
160
 
161
- var unassignedAgents = allAgents.filter(function(a) {
162
- return !a.client_org_id && detailAgents.every(function(da) { return da.id !== a.id; });
161
+ // Show agents not already in THIS org (includes unassigned AND agents from other orgs)
162
+ var assignableAgents = allAgents.filter(function(a) {
163
+ return detailAgents.every(function(da) { return da.id !== a.id; });
163
164
  });
164
165
 
165
166
  if (loading) return h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, 'Loading organizations...');
@@ -185,7 +186,11 @@ export function OrganizationsPage() {
185
186
  // Org cards
186
187
  orgs.length === 0
187
188
  ? h('div', { className: 'card', style: { textAlign: 'center', padding: 40 } },
188
- h('div', { style: { fontSize: 48, marginBottom: 12 } }, '🏢'),
189
+ h('div', { style: { width: 48, height: 48, margin: '0 auto 12px', borderRadius: '50%', background: 'var(--bg-tertiary)', display: 'flex', alignItems: 'center', justifyContent: 'center' } },
190
+ h('svg', { width: 28, height: 28, viewBox: '0 0 24 24', fill: 'none', stroke: 'var(--text-muted)', strokeWidth: 1.5, strokeLinecap: 'round', strokeLinejoin: 'round' },
191
+ h('path', { d: 'M3 21h18M3 10h18M3 7l9-4 9 4M4 10v11M20 10v11M8 14v.01M12 14v.01M16 14v.01M8 18v.01M12 18v.01M16 18v.01' })
192
+ )
193
+ ),
189
194
  h('div', { style: { fontSize: 15, fontWeight: 600, marginBottom: 4 } }, 'No organizations yet'),
190
195
  h('div', { style: { color: 'var(--text-muted)', fontSize: 13, marginBottom: 16 } }, 'Create your first client organization to start managing multi-tenant agent deployments.'),
191
196
  h('button', { className: 'btn btn-primary', onClick: openCreate }, I.plus(), ' Create Organization')
@@ -204,7 +209,7 @@ export function OrganizationsPage() {
204
209
  org.description && h('div', { style: { fontSize: 13, color: 'var(--text-secondary)', marginBottom: 12, lineHeight: 1.5 } }, org.description),
205
210
  h('div', { style: { display: 'flex', gap: 16, fontSize: 12, color: 'var(--text-muted)' } },
206
211
  h('span', null, I.agents(), ' ', (org.agent_count || 0), ' agent', (org.agent_count || 0) !== 1 ? 's' : ''),
207
- org.contact_email && h('span', null, ' ', org.contact_email),
212
+ org.contact_email && h('span', null, I.mail(), ' ', org.contact_email),
208
213
  org.created_at && h('span', null, new Date(org.created_at).toLocaleDateString())
209
214
  ),
210
215
  h('div', { style: { display: 'flex', gap: 6, marginTop: 12, borderTop: '1px solid var(--border)', paddingTop: 10 }, onClick: function(e) { e.stopPropagation(); } },
@@ -322,9 +327,14 @@ export function OrganizationsPage() {
322
327
  h('div', { style: { fontSize: 14, fontWeight: 700, marginBottom: 8 } }, 'Assign Agent'),
323
328
  h('div', { style: { display: 'flex', gap: 8 } },
324
329
  h('select', { className: 'input', value: assignAgentId, onChange: function(e) { setAssignAgentId(e.target.value); }, style: { flex: 1 } },
325
- h('option', { value: '' }, '— Select an unassigned agent —'),
326
- unassignedAgents.map(function(a) {
327
- return h('option', { key: a.id, value: a.id }, a.name + (a.role ? ' (' + a.role + ')' : ''));
330
+ h('option', { value: '' }, '— Select an agent to assign —'),
331
+ assignableAgents.map(function(a) {
332
+ var label = a.name + (a.role ? ' (' + a.role + ')' : '');
333
+ if (a.client_org_id) {
334
+ var fromOrg = orgs.find(function(o) { return o.id === a.client_org_id; });
335
+ label += fromOrg ? ' [from ' + fromOrg.name + ']' : ' [assigned elsewhere]';
336
+ }
337
+ return h('option', { key: a.id, value: a.id }, label);
328
338
  })
329
339
  ),
330
340
  h('button', { className: 'btn btn-primary btn-sm', disabled: !assignAgentId || acting === 'assign', onClick: doAssignAgent }, acting === 'assign' ? 'Assigning...' : 'Assign')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agenticmail/enterprise",
3
- "version": "0.5.299",
3
+ "version": "0.5.300",
4
4
  "description": "AgenticMail Enterprise — cloud-hosted AI agent identity, email, auth & compliance for organizations",
5
5
  "type": "module",
6
6
  "bin": {
@@ -56,6 +56,7 @@ export const I = {
56
56
  chevronLeft: () => h('svg', S, h('polyline', { points: '15 18 9 12 15 6' })),
57
57
  chevronRight: () => h('svg', S, h('polyline', { points: '9 18 15 12 9 6' })),
58
58
  chevronDown: () => h('svg', S, h('polyline', { points: '6 9 12 15 18 9' })),
59
+ mail: () => h('svg', S, h('path', { d: 'M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z' }), h('polyline', { points: '22,6 12,13 2,6' })),
59
60
  building: () => h('svg', S, h('path', { d: 'M3 21h18M3 10h18M3 7l9-4 9 4M4 10v11M20 10v11M8 14v.01M12 14v.01M16 14v.01M8 18v.01M12 18v.01M16 18v.01' })),
60
61
  edit: () => h('svg', S, h('path', { d: 'M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7' }), h('path', { d: 'M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z' })),
61
62
  };
@@ -158,8 +158,9 @@ export function OrganizationsPage() {
158
158
  .finally(function() { setActing(''); });
159
159
  };
160
160
 
161
- var unassignedAgents = allAgents.filter(function(a) {
162
- return !a.client_org_id && detailAgents.every(function(da) { return da.id !== a.id; });
161
+ // Show agents not already in THIS org (includes unassigned AND agents from other orgs)
162
+ var assignableAgents = allAgents.filter(function(a) {
163
+ return detailAgents.every(function(da) { return da.id !== a.id; });
163
164
  });
164
165
 
165
166
  if (loading) return h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, 'Loading organizations...');
@@ -185,7 +186,11 @@ export function OrganizationsPage() {
185
186
  // Org cards
186
187
  orgs.length === 0
187
188
  ? h('div', { className: 'card', style: { textAlign: 'center', padding: 40 } },
188
- h('div', { style: { fontSize: 48, marginBottom: 12 } }, '🏢'),
189
+ h('div', { style: { width: 48, height: 48, margin: '0 auto 12px', borderRadius: '50%', background: 'var(--bg-tertiary)', display: 'flex', alignItems: 'center', justifyContent: 'center' } },
190
+ h('svg', { width: 28, height: 28, viewBox: '0 0 24 24', fill: 'none', stroke: 'var(--text-muted)', strokeWidth: 1.5, strokeLinecap: 'round', strokeLinejoin: 'round' },
191
+ h('path', { d: 'M3 21h18M3 10h18M3 7l9-4 9 4M4 10v11M20 10v11M8 14v.01M12 14v.01M16 14v.01M8 18v.01M12 18v.01M16 18v.01' })
192
+ )
193
+ ),
189
194
  h('div', { style: { fontSize: 15, fontWeight: 600, marginBottom: 4 } }, 'No organizations yet'),
190
195
  h('div', { style: { color: 'var(--text-muted)', fontSize: 13, marginBottom: 16 } }, 'Create your first client organization to start managing multi-tenant agent deployments.'),
191
196
  h('button', { className: 'btn btn-primary', onClick: openCreate }, I.plus(), ' Create Organization')
@@ -204,7 +209,7 @@ export function OrganizationsPage() {
204
209
  org.description && h('div', { style: { fontSize: 13, color: 'var(--text-secondary)', marginBottom: 12, lineHeight: 1.5 } }, org.description),
205
210
  h('div', { style: { display: 'flex', gap: 16, fontSize: 12, color: 'var(--text-muted)' } },
206
211
  h('span', null, I.agents(), ' ', (org.agent_count || 0), ' agent', (org.agent_count || 0) !== 1 ? 's' : ''),
207
- org.contact_email && h('span', null, ' ', org.contact_email),
212
+ org.contact_email && h('span', null, I.mail(), ' ', org.contact_email),
208
213
  org.created_at && h('span', null, new Date(org.created_at).toLocaleDateString())
209
214
  ),
210
215
  h('div', { style: { display: 'flex', gap: 6, marginTop: 12, borderTop: '1px solid var(--border)', paddingTop: 10 }, onClick: function(e) { e.stopPropagation(); } },
@@ -322,9 +327,14 @@ export function OrganizationsPage() {
322
327
  h('div', { style: { fontSize: 14, fontWeight: 700, marginBottom: 8 } }, 'Assign Agent'),
323
328
  h('div', { style: { display: 'flex', gap: 8 } },
324
329
  h('select', { className: 'input', value: assignAgentId, onChange: function(e) { setAssignAgentId(e.target.value); }, style: { flex: 1 } },
325
- h('option', { value: '' }, '— Select an unassigned agent —'),
326
- unassignedAgents.map(function(a) {
327
- return h('option', { key: a.id, value: a.id }, a.name + (a.role ? ' (' + a.role + ')' : ''));
330
+ h('option', { value: '' }, '— Select an agent to assign —'),
331
+ assignableAgents.map(function(a) {
332
+ var label = a.name + (a.role ? ' (' + a.role + ')' : '');
333
+ if (a.client_org_id) {
334
+ var fromOrg = orgs.find(function(o) { return o.id === a.client_org_id; });
335
+ label += fromOrg ? ' [from ' + fromOrg.name + ']' : ' [assigned elsewhere]';
336
+ }
337
+ return h('option', { key: a.id, value: a.id }, label);
328
338
  })
329
339
  ),
330
340
  h('button', { className: 'btn btn-primary btn-sm', disabled: !assignAgentId || acting === 'assign', onClick: doAssignAgent }, acting === 'assign' ? 'Assigning...' : 'Assign')