@agenticmail/enterprise 0.5.39 → 0.5.41

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,47 @@
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-TW2L3Z62.js";
18
+ import "./chunk-TYW5XTOW.js";
19
+ import "./chunk-JLSQOQ5L.js";
20
+ import {
21
+ PROVIDER_REGISTRY,
22
+ listAllProviders,
23
+ resolveApiKeyForProvider,
24
+ resolveProvider
25
+ } from "./chunk-67KZYSLU.js";
26
+ import "./chunk-KFQGP6VL.js";
27
+ export {
28
+ AgentRuntime,
29
+ EmailChannel,
30
+ FollowUpScheduler,
31
+ PROVIDER_REGISTRY,
32
+ SessionManager,
33
+ SubAgentManager,
34
+ ToolRegistry,
35
+ callLLM,
36
+ createAgentRuntime,
37
+ createNoopHooks,
38
+ createRuntimeHooks,
39
+ estimateMessageTokens,
40
+ estimateTokens,
41
+ executeTool,
42
+ listAllProviders,
43
+ resolveApiKeyForProvider,
44
+ resolveProvider,
45
+ runAgentLoop,
46
+ toolsToDefinitions
47
+ };
@@ -0,0 +1,47 @@
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-S33UPVJ5.js";
18
+ import "./chunk-TYW5XTOW.js";
19
+ import "./chunk-JLSQOQ5L.js";
20
+ import {
21
+ PROVIDER_REGISTRY,
22
+ listAllProviders,
23
+ resolveApiKeyForProvider,
24
+ resolveProvider
25
+ } from "./chunk-67KZYSLU.js";
26
+ import "./chunk-KFQGP6VL.js";
27
+ export {
28
+ AgentRuntime,
29
+ EmailChannel,
30
+ FollowUpScheduler,
31
+ PROVIDER_REGISTRY,
32
+ SessionManager,
33
+ SubAgentManager,
34
+ ToolRegistry,
35
+ callLLM,
36
+ createAgentRuntime,
37
+ createNoopHooks,
38
+ createRuntimeHooks,
39
+ estimateMessageTokens,
40
+ estimateTokens,
41
+ executeTool,
42
+ listAllProviders,
43
+ resolveApiKeyForProvider,
44
+ resolveProvider,
45
+ runAgentLoop,
46
+ toolsToDefinitions
47
+ };
@@ -0,0 +1,12 @@
1
+ import {
2
+ createServer
3
+ } from "./chunk-IDNJYE2A.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,12 @@
1
+ import {
2
+ createServer
3
+ } from "./chunk-NIGMF5EE.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-7XKYS3OB.js";
10
+ import "./chunk-WEWW2XJW.js";
11
+ import "./chunk-KFQGP6VL.js";
12
+ export {
13
+ promptCompanyInfo,
14
+ promptDatabase,
15
+ promptDeployment,
16
+ promptDomain,
17
+ promptRegistration,
18
+ provision,
19
+ runSetupWizard
20
+ };
@@ -0,0 +1,20 @@
1
+ import {
2
+ promptCompanyInfo,
3
+ promptDatabase,
4
+ promptDeployment,
5
+ promptDomain,
6
+ promptRegistration,
7
+ provision,
8
+ runSetupWizard
9
+ } from "./chunk-Z2Q72O3P.js";
10
+ import "./chunk-WEWW2XJW.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.39",
3
+ "version": "0.5.41",
4
4
  "description": "AgenticMail Enterprise — cloud-hosted AI agent identity, email, auth & compliance for organizations",
5
5
  "type": "module",
