@open-mercato/core 0.6.5-develop.4384.1.ce2ec6eaaa → 0.6.5-develop.4397.1.9a65481757
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/.turbo/turbo-build.log +2 -2
- package/dist/generated/entities/channel_ingest_dead_letter/index.js +25 -0
- package/dist/generated/entities/channel_ingest_dead_letter/index.js.map +7 -0
- package/dist/generated/entities/channel_thread_mapping/index.js +25 -0
- package/dist/generated/entities/channel_thread_mapping/index.js.map +7 -0
- package/dist/generated/entities/channel_thread_token/index.js +17 -0
- package/dist/generated/entities/channel_thread_token/index.js.map +7 -0
- package/dist/generated/entities/communication_channel/index.js +43 -0
- package/dist/generated/entities/communication_channel/index.js.map +7 -0
- package/dist/generated/entities/customer_interaction/index.js +4 -0
- package/dist/generated/entities/customer_interaction/index.js.map +2 -2
- package/dist/generated/entities/external_conversation/index.js +25 -0
- package/dist/generated/entities/external_conversation/index.js.map +7 -0
- package/dist/generated/entities/external_message/index.js +25 -0
- package/dist/generated/entities/external_message/index.js.map +7 -0
- package/dist/generated/entities/integration_credentials/index.js +3 -1
- package/dist/generated/entities/integration_credentials/index.js.map +2 -2
- package/dist/generated/entities/message/index.js +2 -0
- package/dist/generated/entities/message/index.js.map +2 -2
- package/dist/generated/entities/message_channel_link/index.js +33 -0
- package/dist/generated/entities/message_channel_link/index.js.map +7 -0
- package/dist/generated/entities/message_reaction/index.js +25 -0
- package/dist/generated/entities/message_reaction/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +11 -0
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +117 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/authFixtures.js +2 -1
- package/dist/helpers/integration/authFixtures.js.map +2 -2
- package/dist/helpers/integration/communicationChannelsFixtures.js +58 -0
- package/dist/helpers/integration/communicationChannelsFixtures.js.map +7 -0
- package/dist/modules/communication_channels/acl.js +47 -0
- package/dist/modules/communication_channels/acl.js.map +7 -0
- package/dist/modules/communication_channels/api/delete/channels/[id]/route.js +133 -0
- package/dist/modules/communication_channels/api/delete/channels/[id]/route.js.map +7 -0
- package/dist/modules/communication_channels/api/delete/messages/[messageId]/reactions/[reactionId]/route.js +113 -0
- package/dist/modules/communication_channels/api/delete/messages/[messageId]/reactions/[reactionId]/route.js.map +7 -0
- package/dist/modules/communication_channels/api/get/channels/[id]/health/route.js +138 -0
- package/dist/modules/communication_channels/api/get/channels/[id]/health/route.js.map +7 -0
- package/dist/modules/communication_channels/api/get/channels/[id]/route.js +93 -0
- package/dist/modules/communication_channels/api/get/channels/[id]/route.js.map +7 -0
- package/dist/modules/communication_channels/api/get/channels/route.js +96 -0
- package/dist/modules/communication_channels/api/get/channels/route.js.map +7 -0
- package/dist/modules/communication_channels/api/get/me/channels/route.js +82 -0
- package/dist/modules/communication_channels/api/get/me/channels/route.js.map +7 -0
- package/dist/modules/communication_channels/api/get/oauth/[provider]/callback/route.js +274 -0
- package/dist/modules/communication_channels/api/get/oauth/[provider]/callback/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/import-history/route.js +168 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/import-history/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/poll-now/route.js +143 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/poll-now/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/push/register/route.js +127 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/push/register/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/set-primary/route.js +99 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/set-primary/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js +197 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/connect/credentials/route.js +124 -0
- package/dist/modules/communication_channels/api/post/channels/connect/credentials/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/messages/[messageId]/reactions/route.js +120 -0
- package/dist/modules/communication_channels/api/post/messages/[messageId]/reactions/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/oauth/[provider]/initiate/route.js +157 -0
- package/dist/modules/communication_channels/api/post/oauth/[provider]/initiate/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/send-as-user/route.js +115 -0
- package/dist/modules/communication_channels/api/post/send-as-user/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/test-seed/route.js +217 -0
- package/dist/modules/communication_channels/api/post/test-seed/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/webhook/[provider]/route.js +175 -0
- package/dist/modules/communication_channels/api/post/webhook/[provider]/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/webhooks/gmail/route.js +123 -0
- package/dist/modules/communication_channels/api/post/webhooks/gmail/route.js.map +7 -0
- package/dist/modules/communication_channels/api/put/threads/[threadId]/assign/route.js +117 -0
- package/dist/modules/communication_channels/api/put/threads/[threadId]/assign/route.js.map +7 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/[id]/page.js +180 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/[id]/page.js.map +7 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/[id]/page.meta.js +36 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/[id]/page.meta.js.map +7 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +107 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +7 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.meta.js +38 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.meta.js.map +7 -0
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.js +727 -0
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.js.map +7 -0
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.meta.js +38 -0
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.meta.js.map +7 -0
- package/dist/modules/communication_channels/commands/connect-credential-channel.js +154 -0
- package/dist/modules/communication_channels/commands/connect-credential-channel.js.map +7 -0
- package/dist/modules/communication_channels/commands/delete-channel.js +137 -0
- package/dist/modules/communication_channels/commands/delete-channel.js.map +7 -0
- package/dist/modules/communication_channels/commands/deliver-outbound-message.js +400 -0
- package/dist/modules/communication_channels/commands/deliver-outbound-message.js.map +7 -0
- package/dist/modules/communication_channels/commands/disconnect-channel.js +163 -0
- package/dist/modules/communication_channels/commands/disconnect-channel.js.map +7 -0
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js +413 -0
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +7 -0
- package/dist/modules/communication_channels/commands/interceptors.js +68 -0
- package/dist/modules/communication_channels/commands/interceptors.js.map +7 -0
- package/dist/modules/communication_channels/commands/process-inbound-reaction.js +198 -0
- package/dist/modules/communication_channels/commands/process-inbound-reaction.js.map +7 -0
- package/dist/modules/communication_channels/commands/push-register.js +146 -0
- package/dist/modules/communication_channels/commands/push-register.js.map +7 -0
- package/dist/modules/communication_channels/commands/push-renew.js +23 -0
- package/dist/modules/communication_channels/commands/push-renew.js.map +7 -0
- package/dist/modules/communication_channels/commands/push-unregister.js +108 -0
- package/dist/modules/communication_channels/commands/push-unregister.js.map +7 -0
- package/dist/modules/communication_channels/commands/queue-import-history.js +113 -0
- package/dist/modules/communication_channels/commands/queue-import-history.js.map +7 -0
- package/dist/modules/communication_channels/commands/reassign-conversation.js +193 -0
- package/dist/modules/communication_channels/commands/reassign-conversation.js.map +7 -0
- package/dist/modules/communication_channels/commands/set-primary-channel.js +114 -0
- package/dist/modules/communication_channels/commands/set-primary-channel.js.map +7 -0
- package/dist/modules/communication_channels/commands/toggle-outbound-reaction.js +260 -0
- package/dist/modules/communication_channels/commands/toggle-outbound-reaction.js.map +7 -0
- package/dist/modules/communication_channels/data/enrichers.js +286 -0
- package/dist/modules/communication_channels/data/enrichers.js.map +7 -0
- package/dist/modules/communication_channels/data/entities.js +447 -0
- package/dist/modules/communication_channels/data/entities.js.map +7 -0
- package/dist/modules/communication_channels/data/extensions.js +67 -0
- package/dist/modules/communication_channels/data/extensions.js.map +7 -0
- package/dist/modules/communication_channels/data/validators.js +123 -0
- package/dist/modules/communication_channels/data/validators.js.map +7 -0
- package/dist/modules/communication_channels/di.js +35 -0
- package/dist/modules/communication_channels/di.js.map +7 -0
- package/dist/modules/communication_channels/encryption.js +12 -0
- package/dist/modules/communication_channels/encryption.js.map +7 -0
- package/dist/modules/communication_channels/events.js +124 -0
- package/dist/modules/communication_channels/events.js.map +7 -0
- package/dist/modules/communication_channels/index.js +20 -0
- package/dist/modules/communication_channels/index.js.map +7 -0
- package/dist/modules/communication_channels/lib/access-control.js +43 -0
- package/dist/modules/communication_channels/lib/access-control.js.map +7 -0
- package/dist/modules/communication_channels/lib/adapter-compat.js +36 -0
- package/dist/modules/communication_channels/lib/adapter-compat.js.map +7 -0
- package/dist/modules/communication_channels/lib/adapter-registry-singleton.js +22 -0
- package/dist/modules/communication_channels/lib/adapter-registry-singleton.js.map +7 -0
- package/dist/modules/communication_channels/lib/adapter.js +1 -0
- package/dist/modules/communication_channels/lib/adapter.js.map +7 -0
- package/dist/modules/communication_channels/lib/connect-channel.js +95 -0
- package/dist/modules/communication_channels/lib/connect-channel.js.map +7 -0
- package/dist/modules/communication_channels/lib/contact-resolver.js +79 -0
- package/dist/modules/communication_channels/lib/contact-resolver.js.map +7 -0
- package/dist/modules/communication_channels/lib/credential-refresh.js +97 -0
- package/dist/modules/communication_channels/lib/credential-refresh.js.map +7 -0
- package/dist/modules/communication_channels/lib/dead-letter.js +62 -0
- package/dist/modules/communication_channels/lib/dead-letter.js.map +7 -0
- package/dist/modules/communication_channels/lib/email-capabilities.js +47 -0
- package/dist/modules/communication_channels/lib/email-capabilities.js.map +7 -0
- package/dist/modules/communication_channels/lib/email-contact.js +14 -0
- package/dist/modules/communication_channels/lib/email-contact.js.map +7 -0
- package/dist/modules/communication_channels/lib/email-mime.js +269 -0
- package/dist/modules/communication_channels/lib/email-mime.js.map +7 -0
- package/dist/modules/communication_channels/lib/error-classification.js +101 -0
- package/dist/modules/communication_channels/lib/error-classification.js.map +7 -0
- package/dist/modules/communication_channels/lib/gmail-pubsub-jwt.js +185 -0
- package/dist/modules/communication_channels/lib/gmail-pubsub-jwt.js.map +7 -0
- package/dist/modules/communication_channels/lib/mutation-guards.js +114 -0
- package/dist/modules/communication_channels/lib/mutation-guards.js.map +7 -0
- package/dist/modules/communication_channels/lib/oauth-client-config.js +32 -0
- package/dist/modules/communication_channels/lib/oauth-client-config.js.map +7 -0
- package/dist/modules/communication_channels/lib/oauth-state.js +128 -0
- package/dist/modules/communication_channels/lib/oauth-state.js.map +7 -0
- package/dist/modules/communication_channels/lib/oauth-token.js +45 -0
- package/dist/modules/communication_channels/lib/oauth-token.js.map +7 -0
- package/dist/modules/communication_channels/lib/pg-errors.js +11 -0
- package/dist/modules/communication_channels/lib/pg-errors.js.map +7 -0
- package/dist/modules/communication_channels/lib/provider-health.js +24 -0
- package/dist/modules/communication_channels/lib/provider-health.js.map +7 -0
- package/dist/modules/communication_channels/lib/push-state.js +19 -0
- package/dist/modules/communication_channels/lib/push-state.js.map +7 -0
- package/dist/modules/communication_channels/lib/queue.js +54 -0
- package/dist/modules/communication_channels/lib/queue.js.map +7 -0
- package/dist/modules/communication_channels/lib/reaction-processor-types.js +5 -0
- package/dist/modules/communication_channels/lib/reaction-processor-types.js.map +7 -0
- package/dist/modules/communication_channels/lib/reaction-semantics.js +11 -0
- package/dist/modules/communication_channels/lib/reaction-semantics.js.map +7 -0
- package/dist/modules/communication_channels/lib/registry.js +67 -0
- package/dist/modules/communication_channels/lib/registry.js.map +7 -0
- package/dist/modules/communication_channels/lib/route-mutation-guard.js +43 -0
- package/dist/modules/communication_channels/lib/route-mutation-guard.js.map +7 -0
- package/dist/modules/communication_channels/lib/sanitize-channel-html.js +96 -0
- package/dist/modules/communication_channels/lib/sanitize-channel-html.js.map +7 -0
- package/dist/modules/communication_channels/lib/send-as-user.js +194 -0
- package/dist/modules/communication_channels/lib/send-as-user.js.map +7 -0
- package/dist/modules/communication_channels/lib/system-user.js +22 -0
- package/dist/modules/communication_channels/lib/system-user.js.map +7 -0
- package/dist/modules/communication_channels/lib/test-seed.js +68 -0
- package/dist/modules/communication_channels/lib/test-seed.js.map +7 -0
- package/dist/modules/communication_channels/lib/thread-matcher.js +263 -0
- package/dist/modules/communication_channels/lib/thread-matcher.js.map +7 -0
- package/dist/modules/communication_channels/lib/thread-token.js +219 -0
- package/dist/modules/communication_channels/lib/thread-token.js.map +7 -0
- package/dist/modules/communication_channels/lib/use-connect-channel.js +61 -0
- package/dist/modules/communication_channels/lib/use-connect-channel.js.map +7 -0
- package/dist/modules/communication_channels/migrations/Migration20260526134719_communication_channels.js +50 -0
- package/dist/modules/communication_channels/migrations/Migration20260526134719_communication_channels.js.map +7 -0
- package/dist/modules/communication_channels/migrations/Migration20260527195446_communication_channels.js +19 -0
- package/dist/modules/communication_channels/migrations/Migration20260527195446_communication_channels.js.map +7 -0
- package/dist/modules/communication_channels/migrations/Migration20260529231848_communication_channels.js +13 -0
- package/dist/modules/communication_channels/migrations/Migration20260529231848_communication_channels.js.map +7 -0
- package/dist/modules/communication_channels/migrations/Migration20260531120000_communication_channels.js +17 -0
- package/dist/modules/communication_channels/migrations/Migration20260531120000_communication_channels.js.map +7 -0
- package/dist/modules/communication_channels/notifications.client.js +51 -0
- package/dist/modules/communication_channels/notifications.client.js.map +7 -0
- package/dist/modules/communication_channels/notifications.handlers.js +53 -0
- package/dist/modules/communication_channels/notifications.handlers.js.map +7 -0
- package/dist/modules/communication_channels/notifications.js +56 -0
- package/dist/modules/communication_channels/notifications.js.map +7 -0
- package/dist/modules/communication_channels/setup.js +105 -0
- package/dist/modules/communication_channels/setup.js.map +7 -0
- package/dist/modules/communication_channels/subscribers/channel-requires-reauth-notification.js +71 -0
- package/dist/modules/communication_channels/subscribers/channel-requires-reauth-notification.js.map +7 -0
- package/dist/modules/communication_channels/subscribers/outbound-bridge.js +103 -0
- package/dist/modules/communication_channels/subscribers/outbound-bridge.js.map +7 -0
- package/dist/modules/communication_channels/subscribers/user-deleted-cascade.js +51 -0
- package/dist/modules/communication_channels/subscribers/user-deleted-cascade.js.map +7 -0
- package/dist/modules/communication_channels/widgets/components.js +7 -0
- package/dist/modules/communication_channels/widgets/components.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-badge/widget.client.js +18 -0
- package/dist/modules/communication_channels/widgets/injection/channel-badge/widget.client.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-badge/widget.js +30 -0
- package/dist/modules/communication_channels/widgets/injection/channel-badge/widget.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-info-panel/widget.client.js +185 -0
- package/dist/modules/communication_channels/widgets/injection/channel-info-panel/widget.client.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-info-panel/widget.js +17 -0
- package/dist/modules/communication_channels/widgets/injection/channel-info-panel/widget.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.js +44 -0
- package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.js +17 -0
- package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/profile-channels-menu/widget.js +23 -0
- package/dist/modules/communication_channels/widgets/injection/profile-channels-menu/widget.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/reaction-bar/widget.client.js +141 -0
- package/dist/modules/communication_channels/widgets/injection/reaction-bar/widget.client.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/reaction-bar/widget.js +17 -0
- package/dist/modules/communication_channels/widgets/injection/reaction-bar/widget.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection-table.js +38 -0
- package/dist/modules/communication_channels/widgets/injection-table.js.map +7 -0
- package/dist/modules/communication_channels/widgets/notifications/ChannelRequiresReauthRenderer.js +25 -0
- package/dist/modules/communication_channels/widgets/notifications/ChannelRequiresReauthRenderer.js.map +7 -0
- package/dist/modules/communication_channels/widgets/notifications/MessageReceivedRenderer.js +19 -0
- package/dist/modules/communication_channels/widgets/notifications/MessageReceivedRenderer.js.map +7 -0
- package/dist/modules/communication_channels/widgets/notifications/index.js +7 -0
- package/dist/modules/communication_channels/widgets/notifications/index.js.map +7 -0
- package/dist/modules/communication_channels/workers/channel-import-history.js +185 -0
- package/dist/modules/communication_channels/workers/channel-import-history.js.map +7 -0
- package/dist/modules/communication_channels/workers/gmail-history-sync.js +154 -0
- package/dist/modules/communication_channels/workers/gmail-history-sync.js.map +7 -0
- package/dist/modules/communication_channels/workers/gmail-renew-watch.js +95 -0
- package/dist/modules/communication_channels/workers/gmail-renew-watch.js.map +7 -0
- package/dist/modules/communication_channels/workers/inbound-processor.js +56 -0
- package/dist/modules/communication_channels/workers/inbound-processor.js.map +7 -0
- package/dist/modules/communication_channels/workers/outbound-delivery.js +85 -0
- package/dist/modules/communication_channels/workers/outbound-delivery.js.map +7 -0
- package/dist/modules/communication_channels/workers/poll-channel.js +240 -0
- package/dist/modules/communication_channels/workers/poll-channel.js.map +7 -0
- package/dist/modules/communication_channels/workers/poll-tick.js +132 -0
- package/dist/modules/communication_channels/workers/poll-tick.js.map +7 -0
- package/dist/modules/communication_channels/workers/reaction-processor.js +192 -0
- package/dist/modules/communication_channels/workers/reaction-processor.js.map +7 -0
- package/dist/modules/customers/acl.js +18 -0
- package/dist/modules/customers/acl.js.map +2 -2
- package/dist/modules/customers/api/activities/route.js +9 -0
- package/dist/modules/customers/api/activities/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/route.js +18 -7
- package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/interactions/[id]/visibility/route.js +151 -0
- package/dist/modules/customers/api/interactions/[id]/visibility/route.js.map +7 -0
- package/dist/modules/customers/api/interactions/counts/route.js +6 -0
- package/dist/modules/customers/api/interactions/counts/route.js.map +2 -2
- package/dist/modules/customers/api/interactions/route.js +26 -7
- package/dist/modules/customers/api/interactions/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/email-threads/route.js +82 -0
- package/dist/modules/customers/api/people/[id]/email-threads/route.js.map +7 -0
- package/dist/modules/customers/api/people/[id]/emails/route.js +157 -0
- package/dist/modules/customers/api/people/[id]/emails/route.js.map +7 -0
- package/dist/modules/customers/api/people/[id]/route.js +12 -4
- package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +10 -0
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +46 -5
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/commands/interactions.js +16 -0
- package/dist/modules/customers/commands/interactions.js.map +2 -2
- package/dist/modules/customers/components/detail/ActivityCard.js +32 -0
- package/dist/modules/customers/components/detail/ActivityCard.js.map +2 -2
- package/dist/modules/customers/components/detail/ComposeEmailDialog.js +242 -0
- package/dist/modules/customers/components/detail/ComposeEmailDialog.js.map +7 -0
- package/dist/modules/customers/components/detail/DealForm.js +2 -1
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/DealsSection.js +10 -0
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/EmailCardActions.js +179 -0
- package/dist/modules/customers/components/detail/EmailCardActions.js.map +7 -0
- package/dist/modules/customers/components/detail/EmailReplyForwardActions.js +52 -0
- package/dist/modules/customers/components/detail/EmailReplyForwardActions.js.map +7 -0
- package/dist/modules/customers/components/detail/PersonDetailTabs.js +7 -1
- package/dist/modules/customers/components/detail/PersonDetailTabs.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonEmailThreadsTab.js +366 -0
- package/dist/modules/customers/components/detail/PersonEmailThreadsTab.js.map +7 -0
- package/dist/modules/customers/data/enrichers.js +133 -2
- package/dist/modules/customers/data/enrichers.js.map +2 -2
- package/dist/modules/customers/data/entities.js +18 -0
- package/dist/modules/customers/data/entities.js.map +2 -2
- package/dist/modules/customers/data/extensions.js +16 -0
- package/dist/modules/customers/data/extensions.js.map +7 -0
- package/dist/modules/customers/encryption.js +11 -0
- package/dist/modules/customers/encryption.js.map +2 -2
- package/dist/modules/customers/events.js +4 -1
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/findPeopleByAddresses.js +64 -0
- package/dist/modules/customers/lib/findPeopleByAddresses.js.map +7 -0
- package/dist/modules/customers/lib/kysely.js.map +2 -2
- package/dist/modules/customers/lib/link-channel-message-handler.js +303 -0
- package/dist/modules/customers/lib/link-channel-message-handler.js.map +7 -0
- package/dist/modules/customers/lib/personEmailThreads.js +205 -0
- package/dist/modules/customers/lib/personEmailThreads.js.map +7 -0
- package/dist/modules/customers/lib/visibilityFilter.js +51 -0
- package/dist/modules/customers/lib/visibilityFilter.js.map +7 -0
- package/dist/modules/customers/migrations/Migration20260527012240_customers.js +20 -0
- package/dist/modules/customers/migrations/Migration20260527012240_customers.js.map +7 -0
- package/dist/modules/customers/setup.js +2 -1
- package/dist/modules/customers/setup.js.map +2 -2
- package/dist/modules/customers/subscribers/link-channel-message-received.js +12 -0
- package/dist/modules/customers/subscribers/link-channel-message-received.js.map +7 -0
- package/dist/modules/customers/subscribers/link-channel-message-sent.js +12 -0
- package/dist/modules/customers/subscribers/link-channel-message-sent.js.map +7 -0
- package/dist/modules/integrations/data/entities.js +8 -1
- package/dist/modules/integrations/data/entities.js.map +2 -2
- package/dist/modules/integrations/lib/credentials-service.js +29 -14
- package/dist/modules/integrations/lib/credentials-service.js.map +2 -2
- package/dist/modules/integrations/migrations/Migration20260526154136_integrations.js +15 -0
- package/dist/modules/integrations/migrations/Migration20260526154136_integrations.js.map +7 -0
- package/dist/modules/messages/commands/messages.js +70 -8
- package/dist/modules/messages/commands/messages.js.map +2 -2
- package/dist/modules/messages/components/ComposeMessagePageClient.js +24 -13
- package/dist/modules/messages/components/ComposeMessagePageClient.js.map +2 -2
- package/dist/modules/messages/components/MessageDetailPageClient.js +39 -2
- package/dist/modules/messages/components/MessageDetailPageClient.js.map +2 -2
- package/dist/modules/messages/components/MessagesInboxPageClient.js +1 -0
- package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
- package/dist/modules/messages/data/entities.js +8 -1
- package/dist/modules/messages/data/entities.js.map +2 -2
- package/dist/modules/messages/migrations/Migration20260531130000.js +15 -0
- package/dist/modules/messages/migrations/Migration20260531130000.js.map +7 -0
- package/dist/modules/messages/widgets/injection-table.js +7 -0
- package/dist/modules/messages/widgets/injection-table.js.map +7 -0
- package/generated/entities/channel_ingest_dead_letter/index.ts +11 -0
- package/generated/entities/channel_thread_mapping/index.ts +11 -0
- package/generated/entities/channel_thread_token/index.ts +7 -0
- package/generated/entities/communication_channel/index.ts +20 -0
- package/generated/entities/customer_interaction/index.ts +2 -0
- package/generated/entities/external_conversation/index.ts +11 -0
- package/generated/entities/external_message/index.ts +11 -0
- package/generated/entities/integration_credentials/index.ts +1 -0
- package/generated/entities/message/index.ts +1 -0
- package/generated/entities/message_channel_link/index.ts +15 -0
- package/generated/entities/message_reaction/index.ts +11 -0
- package/generated/entities.ids.generated.ts +11 -0
- package/generated/entity-fields-registry.ts +117 -0
- package/package.json +9 -7
- package/src/helpers/integration/authFixtures.ts +4 -1
- package/src/helpers/integration/communicationChannelsFixtures.ts +124 -0
- package/src/modules/communication_channels/acl.ts +43 -0
- package/src/modules/communication_channels/api/delete/channels/[id]/route.ts +163 -0
- package/src/modules/communication_channels/api/delete/messages/[messageId]/reactions/[reactionId]/route.ts +143 -0
- package/src/modules/communication_channels/api/get/channels/[id]/health/route.ts +173 -0
- package/src/modules/communication_channels/api/get/channels/[id]/route.ts +111 -0
- package/src/modules/communication_channels/api/get/channels/route.ts +109 -0
- package/src/modules/communication_channels/api/get/me/channels/route.ts +100 -0
- package/src/modules/communication_channels/api/get/oauth/[provider]/callback/route.ts +355 -0
- package/src/modules/communication_channels/api/post/channels/[id]/import-history/route.ts +206 -0
- package/src/modules/communication_channels/api/post/channels/[id]/poll-now/route.ts +174 -0
- package/src/modules/communication_channels/api/post/channels/[id]/push/register/route.ts +158 -0
- package/src/modules/communication_channels/api/post/channels/[id]/set-primary/route.ts +114 -0
- package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +241 -0
- package/src/modules/communication_channels/api/post/channels/connect/credentials/route.ts +134 -0
- package/src/modules/communication_channels/api/post/messages/[messageId]/reactions/route.ts +143 -0
- package/src/modules/communication_channels/api/post/oauth/[provider]/initiate/route.ts +192 -0
- package/src/modules/communication_channels/api/post/send-as-user/route.ts +125 -0
- package/src/modules/communication_channels/api/post/test-seed/route.ts +267 -0
- package/src/modules/communication_channels/api/post/webhook/[provider]/route.ts +227 -0
- package/src/modules/communication_channels/api/post/webhooks/gmail/route.ts +161 -0
- package/src/modules/communication_channels/api/put/threads/[threadId]/assign/route.ts +132 -0
- package/src/modules/communication_channels/backend/communication_channels/channels/[id]/page.meta.ts +34 -0
- package/src/modules/communication_channels/backend/communication_channels/channels/[id]/page.tsx +250 -0
- package/src/modules/communication_channels/backend/communication_channels/channels/page.meta.ts +36 -0
- package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +137 -0
- package/src/modules/communication_channels/backend/profile/communication-channels/page.meta.ts +36 -0
- package/src/modules/communication_channels/backend/profile/communication-channels/page.tsx +907 -0
- package/src/modules/communication_channels/commands/connect-credential-channel.ts +243 -0
- package/src/modules/communication_channels/commands/delete-channel.ts +193 -0
- package/src/modules/communication_channels/commands/deliver-outbound-message.ts +579 -0
- package/src/modules/communication_channels/commands/disconnect-channel.ts +241 -0
- package/src/modules/communication_channels/commands/ingest-inbound-message.ts +602 -0
- package/src/modules/communication_channels/commands/interceptors.ts +104 -0
- package/src/modules/communication_channels/commands/process-inbound-reaction.ts +265 -0
- package/src/modules/communication_channels/commands/push-register.ts +203 -0
- package/src/modules/communication_channels/commands/push-renew.ts +49 -0
- package/src/modules/communication_channels/commands/push-unregister.ts +168 -0
- package/src/modules/communication_channels/commands/queue-import-history.ts +180 -0
- package/src/modules/communication_channels/commands/reassign-conversation.ts +273 -0
- package/src/modules/communication_channels/commands/set-primary-channel.ts +154 -0
- package/src/modules/communication_channels/commands/toggle-outbound-reaction.ts +347 -0
- package/src/modules/communication_channels/data/enrichers.ts +413 -0
- package/src/modules/communication_channels/data/entities.ts +546 -0
- package/src/modules/communication_channels/data/extensions.ts +76 -0
- package/src/modules/communication_channels/data/validators.ts +138 -0
- package/src/modules/communication_channels/di.ts +40 -0
- package/src/modules/communication_channels/encryption.ts +44 -0
- package/src/modules/communication_channels/events.ts +122 -0
- package/src/modules/communication_channels/i18n/de.json +138 -0
- package/src/modules/communication_channels/i18n/en.json +138 -0
- package/src/modules/communication_channels/i18n/es.json +138 -0
- package/src/modules/communication_channels/i18n/pl.json +138 -0
- package/src/modules/communication_channels/index.ts +19 -0
- package/src/modules/communication_channels/lib/access-control.ts +110 -0
- package/src/modules/communication_channels/lib/adapter-compat.ts +57 -0
- package/src/modules/communication_channels/lib/adapter-registry-singleton.ts +35 -0
- package/src/modules/communication_channels/lib/adapter.ts +605 -0
- package/src/modules/communication_channels/lib/connect-channel.ts +163 -0
- package/src/modules/communication_channels/lib/contact-resolver.ts +162 -0
- package/src/modules/communication_channels/lib/credential-refresh.ts +197 -0
- package/src/modules/communication_channels/lib/dead-letter.ts +87 -0
- package/src/modules/communication_channels/lib/email-capabilities.ts +60 -0
- package/src/modules/communication_channels/lib/email-contact.ts +17 -0
- package/src/modules/communication_channels/lib/email-mime.ts +442 -0
- package/src/modules/communication_channels/lib/error-classification.ts +144 -0
- package/src/modules/communication_channels/lib/gmail-pubsub-jwt.ts +278 -0
- package/src/modules/communication_channels/lib/mutation-guards.ts +215 -0
- package/src/modules/communication_channels/lib/oauth-client-config.ts +79 -0
- package/src/modules/communication_channels/lib/oauth-state.ts +228 -0
- package/src/modules/communication_channels/lib/oauth-token.ts +81 -0
- package/src/modules/communication_channels/lib/pg-errors.ts +12 -0
- package/src/modules/communication_channels/lib/provider-health.ts +47 -0
- package/src/modules/communication_channels/lib/push-state.ts +38 -0
- package/src/modules/communication_channels/lib/queue.ts +66 -0
- package/src/modules/communication_channels/lib/reaction-processor-types.ts +51 -0
- package/src/modules/communication_channels/lib/reaction-semantics.ts +48 -0
- package/src/modules/communication_channels/lib/registry.ts +99 -0
- package/src/modules/communication_channels/lib/route-mutation-guard.ts +68 -0
- package/src/modules/communication_channels/lib/sanitize-channel-html.ts +129 -0
- package/src/modules/communication_channels/lib/send-as-user.ts +284 -0
- package/src/modules/communication_channels/lib/system-user.ts +74 -0
- package/src/modules/communication_channels/lib/test-seed.ts +140 -0
- package/src/modules/communication_channels/lib/thread-matcher.ts +430 -0
- package/src/modules/communication_channels/lib/thread-token.ts +355 -0
- package/src/modules/communication_channels/lib/use-connect-channel.ts +73 -0
- package/src/modules/communication_channels/migrations/.snapshot-open-mercato.json +2142 -0
- package/src/modules/communication_channels/migrations/Migration20260526134719_communication_channels.ts +55 -0
- package/src/modules/communication_channels/migrations/Migration20260527195446_communication_channels.ts +20 -0
- package/src/modules/communication_channels/migrations/Migration20260529231848_communication_channels.ts +13 -0
- package/src/modules/communication_channels/migrations/Migration20260531120000_communication_channels.ts +24 -0
- package/src/modules/communication_channels/notifications.client.ts +50 -0
- package/src/modules/communication_channels/notifications.handlers.ts +86 -0
- package/src/modules/communication_channels/notifications.ts +52 -0
- package/src/modules/communication_channels/setup.ts +158 -0
- package/src/modules/communication_channels/subscribers/channel-requires-reauth-notification.ts +118 -0
- package/src/modules/communication_channels/subscribers/outbound-bridge.ts +175 -0
- package/src/modules/communication_channels/subscribers/user-deleted-cascade.ts +100 -0
- package/src/modules/communication_channels/widgets/components.ts +36 -0
- package/src/modules/communication_channels/widgets/injection/channel-badge/widget.client.tsx +38 -0
- package/src/modules/communication_channels/widgets/injection/channel-badge/widget.ts +51 -0
- package/src/modules/communication_channels/widgets/injection/channel-info-panel/widget.client.tsx +278 -0
- package/src/modules/communication_channels/widgets/injection/channel-info-panel/widget.ts +24 -0
- package/src/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.tsx +63 -0
- package/src/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.ts +29 -0
- package/src/modules/communication_channels/widgets/injection/profile-channels-menu/widget.ts +34 -0
- package/src/modules/communication_channels/widgets/injection/reaction-bar/widget.client.tsx +177 -0
- package/src/modules/communication_channels/widgets/injection/reaction-bar/widget.ts +26 -0
- package/src/modules/communication_channels/widgets/injection-table.ts +47 -0
- package/src/modules/communication_channels/widgets/notifications/ChannelRequiresReauthRenderer.tsx +48 -0
- package/src/modules/communication_channels/widgets/notifications/MessageReceivedRenderer.tsx +45 -0
- package/src/modules/communication_channels/widgets/notifications/index.ts +2 -0
- package/src/modules/communication_channels/workers/channel-import-history.ts +252 -0
- package/src/modules/communication_channels/workers/gmail-history-sync.ts +223 -0
- package/src/modules/communication_channels/workers/gmail-renew-watch.ts +141 -0
- package/src/modules/communication_channels/workers/inbound-processor.ts +114 -0
- package/src/modules/communication_channels/workers/outbound-delivery.ts +155 -0
- package/src/modules/communication_channels/workers/poll-channel.ts +391 -0
- package/src/modules/communication_channels/workers/poll-tick.ts +210 -0
- package/src/modules/communication_channels/workers/reaction-processor.ts +264 -0
- package/src/modules/customers/acl.ts +18 -0
- package/src/modules/customers/api/activities/route.ts +13 -0
- package/src/modules/customers/api/companies/[id]/route.ts +21 -1
- package/src/modules/customers/api/interactions/[id]/visibility/route.ts +179 -0
- package/src/modules/customers/api/interactions/counts/route.ts +10 -0
- package/src/modules/customers/api/interactions/route.ts +51 -5
- package/src/modules/customers/api/people/[id]/email-threads/route.ts +92 -0
- package/src/modules/customers/api/people/[id]/emails/route.ts +184 -0
- package/src/modules/customers/api/people/[id]/route.ts +17 -2
- package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +11 -1
- package/src/modules/customers/commands/deals.ts +65 -6
- package/src/modules/customers/commands/interactions.ts +30 -0
- package/src/modules/customers/components/detail/ActivityCard.tsx +48 -0
- package/src/modules/customers/components/detail/ComposeEmailDialog.tsx +329 -0
- package/src/modules/customers/components/detail/DealForm.tsx +2 -1
- package/src/modules/customers/components/detail/DealsSection.tsx +26 -0
- package/src/modules/customers/components/detail/EmailCardActions.tsx +258 -0
- package/src/modules/customers/components/detail/EmailReplyForwardActions.tsx +53 -0
- package/src/modules/customers/components/detail/PersonDetailTabs.tsx +8 -1
- package/src/modules/customers/components/detail/PersonEmailThreadsTab.tsx +448 -0
- package/src/modules/customers/data/enrichers.ts +252 -1
- package/src/modules/customers/data/entities.ts +46 -1
- package/src/modules/customers/data/extensions.ts +26 -0
- package/src/modules/customers/encryption.ts +11 -0
- package/src/modules/customers/events.ts +4 -0
- package/src/modules/customers/i18n/de.json +41 -0
- package/src/modules/customers/i18n/en.json +41 -0
- package/src/modules/customers/i18n/es.json +41 -0
- package/src/modules/customers/i18n/pl.json +41 -0
- package/src/modules/customers/lib/findPeopleByAddresses.ts +107 -0
- package/src/modules/customers/lib/kysely.ts +16 -0
- package/src/modules/customers/lib/link-channel-message-handler.ts +571 -0
- package/src/modules/customers/lib/personEmailThreads.ts +325 -0
- package/src/modules/customers/lib/visibilityFilter.ts +152 -0
- package/src/modules/customers/migrations/.snapshot-open-mercato.json +61 -0
- package/src/modules/customers/migrations/Migration20260527012240_customers.ts +23 -0
- package/src/modules/customers/setup.ts +1 -0
- package/src/modules/customers/subscribers/link-channel-message-received.ts +21 -0
- package/src/modules/customers/subscribers/link-channel-message-sent.ts +21 -0
- package/src/modules/integrations/AGENTS.md +9 -0
- package/src/modules/integrations/data/entities.ts +21 -1
- package/src/modules/integrations/lib/credentials-service.ts +49 -13
- package/src/modules/integrations/migrations/.snapshot-open-mercato.json +26 -1
- package/src/modules/integrations/migrations/Migration20260526154136_integrations.ts +15 -0
- package/src/modules/messages/commands/messages.ts +101 -8
- package/src/modules/messages/components/ComposeMessagePageClient.tsx +17 -0
- package/src/modules/messages/components/MessageDetailPageClient.tsx +43 -0
- package/src/modules/messages/components/MessagesInboxPageClient.tsx +4 -0
- package/src/modules/messages/data/entities.ts +11 -0
- package/src/modules/messages/migrations/.snapshot-open-mercato.json +18 -0
- package/src/modules/messages/migrations/Migration20260531130000.ts +15 -0
- package/src/modules/messages/widgets/injection-table.ts +29 -0
|
@@ -0,0 +1,605 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChannelAdapter — the contract every channel provider implements (Slack, WhatsApp, Email…).
|
|
3
|
+
*
|
|
4
|
+
* This is the FIRST implementation. There is no v1 in shipping code; provider packages
|
|
5
|
+
* implement this interface directly. See SPEC-045d §1.1 and the Pre-Implementation
|
|
6
|
+
* Analysis at .ai/specs/analysis/ANALYSIS-SPEC-045d-communication-notification-hubs.md.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface TenantScope {
|
|
10
|
+
organizationId: string
|
|
11
|
+
tenantId: string
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// ── Capabilities ──────────────────────────────────────────────
|
|
15
|
+
|
|
16
|
+
export interface ChannelCapabilities {
|
|
17
|
+
// Core
|
|
18
|
+
threading: boolean
|
|
19
|
+
richText: boolean
|
|
20
|
+
fileSharing: boolean
|
|
21
|
+
maxFileSize?: number
|
|
22
|
+
supportedMimeTypes?: string[]
|
|
23
|
+
readReceipts: boolean
|
|
24
|
+
deliveryReceipts: boolean
|
|
25
|
+
typingIndicators: boolean
|
|
26
|
+
|
|
27
|
+
// Extended
|
|
28
|
+
reactions: boolean
|
|
29
|
+
multiReactionPerUser: boolean
|
|
30
|
+
editMessage: boolean
|
|
31
|
+
deleteMessage: boolean
|
|
32
|
+
presence: boolean
|
|
33
|
+
richBlocks: boolean
|
|
34
|
+
interactiveComponents: boolean
|
|
35
|
+
inlineImages: boolean
|
|
36
|
+
conversationHistory: boolean
|
|
37
|
+
contactCards: boolean
|
|
38
|
+
locationSharing: boolean
|
|
39
|
+
voiceNotes: boolean
|
|
40
|
+
stickers: boolean
|
|
41
|
+
|
|
42
|
+
// Content format support
|
|
43
|
+
supportedBodyFormats: Array<'text' | 'markdown' | 'html'>
|
|
44
|
+
maxBodyLength?: number
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* If `false`, the provider does not support real-time push; the hub schedules polling.
|
|
48
|
+
* Optional; existing chat providers (Slack, WhatsApp) omit and are treated as `true`.
|
|
49
|
+
*/
|
|
50
|
+
realtimePush?: boolean
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ── Send / status / sender listing ────────────────────────────
|
|
54
|
+
|
|
55
|
+
export interface SendMessageInput {
|
|
56
|
+
conversationId?: string
|
|
57
|
+
content: MessageContent
|
|
58
|
+
credentials: Record<string, unknown>
|
|
59
|
+
scope: TenantScope
|
|
60
|
+
metadata?: Record<string, unknown>
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface MessageContent {
|
|
64
|
+
text?: string
|
|
65
|
+
html?: string
|
|
66
|
+
bodyFormat?: 'text' | 'markdown' | 'html'
|
|
67
|
+
attachments?: Array<{ url: string; mimeType: string; fileName: string; fileSize?: number; inline?: boolean }>
|
|
68
|
+
raw?: Record<string, unknown>
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface SendMessageResult {
|
|
72
|
+
externalMessageId: string
|
|
73
|
+
conversationId?: string
|
|
74
|
+
status: 'sent' | 'queued' | 'failed'
|
|
75
|
+
error?: string
|
|
76
|
+
metadata?: Record<string, unknown>
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface VerifyWebhookInput {
|
|
80
|
+
rawBody: string | Buffer
|
|
81
|
+
headers: Record<string, string | string[] | undefined>
|
|
82
|
+
credentials: Record<string, unknown>
|
|
83
|
+
scope: TenantScope
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export interface InboundMessage {
|
|
87
|
+
raw: Record<string, unknown>
|
|
88
|
+
eventType?: 'message' | 'reaction' | 'status_update' | 'other'
|
|
89
|
+
metadata?: Record<string, unknown>
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export interface GetMessageStatusInput {
|
|
93
|
+
externalMessageId: string
|
|
94
|
+
credentials: Record<string, unknown>
|
|
95
|
+
scope: TenantScope
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface MessageStatus {
|
|
99
|
+
status: 'pending' | 'sent' | 'delivered' | 'read' | 'failed'
|
|
100
|
+
deliveredAt?: Date
|
|
101
|
+
readAt?: Date
|
|
102
|
+
error?: string
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export interface ListSendersInput {
|
|
106
|
+
credentials: Record<string, unknown>
|
|
107
|
+
scope: TenantScope
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export interface SenderInfo {
|
|
111
|
+
id: string
|
|
112
|
+
displayName?: string
|
|
113
|
+
identifier?: string
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// ── Conversion (outbound) ─────────────────────────────────────
|
|
117
|
+
|
|
118
|
+
export interface ConvertOutboundInput {
|
|
119
|
+
body: string
|
|
120
|
+
bodyFormat: 'text' | 'markdown' | 'html'
|
|
121
|
+
attachments?: NormalizedAttachment[]
|
|
122
|
+
channelMetadata?: Record<string, unknown>
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export interface ChannelNativeContent {
|
|
126
|
+
content: MessageContent
|
|
127
|
+
metadata?: Record<string, unknown>
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ── Normalization (inbound) ───────────────────────────────────
|
|
131
|
+
|
|
132
|
+
export interface NormalizedInboundMessage {
|
|
133
|
+
externalMessageId: string
|
|
134
|
+
externalConversationId: string
|
|
135
|
+
senderIdentifier: string
|
|
136
|
+
senderDisplayName?: string
|
|
137
|
+
senderAvatarUrl?: string
|
|
138
|
+
subject?: string
|
|
139
|
+
body: string
|
|
140
|
+
bodyFormat: 'text' | 'markdown' | 'html'
|
|
141
|
+
attachments?: NormalizedAttachment[]
|
|
142
|
+
timestamp: Date
|
|
143
|
+
replyToExternalId?: string
|
|
144
|
+
channelPayload: Record<string, unknown>
|
|
145
|
+
channelContentType: string
|
|
146
|
+
channelMetadata: Record<string, unknown>
|
|
147
|
+
reactions?: InboundReaction[]
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export interface NormalizedAttachment {
|
|
151
|
+
url: string
|
|
152
|
+
mimeType: string
|
|
153
|
+
fileName: string
|
|
154
|
+
fileSize?: number
|
|
155
|
+
inline?: boolean
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export interface InboundReaction {
|
|
159
|
+
emoji: string
|
|
160
|
+
userIdentifier: string
|
|
161
|
+
userDisplayName?: string
|
|
162
|
+
timestamp?: Date
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// ── Inbound reaction normalization ───────────────────────────
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Normalized inbound reaction event — produced by `adapter.normalizeInboundReaction?(raw)`
|
|
169
|
+
* when a provider's webhook delivers a reaction add/remove event distinct from a message.
|
|
170
|
+
*
|
|
171
|
+
* Some providers bundle reactions inside `NormalizedInboundMessage.reactions`
|
|
172
|
+
* (history sync use case); others deliver them as standalone webhook events
|
|
173
|
+
* (`reaction_added` / `reaction_removed`). For the standalone path, the adapter
|
|
174
|
+
* is responsible for producing this normalized shape.
|
|
175
|
+
*/
|
|
176
|
+
export interface InboundReactionEvent {
|
|
177
|
+
/** External message id the reaction was applied to (FK lookup target). */
|
|
178
|
+
externalMessageId: string
|
|
179
|
+
/** Optional external conversation id — provider-specific context. */
|
|
180
|
+
externalConversationId?: string
|
|
181
|
+
/** Provider's reaction event identifier (for sync + de-dup). */
|
|
182
|
+
externalReactionId?: string
|
|
183
|
+
/** Emoji — Slack shortcode (`thumbsup`) or unicode (`👍`). */
|
|
184
|
+
emoji: string
|
|
185
|
+
/** External sender id (Slack user id, phone, email). */
|
|
186
|
+
userIdentifier: string
|
|
187
|
+
/** External sender display name. */
|
|
188
|
+
userDisplayName?: string
|
|
189
|
+
/** Whether the reaction was added or removed. */
|
|
190
|
+
action: 'added' | 'removed'
|
|
191
|
+
/** Provider timestamp; falls back to current time if missing. */
|
|
192
|
+
timestamp?: Date
|
|
193
|
+
/** Optional raw payload for diagnostics. */
|
|
194
|
+
raw?: Record<string, unknown>
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// ── Reactions ─────────────────────────────────────────────────
|
|
198
|
+
|
|
199
|
+
export interface SendReactionInput {
|
|
200
|
+
externalMessageId: string
|
|
201
|
+
conversationId: string
|
|
202
|
+
emoji: string
|
|
203
|
+
credentials: Record<string, unknown>
|
|
204
|
+
scope: TenantScope
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export interface RemoveReactionInput {
|
|
208
|
+
externalMessageId: string
|
|
209
|
+
conversationId: string
|
|
210
|
+
emoji: string
|
|
211
|
+
credentials: Record<string, unknown>
|
|
212
|
+
scope: TenantScope
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// ── Edit / delete ─────────────────────────────────────────────
|
|
216
|
+
|
|
217
|
+
export interface EditChannelMessageInput {
|
|
218
|
+
externalMessageId: string
|
|
219
|
+
conversationId: string
|
|
220
|
+
newContent: MessageContent
|
|
221
|
+
credentials: Record<string, unknown>
|
|
222
|
+
scope: TenantScope
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export interface DeleteChannelMessageInput {
|
|
226
|
+
externalMessageId: string
|
|
227
|
+
conversationId: string
|
|
228
|
+
credentials: Record<string, unknown>
|
|
229
|
+
scope: TenantScope
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// ── History ──────────────────────────────────────────────────
|
|
233
|
+
|
|
234
|
+
export interface FetchHistoryInput {
|
|
235
|
+
conversationId: string
|
|
236
|
+
credentials: Record<string, unknown>
|
|
237
|
+
cursor?: string
|
|
238
|
+
limit?: number
|
|
239
|
+
scope: TenantScope
|
|
240
|
+
/**
|
|
241
|
+
* Provider-specific resumption state opaque to the hub. Provider adapters
|
|
242
|
+
* encode their own incremental cursor (Gmail historyId, IMAP
|
|
243
|
+
* UIDVALIDITY+UIDNEXT) here. The polling worker persists `HistoryPage
|
|
244
|
+
* .nextCursor` between ticks and replays it on the following `fetchHistory`
|
|
245
|
+
* call as `channelState`. A missing or empty value means "first poll — start
|
|
246
|
+
* from the beginning / bootstrap the cursor".
|
|
247
|
+
*/
|
|
248
|
+
channelState?: Record<string, unknown>
|
|
249
|
+
/**
|
|
250
|
+
* Optional contact-filter hint. When provided, the adapter SHOULD prefer
|
|
251
|
+
* server-side filtering (e.g. IMAP `SEARCH OR FROM …`, Gmail `q=from:…`) to
|
|
252
|
+
* narrow the fetch to messages whose sender matches one of the listed
|
|
253
|
+
* addresses, instead of pulling the whole mailbox and discarding non-matches.
|
|
254
|
+
*
|
|
255
|
+
* The hub passes the union of all CRM contact addresses for the channel's
|
|
256
|
+
* tenant/org — typically tens, occasionally hundreds. Adapters that don't
|
|
257
|
+
* support server-side sender filtering can ignore the hint (back-compat).
|
|
258
|
+
*
|
|
259
|
+
* `sinceDays` further narrows by message date (server-side `SINCE` for IMAP,
|
|
260
|
+
* `after:` for Gmail). Default 30 days when omitted by caller, capped at 365.
|
|
261
|
+
*/
|
|
262
|
+
contactFilter?: {
|
|
263
|
+
addresses: string[]
|
|
264
|
+
sinceDays?: number
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export interface HistoryPage {
|
|
269
|
+
messages: NormalizedInboundMessage[]
|
|
270
|
+
nextCursor?: string
|
|
271
|
+
hasMore: boolean
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// ── Provider push delivery (Spec C) ──────────────────────────
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Result of `adapter.registerPush(...)`. The adapter returns provider-specific
|
|
278
|
+
* cursor / expiry data; the hub persists the relevant fields onto
|
|
279
|
+
* `CommunicationChannel.channelState` (JSONB, additive shape per provider).
|
|
280
|
+
*
|
|
281
|
+
* Gmail: `historyId` + `watchExpirationMs` + `pubsubTopic`.
|
|
282
|
+
*/
|
|
283
|
+
export interface PushRegistration {
|
|
284
|
+
providerKey: string
|
|
285
|
+
/** Whether registration succeeded enough to switch to push delivery. */
|
|
286
|
+
status: 'active' | 'failed'
|
|
287
|
+
/** Provider-specific state to merge into `channel.channelState`. */
|
|
288
|
+
channelStatePatch: Record<string, unknown>
|
|
289
|
+
/**
|
|
290
|
+
* When push registration succeeds and the channel can switch to longer poll
|
|
291
|
+
* cadence. The hub typically uses 1800 (30 min) as a belt-and-suspenders
|
|
292
|
+
* fallback. Undefined means "leave the existing cadence".
|
|
293
|
+
*/
|
|
294
|
+
recommendedPollIntervalSeconds?: number
|
|
295
|
+
/** Operator-visible diagnostic, populated when `status='failed'`. */
|
|
296
|
+
error?: { code: string; message: string }
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
export interface RegisterPushInput {
|
|
300
|
+
channelId: string
|
|
301
|
+
credentials: Record<string, unknown>
|
|
302
|
+
scope: TenantScope
|
|
303
|
+
/** Public URL the provider should POST notifications to. */
|
|
304
|
+
notificationUrl: string
|
|
305
|
+
/** Provider-specific tenant configuration (e.g. Gmail Pub/Sub topic). */
|
|
306
|
+
providerConfig?: Record<string, unknown>
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
export interface UnregisterPushInput {
|
|
310
|
+
channelId: string
|
|
311
|
+
credentials: Record<string, unknown>
|
|
312
|
+
scope: TenantScope
|
|
313
|
+
/** Persisted channel state at the time of unregister (provider needs IDs). */
|
|
314
|
+
channelState: Record<string, unknown>
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Verified inbound push notification (Gmail Pub/Sub envelope). The hub's
|
|
319
|
+
* webhook routes do JWT verification BEFORE invoking the adapter; the adapter
|
|
320
|
+
* receives the verified payload only.
|
|
321
|
+
*/
|
|
322
|
+
export interface ApplyPushNotificationInput {
|
|
323
|
+
credentials: Record<string, unknown>
|
|
324
|
+
scope: TenantScope
|
|
325
|
+
channelState: Record<string, unknown>
|
|
326
|
+
/** Provider-shaped notification payload. */
|
|
327
|
+
notification: Record<string, unknown>
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// ── Import history (operator-triggered backlog) ──────────────
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Operator-triggered historical import. Distinct from `fetchHistory`:
|
|
334
|
+
* - `fetchHistory` runs every poll and ingests *new* mail since the cursor
|
|
335
|
+
* (zero-history bootstrap by construction — Spec B § Phase B4).
|
|
336
|
+
* - `importHistory` is invoked by the explicit `/import-history` endpoint
|
|
337
|
+
* (Spec B § Phase B6) and reaches *backwards in time* into the mailbox
|
|
338
|
+
* to pull older messages the channel never observed at bootstrap.
|
|
339
|
+
*
|
|
340
|
+
* Adapters that cannot perform historical imports (e.g. write-only providers)
|
|
341
|
+
* omit this method; the hub returns a 400 "feature not supported" envelope.
|
|
342
|
+
*/
|
|
343
|
+
export interface ImportHistoryInput {
|
|
344
|
+
credentials: Record<string, unknown>
|
|
345
|
+
scope: TenantScope
|
|
346
|
+
/** Look back at most this many days. Clamped 1..365 by the hub. */
|
|
347
|
+
sinceDays: number
|
|
348
|
+
/**
|
|
349
|
+
* Optional sender-filter hint. Adapters SHOULD use it for server-side
|
|
350
|
+
* filtering (IMAP `SEARCH OR FROM …`, Gmail `q=from:…`). When omitted the
|
|
351
|
+
* import scans the entire `SINCE` window.
|
|
352
|
+
*/
|
|
353
|
+
contactEmails?: string[]
|
|
354
|
+
/** Total cap across all pages. Hub default 1000. Adapter MUST respect. */
|
|
355
|
+
maxMessages?: number
|
|
356
|
+
/** Opaque resumption cursor returned by the previous page. */
|
|
357
|
+
cursor?: string
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
export interface ImportHistoryPage {
|
|
361
|
+
messages: NormalizedInboundMessage[]
|
|
362
|
+
nextCursor?: string
|
|
363
|
+
hasMore: boolean
|
|
364
|
+
/**
|
|
365
|
+
* Optional total of candidate messages discovered server-side. When
|
|
366
|
+
* present, the hub uses it to populate the `ProgressJob.totalCount` on
|
|
367
|
+
* the first page so the operator sees an accurate progress bar.
|
|
368
|
+
*/
|
|
369
|
+
totalCandidates?: number
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// ── Contact resolution ───────────────────────────────────────
|
|
373
|
+
|
|
374
|
+
export interface ResolveContactInput {
|
|
375
|
+
senderIdentifier: string
|
|
376
|
+
senderDisplayName?: string
|
|
377
|
+
channelMetadata?: Record<string, unknown>
|
|
378
|
+
credentials: Record<string, unknown>
|
|
379
|
+
scope: TenantScope
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
export interface ContactHint {
|
|
383
|
+
email?: string
|
|
384
|
+
phone?: string
|
|
385
|
+
displayName?: string
|
|
386
|
+
avatarUrl?: string
|
|
387
|
+
externalProfileUrl?: string
|
|
388
|
+
matchedPersonId?: string
|
|
389
|
+
matchedCompanyId?: string
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// ── OAuth (per-user) ─────────────────────────────────────────
|
|
393
|
+
|
|
394
|
+
export interface BuildOAuthAuthorizeUrlInput {
|
|
395
|
+
/** Opaque state nonce minted by the hub; the adapter MUST embed it as `state=…`. */
|
|
396
|
+
state: string
|
|
397
|
+
/** Per-user CSRF nonce — provider-specific use (e.g. Google's `nonce`). */
|
|
398
|
+
nonce: string
|
|
399
|
+
/** Where the provider should send the user after consent. */
|
|
400
|
+
redirectUri: string
|
|
401
|
+
/** Per-tenant OAuth client configuration (client_id / client_secret / scopes). */
|
|
402
|
+
credentials: Record<string, unknown>
|
|
403
|
+
scope: TenantScope
|
|
404
|
+
/** Optional login hint (e.g. user's email address) — providers that honour it. */
|
|
405
|
+
loginHint?: string
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
export interface BuildOAuthAuthorizeUrlResult {
|
|
409
|
+
/** Full authorize URL the user should be redirected to. */
|
|
410
|
+
authorizeUrl: string
|
|
411
|
+
/** Provider-specific extras to embed in the hub's state cookie (PKCE verifier, scopes, …). */
|
|
412
|
+
extra?: Record<string, unknown>
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
export interface ExchangeOAuthCodeInput {
|
|
416
|
+
/** Authorization code returned by the provider on the callback. */
|
|
417
|
+
code: string
|
|
418
|
+
/** Where the provider was told to redirect — must match the initiate call. */
|
|
419
|
+
redirectUri: string
|
|
420
|
+
/** Per-tenant OAuth client configuration. */
|
|
421
|
+
credentials: Record<string, unknown>
|
|
422
|
+
scope: TenantScope
|
|
423
|
+
/** Extras the hub stored in the state cookie at `initiate` time (PKCE verifier, …). */
|
|
424
|
+
stateExtra?: Record<string, unknown>
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
export interface ExchangeOAuthCodeResult {
|
|
428
|
+
/** Credentials blob to persist (encrypted by the hub) — access_token, refresh_token, expiresAt. */
|
|
429
|
+
credentials: Record<string, unknown>
|
|
430
|
+
/** External identifier (e.g. user's email) → `CommunicationChannel.externalIdentifier`. */
|
|
431
|
+
externalIdentifier?: string
|
|
432
|
+
/** Suggested display name for the new channel. */
|
|
433
|
+
displayName?: string
|
|
434
|
+
/** Optional access-token expiry timestamp. */
|
|
435
|
+
expiresAt?: Date
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// ── Credential refresh + validation ──────────────────────────
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Tenant-level OAuth client configuration resolved by the hub from
|
|
442
|
+
* `integration_credentials.scope = channel_<providerKey>`.
|
|
443
|
+
*
|
|
444
|
+
* OAuth providers (Gmail) MUST read clientId / clientSecret from this field on
|
|
445
|
+
* `RefreshCredentialsInput`. Adapters without OAuth refresh (IMAP, WhatsApp
|
|
446
|
+
* Business API) ignore it.
|
|
447
|
+
*
|
|
448
|
+
* See `.ai/specs/2026-05-27-email-integration-inbound-reliability-and-threading.md`.
|
|
449
|
+
*/
|
|
450
|
+
export interface OAuthClientConfig {
|
|
451
|
+
clientId: string
|
|
452
|
+
clientSecret?: string
|
|
453
|
+
/** Optional pre-resolved scopes list (some flows compute it once on initiate). */
|
|
454
|
+
scopes?: string[]
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
export interface RefreshCredentialsInput {
|
|
458
|
+
channelId: string
|
|
459
|
+
credentials: Record<string, unknown>
|
|
460
|
+
scope: TenantScope
|
|
461
|
+
/**
|
|
462
|
+
* Tenant-level OAuth client configuration. Resolved by the hub's
|
|
463
|
+
* `refreshCredentialsIfNeeded` helper before delegating to the adapter.
|
|
464
|
+
*
|
|
465
|
+
* - For OAuth providers (Gmail): MUST be present; the adapter uses
|
|
466
|
+
* `clientId` + `clientSecret` to call the provider's token endpoint.
|
|
467
|
+
* - For static-credential providers (IMAP, WhatsApp): ignored.
|
|
468
|
+
* - When `undefined`: legacy `credentials._client` path is read by the
|
|
469
|
+
* adapter (deprecated; will be removed in the next minor release).
|
|
470
|
+
*/
|
|
471
|
+
oauthClient?: OAuthClientConfig
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
export interface RefreshedCredentials {
|
|
475
|
+
credentials: Record<string, unknown>
|
|
476
|
+
expiresAt?: Date
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
export interface ValidateCredentialsInput {
|
|
480
|
+
providerKey: string
|
|
481
|
+
credentials: Record<string, unknown>
|
|
482
|
+
scope: TenantScope
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
export interface ValidateCredentialsResult {
|
|
486
|
+
ok: boolean
|
|
487
|
+
/** Field-level error messages keyed by credential field name; for `createCrudFormError`. */
|
|
488
|
+
errors?: Record<string, string>
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
// ── The adapter contract ─────────────────────────────────────
|
|
492
|
+
|
|
493
|
+
export interface ChannelAdapter {
|
|
494
|
+
readonly providerKey: string
|
|
495
|
+
readonly channelType: 'whatsapp' | 'slack' | 'email' | 'sms' | string
|
|
496
|
+
|
|
497
|
+
/** Declare supported features */
|
|
498
|
+
readonly capabilities: ChannelCapabilities
|
|
499
|
+
|
|
500
|
+
// Required core methods
|
|
501
|
+
sendMessage(input: SendMessageInput): Promise<SendMessageResult>
|
|
502
|
+
/**
|
|
503
|
+
* Verify an inbound webhook against the supplied channel credentials and
|
|
504
|
+
* normalize it to an {@link InboundMessage}.
|
|
505
|
+
*
|
|
506
|
+
* SECURITY CONTRACT (fail-closed): implementations MUST throw when the request
|
|
507
|
+
* cannot be cryptographically verified for `input.credentials`. The generic
|
|
508
|
+
* `api/post/webhook/[provider]` route treats a non-throwing return as
|
|
509
|
+
* "verified" and pins the request to that candidate channel's tenant, so a
|
|
510
|
+
* best-effort / no-op implementation that returns normally on an unverified
|
|
511
|
+
* request is a tenant-spoofing fail-open. Adapters with no real webhook (IMAP
|
|
512
|
+
* polling, or a provider handled by a dedicated signed route) MUST return
|
|
513
|
+
* `eventType: 'other'` so the route acknowledges (202) without enqueuing any
|
|
514
|
+
* tenant-scoped work.
|
|
515
|
+
*/
|
|
516
|
+
verifyWebhook(input: VerifyWebhookInput): Promise<InboundMessage>
|
|
517
|
+
getStatus(input: GetMessageStatusInput): Promise<MessageStatus>
|
|
518
|
+
convertOutbound(input: ConvertOutboundInput): Promise<ChannelNativeContent>
|
|
519
|
+
normalizeInbound(raw: InboundMessage): Promise<NormalizedInboundMessage>
|
|
520
|
+
|
|
521
|
+
// Optional extensions
|
|
522
|
+
listSenders?(input: ListSendersInput): Promise<SenderInfo[]>
|
|
523
|
+
|
|
524
|
+
/**
|
|
525
|
+
* Normalize a raw inbound reaction webhook event into the canonical `InboundReactionEvent`.
|
|
526
|
+
* Required for providers that deliver standalone reaction events. Providers that only
|
|
527
|
+
* bundle reactions inside `NormalizedInboundMessage.reactions` can omit this method —
|
|
528
|
+
* standalone reaction webhooks for those providers are reported as 202 "not handled".
|
|
529
|
+
*/
|
|
530
|
+
normalizeInboundReaction?(raw: InboundMessage): Promise<InboundReactionEvent>
|
|
531
|
+
|
|
532
|
+
sendReaction?(input: SendReactionInput): Promise<void>
|
|
533
|
+
removeReaction?(input: RemoveReactionInput): Promise<void>
|
|
534
|
+
editMessage?(input: EditChannelMessageInput): Promise<void>
|
|
535
|
+
deleteMessage?(input: DeleteChannelMessageInput): Promise<void>
|
|
536
|
+
fetchHistory?(input: FetchHistoryInput): Promise<HistoryPage>
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* Operator-triggered historical import (Spec B § Phase B6). Returns a page
|
|
540
|
+
* of older messages older than (or alongside) the channel's normal incremental
|
|
541
|
+
* cursor. Pagination via `cursor` until `hasMore: false`. Adapters without
|
|
542
|
+
* historical import omit this method.
|
|
543
|
+
*/
|
|
544
|
+
importHistory?(input: ImportHistoryInput): Promise<ImportHistoryPage>
|
|
545
|
+
|
|
546
|
+
/**
|
|
547
|
+
* Spec C — Register provider push delivery for this channel.
|
|
548
|
+
*
|
|
549
|
+
* Gmail: calls `users.watch` against the configured Pub/Sub topic.
|
|
550
|
+
*
|
|
551
|
+
* Adapters that don't support push (IMAP, chat) omit this method; the hub
|
|
552
|
+
* keeps the channel in polling mode (Spec B baseline).
|
|
553
|
+
*/
|
|
554
|
+
registerPush?(input: RegisterPushInput): Promise<PushRegistration>
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* Spec C — Tear down a previously-registered push registration. Called on
|
|
558
|
+
* channel disconnect, on re-auth, and during deactivation. Idempotent —
|
|
559
|
+
* absence of provider-side registration is not an error.
|
|
560
|
+
*/
|
|
561
|
+
unregisterPush?(input: UnregisterPushInput): Promise<void>
|
|
562
|
+
|
|
563
|
+
/**
|
|
564
|
+
* Spec C — Convert a verified inbound push notification into the same
|
|
565
|
+
* `HistoryPage` shape `fetchHistory` returns. Gmail: calls `history.list`.
|
|
566
|
+
* The hub's push workers feed each returned message through the existing
|
|
567
|
+
* `ingest-inbound-message` command, so threading and dedup behave identically
|
|
568
|
+
* to the polling path.
|
|
569
|
+
*/
|
|
570
|
+
applyPushNotification?(input: ApplyPushNotificationInput): Promise<HistoryPage>
|
|
571
|
+
resolveContact?(input: ResolveContactInput): Promise<ContactHint | null>
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* Build the authorize URL the user should be redirected to in the OAuth
|
|
575
|
+
* "initiate" flow. The adapter MUST embed the hub-supplied `state` value in
|
|
576
|
+
* the URL's `state` query parameter. Adapters that don't support OAuth
|
|
577
|
+
* (IMAP, WhatsApp Business API) omit this method.
|
|
578
|
+
*/
|
|
579
|
+
buildOAuthAuthorizeUrl?(
|
|
580
|
+
input: BuildOAuthAuthorizeUrlInput,
|
|
581
|
+
): Promise<BuildOAuthAuthorizeUrlResult>
|
|
582
|
+
|
|
583
|
+
/**
|
|
584
|
+
* Exchange the OAuth authorization code returned on the callback for an
|
|
585
|
+
* access token (and refresh token, when the provider supports it). Returns
|
|
586
|
+
* the credential blob the hub should persist, plus the external identifier
|
|
587
|
+
* (typically the user's email address) used to populate the new channel.
|
|
588
|
+
*/
|
|
589
|
+
exchangeOAuthCode?(input: ExchangeOAuthCodeInput): Promise<ExchangeOAuthCodeResult>
|
|
590
|
+
|
|
591
|
+
/**
|
|
592
|
+
* Refresh OAuth credentials when an access token is near expiry or after a 401.
|
|
593
|
+
* Required for OAuth providers (Gmail); omitted for static-credential
|
|
594
|
+
* providers (IMAP, WhatsApp Business API).
|
|
595
|
+
*/
|
|
596
|
+
refreshCredentials?(input: RefreshCredentialsInput): Promise<RefreshedCredentials>
|
|
597
|
+
|
|
598
|
+
/**
|
|
599
|
+
* Validate provided credentials at setup time before persisting. Returns
|
|
600
|
+
* `{ ok: true }` on success, or `{ ok: false, errors }` for field-level errors.
|
|
601
|
+
* Implemented by credential-based providers (IMAP/SMTP). OAuth providers
|
|
602
|
+
* omit this — the OAuth callback proves credential validity.
|
|
603
|
+
*/
|
|
604
|
+
validateCredentials?(input: ValidateCredentialsInput): Promise<ValidateCredentialsResult>
|
|
605
|
+
}
|