@agent-native/core 0.7.13 → 0.7.14
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.
- package/dist/a2a/client.d.ts +44 -1
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +88 -11
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/handlers.d.ts +10 -0
- package/dist/a2a/handlers.d.ts.map +1 -1
- package/dist/a2a/handlers.js +287 -62
- package/dist/a2a/handlers.js.map +1 -1
- package/dist/a2a/server.d.ts.map +1 -1
- package/dist/a2a/server.js +95 -17
- package/dist/a2a/server.js.map +1 -1
- package/dist/a2a/task-store.d.ts +11 -1
- package/dist/a2a/task-store.d.ts.map +1 -1
- package/dist/a2a/task-store.js +38 -2
- package/dist/a2a/task-store.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +7 -25
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/engine/builtin.js +1 -1
- package/dist/agent/engine/builtin.js.map +1 -1
- package/dist/chat-threads/store.d.ts +3 -0
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +32 -0
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +11 -0
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +3 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +21 -10
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AgentTaskCard.d.ts.map +1 -1
- package/dist/client/AgentTaskCard.js +2 -0
- package/dist/client/AgentTaskCard.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +2 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +111 -75
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/ErrorBoundary.d.ts +1 -3
- package/dist/client/ErrorBoundary.d.ts.map +1 -1
- package/dist/client/ErrorBoundary.js +37 -9
- package/dist/client/ErrorBoundary.js.map +1 -1
- package/dist/client/FeedbackButton.d.ts.map +1 -1
- package/dist/client/FeedbackButton.js +4 -3
- package/dist/client/FeedbackButton.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +145 -49
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat.d.ts +11 -0
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +1 -1
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/components/AgentPresenceChip.d.ts +12 -0
- package/dist/client/components/AgentPresenceChip.d.ts.map +1 -0
- package/dist/client/components/AgentPresenceChip.js +42 -0
- package/dist/client/components/AgentPresenceChip.js.map +1 -0
- package/dist/client/components/PresenceBar.d.ts +17 -0
- package/dist/client/components/PresenceBar.d.ts.map +1 -0
- package/dist/client/components/PresenceBar.js +118 -0
- package/dist/client/components/PresenceBar.js.map +1 -0
- package/dist/client/composer/ComposerPlusMenu.d.ts +6 -1
- package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.js +22 -83
- package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +237 -16
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/types.d.ts +1 -0
- package/dist/client/composer/types.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.d.ts +2 -0
- package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.js +85 -10
- package/dist/client/composer/useVoiceDictation.js.map +1 -1
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/org/RequireActiveOrg.d.ts.map +1 -1
- package/dist/client/org/RequireActiveOrg.js +15 -10
- package/dist/client/org/RequireActiveOrg.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +125 -4
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/org/hooks.d.ts +30 -0
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/org/hooks.js +65 -0
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/org/index.d.ts +2 -2
- package/dist/client/org/index.d.ts.map +1 -1
- package/dist/client/org/index.js +1 -1
- package/dist/client/org/index.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +5 -1
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
- package/dist/client/settings/AutomationsSection.js +1 -0
- package/dist/client/settings/AutomationsSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +24 -11
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +10 -0
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/tools/ToolEditor.d.ts +5 -0
- package/dist/client/tools/ToolEditor.d.ts.map +1 -0
- package/dist/client/tools/ToolEditor.js +98 -0
- package/dist/client/tools/ToolEditor.js.map +1 -0
- package/dist/client/tools/ToolViewer.d.ts +5 -0
- package/dist/client/tools/ToolViewer.d.ts.map +1 -0
- package/dist/client/tools/ToolViewer.js +309 -0
- package/dist/client/tools/ToolViewer.js.map +1 -0
- package/dist/client/tools/ToolViewerPage.d.ts +2 -0
- package/dist/client/tools/ToolViewerPage.d.ts.map +1 -0
- package/dist/client/tools/ToolViewerPage.js +23 -0
- package/dist/client/tools/ToolViewerPage.js.map +1 -0
- package/dist/client/tools/ToolsListPage.d.ts +2 -0
- package/dist/client/tools/ToolsListPage.d.ts.map +1 -0
- package/dist/client/tools/ToolsListPage.js +72 -0
- package/dist/client/tools/ToolsListPage.js.map +1 -0
- package/dist/client/tools/ToolsSidebarSection.d.ts +2 -0
- package/dist/client/tools/ToolsSidebarSection.d.ts.map +1 -0
- package/dist/client/tools/ToolsSidebarSection.js +188 -0
- package/dist/client/tools/ToolsSidebarSection.js.map +1 -0
- package/dist/client/tools/index.d.ts +6 -0
- package/dist/client/tools/index.d.ts.map +1 -0
- package/dist/client/tools/index.js +6 -0
- package/dist/client/tools/index.js.map +1 -0
- package/dist/client/use-chat-threads.d.ts +1 -0
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +29 -0
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/client/use-db-sync.js +6 -6
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/collab/agent-identity.d.ts +15 -0
- package/dist/collab/agent-identity.d.ts.map +1 -0
- package/dist/collab/agent-identity.js +14 -0
- package/dist/collab/agent-identity.js.map +1 -0
- package/dist/collab/agent-presence.d.ts +59 -0
- package/dist/collab/agent-presence.d.ts.map +1 -0
- package/dist/collab/agent-presence.js +165 -0
- package/dist/collab/agent-presence.js.map +1 -0
- package/dist/collab/awareness.d.ts +7 -0
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/awareness.js +2 -2
- package/dist/collab/awareness.js.map +1 -1
- package/dist/collab/client-struct.d.ts +43 -0
- package/dist/collab/client-struct.d.ts.map +1 -0
- package/dist/collab/client-struct.js +272 -0
- package/dist/collab/client-struct.js.map +1 -0
- package/dist/collab/client.d.ts +2 -0
- package/dist/collab/client.d.ts.map +1 -1
- package/dist/collab/client.js +15 -1
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/index.d.ts +6 -1
- package/dist/collab/index.d.ts.map +1 -1
- package/dist/collab/index.js +11 -1
- package/dist/collab/index.js.map +1 -1
- package/dist/collab/json-to-yjs.d.ts +72 -0
- package/dist/collab/json-to-yjs.d.ts.map +1 -0
- package/dist/collab/json-to-yjs.js +456 -0
- package/dist/collab/json-to-yjs.js.map +1 -0
- package/dist/collab/struct-routes.d.ts +52 -0
- package/dist/collab/struct-routes.d.ts.map +1 -0
- package/dist/collab/struct-routes.js +74 -0
- package/dist/collab/struct-routes.js.map +1 -0
- package/dist/collab/ydoc-manager.d.ts +19 -0
- package/dist/collab/ydoc-manager.d.ts.map +1 -1
- package/dist/collab/ydoc-manager.js +49 -0
- package/dist/collab/ydoc-manager.js.map +1 -1
- package/dist/deploy/build.js +1 -1
- package/dist/file-upload/builder.d.ts.map +1 -1
- package/dist/file-upload/builder.js +2 -1
- package/dist/file-upload/builder.js.map +1 -1
- package/dist/integrations/adapters/email.d.ts +17 -0
- package/dist/integrations/adapters/email.d.ts.map +1 -0
- package/dist/integrations/adapters/email.js +620 -0
- package/dist/integrations/adapters/email.js.map +1 -0
- package/dist/integrations/adapters/telegram.d.ts.map +1 -1
- package/dist/integrations/adapters/telegram.js +19 -3
- package/dist/integrations/adapters/telegram.js.map +1 -1
- package/dist/integrations/index.d.ts +1 -0
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +1 -0
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/internal-token.d.ts +18 -0
- package/dist/integrations/internal-token.d.ts.map +1 -0
- package/dist/integrations/internal-token.js +86 -0
- package/dist/integrations/internal-token.js.map +1 -0
- package/dist/integrations/pending-tasks-retry-job.d.ts +15 -0
- package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -0
- package/dist/integrations/pending-tasks-retry-job.js +199 -0
- package/dist/integrations/pending-tasks-retry-job.js.map +1 -0
- package/dist/integrations/pending-tasks-store.d.ts +40 -0
- package/dist/integrations/pending-tasks-store.d.ts.map +1 -0
- package/dist/integrations/pending-tasks-store.js +151 -0
- package/dist/integrations/pending-tasks-store.js.map +1 -0
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +151 -9
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/task-queue-stats.d.ts +22 -0
- package/dist/integrations/task-queue-stats.d.ts.map +1 -0
- package/dist/integrations/task-queue-stats.js +117 -0
- package/dist/integrations/task-queue-stats.js.map +1 -0
- package/dist/integrations/types.d.ts +2 -0
- package/dist/integrations/types.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.d.ts +23 -4
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +217 -59
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/mcp-client/manager.d.ts +3 -0
- package/dist/mcp-client/manager.d.ts.map +1 -1
- package/dist/mcp-client/manager.js +5 -0
- package/dist/mcp-client/manager.js.map +1 -1
- package/dist/oauth-tokens/google-refresh.d.ts.map +1 -1
- package/dist/oauth-tokens/google-refresh.js +6 -0
- package/dist/oauth-tokens/google-refresh.js.map +1 -1
- package/dist/onboarding/default-steps.d.ts.map +1 -1
- package/dist/onboarding/default-steps.js +10 -3
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/org/context.d.ts +35 -0
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +136 -0
- package/dist/org/context.js.map +1 -1
- package/dist/org/handlers.d.ts +76 -0
- package/dist/org/handlers.d.ts.map +1 -1
- package/dist/org/handlers.js +411 -2
- package/dist/org/handlers.js.map +1 -1
- package/dist/org/index.d.ts +2 -2
- package/dist/org/index.d.ts.map +1 -1
- package/dist/org/index.js +2 -2
- package/dist/org/index.js.map +1 -1
- package/dist/org/migrations.d.ts.map +1 -1
- package/dist/org/migrations.js +8 -0
- package/dist/org/migrations.js.map +1 -1
- package/dist/org/plugin.d.ts +6 -0
- package/dist/org/plugin.d.ts.map +1 -1
- package/dist/org/plugin.js +71 -7
- package/dist/org/plugin.js.map +1 -1
- package/dist/org/schema.d.ts +38 -0
- package/dist/org/schema.d.ts.map +1 -1
- package/dist/org/schema.js +2 -0
- package/dist/org/schema.js.map +1 -1
- package/dist/org/types.d.ts +7 -0
- package/dist/org/types.d.ts.map +1 -1
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +90 -18
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/scripts/db/index.d.ts.map +1 -1
- package/dist/scripts/db/index.js +2 -0
- package/dist/scripts/db/index.js.map +1 -1
- package/dist/scripts/db/migrate-user-api-keys.d.ts +24 -0
- package/dist/scripts/db/migrate-user-api-keys.d.ts.map +1 -0
- package/dist/scripts/db/migrate-user-api-keys.js +224 -0
- package/dist/scripts/db/migrate-user-api-keys.js.map +1 -0
- package/dist/scripts/db/wipe-leaked-builder-keys.d.ts +27 -0
- package/dist/scripts/db/wipe-leaked-builder-keys.d.ts.map +1 -0
- package/dist/scripts/db/wipe-leaked-builder-keys.js +163 -0
- package/dist/scripts/db/wipe-leaked-builder-keys.js.map +1 -0
- package/dist/secrets/register-framework-secrets.d.ts +5 -0
- package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
- package/dist/secrets/register-framework-secrets.js +7 -44
- package/dist/secrets/register-framework-secrets.js.map +1 -1
- package/dist/secrets/substitution.d.ts.map +1 -1
- package/dist/secrets/substitution.js +14 -2
- package/dist/secrets/substitution.js.map +1 -1
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +39 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/action-routes.js +1 -1
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +192 -45
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/auth.d.ts +14 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +232 -17
- package/dist/server/auth.js.map +1 -1
- package/dist/server/builder-browser.d.ts +1 -1
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +12 -12
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/collab-plugin.d.ts +4 -0
- package/dist/server/collab-plugin.d.ts.map +1 -1
- package/dist/server/collab-plugin.js +30 -4
- package/dist/server/collab-plugin.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +106 -100
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +43 -2
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +115 -2
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/design-token-utils.d.ts +132 -0
- package/dist/server/design-token-utils.d.ts.map +1 -0
- package/dist/server/design-token-utils.js +714 -0
- package/dist/server/design-token-utils.js.map +1 -0
- package/dist/server/email.d.ts +10 -0
- package/dist/server/email.d.ts.map +1 -1
- package/dist/server/email.js +63 -16
- package/dist/server/email.js.map +1 -1
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +38 -3
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/server/google-oauth.d.ts +18 -1
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +21 -4
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +3 -3
- package/dist/server/index.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +14 -1
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts.map +1 -1
- package/dist/server/transcribe-voice.js +89 -24
- package/dist/server/transcribe-voice.js.map +1 -1
- package/dist/sharing/schema.d.ts +1 -1
- package/dist/styles/agent-native.css +5 -0
- package/dist/templates/default/app/root.tsx +50 -13
- package/dist/templates/default/react-router.config.ts +3 -0
- package/dist/terminal/terminal-plugin.d.ts.map +1 -1
- package/dist/terminal/terminal-plugin.js +23 -3
- package/dist/terminal/terminal-plugin.js.map +1 -1
- package/dist/tools/actions.d.ts +3 -0
- package/dist/tools/actions.d.ts.map +1 -0
- package/dist/tools/actions.js +140 -0
- package/dist/tools/actions.js.map +1 -0
- package/dist/tools/fetch-tool.js +1 -1
- package/dist/tools/fetch-tool.js.map +1 -1
- package/dist/tools/html-shell.d.ts +2 -0
- package/dist/tools/html-shell.d.ts.map +1 -0
- package/dist/tools/html-shell.js +387 -0
- package/dist/tools/html-shell.js.map +1 -0
- package/dist/tools/routes.d.ts +2 -0
- package/dist/tools/routes.d.ts.map +1 -0
- package/dist/tools/routes.js +576 -0
- package/dist/tools/routes.js.map +1 -0
- package/dist/tools/schema.d.ts +575 -0
- package/dist/tools/schema.d.ts.map +1 -0
- package/dist/tools/schema.js +112 -0
- package/dist/tools/schema.js.map +1 -0
- package/dist/tools/store.d.ts +40 -0
- package/dist/tools/store.d.ts.map +1 -0
- package/dist/tools/store.js +190 -0
- package/dist/tools/store.js.map +1 -0
- package/dist/tools/theme.d.ts +2 -0
- package/dist/tools/theme.d.ts.map +1 -0
- package/dist/tools/theme.js +67 -0
- package/dist/tools/theme.js.map +1 -0
- package/dist/transcription/builder-transcription.d.ts.map +1 -1
- package/dist/transcription/builder-transcription.js +26 -14
- package/dist/transcription/builder-transcription.js.map +1 -1
- package/dist/vite/action-types-plugin.d.ts.map +1 -1
- package/dist/vite/action-types-plugin.js +10 -2
- package/dist/vite/action-types-plugin.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +26 -6
- package/dist/vite/client.js.map +1 -1
- package/docs/content/a2a-protocol.md +2 -2
- package/docs/content/authentication.md +51 -0
- package/docs/content/cloneable-saas.md +59 -62
- package/docs/content/faq.md +73 -43
- package/docs/content/getting-started.md +37 -61
- package/docs/content/mcp-clients.md +14 -1
- package/docs/content/messaging.md +284 -0
- package/docs/content/pure-agent-apps.md +55 -28
- package/docs/content/template-calendar.md +61 -56
- package/docs/content/template-clips.md +22 -18
- package/docs/content/template-content.md +36 -26
- package/docs/content/template-dispatch.md +2 -1
- package/docs/content/template-forms.md +13 -11
- package/docs/content/template-slides.md +43 -31
- package/docs/content/template-video.md +49 -22
- package/docs/content/tools.md +107 -0
- package/docs/content/what-is-agent-native.md +89 -105
- package/package.json +4 -1
- package/src/templates/default/app/root.tsx +50 -13
- package/src/templates/default/react-router.config.ts +3 -0
- package/docs/content/integrations.md +0 -198
|
@@ -0,0 +1,620 @@
|
|
|
1
|
+
import { getHeader } from "h3";
|
|
2
|
+
import { getIntegrationConfig } from "../config-store.js";
|
|
3
|
+
import { readBody } from "../../server/h3-helpers.js";
|
|
4
|
+
import { sendEmail, isEmailConfigured, getEmailProvider, } from "../../server/email.js";
|
|
5
|
+
/** Max body length before truncation */
|
|
6
|
+
const EMAIL_MAX_BODY_LENGTH = 15000;
|
|
7
|
+
/** Rate limit: max emails per sender within the window */
|
|
8
|
+
const RATE_LIMIT_MAX = 20;
|
|
9
|
+
/** Rate limit window in ms (1 hour) */
|
|
10
|
+
const RATE_LIMIT_WINDOW_MS = 60 * 60 * 1000;
|
|
11
|
+
/** In-memory rate limiter keyed by sender email address */
|
|
12
|
+
const rateLimitMap = new Map();
|
|
13
|
+
/**
|
|
14
|
+
* Create an Email platform adapter for inbound/outbound email via
|
|
15
|
+
* Resend or SendGrid webhooks.
|
|
16
|
+
*
|
|
17
|
+
* Required env vars:
|
|
18
|
+
* - EMAIL_AGENT_ADDRESS — The email address the agent receives mail at
|
|
19
|
+
*
|
|
20
|
+
* One of these must also be set (checked via isEmailConfigured()):
|
|
21
|
+
* - RESEND_API_KEY — For sending/receiving via Resend
|
|
22
|
+
* - SENDGRID_API_KEY — For sending/receiving via SendGrid
|
|
23
|
+
*
|
|
24
|
+
* Optional:
|
|
25
|
+
* - EMAIL_INBOUND_WEBHOOK_SECRET — Webhook signature verification secret
|
|
26
|
+
*/
|
|
27
|
+
export function emailAdapter() {
|
|
28
|
+
return {
|
|
29
|
+
platform: "email",
|
|
30
|
+
label: "Email",
|
|
31
|
+
getRequiredEnvKeys() {
|
|
32
|
+
return [
|
|
33
|
+
{
|
|
34
|
+
key: "EMAIL_AGENT_ADDRESS",
|
|
35
|
+
label: "Agent Email Address",
|
|
36
|
+
required: true,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
key: "RESEND_API_KEY",
|
|
40
|
+
label: "Resend API Key (or use SENDGRID_API_KEY)",
|
|
41
|
+
required: false,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
key: "SENDGRID_API_KEY",
|
|
45
|
+
label: "SendGrid API Key (or use RESEND_API_KEY)",
|
|
46
|
+
required: false,
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
key: "EMAIL_INBOUND_WEBHOOK_SECRET",
|
|
50
|
+
label: "Inbound Webhook Secret",
|
|
51
|
+
required: false,
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
},
|
|
55
|
+
async handleVerification(_event) {
|
|
56
|
+
// Email webhooks don't need challenge handshakes
|
|
57
|
+
return { handled: false };
|
|
58
|
+
},
|
|
59
|
+
async verifyWebhook(event) {
|
|
60
|
+
const secret = process.env.EMAIL_INBOUND_WEBHOOK_SECRET;
|
|
61
|
+
const provider = getEmailProvider();
|
|
62
|
+
if (provider === "resend") {
|
|
63
|
+
return verifyResendWebhook(event, secret);
|
|
64
|
+
}
|
|
65
|
+
if (provider === "sendgrid") {
|
|
66
|
+
return verifySendGridWebhook(event, secret);
|
|
67
|
+
}
|
|
68
|
+
// No provider configured — reject
|
|
69
|
+
console.warn("[email] No email provider configured, rejecting webhook");
|
|
70
|
+
return false;
|
|
71
|
+
},
|
|
72
|
+
async parseIncomingMessage(event) {
|
|
73
|
+
const provider = getEmailProvider();
|
|
74
|
+
const agentAddress = process.env.EMAIL_AGENT_ADDRESS?.toLowerCase();
|
|
75
|
+
if (!agentAddress) {
|
|
76
|
+
console.warn("[email] EMAIL_AGENT_ADDRESS not configured");
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
let parsed = null;
|
|
80
|
+
if (provider === "resend") {
|
|
81
|
+
parsed = await parseResendWebhook(event);
|
|
82
|
+
}
|
|
83
|
+
else if (provider === "sendgrid") {
|
|
84
|
+
parsed = await parseSendGridWebhook(event);
|
|
85
|
+
}
|
|
86
|
+
if (!parsed)
|
|
87
|
+
return null;
|
|
88
|
+
// Rate limiting
|
|
89
|
+
const senderEmail = parsed.from.email.toLowerCase();
|
|
90
|
+
if (isRateLimited(senderEmail)) {
|
|
91
|
+
console.warn(`[email] Rate limited sender: ${senderEmail} (>${RATE_LIMIT_MAX}/hr)`);
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
// Check allowed domains
|
|
95
|
+
const config = await getIntegrationConfig("email");
|
|
96
|
+
if (config?.configData?.allowedDomains) {
|
|
97
|
+
const allowed = config.configData.allowedDomains;
|
|
98
|
+
if (allowed.length > 0) {
|
|
99
|
+
const senderDomain = senderEmail.split("@")[1];
|
|
100
|
+
if (!senderDomain || !allowed.includes(senderDomain)) {
|
|
101
|
+
console.warn(`[email] Rejected email from ${senderEmail}: domain not in allowedDomains`);
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Determine if agent was CC'd (not in To, but in CC)
|
|
107
|
+
const toAddresses = parsed.to.map((a) => a.toLowerCase());
|
|
108
|
+
const ccAddresses = (parsed.cc ?? []).map((a) => a.toLowerCase());
|
|
109
|
+
const isCC = !toAddresses.includes(agentAddress) &&
|
|
110
|
+
ccAddresses.includes(agentAddress);
|
|
111
|
+
// Build thread ID from References chain (Gmail-style: oldest Message-ID is thread root)
|
|
112
|
+
const threadRootId = getThreadRootId(parsed.messageId, parsed.references);
|
|
113
|
+
// Build body text
|
|
114
|
+
let bodyText = parsed.text || stripHtmlForPlainText(parsed.html || "");
|
|
115
|
+
// Truncate if needed
|
|
116
|
+
if (bodyText.length > EMAIL_MAX_BODY_LENGTH) {
|
|
117
|
+
bodyText =
|
|
118
|
+
bodyText.slice(0, EMAIL_MAX_BODY_LENGTH) + "\n[Message truncated]";
|
|
119
|
+
}
|
|
120
|
+
// Prefix CC'd emails with context
|
|
121
|
+
if (isCC) {
|
|
122
|
+
const otherRecipients = toAddresses
|
|
123
|
+
.filter((a) => a !== agentAddress)
|
|
124
|
+
.join(", ");
|
|
125
|
+
bodyText =
|
|
126
|
+
`[CC'd on email between ${senderEmail} and ${otherRecipients || "others"}]\n` +
|
|
127
|
+
`Subject: ${parsed.subject}\n\n` +
|
|
128
|
+
bodyText;
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
platform: "email",
|
|
132
|
+
externalThreadId: threadRootId,
|
|
133
|
+
text: bodyText,
|
|
134
|
+
senderName: parsed.from.name,
|
|
135
|
+
senderId: senderEmail,
|
|
136
|
+
platformContext: {
|
|
137
|
+
messageId: parsed.messageId,
|
|
138
|
+
subject: parsed.subject,
|
|
139
|
+
from: senderEmail,
|
|
140
|
+
to: parsed.to,
|
|
141
|
+
cc: parsed.cc,
|
|
142
|
+
inReplyTo: parsed.inReplyTo,
|
|
143
|
+
references: parsed.references,
|
|
144
|
+
isCC,
|
|
145
|
+
},
|
|
146
|
+
timestamp: parsed.date ? new Date(parsed.date).getTime() : Date.now(),
|
|
147
|
+
};
|
|
148
|
+
},
|
|
149
|
+
async sendResponse(message, context) {
|
|
150
|
+
const agentAddress = process.env.EMAIL_AGENT_ADDRESS;
|
|
151
|
+
if (!agentAddress) {
|
|
152
|
+
console.error("[email] EMAIL_AGENT_ADDRESS not configured");
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const config = await getIntegrationConfig("email");
|
|
156
|
+
const displayName = config?.configData?.displayName || "Dispatch Agent";
|
|
157
|
+
const subject = context.platformContext.subject;
|
|
158
|
+
const reSubject = subject.startsWith("Re: ") ? subject : `Re: ${subject}`;
|
|
159
|
+
try {
|
|
160
|
+
await sendEmail({
|
|
161
|
+
to: context.senderId,
|
|
162
|
+
from: `${displayName} <${agentAddress}>`,
|
|
163
|
+
subject: reSubject,
|
|
164
|
+
html: message.text,
|
|
165
|
+
text: stripHtmlForPlainText(message.text),
|
|
166
|
+
inReplyTo: context.platformContext.messageId,
|
|
167
|
+
references: buildReferencesHeader(context.platformContext),
|
|
168
|
+
cc: context.platformContext.isCC
|
|
169
|
+
? buildReplyAllCc(context)
|
|
170
|
+
: undefined,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
console.error("[email] Failed to send response:", err);
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
async sendMessageToTarget(message, target) {
|
|
178
|
+
const agentAddress = process.env.EMAIL_AGENT_ADDRESS;
|
|
179
|
+
if (!agentAddress) {
|
|
180
|
+
console.error("[email] EMAIL_AGENT_ADDRESS not configured");
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const config = await getIntegrationConfig("email");
|
|
184
|
+
const displayName = config?.configData?.displayName || "Dispatch Agent";
|
|
185
|
+
try {
|
|
186
|
+
await sendEmail({
|
|
187
|
+
to: target.destination,
|
|
188
|
+
from: `${displayName} <${agentAddress}>`,
|
|
189
|
+
subject: target.label || "Message from Dispatch Agent",
|
|
190
|
+
html: message.text,
|
|
191
|
+
text: stripHtmlForPlainText(message.text),
|
|
192
|
+
...(target.threadRef
|
|
193
|
+
? {
|
|
194
|
+
inReplyTo: target.threadRef,
|
|
195
|
+
references: target.threadRef,
|
|
196
|
+
}
|
|
197
|
+
: {}),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
console.error("[email] Failed to send proactive message:", err);
|
|
202
|
+
throw err;
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
formatAgentResponse(text) {
|
|
206
|
+
const bodyHtml = markdownToHtml(text);
|
|
207
|
+
const html = wrapInEmailTemplate(bodyHtml);
|
|
208
|
+
return { text: html, platformContext: {} };
|
|
209
|
+
},
|
|
210
|
+
async getStatus(_baseUrl) {
|
|
211
|
+
const hasAgentAddress = !!process.env.EMAIL_AGENT_ADDRESS;
|
|
212
|
+
const hasEmailProvider = isEmailConfigured();
|
|
213
|
+
const hasWebhookSecret = !!process.env.EMAIL_INBOUND_WEBHOOK_SECRET;
|
|
214
|
+
const configured = hasAgentAddress && hasEmailProvider;
|
|
215
|
+
return {
|
|
216
|
+
platform: "email",
|
|
217
|
+
label: "Email",
|
|
218
|
+
enabled: false, // overridden by plugin
|
|
219
|
+
configured,
|
|
220
|
+
details: {
|
|
221
|
+
hasAgentAddress,
|
|
222
|
+
hasEmailProvider,
|
|
223
|
+
hasWebhookSecret,
|
|
224
|
+
provider: getEmailProvider(),
|
|
225
|
+
},
|
|
226
|
+
error: !configured
|
|
227
|
+
? "Set EMAIL_AGENT_ADDRESS and either RESEND_API_KEY or SENDGRID_API_KEY"
|
|
228
|
+
: undefined,
|
|
229
|
+
};
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
// ---------------------------------------------------------------------------
|
|
234
|
+
// Webhook verification
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
async function verifyResendWebhook(event, secret) {
|
|
237
|
+
if (!secret) {
|
|
238
|
+
console.warn("[email] EMAIL_INBOUND_WEBHOOK_SECRET not set — accepting Resend webhook without verification");
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
const svixId = getHeader(event, "svix-id");
|
|
242
|
+
const svixTimestamp = getHeader(event, "svix-timestamp");
|
|
243
|
+
const svixSignature = getHeader(event, "svix-signature");
|
|
244
|
+
if (!svixId || !svixTimestamp || !svixSignature) {
|
|
245
|
+
console.warn("[email] Missing Svix signature headers");
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
// Reject requests older than 5 minutes (replay protection)
|
|
249
|
+
const ts = parseInt(svixTimestamp, 10);
|
|
250
|
+
if (Math.abs(Date.now() / 1000 - ts) > 300) {
|
|
251
|
+
console.warn("[email] Svix timestamp too old, rejecting");
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
const body = await readRawBody(event);
|
|
255
|
+
const crypto = await import("node:crypto");
|
|
256
|
+
// Svix signing secret may be prefixed with "whsec_"
|
|
257
|
+
const rawSecret = secret.startsWith("whsec_") ? secret.slice(6) : secret;
|
|
258
|
+
const secretBytes = Buffer.from(rawSecret, "base64");
|
|
259
|
+
const signedContent = `${svixId}.${svixTimestamp}.${body}`;
|
|
260
|
+
const expectedSignature = crypto
|
|
261
|
+
.createHmac("sha256", secretBytes)
|
|
262
|
+
.update(signedContent)
|
|
263
|
+
.digest("base64");
|
|
264
|
+
// Svix sends multiple signatures separated by spaces, each prefixed with "v1,"
|
|
265
|
+
const signatures = svixSignature.split(" ");
|
|
266
|
+
for (const sig of signatures) {
|
|
267
|
+
const sigValue = sig.startsWith("v1,") ? sig.slice(3) : sig;
|
|
268
|
+
try {
|
|
269
|
+
if (crypto.timingSafeEqual(Buffer.from(expectedSignature), Buffer.from(sigValue))) {
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
// Length mismatch — try next signature
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
console.warn("[email] Svix signature verification failed");
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
async function verifySendGridWebhook(event, secret) {
|
|
281
|
+
if (!secret) {
|
|
282
|
+
console.warn("[email] EMAIL_INBOUND_WEBHOOK_SECRET not set — accepting SendGrid webhook without verification");
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
// Check for the secret in a custom header or basic auth
|
|
286
|
+
const authHeader = getHeader(event, "authorization");
|
|
287
|
+
if (authHeader) {
|
|
288
|
+
// Basic auth: "Basic base64(user:pass)" — secret is the password
|
|
289
|
+
if (authHeader.startsWith("Basic ")) {
|
|
290
|
+
const decoded = Buffer.from(authHeader.slice(6), "base64").toString();
|
|
291
|
+
const password = decoded.split(":")[1];
|
|
292
|
+
if (password === secret)
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Also check a custom header (common SendGrid Inbound Parse pattern)
|
|
297
|
+
const customSecret = getHeader(event, "x-webhook-secret");
|
|
298
|
+
if (customSecret === secret)
|
|
299
|
+
return true;
|
|
300
|
+
console.warn("[email] SendGrid webhook secret verification failed");
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
// ---------------------------------------------------------------------------
|
|
304
|
+
// Inbound email parsing
|
|
305
|
+
// ---------------------------------------------------------------------------
|
|
306
|
+
async function parseResendWebhook(event) {
|
|
307
|
+
const body = await readBody(event);
|
|
308
|
+
if (!body || body.type !== "email.received")
|
|
309
|
+
return null;
|
|
310
|
+
const data = body.data;
|
|
311
|
+
if (!data)
|
|
312
|
+
return null;
|
|
313
|
+
// Resend webhook payload provides email metadata directly in data
|
|
314
|
+
// Fields: from, to, cc, subject, text, html, headers, created_at
|
|
315
|
+
const fromRaw = data.from;
|
|
316
|
+
const from = fromRaw ? parseEmailAddress(fromRaw) : null;
|
|
317
|
+
if (!from)
|
|
318
|
+
return null;
|
|
319
|
+
const toRaw = data.to;
|
|
320
|
+
const to = normalizeAddressList(toRaw);
|
|
321
|
+
const ccRaw = data.cc;
|
|
322
|
+
const cc = normalizeAddressList(ccRaw);
|
|
323
|
+
// Parse headers for Message-ID, In-Reply-To, References
|
|
324
|
+
const headers = parseHeadersObject(data.headers);
|
|
325
|
+
const messageId = headers["message-id"] || data.email_id || `resend-${Date.now()}`;
|
|
326
|
+
return {
|
|
327
|
+
messageId,
|
|
328
|
+
subject: data.subject || "(no subject)",
|
|
329
|
+
from,
|
|
330
|
+
to,
|
|
331
|
+
cc: cc.length > 0 ? cc : undefined,
|
|
332
|
+
text: data.text,
|
|
333
|
+
html: data.html,
|
|
334
|
+
inReplyTo: headers["in-reply-to"] || undefined,
|
|
335
|
+
references: parseReferencesHeader(headers["references"]),
|
|
336
|
+
date: data.created_at || undefined,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
async function parseSendGridWebhook(event) {
|
|
340
|
+
const body = await readBody(event);
|
|
341
|
+
if (!body)
|
|
342
|
+
return null;
|
|
343
|
+
// SendGrid Inbound Parse sends form data with fields:
|
|
344
|
+
// from, to, cc, subject, text, html, headers, envelope
|
|
345
|
+
const fromRaw = body.from;
|
|
346
|
+
const from = fromRaw ? parseEmailAddress(fromRaw) : null;
|
|
347
|
+
if (!from)
|
|
348
|
+
return null;
|
|
349
|
+
const toRaw = body.to;
|
|
350
|
+
const to = toRaw ? toRaw.split(",").map((a) => a.trim()) : [];
|
|
351
|
+
const ccRaw = body.cc;
|
|
352
|
+
const cc = ccRaw ? ccRaw.split(",").map((a) => a.trim()) : [];
|
|
353
|
+
// Parse raw headers string
|
|
354
|
+
const headersStr = body.headers;
|
|
355
|
+
const headers = parseHeadersString(headersStr);
|
|
356
|
+
const messageId = headers["message-id"] || `sendgrid-${Date.now()}`;
|
|
357
|
+
return {
|
|
358
|
+
messageId,
|
|
359
|
+
subject: body.subject || "(no subject)",
|
|
360
|
+
from,
|
|
361
|
+
to,
|
|
362
|
+
cc: cc.length > 0 ? cc : undefined,
|
|
363
|
+
text: body.text,
|
|
364
|
+
html: body.html,
|
|
365
|
+
inReplyTo: headers["in-reply-to"] || undefined,
|
|
366
|
+
references: parseReferencesHeader(headers["references"]),
|
|
367
|
+
date: headers["date"] || undefined,
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
// ---------------------------------------------------------------------------
|
|
371
|
+
// Rate limiting
|
|
372
|
+
// ---------------------------------------------------------------------------
|
|
373
|
+
function isRateLimited(senderEmail) {
|
|
374
|
+
const now = Date.now();
|
|
375
|
+
const entry = rateLimitMap.get(senderEmail);
|
|
376
|
+
if (!entry || now - entry.windowStart > RATE_LIMIT_WINDOW_MS) {
|
|
377
|
+
rateLimitMap.set(senderEmail, { count: 1, windowStart: now });
|
|
378
|
+
return false;
|
|
379
|
+
}
|
|
380
|
+
entry.count++;
|
|
381
|
+
if (entry.count > RATE_LIMIT_MAX) {
|
|
382
|
+
return true;
|
|
383
|
+
}
|
|
384
|
+
return false;
|
|
385
|
+
}
|
|
386
|
+
// ---------------------------------------------------------------------------
|
|
387
|
+
// Helpers — email address parsing
|
|
388
|
+
// ---------------------------------------------------------------------------
|
|
389
|
+
/** Parse "Name <addr@example.com>" or plain "addr@example.com" */
|
|
390
|
+
function parseEmailAddress(raw) {
|
|
391
|
+
const match = raw.match(/^\s*(.*?)\s*<([^>]+)>\s*$/);
|
|
392
|
+
if (match && match[2]) {
|
|
393
|
+
return {
|
|
394
|
+
name: match[1].replace(/^["']|["']$/g, "").trim() || undefined,
|
|
395
|
+
email: match[2].trim(),
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
return { email: raw.trim() };
|
|
399
|
+
}
|
|
400
|
+
/** Normalize a to/cc field that may be a string, array, or undefined into a string[] of addresses */
|
|
401
|
+
function normalizeAddressList(raw) {
|
|
402
|
+
if (!raw)
|
|
403
|
+
return [];
|
|
404
|
+
if (Array.isArray(raw))
|
|
405
|
+
return raw.map((a) => a.trim());
|
|
406
|
+
return raw.split(",").map((a) => a.trim());
|
|
407
|
+
}
|
|
408
|
+
// ---------------------------------------------------------------------------
|
|
409
|
+
// Helpers — header parsing
|
|
410
|
+
// ---------------------------------------------------------------------------
|
|
411
|
+
/** Parse a headers object (Resend format: array of {name, value} or Record) */
|
|
412
|
+
function parseHeadersObject(headers) {
|
|
413
|
+
const result = {};
|
|
414
|
+
if (!headers)
|
|
415
|
+
return result;
|
|
416
|
+
if (Array.isArray(headers)) {
|
|
417
|
+
for (const h of headers) {
|
|
418
|
+
if (h && typeof h === "object" && "name" in h && "value" in h) {
|
|
419
|
+
result[h.name.toLowerCase()] = h.value;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
else if (typeof headers === "object") {
|
|
424
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
425
|
+
result[key.toLowerCase()] = String(value);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
return result;
|
|
429
|
+
}
|
|
430
|
+
/** Parse a raw headers string (SendGrid format: "Key: Value\nKey: Value\n...") */
|
|
431
|
+
function parseHeadersString(raw) {
|
|
432
|
+
const result = {};
|
|
433
|
+
if (!raw)
|
|
434
|
+
return result;
|
|
435
|
+
const lines = raw.split(/\r?\n/);
|
|
436
|
+
let currentKey = "";
|
|
437
|
+
let currentValue = "";
|
|
438
|
+
for (const line of lines) {
|
|
439
|
+
// Continuation line (starts with whitespace)
|
|
440
|
+
if (/^\s/.test(line) && currentKey) {
|
|
441
|
+
currentValue += " " + line.trim();
|
|
442
|
+
continue;
|
|
443
|
+
}
|
|
444
|
+
// Save previous header
|
|
445
|
+
if (currentKey) {
|
|
446
|
+
result[currentKey.toLowerCase()] = currentValue;
|
|
447
|
+
}
|
|
448
|
+
const colonIdx = line.indexOf(":");
|
|
449
|
+
if (colonIdx > 0) {
|
|
450
|
+
currentKey = line.slice(0, colonIdx).trim();
|
|
451
|
+
currentValue = line.slice(colonIdx + 1).trim();
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
currentKey = "";
|
|
455
|
+
currentValue = "";
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
// Save last header
|
|
459
|
+
if (currentKey) {
|
|
460
|
+
result[currentKey.toLowerCase()] = currentValue;
|
|
461
|
+
}
|
|
462
|
+
return result;
|
|
463
|
+
}
|
|
464
|
+
/** Parse a References header value into an array of Message-IDs */
|
|
465
|
+
function parseReferencesHeader(references) {
|
|
466
|
+
if (!references)
|
|
467
|
+
return undefined;
|
|
468
|
+
const ids = references.match(/<[^>]+>/g);
|
|
469
|
+
return ids && ids.length > 0 ? ids : undefined;
|
|
470
|
+
}
|
|
471
|
+
// ---------------------------------------------------------------------------
|
|
472
|
+
// Helpers — threading
|
|
473
|
+
// ---------------------------------------------------------------------------
|
|
474
|
+
/**
|
|
475
|
+
* Get the thread root ID using a Gmail-style approach:
|
|
476
|
+
* the oldest Message-ID from the References chain is the thread root.
|
|
477
|
+
* If no References, use the current Message-ID.
|
|
478
|
+
*/
|
|
479
|
+
function getThreadRootId(messageId, references) {
|
|
480
|
+
if (references && references.length > 0) {
|
|
481
|
+
return references[0];
|
|
482
|
+
}
|
|
483
|
+
return messageId;
|
|
484
|
+
}
|
|
485
|
+
// ---------------------------------------------------------------------------
|
|
486
|
+
// Helpers — reply building
|
|
487
|
+
// ---------------------------------------------------------------------------
|
|
488
|
+
/** Build a References header from the platform context */
|
|
489
|
+
function buildReferencesHeader(ctx) {
|
|
490
|
+
const parts = [];
|
|
491
|
+
// Include existing references
|
|
492
|
+
const refs = ctx.references;
|
|
493
|
+
if (refs) {
|
|
494
|
+
parts.push(...refs);
|
|
495
|
+
}
|
|
496
|
+
// Append the current message ID
|
|
497
|
+
const messageId = ctx.messageId;
|
|
498
|
+
if (messageId) {
|
|
499
|
+
// Avoid duplicates
|
|
500
|
+
if (!parts.includes(messageId)) {
|
|
501
|
+
parts.push(messageId);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
return parts.join(" ");
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Build CC list for reply-all when agent was CC'd.
|
|
508
|
+
* Include original To addresses and other CC addresses, excluding the agent and the original sender.
|
|
509
|
+
*/
|
|
510
|
+
function buildReplyAllCc(context) {
|
|
511
|
+
const agentAddress = process.env.EMAIL_AGENT_ADDRESS?.toLowerCase();
|
|
512
|
+
const senderEmail = context.senderId?.toLowerCase();
|
|
513
|
+
const toAddresses = context.platformContext.to || [];
|
|
514
|
+
const ccAddresses = context.platformContext.cc || [];
|
|
515
|
+
const allRecipients = new Set();
|
|
516
|
+
for (const addr of [...toAddresses, ...ccAddresses]) {
|
|
517
|
+
const normalized = addr.toLowerCase().trim();
|
|
518
|
+
// Exclude agent address and original sender (sender goes in To)
|
|
519
|
+
if (normalized !== agentAddress && normalized !== senderEmail) {
|
|
520
|
+
allRecipients.add(normalized);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
return allRecipients.size > 0 ? Array.from(allRecipients) : undefined;
|
|
524
|
+
}
|
|
525
|
+
// ---------------------------------------------------------------------------
|
|
526
|
+
// Helpers — text conversion
|
|
527
|
+
// ---------------------------------------------------------------------------
|
|
528
|
+
/** Strip HTML tags for a plain-text version of the email */
|
|
529
|
+
function stripHtmlForPlainText(html) {
|
|
530
|
+
return html
|
|
531
|
+
.replace(/<br\s*\/?>/gi, "\n")
|
|
532
|
+
.replace(/<\/p>/gi, "\n\n")
|
|
533
|
+
.replace(/<\/div>/gi, "\n")
|
|
534
|
+
.replace(/<\/li>/gi, "\n")
|
|
535
|
+
.replace(/<li[^>]*>/gi, "- ")
|
|
536
|
+
.replace(/<\/h[1-6]>/gi, "\n\n")
|
|
537
|
+
.replace(/<[^>]+>/g, "")
|
|
538
|
+
.replace(/ /g, " ")
|
|
539
|
+
.replace(/&/g, "&")
|
|
540
|
+
.replace(/</g, "<")
|
|
541
|
+
.replace(/>/g, ">")
|
|
542
|
+
.replace(/"/g, '"')
|
|
543
|
+
.replace(/'/g, "'")
|
|
544
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
545
|
+
.trim();
|
|
546
|
+
}
|
|
547
|
+
/** Convert basic markdown to HTML for email rendering */
|
|
548
|
+
function markdownToHtml(md) {
|
|
549
|
+
let html = md;
|
|
550
|
+
// Escape HTML entities in the source (but not our generated tags)
|
|
551
|
+
html = html
|
|
552
|
+
.replace(/&/g, "&")
|
|
553
|
+
.replace(/</g, "<")
|
|
554
|
+
.replace(/>/g, ">");
|
|
555
|
+
// Bold: **text** or __text__
|
|
556
|
+
html = html.replace(/\*\*(.+?)\*\*/g, "<strong>$1</strong>");
|
|
557
|
+
html = html.replace(/__(.+?)__/g, "<strong>$1</strong>");
|
|
558
|
+
// Italic: *text* or _text_ (but not inside words with underscores)
|
|
559
|
+
html = html.replace(/(?<!\w)\*([^*]+?)\*(?!\w)/g, "<em>$1</em>");
|
|
560
|
+
html = html.replace(/(?<!\w)_([^_]+?)_(?!\w)/g, "<em>$1</em>");
|
|
561
|
+
// Links: [text](url)
|
|
562
|
+
html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" style="color:#2563eb;text-decoration:underline;">$1</a>');
|
|
563
|
+
// Inline code: `code`
|
|
564
|
+
html = html.replace(/`([^`]+)`/g, '<code style="background:#f1f5f9;padding:1px 4px;border-radius:3px;font-size:0.9em;">$1</code>');
|
|
565
|
+
// Unordered lists: lines starting with "- " or "* "
|
|
566
|
+
html = html.replace(/^([*-]) (.+)$/gm, "<li>$2</li>");
|
|
567
|
+
// Wrap consecutive <li> in <ul>
|
|
568
|
+
html = html.replace(/(<li>.*?<\/li>\n?)+/g, '<ul style="margin:8px 0;padding-left:20px;">$&</ul>');
|
|
569
|
+
// Ordered lists: lines starting with "1. ", "2. " etc.
|
|
570
|
+
html = html.replace(/^\d+\. (.+)$/gm, "<li>$1</li>");
|
|
571
|
+
// Wrap consecutive <li> that aren't in <ul> in <ol>
|
|
572
|
+
html = html.replace(/(?<!<\/ul>)(<li>.*?<\/li>\n?)+/g, (match) => {
|
|
573
|
+
if (match.includes("<ul"))
|
|
574
|
+
return match;
|
|
575
|
+
return `<ol style="margin:8px 0;padding-left:20px;">${match}</ol>`;
|
|
576
|
+
});
|
|
577
|
+
// Headings: # through ###
|
|
578
|
+
html = html.replace(/^### (.+)$/gm, '<h3 style="margin:16px 0 8px;font-size:1.1em;">$1</h3>');
|
|
579
|
+
html = html.replace(/^## (.+)$/gm, '<h2 style="margin:16px 0 8px;font-size:1.25em;">$1</h2>');
|
|
580
|
+
html = html.replace(/^# (.+)$/gm, '<h1 style="margin:16px 0 8px;font-size:1.4em;">$1</h1>');
|
|
581
|
+
// Horizontal rules: --- or ***
|
|
582
|
+
html = html.replace(/^(-{3,}|\*{3,})$/gm, '<hr style="border:none;border-top:1px solid #e2e8f0;margin:16px 0;">');
|
|
583
|
+
// Paragraphs: double newlines
|
|
584
|
+
html = html.replace(/\n\n/g, "</p><p>");
|
|
585
|
+
// Single newlines → <br>
|
|
586
|
+
html = html.replace(/\n/g, "<br>");
|
|
587
|
+
// Wrap in paragraph tags
|
|
588
|
+
html = `<p>${html}</p>`;
|
|
589
|
+
// Clean up empty paragraphs
|
|
590
|
+
html = html.replace(/<p>\s*<\/p>/g, "");
|
|
591
|
+
return html;
|
|
592
|
+
}
|
|
593
|
+
/** Wrap body HTML in a minimal email template with inline styles */
|
|
594
|
+
function wrapInEmailTemplate(bodyHtml) {
|
|
595
|
+
return `<!DOCTYPE html>
|
|
596
|
+
<html>
|
|
597
|
+
<head>
|
|
598
|
+
<meta charset="utf-8">
|
|
599
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
600
|
+
</head>
|
|
601
|
+
<body style="margin:0;padding:0;background-color:#ffffff;">
|
|
602
|
+
<div style="max-width:600px;margin:0 auto;padding:20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;font-size:14px;line-height:1.6;color:#1a1a1a;">
|
|
603
|
+
${bodyHtml}
|
|
604
|
+
</div>
|
|
605
|
+
</body>
|
|
606
|
+
</html>`;
|
|
607
|
+
}
|
|
608
|
+
// ---------------------------------------------------------------------------
|
|
609
|
+
// Raw body reader (matches Slack adapter pattern)
|
|
610
|
+
// ---------------------------------------------------------------------------
|
|
611
|
+
/** Read the raw body as a string (H3 may have already parsed it) */
|
|
612
|
+
async function readRawBody(event) {
|
|
613
|
+
if (event.context.__rawBody)
|
|
614
|
+
return event.context.__rawBody;
|
|
615
|
+
const body = await readBody(event);
|
|
616
|
+
const raw = typeof body === "string" ? body : JSON.stringify(body);
|
|
617
|
+
event.context.__rawBody = raw;
|
|
618
|
+
return raw;
|
|
619
|
+
}
|
|
620
|
+
//# sourceMappingURL=email.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../../src/integrations/adapters/email.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../../src/integrations/adapters/telegram.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EAKhB,MAAM,aAAa,CAAC;AAOrB;;;;;;;;GAQG;AACH,wBAAgB,eAAe,IAAI,eAAe,
|
|
1
|
+
{"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../../src/integrations/adapters/telegram.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EAKhB,MAAM,aAAa,CAAC;AAOrB;;;;;;;;GAQG;AACH,wBAAgB,eAAe,IAAI,eAAe,CA+OjD"}
|