6
6
  "bin": {
@@ -2,6 +2,32 @@ import { h, useState, useEffect, useCallback, Fragment, useApp, engineCall } fro
2
2
  import { I } from '../components/icons.js';
3
3
  import { Modal } from '../components/modal.js';
4
4
 
5
+ // Auth help: where to get API keys/tokens for each skill
6
+ var AUTH_HELP = {
7
+ 'intercom-support': { provider: 'Intercom', url: 'https://developers.intercom.com/docs/build-an-integration/getting-started/', steps: 'Create an Intercom app at developers.intercom.com, then copy the Access Token from Authentication.' },
8
+ 'zendesk-tickets': { provider: 'Zendesk', url: 'https://support.zendesk.com/hc/en-us/articles/4408889192858', steps: 'Go to Zendesk Admin > Apps & Integrations > APIs > Zendesk API, then generate an API token.' },
9
+ 'github-issues': { provider: 'GitHub', url: 'https://github.com/settings/tokens', steps: 'Go to GitHub Settings > Developer Settings > Personal Access Tokens > Generate new token. Select repo and issues scopes.' },
10
+ 'github-actions': { provider: 'GitHub', url: 'https://github.com/settings/tokens', steps: 'Generate a Personal Access Token with workflow and actions:read scopes.' },
11
+ 'slack-notifications': { provider: 'Slack', url: 'https://api.slack.com/apps', steps: 'Create a Slack app at api.slack.com/apps, install to workspace, copy the Bot User OAuth Token (xoxb-...).' },
12
+ 'jira-integration': { provider: 'Atlassian', url: 'https://id.atlassian.com/manage-profile/security/api-tokens', steps: 'Go to Atlassian account > Security > API tokens > Create API token. Use with your email as username.' },
13
+ 'stripe-billing': { provider: 'Stripe', url: 'https://dashboard.stripe.com/apikeys', steps: 'Go to Stripe Dashboard > Developers > API keys. Copy the Secret key (sk_live_... or sk_test_...).' },
14
+ 'notion-sync': { provider: 'Notion', url: 'https://www.notion.so/my-integrations', steps: 'Create an integration at notion.so/my-integrations. Copy the Internal Integration Secret. Share pages with the integration.' },
15
+ 'salesforce-crm': { provider: 'Salesforce', url: 'https://help.salesforce.com/s/articleView?id=sf.connected_app_create_api_integration.htm', steps: 'Create a Connected App in Salesforce Setup. Use OAuth 2.0 client credentials flow. Copy Consumer Key and Secret.' },
16
+ 'hubspot-crm': { provider: 'HubSpot', url: 'https://developers.hubspot.com/docs/api/private-apps', steps: 'Go to HubSpot Settings > Integrations > Private Apps > Create. Select required scopes and copy the access token.' },
17
+ 'twilio-sms': { provider: 'Twilio', url: 'https://console.twilio.com/', steps: 'Sign up at twilio.com. Copy Account SID and Auth Token from the Console dashboard. Get a phone number for SMS.' },
18
+ 'sendgrid-email': { provider: 'SendGrid', url: 'https://app.sendgrid.com/settings/api_keys', steps: 'Go to SendGrid Settings > API Keys > Create API Key. Select Full Access or restricted permissions.' },
19
+ 'google-workspace': { provider: 'Google', url: 'https://console.cloud.google.com/apis/credentials', steps: 'Create a project in Google Cloud Console. Enable required APIs. Create OAuth 2.0 credentials or a Service Account key.' },
20
+ 'shopify-store': { provider: 'Shopify', url: 'https://partners.shopify.com/', steps: 'Create a custom app in your Shopify admin > Settings > Apps. Copy the Admin API access token.' },
21
+ 'openai-models': { provider: 'OpenAI', url: 'https://platform.openai.com/api-keys', steps: 'Go to platform.openai.com > API Keys > Create new secret key. Copy it immediately — it won\'t be shown again.' },
22
+ 'anthropic-models': { provider: 'Anthropic', url: 'https://console.anthropic.com/settings/keys', steps: 'Go to console.anthropic.com > Settings > API Keys > Create Key.' },
23
+ };
24
+
25
+ function getAuthHelp(skillId) {
26
+ if (AUTH_HELP[skillId]) return AUTH_HELP[skillId];
27
+ // Fallback: check if skill manifest has authHelp
28
+ return null;
29
+ }
30
+
5
31
  export function SkillConnectionsPage() {
6
32
  const { toast } = useApp();
7
33
  const [installed, setInstalled] = useState([]);
@@ -374,6 +400,19 @@ export function SkillConnectionsPage() {
374
400
  )
375
401
  ),
376
402
 
403
+ // Auth help info (show when not connected)
404
+ !status.connected && (function() {
405
+ var help = getAuthHelp(skill.skillId) || (meta.authHelp ? meta.authHelp : null);
406
+ if (!help) return null;
407
+ return h('div', {
408
+ style: { fontSize: 12, color: 'var(--text-secondary)', marginBottom: 12, padding: '10px 12px', background: 'var(--bg-tertiary)', borderRadius: 6, borderLeft: '3px solid var(--primary)' }
409
+ },
410
+ h('div', { style: { fontWeight: 600, marginBottom: 4, fontSize: 11, textTransform: 'uppercase', color: 'var(--primary)' } }, 'How to connect'),
411
+ h('div', { style: { lineHeight: 1.5, marginBottom: 6 } }, help.steps || help.description),
412
+ help.url && h('a', { href: help.url, target: '_blank', rel: 'noopener', style: { color: 'var(--primary)', fontSize: 12, textDecoration: 'none' } }, 'Get credentials at ' + (help.provider || 'provider') + ' \u2192')
413
+ );
414
+ })(),
415
+
377
416
  // Action buttons
378
417
  h('div', { style: { display: 'flex', gap: 8, flexWrap: 'wrap', marginTop: 'auto' } },
379
418
  // Connect / Disconnect
@@ -415,6 +454,18 @@ export function SkillConnectionsPage() {
415
454
  ? h('div', { style: { textAlign: 'center', padding: 24, color: 'var(--text-muted)' } }, 'Loading configuration schema...')
416
455
  : configSchema && Object.keys(configSchema).length > 0
417
456
  ? h('div', null,
457
+ // Show auth help in modal too
458
+ (function() {
459
+ var help = getAuthHelp(configSkill.skillId) || (configSkill.skill?.authHelp || configSkill.manifest?.authHelp);
460
+ if (!help) return null;
461
+ return h('div', {
462
+ style: { marginBottom: 16, padding: '12px 14px', background: 'var(--bg-tertiary)', borderRadius: 8, borderLeft: '3px solid var(--primary)' }
463
+ },
464
+ h('div', { style: { fontWeight: 600, marginBottom: 4, fontSize: 12, color: 'var(--primary)' } }, 'Where to get credentials'),
465
+ h('div', { style: { fontSize: 13, lineHeight: 1.5, color: 'var(--text-secondary)', marginBottom: 6 } }, help.steps || help.description),
466
+ help.url && h('a', { href: help.url, target: '_blank', rel: 'noopener', style: { color: 'var(--primary)', fontSize: 13 } }, 'Open ' + (help.provider || 'provider') + ' developer portal \u2192')
467
+ );
468
+ })(),
418
469
  h('p', { style: { fontSize: 13, color: 'var(--text-secondary)', marginBottom: 16 } },
419
470
  'Configure the settings for this skill. Fields marked with * are required.'
420
471
  ),
@@ -1304,6 +1304,7 @@ export class CommunitySkillRegistry {
1304
1304
  risk: 'medium',
1305
1305
  icon: 'https://cdn.simpleicons.org/intercom/6AFDEF',
1306
1306
  tags: ['intercom', 'support', 'messaging', 'customer-success'],
1307
+ authHelp: { provider: 'Intercom', url: 'https://developers.intercom.com/docs/build-an-integration/getting-started/', description: 'Create an Intercom app at developers.intercom.com, then copy the Access Token from the Authentication section.' },
1307
1308
  tools: [
1308
1309
  { id: 'intercom_reply_conversation', name: 'Reply to Conversation', description: 'Send a reply in an Intercom conversation' },
1309
1310
  { id: 'intercom_create_contact', name: 'Create Contact', description: 'Create a new lead or user contact' },
@@ -1323,6 +1324,7 @@ export class CommunitySkillRegistry {
1323
1324
  risk: 'medium',
1324
1325
  icon: 'https://cdn.simpleicons.org/zendesk/03363D',
1325
1326
  tags: ['zendesk', 'support', 'tickets', 'helpdesk'],
1327
+ authHelp: { provider: 'Zendesk', url: 'https://support.zendesk.com/hc/en-us/articles/4408889192858-Generating-a-new-API-token', description: 'Go to Zendesk Admin > Apps and Integrations > APIs > Zendesk API, then generate an API token.' },
1326
1328
  tools: [
1327
1329
  { id: 'zendesk_create_ticket', name: 'Create Ticket', description: 'Create a new support ticket' },
1328
1330
  { id: 'zendesk_update_ticket', name: 'Update Ticket', description: 'Update ticket status, priority, or assignee' },
@@ -75,6 +75,31 @@ export function createWorkforceRoutes(workforce: WorkforceManager, opts?: { life
75
75
  }
76
76
  });
77
77
 
78
+ /** Update an existing schedule */
79
+ router.put('/schedules/:id', async (c) => {
80
+ try {
81
+ const id = c.req.param('id');
82
+ const body = await c.req.json();
83
+ const orgId = resolveOrgId(c, body);
84
+ // Find existing schedule by id — check all org schedules
85
+ const allSchedules = await workforce.getSchedulesByOrg(orgId);
86
+ const existing = allSchedules.find((s: any) => s.id === id);
87
+ if (!existing) return c.json({ error: 'Schedule not found' }, 404);
88
+
89
+ const updated = {
90
+ ...existing,
91
+ ...body,
92
+ id,
93
+ orgId,
94
+ updatedAt: new Date().toISOString(),
95
+ };
96
+ await workforce.setSchedule(updated);
97
+ return c.json({ schedule: updated });
98
+ } catch (err: any) {
99
+ return c.json({ error: err.message }, 500);
100
+ }
101
+ });
102
+
78
103
  /** Remove an agent's schedule */
79
104
  router.delete('/schedules/:agentId', async (c) => {
80
105
  try {