@open-mercato/core 0.6.5-develop.4384.1.ce2ec6eaaa → 0.6.5-develop.4393.1.de282b5dfd
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 +259 -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 +425 -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,138 @@
|
|
|
1
|
+
{
|
|
2
|
+
"communication_channels.channel.providers.gmail": "Gmail",
|
|
3
|
+
"communication_channels.channel.providers.imap": "IMAP",
|
|
4
|
+
"communication_channels.channel.providers.slack": "Slack",
|
|
5
|
+
"communication_channels.channel.providers.whatsapp": "WhatsApp",
|
|
6
|
+
"communication_channels.channelPayload.aria": "Contenido del canal",
|
|
7
|
+
"communication_channels.channelPayload.email.aria": "Contenido del correo",
|
|
8
|
+
"communication_channels.channelPayload.types.email/mime": "Correo (MIME)",
|
|
9
|
+
"communication_channels.columns.displayName": "Canal",
|
|
10
|
+
"communication_channels.columns.identifier": "ID externo",
|
|
11
|
+
"communication_channels.columns.provider": "Proveedor",
|
|
12
|
+
"communication_channels.columns.status": "Estado",
|
|
13
|
+
"communication_channels.columns.type": "Tipo",
|
|
14
|
+
"communication_channels.detail.capabilities": "Capacidades",
|
|
15
|
+
"communication_channels.detail.health": "Estado de entrega (últimas 24 h)",
|
|
16
|
+
"communication_channels.detail.loading": "Cargando canal...",
|
|
17
|
+
"communication_channels.detail.messages": "mensajes",
|
|
18
|
+
"communication_channels.detail.noCapabilities": "Aún no se ha registrado ninguna instantánea de capacidades para este canal.",
|
|
19
|
+
"communication_channels.detail.noHealth": "No hay datos de estado disponibles.",
|
|
20
|
+
"communication_channels.detail.notFound": "Canal no encontrado",
|
|
21
|
+
"communication_channels.detail.recentFailures": "Fallos recientes",
|
|
22
|
+
"communication_channels.detail.title": "Detalle del canal",
|
|
23
|
+
"communication_channels.emptyState": "Aún no hay canales compartidos. Esta página muestra los canales compartidos de toda la organización. Tu buzón de correo personal es privado: conéctalo y gestiónalo en Perfil → Canales de comunicación.",
|
|
24
|
+
"communication_channels.errors.loadDetail": "No se pudo cargar el canal",
|
|
25
|
+
"communication_channels.errors.loadList": "No se pudieron cargar los canales",
|
|
26
|
+
"communication_channels.errors.reactionFailed": "La reacción falló",
|
|
27
|
+
"communication_channels.errors.undoBlockedPrimaryConflict": "Otro canal es ahora el principal para este usuario. Configúralo como no principal antes de restaurar el canal desconectado como principal.",
|
|
28
|
+
"communication_channels.infoPanel.aria": "Información del canal",
|
|
29
|
+
"communication_channels.infoPanel.assignedTo": "Asignado a",
|
|
30
|
+
"communication_channels.infoPanel.contactPerson": "Contacto CRM",
|
|
31
|
+
"communication_channels.infoPanel.direction": "Dirección",
|
|
32
|
+
"communication_channels.infoPanel.noThread": "Este mensaje no pertenece a ningún hilo; la reasignación no está disponible.",
|
|
33
|
+
"communication_channels.infoPanel.provider": "Proveedor",
|
|
34
|
+
"communication_channels.infoPanel.reassignError": "La reasignación falló",
|
|
35
|
+
"communication_channels.infoPanel.reassignSuccess": "Conversación reasignada.",
|
|
36
|
+
"communication_channels.infoPanel.status": "Estado",
|
|
37
|
+
"communication_channels.infoPanel.subject": "Asunto",
|
|
38
|
+
"communication_channels.infoPanel.title": "Información del canal",
|
|
39
|
+
"communication_channels.infoPanel.type": "Tipo",
|
|
40
|
+
"communication_channels.infoPanel.unassigned": "Sin asignar",
|
|
41
|
+
"communication_channels.nav.group": "Integraciones",
|
|
42
|
+
"communication_channels.nav.title": "Canales de comunicación",
|
|
43
|
+
"communication_channels.notifications.channel_requires_reauth.body": "La autenticación caducó. Vuelve a conectar este canal para reanudar el envío y la recepción de mensajes.",
|
|
44
|
+
"communication_channels.notifications.channel_requires_reauth.reconnect": "Volver a conectar",
|
|
45
|
+
"communication_channels.notifications.channel_requires_reauth.title": "El canal necesita volver a conectarse",
|
|
46
|
+
"communication_channels.notifications.channel_requires_reauth.unknownChannel": "Un canal",
|
|
47
|
+
"communication_channels.notifications.message_received.body": "Has recibido un nuevo mensaje a través de {{providerKey}}.",
|
|
48
|
+
"communication_channels.notifications.message_received.title": "Nuevo mensaje externo",
|
|
49
|
+
"communication_channels.notifications.message_received.unknownSender": "Remitente desconocido",
|
|
50
|
+
"communication_channels.profile.actions.disconnect": "Desconectar",
|
|
51
|
+
"communication_channels.profile.actions.disconnectFailed": "No se pudo desconectar el canal",
|
|
52
|
+
"communication_channels.profile.actions.disconnectSuccess": "Canal desconectado. Puedes volver a conectarlo cuando quieras.",
|
|
53
|
+
"communication_channels.profile.actions.importHistory": "Importar historial",
|
|
54
|
+
"communication_channels.profile.actions.pollNow": "Sondear ahora",
|
|
55
|
+
"communication_channels.profile.actions.pollNowFailed": "No se pudo iniciar el sondeo",
|
|
56
|
+
"communication_channels.profile.actions.pollNowSuccess": "Sondeo iniciado — los nuevos mensajes aparecerán en las líneas de tiempo de las personas vinculadas en unos segundos.",
|
|
57
|
+
"communication_channels.profile.actions.retryPoll": "Reintentar",
|
|
58
|
+
"communication_channels.profile.actions.setPrimary": "Establecer como principal",
|
|
59
|
+
"communication_channels.profile.actions.setPrimaryFailed": "No se pudo establecer como principal",
|
|
60
|
+
"communication_channels.profile.actions.setPrimarySuccess": "Marcado como principal.",
|
|
61
|
+
"communication_channels.profile.alerts.requiresReauth": "{count} canal(es) necesitan volver a conectarse. Haz clic en \"Volver a conectar\" en el canal afectado a continuación.",
|
|
62
|
+
"communication_channels.profile.columns.disconnect": "Conexión",
|
|
63
|
+
"communication_channels.profile.columns.importHistory": "Historial",
|
|
64
|
+
"communication_channels.profile.columns.lastPolled": "Última sincronización",
|
|
65
|
+
"communication_channels.profile.columns.pollNow": "Sincronizar",
|
|
66
|
+
"communication_channels.profile.columns.primary": "Principal",
|
|
67
|
+
"communication_channels.profile.connect.blocked": "Conexión bloqueada por la validación",
|
|
68
|
+
"communication_channels.profile.connect.cancel": "Cancelar",
|
|
69
|
+
"communication_channels.profile.connect.connected": "Canal conectado.",
|
|
70
|
+
"communication_channels.profile.connect.connecting": "Conectando...",
|
|
71
|
+
"communication_channels.profile.connect.credentialsFailed": "No se pudo conectar el buzón.",
|
|
72
|
+
"communication_channels.profile.connect.fields.displayName": "Nombre visible",
|
|
73
|
+
"communication_channels.profile.connect.fields.fromAddress": "Dirección de remitente",
|
|
74
|
+
"communication_channels.profile.connect.fields.imapHost": "Host IMAP",
|
|
75
|
+
"communication_channels.profile.connect.fields.imapPassword": "Contraseña IMAP",
|
|
76
|
+
"communication_channels.profile.connect.fields.imapPort": "Puerto IMAP",
|
|
77
|
+
"communication_channels.profile.connect.fields.imapTls": "Seguridad IMAP",
|
|
78
|
+
"communication_channels.profile.connect.fields.imapUser": "Usuario IMAP",
|
|
79
|
+
"communication_channels.profile.connect.fields.smtpHost": "Host SMTP",
|
|
80
|
+
"communication_channels.profile.connect.fields.smtpPassword": "Contraseña SMTP",
|
|
81
|
+
"communication_channels.profile.connect.fields.smtpPort": "Puerto SMTP",
|
|
82
|
+
"communication_channels.profile.connect.fields.smtpTls": "Seguridad SMTP",
|
|
83
|
+
"communication_channels.profile.connect.fields.smtpUser": "Usuario SMTP",
|
|
84
|
+
"communication_channels.profile.connect.gmail": "Conectar Gmail",
|
|
85
|
+
"communication_channels.profile.connect.imap": "Conectar IMAP",
|
|
86
|
+
"communication_channels.profile.connect.imapTitle": "Conectar buzón IMAP",
|
|
87
|
+
"communication_channels.profile.connect.mailboxAlreadyConnected": "Este buzón ya está conectado a través de otro proveedor. Desconéctalo primero para volver a conectarlo con uno diferente.",
|
|
88
|
+
"communication_channels.profile.connect.notConfigured": "Este proveedor aún no está configurado. Pide a un administrador que añada el ID de cliente y el secreto de OAuth en Integraciones antes de conectar un buzón.",
|
|
89
|
+
"communication_channels.profile.connect.oauthFailed": "No se pudo iniciar la conexión OAuth.",
|
|
90
|
+
"communication_channels.profile.connect.save": "Conectar",
|
|
91
|
+
"communication_channels.profile.connect.tls.none": "Ninguna",
|
|
92
|
+
"communication_channels.profile.connect.tls.starttls": "STARTTLS",
|
|
93
|
+
"communication_channels.profile.connect.tls.tls": "TLS",
|
|
94
|
+
"communication_channels.profile.disconnect.cancel": "Cancelar",
|
|
95
|
+
"communication_channels.profile.disconnect.confirm": "Desconectar",
|
|
96
|
+
"communication_channels.profile.disconnect.description": "Esto elimina la conexión y detiene la sincronización. Los correos ya importados permanecen en tus cronologías. Puedes volver a conectarlo cuando quieras.",
|
|
97
|
+
"communication_channels.profile.disconnect.submitting": "Desconectando…",
|
|
98
|
+
"communication_channels.profile.disconnect.title": "Desconectar canal",
|
|
99
|
+
"communication_channels.profile.empty": "Aún no tienes canales conectados. Usa la opción \"Conectar canal\" de arriba para añadir Gmail o IMAP.",
|
|
100
|
+
"communication_channels.profile.flash.connected": "Canal conectado.",
|
|
101
|
+
"communication_channels.profile.flash.connectedWithProvider": "Canal conectado ({provider}).",
|
|
102
|
+
"communication_channels.profile.flash.error": "No se pudo conectar el canal.",
|
|
103
|
+
"communication_channels.profile.flash.errorWithCode": "No se pudo conectar el canal — {code}.",
|
|
104
|
+
"communication_channels.profile.group": "Perfil",
|
|
105
|
+
"communication_channels.profile.importHistory.cancel": "Cancelar",
|
|
106
|
+
"communication_channels.profile.importHistory.description": "Recupera mensajes anteriores que este canal no vio al conectarse. Los filtros restringen la búsqueda en el servidor.",
|
|
107
|
+
"communication_channels.profile.importHistory.errors.contactEmails": "Una o más entradas no es una dirección de correo válida.",
|
|
108
|
+
"communication_channels.profile.importHistory.errors.maxMessages": "Elige un número entre 1 y 5000 mensajes.",
|
|
109
|
+
"communication_channels.profile.importHistory.errors.sinceDays": "Elige un número entre 1 y 365 días.",
|
|
110
|
+
"communication_channels.profile.importHistory.fields.contactEmails": "Filtrar por remitente (opcional)",
|
|
111
|
+
"communication_channels.profile.importHistory.fields.contactEmailsHint": "Déjalo vacío para analizar todos los remitentes en el rango.",
|
|
112
|
+
"communication_channels.profile.importHistory.fields.contactEmailsPlaceholder": "alice@example.com, bob@example.com",
|
|
113
|
+
"communication_channels.profile.importHistory.fields.maxMessages": "Mensajes máximos",
|
|
114
|
+
"communication_channels.profile.importHistory.fields.sinceDays": "Mirar atrás (días)",
|
|
115
|
+
"communication_channels.profile.importHistory.flash.error": "No se pudo encolar la importación de historial.",
|
|
116
|
+
"communication_channels.profile.importHistory.flash.success": "Importación de historial encolada — sigue el progreso en la barra superior.",
|
|
117
|
+
"communication_channels.profile.importHistory.submit": "Iniciar importación",
|
|
118
|
+
"communication_channels.profile.importHistory.submitting": "Encolando…",
|
|
119
|
+
"communication_channels.profile.importHistory.title": "Importar historial del canal",
|
|
120
|
+
"communication_channels.profile.primary": "Principal",
|
|
121
|
+
"communication_channels.profile.subtitle": "Conecta tu buzón personal para que los mensajes salientes provengan de tu dirección y los correos entrantes lleguen a tu bandeja de entrada unificada.",
|
|
122
|
+
"communication_channels.profile.tableTitle": "Tus canales",
|
|
123
|
+
"communication_channels.profile.title": "Mis canales de comunicación",
|
|
124
|
+
"communication_channels.push.button.reregister": "Re-registrar push",
|
|
125
|
+
"communication_channels.push.flash.registerFailed": "No se pudo registrar push",
|
|
126
|
+
"communication_channels.push.status.active": "Push activo",
|
|
127
|
+
"communication_channels.push.status.failed": "Push fallido — usando sondeo",
|
|
128
|
+
"communication_channels.push.status.inactive": "Solo sondeo",
|
|
129
|
+
"communication_channels.reaction.bar.aria": "Reacciones",
|
|
130
|
+
"communication_channels.reaction.cannotRemoveExternal": "Las reacciones de participantes externos solo se pueden eliminar en la aplicación del proveedor.",
|
|
131
|
+
"communication_channels.reaction.toggleAria": "Alternar reacción {emoji}",
|
|
132
|
+
"communication_channels.status.active": "Activo",
|
|
133
|
+
"communication_channels.status.connected": "Conectado",
|
|
134
|
+
"communication_channels.status.disconnected": "Desconectado",
|
|
135
|
+
"communication_channels.status.error": "Error",
|
|
136
|
+
"communication_channels.status.inactive": "Inactivo",
|
|
137
|
+
"communication_channels.status.requiresReauth": "Necesita volver a conectarse"
|
|
138
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
{
|
|
2
|
+
"communication_channels.channel.providers.gmail": "Gmail",
|
|
3
|
+
"communication_channels.channel.providers.imap": "IMAP",
|
|
4
|
+
"communication_channels.channel.providers.slack": "Slack",
|
|
5
|
+
"communication_channels.channel.providers.whatsapp": "WhatsApp",
|
|
6
|
+
"communication_channels.channelPayload.aria": "Treść kanału",
|
|
7
|
+
"communication_channels.channelPayload.email.aria": "Treść e-maila",
|
|
8
|
+
"communication_channels.channelPayload.types.email/mime": "E-mail (MIME)",
|
|
9
|
+
"communication_channels.columns.displayName": "Kanał",
|
|
10
|
+
"communication_channels.columns.identifier": "Identyfikator zewn.",
|
|
11
|
+
"communication_channels.columns.provider": "Dostawca",
|
|
12
|
+
"communication_channels.columns.status": "Status",
|
|
13
|
+
"communication_channels.columns.type": "Typ",
|
|
14
|
+
"communication_channels.detail.capabilities": "Możliwości",
|
|
15
|
+
"communication_channels.detail.health": "Stan dostarczania (ostatnie 24h)",
|
|
16
|
+
"communication_channels.detail.loading": "Ładowanie kanału...",
|
|
17
|
+
"communication_channels.detail.messages": "wiadomości",
|
|
18
|
+
"communication_channels.detail.noCapabilities": "Brak migawki możliwości dla tego kanału.",
|
|
19
|
+
"communication_channels.detail.noHealth": "Brak danych o stanie.",
|
|
20
|
+
"communication_channels.detail.notFound": "Nie znaleziono kanału",
|
|
21
|
+
"communication_channels.detail.recentFailures": "Ostatnie błędy",
|
|
22
|
+
"communication_channels.detail.title": "Szczegóły kanału",
|
|
23
|
+
"communication_channels.emptyState": "Brak kanałów współdzielonych. Ta strona pokazuje współdzielone kanały obejmujące całą organizację. Twoja osobista skrzynka e-mail jest prywatna — połącz ją i zarządzaj nią w Profil → Kanały komunikacji.",
|
|
24
|
+
"communication_channels.errors.loadDetail": "Nie udało się załadować kanału",
|
|
25
|
+
"communication_channels.errors.loadList": "Nie udało się załadować kanałów",
|
|
26
|
+
"communication_channels.errors.reactionFailed": "Reakcja nie powiodła się",
|
|
27
|
+
"communication_channels.errors.undoBlockedPrimaryConflict": "Inny kanał jest teraz głównym dla tego użytkownika. Ustaw go jako niegłówny, zanim przywrócisz rozłączony kanał jako główny.",
|
|
28
|
+
"communication_channels.infoPanel.aria": "Informacje o kanale",
|
|
29
|
+
"communication_channels.infoPanel.assignedTo": "Przypisane do",
|
|
30
|
+
"communication_channels.infoPanel.contactPerson": "Kontakt CRM",
|
|
31
|
+
"communication_channels.infoPanel.direction": "Kierunek",
|
|
32
|
+
"communication_channels.infoPanel.noThread": "Ta wiadomość nie ma wątku; przypisanie niedostępne.",
|
|
33
|
+
"communication_channels.infoPanel.provider": "Dostawca",
|
|
34
|
+
"communication_channels.infoPanel.reassignError": "Nie udało się zmienić przypisania",
|
|
35
|
+
"communication_channels.infoPanel.reassignSuccess": "Rozmowa przypisana ponownie.",
|
|
36
|
+
"communication_channels.infoPanel.status": "Status",
|
|
37
|
+
"communication_channels.infoPanel.subject": "Temat",
|
|
38
|
+
"communication_channels.infoPanel.title": "Informacje o kanale",
|
|
39
|
+
"communication_channels.infoPanel.type": "Typ",
|
|
40
|
+
"communication_channels.infoPanel.unassigned": "Nieprzypisane",
|
|
41
|
+
"communication_channels.nav.group": "Integracje",
|
|
42
|
+
"communication_channels.nav.title": "Kanały komunikacji",
|
|
43
|
+
"communication_channels.notifications.channel_requires_reauth.body": "Uwierzytelnianie wygasło. Połącz ponownie ten kanał, aby wznowić wysyłanie i odbieranie wiadomości.",
|
|
44
|
+
"communication_channels.notifications.channel_requires_reauth.reconnect": "Połącz ponownie",
|
|
45
|
+
"communication_channels.notifications.channel_requires_reauth.title": "Kanał wymaga ponownego połączenia",
|
|
46
|
+
"communication_channels.notifications.channel_requires_reauth.unknownChannel": "Kanał",
|
|
47
|
+
"communication_channels.notifications.message_received.body": "Otrzymałeś nową wiadomość przez {{providerKey}}.",
|
|
48
|
+
"communication_channels.notifications.message_received.title": "Nowa wiadomość zewnętrzna",
|
|
49
|
+
"communication_channels.notifications.message_received.unknownSender": "Nieznany nadawca",
|
|
50
|
+
"communication_channels.profile.actions.disconnect": "Rozłącz",
|
|
51
|
+
"communication_channels.profile.actions.disconnectFailed": "Nie udało się rozłączyć kanału",
|
|
52
|
+
"communication_channels.profile.actions.disconnectSuccess": "Kanał rozłączony. Możesz połączyć go ponownie w dowolnej chwili.",
|
|
53
|
+
"communication_channels.profile.actions.importHistory": "Importuj historię",
|
|
54
|
+
"communication_channels.profile.actions.pollNow": "Pobierz teraz",
|
|
55
|
+
"communication_channels.profile.actions.pollNowFailed": "Nie udało się uruchomić pobierania",
|
|
56
|
+
"communication_channels.profile.actions.pollNowSuccess": "Pobieranie uruchomione — nowe wiadomości pojawią się na osiach czasu osób w ciągu kilku sekund.",
|
|
57
|
+
"communication_channels.profile.actions.retryPoll": "Ponów",
|
|
58
|
+
"communication_channels.profile.actions.setPrimary": "Ustaw jako główny",
|
|
59
|
+
"communication_channels.profile.actions.setPrimaryFailed": "Nie udało się ustawić jako główny",
|
|
60
|
+
"communication_channels.profile.actions.setPrimarySuccess": "Oznaczono jako główny.",
|
|
61
|
+
"communication_channels.profile.alerts.requiresReauth": "Kanały wymagające ponownego połączenia: {count}. Kliknij \"Połącz ponownie\" przy odpowiednim kanale poniżej.",
|
|
62
|
+
"communication_channels.profile.columns.disconnect": "Połączenie",
|
|
63
|
+
"communication_channels.profile.columns.importHistory": "Historia",
|
|
64
|
+
"communication_channels.profile.columns.lastPolled": "Ostatnia synchronizacja",
|
|
65
|
+
"communication_channels.profile.columns.pollNow": "Synchronizacja",
|
|
66
|
+
"communication_channels.profile.columns.primary": "Główny",
|
|
67
|
+
"communication_channels.profile.connect.blocked": "Połączenie zablokowane przez walidację",
|
|
68
|
+
"communication_channels.profile.connect.cancel": "Anuluj",
|
|
69
|
+
"communication_channels.profile.connect.connected": "Kanał połączony.",
|
|
70
|
+
"communication_channels.profile.connect.connecting": "Łączenie...",
|
|
71
|
+
"communication_channels.profile.connect.credentialsFailed": "Nie udało się połączyć skrzynki pocztowej.",
|
|
72
|
+
"communication_channels.profile.connect.fields.displayName": "Nazwa wyświetlana",
|
|
73
|
+
"communication_channels.profile.connect.fields.fromAddress": "Adres nadawcy",
|
|
74
|
+
"communication_channels.profile.connect.fields.imapHost": "Host IMAP",
|
|
75
|
+
"communication_channels.profile.connect.fields.imapPassword": "Hasło IMAP",
|
|
76
|
+
"communication_channels.profile.connect.fields.imapPort": "Port IMAP",
|
|
77
|
+
"communication_channels.profile.connect.fields.imapTls": "Zabezpieczenia IMAP",
|
|
78
|
+
"communication_channels.profile.connect.fields.imapUser": "Użytkownik IMAP",
|
|
79
|
+
"communication_channels.profile.connect.fields.smtpHost": "Host SMTP",
|
|
80
|
+
"communication_channels.profile.connect.fields.smtpPassword": "Hasło SMTP",
|
|
81
|
+
"communication_channels.profile.connect.fields.smtpPort": "Port SMTP",
|
|
82
|
+
"communication_channels.profile.connect.fields.smtpTls": "Zabezpieczenia SMTP",
|
|
83
|
+
"communication_channels.profile.connect.fields.smtpUser": "Użytkownik SMTP",
|
|
84
|
+
"communication_channels.profile.connect.gmail": "Połącz Gmail",
|
|
85
|
+
"communication_channels.profile.connect.imap": "Połącz IMAP",
|
|
86
|
+
"communication_channels.profile.connect.imapTitle": "Połącz skrzynkę IMAP",
|
|
87
|
+
"communication_channels.profile.connect.mailboxAlreadyConnected": "Ta skrzynka jest już połączona przez innego dostawcę. Najpierw ją rozłącz, aby połączyć ją z innym dostawcą.",
|
|
88
|
+
"communication_channels.profile.connect.notConfigured": "Ten dostawca nie został jeszcze skonfigurowany. Poproś administratora o dodanie identyfikatora klienta i sekretu OAuth w sekcji Integracje przed połączeniem skrzynki.",
|
|
89
|
+
"communication_channels.profile.connect.oauthFailed": "Nie udało się rozpocząć połączenia OAuth.",
|
|
90
|
+
"communication_channels.profile.connect.save": "Połącz",
|
|
91
|
+
"communication_channels.profile.connect.tls.none": "Brak",
|
|
92
|
+
"communication_channels.profile.connect.tls.starttls": "STARTTLS",
|
|
93
|
+
"communication_channels.profile.connect.tls.tls": "TLS",
|
|
94
|
+
"communication_channels.profile.disconnect.cancel": "Anuluj",
|
|
95
|
+
"communication_channels.profile.disconnect.confirm": "Rozłącz",
|
|
96
|
+
"communication_channels.profile.disconnect.description": "Spowoduje to usunięcie połączenia i zatrzymanie synchronizacji. Już zaimportowane wiadomości pozostaną na osiach czasu. Możesz połączyć ponownie w dowolnej chwili.",
|
|
97
|
+
"communication_channels.profile.disconnect.submitting": "Rozłączanie…",
|
|
98
|
+
"communication_channels.profile.disconnect.title": "Rozłącz kanał",
|
|
99
|
+
"communication_channels.profile.empty": "Nie masz jeszcze połączonych kanałów. Użyj opcji \"Połącz kanał\" powyżej, aby dodać Gmail lub IMAP.",
|
|
100
|
+
"communication_channels.profile.flash.connected": "Kanał połączony.",
|
|
101
|
+
"communication_channels.profile.flash.connectedWithProvider": "Kanał połączony ({provider}).",
|
|
102
|
+
"communication_channels.profile.flash.error": "Nie udało się połączyć kanału.",
|
|
103
|
+
"communication_channels.profile.flash.errorWithCode": "Nie udało się połączyć kanału — {code}.",
|
|
104
|
+
"communication_channels.profile.group": "Profil",
|
|
105
|
+
"communication_channels.profile.importHistory.cancel": "Anuluj",
|
|
106
|
+
"communication_channels.profile.importHistory.description": "Pobierz starsze wiadomości, których kanał nie widział w momencie połączenia. Filtry zawężają wyszukiwanie po stronie serwera.",
|
|
107
|
+
"communication_channels.profile.importHistory.errors.contactEmails": "Co najmniej jeden wpis nie jest poprawnym adresem e-mail.",
|
|
108
|
+
"communication_channels.profile.importHistory.errors.maxMessages": "Wybierz liczbę z zakresu od 1 do 5000 wiadomości.",
|
|
109
|
+
"communication_channels.profile.importHistory.errors.sinceDays": "Wybierz liczbę z zakresu od 1 do 365 dni.",
|
|
110
|
+
"communication_channels.profile.importHistory.fields.contactEmails": "Filtruj po nadawcy (opcjonalnie)",
|
|
111
|
+
"communication_channels.profile.importHistory.fields.contactEmailsHint": "Pozostaw puste, aby skanować wszystkich nadawców w zakresie.",
|
|
112
|
+
"communication_channels.profile.importHistory.fields.contactEmailsPlaceholder": "alice@example.com, bob@example.com",
|
|
113
|
+
"communication_channels.profile.importHistory.fields.maxMessages": "Maksymalna liczba wiadomości",
|
|
114
|
+
"communication_channels.profile.importHistory.fields.sinceDays": "Zakres wstecz (dni)",
|
|
115
|
+
"communication_channels.profile.importHistory.flash.error": "Nie udało się zakolejkować importu historii.",
|
|
116
|
+
"communication_channels.profile.importHistory.flash.success": "Import historii zakolejkowany — śledź postęp w górnym pasku.",
|
|
117
|
+
"communication_channels.profile.importHistory.submit": "Rozpocznij import",
|
|
118
|
+
"communication_channels.profile.importHistory.submitting": "Kolejkowanie…",
|
|
119
|
+
"communication_channels.profile.importHistory.title": "Importuj historię kanału",
|
|
120
|
+
"communication_channels.profile.primary": "Główny",
|
|
121
|
+
"communication_channels.profile.subtitle": "Połącz swoją osobistą skrzynkę pocztową, aby wysyłane wiadomości pochodziły z Twojego adresu, a przychodzące trafiały do Twojej skrzynki odbiorczej.",
|
|
122
|
+
"communication_channels.profile.tableTitle": "Twoje kanały",
|
|
123
|
+
"communication_channels.profile.title": "Moje kanały komunikacji",
|
|
124
|
+
"communication_channels.push.button.reregister": "Zarejestruj push ponownie",
|
|
125
|
+
"communication_channels.push.flash.registerFailed": "Nie udało się zarejestrować push",
|
|
126
|
+
"communication_channels.push.status.active": "Push aktywny",
|
|
127
|
+
"communication_channels.push.status.failed": "Push nieudany — używam odpytywania",
|
|
128
|
+
"communication_channels.push.status.inactive": "Tylko odpytywanie",
|
|
129
|
+
"communication_channels.reaction.bar.aria": "Reakcje",
|
|
130
|
+
"communication_channels.reaction.cannotRemoveExternal": "Reakcje uczestników zewnętrznych można usunąć tylko w aplikacji dostawcy.",
|
|
131
|
+
"communication_channels.reaction.toggleAria": "Przełącz reakcję {emoji}",
|
|
132
|
+
"communication_channels.status.active": "Aktywny",
|
|
133
|
+
"communication_channels.status.connected": "Połączony",
|
|
134
|
+
"communication_channels.status.disconnected": "Rozłączony",
|
|
135
|
+
"communication_channels.status.error": "Błąd",
|
|
136
|
+
"communication_channels.status.inactive": "Nieaktywny",
|
|
137
|
+
"communication_channels.status.requiresReauth": "Wymaga ponownego połączenia"
|
|
138
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Side-effect imports — register module commands at boot.
|
|
2
|
+
import './commands/ingest-inbound-message'
|
|
3
|
+
import './commands/deliver-outbound-message'
|
|
4
|
+
import './commands/process-inbound-reaction'
|
|
5
|
+
import './commands/toggle-outbound-reaction'
|
|
6
|
+
import './commands/reassign-conversation'
|
|
7
|
+
import './commands/connect-credential-channel'
|
|
8
|
+
import './commands/set-primary-channel'
|
|
9
|
+
import './commands/disconnect-channel'
|
|
10
|
+
import './commands/delete-channel'
|
|
11
|
+
|
|
12
|
+
export const metadata = {
|
|
13
|
+
id: 'communication_channels',
|
|
14
|
+
title: 'Communication Channels',
|
|
15
|
+
description:
|
|
16
|
+
'Unified hub bridging external chat/email channels (Slack, WhatsApp, Email) to the Messages module. Adapter contract, channel-native payload storage, reactions, and per-channel threading.',
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default metadata
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { hasFeature } from '@open-mercato/shared/security/features'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Per-user channel access control — service-layer authorization helpers.
|
|
5
|
+
*
|
|
6
|
+
* Personal mailbox privacy (v1: strict owner-only). A per-user channel
|
|
7
|
+
* (`userId` set) may be read or managed ONLY by its owner — not even an admin
|
|
8
|
+
* or superadmin can act on another user's personal mailbox. Tenant-wide /
|
|
9
|
+
* shared channels (`userId == null`, e.g. WhatsApp Business / Slack workspaces)
|
|
10
|
+
* remain accessible to any caller the route already feature-gated.
|
|
11
|
+
*
|
|
12
|
+
* Routes also narrow at the SQL layer (the admin channel list returns
|
|
13
|
+
* `user_id IS NULL` rows only; the profile list filters `user_id =
|
|
14
|
+
* currentUser.id`); these helpers are the per-channel authorization backstop a
|
|
15
|
+
* route calls once it has loaded the row.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export const ADMIN_FEATURE = 'communication_channels.admin'
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Throws when the caller may not access a specific channel. Returns silently
|
|
22
|
+
* when access is allowed.
|
|
23
|
+
*
|
|
24
|
+
* Personal mailbox privacy (v1: strict owner-only). A per-user channel
|
|
25
|
+
* (`userId` set) may be acted on ONLY by its owner — not even an admin /
|
|
26
|
+
* superadmin can poll, test-send, import history from, register push on, or
|
|
27
|
+
* delete another user's personal mailbox. Tenant-wide channels
|
|
28
|
+
* (`userId == null`, e.g. WhatsApp Business / Slack workspaces) remain
|
|
29
|
+
* accessible to any caller the route already feature-gated.
|
|
30
|
+
*
|
|
31
|
+
* `userFeatures` is retained on the signature (callers pass it) but no longer
|
|
32
|
+
* grants a bypass; it is reserved for the v2 admin-oversight feature.
|
|
33
|
+
*
|
|
34
|
+
* Callers MUST pass the fully decrypted channel row — we read `userId` directly.
|
|
35
|
+
*/
|
|
36
|
+
export function assertCanAccessChannel(
|
|
37
|
+
channel: { userId?: string | null } | null | undefined,
|
|
38
|
+
currentUserId: string | null | undefined,
|
|
39
|
+
userFeatures: string[] | null | undefined,
|
|
40
|
+
): void {
|
|
41
|
+
if (!channel) {
|
|
42
|
+
// Defensive: callers pre-check existence and return 404, so this is
|
|
43
|
+
// unreachable in practice. Throw the typed access error (route-mapped to a
|
|
44
|
+
// masked 404) rather than a bare Error that would surface as a 500.
|
|
45
|
+
throw new ChannelAccessDeniedError('Channel not found')
|
|
46
|
+
}
|
|
47
|
+
void userFeatures
|
|
48
|
+
// Tenant-wide / shared channel — accessible to all callers.
|
|
49
|
+
if (channel.userId == null) return
|
|
50
|
+
// Personal mailbox — owner only, regardless of admin grants (v1).
|
|
51
|
+
if (channel.userId !== currentUserId) {
|
|
52
|
+
throw new ChannelAccessDeniedError(
|
|
53
|
+
'Channel is a personal mailbox owned by another user',
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Authorization for MANAGING (mutating) a channel — disconnect, poll, set
|
|
60
|
+
* primary, import history, register push. Encodes the per-user ownership rule:
|
|
61
|
+
*
|
|
62
|
+
* - **Personal mailbox** (`userId` set): the **owner has full control** of
|
|
63
|
+
* their own account; any other caller — admin included — is denied (v1
|
|
64
|
+
* strict owner-only, no bypass). Routes gate these on
|
|
65
|
+
* `communication_channels.connect_user_channel` so every email user reaches
|
|
66
|
+
* this check for their own channels.
|
|
67
|
+
* - **Tenant-wide / shared channel** (`userId == null`, e.g. WhatsApp
|
|
68
|
+
* Business / Slack workspaces): requires the route's `elevatedFeature`
|
|
69
|
+
* (`communication_channels.manage`, `…channel.push.manage`, or
|
|
70
|
+
* `…channel.import_history`). Wildcard-aware via {@link hasFeature}.
|
|
71
|
+
*
|
|
72
|
+
* Throws `ChannelAccessDeniedError` (route handlers map it to 404, masking
|
|
73
|
+
* existence) when the caller may not manage the channel.
|
|
74
|
+
*/
|
|
75
|
+
export function assertCanManageChannel(
|
|
76
|
+
channel: { userId?: string | null } | null | undefined,
|
|
77
|
+
currentUserId: string | null | undefined,
|
|
78
|
+
userFeatures: string[] | null | undefined,
|
|
79
|
+
elevatedFeature: string,
|
|
80
|
+
): void {
|
|
81
|
+
if (!channel) {
|
|
82
|
+
// Defensive: callers pre-check existence and return 404, so this is
|
|
83
|
+
// unreachable in practice. Throw the typed access error (route-mapped to a
|
|
84
|
+
// masked 404) rather than a bare Error that would surface as a 500.
|
|
85
|
+
throw new ChannelAccessDeniedError('Channel not found')
|
|
86
|
+
}
|
|
87
|
+
// Personal mailbox — owner only. The owner manages their own account fully
|
|
88
|
+
// (gated by connect_user_channel at the route); no admin bypass in v1.
|
|
89
|
+
if (channel.userId != null) {
|
|
90
|
+
if (channel.userId !== currentUserId) {
|
|
91
|
+
throw new ChannelAccessDeniedError('Channel is a personal mailbox owned by another user')
|
|
92
|
+
}
|
|
93
|
+
return
|
|
94
|
+
}
|
|
95
|
+
// Tenant-wide / shared channel — requires the elevated management feature.
|
|
96
|
+
const grantedFeatures = Array.isArray(userFeatures) ? userFeatures : []
|
|
97
|
+
if (!hasFeature(grantedFeatures, elevatedFeature)) {
|
|
98
|
+
throw new ChannelAccessDeniedError(`Managing a shared channel requires '${elevatedFeature}'`)
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Stable error class so route handlers can map to a 403 instead of leaking the
|
|
104
|
+
* underlying message verbatim. Subclasses `Error` for compatibility with the
|
|
105
|
+
* platform's error logging helpers.
|
|
106
|
+
*/
|
|
107
|
+
export class ChannelAccessDeniedError extends Error {
|
|
108
|
+
override name = 'ChannelAccessDeniedError'
|
|
109
|
+
readonly statusCode = 403
|
|
110
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { ChannelAdapter, ChannelCapabilities } from './adapter'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Capability flags that imply the presence of an optional adapter method.
|
|
5
|
+
* If the adapter declares the flag = true but does not implement the corresponding
|
|
6
|
+
* method, registration fails with a clear error.
|
|
7
|
+
*
|
|
8
|
+
* NOTE: This is the strict registration validator; it replaces what an earlier
|
|
9
|
+
* draft of SPEC-045d called a "v1 fallback". There is no v1 in shipping code,
|
|
10
|
+
* so no fallback is needed — the contract is strict by design.
|
|
11
|
+
*/
|
|
12
|
+
const CAPABILITY_METHOD_PAIRS: Array<{
|
|
13
|
+
flag: keyof ChannelCapabilities
|
|
14
|
+
method: keyof ChannelAdapter
|
|
15
|
+
}> = [
|
|
16
|
+
{ flag: 'reactions', method: 'sendReaction' },
|
|
17
|
+
{ flag: 'reactions', method: 'removeReaction' },
|
|
18
|
+
{ flag: 'editMessage', method: 'editMessage' },
|
|
19
|
+
{ flag: 'deleteMessage', method: 'deleteMessage' },
|
|
20
|
+
{ flag: 'conversationHistory', method: 'fetchHistory' },
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Validates that every capability flag set to `true` on the adapter has its
|
|
25
|
+
* corresponding optional method implemented. Throws a descriptive Error if a
|
|
26
|
+
* capability/method pair is inconsistent.
|
|
27
|
+
*
|
|
28
|
+
* Called by the channel adapter registry at registration time; fails fast at
|
|
29
|
+
* module boot rather than at runtime when the hub tries to invoke the missing
|
|
30
|
+
* method.
|
|
31
|
+
*/
|
|
32
|
+
export function validateAdapterCapabilities(adapter: ChannelAdapter): void {
|
|
33
|
+
if (!adapter.providerKey) {
|
|
34
|
+
throw new Error('ChannelAdapter is missing required `providerKey` property')
|
|
35
|
+
}
|
|
36
|
+
if (!adapter.channelType) {
|
|
37
|
+
throw new Error(
|
|
38
|
+
`ChannelAdapter '${adapter.providerKey}' is missing required \`channelType\` property`,
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
if (!adapter.capabilities) {
|
|
42
|
+
throw new Error(
|
|
43
|
+
`ChannelAdapter '${adapter.providerKey}' is missing required \`capabilities\` property`,
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
for (const pair of CAPABILITY_METHOD_PAIRS) {
|
|
48
|
+
const flagSet = adapter.capabilities[pair.flag] === true
|
|
49
|
+
if (!flagSet) continue
|
|
50
|
+
const method = (adapter as unknown as Record<string, unknown>)[pair.method]
|
|
51
|
+
if (typeof method !== 'function') {
|
|
52
|
+
throw new Error(
|
|
53
|
+
`ChannelAdapter '${adapter.providerKey}' declares capabilities.${String(pair.flag)}=true but does not implement ${String(pair.method)}()`,
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public alias for the channel-adapter registry, exposing the function-form API.
|
|
3
|
+
*
|
|
4
|
+
* Webhook routes (auth-less, no DI request scope yet) import from here to look up
|
|
5
|
+
* adapters by `providerKey`. Inside a normal DI scope you can equivalently resolve
|
|
6
|
+
* `container.resolve('channelAdapterRegistry')` — both share the same storage
|
|
7
|
+
* (process-level `globalThis` symbol).
|
|
8
|
+
*/
|
|
9
|
+
import {
|
|
10
|
+
ChannelAdapterRegistry,
|
|
11
|
+
getChannelAdapter,
|
|
12
|
+
hasChannelAdapter,
|
|
13
|
+
listChannelAdapters,
|
|
14
|
+
listChannelAdapterProviderKeys,
|
|
15
|
+
registerChannelAdapter,
|
|
16
|
+
} from './registry'
|
|
17
|
+
|
|
18
|
+
export {
|
|
19
|
+
getChannelAdapter,
|
|
20
|
+
hasChannelAdapter,
|
|
21
|
+
listChannelAdapters,
|
|
22
|
+
listChannelAdapterProviderKeys,
|
|
23
|
+
registerChannelAdapter,
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Returns a singleton registry instance (class form). Useful when callers want
|
|
28
|
+
* to pass a registry through DI or to a worker context without binding to module
|
|
29
|
+
* globals directly.
|
|
30
|
+
*/
|
|
31
|
+
let cachedRegistry: ChannelAdapterRegistry | null = null
|
|
32
|
+
export function getChannelAdapterRegistry(): ChannelAdapterRegistry {
|
|
33
|
+
if (!cachedRegistry) cachedRegistry = new ChannelAdapterRegistry()
|
|
34
|
+
return cachedRegistry
|
|
35
|
+
}
|